@reopt-ai/opt-ui 1.7.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COMPONENT_CATALOG.md +222 -34
- package/README.md +70 -6
- package/dist/core/index.cjs +170 -155
- package/dist/core/index.d.cts +3 -2
- package/dist/core/index.d.ts +3 -2
- package/dist/core/index.js +3 -3
- package/dist/docs/02-components/01-core.md +223 -18
- package/dist/docs/02-components/02-visuals.md +1 -1
- package/dist/docs/02-components/03-shells.md +17 -16
- package/dist/docs/02-components/04-surfaces.md +1 -1
- package/dist/docs/02-components/index.md +4 -4
- package/dist/{field-sidebar-CB8vjvUM.d.ts → field-sidebar-B5vk3luQ.d.cts} +30 -3
- package/dist/{field-sidebar-BTZCBviA.d.cts.map → field-sidebar-B5vk3luQ.d.cts.map} +1 -1
- package/dist/{field-sidebar-Cs-J-5VE.js → field-sidebar-B7QkWvMG.js} +52 -17
- package/dist/{field-sidebar-Cs-J-5VE.js.map → field-sidebar-B7QkWvMG.js.map} +1 -1
- package/dist/{field-sidebar-BTZCBviA.d.cts → field-sidebar-Dk9gJGA_.d.ts} +30 -3
- package/dist/{field-sidebar-CB8vjvUM.d.ts.map → field-sidebar-Dk9gJGA_.d.ts.map} +1 -1
- package/dist/{field-sidebar-CzIQX70-.cjs → field-sidebar-mFHemxBz.cjs} +328 -293
- package/dist/{types-D0FlcYnM.d.ts → field-token-CSOrU5gl.d.cts} +66 -2
- package/dist/field-token-CSOrU5gl.d.cts.map +1 -0
- package/dist/{types-D0FlcYnM.d.cts → field-token-CSOrU5gl.d.ts} +66 -2
- package/dist/field-token-CSOrU5gl.d.ts.map +1 -0
- package/dist/{pagination-DWbvACuN.js → highlight-C2sfnJN8.js} +263 -11
- package/dist/highlight-C2sfnJN8.js.map +1 -0
- package/dist/{pagination-DjfxBcjX.cjs → highlight-CGcrYGMC.cjs} +284 -8
- package/dist/id-registry.cjs +98 -2
- package/dist/id-registry.d.cts.map +1 -1
- package/dist/id-registry.d.ts.map +1 -1
- package/dist/id-registry.js +98 -2
- package/dist/id-registry.js.map +1 -1
- package/dist/id-registry.json +202 -4
- package/dist/index.cjs +664 -643
- package/dist/index.d.cts +5 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/{shader-surface-BUPZ0P-n.js → key-pad-menu-BFd79JoS.js} +855 -19
- package/dist/key-pad-menu-BFd79JoS.js.map +1 -0
- package/dist/{shader-surface-DRrcLrWf.d.cts → key-pad-menu-D8OS_VCT.d.cts} +459 -3
- package/dist/key-pad-menu-D8OS_VCT.d.cts.map +1 -0
- package/dist/{shader-surface-Fav5K9UC.cjs → key-pad-menu-DoGskWbp.cjs} +1103 -201
- package/dist/{shader-surface-BfTP9c1Q.d.ts → key-pad-menu-EEb6Ho5h.d.ts} +459 -3
- package/dist/key-pad-menu-EEb6Ho5h.d.ts.map +1 -0
- package/dist/meta.cjs +641 -0
- package/dist/meta.d.cts.map +1 -1
- package/dist/meta.d.ts.map +1 -1
- package/dist/meta.js +641 -0
- package/dist/meta.js.map +1 -1
- package/dist/shells/index.cjs +1 -1
- package/dist/shells/index.d.cts +1 -1
- package/dist/shells/index.d.ts +1 -1
- package/dist/shells/index.js +1 -1
- package/package.json +2 -2
- package/dist/pagination-DWbvACuN.js.map +0 -1
- package/dist/shader-surface-BUPZ0P-n.js.map +0 -1
- package/dist/shader-surface-BfTP9c1Q.d.ts.map +0 -1
- package/dist/shader-surface-DRrcLrWf.d.cts.map +0 -1
- package/dist/types-D0FlcYnM.d.cts.map +0 -1
- package/dist/types-D0FlcYnM.d.ts.map +0 -1
package/dist/meta.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.js","names":[],"sources":["../src/core/_meta.ts","../src/visuals/_meta.ts","../src/shells/_meta.ts"],"sourcesContent":["import type { ComponentMeta } from \"@reopt-ai/opt-doc-kit\";\n\nexport const textMeta: ComponentMeta = {\n name: \"Text\",\n category: \"core\",\n functionalCategory: \"typography\",\n maturity: \"stable\",\n keywords: [\"typography\", \"body\", \"label\", \"supporting\", \"code\"],\n description:\n \"본문, 레이블, 보조 설명, 코드에 일관된 의미 기반 타이포그래피를 적용합니다.\",\n slug: \"text\",\n exports: [\"Text\"],\n props: {\n Text: [\n {\n name: \"as\",\n type: '\"span\" | \"p\" | \"div\" | \"label\" | \"code\"',\n description: \"렌더링할 HTML 요소\",\n },\n {\n name: \"variant\",\n type: '\"body\" | \"label\" | \"supporting\" | \"code\"',\n description: \"시각적 텍스트 역할\",\n },\n {\n name: \"tone\",\n type: '\"primary\" | \"secondary\" | \"tertiary\" | \"inherit\"',\n description: \"의미 기반 텍스트 색상\",\n },\n { name: \"truncate\", type: \"boolean\", description: \"한 줄 말줄임 적용\" },\n { name: \"children\", type: \"ReactNode\", description: \"텍스트 콘텐츠\" },\n ],\n },\n usage: {\n bestPractices: [\n \"텍스트 크기를 직접 지정하기보다 콘텐츠의 역할에 맞는 variant를 선택합니다.\",\n ],\n avoid: [\"Heading 대신 Text의 크기를 키워 문서 제목을 표현하지 않습니다.\"],\n },\n theming: {\n target: \"text\",\n parts: [\"root\"],\n variables: [\n \"--opt-text-body-size\",\n \"--opt-text-label-size\",\n \"--opt-text-supporting-size\",\n \"--opt-text-code-size\",\n ],\n },\n scenarios: [\n {\n name: \"semantic roles\",\n description: \"모든 텍스트 역할과 색상 톤을 함께 검증합니다.\",\n viewport: \"responsive\",\n },\n ],\n testDescribe: \"Text and Heading\",\n};\n\nexport const headingMeta: ComponentMeta = {\n name: \"Heading\",\n category: \"core\",\n functionalCategory: \"typography\",\n maturity: \"stable\",\n keywords: [\"typography\", \"heading\", \"display\", \"hierarchy\"],\n description:\n \"문서의 의미 계층과 시각적 타이포그래피 계층을 독립적으로 제어합니다.\",\n slug: \"heading\",\n exports: [\"Heading\"],\n props: {\n Heading: [\n {\n name: \"level\",\n type: \"1 | 2 | 3 | 4 | 5 | 6\",\n description: \"의미 기반 HTML 제목 레벨\",\n },\n {\n name: \"variant\",\n type: '\"heading-1\" … \"heading-6\" | \"display-1\" | \"display-2\" | \"display-3\"',\n description: \"시각적 제목 역할\",\n },\n { name: \"children\", type: \"ReactNode\", description: \"제목 콘텐츠\" },\n ],\n },\n usage: {\n bestPractices: [\n \"level은 문서 구조로, variant는 시각적 강조 수준으로 선택합니다.\",\n ],\n avoid: [\"시각적 크기만을 위해 제목 레벨을 건너뛰지 않습니다.\"],\n },\n theming: {\n target: \"heading\",\n parts: [\"root\"],\n variables: [\n \"--opt-text-heading-1-size\",\n \"--opt-text-heading-2-size\",\n \"--opt-text-display-1-size\",\n ],\n },\n scenarios: [\n {\n name: \"hierarchy\",\n description: \"heading 및 display 계층과 의미 레벨 분리를 검증합니다.\",\n viewport: \"responsive\",\n },\n ],\n testDescribe: \"Text and Heading\",\n};\n\nexport const kbdMeta: ComponentMeta = {\n name: \"Kbd\",\n category: \"core\",\n description: \"키보드 단축키를 시각적으로 표시하는 인라인 뱃지 컴포넌트.\",\n slug: \"kbd\",\n exports: [\"Kbd\"],\n props: {\n Kbd: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"표시할 단축키 텍스트\",\n },\n {\n name: \"hint\",\n type: \"boolean\",\n description:\n '인라인 힌트 배지로 표시. `data-shortcut-hints=\"hidden\"`일 때 숨겨진다 (app.css)',\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n testDescribe: \"Kbd\",\n};\n\nexport const separatorMeta: ComponentMeta = {\n name: \"Separator\",\n category: \"core\",\n description:\n \"콘텐츠를 구분하는 가로/세로 디바이더. 라벨을 넣으면 가운데 정렬 구분선이 된다.\",\n slug: \"separator\",\n exports: [\"Separator\"],\n props: {\n Separator: [\n {\n name: \"orientation\",\n type: '\"horizontal\" | \"vertical\"',\n description: \"구분선 방향 (기본 horizontal)\",\n },\n {\n name: \"decorative\",\n type: \"boolean\",\n description: \"접근성 트리에서 숨김 (순수 시각 구분)\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n description: \"가운데 라벨 (horizontal 전용)\",\n },\n { name: \"className\", type: \"string\", description: \"추가 CSS 클래스\" },\n ],\n },\n testDescribe: \"Separator\",\n};\n\nexport const otpFieldMeta: ComponentMeta = {\n name: \"OtpField\",\n category: \"core\",\n description:\n \"일회용 코드(OTP)/PIN 입력. 셀 단위 입력, 붙여넣기 분배, 자동 포커스 이동, 백스페이스 네비게이션과 폼 이름/오류 연결을 지원합니다.\",\n slug: \"otp-field\",\n exports: [\"OtpField\"],\n props: {\n OtpField: [\n { name: \"length\", type: \"number\", description: \"셀 개수 (기본 6)\" },\n { name: \"value\", type: \"string\", description: \"제어 모드 값\" },\n { name: \"defaultValue\", type: \"string\", description: \"비제어 초기값\" },\n {\n name: \"onChange\",\n type: \"(value: string) => void\",\n description: \"값 변경 콜백\",\n },\n {\n name: \"onComplete\",\n type: \"(value: string) => void\",\n description: \"모든 셀이 채워지면 1회 호출\",\n },\n {\n name: \"type\",\n type: '\"numeric\" | \"alphanumeric\"',\n description: \"허용 문자 (기본 numeric)\",\n },\n {\n name: \"mask\",\n type: \"boolean\",\n description: \"채워진 셀을 점(•)으로 마스킹 (PIN 용)\",\n },\n { name: \"disabled\", type: \"boolean\", description: \"비활성화\" },\n {\n name: \"name\",\n type: \"string\",\n description: \"폼 필드명. 전체 값을 담은 hidden input 렌더\",\n },\n { name: \"label\", type: \"string\", description: \"필드 레이블\" },\n { name: \"error\", type: \"string\", description: \"에러 메시지\" },\n { name: \"hint\", type: \"string\", description: \"도움말 텍스트\" },\n ],\n },\n testDescribe: \"OtpField\",\n};\n\nexport const toggleMeta: ComponentMeta = {\n name: \"Toggle\",\n category: \"core\",\n description:\n \"눌림(pressed) 두 상태 버튼. 단독 사용하거나 ToggleGroup으로 묶어 단일/다중 선택을 만든다.\",\n slug: \"toggle\",\n exports: [\"Toggle\", \"ToggleGroup\"],\n props: {\n Toggle: [\n {\n name: \"pressed\",\n type: \"boolean\",\n description: \"제어 모드: 눌림 상태 (단독 사용)\",\n },\n {\n name: \"defaultPressed\",\n type: \"boolean\",\n description: \"비제어 초기 눌림 상태 (단독 사용)\",\n },\n {\n name: \"onPressedChange\",\n type: \"(pressed: boolean) => void\",\n description: \"눌림 상태 변경 콜백 (단독 사용)\",\n },\n {\n name: \"value\",\n type: \"string\",\n description: \"ToggleGroup 내에서 이 토글을 식별하는 값\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\"',\n description: \"크기 (기본 md)\",\n },\n { name: \"disabled\", type: \"boolean\", description: \"비활성화\" },\n { name: \"children\", type: \"ReactNode\", description: \"토글 콘텐츠\" },\n ],\n ToggleGroup: [\n {\n name: \"value\",\n type: \"string | string[]\",\n description: \"선택 값. 단일은 string, toggleMultiple은 string[]\",\n },\n {\n name: \"defaultValue\",\n type: \"string | string[]\",\n description: \"비제어 초기 선택 값\",\n },\n {\n name: \"onValueChange\",\n type: \"(value: string | string[]) => void\",\n description: \"선택 변경 콜백\",\n },\n {\n name: \"toggleMultiple\",\n type: \"boolean\",\n description: \"동시에 여러 개 눌림 허용\",\n },\n {\n name: \"orientation\",\n type: '\"horizontal\" | \"vertical\"',\n description: \"배치 방향 (기본 horizontal)\",\n },\n { name: \"disabled\", type: \"boolean\", description: \"그룹 전체 비활성화\" },\n { name: \"children\", type: \"ReactNode\", description: \"Toggle 항목들\" },\n ],\n },\n testDescribe: \"Toggle\",\n};\n\nexport const accordionMeta: ComponentMeta = {\n name: \"Accordion\",\n category: \"core\",\n description:\n \"수직으로 쌓인 펼침/접힘 패널. single(한 개)/multiple(여러 개) 모드와 collapsible 지원.\",\n slug: \"accordion\",\n exports: [\n \"AccordionRoot\",\n \"AccordionItem\",\n \"AccordionTrigger\",\n \"AccordionContent\",\n ],\n props: {\n AccordionRoot: [\n {\n name: \"type\",\n type: '\"single\" | \"multiple\"',\n description:\n \"한 개만 열림(single) 또는 여러 개 열림(multiple). 기본 single\",\n },\n {\n name: \"value\",\n type: \"string | string[] | null\",\n description: \"열린 항목 값. single은 string|null, multiple은 string[]\",\n },\n {\n name: \"defaultValue\",\n type: \"string | string[] | null\",\n description: \"비제어 초기 열림 값\",\n },\n {\n name: \"onValueChange\",\n type: \"(value: string | string[] | null) => void\",\n description: \"열림 변경 콜백\",\n },\n {\n name: \"collapsible\",\n type: \"boolean\",\n description: \"single 모드에서 열린 패널을 다시 닫을 수 있게 허용\",\n },\n { name: \"disabled\", type: \"boolean\", description: \"전체 비활성화\" },\n {\n name: \"animated\",\n type: \"boolean\",\n description: \"콘텐츠 enter/leave 애니메이션 (기본 true)\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n description: \"AccordionItem 목록\",\n },\n ],\n AccordionItem: [\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"항목 식별 값\",\n },\n { name: \"disabled\", type: \"boolean\", description: \"이 항목만 비활성화\" },\n { name: \"children\", type: \"ReactNode\", description: \"Trigger + Content\" },\n ],\n AccordionTrigger: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"헤더 라벨 (쉐브론 아이콘 자동 추가)\",\n },\n ],\n AccordionContent: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"펼쳐지는 패널 본문\",\n },\n ],\n },\n testDescribe: \"Accordion\",\n};\n\nexport const statCardMeta: ComponentMeta = {\n name: \"StatCard\",\n category: \"core\",\n description: \"트렌드 방향과 변화량을 표시하는 통계 카드.\",\n slug: \"stat-card\",\n exports: [\"StatCard\"],\n props: {\n StatCard: [\n {\n name: \"title\",\n type: \"string\",\n required: true,\n description: \"통계 제목\",\n },\n { name: \"value\", type: \"string\", required: true, description: \"통계 값\" },\n {\n name: \"change\",\n type: \"string\",\n required: true,\n description: \"변화량 텍스트 (예: '+12.5%')\",\n },\n {\n name: \"trend\",\n type: '\"up\" | \"down\" | \"neutral\"',\n required: true,\n description: \"트렌드 방향. 색상과 아이콘 결정\",\n },\n ],\n },\n ariaRole: \"presentation\",\n testDescribe: \"StatCard\",\n};\n\nexport const compositeZoneMeta: ComponentMeta = {\n name: \"CompositeZone\",\n category: \"core\",\n description:\n \"Composite 기반 2D 키보드 탐색 컨테이너. 화살표 키로 자식 요소 간 이동 가능.\",\n slug: \"composite-zone\",\n exports: [\"CompositeZone\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓ ← →\", action: \"2D 방향 탐색\" },\n { keys: \"Home\", action: \"첫 항목으로 이동\" },\n { keys: \"End\", action: \"마지막 항목으로 이동\" },\n { keys: \"Tab\", action: \"영역 밖으로 이동\" },\n ],\n props: {\n CompositeZone: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"CompositeRow + CompositeItem 자식\",\n },\n {\n name: \"label\",\n type: \"string\",\n required: true,\n description: \"aria-label 값\",\n },\n {\n name: \"focusLoop\",\n type: \"boolean\",\n default: \"true\",\n description: \"포커스가 끝에서 처음으로 순환\",\n },\n {\n name: \"focusWrap\",\n type: \"boolean\",\n default: \"true\",\n description: \"행 끝에서 다음 행으로 이동\",\n },\n { name: \"className\", type: \"string\", description: \"컨테이너 CSS 클래스\" },\n ],\n },\n ariaRole: \"grid\",\n testDescribe: \"CompositeZone\",\n};\n\nexport const disclosureMeta: ComponentMeta = {\n name: \"Disclosure\",\n category: \"core\",\n description:\n \"접기/펼치기 콘텐츠 영역. 3-part anatomy: Root, Trigger, Content.\",\n slug: \"disclosure\",\n exports: [\"DisclosureRoot\", \"DisclosureTrigger\", \"DisclosureContent\"],\n keyboardShortcuts: [{ keys: \"Enter / Space\", action: \"열기/닫기 토글\" }],\n props: {\n DisclosureRoot: [\n { name: \"open\", type: \"boolean\", description: \"제어 모드: 열림 상태\" },\n {\n name: \"setOpen\",\n type: \"(open: boolean) => void\",\n description: \"제어 모드: 상태 변경 핸들러\",\n },\n {\n name: \"defaultOpen\",\n type: \"boolean\",\n default: \"false\",\n description: \"비제어 모드: 초기 열림 상태\",\n },\n ],\n DisclosureTrigger: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"트리거 내용\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n DisclosureContent: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"접히는 콘텐츠\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n testDescribe: \"Disclosure\",\n};\n\nexport const tabsMeta: ComponentMeta = {\n name: \"Tabs\",\n category: \"core\",\n description: \"탭 패널 시스템. 4-part anatomy: Root, TabList, Tab, TabPanel.\",\n slug: \"tabs\",\n exports: [\"TabsRoot\", \"TabList\", \"Tab\", \"TabPanel\"],\n keyboardShortcuts: [\n { keys: \"← →\", action: \"탭 탐색\" },\n { keys: \"Home\", action: \"첫 번째 탭으로 이동\" },\n { keys: \"End\", action: \"마지막 탭으로 이동\" },\n ],\n props: {\n TabsRoot: [\n {\n name: \"variant\",\n type: '\"underline\" | \"workspace\"',\n description:\n \"탭 프레임 형태. workspace는 편집기 탭(문서/쿼리처럼 열고 닫히며 상태를 갖는 작업 단위)\",\n },\n {\n name: \"defaultSelectedId\",\n type: \"string\",\n description: \"초기 선택된 탭 ID\",\n },\n {\n name: \"selectedId\",\n type: \"string | null\",\n description: \"제어 모드: 선택된 탭 ID\",\n },\n {\n name: \"setSelectedId\",\n type: \"(id: string | null) => void\",\n description: \"제어 모드: 탭 변경 핸들러\",\n },\n ],\n TabList: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"Tab 요소들\",\n },\n {\n name: \"actions\",\n type: \"ReactNode\",\n description:\n \"탭 줄 오른쪽 액션 영역 (새 탭, 닫기 등). tablist 바깥에 렌더돼 탭 순회에 끼어들지 않음\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n Tab: [\n {\n name: \"id\",\n type: \"string\",\n required: true,\n description: \"탭 고유 ID (TabPanel의 tabId와 매칭)\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"탭 레이블\",\n },\n {\n name: \"icon\",\n type: \"ReactNode\",\n description: \"탭 이름 앞 아이콘. 활성 탭에서 accent 색으로 전환\",\n },\n {\n name: \"status\",\n type: '\"dirty\" | \"running\"',\n description: \"저장되지 않은 변경 / 실행 중 인디케이터\",\n },\n {\n name: \"statusLabel\",\n type: \"string\",\n description: \"status 인디케이터의 접근성 레이블\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n TabPanel: [\n {\n name: \"tabId\",\n type: \"string\",\n required: true,\n description: \"연결된 Tab의 ID\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"패널 콘텐츠\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n ariaRole: \"tablist\",\n testDescribe: \"Tabs\",\n};\n\nexport const selectMeta: ComponentMeta = {\n name: \"Select\",\n category: \"core\",\n description:\n \"드롭다운 선택 컴포넌트. 5-part anatomy: Root, Label, Trigger, Popover, Item.\",\n slug: \"select\",\n exports: [\n \"SelectRoot\",\n \"SelectLabel\",\n \"SelectTrigger\",\n \"SelectPopover\",\n \"SelectItem\",\n ],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"옵션 탐색\" },\n { keys: \"Enter / Space\", action: \"옵션 선택\" },\n { keys: \"Esc\", action: \"팝오버 닫기\" },\n { keys: \"문자 입력\", action: \"Typeahead 탐색\" },\n ],\n props: {\n SelectRoot: [\n {\n name: \"value\",\n type: \"string | string[]\",\n description: \"제어 모드: 현재 선택 값 (multiple이면 string[])\",\n },\n {\n name: \"onValueChange\",\n type: \"(value: string | string[]) => void\",\n description: \"제어 모드: 값 변경 핸들러\",\n },\n {\n name: \"defaultValue\",\n type: \"string | string[]\",\n description: \"비제어 모드: 초기값\",\n },\n {\n name: \"multiple\",\n type: \"boolean\",\n description: \"다중 선택 허용 (값이 string[]이 됨)\",\n },\n {\n name: \"name\",\n type: \"string\",\n description: \"폼 필드명. 선택값마다 hidden input을 렌더해 폼 전송 지원\",\n },\n ],\n SelectLabel: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"레이블 텍스트\",\n },\n ],\n SelectTrigger: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"트리거 내용 (선택된 값 표시)\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n SelectPopover: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"SelectItem 목록\",\n },\n {\n name: \"sameWidth\",\n type: \"boolean\",\n default: \"true\",\n description: \"트리거와 같은 너비\",\n },\n {\n name: \"gutter\",\n type: \"number\",\n default: \"4\",\n description: \"트리거와의 간격 (px)\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n SelectItem: [\n { name: \"value\", type: \"string\", required: true, description: \"옵션 값\" },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"옵션 레이블\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n ariaRole: \"listbox\",\n testDescribe: \"Select\",\n examples: [\n {\n title: \"기본 선택\",\n code: `import { SelectRoot, SelectLabel, SelectTrigger, SelectPopover, SelectItem } from \"@reopt-ai/opt-ui\";\n\n<SelectRoot value={role} onValueChange={setRole}>\n <SelectLabel>역할</SelectLabel>\n <SelectTrigger>{role || \"선택하세요\"}</SelectTrigger>\n <SelectPopover>\n <SelectItem value=\"admin\">관리자</SelectItem>\n <SelectItem value=\"editor\">편집자</SelectItem>\n <SelectItem value=\"viewer\">뷰어</SelectItem>\n </SelectPopover>\n</SelectRoot>`,\n },\n ],\n};\n\nexport const dialogMeta: ComponentMeta = {\n name: \"Dialog\",\n category: \"core\",\n description:\n \"모달 다이얼로그. 9-part anatomy: Root, Disclosure, Panel, Heading, Description, Dismiss, Header, Body, Footer.\",\n slug: \"dialog\",\n exports: [\n \"DialogRoot\",\n \"DialogDisclosure\",\n \"DialogPanel\",\n \"AlertDialogPanel\",\n \"DialogHeading\",\n \"DialogDescription\",\n \"DialogDismiss\",\n \"DialogHeader\",\n \"DialogBody\",\n \"DialogFooter\",\n ],\n keyboardShortcuts: [\n { keys: \"Esc\", action: \"다이얼로그 닫기\" },\n { keys: \"Tab\", action: \"다이얼로그 내 포커스 이동 (트랩)\" },\n ],\n props: {\n DialogRoot: [\n { name: \"open\", type: \"boolean\", description: \"제어 모드: 열림 상태\" },\n {\n name: \"setOpen\",\n type: \"(open: boolean) => void\",\n description: \"제어 모드: 상태 변경 핸들러\",\n },\n ],\n DialogDisclosure: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"트리거 버튼 내용\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n DialogPanel: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"다이얼로그 콘텐츠\",\n },\n {\n name: \"size\",\n type: '\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"',\n default: '\"md\"',\n description: \"최대 너비 프리셋\",\n },\n {\n name: \"backdrop\",\n type: \"ReactElement\",\n default: \"<div> (반투명 배경)\",\n description: \"배경 오버레이 요소\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n DialogHeading: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"제목 텍스트 (자동 aria-labelledby 연결)\",\n },\n ],\n DialogDescription: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"설명 텍스트 (자동 aria-describedby 연결)\",\n },\n ],\n DialogDismiss: [\n { name: \"children\", type: \"ReactNode\", description: \"닫기 버튼 내용\" },\n ],\n DialogHeader: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"Heading, Description, Dismiss 등 헤더 콘텐츠\",\n },\n ],\n DialogBody: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"스크롤 가능한 본문 콘텐츠\",\n },\n ],\n DialogFooter: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"액션 버튼 영역\",\n },\n ],\n },\n ariaRole: \"dialog\",\n testDescribe: \"Dialog\",\n examples: [\n {\n title: \"모달 대화상자\",\n code: `import { DialogRoot, DialogDisclosure, DialogPanel, DialogHeading, DialogDismiss } from \"@reopt-ai/opt-ui\";\n\n<DialogRoot>\n <DialogDisclosure>열기</DialogDisclosure>\n <DialogPanel size=\"md\">\n <DialogHeading>확인</DialogHeading>\n <p>변경 사항을 저장하시겠습니까?</p>\n <DialogDismiss>닫기</DialogDismiss>\n </DialogPanel>\n</DialogRoot>`,\n },\n ],\n};\n\nexport const comboboxMeta: ComponentMeta = {\n name: \"Combobox\",\n category: \"core\",\n description:\n \"자동완성 검색 입력. 7 exports: Root, Input, Popover, Item, Group, GroupLabel, Empty.\",\n slug: \"combobox\",\n exports: [\n \"ComboboxRoot\",\n \"ComboboxInput\",\n \"ComboboxPopover\",\n \"ComboboxItem\",\n \"ComboboxGroup\",\n \"ComboboxGroupLabel\",\n \"ComboboxEmpty\",\n ],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"항목 탐색\" },\n { keys: \"Enter\", action: \"항목 선택\" },\n { keys: \"Esc\", action: \"팝오버 닫기\" },\n ],\n advancedPatternAnchor: \"combobox-grouping\",\n advancedPatternDescription:\n \"비동기 검색, 커스텀 아이템 렌더링, 선택 상태 관리 등 고급 패턴\",\n props: {\n ComboboxRoot: [\n {\n name: \"setValue\",\n type: \"(value: string) => void\",\n description: \"입력값 변경 핸들러\",\n },\n {\n name: \"resetValueOnHide\",\n type: \"boolean\",\n default: \"false\",\n description: \"팝오버 닫힐 때 입력값 리셋\",\n },\n ],\n ComboboxInput: [\n {\n name: \"placeholder\",\n type: \"string\",\n description: \"플레이스홀더 텍스트\",\n },\n {\n name: \"autoSelect\",\n type: \"boolean\",\n default: \"false\",\n description: \"첫 항목 자동 선택\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n ComboboxPopover: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"ComboboxItem/Group 목록\",\n },\n {\n name: \"sameWidth\",\n type: \"boolean\",\n default: \"true\",\n description: \"입력과 같은 너비\",\n },\n {\n name: \"gutter\",\n type: \"number\",\n default: \"4\",\n description: \"입력과의 간격 (px)\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n ComboboxItem: [\n { name: \"value\", type: \"string\", required: true, description: \"항목 값\" },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"항목 내용\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n ComboboxGroup: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"GroupLabel + Item 그룹\",\n },\n ],\n ComboboxGroupLabel: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"그룹 레이블\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n ComboboxEmpty: [\n {\n name: \"children\",\n type: \"ReactNode\",\n default: '\"결과가 없습니다.\"',\n description: \"빈 상태 메시지\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n ariaRole: \"combobox\",\n testDescribe: \"Combobox\",\n};\n\nexport const menuMeta: ComponentMeta = {\n name: \"Menu\",\n category: \"core\",\n description:\n \"메뉴바 + 개별 메뉴 시스템. 10 exports: MenubarRoot, MenubarContainer, MenuRoot, MenuTrigger, MenuButtonArrow, MenuPopover, MenuItem, MenuItemCheckbox, MenuItemRadio, MenuSeparator.\",\n slug: \"menu\",\n keyboardShortcuts: [\n { keys: \"← →\", action: \"메뉴 간 탐색\" },\n { keys: \"↑ ↓\", action: \"메뉴 항목 탐색\" },\n { keys: \"Enter / Space\", action: \"항목 선택/토글\" },\n { keys: \"Esc\", action: \"메뉴 닫기\" },\n ],\n exports: [\n \"MenubarRoot\",\n \"MenubarContainer\",\n \"MenuRoot\",\n \"MenuTrigger\",\n \"MenuButtonArrow\",\n \"MenuPopover\",\n \"MenuItem\",\n \"MenuItemCheckbox\",\n \"MenuItemRadio\",\n \"MenuSeparator\",\n ],\n props: {\n MenubarRoot: [],\n MenubarContainer: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"MenuRoot 요소들\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n MenuRoot: [],\n MenuTrigger: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"메뉴 버튼 레이블\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n MenuButtonArrow: [\n { name: \"className\", type: \"string\", description: \"화살표 CSS 클래스\" },\n ],\n MenuPopover: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"MenuItem 목록\",\n },\n {\n name: \"gutter\",\n type: \"number\",\n default: \"8\",\n description: \"트리거와의 간격 (px)\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n MenuItem: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"메뉴 항목 내용\",\n },\n { name: \"onClick\", type: \"() => void\", description: \"클릭 핸들러\" },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n MenuItemCheckbox: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"체크박스 이름\",\n },\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"체크박스 값\",\n },\n { name: \"checked\", type: \"boolean\", description: \"체크 상태\" },\n {\n name: \"onChange\",\n type: \"(e: ChangeEvent) => void\",\n description: \"변경 핸들러\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"항목 내용\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n MenuItemRadio: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"라디오 그룹 이름\",\n },\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"라디오 값\",\n },\n { name: \"checked\", type: \"boolean\", description: \"선택 상태\" },\n {\n name: \"onChange\",\n type: \"(e: ChangeEvent) => void\",\n description: \"변경 핸들러\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"항목 내용\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n MenuSeparator: [\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n ariaRole: \"menubar\",\n testDescribe: \"Menu\",\n};\n\nexport const toolbarMeta: ComponentMeta = {\n name: \"Toolbar\",\n category: \"core\",\n description:\n \"툴바 컨테이너 + 툴팁. 7 exports: ToolbarRoot, ToolbarContainer, ToolbarButton, ToolbarSeparator, TooltipProvider, TooltipAnchor, Tooltip.\",\n slug: \"toolbar\",\n keyboardShortcuts: [\n { keys: \"← →\", action: \"버튼 간 탐색\" },\n { keys: \"Enter / Space\", action: \"버튼 활성화\" },\n { keys: \"Home\", action: \"첫 번째 버튼으로 이동\" },\n { keys: \"End\", action: \"마지막 버튼으로 이동\" },\n ],\n exports: [\n \"ToolbarRoot\",\n \"ToolbarContainer\",\n \"ToolbarButton\",\n \"ToolbarSeparator\",\n \"TooltipProvider\",\n \"TooltipAnchor\",\n \"Tooltip\",\n ],\n props: {\n ToolbarRoot: [\n {\n name: \"focusLoop\",\n type: \"boolean\",\n default: \"false\",\n description: \"포커스 순환 여부\",\n },\n ],\n ToolbarContainer: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"ToolbarButton/Separator 요소들\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n ToolbarButton: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"버튼 내용\",\n },\n { name: \"onClick\", type: \"() => void\", description: \"클릭 핸들러\" },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n ToolbarSeparator: [\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n TooltipProvider: [],\n TooltipAnchor: [\n {\n name: \"render\",\n type: \"ReactElement\",\n description: \"앵커로 사용할 요소\",\n },\n { name: \"children\", type: \"ReactNode\", description: \"앵커 내용\" },\n ],\n Tooltip: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"툴팁 내용\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n ariaRole: \"toolbar\",\n testDescribe: \"Toolbar\",\n};\n\nexport const formMeta: ComponentMeta = {\n name: \"Form\",\n category: \"core\",\n description:\n \"접근성 폼 시스템. opt-ui-primitives Form API 기반. 31 exports: FormRoot, FormProvider, FormGroup, FormGroupLabel, FormDescription, FormField, FormControl, FormInput, FormTextarea, FormSelect, FormSelectPopover, FormSelectItem, FormSwitch, FormLabel, FormError, FormSubmit, FormCheckbox, FormRadioGroup, FormRadio, FormPush, FormRemove, FormReset, FormNumberInput, FormSlider, FormStarRating, FormColorPicker, FormIconPicker, FormTagInput, FormDateRangePicker + useFormStore, useFormContext hooks.\",\n slug: \"form\",\n exports: [\n \"FormRoot\",\n \"FormProvider\",\n \"FormGroup\",\n \"FormGroupLabel\",\n \"FormDescription\",\n \"FormField\",\n \"FormControl\",\n \"FormInput\",\n \"FormTextarea\",\n \"FormSelect\",\n \"FormSelectPopover\",\n \"FormSelectItem\",\n \"FormSwitch\",\n \"FormLabel\",\n \"FormError\",\n \"FormSubmit\",\n \"FormCheckbox\",\n \"FormRadioGroup\",\n \"FormRadio\",\n \"FormPush\",\n \"FormRemove\",\n \"FormReset\",\n \"FormNumberInput\",\n \"FormSlider\",\n \"FormStarRating\",\n \"FormColorPicker\",\n \"FormIconPicker\",\n \"FormTagInput\",\n \"FormDateRangePicker\",\n \"useFormStore\",\n \"useFormContext\",\n ],\n props: {\n FormRoot: [\n {\n name: \"store\",\n type: \"FormStore\",\n description:\n \"useFormStore()로 생성한 폼 스토어. 미지정 시 자식의 FormProvider가 제공.\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"폼 필드들\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormInput: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"폼 필드 이름 (스토어 키와 매칭)\",\n },\n {\n name: \"type\",\n type: \"string\",\n default: '\"text\"',\n description: \"입력 타입\",\n },\n { name: \"placeholder\", type: \"string\", description: \"플레이스홀더\" },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormTextarea: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"폼 필드 이름\",\n },\n {\n name: \"rows\",\n type: \"number\",\n default: \"4\",\n description: \"표시 줄 수\",\n },\n {\n name: \"resize\",\n type: '\"none\" | \"vertical\" | \"horizontal\" | \"both\"',\n default: '\"vertical\"',\n description: \"크기 조절 방향\",\n },\n { name: \"placeholder\", type: \"string\", description: \"플레이스홀더\" },\n {\n name: \"className\",\n type: \"string\",\n description: \"추가 CSS 클래스\",\n },\n ],\n FormSelect: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"폼 필드 이름\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"FormSelectPopover 등 자식 요소\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n description: \"미선택 시 표시 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"추가 CSS 클래스\",\n },\n ],\n FormSelectPopover: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"FormSelectItem 목록\",\n },\n {\n name: \"sameWidth\",\n type: \"boolean\",\n default: \"true\",\n description: \"트리거와 같은 너비\",\n },\n {\n name: \"gutter\",\n type: \"number\",\n default: \"4\",\n description: \"트리거와의 간격 (px)\",\n },\n ],\n FormSelectItem: [\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"옵션 값\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"옵션 레이블\",\n },\n ],\n FormSwitch: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"폼 필드 이름\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"스위치 크기\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n description: \"비활성화 상태\",\n },\n ],\n FormLabel: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"연결된 필드 이름\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"레이블 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormError: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"연결된 필드 이름\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormSubmit: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"버튼 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormProvider: [\n {\n name: \"store\",\n type: \"FormStore\",\n required: true,\n description: \"useFormStore()로 생성한 폼 스토어\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"자식 폼 요소\",\n },\n ],\n FormGroup: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"그룹 내 필드들\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormGroupLabel: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"그룹 레이블 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormDescription: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"연결된 필드 이름\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"도움말 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormField: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"필드 이름\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"label + input + error 등\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormControl: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"연결된 필드 이름\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormCheckbox: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"폼 필드 이름 (스토어 키)\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormRadioGroup: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"폼 필드 이름 (스토어 키)\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"FormRadio 목록\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormRadio: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"폼 필드 이름 (스토어 키)\",\n },\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"라디오 값\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormPush: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"배열 필드 이름\",\n },\n {\n name: \"value\",\n type: \"unknown\",\n required: true,\n description: \"추가할 기본값\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"버튼 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormRemove: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"배열 필드 이름\",\n },\n {\n name: \"index\",\n type: \"number\",\n required: true,\n description: \"제거할 인덱스\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"버튼 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormReset: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"버튼 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n useFormContext: [],\n useFormStore: [\n {\n name: \"defaultValues\",\n type: \"Record<string, unknown>\",\n description: \"초기 폼 값\",\n },\n ],\n },\n testDescribe: \"Form\",\n examples: [\n {\n title: \"기본 폼\",\n code: `import { useFormStore, FormRoot, FormField, FormControl, FormLabel, FormError, FormSubmit, Input } from \"@reopt-ai/opt-ui\";\n\nconst store = useFormStore({ defaultValues: { name: \"\", email: \"\" } });\n\n<FormRoot store={store}>\n <FormField name=\"name\">\n <FormLabel name=\"name\">이름</FormLabel>\n <FormControl name=\"name\"><Input /></FormControl>\n <FormError name=\"name\" />\n </FormField>\n <FormSubmit>저장</FormSubmit>\n</FormRoot>`,\n },\n {\n title: \"검증 + 비동기 제출\",\n code: `import { useFormStore, FormRoot, FormField, FormControl, FormLabel, FormError, FormSubmit, Input } from \"@reopt-ai/opt-ui\";\n\nconst store = useFormStore({\n defaultValues: { email: \"\" },\n validate: (values) => {\n const errors: Record<string, string> = {};\n if (!values.email) errors.email = \"이메일을 입력하세요\";\n return errors;\n },\n onSubmit: async (values) => {\n await fetch(\"/api/submit\", {\n method: \"POST\",\n body: JSON.stringify(values),\n });\n },\n});`,\n },\n {\n title: \"schemaValidator (Zod)\",\n code: `import { useFormStore, schemaValidator } from \"@reopt-ai/opt-ui\";\nimport { z } from \"zod\";\n\nconst schema = z.object({\n name: z.string().min(1, \"필수 항목\"),\n age: z.number().min(0, \"0 이상\"),\n});\n\nconst store = useFormStore({\n defaultValues: { name: \"\", age: 0 },\n validate: schemaValidator(schema),\n});`,\n },\n ],\n};\n\nexport const buttonMeta: ComponentMeta = {\n name: \"Button\",\n category: \"core\",\n description:\n \"접근성 버튼 컴포넌트. 4가지 변형(primary, secondary, ghost, danger), 3가지 크기, 로딩/아이콘과 aria-busy 상태를 지원합니다.\",\n slug: \"button\",\n exports: [\"Button\"],\n props: {\n Button: [\n {\n name: \"variant\",\n type: '\"primary\" | \"secondary\" | \"ghost\" | \"danger\"',\n default: '\"primary\"',\n description: \"버튼 스타일 변형\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"버튼 크기\",\n },\n {\n name: \"loading\",\n type: \"boolean\",\n default: \"false\",\n description: \"로딩 상태. true면 스피너 표시 및 비활성화\",\n },\n {\n name: \"leftIcon\",\n type: \"ReactNode\",\n description: \"버튼 텍스트 왼쪽에 표시할 아이콘\",\n },\n {\n name: \"rightIcon\",\n type: \"ReactNode\",\n description: \"버튼 텍스트 오른쪽에 표시할 아이콘\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n description: \"비활성화 상태\",\n },\n ],\n },\n ariaRole: \"button\",\n testDescribe: \"Button\",\n examples: [\n {\n title: \"버튼 변형\",\n code: `import { Button } from \"@reopt-ai/opt-ui\";\n\n<Button variant=\"primary\">Primary</Button>\n<Button variant=\"secondary\">Secondary</Button>\n<Button variant=\"ghost\">Ghost</Button>\n<Button variant=\"danger\" disabled>Danger</Button>\n<Button variant=\"primary\" loading>저장 중...</Button>`,\n },\n ],\n};\n\nexport const badgeMeta: ComponentMeta = {\n name: \"Badge\",\n category: \"core\",\n description: \"인라인 상태 뱃지. 5가지 색상 변형, 상태 점(dot) 옵션 지원.\",\n slug: \"badge\",\n exports: [\"Badge\"],\n props: {\n Badge: [\n {\n name: \"variant\",\n type: '\"default\" | \"success\" | \"warning\" | \"error\" | \"info\"',\n default: '\"default\"',\n description: \"뱃지 색상 변형\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\"',\n default: '\"md\"',\n description: \"뱃지 크기\",\n },\n {\n name: \"dot\",\n type: \"boolean\",\n default: \"false\",\n description: \"상태 점 표시 여부\",\n },\n {\n name: \"progress\",\n type: \"number\",\n description: \"원형 프로그레스 값 (0-100). 설정 시 dot 무시\",\n },\n {\n name: \"progressSize\",\n type: \"number\",\n default: \"16\",\n description: \"프로그레스 링 SVG 크기 (px)\",\n },\n ],\n },\n testDescribe: \"Badge\",\n};\n\nexport const spinnerMeta: ComponentMeta = {\n name: \"Spinner\",\n category: \"core\",\n description:\n \"로딩 상태 표시 스피너. 3가지 크기와 장식용 aria-hidden 모드를 지원합니다.\",\n slug: \"spinner\",\n exports: [\"Spinner\"],\n props: {\n Spinner: [\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"스피너 크기\",\n },\n ],\n },\n ariaRole: \"status\",\n testDescribe: \"Spinner\",\n};\n\nexport const alertMeta: ComponentMeta = {\n name: \"Alert\",\n category: \"core\",\n description:\n \"알림 메시지 컴포넌트. 4가지 변형(info, success, warning, error), 제목/본문/닫기 버튼 지원.\",\n slug: \"alert\",\n exports: [\"Alert\"],\n props: {\n Alert: [\n {\n name: \"variant\",\n type: '\"info\" | \"success\" | \"warning\" | \"error\"',\n default: '\"info\"',\n description: \"알림 변형 (색상 및 아이콘 결정)\",\n },\n {\n name: \"title\",\n type: \"string\",\n description: \"알림 제목\",\n },\n {\n name: \"icon\",\n type: \"ReactNode\",\n description: \"커스텀 아이콘. 미지정 시 변형에 따른 기본 아이콘 사용\",\n },\n {\n name: \"dismissible\",\n type: \"boolean\",\n default: \"false\",\n description: \"닫기 버튼 표시 여부\",\n },\n {\n name: \"onDismiss\",\n type: \"() => void\",\n description: \"닫기 버튼 클릭 핸들러\",\n },\n ],\n },\n ariaRole: \"alert\",\n testDescribe: \"Alert\",\n};\n\nexport const inputMeta: ComponentMeta = {\n name: \"Input\",\n category: \"core\",\n description:\n \"독립적인 텍스트 입력 컴포넌트. 레이블, 에러, 힌트, 아이콘 지원.\",\n slug: \"input\",\n exports: [\"Input\"],\n props: {\n Input: [\n {\n name: \"label\",\n type: \"string\",\n description: \"입력 필드 레이블\",\n },\n {\n name: \"error\",\n type: \"string\",\n description: \"에러 메시지. 표시 시 aria-invalid=true 설정\",\n },\n {\n name: \"hint\",\n type: \"string\",\n description: \"힌트 텍스트 (에러 없을 때만 표시)\",\n },\n {\n name: \"leftIcon\",\n type: \"ReactNode\",\n description: \"입력 필드 왼쪽에 표시할 아이콘\",\n },\n {\n name: \"rightIcon\",\n type: \"ReactNode\",\n description: \"입력 필드 오른쪽에 표시할 아이콘\",\n },\n {\n name: \"fullWidth\",\n type: \"boolean\",\n default: \"false\",\n description: \"전체 너비 사용 여부\",\n },\n ],\n },\n ariaRole: \"textbox\",\n testDescribe: \"Input\",\n examples: [\n {\n title: \"기본 사용\",\n code: `import { Input } from \"@reopt-ai/opt-ui\";\n\n<Input\n label=\"이메일\"\n hint=\"업무용 이메일을 입력하세요\"\n placeholder=\"user@example.com\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n/>`,\n },\n {\n title: \"FormStore 연동\",\n code: `import { useFormStore, FormRoot, FormField, FormControl, FormLabel, Input } from \"@reopt-ai/opt-ui\";\n\nconst store = useFormStore({ defaultValues: { name: \"\" } });\n\n<FormRoot store={store}>\n <FormField name=\"name\">\n <FormLabel name=\"name\">이름</FormLabel>\n <FormControl name=\"name\"><Input /></FormControl>\n </FormField>\n</FormRoot>`,\n },\n ],\n};\n\nexport const switchMeta: ComponentMeta = {\n name: \"Switch\",\n category: \"core\",\n description:\n \"토글 스위치 컴포넌트. 3가지 크기와 레이블/설명의 명시적 접근성 연결을 지원합니다.\",\n slug: \"switch\",\n exports: [\"Switch\"],\n props: {\n Switch: [\n {\n name: \"label\",\n type: \"string\",\n description: \"스위치 레이블\",\n },\n {\n name: \"description\",\n type: \"string\",\n description: \"레이블 아래 설명 텍스트\",\n },\n {\n name: \"checked\",\n type: \"boolean\",\n description: \"제어 모드: 체크 상태\",\n },\n {\n name: \"defaultChecked\",\n type: \"boolean\",\n description: \"비제어 모드: 초기 체크 상태\",\n },\n {\n name: \"onChange\",\n type: \"(checked: boolean) => void\",\n description: \"상태 변경 핸들러\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"스위치 크기\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n description: \"비활성화 상태\",\n },\n ],\n },\n ariaRole: \"switch\",\n testDescribe: \"Switch\",\n};\n\nexport const skeletonMeta: ComponentMeta = {\n name: \"Skeleton\",\n category: \"core\",\n description:\n \"로딩 플레이스홀더. text/circular/rectangular 변형. 프리셋 컴포넌트 포함.\",\n slug: \"skeleton\",\n exports: [\n \"Skeleton\",\n \"SkeletonText\",\n \"SkeletonAvatar\",\n \"SkeletonCard\",\n \"SkeletonTable\",\n ],\n props: {\n Skeleton: [\n {\n name: \"variant\",\n type: '\"text\" | \"circular\" | \"rectangular\"',\n default: '\"text\"',\n description: \"스켈레톤 형태\",\n },\n {\n name: \"width\",\n type: \"string | number\",\n description: \"너비 (px 또는 CSS 값)\",\n },\n {\n name: \"height\",\n type: \"string | number\",\n description: \"높이 (px 또는 CSS 값)\",\n },\n {\n name: \"lines\",\n type: \"number\",\n default: \"1\",\n description: \"text variant일 때 줄 수\",\n },\n {\n name: \"animated\",\n type: \"boolean\",\n default: \"true\",\n description: \"펄스 애니메이션 활성화\",\n },\n ],\n SkeletonText: [\n {\n name: \"lines\",\n type: \"number\",\n default: \"3\",\n description: \"텍스트 줄 수\",\n },\n ],\n SkeletonAvatar: [\n {\n name: \"size\",\n type: \"number\",\n default: \"40\",\n description: \"아바타 크기 (px)\",\n },\n ],\n SkeletonTable: [\n {\n name: \"rows\",\n type: \"number\",\n default: \"5\",\n description: \"테이블 행 수\",\n },\n {\n name: \"columns\",\n type: \"number\",\n default: \"4\",\n description: \"테이블 열 수\",\n },\n ],\n },\n ariaRole: \"status\",\n testDescribe: \"Skeleton\",\n};\n\nexport const textareaMeta: ComponentMeta = {\n name: \"Textarea\",\n category: \"core\",\n description: \"멀티라인 텍스트 입력. Input과 동일한 API (label, error, hint).\",\n slug: \"textarea\",\n exports: [\"Textarea\"],\n props: {\n Textarea: [\n { name: \"label\", type: \"string\", description: \"입력 필드 레이블\" },\n { name: \"error\", type: \"string\", description: \"에러 메시지\" },\n { name: \"hint\", type: \"string\", description: \"힌트 텍스트\" },\n {\n name: \"fullWidth\",\n type: \"boolean\",\n default: \"false\",\n description: \"전체 너비 사용\",\n },\n {\n name: \"resize\",\n type: '\"none\" | \"vertical\" | \"horizontal\" | \"both\"',\n default: '\"vertical\"',\n description: \"크기 조절 방향\",\n },\n { name: \"rows\", type: \"number\", default: \"4\", description: \"표시 줄 수\" },\n ],\n },\n ariaRole: \"textbox\",\n testDescribe: \"Textarea\",\n};\n\nexport const avatarMeta: ComponentMeta = {\n name: \"Avatar\",\n category: \"core\",\n description:\n \"사용자 아바타. 이미지, 이니셜 자동 생성, 스크린 리더에 노출되는 상태 인디케이터, 그룹을 지원합니다.\",\n slug: \"avatar\",\n exports: [\"Avatar\", \"AvatarGroup\"],\n props: {\n Avatar: [\n { name: \"src\", type: \"string\", description: \"이미지 URL\" },\n { name: \"alt\", type: \"string\", description: \"이미지 대체 텍스트\" },\n {\n name: \"name\",\n type: \"string\",\n description: \"사용자 이름 (이니셜 생성 및 색상 결정)\",\n },\n {\n name: \"size\",\n type: '\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\"',\n default: '\"md\"',\n description: \"아바타 크기\",\n },\n {\n name: \"fallback\",\n type: \"ReactNode\",\n description: \"이미지 실패 시 표시할 콘텐츠\",\n },\n {\n name: \"status\",\n type: '\"online\" | \"offline\" | \"busy\" | \"away\"',\n description: \"상태 인디케이터\",\n },\n ],\n AvatarGroup: [\n {\n name: \"max\",\n type: \"number\",\n default: \"4\",\n description: \"최대 표시 개수\",\n },\n {\n name: \"size\",\n type: '\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\"',\n default: '\"md\"',\n description: \"아바타 크기\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"Avatar 요소들\",\n },\n ],\n },\n testDescribe: \"Avatar\",\n};\n\nexport const progressMeta: ComponentMeta = {\n name: \"Progress\",\n category: \"core\",\n description:\n \"진행률 표시. Linear/Circular, determinate/indeterminate 변형과 안전하게 보정된 ARIA 값을 지원합니다.\",\n slug: \"progress\",\n exports: [\"Progress\", \"CircularProgress\"],\n props: {\n Progress: [\n {\n name: \"value\",\n type: \"number\",\n description: \"현재 값. 생략하면 indeterminate 상태\",\n },\n { name: \"max\", type: \"number\", default: \"100\", description: \"최대 값\" },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"진행바 높이\",\n },\n {\n name: \"variant\",\n type: '\"default\" | \"success\" | \"warning\" | \"error\"',\n default: '\"default\"',\n description: \"색상 변형\",\n },\n {\n name: \"showLabel\",\n type: \"boolean\",\n default: \"false\",\n description: \"퍼센트 표시\",\n },\n { name: \"label\", type: \"string\", description: \"레이블 텍스트\" },\n {\n name: \"animated\",\n type: \"boolean\",\n default: \"true\",\n description: \"애니메이션 활성화\",\n },\n {\n name: \"indeterminate\",\n type: \"boolean\",\n default: \"false\",\n description: \"값을 알 수 없는 진행 상태\",\n },\n ],\n CircularProgress: [\n {\n name: \"value\",\n type: \"number\",\n description: \"현재 값. 생략하면 indeterminate 상태\",\n },\n { name: \"max\", type: \"number\", default: \"100\", description: \"최대 값\" },\n {\n name: \"size\",\n type: \"number\",\n default: \"48\",\n description: \"원 크기 (px)\",\n },\n {\n name: \"strokeWidth\",\n type: \"number\",\n default: \"4\",\n description: \"선 두께\",\n },\n {\n name: \"variant\",\n type: '\"default\" | \"success\" | \"warning\" | \"error\"',\n default: '\"default\"',\n description: \"색상 변형\",\n },\n {\n name: \"showLabel\",\n type: \"boolean\",\n default: \"false\",\n description: \"중앙에 퍼센트 표시\",\n },\n { name: \"label\", type: \"string\", description: \"접근성 레이블\" },\n {\n name: \"indeterminate\",\n type: \"boolean\",\n default: \"false\",\n description: \"값을 알 수 없는 진행 상태\",\n },\n ],\n },\n ariaRole: \"progressbar\",\n testDescribe: \"Progress\",\n};\n\nexport const meterMeta: ComponentMeta = {\n name: \"Meter\",\n category: \"core\",\n description:\n \"범위 내 스칼라 측정값 게이지 (디스크 사용량·점수·용량 등). role=meter로 작업 진행률(Progress)과 구분된다.\",\n slug: \"meter\",\n exports: [\"Meter\"],\n props: {\n Meter: [\n { name: \"value\", type: \"number\", required: true, description: \"현재 값\" },\n { name: \"min\", type: \"number\", default: \"0\", description: \"최소 값\" },\n { name: \"max\", type: \"number\", default: \"100\", description: \"최대 값\" },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"게이지 높이\",\n },\n {\n name: \"variant\",\n type: '\"default\" | \"success\" | \"warning\" | \"error\"',\n default: '\"default\"',\n description: \"색상 변형\",\n },\n {\n name: \"showValue\",\n type: \"boolean\",\n default: \"false\",\n description: \"퍼센트 표시\",\n },\n { name: \"label\", type: \"string\", description: \"레이블 텍스트\" },\n ],\n },\n ariaRole: \"meter\",\n testDescribe: \"Meter\",\n};\n\nexport const breadcrumbMeta: ComponentMeta = {\n name: \"Breadcrumb\",\n category: \"core\",\n description: \"현재 위치를 표시하고 계층 탐색을 제공하는 컴포넌트.\",\n slug: \"breadcrumb\",\n exports: [\"Breadcrumb\"],\n props: {\n Breadcrumb: [\n {\n name: \"items\",\n type: \"BreadcrumbItem[]\",\n required: true,\n description: \"경로 항목 배열. { id, label, href?, icon? }\",\n },\n {\n name: \"separator\",\n type: \"ReactNode\",\n default: '\"/\"',\n description: \"항목 간 구분자\",\n },\n {\n name: \"onNavigate\",\n type: \"(item: BreadcrumbItem) => void\",\n description: \"항목 클릭 핸들러\",\n },\n ],\n },\n ariaRole: \"navigation\",\n testDescribe: \"Breadcrumb\",\n};\n\nexport const emptyStateMeta: ComponentMeta = {\n name: \"EmptyState\",\n category: \"core\",\n description:\n \"데이터가 없을 때 표시하는 빈 상태 컴포넌트. 아이콘, 제목, 설명, 액션 버튼 지원.\",\n slug: \"empty-state\",\n exports: [\"EmptyState\"],\n props: {\n EmptyState: [\n {\n name: \"title\",\n type: \"string\",\n required: true,\n description: \"빈 상태 제목\",\n },\n {\n name: \"description\",\n type: \"string\",\n description: \"빈 상태 설명\",\n },\n {\n name: \"icon\",\n type: \"ReactNode\",\n description: \"표시할 아이콘\",\n },\n {\n name: \"actions\",\n type: \"EmptyStateAction[]\",\n description: \"액션 버튼 배열. { label, onClick, variant? }\",\n },\n ],\n },\n testDescribe: \"EmptyState\",\n};\n\nexport const cardMeta: ComponentMeta = {\n name: \"Card\",\n category: \"core\",\n description:\n \"범용 카드 컨테이너. Header, Title, Description, Content, Footer 하위 컴포넌트 포함.\",\n slug: \"card\",\n exports: [\n \"Card\",\n \"CardHeader\",\n \"CardTitle\",\n \"CardDescription\",\n \"CardContent\",\n \"CardFooter\",\n ],\n props: {\n Card: [\n {\n name: \"variant\",\n type: '\"default\" | \"outline\" | \"ghost\"',\n default: '\"default\"',\n description: \"카드 스타일 변형\",\n },\n {\n name: \"padding\",\n type: '\"none\" | \"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"내부 패딩 크기\",\n },\n {\n name: \"selectable\",\n type: \"boolean\",\n default: \"false\",\n description: \"선택 가능 모드 활성화\",\n },\n {\n name: \"selected\",\n type: \"boolean\",\n description: \"선택 상태 (selectable=true 시)\",\n },\n {\n name: \"onSelectedChange\",\n type: \"(selected: boolean) => void\",\n description: \"선택 상태 변경 콜백\",\n },\n ],\n CardHeader: [],\n CardTitle: [],\n CardDescription: [],\n CardContent: [],\n CardFooter: [],\n },\n examples: [\n {\n title: \"카드 레이아웃\",\n code: `import { Card, CardHeader, CardTitle, CardDescription, CardContent } from \"@reopt-ai/opt-ui\";\n\n<Card>\n <CardHeader>\n <CardTitle>프로젝트 요약</CardTitle>\n <CardDescription>최근 7일간 활동 현황</CardDescription>\n </CardHeader>\n <CardContent>\n <p>활성 사용자: 1,234명</p>\n </CardContent>\n</Card>`,\n },\n ],\n testDescribe: \"Card\",\n};\n\nexport const checkboxMeta: ComponentMeta = {\n name: \"Checkbox\",\n category: \"core\",\n description:\n \"독립적인 체크박스 컴포넌트. 레이블, 설명, 그룹과 DOM property까지 동기화되는 indeterminate 상태를 지원합니다.\",\n slug: \"checkbox\",\n exports: [\"Checkbox\", \"CheckboxGroup\"],\n props: {\n Checkbox: [\n {\n name: \"label\",\n type: \"string\",\n description: \"체크박스 레이블\",\n },\n {\n name: \"description\",\n type: \"string\",\n description: \"레이블 아래 설명 텍스트\",\n },\n {\n name: \"checked\",\n type: \"boolean\",\n description: \"제어 모드: 체크 상태\",\n },\n {\n name: \"defaultChecked\",\n type: \"boolean\",\n description: \"비제어 모드: 초기 체크 상태\",\n },\n {\n name: \"onChange\",\n type: \"(checked: boolean) => void\",\n description: \"상태 변경 핸들러\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"체크박스 크기\",\n },\n {\n name: \"value\",\n type: \"string\",\n description: \"CheckboxGroup 내에서 사용할 값\",\n },\n {\n name: \"indeterminate\",\n type: \"boolean\",\n default: \"false\",\n description: \"불확정 상태 표시 (마이너스 아이콘)\",\n },\n ],\n CheckboxGroup: [\n {\n name: \"value\",\n type: \"string[]\",\n description: \"제어 모드: 선택된 값 배열\",\n },\n {\n name: \"defaultValue\",\n type: \"string[]\",\n default: \"[]\",\n description: \"비제어 모드: 초기 선택 값 배열\",\n },\n {\n name: \"onChange\",\n type: \"(value: string[]) => void\",\n description: \"선택 변경 핸들러\",\n },\n {\n name: \"orientation\",\n type: '\"horizontal\" | \"vertical\"',\n default: '\"vertical\"',\n description: \"레이아웃 방향\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"그룹 레이블\",\n },\n ],\n },\n ariaRole: \"checkbox\",\n testDescribe: \"Checkbox\",\n};\n\nexport const radioGroupMeta: ComponentMeta = {\n name: \"RadioGroup\",\n category: \"core\",\n description:\n \"독립적인 라디오 그룹 컴포넌트. 그룹 설명과 항목별 설명을 분리 연결하고 다양한 크기를 지원합니다.\",\n slug: \"radio-group\",\n exports: [\"RadioGroup\", \"Radio\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"라디오 옵션 간 탐색\" },\n { keys: \"← →\", action: \"라디오 옵션 간 탐색\" },\n { keys: \"Space\", action: \"현재 옵션 선택\" },\n ],\n props: {\n RadioGroup: [\n {\n name: \"value\",\n type: \"string\",\n description: \"제어 모드: 선택된 값\",\n },\n {\n name: \"defaultValue\",\n type: \"string\",\n default: '\"\"',\n description: \"비제어 모드: 초기 선택 값\",\n },\n {\n name: \"onChange\",\n type: \"(value: string) => void\",\n description: \"선택 변경 핸들러\",\n },\n {\n name: \"orientation\",\n type: '\"horizontal\" | \"vertical\"',\n default: '\"vertical\"',\n description: \"레이아웃 방향\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"그룹 레이블\",\n },\n {\n name: \"name\",\n type: \"string\",\n description: \"폼 제출 시 사용할 이름\",\n },\n ],\n Radio: [\n {\n name: \"value\",\n type: \"string\",\n description:\n \"라디오 값 (RadioGroup 안에서는 부모가 관리하므로 optional)\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"라디오 레이블\",\n },\n {\n name: \"description\",\n type: \"string\",\n description: \"레이블 아래 설명 텍스트\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"라디오 크기\",\n },\n ],\n },\n ariaRole: \"radiogroup\",\n testDescribe: \"RadioGroup\",\n};\n\nexport const dateRangePickerMeta: ComponentMeta = {\n name: \"DateRangePicker\",\n category: \"core\",\n description:\n \"날짜 범위 선택 컴포넌트. 프리셋, 달력 UI, 포커스 관리와 RTL 방향 탐색 아이콘을 지원합니다.\",\n slug: \"date-range-picker\",\n exports: [\"DateRangePicker\"],\n props: {\n DateRangePicker: [\n {\n name: \"value\",\n type: \"DateRange\",\n description: \"제어 모드: { start: Date | null, end: Date | null }\",\n },\n {\n name: \"onChange\",\n type: \"(range: DateRange) => void\",\n description: \"범위 변경 핸들러\",\n },\n {\n name: \"presets\",\n type: \"DateRangePreset[]\",\n description: \"빠른 선택 프리셋 배열 (기본: Today, Last 7/30/90 days)\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n default: '\"Select date range\"',\n description: \"미선택 시 표시 텍스트\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"입력 필드 레이블\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n default: \"false\",\n description: \"비활성화 상태\",\n },\n {\n name: \"format\",\n type: \"(date: Date) => string\",\n description: \"날짜 포맷 함수\",\n },\n {\n name: \"comparison\",\n type: \"boolean\",\n default: \"false\",\n description: \"비교 모드 활성화\",\n },\n {\n name: \"comparisonMode\",\n type: '\"previous\" | \"year-over-year\"',\n default: '\"previous\"',\n description: \"비교 기준 (이전 기간 / 전년 동기)\",\n },\n {\n name: \"onComparisonChange\",\n type: \"(comparison: boolean, mode: ComparisonMode) => void\",\n description: \"비교 모드 변경 콜백\",\n },\n {\n name: \"showGranularity\",\n type: \"boolean\",\n default: \"false\",\n description: \"시간 단위 선택기 표시\",\n },\n {\n name: \"granularity\",\n type: '\"hour\" | \"day\" | \"week\" | \"month\"',\n default: '\"day\"',\n description: \"시간 단위\",\n },\n {\n name: \"onGranularityChange\",\n type: \"(granularity: DateGranularity) => void\",\n description: \"시간 단위 변경 콜백\",\n },\n ],\n },\n testDescribe: \"DateRangePicker\",\n};\n\nexport const tagInputMeta: ComponentMeta = {\n name: \"TagInput\",\n category: \"core\",\n description:\n \"태그 입력 컴포넌트. 텍스트를 입력하고 Enter로 태그를 추가, Backspace로 삭제합니다.\",\n slug: \"tag-input\",\n exports: [\"TagInput\"],\n keyboardShortcuts: [\n { keys: \"Enter\", action: \"태그 추가\" },\n { keys: \"Backspace\", action: \"마지막 태그 삭제 (입력 비어있을 때)\" },\n { keys: \"←/→\", action: \"태그 간 이동 (Composite roving tabindex)\" },\n { keys: \"Delete\", action: \"포커스된 태그 삭제\" },\n { keys: \"Ctrl+Z\", action: \"실행취소\" },\n { keys: \"Ctrl+Shift+Z\", action: \"다시실행\" },\n ],\n props: {\n TagInput: [\n {\n name: \"value\",\n type: \"string[]\",\n description: \"제어 모드: 현재 태그 배열\",\n },\n {\n name: \"onChange\",\n type: \"(tags: string[]) => void\",\n description: \"태그 변경 핸들러\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n default: '\"Add tag...\"',\n description: \"입력 플레이스홀더\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"입력 필드 레이블\",\n },\n {\n name: \"maxTags\",\n type: \"number\",\n description: \"최대 태그 수\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n default: \"false\",\n description: \"비활성화 상태\",\n },\n {\n name: \"suggestions\",\n type: \"string[]\",\n description: \"자동완성 드롭다운에 표시할 추천 태그 목록\",\n },\n {\n name: \"delimiters\",\n type: \"(string | RegExp)[]\",\n default: '[\",\", \";\", \"\\\\n\"]',\n description: \"붙여넣기 시 태그를 분할할 구분자 목록\",\n },\n {\n name: \"allowDuplicates\",\n type: \"boolean\",\n default: \"false\",\n description: \"중복 태그 허용 여부\",\n },\n ],\n },\n testDescribe: \"TagInput\",\n};\n\nexport const colorPickerMeta: ComponentMeta = {\n name: \"ColorPicker\",\n category: \"core\",\n description: \"색상 선택 컴포넌트. 프리셋 팔레트와 hex 입력을 지원합니다.\",\n slug: \"color-picker\",\n exports: [\"ColorPicker\"],\n props: {\n ColorPicker: [\n {\n name: \"value\",\n type: \"string\",\n description: \"제어 모드: hex 색상 값 (예: '#3b82f6')\",\n },\n {\n name: \"onChange\",\n type: \"(color: string) => void\",\n description: \"색상 변경 핸들러\",\n },\n {\n name: \"presets\",\n type: \"string[]\",\n description: \"프리셋 색상 배열 (기본 16색)\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"입력 필드 레이블\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n default: \"false\",\n description: \"비활성화 상태\",\n },\n ],\n },\n testDescribe: \"ColorPicker\",\n};\n\nexport const iconPickerMeta: ComponentMeta = {\n name: \"IconPicker\",\n category: \"core\",\n description:\n \"아이콘 선택 컴포넌트. 검색, 그룹별 분류, semantic key 기반 Lucide 아이콘과 커스텀 ReactNode를 지원합니다.\",\n slug: \"icon-picker\",\n exports: [\"IconPicker\"],\n props: {\n IconPicker: [\n {\n name: \"value\",\n type: \"string\",\n description: \"제어 모드: 선택된 아이콘 ID\",\n },\n {\n name: \"onChange\",\n type: \"(iconId: string) => void\",\n description: \"아이콘 변경 핸들러\",\n },\n {\n name: \"icons\",\n type: \"IconDef[]\",\n description: \"아이콘 목록 (기본 24개 Lucide 아이콘 제공)\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"입력 필드 레이블\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n default: \"false\",\n description: \"비활성화 상태\",\n },\n ],\n },\n testDescribe: \"IconPicker\",\n};\n\nexport const stepBuilderMeta: ComponentMeta = {\n name: \"StepBuilder\",\n category: \"core\",\n description: \"순서가 있는 단계를 추가, 제거, 재정렬할 수 있는 빌더 컴포넌트.\",\n slug: \"step-builder\",\n exports: [\"StepBuilder\"],\n props: {\n StepBuilder: [\n {\n name: \"steps\",\n type: \"StepDef[]\",\n required: true,\n description: \"단계 배열 ({ id, label, description? })\",\n },\n {\n name: \"onChange\",\n type: \"(steps: StepDef[]) => void\",\n required: true,\n description: \"단계 변경 핸들러\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"빌더 레이블\",\n },\n {\n name: \"maxSteps\",\n type: \"number\",\n description: \"최대 단계 수\",\n },\n ],\n },\n testDescribe: \"StepBuilder\",\n};\n\nexport const conditionBuilderMeta: ComponentMeta = {\n name: \"ConditionBuilder\",\n category: \"core\",\n description:\n \"AND/OR 로직으로 조건 그룹을 구성하는 빌더. 속성, 연산자, 값을 조합합니다.\",\n slug: \"condition-builder\",\n exports: [\"ConditionBuilder\"],\n props: {\n ConditionBuilder: [\n {\n name: \"groups\",\n type: \"ConditionGroup[]\",\n required: true,\n description: \"조건 그룹 배열\",\n },\n {\n name: \"onChange\",\n type: \"(groups: ConditionGroup[]) => void\",\n required: true,\n description: \"그룹 변경 핸들러\",\n },\n {\n name: \"properties\",\n type: \"string[]\",\n description: \"선택 가능한 속성 목록 (기본 10개 제공)\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"빌더 레이블\",\n },\n {\n name: \"nested\",\n type: \"boolean\",\n default: \"false\",\n description: \"중첩 AND/OR 그룹 활성화\",\n },\n {\n name: \"maxDepth\",\n type: \"number\",\n default: \"3\",\n description: \"최대 중첩 깊이\",\n },\n {\n name: \"conditionTypes\",\n type: \"Record<string, ConditionTypeRenderer>\",\n description: \"이질적 조건 타입 렌더러 레지스트리\",\n },\n {\n name: \"onPreview\",\n type: \"(groups: ConditionGroup[]) => void\",\n description: \"조건 변경 시 미리보기 콜백\",\n },\n {\n name: \"previewCount\",\n type: \"number\",\n description: \"매치 카운트 표시 (toLocaleString 포맷)\",\n },\n {\n name: \"addNestedGroupLabel\",\n type: \"string\",\n default: '\"Add nested group\"',\n description: \"중첩 그룹 추가 버튼 텍스트\",\n },\n ],\n },\n testDescribe: \"ConditionBuilder\",\n};\n\nexport const popoverMeta: ComponentMeta = {\n name: \"Popover\",\n category: \"core\",\n description:\n \"Popover 프리미티브 래퍼. 트리거 요소에 연결된 플로팅 콘텐츠를 표시합니다.\",\n slug: \"popover\",\n exports: [\"PopoverRoot\", \"PopoverTrigger\", \"PopoverContent\", \"PopoverClose\"],\n keyboardShortcuts: [\n { keys: \"Esc\", action: \"팝오버 닫기\" },\n { keys: \"Enter / Space\", action: \"트리거 활성화\" },\n ],\n props: {\n PopoverContent: [\n {\n name: \"gutter\",\n type: \"number\",\n default: \"8\",\n description: \"트리거와의 간격 (px)\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n testDescribe: \"Popover\",\n};\n\nexport const dropdownMenuMeta: ComponentMeta = {\n name: \"DropdownMenu\",\n category: \"core\",\n description:\n \"Menu Core 위의 간편 래퍼. 단일 트리거 드롭다운 메뉴에 특화되었습니다.\",\n slug: \"dropdown-menu\",\n exports: [\n \"DropdownMenu\",\n \"DropdownTrigger\",\n \"DropdownContent\",\n \"DropdownItem\",\n \"DropdownSeparator\",\n ],\n // DropdownMenu = MenuRoot alias — DOM은 MenuRoot의 ID로 식별됨.\n domlessExports: [\"DropdownMenu\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"메뉴 항목 탐색\" },\n { keys: \"Enter / Space\", action: \"항목 선택\" },\n { keys: \"Esc\", action: \"메뉴 닫기\" },\n ],\n props: {\n DropdownContent: [\n {\n name: \"gutter\",\n type: \"number\",\n default: \"4\",\n description: \"트리거와의 간격 (px)\",\n },\n ],\n DropdownItem: [\n {\n name: \"variant\",\n type: '\"default\" | \"destructive\"',\n default: '\"default\"',\n description: \"메뉴 아이템 시각 변형. destructive는 위험 작업 강조\",\n },\n {\n name: \"onClick\",\n type: \"() => void\",\n description: \"항목 클릭 핸들러\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n description: \"비활성 상태\",\n },\n ],\n },\n testDescribe: \"DropdownMenu\",\n};\n\nexport const numberInputMeta: ComponentMeta = {\n name: \"NumberInput\",\n category: \"core\",\n description:\n \"숫자 입력 컴포넌트. +/- 버튼, nullable/clear, unit suffix, invalid draft alert, min/max, step, 키보드 화살표를 지원합니다.\",\n slug: \"number-input\",\n exports: [\"NumberInput\"],\n keyboardShortcuts: [\n { keys: \"↑\", action: \"값 증가 (step 단위)\" },\n { keys: \"↓\", action: \"값 감소 (step 단위)\" },\n ],\n props: {\n NumberInput: [\n {\n name: \"value\",\n type: \"number | null\",\n description: \"제어 모드 값. nullable=true일 때 null 허용\",\n },\n {\n name: \"defaultValue\",\n type: \"number | null\",\n default: \"0\",\n description: \"비제어 모드 초기값. nullable=true일 때 null 허용\",\n },\n {\n name: \"onChange\",\n type: \"(value: number | null) => void\",\n description: \"값 변경 핸들러\",\n },\n {\n name: \"nullable\",\n type: \"boolean\",\n default: \"false\",\n description: \"빈 값을 null로 커밋할지 여부\",\n },\n {\n name: \"clearable\",\n type: \"boolean\",\n default: \"false\",\n description: \"nullable 값 지우기 버튼 표시\",\n },\n { name: \"min\", type: \"number\", description: \"최솟값\" },\n { name: \"max\", type: \"number\", description: \"최댓값\" },\n {\n name: \"step\",\n type: \"number\",\n default: \"1\",\n description: \"증감 단위\",\n },\n { name: \"label\", type: \"string\", description: \"라벨 텍스트\" },\n {\n name: \"unit\",\n type: \"ReactNode\",\n description: \"입력값 단위 suffix\",\n },\n { name: \"disabled\", type: \"boolean\", description: \"비활성 상태\" },\n {\n name: \"disabledReason\",\n type: \"string\",\n description: \"aria-disabled 상태에서 노출할 비활성 사유\",\n },\n {\n name: \"labels\",\n type: \"NumberInputLabels\",\n description: \"입력/증감/clear/invalid 접근성 문구\",\n },\n ],\n },\n testDescribe: \"NumberInput\",\n};\n\nexport const sliderMeta: ComponentMeta = {\n name: \"Slider\",\n category: \"core\",\n description:\n \"범위 슬라이더 입력. native range input 래핑, 범위로 정규화된 값/ARIA 상태, 값 표시와 포맷 함수를 지원합니다.\",\n slug: \"slider\",\n exports: [\"Slider\"],\n props: {\n Slider: [\n { name: \"value\", type: \"number\", description: \"제어 모드 값\" },\n {\n name: \"defaultValue\",\n type: \"number\",\n default: \"0\",\n description: \"비제어 모드 초기값\",\n },\n {\n name: \"onChange\",\n type: \"(value: number) => void\",\n description: \"값 변경 핸들러\",\n },\n { name: \"min\", type: \"number\", default: \"0\", description: \"최솟값\" },\n { name: \"max\", type: \"number\", default: \"100\", description: \"최댓값\" },\n { name: \"step\", type: \"number\", default: \"1\", description: \"증감 단위\" },\n { name: \"label\", type: \"string\", description: \"레이블 텍스트\" },\n {\n name: \"showValue\",\n type: \"boolean\",\n default: \"false\",\n description: \"현재 값 표시 여부\",\n },\n {\n name: \"formatValue\",\n type: \"(value: number) => string\",\n description: \"값 포맷 함수\",\n },\n { name: \"disabled\", type: \"boolean\", description: \"비활성화\" },\n { name: \"className\", type: \"string\", description: \"최외곽 CSS 클래스\" },\n ],\n },\n dependencies: [],\n testDescribe: \"Slider\",\n};\n\nexport const pageHeaderMeta: ComponentMeta = {\n name: \"PageHeader\",\n category: \"core\",\n description:\n \"페이지 제목, 설명, 액션 슬롯을 제공하는 레이아웃 헤더 컴포넌트.\",\n slug: \"page-header\",\n exports: [\"PageHeader\"],\n props: {\n PageHeader: [\n {\n name: \"title\",\n type: \"string\",\n required: true,\n description: \"페이지 제목\",\n },\n {\n name: \"description\",\n type: \"string\",\n description: \"제목 아래 설명 텍스트\",\n },\n {\n name: \"actions\",\n type: \"ReactNode\",\n description: \"오른쪽에 표시할 액션 슬롯 (버튼 등)\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n testDescribe: \"PageHeader\",\n};\n\nexport const scrollAreaMeta: ComponentMeta = {\n name: \"ScrollArea\",\n category: \"core\",\n description:\n \"커스텀 스크롤바를 제공하는 스크롤 컨테이너. 수직/수평/양방향 지원.\",\n slug: \"scroll-area\",\n exports: [\"ScrollArea\"],\n props: {\n ScrollArea: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"스크롤할 콘텐츠\",\n },\n {\n name: \"orientation\",\n type: '\"vertical\" | \"horizontal\" | \"both\"',\n default: '\"vertical\"',\n description: \"스크롤 방향\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n testDescribe: \"ScrollArea\",\n};\n\nexport const containerMeta: ComponentMeta = {\n name: \"Container\",\n category: \"core\",\n description:\n \"최대 너비 제약과 중앙 정렬을 제공하는 래퍼. 페이지 콘텐츠 폭 제한용.\",\n slug: \"container\",\n exports: [\"Container\"],\n props: {\n Container: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"래핑할 콘텐츠\",\n },\n {\n name: \"maxWidth\",\n type: '\"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"full\"',\n default: '\"xl\"',\n description: \"최대 너비 크기\",\n },\n {\n name: \"center\",\n type: \"boolean\",\n default: \"true\",\n description: \"중앙 정렬 여부 (mx-auto)\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n testDescribe: \"Container\",\n};\n\nexport const sectionMeta: ComponentMeta = {\n name: \"Section\",\n category: \"core\",\n description:\n \"시맨틱 스페이싱 블록. 제목이 있으면 aria-labelledby를 자동 설정합니다.\",\n slug: \"section\",\n exports: [\"Section\"],\n props: {\n Section: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"섹션 콘텐츠\",\n },\n { name: \"title\", type: \"string\", description: \"섹션 제목 (h3)\" },\n {\n name: \"description\",\n type: \"string\",\n description: \"제목 아래 설명 텍스트\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n testDescribe: \"Section\",\n};\n\nexport const resizableMeta: ComponentMeta = {\n name: \"Resizable\",\n category: \"core\",\n description:\n \"react-resizable-panels 래퍼. 드래그로 크기를 조절할 수 있는 패널 분할 레이아웃.\",\n slug: \"resizable\",\n exports: [\"ResizablePanelGroup\", \"ResizablePanel\", \"ResizableHandle\"],\n props: {\n ResizablePanelGroup: [\n {\n name: \"direction\",\n type: '\"horizontal\" | \"vertical\"',\n required: true,\n description: \"패널 분할 방향\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"ResizablePanel + ResizableHandle 조합\",\n },\n {\n name: \"id\",\n type: \"string\",\n description: \"그룹과 defaultLayout의 패널 크기를 식별하는 고유 ID\",\n },\n {\n name: \"defaultLayout\",\n type: \"Record<string, number>\",\n description: \"패널 ID별 초기 비율(0-100)\",\n },\n {\n name: \"onLayoutChanged\",\n type: \"(layout: Record<string, number>) => void\",\n description: \"드래그가 끝난 뒤 확정된 레이아웃 콜백\",\n },\n {\n name: \"groupRef\",\n type: \"Ref<ResizablePanelGroupHandle>\",\n description: \"레이아웃 조회·설정을 위한 명령형 그룹 ref\",\n },\n {\n name: \"autoSaveId\",\n type: \"string\",\n description: \"id의 deprecated 별칭\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n ResizablePanel: [\n {\n name: \"defaultSize\",\n type: \"number | string\",\n description: \"초기 크기. 숫자는 퍼센트, 문자열은 명시한 CSS 단위\",\n },\n {\n name: \"minSize\",\n type: \"number | string\",\n description: \"최소 크기. 숫자는 퍼센트\",\n },\n {\n name: \"maxSize\",\n type: \"number | string\",\n description: \"최대 크기. 숫자는 퍼센트\",\n },\n {\n name: \"collapsible\",\n type: \"boolean\",\n default: \"false\",\n description: \"최소 크기 이하 시 접히기 허용\",\n },\n {\n name: \"onResize\",\n type: \"(size: ResizablePanelSize, id?: string | number, previous?: ResizablePanelSize) => void\",\n description: \"패널 크기 변경 콜백\",\n },\n {\n name: \"panelRef\",\n type: \"Ref<ResizablePanelHandle>\",\n description: \"접기·펼치기·크기 제어를 위한 명령형 패널 ref\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"패널 콘텐츠\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n ResizableHandle: [\n {\n name: \"withHandle\",\n type: \"boolean\",\n default: \"false\",\n description: \"시각적 드래그 핸들 표시\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n description: \"드래그 및 키보드 리사이즈 비활성화\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n testDescribe: \"Resizable\",\n};\n\nexport const blockLayoutMeta: ComponentMeta = {\n name: \"BlockLayout\",\n category: \"core\",\n description:\n \"Block 루트 레이아웃. 자식 간 section spacing과 선택적 시맨틱 inset을 제공하고 loading prop으로 LoadingOverlay를 자동 래핑합니다.\",\n slug: \"block-layout\",\n exports: [\"BlockLayout\"],\n props: {\n BlockLayout: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"Block 콘텐츠\",\n },\n {\n name: \"loading\",\n type: \"boolean\",\n description: \"로딩 상태. 설정 시 LoadingOverlay로 자동 래핑\",\n },\n {\n name: \"loadingLabel\",\n type: \"string\",\n description: \"LoadingOverlay 접근성 레이블\",\n },\n {\n name: \"spacing\",\n type: '\"section\" | \"group\" | \"element\" | \"none\"',\n default: '\"section\"',\n description:\n \"Block 최상위 자식 사이 간격. 데이터 밀도가 높은 Block는 group/element로 낮출 수 있음\",\n },\n {\n name: \"inset\",\n type: '\"section\" | \"group\" | \"element\" | \"none\"',\n description:\n \"Block 안쪽 여백. 페이지 콘텐츠 경계에는 section을 사용하고, 이미 여백을 제공하는 Shell 안에서는 생략\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n testDescribe: \"BlockLayout\",\n examples: [\n {\n title: \"Block 루트\",\n code: `import { BlockLayout, PageHeader } from \"@reopt-ai/opt-ui\";\n\n<BlockLayout loading={isLoading} spacing=\"section\" inset=\"section\">\n <PageHeader title=\"대시보드\" description=\"프로젝트 현황\" />\n <section>콘텐츠 영역</section>\n</BlockLayout>`,\n },\n ],\n};\n\nexport const createBlockMeta: ComponentMeta = {\n name: \"createBlock\",\n category: \"core\",\n description:\n \"Block 팩토리 함수. BlockLayout 래핑을 구조적으로 강제하여 loading/className 처리를 자동화합니다.\",\n slug: \"create-block\",\n exports: [\"createBlock\"],\n props: {\n createBlock: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"컴포넌트 displayName\",\n },\n {\n name: \"render\",\n type: \"(props: Omit<P, 'loading' | 'className'>) => ReactNode\",\n required: true,\n description: \"콘텐츠를 반환하는 렌더 함수\",\n },\n {\n name: \"options.layoutClassName\",\n type: \"string\",\n description: \"BlockLayout에 전달할 기본 className\",\n },\n ],\n },\n testDescribe: \"createBlock\",\n examples: [\n {\n title: \"Block 팩토리\",\n code: `import { createBlock, PageHeader } from \"@reopt-ai/opt-ui\";\n\ninterface MyDashboardProps { title: string; count: number }\n\nconst MyDashboard = createBlock<MyDashboardProps>(\n \"MyDashboard\",\n ({ title, count }) => (\n <>\n <PageHeader title={title} />\n <p>항목 수: {count}</p>\n </>\n ),\n);\n\n// loading, className은 자동 처리\n<MyDashboard title=\"개요\" count={42} loading={false} />`,\n },\n ],\n};\n\nexport const logoMeta: ComponentMeta = {\n name: \"Logo\",\n category: \"core\",\n description:\n \"아이콘+텍스트 조합, 이미지, 링크 래핑을 지원하는 로고 컴포넌트. Sidebar 등에서 활용.\",\n slug: \"logo\",\n exports: [\"Logo\"],\n props: {\n Logo: [\n { name: \"src\", type: \"string\", description: \"로고 이미지 URL\" },\n {\n name: \"icon\",\n type: \"ReactNode\",\n description: \"로고 아이콘 — src 미설정 시 표시\",\n },\n { name: \"text\", type: \"string\", description: \"텍스트 레이블\" },\n {\n name: \"alt\",\n type: \"string\",\n default: '\"Logo\"',\n description: \"이미지 alt 텍스트\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"크기 (sm=24px, md=32px, lg=40px)\",\n },\n {\n name: \"href\",\n type: \"string\",\n description: \"링크 URL — 설정 시 <a>로 래핑\",\n },\n { name: \"onClick\", type: \"() => void\", description: \"클릭 핸들러\" },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n testDescribe: \"Logo\",\n};\n\nexport const drawerMeta: ComponentMeta = {\n name: \"Drawer\",\n category: \"core\",\n description:\n \"사이드/하단 슬라이드 패널. Dialog 기반 compound 패턴으로 접근성을 보장합니다.\",\n slug: \"drawer\",\n exports: [\"DrawerRoot\", \"DrawerPanel\", \"DrawerClose\"],\n keyboardShortcuts: [\n { keys: \"Esc\", action: \"드로어 닫기\" },\n { keys: \"Tab\", action: \"드로어 내부 포커스 이동\" },\n ],\n props: {\n DrawerRoot: [\n { name: \"open\", type: \"boolean\", description: \"제어 모드 열림 상태\" },\n {\n name: \"onClose\",\n type: \"() => void\",\n description: \"닫힘 콜백\",\n },\n ],\n DrawerPanel: [\n {\n name: \"side\",\n type: '\"left\" | \"right\" | \"bottom\"',\n default: '\"right\"',\n description: \"슬라이드 방향\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\" | \"full\"',\n default: '\"md\"',\n description: \"패널 크기\",\n },\n {\n name: \"swipeToDismiss\",\n type: \"boolean\",\n default: \"true\",\n description: \"가장자리 방향으로 드래그해 닫기 활성화\",\n },\n {\n name: \"swipeDismissThreshold\",\n type: \"number\",\n default: \"80\",\n description: \"닫힘 커밋에 필요한 드래그 거리(px)\",\n },\n ],\n },\n ariaRole: \"dialog\",\n testDescribe: \"Drawer\",\n};\n\nexport const paginationMeta: ComponentMeta = {\n name: \"Pagination\",\n category: \"core\",\n description:\n \"페이지 넘김 네비게이션. ellipsis 포함 페이지 번호, compact/count variant, totalPages/cursor pagination, Prev/Next 버튼을 제공합니다.\",\n slug: \"pagination\",\n exports: [\"Pagination\"],\n props: {\n Pagination: [\n {\n name: \"totalItems\",\n type: \"number\",\n description: \"전체 항목 수\",\n },\n {\n name: \"totalPages\",\n type: \"number\",\n description: \"전체 페이지 수. 전체 항목 수를 모를 때 사용\",\n },\n {\n name: \"hasMore\",\n type: \"boolean\",\n description: \"cursor pagination에서 다음 페이지 존재 여부\",\n },\n {\n name: \"pageSize\",\n type: \"number\",\n description: \"페이지당 항목 수\",\n },\n {\n name: \"currentPage\",\n type: \"number\",\n required: true,\n description: \"현재 페이지 (1부터 시작)\",\n },\n {\n name: \"onPageChange\",\n type: \"(page: number) => void\",\n required: true,\n description: \"페이지 변경 콜백\",\n },\n {\n name: \"showPageNumbers\",\n type: \"boolean\",\n default: \"true\",\n description: \"페이지 번호 표시 여부\",\n },\n {\n name: \"siblingCount\",\n type: \"number\",\n default: \"1\",\n description: \"현재 페이지 좌우 표시할 페이지 수\",\n },\n {\n name: \"variant\",\n type: '\"pages\" | \"count\" | \"compact\" | \"none\"',\n default: '\"pages\"',\n description: \"중앙 표시 방식\",\n },\n {\n name: \"isDisabled\",\n type: \"boolean\",\n default: \"false\",\n description: \"전체 pagination 비활성화\",\n },\n {\n name: \"label\",\n type: \"string\",\n default: '\"Pagination\"',\n description: \"navigation landmark 접근성 라벨\",\n },\n {\n name: \"labels\",\n type: \"PaginationLabels\",\n description: \"Prev/Next/page/count 접근성 및 표시 문구\",\n },\n ],\n },\n ariaRole: \"navigation\",\n testDescribe: \"Pagination\",\n};\n\nexport const virtualListMeta: ComponentMeta = {\n name: \"VirtualList\",\n category: \"core\",\n description:\n \"가상 스크롤 리스트. 대량 데이터를 윈도잉 기법으로 효율적으로 렌더링합니다.\",\n slug: \"virtual-list\",\n exports: [\"VirtualList\"],\n props: {\n VirtualList: [\n {\n name: \"items\",\n type: \"T[]\",\n required: true,\n description: \"렌더링할 항목 배열\",\n },\n {\n name: \"renderItem\",\n type: \"(item: T, index: number) => ReactNode\",\n required: true,\n description: \"항목 렌더 함수\",\n },\n {\n name: \"itemHeight\",\n type: \"number\",\n required: true,\n description: \"각 항목의 고정 높이(px)\",\n },\n {\n name: \"overscan\",\n type: \"number\",\n default: \"3\",\n description: \"뷰포트 밖에 미리 렌더링할 항목 수\",\n },\n ],\n },\n testDescribe: \"VirtualList\",\n};\n\nexport const loadingOverlayMeta: ComponentMeta = {\n name: \"LoadingOverlay\",\n category: \"core\",\n description:\n \"로딩 오버레이. 중복 status 없이 하나의 aria-busy 라이브 영역으로 콘텐츠 위 로딩 상태를 표시합니다.\",\n slug: \"loading-overlay\",\n exports: [\"LoadingOverlay\"],\n props: {\n LoadingOverlay: [\n {\n name: \"loading\",\n type: \"boolean\",\n required: true,\n description: \"로딩 상태\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"감싸는 콘텐츠\",\n },\n {\n name: \"label\",\n type: \"string\",\n default: '\"Loading…\"',\n description: \"로딩 텍스트\",\n },\n ],\n },\n ariaRole: \"status\",\n dependencies: [{ slug: \"spinner\", category: \"core\" }],\n testDescribe: \"LoadingOverlay\",\n};\n\nexport const starRatingMeta: ComponentMeta = {\n name: \"StarRating\",\n category: \"core\",\n description:\n \"1~N점 별점을 선택하는 인터랙티브 레이팅 입력. 읽기 전용 표시도 지원.\",\n slug: \"star-rating\",\n exports: [\"StarRating\"],\n props: {\n StarRating: [\n {\n name: \"value\",\n type: \"number\",\n description: \"현재 선택된 별점\",\n },\n {\n name: \"onChange\",\n type: \"(value: number) => void\",\n description: \"별점 변경 콜백\",\n },\n {\n name: \"max\",\n type: \"number\",\n default: \"5\",\n description: \"최대 별 개수\",\n },\n {\n name: \"readOnly\",\n type: \"boolean\",\n default: \"false\",\n description: \"읽기 전용 모드\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"별 아이콘 크기\",\n },\n ],\n },\n keyboardShortcuts: [\n { keys: \"ArrowRight / ArrowUp\", action: \"별점 1 증가\" },\n { keys: \"ArrowLeft / ArrowDown\", action: \"별점 1 감소\" },\n { keys: \"Home\", action: \"별점 1로 설정\" },\n { keys: \"End\", action: \"별점 최대로 설정\" },\n ],\n testDescribe: \"StarRating\",\n};\n\nexport const errorBoundaryMeta: ComponentMeta = {\n name: \"ErrorBoundary\",\n category: \"core\",\n description:\n \"React 에러 바운더리. 자식 컴포넌트 렌더 에러를 잡아 fallback UI를 표시합니다.\",\n slug: \"error-boundary\",\n exports: [\"ErrorBoundary\"],\n // class component / transparent wrapper — children passthrough 또는 fallback\n // Alert를 반환할 뿐 자체 DOM이 없음.\n domlessExports: [\"ErrorBoundary\"],\n props: {\n ErrorBoundary: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"에러를 감시할 자식 컴포넌트\",\n },\n {\n name: \"fallback\",\n type: \"ReactNode | ((error: Error) => ReactNode)\",\n description:\n \"에러 발생 시 표시할 UI. 함수 전달 시 에러 객체를 인자로 받음. 미지정 시 Alert error 표시\",\n },\n {\n name: \"onError\",\n type: \"(error: Error, info: ErrorInfo) => void\",\n description: \"에러 발생 시 호출되는 콜백 (에러 리포팅용)\",\n },\n ],\n },\n testDescribe: \"ErrorBoundary\",\n};\n\nexport const commandMeta: ComponentMeta = {\n name: \"Command\",\n category: \"core\",\n description:\n \"cmdk 스타일 명령 anatomy. 자동 필터링 + 키보드 내비게이션. 인라인 또는 CommandDialog로 사용.\",\n slug: \"command\",\n exports: [\n \"Command\",\n \"CommandDialog\",\n \"CommandInput\",\n \"CommandList\",\n \"CommandEmpty\",\n \"CommandGroup\",\n \"CommandItem\",\n \"CommandSeparator\",\n \"CommandShortcut\",\n ],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"활성 항목 이동\" },\n { keys: \"Home / End\", action: \"처음/마지막 항목\" },\n { keys: \"Enter\", action: \"활성 항목 선택\" },\n { keys: \"Esc\", action: \"dialog 닫기\" },\n ],\n props: {\n Command: [\n {\n name: \"shouldFilter\",\n type: \"boolean\",\n description: \"자동 필터링 여부 (기본 true)\",\n },\n {\n name: \"filter\",\n type: \"(value: string, search: string, keywords: string[]) => boolean\",\n description: \"커스텀 필터 함수 (기본: case-insensitive substring)\",\n },\n ],\n CommandInput: [\n {\n name: \"trailing\",\n type: \"ReactNode\",\n description: \"검색 입력 우측에 표시할 보조 콘텐츠\",\n },\n {\n name: \"wrapperClassName\",\n type: \"string\",\n description: \"입력 wrapper className\",\n },\n ],\n CommandList: [\n {\n name: \"aria-label\",\n type: \"string\",\n default: '\"Commands\"',\n description: \"listbox 접근성 라벨\",\n },\n ],\n CommandItem: [\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"이 항목의 검색 가능 값 (고유 식별자)\",\n },\n {\n name: \"keywords\",\n type: \"string[]\",\n description: \"value에 더해 검색어와 비교할 추가 키워드\",\n },\n {\n name: \"onSelect\",\n type: \"(value: string) => void\",\n description: \"Enter/클릭 시 호출\",\n },\n ],\n },\n testDescribe: \"Command\",\n};\n\nexport const shaderSurfaceMeta: ComponentMeta = {\n name: \"ShaderSurface\",\n category: \"core\",\n description:\n \"ogl 기반 애니메이션 WebGL 셰이더 배경. 럭셔리 프리셋(메탈릭/실크/유리 등) + 색·파라미터로 배경·카드 배경을 만든다. 정지 프레임·PNG 캡처·WebGL 폴백 지원.\",\n slug: \"shader-surface\",\n exports: [\"ShaderSurface\"],\n props: {\n ShaderSurface: [\n {\n name: \"preset\",\n type: \"ShaderPresetId\",\n required: true,\n description: \"렌더할 셰이더 프리셋 id\",\n },\n {\n name: \"colors\",\n type: \"string[]\",\n description: \"hex 색상 배열 (미지정 시 프리셋 기본 색)\",\n },\n { name: \"scale\", type: \"number\", description: \"패턴 스케일\" },\n { name: \"speed\", type: \"number\", description: \"애니메이션 속도\" },\n { name: \"distortion\", type: \"number\", description: \"왜곡 강도\" },\n { name: \"grain\", type: \"number\", description: \"필름 그레인 양\" },\n { name: \"contrast\", type: \"number\", description: \"하이라이트 대비\" },\n { name: \"angle\", type: \"number\", description: \"회전 각도(도)\" },\n {\n name: \"paused\",\n type: \"boolean\",\n description: \"true면 단일 프레임만 렌더 (카드 배경 등)\",\n },\n {\n name: \"dpr\",\n type: \"number\",\n description: \"device pixel ratio 상한 (기본 min(dpr, 2))\",\n },\n ],\n },\n testDescribe: \"ShaderSurface\",\n};\n\nexport const coreMetas = [\n textMeta,\n headingMeta,\n kbdMeta,\n separatorMeta,\n otpFieldMeta,\n toggleMeta,\n accordionMeta,\n statCardMeta,\n compositeZoneMeta,\n disclosureMeta,\n tabsMeta,\n selectMeta,\n dialogMeta,\n comboboxMeta,\n menuMeta,\n toolbarMeta,\n formMeta,\n buttonMeta,\n badgeMeta,\n spinnerMeta,\n alertMeta,\n inputMeta,\n switchMeta,\n skeletonMeta,\n textareaMeta,\n avatarMeta,\n progressMeta,\n meterMeta,\n breadcrumbMeta,\n emptyStateMeta,\n cardMeta,\n checkboxMeta,\n radioGroupMeta,\n dateRangePickerMeta,\n tagInputMeta,\n colorPickerMeta,\n iconPickerMeta,\n stepBuilderMeta,\n conditionBuilderMeta,\n popoverMeta,\n dropdownMenuMeta,\n numberInputMeta,\n sliderMeta,\n pageHeaderMeta,\n scrollAreaMeta,\n containerMeta,\n sectionMeta,\n resizableMeta,\n blockLayoutMeta,\n createBlockMeta,\n logoMeta,\n drawerMeta,\n paginationMeta,\n virtualListMeta,\n loadingOverlayMeta,\n starRatingMeta,\n errorBoundaryMeta,\n commandMeta,\n shaderSurfaceMeta,\n];\n","import type { ComponentMeta } from \"@reopt-ai/opt-doc-kit\";\n\n/** @deprecated Chart metadata moved to `@reopt-ai/opt-charts/meta`. */\nexport const visualMetas: ComponentMeta[] = [];\n","import type { ComponentMeta } from \"@reopt-ai/opt-doc-kit\";\n\nexport const faqAccordionMeta: ComponentMeta = {\n name: \"FaqAccordion\",\n category: \"shell\",\n description: \"FAQ 질문/답변 아코디언. Composite + Disclosure 조합.\",\n slug: \"faq-accordion\",\n exports: [\"FaqAccordion\"],\n props: {\n FaqAccordion: [\n {\n name: \"items\",\n type: \"FaqItem[]\",\n required: true,\n description: \"FAQ 항목 배열. { id, question, answer }\",\n },\n ],\n },\n dependencies: [{ slug: \"disclosure\", category: \"core\" }],\n testDescribe: \"FaqAccordion\",\n};\n\nexport const contentTabsMeta: ComponentMeta = {\n name: \"ContentTabs\",\n category: \"shell\",\n description: \"탭 콘텐츠 패널. Tabs primitive 래퍼.\",\n slug: \"content-tabs\",\n exports: [\"ContentTabs\"],\n props: {\n ContentTabs: [\n {\n name: \"tabs\",\n type: \"TabDef[]\",\n required: true,\n description: \"탭 정의 배열. { id, label, content }\",\n },\n {\n name: \"defaultTabId\",\n type: \"string\",\n description: \"초기 선택 탭 ID. 미지정 시 첫 탭\",\n },\n ],\n },\n dependencies: [{ slug: \"tabs\", category: \"core\" }],\n testDescribe: \"ContentTabs\",\n};\n\nexport const dashboardGridMeta: ComponentMeta = {\n name: \"DashboardGrid\",\n category: \"shell\",\n description:\n \"Composite 기반 통계 카드 그리드. 유효한 1–4열 레이아웃과 화살표 키 2D 탐색을 지원합니다.\",\n slug: \"dashboard-grid\",\n exports: [\"DashboardGrid\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓ ← →\", action: \"카드 간 2D 탐색\" },\n { keys: \"Tab\", action: \"다음 섹션으로 이동\" },\n ],\n advancedPatternAnchor: \"dashboard-responsive\",\n advancedPatternDescription: \"반응형 컬럼 조절, 기간 필터 연동 등 고급 패턴\",\n dependencies: [\n { slug: \"stat-card\", category: \"core\" },\n { slug: \"composite-zone\", category: \"core\" },\n ],\n props: {\n DashboardGrid: [\n {\n name: \"stats\",\n type: \"StatCard[]\",\n required: true,\n description: \"통계 데이터 배열. { id, title, value, change, trend }\",\n },\n {\n name: \"columns\",\n type: \"number\",\n default: \"3\",\n description: \"행당 컬럼 수\",\n },\n ],\n },\n testDescribe: \"DashboardGrid\",\n};\n\nexport const searchComboboxMeta: ComponentMeta = {\n name: \"SearchCombobox\",\n category: \"shell\",\n description: \"match-sorter 기반 퍼지 검색 콤보박스.\",\n slug: \"search-combobox\",\n exports: [\"SearchCombobox\"],\n props: {\n SearchCombobox: [\n {\n name: \"items\",\n type: \"string[]\",\n required: true,\n description: \"검색 대상 문자열 목록\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n default: '\"검색...\"',\n description: \"입력 플레이스홀더\",\n },\n {\n name: \"label\",\n type: \"string\",\n default: '\"검색\"',\n description: \"입력 레이블\",\n },\n {\n name: \"onSelect\",\n type: \"(item: string) => void\",\n description: \"항목 선택 핸들러\",\n },\n {\n name: \"labels\",\n type: \"SearchComboboxLabels\",\n description: \"noResults/loading 문구\",\n },\n {\n name: \"async\",\n type: \"boolean\",\n default: \"false\",\n description: \"비동기 검색 모드 활성화\",\n },\n {\n name: \"onSearch\",\n type: \"(query: string) => Promise<string[]>\",\n description: \"async=true일 때 사용할 검색 콜백\",\n },\n {\n name: \"debounceMs\",\n type: \"number\",\n default: \"300\",\n description: \"비동기 검색 디바운스 ms\",\n },\n ],\n },\n dependencies: [{ slug: \"combobox\", category: \"core\" }],\n testDescribe: \"SearchCombobox\",\n examples: [\n {\n title: \"검색 + 선택\",\n code: `import { SearchCombobox } from \"@reopt-ai/opt-ui\";\n\n<SearchCombobox\n items={[\"React\", \"Vue\", \"Angular\", \"Svelte\"]}\n placeholder=\"프레임워크 검색...\"\n onSelect={(item) => console.log(item)}\n/>`,\n },\n ],\n};\n\nexport const statusSelectMeta: ComponentMeta = {\n name: \"StatusSelect\",\n category: \"shell\",\n description: \"색상 인디케이터가 있는 상태 선택 드롭다운.\",\n slug: \"status-select\",\n exports: [\"StatusSelect\"],\n props: {\n StatusSelect: [\n {\n name: \"options\",\n type: \"SelectOption[]\",\n required: true,\n description: \"옵션 목록. { value, label, color? }\",\n },\n { name: \"value\", type: \"string\", description: \"제어 모드: 현재 선택 값\" },\n {\n name: \"onChange\",\n type: \"(value: string) => void\",\n description: \"제어 모드: 값 변경 핸들러\",\n },\n {\n name: \"label\",\n type: \"string\",\n default: '\"상태\"',\n description: \"Select 레이블\",\n },\n ],\n },\n dependencies: [{ slug: \"select\", category: \"core\" }],\n testDescribe: \"StatusSelect\",\n};\n\nexport const editorToolbarMeta: ComponentMeta = {\n name: \"EditorToolbar\",\n category: \"shell\",\n description: \"리치 텍스트 에디터 스타일 툴바. Toolbar + Tooltip 조합.\",\n slug: \"editor-toolbar\",\n exports: [\"EditorToolbar\"],\n props: {\n EditorToolbar: [\n {\n name: \"buttons\",\n type: \"ToolbarButtonDef[]\",\n required: true,\n description: \"버튼 정의. { id, label, icon, separator? }\",\n },\n {\n name: \"onAction\",\n type: \"(id: string) => void\",\n description: \"버튼 클릭 핸들러\",\n },\n {\n name: \"activeButtons\",\n type: \"string[]\",\n default: \"[]\",\n description: \"활성 상태 버튼 ID 배열\",\n },\n ],\n },\n dependencies: [{ slug: \"toolbar\", category: \"core\" }],\n testDescribe: \"EditorToolbar\",\n};\n\nexport const sidebarNavMeta: ComponentMeta = {\n name: \"SidebarNav\",\n category: \"shell\",\n description: \"Composite 기반 사이드바 네비게이션. pathname 자동 동기화.\",\n slug: \"sidebar-nav\",\n exports: [\"SidebarNav\"],\n props: {\n SidebarNav: [\n {\n name: \"items\",\n type: \"NavItemDef[]\",\n required: true,\n description:\n \"네비게이션 항목. { id, label, href, separator?, sectionLabel? }\",\n },\n ],\n },\n testDescribe: \"SidebarNav\",\n};\n\nexport const settingsFormMeta: ComponentMeta = {\n name: \"SettingsForm\",\n category: \"shell\",\n description: \"데이터 기반 설정 폼. 유효성 검증, 라디오, 체크박스 지원.\",\n slug: \"settings-form\",\n exports: [\"SettingsForm\"],\n props: {\n SettingsForm: [\n {\n name: \"fields\",\n type: \"FormFieldDef[]\",\n required: true,\n description: \"폼 필드 정의 배열\",\n },\n {\n name: \"onSubmit\",\n type: \"(values: Record<string, unknown>) => void\",\n description: \"제출 핸들러\",\n },\n ],\n },\n dependencies: [\n { slug: \"form\", category: \"core\" },\n { slug: \"checkbox\", category: \"core\" },\n { slug: \"radio-group\", category: \"core\" },\n { slug: \"switch\", category: \"core\" },\n ],\n testDescribe: \"SettingsForm\",\n examples: [\n {\n title: \"설정 폼\",\n code: `import { SettingsForm } from \"@reopt-ai/opt-ui\";\n\nconst fields = [\n { name: \"username\", label: \"사용자명\", type: \"text\", required: true },\n { name: \"theme\", label: \"테마\", type: \"select\", options: [\"light\", \"dark\"] },\n { name: \"notifications\", label: \"알림\", type: \"switch\" },\n];\n\n<SettingsForm fields={fields} onSubmit={(values) => console.log(values)} />`,\n },\n ],\n};\n\nexport const appMenubarMeta: ComponentMeta = {\n name: \"AppMenubar\",\n category: \"shell\",\n description: \"데스크톱 스타일 메뉴바. 체크박스, 라디오 메뉴 항목 지원.\",\n slug: \"app-menubar\",\n exports: [\"AppMenubar\"],\n props: {\n AppMenubar: [\n {\n name: \"menus\",\n type: \"MenuDef[]\",\n required: true,\n description: \"메뉴 정의 배열. { id, label, items: MenuItemDef[] }\",\n },\n ],\n },\n dependencies: [\n { slug: \"menu\", category: \"core\" },\n { slug: \"kbd\", category: \"core\" },\n ],\n testDescribe: \"AppMenubar\",\n};\n\nexport const commandPaletteMeta: ComponentMeta = {\n name: \"CommandPalette\",\n category: \"shell\",\n description:\n \"Cmd+K 스타일 커맨드 팔레트. Dialog + Combobox + match-sorter 퍼지 검색.\",\n slug: \"command-palette\",\n exports: [\"CommandPalette\"],\n props: {\n CommandPalette: [\n {\n name: \"commands\",\n type: 'Omit<Command, \"action\">[]',\n required: true,\n description: \"커맨드 목록. { id, label, group, shortcut? }\",\n },\n {\n name: \"open\",\n type: \"boolean\",\n required: true,\n description: \"열림 상태\",\n },\n {\n name: \"onOpenChange\",\n type: \"(open: boolean) => void\",\n required: true,\n description: \"상태 변경 핸들러\",\n },\n {\n name: \"onSelect\",\n type: \"(command: Omit<Command, 'action'>) => void\",\n description: \"커맨드 선택 핸들러\",\n },\n {\n name: \"inline\",\n type: \"boolean\",\n default: \"false\",\n description: \"true일 때 풀스크린 Dialog 대신 인라인 팝업으로 렌더링\",\n },\n {\n name: \"labels\",\n type: \"CommandPaletteLabels\",\n description: \"title/description/input/list/empty/escape 문구\",\n },\n {\n name: \"footer\",\n type: \"ReactNode\",\n description: \"명령 목록 아래에 표시할 footer slot\",\n },\n {\n name: \"empty\",\n type: \"ReactNode\",\n description: \"결과가 없을 때 표시할 empty slot\",\n },\n {\n name: \"inputTrailing\",\n type: \"ReactNode\",\n description: \"검색 입력 우측 보조 콘텐츠\",\n },\n ],\n },\n dependencies: [\n { slug: \"dialog\", category: \"core\" },\n { slug: \"combobox\", category: \"core\" },\n { slug: \"kbd\", category: \"core\" },\n ],\n testDescribe: \"CommandPalette\",\n};\n\nexport const commandPaletteTriggerMeta: ComponentMeta = {\n name: \"CommandPaletteTrigger\",\n category: \"shell\",\n description: \"CommandPalette + Cmd+K 키보드 단축키 자동 바인딩.\",\n slug: \"command-palette-trigger\",\n exports: [\"CommandPaletteTrigger\"],\n props: {\n CommandPaletteTrigger: [\n {\n name: \"commands\",\n type: 'Omit<Command, \"action\">[]',\n required: true,\n description: \"커맨드 목록\",\n },\n {\n name: \"onSelect\",\n type: \"(command: Omit<Command, 'action'>) => void\",\n description: \"커맨드 선택 핸들러\",\n },\n {\n name: \"labels\",\n type: \"CommandPaletteTriggerLabels\",\n description: \"내부 CommandPalette에 전달할 title/input/list 문구\",\n },\n ],\n },\n dependencies: [{ slug: \"command-palette\", category: \"shells\" }],\n testDescribe: \"CommandPaletteTrigger\",\n};\n\nexport const deploymentTimelineMeta: ComponentMeta = {\n name: \"DeploymentTimeline\",\n category: \"shell\",\n description: \"배포 단계 타임라인. Composite 기반 키보드 탐색 지원.\",\n slug: \"deployment-timeline\",\n exports: [\"DeploymentTimeline\"],\n props: {\n DeploymentTimeline: [\n {\n name: \"steps\",\n type: \"DeploymentStep[]\",\n required: true,\n description: \"배포 단계 배열. { id, name, status, duration?, detail? }\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"배포 타임라인\"',\n description: \"타임라인 제목\",\n },\n ],\n },\n testDescribe: \"DeploymentTimeline\",\n};\n\nexport const projectSwitcherMeta: ComponentMeta = {\n name: \"ProjectSwitcher\",\n category: \"shell\",\n description: \"프로젝트 검색 전환기. Combobox + match-sorter 퍼지 검색 지원.\",\n slug: \"project-switcher\",\n exports: [\"ProjectSwitcher\"],\n props: {\n ProjectSwitcher: [\n {\n name: \"projects\",\n type: \"ProjectDef[]\",\n required: true,\n description: \"프로젝트 목록. { id, name, framework, status, domain? }\",\n },\n {\n name: \"value\",\n type: \"string\",\n description: \"제어 모드: 현재 선택된 프로젝트 ID\",\n },\n {\n name: \"onChange\",\n type: \"(id: string) => void\",\n description: \"프로젝트 선택 핸들러\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n default: '\"프로젝트 검색...\"',\n description: \"검색 입력 플레이스홀더\",\n },\n ],\n },\n dependencies: [{ slug: \"combobox\", category: \"core\" }],\n testDescribe: \"ProjectSwitcher\",\n};\n\nexport const envPanelMeta: ComponentMeta = {\n name: \"EnvPanel\",\n category: \"shell\",\n description:\n \"환경변수 패널. Disclosure로 환경별 그룹 접기/펼치기, Composite로 변수 탐색.\",\n slug: \"env-panel\",\n exports: [\"EnvPanel\"],\n props: {\n EnvPanel: [\n {\n name: \"groups\",\n type: \"EnvGroupDef[]\",\n required: true,\n description: \"환경 그룹 배열. { env, vars: EnvVarDef[] }\",\n },\n ],\n },\n dependencies: [{ slug: \"disclosure\", category: \"core\" }],\n testDescribe: \"EnvPanel\",\n};\n\nexport const branchSelectMeta: ComponentMeta = {\n name: \"BranchSelect\",\n category: \"shell\",\n description: \"Git 브랜치 선택 드롭다운. Select primitive 래퍼.\",\n slug: \"branch-select\",\n exports: [\"BranchSelect\"],\n props: {\n BranchSelect: [\n {\n name: \"branches\",\n type: \"BranchDef[]\",\n required: true,\n description: \"브랜치 목록. { name, isDefault?, lastCommit?, author? }\",\n },\n {\n name: \"value\",\n type: \"string\",\n description: \"제어 모드: 현재 선택된 브랜치 이름\",\n },\n {\n name: \"onChange\",\n type: \"(name: string) => void\",\n description: \"브랜치 선택 핸들러\",\n },\n {\n name: \"label\",\n type: \"string\",\n default: '\"브랜치\"',\n description: \"Select 레이블\",\n },\n ],\n },\n dependencies: [{ slug: \"select\", category: \"core\" }],\n testDescribe: \"BranchSelect\",\n};\n\nexport const domainTableMeta: ComponentMeta = {\n name: \"DomainTable\",\n category: \"shell\",\n description: \"도메인 테이블. Composite 기반 그리드로 키보드 탐색 지원.\",\n slug: \"domain-table\",\n exports: [\"DomainTable\"],\n props: {\n DomainTable: [\n {\n name: \"domains\",\n type: \"DomainDef[]\",\n required: true,\n description:\n \"도메인 목록. { domain, status, ssl, redirect?, addedAt? }\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"도메인\"',\n description: \"테이블 제목\",\n },\n ],\n },\n testDescribe: \"DomainTable\",\n};\n\nexport const dataTableMeta: ComponentMeta = {\n name: \"DataTable\",\n category: \"shell\",\n description:\n \"제네릭 데이터 테이블. 동적 컬럼, 결측값 안전 정렬, 키보드 컬럼 리사이즈, 보정된 인라인 진행률과 Composite 탐색을 지원합니다.\",\n slug: \"data-table\",\n exports: [\"DataTable\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"행 탐색\" },\n { keys: \"← →\", action: \"셀 탐색\" },\n { keys: \"Enter / Space\", action: \"정렬 가능한 헤더 또는 행 활성화\" },\n { keys: \"리사이즈 핸들: ← →\", action: \"컬럼 너비를 10px 단위로 조절\" },\n {\n keys: \"리사이즈 핸들: Shift+← Shift+→\",\n action: \"컬럼 너비를 40px 단위로 조절\",\n },\n {\n keys: \"리사이즈 핸들: Home / End\",\n action: \"컬럼 너비를 최솟값/최댓값으로 이동\",\n },\n ],\n advancedPatternAnchor: \"data-table-filtering\",\n advancedPatternDescription:\n \"실시간 필터링, 커스텀 컬럼 렌더링, Badge 상태 표시 등 고급 패턴\",\n dependencies: [\n { slug: \"composite-zone\", category: \"core\" },\n { slug: \"button\", category: \"core\" },\n { slug: \"checkbox\", category: \"core\" },\n ],\n props: {\n DataTable: [\n {\n name: \"data\",\n type: \"T[]\",\n required: true,\n description: \"테이블 데이터 배열\",\n },\n {\n name: \"columns\",\n type: \"ColumnDef<T>[]\",\n required: true,\n description: \"컬럼 정의. { id, header, accessor, width?, align? }\",\n },\n {\n name: \"keyExtractor\",\n type: \"(row: T) => string\",\n required: true,\n description: \"각 행의 고유 키 추출 함수\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"데이터 테이블\"',\n description: \"테이블 제목\",\n },\n {\n name: \"onRowClick\",\n type: \"(row: T) => void\",\n description: \"행 클릭 핸들러\",\n },\n {\n name: \"emptyMessage\",\n type: \"string\",\n default: '\"데이터가 없습니다\"',\n description: \"데이터 없을 때 표시할 메시지\",\n },\n ],\n ColumnDef: [\n {\n name: \"bar\",\n type: \"(row: T) => number\",\n description:\n \"인라인 프로그레스 바 비율(0-1) 계산 함수. 범위 밖/NaN은 보정\",\n },\n {\n name: \"barColor\",\n type: \"string\",\n default: '\"bg-accent\"',\n description: \"인라인 바 색상 클래스\",\n },\n ],\n },\n testDescribe: \"DataTable\",\n examples: [\n {\n title: \"기본 테이블\",\n code: `import { DataTable } from \"@reopt-ai/opt-ui\";\n\nconst columns = [\n { id: \"name\", header: \"이름\", accessor: (r) => r.name },\n { id: \"email\", header: \"이메일\", accessor: (r) => r.email },\n];\nconst data = [\n { name: \"홍길동\", email: \"hong@example.com\" },\n { name: \"김철수\", email: \"kim@example.com\" },\n];\n\n<DataTable columns={columns} data={data} keyExtractor={(r) => r.email} />`,\n },\n {\n title: \"선택 + 정렬\",\n code: `import { DataTable } from \"@reopt-ai/opt-ui\";\n\n<DataTable\n columns={columns}\n data={data}\n keyExtractor={(r) => r.id}\n selectable\n selectedKeys={selected}\n onSelectionChange={setSelected}\n sortable\n onSort={(colId, dir) => console.log(colId, dir)}\n/>`,\n },\n ],\n};\n\nexport const notificationToastMeta: ComponentMeta = {\n name: \"NotificationToast\",\n category: \"shell\",\n description:\n \"토스트 알림 시스템. 포인터/키보드 상호작용 중 자동 닫힘을 일시 정지하고, 중요도별 live region으로 전역 알림을 관리합니다.\",\n slug: \"notification-toast\",\n exports: [\"ToastProvider\", \"useToast\", \"NotificationToast\", \"toast\"],\n advancedPatternAnchor: \"toast-notifications\",\n advancedPatternDescription:\n \"에러 핸들링과 함께 사용하기, 커스텀 duration 설정 등 고급 패턴\",\n dependencies: [{ slug: \"alert\", category: \"core\" }],\n props: {\n ToastProvider: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"앱 컨텐츠\",\n },\n {\n name: \"position\",\n type: '\"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\"',\n default: '\"top-right\"',\n description: \"토스트 표시 위치\",\n },\n {\n name: \"defaultDuration\",\n type: \"number\",\n default: \"5000\",\n description: \"기본 표시 시간 (ms)\",\n },\n ],\n useToast: [\n {\n name: \"returns\",\n type: \"{ toasts, addToast, removeToast }\",\n description: \"토스트 상태 및 제어 함수\",\n },\n ],\n toast: [\n {\n name: \"toast.success / error / info / warning\",\n type: \"(message: string, options?) => string\",\n description:\n \"훅 없이 어디서든 호출하는 프로그램매틱 API. toast.dismiss(id) / toast.clear()도 제공\",\n },\n ],\n NotificationToast: [\n {\n name: \"toast\",\n type: \"ToastMessage\",\n required: true,\n description: \"토스트 메시지 객체\",\n },\n {\n name: \"onDismiss\",\n type: \"() => void\",\n required: true,\n description: \"닫기 핸들러\",\n },\n ],\n },\n testDescribe: \"ToastProvider\",\n};\n\nexport const designGuidePanelMeta: ComponentMeta = {\n name: \"DesignGuidePanel\",\n category: \"devtools\",\n description:\n \"디자인 시스템 참조 패널. 프리미티브 맵, 키보드 패턴, Tailwind 셀렉터, 접근성 속성 등 6개 섹션 제공.\",\n slug: \"design-guide-panel\",\n sourceFile: \"devtools/design-guide-panel\",\n exports: [\"DesignGuidePanel\"],\n props: {\n DesignGuidePanel: [\n {\n name: \"className\",\n type: \"string\",\n description: \"추가 CSS 클래스\",\n },\n ],\n },\n testDescribe: \"DesignGuidePanel\",\n};\n\nexport const taskListMeta: ComponentMeta = {\n name: \"TaskList\",\n category: \"shell\",\n description:\n \"작업 목록 관리 컴포넌트. 우선순위, 상태, 담당자, 태그, 하위 작업 지원.\",\n slug: \"task-list\",\n exports: [\"TaskList\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"작업 간 이동\" },\n { keys: \"Enter\", action: \"작업 선택\" },\n { keys: \"Space\", action: \"완료 토글\" },\n ],\n props: {\n TaskList: [\n {\n name: \"tasks\",\n type: \"TaskDef[]\",\n required: true,\n description:\n \"작업 배열. { id, title, status, priority, assignee?, ... }\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"작업 목록\"',\n description: \"섹션 제목\",\n },\n {\n name: \"onTaskClick\",\n type: \"(task: TaskDef) => void\",\n description: \"작업 클릭 핸들러\",\n },\n {\n name: \"onTaskStatusChange\",\n type: \"(task: TaskDef, completed: boolean) => void\",\n description: \"완료 상태 변경 핸들러\",\n },\n {\n name: \"showSubtasks\",\n type: \"boolean\",\n default: \"false\",\n description: \"하위 작업 표시 여부\",\n },\n ],\n },\n dependencies: [\n { slug: \"avatar\", category: \"core\" },\n { slug: \"checkbox\", category: \"core\" },\n ],\n testDescribe: \"TaskList\",\n};\n\nexport const activityFeedMeta: ComponentMeta = {\n name: \"ActivityFeed\",\n category: \"shell\",\n description: \"활동 피드/로그 컴포넌트. 타임라인 스타일, 상대 시간 표시.\",\n slug: \"activity-feed\",\n exports: [\"ActivityFeed\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"활동 간 이동\" },\n { keys: \"Enter\", action: \"활동 선택\" },\n ],\n props: {\n ActivityFeed: [\n {\n name: \"activities\",\n type: \"ActivityDef[]\",\n required: true,\n description: \"활동 배열. { id, type, title, actor, timestamp, ... }\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"활동 피드\"',\n description: \"섹션 제목\",\n },\n { name: \"maxItems\", type: \"number\", description: \"최대 표시 개수\" },\n {\n name: \"onActivityClick\",\n type: \"(activity: ActivityDef) => void\",\n description: \"활동 클릭 핸들러\",\n },\n {\n name: \"layout\",\n type: '\"list\" | \"compact\"',\n default: '\"list\"',\n description: \"시간 표시 레이아웃 모드\",\n },\n {\n name: \"renderActions\",\n type: \"(activity: ActivityDef) => ReactNode\",\n description: \"각 활동 항목 우측 액션 슬롯 렌더 함수\",\n },\n ],\n },\n dependencies: [{ slug: \"avatar\", category: \"core\" }],\n testDescribe: \"ActivityFeed\",\n};\n\nexport const filterBarMeta: ComponentMeta = {\n name: \"FilterBar\",\n category: \"shell\",\n description: \"필터링 바 컴포넌트. 검색, 선택, 다중 선택 필터 지원.\",\n slug: \"filter-bar\",\n exports: [\"FilterBar\"],\n props: {\n FilterBar: [\n {\n name: \"filters\",\n type: \"FilterGroupDef[]\",\n required: true,\n description: \"필터 그룹 배열. { id, label, type, options?, value? }\",\n },\n {\n name: \"onFilterChange\",\n type: \"(filterId: string, value: string | string[]) => void\",\n description: \"필터 변경 핸들러\",\n },\n {\n name: \"onClearAll\",\n type: \"() => void\",\n description: \"모든 필터 초기화 핸들러\",\n },\n ],\n },\n dependencies: [\n { slug: \"select\", category: \"core\" },\n { slug: \"input\", category: \"core\" },\n { slug: \"button\", category: \"core\" },\n { slug: \"switch\", category: \"core\" },\n { slug: \"checkbox\", category: \"core\" },\n { slug: \"date-range-picker\", category: \"core\" },\n ],\n examples: [\n {\n title: \"필터 바\",\n code: `import { FilterBar } from \"@reopt-ai/opt-ui\";\n\nconst filters = [\n { id: \"status\", label: \"상태\", type: \"select\", options: [\"활성\", \"비활성\"] },\n { id: \"search\", label: \"검색\", type: \"search\" },\n];\n\n<FilterBar\n filters={filters}\n onFilterChange={(id, value) => console.log(id, value)}\n onClearAll={() => console.log(\"clear\")}\n/>`,\n },\n ],\n testDescribe: \"FilterBar\",\n};\n\nexport const quickActionsMeta: ComponentMeta = {\n name: \"QuickActions\",\n category: \"shell\",\n description: \"빠른 작업 패널. 그리드/리스트 레이아웃, 단축키 표시 지원.\",\n slug: \"quick-actions\",\n exports: [\"QuickActions\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓ ← →\", action: \"그리드에서 4방향 탐색\" },\n { keys: \"↑ ↓\", action: \"리스트에서 수직 탐색\" },\n { keys: \"Enter\", action: \"작업 실행\" },\n ],\n props: {\n QuickActions: [\n {\n name: \"actions\",\n type: \"QuickActionDef[]\",\n required: true,\n description:\n \"작업 배열. { id, label, description?, icon?, shortcut?, onClick }\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"빠른 작업\"',\n description: \"섹션 제목\",\n },\n {\n name: \"layout\",\n type: '\"grid\" | \"list\"',\n default: '\"grid\"',\n description: \"레이아웃 모드\",\n },\n {\n name: \"columns\",\n type: \"2 | 3 | 4\",\n default: \"3\",\n description: \"그리드 컬럼 수\",\n },\n ],\n },\n dependencies: [{ slug: \"kbd\", category: \"core\" }],\n testDescribe: \"QuickActions\",\n};\n\nexport const teamMemberListMeta: ComponentMeta = {\n name: \"TeamMemberList\",\n category: \"shell\",\n description:\n \"팀원 목록 컴포넌트. 온라인 상태, 다양한 레이아웃(list, compact, avatars-only) 지원.\",\n slug: \"team-member-list\",\n exports: [\"TeamMemberList\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"팀원 간 이동\" },\n { keys: \"Enter\", action: \"팀원 선택\" },\n ],\n props: {\n TeamMemberList: [\n {\n name: \"members\",\n type: \"TeamMemberDef[]\",\n required: true,\n description: \"팀원 배열. { id, name, email, avatar?, role?, status? }\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"팀원\"',\n description: \"섹션 제목\",\n },\n {\n name: \"layout\",\n type: '\"list\" | \"compact\" | \"avatars-only\"',\n default: '\"list\"',\n description: \"레이아웃 모드\",\n },\n { name: \"maxDisplay\", type: \"number\", description: \"최대 표시 인원\" },\n {\n name: \"onMemberClick\",\n type: \"(member: TeamMemberDef) => void\",\n description: \"팀원 클릭 핸들러\",\n },\n ],\n },\n dependencies: [{ slug: \"avatar\", category: \"core\" }],\n testDescribe: \"TeamMemberList\",\n};\n\nexport const formLoginMeta: ComponentMeta = {\n name: \"AuthForm\",\n category: \"shell\",\n description:\n \"로그인/회원가입 모드 전환 가능한 인증 폼. 이메일·비밀번호 검증, FormSwitch로 로그인 상태 유지 옵션 지원.\",\n slug: \"form-login\",\n sourceFile: \"auth-form\",\n exports: [\"AuthForm\"],\n props: {\n AuthForm: [\n {\n name: \"defaultMode\",\n type: '\"login\" | \"signup\"',\n default: '\"login\"',\n description: \"초기 모드 (비제어)\",\n },\n {\n name: \"mode\",\n type: '\"login\" | \"signup\"',\n description: \"제어 모드: 현재 모드\",\n },\n {\n name: \"onModeChange\",\n type: '(mode: \"login\" | \"signup\") => void',\n description: \"모드 변경 핸들러\",\n },\n {\n name: \"showRememberMe\",\n type: \"boolean\",\n default: \"true\",\n description: \"로그인 모드에서 '로그인 상태 유지' 표시 여부\",\n },\n {\n name: \"minPasswordLength\",\n type: \"number\",\n default: \"8\",\n description: \"비밀번호 최소 길이\",\n },\n {\n name: \"onSubmit\",\n type: \"(values: { email, password, confirmPassword?, rememberMe?, mode }) => void\",\n description: \"제출 핸들러\",\n },\n {\n name: \"labels\",\n type: \"AuthFormLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [{ slug: \"form\", category: \"core\" }],\n testDescribe: \"AuthForm\",\n};\n\nexport const formWizardMeta: ComponentMeta = {\n name: \"WizardForm\",\n category: \"shell\",\n description:\n \"다단계 순차 입력 폼. FormFieldDef 기반 필드 정의, 단계별 검증, 현재 단계가 연결된 진행 표시기, 리뷰 단계를 지원합니다.\",\n slug: \"form-wizard\",\n sourceFile: \"wizard-form\",\n exports: [\"WizardForm\"],\n props: {\n WizardForm: [\n {\n name: \"fields\",\n type: \"FormFieldDef[]\",\n required: true,\n description: \"폼 필드 정의 배열\",\n },\n {\n name: \"steps\",\n type: \"WizardStepDef[]\",\n required: true,\n description: \"단계 정의. { id, label, fields: string[] }\",\n },\n {\n name: \"showReview\",\n type: \"boolean\",\n default: \"true\",\n description: \"마지막 리뷰 단계 표시 여부\",\n },\n {\n name: \"onSubmit\",\n type: \"(values: Record<string, unknown>) => void\",\n description: \"제출 핸들러\",\n },\n {\n name: \"onStepChange\",\n type: \"(stepIndex: number) => void\",\n description: \"단계 변경 핸들러\",\n },\n {\n name: \"labels\",\n type: \"WizardFormLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [\n { slug: \"form\", category: \"core\" },\n { slug: \"checkbox\", category: \"core\" },\n { slug: \"radio-group\", category: \"core\" },\n ],\n testDescribe: \"WizardForm\",\n};\n\nexport const formDynamicMeta: ComponentMeta = {\n name: \"DynamicFieldForm\",\n category: \"shell\",\n description:\n \"런타임 필드 추가/제거 폼. 최소/최대 필드 수 제약, 개별 검증, 동적 스토어 업데이트 지원.\",\n slug: \"form-dynamic\",\n sourceFile: \"dynamic-field-form\",\n exports: [\"DynamicFieldForm\"],\n props: {\n DynamicFieldForm: [\n {\n name: \"initialCount\",\n type: \"number\",\n default: \"1\",\n description: \"초기 필드 수\",\n },\n {\n name: \"minFields\",\n type: \"number\",\n default: \"1\",\n description: \"최소 필드 수\",\n },\n {\n name: \"maxFields\",\n type: \"number\",\n description: \"최대 필드 수\",\n },\n {\n name: \"fieldType\",\n type: '\"text\" | \"email\" | \"url\" | \"number\"',\n default: '\"text\"',\n description: \"필드 입력 타입\",\n },\n {\n name: \"validateField\",\n type: \"(value: string, index: number) => string | undefined\",\n description: \"커스텀 필드 검증 함수\",\n },\n {\n name: \"onSubmit\",\n type: \"(values: string[]) => void\",\n description: \"제출 핸들러\",\n },\n {\n name: \"labels\",\n type: \"DynamicFieldFormLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [{ slug: \"form\", category: \"core\" }],\n testDescribe: \"DynamicFieldForm\",\n};\n\nexport const formUploadMeta: ComponentMeta = {\n name: \"FileUploadForm\",\n category: \"shell\",\n description:\n \"파일 선택, 메타데이터 표시, 이미지 미리보기를 포함한 업로드 폼. 파일 크기 제한, 설명 입력 지원.\",\n slug: \"form-upload\",\n sourceFile: \"file-upload-form\",\n exports: [\"FileUploadForm\"],\n props: {\n FileUploadForm: [\n {\n name: \"accept\",\n type: \"string\",\n default: '\"image/*,.pdf,.doc,.docx\"',\n description: \"허용 파일 타입\",\n },\n {\n name: \"showPreview\",\n type: \"boolean\",\n default: \"true\",\n description: \"이미지 미리보기 표시\",\n },\n {\n name: \"showFileInfo\",\n type: \"boolean\",\n default: \"true\",\n description: \"파일 정보 표시\",\n },\n {\n name: \"showDescription\",\n type: \"boolean\",\n default: \"true\",\n description: \"설명 텍스트영역 표시\",\n },\n {\n name: \"maxFileSize\",\n type: \"number\",\n description: \"최대 파일 크기 (bytes)\",\n },\n {\n name: \"onSubmit\",\n type: \"(values: { title, description, file }) => void\",\n description: \"제출 핸들러\",\n },\n {\n name: \"labels\",\n type: \"FileUploadFormLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n {\n name: \"onPreview\",\n type: \"(file: File) => void\",\n description: \"파일 선택 후 프리뷰 콜백\",\n },\n {\n name: \"columnMapping\",\n type: \"ReactNode\",\n description: \"CSV 컬럼 매핑 UI 슬롯 (파일 선택 후 표시)\",\n },\n ],\n },\n dependencies: [{ slug: \"form\", category: \"core\" }],\n testDescribe: \"FileUploadForm\",\n};\n\nexport const eventIconMeta: ComponentMeta = {\n name: \"EventIcon\",\n category: \"shell\",\n description:\n \"이벤트 아이콘. semantic key 또는 ReactNode 아이콘과 배경색을 표시합니다.\",\n slug: \"event-icon\",\n exports: [\"EventIcon\", \"POPULAR_ICONS\", \"COLOR_PRESETS\"],\n props: {\n EventIcon: [\n {\n name: \"icon\",\n type: \"string | React.ReactNode\",\n required: true,\n description:\n \"semantic icon key, legacy key, 또는 React 노드 (Lucide 등)\",\n },\n {\n name: \"color\",\n type: \"string\",\n default: \"theme accent\",\n description:\n \"사용자 지정 아이콘 색상. 없으면 theme accent 토큰을 사용하고, 전달하면 전경색과 tint 배경에 적용됩니다.\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"아이콘 크기 (sm=20px, md=28px, lg=36px)\",\n },\n ],\n },\n ariaRole: \"img\",\n testDescribe: \"EventIcon\",\n};\n\nexport const connectionIndicatorMeta: ComponentMeta = {\n name: \"ConnectionIndicator\",\n category: \"shell\",\n description:\n \"연결 상태 표시기. connected, connecting, disconnected, error 상태를 지원합니다.\",\n slug: \"connection-indicator\",\n exports: [\"ConnectionIndicator\"],\n props: {\n ConnectionIndicator: [\n {\n name: \"status\",\n type: '\"connected\" | \"connecting\" | \"disconnected\" | \"error\"',\n description: \"연결 상태 프리셋. tone과 pulse의 기본값을 정함\",\n },\n {\n name: \"tone\",\n type: '\"neutral\" | \"success\" | \"warning\" | \"danger\" | \"info\"',\n description:\n \"status로 표현되지 않는 도메인 상태의 색을 직접 지정 (status보다 우선)\",\n },\n { name: \"label\", type: \"string\", description: \"상태 문구\" },\n { name: \"showLabel\", type: \"boolean\", description: \"문구 표시 여부\" },\n {\n name: \"pulse\",\n type: \"boolean\",\n description: \"점 애니메이션. 생략하면 status 프리셋을 따름\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n ariaRole: \"status\",\n testDescribe: \"ConnectionIndicator\",\n};\n\nexport const floatingActionBarMeta: ComponentMeta = {\n name: \"FloatingActionBar\",\n category: \"shell\",\n description:\n \"플로팅 액션 바. 선택된 항목에 대한 일괄 작업 버튼을 하단에 표시합니다.\",\n slug: \"floating-action-bar\",\n exports: [\"FloatingActionBar\"],\n props: {},\n ariaRole: \"toolbar\",\n dependencies: [{ slug: \"button\", category: \"core\" }],\n testDescribe: \"FloatingActionBar\",\n};\n\nexport const templatePickerMeta: ComponentMeta = {\n name: \"TemplatePicker\",\n category: \"shell\",\n description:\n \"템플릿 선택기. 카테고리별 그리드와 검색을 제공하며 featured/tags 표시를 지원합니다.\",\n slug: \"template-picker\",\n exports: [\"TemplatePicker\"],\n props: {\n TemplatePicker: [\n {\n name: \"templates\",\n type: \"TemplateDef[]\",\n required: true,\n description:\n \"템플릿 배열. { id, name, description?, icon?, category?, featured?, tags? }\",\n },\n {\n name: \"selected\",\n type: \"string\",\n description: \"현재 선택된 템플릿 ID\",\n },\n {\n name: \"onSelect\",\n type: \"(templateId: string) => void\",\n required: true,\n description: \"템플릿 선택 핸들러\",\n },\n {\n name: \"showSearch\",\n type: \"boolean\",\n default: \"false\",\n description: \"검색 입력 표시 여부\",\n },\n ],\n },\n testDescribe: \"TemplatePicker\",\n};\n\nexport const failureListMeta: ComponentMeta = {\n name: \"FailureList\",\n category: \"shell\",\n description:\n \"실패 목록 패널. severity별 색상 강조, 그룹핑, 액션 슬롯을 지원합니다.\",\n slug: \"failure-list\",\n exports: [\"FailureList\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"실패 항목 간 이동\" },\n { keys: \"Enter\", action: \"실패 항목 선택\" },\n ],\n props: {\n FailureList: [\n {\n name: \"failures\",\n type: \"FailureItem[]\",\n required: true,\n description:\n \"실패 항목 배열. { id, title, message?, severity, timestamp, group? }\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"최근 실패\"',\n description: \"섹션 제목\",\n },\n { name: \"maxItems\", type: \"number\", description: \"최대 표시 개수\" },\n {\n name: \"grouped\",\n type: \"boolean\",\n default: \"false\",\n description: \"group 필드 기준으로 그룹핑 표시\",\n },\n {\n name: \"onFailureClick\",\n type: \"(failure: FailureItem) => void\",\n description: \"실패 항목 클릭 핸들러\",\n },\n {\n name: \"renderActions\",\n type: \"(failure: FailureItem) => ReactNode\",\n description: \"각 항목 우측 액션 슬롯 렌더 함수\",\n },\n ],\n },\n dependencies: [{ slug: \"badge\", category: \"core\" }],\n testDescribe: \"FailureList\",\n};\n\nexport const keyValueEditorMeta: ComponentMeta = {\n name: \"KeyValueEditor\",\n category: \"shell\",\n description:\n \"키-값 쌍 편집기. 동적 행 추가/삭제, 비밀값 토글, 유효성 검사를 지원합니다.\",\n slug: \"key-value-editor\",\n exports: [\"KeyValueEditor\"],\n keyboardShortcuts: [{ keys: \"Tab\", action: \"키/값 필드 간 이동\" }],\n props: {\n KeyValueEditor: [\n {\n name: \"value\",\n type: \"KeyValueEntry[]\",\n description: \"현재 엔트리 (controlled 모드)\",\n },\n {\n name: \"defaultValue\",\n type: \"KeyValueEntry[]\",\n description: \"초기 엔트리 (uncontrolled 모드)\",\n },\n {\n name: \"onChange\",\n type: \"(entries: KeyValueEntry[]) => void\",\n description: \"엔트리 변경 핸들러\",\n },\n {\n name: \"showSecretToggle\",\n type: \"boolean\",\n default: \"false\",\n description: \"비밀값 표시/숨김 토글 버튼 활성화\",\n },\n {\n name: \"maxEntries\",\n type: \"number\",\n description: \"최대 항목 수 제한\",\n },\n {\n name: \"readOnly\",\n type: \"boolean\",\n default: \"false\",\n description: \"읽기 전용 모드\",\n },\n {\n name: \"labels\",\n type: \"KeyValueEditorLabels\",\n description: \"i18n 라벨 오버라이드\",\n },\n {\n name: \"renderActions\",\n type: \"(entry: KeyValueEntry, index: number) => ReactNode\",\n description: \"항목별 커스텀 액션 슬롯\",\n },\n {\n name: \"validateKey\",\n type: \"(key: string, entries: KeyValueEntry[]) => string | undefined\",\n description: \"키 유효성 검사 함수\",\n },\n ],\n },\n testDescribe: \"KeyValueEditor\",\n};\n\nexport const workflowCanvasMeta: ComponentMeta = {\n name: \"WorkflowCanvas\",\n category: \"shell\",\n description:\n \"워크플로우 캔버스. 그리드 셀 기반 스텝 배치, SVG 연결선, 키보드 이동을 지원합니다.\",\n slug: \"workflow-canvas\",\n exports: [\"WorkflowCanvas\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓ ← →\", action: \"선택 스텝 이동 (onStepMove 제공 시)\" },\n { keys: \"Enter\", action: \"스텝 선택\" },\n ],\n props: {\n WorkflowCanvas: [\n {\n name: \"steps\",\n type: \"WorkflowCanvasStep[]\",\n required: true,\n description: \"스텝 배열. { id, title, row, col, status? }\",\n },\n {\n name: \"connections\",\n type: \"WorkflowCanvasConnection[]\",\n default: \"[]\",\n description: \"연결선 배열. { from, to, label? }\",\n },\n {\n name: \"onStepMove\",\n type: \"(stepId: string, row: number, col: number) => void\",\n description: \"화살표 키 이동 핸들러\",\n },\n {\n name: \"onSelectStep\",\n type: \"(step: WorkflowCanvasStep) => void\",\n description: \"스텝 선택 핸들러\",\n },\n ],\n },\n dependencies: [{ slug: \"badge\", category: \"core\" }],\n testDescribe: \"WorkflowCanvas\",\n};\n\nexport const codeSnippetViewerMeta: ComponentMeta = {\n name: \"CodeSnippetViewer\",\n category: \"shell\",\n description:\n \"코드 스니펫 뷰어. 줄 번호, 복사 버튼, 포커스 가능한 스크롤 영역, syntaxTheme 톤을 지원합니다.\",\n slug: \"code-snippet-viewer\",\n exports: [\"CodeSnippetViewer\"],\n props: {\n CodeSnippetViewer: [\n {\n name: \"code\",\n type: \"string\",\n required: true,\n description: \"표시할 코드 문자열\",\n },\n {\n name: \"language\",\n type: \"string\",\n default: '\"text\"',\n description: \"코드 언어 라벨\",\n },\n { name: \"title\", type: \"string\", description: \"헤더에 표시할 제목\" },\n {\n name: \"showLineNumbers\",\n type: \"boolean\",\n default: \"true\",\n description: \"줄 번호 표시 여부\",\n },\n {\n name: \"showCopyButton\",\n type: \"boolean\",\n default: \"true\",\n description: \"복사 버튼 표시 여부\",\n },\n {\n name: \"maxHeight\",\n type: \"number\",\n default: \"400\",\n description: \"스크롤 영역의 최대 높이(px)\",\n },\n {\n name: \"syntaxTheme\",\n type: '\"default\" | \"muted\" | \"dark\" | \"terminal\"',\n default: '\"default\"',\n description: \"코드 블록 색상 톤\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n {\n name: \"labels\",\n type: \"CodeSnippetViewerLabels\",\n description: \"복사 버튼과 코드 영역 레이블 문구\",\n },\n ],\n },\n testDescribe: \"CodeSnippetViewer\",\n};\n\nexport const propertyExplorerMeta: ComponentMeta = {\n name: \"PropertyExplorer\",\n category: \"shell\",\n description: \"프로퍼티 탐색기. 검색 가능한 속성 목록을 그룹별로 표시합니다.\",\n slug: \"property-explorer\",\n exports: [\"PropertyExplorer\"],\n props: {},\n dependencies: [{ slug: \"input\", category: \"core\" }],\n testDescribe: \"PropertyExplorer\",\n};\n\nexport const queryResultsTableMeta: ComponentMeta = {\n name: \"QueryResultsTable\",\n category: \"shell\",\n description:\n \"쿼리 결과 테이블. SQL 결과와 스크린 리더에 안내되는 로딩, 에러, 빈 상태를 지원합니다.\",\n slug: \"query-results-table\",\n exports: [\"QueryResultsTable\"],\n props: {\n QueryResultsTable: [\n {\n name: \"columns\",\n type: \"string[]\",\n required: true,\n description: \"컬럼 이름\",\n },\n {\n name: \"rows\",\n type: \"Array<Record<string, unknown>>\",\n required: true,\n description: \"결과 행\",\n },\n { name: \"loading\", type: \"boolean\", description: \"polite 로딩 상태\" },\n { name: \"error\", type: \"string\", description: \"assertive 오류 상태\" },\n {\n name: \"labels\",\n type: \"QueryResultsTableLabels\",\n description: \"로딩/빈 상태/행 수 문구\",\n },\n ],\n },\n testDescribe: \"QueryResultsTable\",\n};\n\nexport const alertBuilderMeta: ComponentMeta = {\n name: \"AlertBuilder\",\n category: \"shell\",\n description:\n \"알림 빌더. 명시적으로 연결된 폼 레이블로 메트릭 조건, 빈도, 채널을 구성합니다.\",\n slug: \"alert-builder\",\n exports: [\"AlertBuilder\"],\n props: {},\n dependencies: [\n { slug: \"button\", category: \"core\" },\n { slug: \"input\", category: \"core\" },\n ],\n testDescribe: \"AlertBuilder\",\n};\n\nexport const sqlEditorMeta: ComponentMeta = {\n name: \"SqlEditor\",\n category: \"shell\",\n description:\n \"SQL 에디터. CodeMirror 기반의 SQL 편집기로 구문 강조와 자동 완성을 지원합니다.\",\n slug: \"sql-editor\",\n exports: [\"SqlEditor\"],\n props: {\n SqlEditor: [\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"편집 중인 SQL\",\n },\n {\n name: \"onChange\",\n type: \"(sql: string) => void\",\n required: true,\n description: \"본문 변경 핸들러\",\n },\n {\n name: \"onRun\",\n type: \"(sql: string) => void\",\n description: \"Mod+Enter 실행 핸들러\",\n },\n {\n name: \"onRunAndAdvance\",\n type: \"(sql: string) => void\",\n description: \"Shift+Enter — 실행 후 다음 셀/탭으로 이동\",\n },\n {\n name: \"schema\",\n type: \"SqlEditorSchema\",\n description:\n \"테이블/컬럼 자동완성 스키마. 변경 시 에디터를 다시 만들지 않고 자동완성만 재구성\",\n },\n {\n name: \"completionSources\",\n type: \"SqlEditorCompletionSource[]\",\n description: \"스키마 자동완성에 더할 완성 소스 (함수 시그니처, 스니펫)\",\n },\n {\n name: \"keymap\",\n type: \"SqlEditorKeyBinding[]\",\n description: \"추가 키 바인딩. 내장 실행 바인딩보다 먼저 평가\",\n },\n {\n name: \"extensions\",\n type: \"SqlEditorExtension[]\",\n description:\n \"임의의 CodeMirror 확장. 내장 확장 뒤에 붙어 우선권을 가짐\",\n },\n {\n name: \"height\",\n type: 'number | \"fill\"',\n description: \"px 고정 높이. fill이면 부모가 정한 높이를 채움\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n description: \"빈 편집기 안내 문구\",\n },\n { name: \"readOnly\", type: \"boolean\", description: \"편집 잠금\" },\n {\n name: \"ariaLabel\",\n type: \"string\",\n description: \"편집 영역 접근성 레이블\",\n },\n { name: \"autoFocus\", type: \"boolean\", description: \"마운트 시 포커스\" },\n {\n name: \"showFooter\",\n type: \"boolean\",\n description: \"실행 힌트/버튼 표시. 기본값은 onRun이 있을 때 표시\",\n },\n {\n name: \"labels\",\n type: \"SqlEditorLabels\",\n description: \"문구 오버라이드\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n dependencies: [{ slug: \"button\", category: \"core\" }],\n testDescribe: \"SqlEditor\",\n};\n\nexport const eventMetaEditorMeta: ComponentMeta = {\n name: \"EventMetaEditor\",\n category: \"shell\",\n description:\n \"이벤트 메타 에디터. 레이블이 연결된 IconPicker + ColorPicker + TagInput 조합으로 이벤트 메타데이터를 편집합니다.\",\n slug: \"event-meta-editor\",\n exports: [\"EventMetaEditor\"],\n props: {},\n dependencies: [\n { slug: \"input\", category: \"core\" },\n { slug: \"icon-picker\", category: \"core\" },\n { slug: \"color-picker\", category: \"core\" },\n { slug: \"tag-input\", category: \"core\" },\n ],\n testDescribe: \"EventMetaEditor\",\n};\n\nexport const widgetGridMeta: ComponentMeta = {\n name: \"WidgetGrid\",\n category: \"shell\",\n description:\n \"위젯 그리드. react-grid-layout 래퍼로 드래그/리사이즈 가능한 대시보드 위젯을 배치합니다.\",\n slug: \"widget-grid\",\n exports: [\"WidgetGrid\"],\n props: {},\n testDescribe: \"WidgetGrid\",\n};\n\nexport const reportBuilderMeta: ComponentMeta = {\n name: \"ReportBuilder\",\n category: \"shell\",\n description:\n \"리포트 빌더. 레이블이 연결된 4단계 위저드 (차트 타입 → 데이터 설정 → 스타일 → 미리보기).\",\n slug: \"report-builder\",\n exports: [\"ReportBuilder\"],\n props: {\n ReportBuilder: [\n {\n name: \"chartTypes\",\n type: \"ChartTypeDef[]\",\n description: \"차트 타입 그리드 (기본 9종 제공)\",\n },\n {\n name: \"dataSources\",\n type: \"DataSourceDef[]\",\n description: \"데이터 소스 드롭다운 옵션\",\n },\n {\n name: \"configForm\",\n type: \"ReactNode\",\n description: \"차트별 데이터 설정 폼 슬롯 (step 2)\",\n },\n {\n name: \"styleForm\",\n type: \"ReactNode\",\n description: \"차트별 스타일 설정 폼 슬롯 (step 3)\",\n },\n {\n name: \"preview\",\n type: \"ReactNode\",\n description: \"차트 미리보기 슬롯 (step 4)\",\n },\n {\n name: \"onSave\",\n type: \"(report: { name, description, chartType, dataSourceId }) => void\",\n description: \"저장 콜백\",\n },\n {\n name: \"onCancel\",\n type: \"() => void\",\n description: \"취소 콜백\",\n },\n {\n name: \"labels\",\n type: \"ReportBuilderLabels\",\n description: \"UI 텍스트 커스터마이징\",\n },\n ],\n },\n dependencies: [\n { slug: \"button\", category: \"core\" },\n { slug: \"input\", category: \"core\" },\n ],\n testDescribe: \"ReportBuilder\",\n};\n\nexport const segmentBuilderMeta: ComponentMeta = {\n name: \"SegmentBuilder\",\n category: \"shell\",\n description:\n \"세그먼트 빌더. 각 조건 컨트롤의 접근 가능한 이름을 유지하며 event, property, cohort, custom 세그먼트를 정의합니다.\",\n slug: \"segment-builder\",\n exports: [\"SegmentBuilder\"],\n props: {},\n dependencies: [\n { slug: \"button\", category: \"core\" },\n { slug: \"input\", category: \"core\" },\n ],\n testDescribe: \"SegmentBuilder\",\n};\n\nexport const insightsPanelMeta: ComponentMeta = {\n name: \"InsightsPanel\",\n category: \"shell\",\n description:\n \"이상 탐지 인사이트 패널. severity별 카드, 통계 필터, dismiss 기능, 검출 설정(유형/Z-score/days).\",\n slug: \"insights-panel\",\n exports: [\"InsightsPanel\"],\n props: {\n InsightsPanel: [\n {\n name: \"insights\",\n type: \"InsightItem[]\",\n required: true,\n description: \"인사이트 항목 배열\",\n },\n {\n name: \"stats\",\n type: \"InsightsStat[]\",\n description: \"통계 필터 카드 배열 (클릭 가능)\",\n },\n {\n name: \"detectionTypes\",\n type: \"DetectionTypeDef[]\",\n description: \"검출 유형 토글 배열 (volume_anomaly, new_event 등)\",\n },\n {\n name: \"detectionConfig\",\n type: \"DetectionConfig\",\n description: \"검출 파라미터 (days, zScoreThreshold)\",\n },\n {\n name: \"onDetectionConfigChange\",\n type: \"(config: DetectionConfig) => void\",\n description: \"검출 파라미터 변경 핸들러\",\n },\n {\n name: \"onDismiss\",\n type: \"(id: string) => void\",\n description: \"인사이트 dismiss 핸들러\",\n },\n ],\n },\n dependencies: [\n { slug: \"button\", category: \"core\" },\n { slug: \"stat-card\", category: \"core\" },\n { slug: \"badge\", category: \"core\" },\n ],\n testDescribe: \"InsightsPanel\",\n};\n\nexport const timeRangeSelectorMeta: ComponentMeta = {\n name: \"TimeRangeSelector\",\n category: \"shell\",\n description:\n \"시간 범위 선택기. Popover + DateRangePicker + 프리셋 버튼 조합. 12개 시계열 Surface에서 사용.\",\n slug: \"time-range-selector\",\n exports: [\"TimeRangeSelector\"],\n props: {\n TimeRangeSelector: [\n {\n name: \"value\",\n type: \"DateRange\",\n description: \"현재 선택된 날짜 범위\",\n },\n {\n name: \"onChange\",\n type: \"(range: DateRange) => void\",\n description: \"범위 변경 핸들러\",\n },\n {\n name: \"presets\",\n type: \"TimePresetDef[]\",\n description: \"빠른 프리셋 목록 (Today, Last 7d 등)\",\n },\n {\n name: \"labels\",\n type: \"TimeRangeSelectorLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [\n { slug: \"button\", category: \"core\" },\n { slug: \"popover\", category: \"core\" },\n { slug: \"date-range-picker\", category: \"core\" },\n ],\n testDescribe: \"TimeRangeSelector\",\n};\n\nexport const exportButtonMeta: ComponentMeta = {\n name: \"ExportButton\",\n category: \"shell\",\n description:\n \"데이터 내보내기 버튼. CSV/JSON 변환 내장, PDF는 콜백 위임. DropdownMenu 기반.\",\n slug: \"export-button\",\n exports: [\"ExportButton\"],\n props: {\n ExportButton: [\n {\n name: \"data\",\n type: \"Record<string, unknown>[]\",\n required: true,\n description: \"내보낼 데이터 배열\",\n },\n {\n name: \"columns\",\n type: \"ExportColumn[]\",\n description: \"컬럼 매핑 (key → header)\",\n },\n {\n name: \"fileName\",\n type: \"string\",\n default: '\"export\"',\n description: \"파일 이름\",\n },\n {\n name: \"formats\",\n type: \"ExportFormat[]\",\n default: '[\"csv\", \"json\"]',\n description: \"지원 포맷\",\n },\n {\n name: \"onExport\",\n type: \"(format: ExportFormat) => void\",\n description: \"커스텀 내보내기 핸들러\",\n },\n ],\n },\n dependencies: [\n { slug: \"dropdown-menu\", category: \"core\" },\n { slug: \"button\", category: \"core\" },\n ],\n testDescribe: \"ExportButton\",\n};\n\n// LoadingOverlay moved to core/_meta.ts (C01 layer violation fix)\n\nexport const summaryRowMeta: ComponentMeta = {\n name: \"SummaryRow\",\n category: \"shell\",\n description:\n \"통계 요약 행. StatCard 그리드 레이아웃을 표준화합니다. loading 시 SkeletonCard 표시.\",\n slug: \"summary-row\",\n exports: [\"SummaryRow\"],\n props: {\n SummaryRow: [\n {\n name: \"stats\",\n type: \"StatCardType[]\",\n required: true,\n description: \"통계 카드 배열\",\n },\n {\n name: \"columns\",\n type: \"2 | 3 | 4\",\n default: \"4\",\n description: \"컬럼 수\",\n },\n {\n name: \"onStatClick\",\n type: \"(stat: StatCardType) => void\",\n description: \"카드 클릭 핸들러\",\n },\n {\n name: \"formatValue\",\n type: \"(stat: StatCardType) => string\",\n description: \"값 표시 커스텀 포맷 함수\",\n },\n {\n name: \"durationFractionDigits\",\n type: \"number\",\n default: \"1\",\n description: \"duration 포맷 시 소수점 자리수\",\n },\n {\n name: \"percentageFractionDigits\",\n type: \"number\",\n default: \"1\",\n description: \"percentage 포맷 시 소수점 자리수\",\n },\n {\n name: \"loading\",\n type: \"boolean\",\n default: \"false\",\n description: \"로딩 시 스켈레톤 표시\",\n },\n ],\n },\n dependencies: [\n { slug: \"stat-card\", category: \"core\" },\n { slug: \"skeleton\", category: \"core\" },\n ],\n testDescribe: \"SummaryRow\",\n};\n\nexport const comparisonSelectorMeta: ComponentMeta = {\n name: \"ComparisonSelector\",\n category: \"shell\",\n description:\n \"비교 선택기. 고유 레이블이 연결된 Select × 2 + Swap 버튼 조합. CohortComparison, FunnelAnalysis 등에서 사용합니다.\",\n slug: \"comparison-selector\",\n exports: [\"ComparisonSelector\"],\n props: {\n ComparisonSelector: [\n {\n name: \"segments\",\n type: \"ComparisonOption[]\",\n required: true,\n description: \"선택 가능한 세그먼트 목록\",\n },\n {\n name: \"valueA\",\n type: \"string\",\n description: \"Base 선택값\",\n },\n {\n name: \"valueB\",\n type: \"string\",\n description: \"Compare 선택값\",\n },\n {\n name: \"onChangeA\",\n type: \"(value: string) => void\",\n description: \"Base 변경 핸들러\",\n },\n {\n name: \"onChangeB\",\n type: \"(value: string) => void\",\n description: \"Compare 변경 핸들러\",\n },\n {\n name: \"labels\",\n type: \"ComparisonSelectorLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [\n { slug: \"select\", category: \"core\" },\n { slug: \"button\", category: \"core\" },\n ],\n testDescribe: \"ComparisonSelector\",\n};\n\nexport const themeSwitcherMeta: ComponentMeta = {\n name: \"ThemeSwitcher\",\n category: \"shell\",\n description: \"테마 프리셋 선택기. 프리셋과 light/dark/system 모드 전환.\",\n slug: \"theme-switcher\",\n exports: [\"ThemeSwitcher\"],\n props: {\n ThemeSwitcher: [\n {\n name: \"labels\",\n type: \"ThemeSwitcherLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n ],\n },\n testDescribe: \"ThemeSwitcher\",\n};\n\nexport const promptTemplateMeta: ComponentMeta = {\n name: \"PromptTemplate\",\n category: \"shell\",\n description: \"AI 프롬프트 뷰어/헬퍼. 변수 입력 → 실시간 치환 → 복사 기능.\",\n slug: \"prompt-template\",\n exports: [\"PromptTemplate\"],\n props: {\n PromptTemplate: [\n {\n name: \"title\",\n type: \"string\",\n required: true,\n description: \"프롬프트 제목\",\n },\n {\n name: \"description\",\n type: \"string\",\n description: \"프롬프트 설명 (헤더 아래 표시)\",\n },\n {\n name: \"template\",\n type: \"string\",\n required: true,\n description: \"프롬프트 템플릿. {변수명}으로 치환 가능\",\n },\n {\n name: \"variables\",\n type: \"PromptVariable[]\",\n description:\n \"변수 정의 배열. { name, label, placeholder?, defaultValue? }\",\n },\n {\n name: \"labels\",\n type: \"PromptTemplateLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [{ slug: \"input\", category: \"core\" }],\n testDescribe: \"PromptTemplate\",\n};\n\nexport const sidebarMeta: ComponentMeta = {\n name: \"Sidebar\",\n category: \"shell\",\n description:\n \"접기/펼치기를 지원하는 compound 사이드바. Header/Content/Footer 구조 + Group/Item으로 네비게이션 구성. Ctrl+[ 단축키.\",\n slug: \"sidebar\",\n exports: [\"Sidebar\", \"useSidebar\"],\n keyboardShortcuts: [\n { keys: \"Ctrl+[\", action: \"사이드바 접기/펼치기 토글\" },\n { keys: \"↑ ↓\", action: \"사이드바 항목 간 이동\" },\n { keys: \"Home / End\", action: \"첫 번째/마지막 사이드바 항목으로 이동\" },\n ],\n props: {\n Sidebar: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description:\n \"Sidebar.Header, Sidebar.Content, Sidebar.Footer 자식 요소\",\n },\n {\n name: \"collapsible\",\n type: \"boolean\",\n default: \"false\",\n description: \"접기/펼치기 토글 지원\",\n },\n {\n name: \"defaultCollapsed\",\n type: \"boolean\",\n default: \"false\",\n description: \"초기 접힘 상태\",\n },\n {\n name: \"collapsed\",\n type: \"boolean\",\n description: \"제어 모드: 접힘 상태\",\n },\n {\n name: \"onCollapsedChange\",\n type: \"(collapsed: boolean) => void\",\n description: \"제어 모드: 접힘 상태 변경 핸들러\",\n },\n {\n name: \"width\",\n type: \"number\",\n default: \"280\",\n description: \"펼침 상태 너비 (px)\",\n },\n {\n name: \"collapsedWidth\",\n type: \"number\",\n default: \"56\",\n description: \"접힘 상태 너비 (px)\",\n },\n {\n name: \"side\",\n type: '\"left\" | \"right\"',\n default: '\"left\"',\n description: \"사이드바 위치\",\n },\n {\n name: \"label\",\n type: \"string\",\n default: '\"사이드바\"',\n description: \"aside aria-label\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n \"Sidebar.Group\": [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"Sidebar.Item 요소들\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"그룹 레이블 (접힌 상태에서 숨겨짐)\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n \"Sidebar.Item\": [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"항목 레이블 텍스트\",\n },\n {\n name: \"icon\",\n type: \"ReactNode\",\n description: \"아이콘 (접힌 상태에서도 표시)\",\n },\n {\n name: \"active\",\n type: \"boolean\",\n default: \"false\",\n description: \"활성 상태 (aria-current=page)\",\n },\n {\n name: \"onClick\",\n type: \"() => void\",\n description: \"클릭 핸들러\",\n },\n {\n name: \"href\",\n type: \"string\",\n description: \"링크 URL — 설정 시 <a> 태그로 렌더링\",\n },\n {\n name: \"tooltip\",\n type: \"string\",\n description: \"접힌 상태에서 Tooltip 표시 (미지정 시 children 텍스트)\",\n },\n {\n name: \"badge\",\n type: \"ReactNode\",\n description:\n \"우측 배지 (숫자/텍스트). 접힌 상태에서 아이콘 위 dot으로 축소\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [{ slug: \"sidebar-nav\", category: \"shells\" }],\n testDescribe: \"Sidebar\",\n};\n\nexport const appShellMeta: ComponentMeta = {\n name: \"AppShell\",\n category: \"shell\",\n description:\n \"Header + Sidebar + Content + Footer 4영역 페이지 레이아웃 템플릿. AppShell.Sidebar는 모든 viewport에서 기본 표시되며 반응형 숨김/Drawer 전환은 소비자가 제어합니다.\",\n slug: \"app-shell\",\n exports: [\"AppShell\"],\n props: {\n AppShell: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description:\n \"AppShell.Header, AppShell.Sidebar, AppShell.Content, AppShell.Footer 자식 요소\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [\n { slug: \"sidebar\", category: \"shells\" },\n { slug: \"page-header\", category: \"core\" },\n ],\n testDescribe: \"AppShell\",\n examples: [\n {\n title: \"앱 레이아웃\",\n code: `import { AppShell } from \"@reopt-ai/opt-ui\";\n\n<AppShell>\n <AppShell.Header>헤더 영역</AppShell.Header>\n <AppShell.Sidebar>사이드바 영역</AppShell.Sidebar>\n <AppShell.Content>메인 콘텐츠</AppShell.Content>\n</AppShell>`,\n },\n ],\n};\n\nexport const confirmDialogMeta: ComponentMeta = {\n name: \"ConfirmDialog\",\n category: \"shell\",\n description:\n \"확인/취소 대화 상자. danger 변형으로 위험 작업 확인을 지원합니다.\",\n slug: \"confirm-dialog\",\n exports: [\"ConfirmDialog\"],\n props: {\n ConfirmDialog: [\n {\n name: \"open\",\n type: \"boolean\",\n required: true,\n description: \"열림 상태\",\n },\n {\n name: \"onConfirm\",\n type: \"() => void\",\n required: true,\n description: \"확인 콜백\",\n },\n {\n name: \"onCancel\",\n type: \"() => void\",\n required: true,\n description: \"취소 콜백\",\n },\n {\n name: \"title\",\n type: \"string\",\n required: true,\n description: \"대화 상자 제목\",\n },\n { name: \"description\", type: \"string\", description: \"설명 텍스트\" },\n {\n name: \"confirmLabel\",\n type: \"string\",\n default: '\"Confirm\"',\n description: \"확인 버튼 텍스트\",\n },\n {\n name: \"cancelLabel\",\n type: \"string\",\n default: '\"Cancel\"',\n description: \"취소 버튼 텍스트\",\n },\n {\n name: \"variant\",\n type: '\"default\" | \"danger\"',\n default: '\"default\"',\n description: \"변형\",\n },\n ],\n },\n dependencies: [{ slug: \"dialog\", category: \"core\" }],\n testDescribe: \"ConfirmDialog\",\n};\n\nexport const asyncComboboxMeta: ComponentMeta = {\n name: \"AsyncCombobox\",\n category: \"shell\",\n description:\n \"비동기 검색 콤보박스. 디바운스 + 로딩 스피너와 stale response 방어를 내장합니다.\",\n slug: \"async-combobox\",\n exports: [\"AsyncCombobox\"],\n props: {\n AsyncCombobox: [\n {\n name: \"onSearch\",\n type: \"(q: string) => Promise<string[]>\",\n required: true,\n description: \"검색 콜백\",\n },\n {\n name: \"debounceMs\",\n type: \"number\",\n default: \"300\",\n description: \"디바운스 ms\",\n },\n {\n name: \"minChars\",\n type: \"number\",\n default: \"1\",\n description: \"최소 검색 글자 수\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n default: '\"Search…\"',\n description: \"플레이스홀더\",\n },\n {\n name: \"onSelect\",\n type: \"(value: string) => void\",\n description: \"선택 콜백\",\n },\n {\n name: \"labels\",\n type: \"AsyncComboboxLabels\",\n description: \"input/loading/noResults/placeholder 문구\",\n },\n {\n name: \"loadingText\",\n type: \"string\",\n description: \"로딩 문구. labels.loading 사용 권장\",\n },\n ],\n },\n dependencies: [\n { slug: \"combobox\", category: \"core\" },\n { slug: \"spinner\", category: \"core\" },\n ],\n testDescribe: \"AsyncCombobox\",\n};\n\nexport const verticalTabsMeta: ComponentMeta = {\n name: \"VerticalTabs\",\n category: \"shell\",\n description: \"세로 탭 레이아웃. 좌측 탭 리스트 + 우측 패널 구성입니다.\",\n slug: \"vertical-tabs\",\n exports: [\"VerticalTabs\"],\n props: {\n VerticalTabs: [\n {\n name: \"tabs\",\n type: \"TabDef[]\",\n required: true,\n description: \"탭 정의 배열\",\n },\n { name: \"defaultTabId\", type: \"string\", description: \"기본 선택 탭 ID\" },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [{ slug: \"tabs\", category: \"core\" }],\n testDescribe: \"VerticalTabs\",\n};\n\nexport const columnTogglerMeta: ComponentMeta = {\n name: \"ColumnToggler\",\n category: \"shell\",\n description: \"테이블 컬럼 표시/숨김 토글러. Popover + Checkbox 리스트입니다.\",\n slug: \"column-toggler\",\n exports: [\"ColumnToggler\"],\n props: {\n ColumnToggler: [\n {\n name: \"columns\",\n type: \"ColumnTogglerColumn[]\",\n required: true,\n description: \"전체 컬럼 목록\",\n },\n {\n name: \"visibleColumns\",\n type: \"string[]\",\n required: true,\n description: \"표시 중인 컬럼 ID 배열\",\n },\n {\n name: \"onChange\",\n type: \"(visibleColumns: string[]) => void\",\n required: true,\n description: \"변경 콜백\",\n },\n ],\n },\n dependencies: [\n { slug: \"popover\", category: \"core\" },\n { slug: \"checkbox\", category: \"core\" },\n ],\n testDescribe: \"ColumnToggler\",\n};\n\nexport const bulkActionsMeta: ComponentMeta = {\n name: \"BulkActions\",\n category: \"shell\",\n description:\n \"일괄 작업 바. 선택 카운트 배지 + DropdownMenu 액션 목록 + 해제 버튼.\",\n slug: \"bulk-actions\",\n exports: [\"BulkActions\"],\n props: {\n BulkActions: [\n {\n name: \"selectedCount\",\n type: \"number\",\n required: true,\n description: \"선택된 항목 수\",\n },\n {\n name: \"actions\",\n type: \"BulkActionDef[]\",\n required: true,\n description: '액션 목록. { id, label, variant?: \"danger\" }',\n },\n {\n name: \"onAction\",\n type: \"(actionId: string) => void\",\n required: true,\n description: \"액션 실행 콜백\",\n },\n {\n name: \"onClear\",\n type: \"() => void\",\n required: true,\n description: \"선택 해제 콜백\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [\n { slug: \"dropdown-menu\", category: \"core\" },\n { slug: \"badge\", category: \"core\" },\n ],\n testDescribe: \"BulkActions\",\n};\n\nexport const savedFiltersMeta: ComponentMeta = {\n name: \"SavedFilters\",\n category: \"shell\",\n description:\n \"필터 프리셋 관리. 키보드 목록 탐색, 현재 필터 저장, 안전한 삭제 확인 흐름을 제공하는 Popover UI.\",\n slug: \"saved-filters\",\n exports: [\"SavedFilters\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"저장된 프리셋 간 이동\" },\n { keys: \"Home / End\", action: \"첫 번째/마지막 프리셋으로 이동\" },\n { keys: \"Enter\", action: \"프리셋 불러오기 또는 새 프리셋 저장\" },\n { keys: \"Escape\", action: \"삭제 확인 취소 후 삭제 버튼으로 포커스 복귀\" },\n ],\n props: {\n SavedFilters: [\n {\n name: \"currentFilters\",\n type: \"Record<string, unknown>\",\n required: true,\n description: \"현재 적용 중인 필터\",\n },\n {\n name: \"presets\",\n type: \"FilterPreset[]\",\n required: true,\n description: \"저장된 프리셋 목록\",\n },\n {\n name: \"onSavePreset\",\n type: \"(name: string, filters: Record<string, unknown>) => void\",\n required: true,\n description: \"프리셋 저장 콜백\",\n },\n {\n name: \"onLoadPreset\",\n type: \"(preset: FilterPreset) => void\",\n required: true,\n description: \"프리셋 불러오기 콜백\",\n },\n {\n name: \"onDeletePreset\",\n type: \"(presetId: string) => void\",\n required: true,\n description: \"프리셋 삭제 콜백\",\n },\n {\n name: \"labels\",\n type: \"SavedFiltersLabels\",\n description: \"트리거, 빈 상태, 저장 및 삭제 확인 문구 오버라이드\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n SavedFiltersLabels: [\n {\n name: \"triggerLabel\",\n type: \"(count: number) => string\",\n description: \"저장된 프리셋 수를 포함한 트리거 레이블\",\n },\n {\n name: \"emptyMessage\",\n type: \"string\",\n default: '\"No saved filters\"',\n description: \"프리셋이 없을 때 표시할 메시지\",\n },\n {\n name: \"deleteLabel\",\n type: \"(name: string) => string\",\n description: \"프리셋 삭제 버튼의 접근 가능한 이름\",\n },\n {\n name: \"namePlaceholder\",\n type: \"string\",\n default: '\"Filter name…\"',\n description: \"새 프리셋 이름 입력 안내\",\n },\n {\n name: \"saveLabel\",\n type: \"string\",\n default: '\"Save\"',\n description: \"새 프리셋 저장 버튼 레이블\",\n },\n {\n name: \"confirmDeleteLabel\",\n type: \"string\",\n default: '\"Confirm\"',\n description: \"삭제 확인 버튼 레이블\",\n },\n {\n name: \"cancelDeleteLabel\",\n type: \"string\",\n default: '\"Cancel\"',\n description: \"삭제 취소 버튼 레이블\",\n },\n ],\n },\n dependencies: [\n { slug: \"popover\", category: \"core\" },\n { slug: \"input\", category: \"core\" },\n { slug: \"button\", category: \"core\" },\n ],\n testDescribe: \"SavedFilters\",\n};\n\nexport const notificationCenterMeta: ComponentMeta = {\n name: \"NotificationCenter\",\n category: \"shell\",\n description: \"알림 센터. 벨 아이콘 트리거 + 미읽음 배지 + 스크롤 알림 목록.\",\n slug: \"notification-center\",\n exports: [\"NotificationCenter\"],\n props: {\n NotificationCenter: [\n {\n name: \"notifications\",\n type: \"NotificationItem[]\",\n required: true,\n description: \"알림 목록\",\n },\n {\n name: \"onMarkRead\",\n type: \"(id: string) => void\",\n required: true,\n description: \"읽음 처리 콜백\",\n },\n {\n name: \"onMarkAllRead\",\n type: \"() => void\",\n required: true,\n description: \"전체 읽음 처리 콜백\",\n },\n {\n name: \"onAction\",\n type: \"(id: string) => void\",\n description: \"알림 액션 콜백\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [\n { slug: \"popover\", category: \"core\" },\n { slug: \"badge\", category: \"core\" },\n { slug: \"scroll-area\", category: \"core\" },\n ],\n testDescribe: \"NotificationCenter\",\n};\n\nexport const auditLogMeta: ComponentMeta = {\n name: \"AuditLog\",\n category: \"shell\",\n description:\n \"감사 로그 타임라인. 아바타 + 액션 텍스트 + 메타데이터 배지 레이아웃.\",\n slug: \"audit-log\",\n exports: [\"AuditLog\"],\n props: {\n AuditLog: [\n {\n name: \"entries\",\n type: \"AuditEntry[]\",\n required: true,\n description: \"감사 로그 항목 배열\",\n },\n {\n name: \"onLoadMore\",\n type: \"() => void\",\n description: \"더 보기 콜백\",\n },\n {\n name: \"loading\",\n type: \"boolean\",\n default: \"false\",\n description: \"로딩 상태\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [\n { slug: \"avatar\", category: \"core\" },\n { slug: \"badge\", category: \"core\" },\n ],\n testDescribe: \"AuditLog\",\n};\n\nexport const auditTimelineMeta: ComponentMeta = {\n name: \"AuditTimeline\",\n category: \"shell\",\n description: \"변경 이력 타임라인. 액션별 색상 코딩 + 확장 가능한 diff 뷰.\",\n slug: \"audit-timeline\",\n exports: [\"AuditTimeline\"],\n props: {\n AuditTimeline: [\n {\n name: \"entries\",\n type: \"AuditEntry[]\",\n required: true,\n description: \"변경 이력 항목 배열\",\n },\n {\n name: \"labels\",\n type: \"AuditTimelineLabels\",\n description: \"UI 텍스트 커스터마이징\",\n },\n {\n name: \"onEntryClick\",\n type: \"(entry: AuditEntry) => void\",\n description: \"항목 클릭 콜백\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [\n { slug: \"badge\", category: \"core\" },\n { slug: \"button\", category: \"core\" },\n { slug: \"empty-state\", category: \"core\" },\n ],\n testDescribe: \"AuditTimeline\",\n};\n\nexport const treeTableMeta: ComponentMeta = {\n name: \"TreeTable\",\n category: \"shell\",\n description: \"계층형 트리 테이블. 재귀 행 렌더링 + 펼침/접기 셰브론.\",\n slug: \"tree-table\",\n exports: [\"TreeTable\"],\n props: {\n TreeTable: [\n {\n name: \"data\",\n type: \"TreeNode<T>[]\",\n required: true,\n description: \"트리 노드 배열\",\n },\n {\n name: \"columns\",\n type: \"TreeColumnDef<T>[]\",\n required: true,\n description: \"컬럼 정의\",\n },\n {\n name: \"defaultExpanded\",\n type: \"string[]\",\n default: \"[]\",\n description: \"기본 펼침 노드 ID\",\n },\n {\n name: \"indentSize\",\n type: \"number\",\n default: \"24\",\n description: \"들여쓰기 크기 (px)\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [{ slug: \"data-table\", category: \"shells\" }],\n testDescribe: \"TreeTable\",\n};\n\nexport const inlineEditTableMeta: ComponentMeta = {\n name: \"InlineEditTable\",\n category: \"shell\",\n description:\n \"인라인 편집 테이블. 더블클릭으로 셀 편집, Enter 확정, Escape 취소.\",\n slug: \"inline-edit-table\",\n exports: [\"InlineEditTable\"],\n props: {\n InlineEditTable: [\n {\n name: \"data\",\n type: \"T[]\",\n required: true,\n description: \"행 데이터 배열\",\n },\n {\n name: \"columns\",\n type: \"InlineEditColumnDef<T>[]\",\n required: true,\n description: \"컬럼 정의 (editable 플래그 포함)\",\n },\n {\n name: \"keyExtractor\",\n type: \"(row: T) => string\",\n required: true,\n description: \"행 키 추출기\",\n },\n {\n name: \"onCellEdit\",\n type: \"(rowId: string, columnId: string, value: string) => void\",\n description: \"셀 편집 확정 콜백\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [{ slug: \"data-table\", category: \"shells\" }],\n testDescribe: \"InlineEditTable\",\n};\n\nexport const kanbanBoardMeta: ComponentMeta = {\n name: \"KanbanBoard\",\n category: \"shell\",\n description: \"칸반 보드. HTML5 DnD로 카드를 컬럼 간 드래그&드롭.\",\n slug: \"kanban-board\",\n exports: [\"KanbanBoard\"],\n props: {\n KanbanBoard: [\n {\n name: \"columns\",\n type: \"KanbanColumn<T>[]\",\n required: true,\n description: \"컬럼 목록 (각 컬럼에 items 배열)\",\n },\n {\n name: \"onDragEnd\",\n type: \"(itemId, fromCol, toCol, toIndex) => void\",\n required: true,\n description: \"드래그 완료 콜백\",\n },\n {\n name: \"renderCard\",\n type: \"(item: T) => ReactNode\",\n required: true,\n description: \"카드 렌더링 함수\",\n },\n {\n name: \"keyExtractor\",\n type: \"(item: T) => string\",\n required: true,\n description: \"항목 키 추출기\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [{ slug: \"scroll-area\", category: \"core\" }],\n testDescribe: \"KanbanBoard\",\n};\n\nexport const richTextEditorMeta: ComponentMeta = {\n name: \"RichTextEditor\",\n category: \"shell\",\n description: \"마크다운 리치 텍스트 에디터. 서식 툴바 + textarea 조합.\",\n slug: \"rich-text-editor\",\n exports: [\"RichTextEditor\"],\n props: {\n RichTextEditor: [\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"텍스트 값\",\n },\n {\n name: \"onChange\",\n type: \"(value: string) => void\",\n required: true,\n description: \"변경 콜백\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n default: '\"Write something…\"',\n description: \"플레이스홀더\",\n },\n {\n name: \"toolbar\",\n type: \"ToolbarAction[]\",\n default: '[\"bold\",\"italic\",\"code\",\"link\",\"heading\",\"list\",\"quote\"]',\n description: \"툴바 액션 목록\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [],\n testDescribe: \"RichTextEditor\",\n};\n\nexport const codeDiffViewerMeta: ComponentMeta = {\n name: \"CodeDiffViewer\",\n category: \"shell\",\n description:\n \"코드 비교 뷰어. LCS 알고리즘 기반 unified/split 모드 diff와 포커스 가능한 스크롤 영역을 제공합니다.\",\n slug: \"code-diff-viewer\",\n exports: [\"CodeDiffViewer\"],\n props: {\n CodeDiffViewer: [\n {\n name: \"original\",\n type: \"string\",\n required: true,\n description: \"원본 코드\",\n },\n {\n name: \"modified\",\n type: \"string\",\n required: true,\n description: \"수정된 코드\",\n },\n {\n name: \"mode\",\n type: '\"split\" | \"unified\"',\n default: '\"unified\"',\n description: \"뷰 모드\",\n },\n {\n name: \"showLineNumbers\",\n type: \"boolean\",\n default: \"true\",\n description: \"줄 번호 표시\",\n },\n {\n name: \"scrollLabel\",\n type: \"string\",\n description: \"스크롤 가능한 diff 영역의 접근성 레이블\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [],\n testDescribe: \"CodeDiffViewer\",\n};\n\nexport const webhookConfigMeta: ComponentMeta = {\n name: \"WebhookConfig\",\n category: \"shell\",\n description:\n \"웹훅 설정 패널. URL 입력 + 이벤트 체크박스 + 재시도 설정 + 테스트 버튼.\",\n slug: \"webhook-config\",\n exports: [\"WebhookConfig\"],\n props: {\n WebhookConfig: [\n {\n name: \"webhook\",\n type: \"WebhookDef\",\n required: true,\n description: \"웹훅 설정 객체\",\n },\n {\n name: \"onChange\",\n type: \"(webhook: WebhookDef) => void\",\n required: true,\n description: \"변경 콜백\",\n },\n {\n name: \"availableEvents\",\n type: \"string[]\",\n required: true,\n description: \"선택 가능한 이벤트 목록\",\n },\n { name: \"onTest\", type: \"() => void\", description: \"테스트 버튼 콜백\" },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [\n { slug: \"input\", category: \"core\" },\n { slug: \"checkbox\", category: \"core\" },\n { slug: \"number-input\", category: \"core\" },\n { slug: \"button\", category: \"core\" },\n ],\n testDescribe: \"WebhookConfig\",\n};\n\nexport const featureFlagPanelMeta: ComponentMeta = {\n name: \"FeatureFlagPanel\",\n category: \"shell\",\n description:\n \"피처 플래그 관리 패널. 플래그 토글 + 환경 배지 + 롤아웃 % 조절.\",\n slug: \"feature-flag-panel\",\n exports: [\"FeatureFlagPanel\"],\n props: {\n FeatureFlagPanel: [\n {\n name: \"flags\",\n type: \"FeatureFlag[]\",\n required: true,\n description: \"피처 플래그 목록\",\n },\n {\n name: \"onToggle\",\n type: \"(flagId: string, enabled: boolean) => void\",\n required: true,\n description: \"토글 콜백\",\n },\n {\n name: \"onRolloutChange\",\n type: \"(flagId: string, percentage: number) => void\",\n description: \"롤아웃 % 변경 콜백\",\n },\n {\n name: \"environments\",\n type: \"string[]\",\n required: true,\n description: \"전체 환경 목록\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [\n { slug: \"switch\", category: \"core\" },\n { slug: \"badge\", category: \"core\" },\n { slug: \"number-input\", category: \"core\" },\n ],\n testDescribe: \"FeatureFlagPanel\",\n};\n\nexport const dataImportWizardMeta: ComponentMeta = {\n name: \"DataImportWizard\",\n category: \"shell\",\n description:\n \"데이터 임포트 마법사. 4단계: 업로드 → 컬럼 매핑 → 미리보기 → 확인.\",\n slug: \"data-import-wizard\",\n exports: [\"DataImportWizard\"],\n props: {\n DataImportWizard: [\n {\n name: \"fields\",\n type: \"ImportFieldDef[]\",\n required: true,\n description: \"매핑 대상 필드 목록\",\n },\n {\n name: \"onImport\",\n type: \"(mapping, data) => void\",\n required: true,\n description: \"임포트 확정 콜백\",\n },\n {\n name: \"acceptedFormats\",\n type: \"string\",\n default: '\".csv\"',\n description: \"허용 파일 형식\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [{ slug: \"button\", category: \"core\" }],\n testDescribe: \"DataImportWizard\",\n};\n\nexport const megaMenuMeta: ComponentMeta = {\n name: \"MegaMenu\",\n category: \"shell\",\n description:\n \"메가 메뉴. Popover + CSS grid 멀티컬럼 + 카테고리 헤딩 + footer 슬롯.\",\n slug: \"mega-menu\",\n exports: [\"MegaMenu\"],\n props: {\n MegaMenu: [\n {\n name: \"menus\",\n type: \"MegaMenuSection[]\",\n required: true,\n description: \"메뉴 섹션 배열\",\n },\n {\n name: \"columns\",\n type: \"number\",\n default: \"3\",\n description: \"그리드 컬럼 수\",\n },\n { name: \"footer\", type: \"ReactNode\", description: \"하단 footer 슬롯\" },\n {\n name: \"triggerLabel\",\n type: \"string\",\n default: '\"Menu\"',\n description: \"트리거 버튼 텍스트\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [{ slug: \"popover\", category: \"core\" }],\n testDescribe: \"MegaMenu\",\n};\n\nexport const chatSidebarMeta: ComponentMeta = {\n name: \"ChatSidebar\",\n category: \"shell\",\n description: \"AI 채팅 사이드바. 대화 목록, 검색, 새 대화 버튼.\",\n slug: \"chat-sidebar\",\n exports: [\"ChatSidebar\"],\n props: {\n ChatSidebar: [\n {\n name: \"conversations\",\n type: \"ChatConversationDef[]\",\n required: true,\n description:\n \"대화 목록 배열. { id, title, lastMessage?, timestamp, unread? }\",\n },\n {\n name: \"activeConversationId\",\n type: \"string\",\n description: \"현재 활성 대화 ID\",\n },\n {\n name: \"onConversationSelect\",\n type: \"(conversation: ChatConversationDef) => void\",\n description: \"대화 선택 핸들러\",\n },\n {\n name: \"onNewChat\",\n type: \"() => void\",\n description: \"새 대화 생성 핸들러\",\n },\n {\n name: \"onSearch\",\n type: \"(query: string) => void\",\n description: \"검색 핸들러\",\n },\n {\n name: \"labels\",\n type: \"ChatSidebarLabels\",\n description: \"i18n 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [\n { slug: \"button\", category: \"core\" },\n { slug: \"input\", category: \"core\" },\n { slug: \"scroll-area\", category: \"core\" },\n { slug: \"empty-state\", category: \"core\" },\n ],\n testDescribe: \"ChatSidebar\",\n};\n\nexport const chatInputMeta: ComponentMeta = {\n name: \"ChatInput\",\n category: \"shell\",\n description:\n \"채팅 입력 컴포넌트. 자동 리사이즈 textarea, 파일 첨부, 모델/스타일 Select.\",\n slug: \"chat-input\",\n exports: [\"ChatInput\"],\n keyboardShortcuts: [\n { keys: \"Enter\", action: \"메시지 전송\" },\n { keys: \"Shift + Enter\", action: \"줄바꿈\" },\n ],\n props: {\n ChatInput: [\n {\n name: \"value\",\n type: \"string\",\n description: \"제어 모드: 입력 값\",\n },\n {\n name: \"onSend\",\n type: \"(message: string) => void\",\n description: \"메시지 전송 핸들러\",\n },\n {\n name: \"onFileAttach\",\n type: \"() => void\",\n description: \"파일 첨부 클릭 핸들러\",\n },\n {\n name: \"models\",\n type: \"ChatModelDef[]\",\n description: \"모델 선택 옵션\",\n },\n {\n name: \"stylePresets\",\n type: \"ChatStylePresetDef[]\",\n description: \"스타일 프리셋 옵션\",\n },\n {\n name: \"maxRows\",\n type: \"number\",\n default: \"6\",\n description: \"textarea 최대 행 수\",\n },\n {\n name: \"showHint\",\n type: \"boolean\",\n default: \"true\",\n description: \"Shift+Enter 힌트 표시 여부\",\n },\n {\n name: \"labels\",\n type: \"ChatInputLabels\",\n description: \"i18n 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [\n { slug: \"button\", category: \"core\" },\n { slug: \"kbd\", category: \"core\" },\n { slug: \"select\", category: \"core\" },\n ],\n testDescribe: \"ChatInput\",\n examples: [\n {\n title: \"채팅 입력\",\n code: `import { ChatInput } from \"@reopt-ai/opt-ui\";\n\n<ChatInput\n placeholder=\"메시지를 입력하세요...\"\n onSend={(message) => console.log(message)}\n/>`,\n },\n ],\n};\n\nexport const chatMessageListMeta: ComponentMeta = {\n name: \"ChatMessageList\",\n category: \"shell\",\n description:\n \"채팅 메시지 목록. 역할별 말풍선, 타이핑 인디케이터, 자동 스크롤.\",\n slug: \"chat-message-list\",\n exports: [\"ChatMessageList\"],\n props: {\n ChatMessageList: [\n {\n name: \"messages\",\n type: \"ChatMessageDef[]\",\n required: true,\n description: \"메시지 배열. { id, role, content, timestamp }\",\n },\n {\n name: \"loading\",\n type: \"boolean\",\n default: \"false\",\n description: \"타이핑 인디케이터 표시\",\n },\n {\n name: \"renderContent\",\n type: \"(message: ChatMessageDef) => ReactNode\",\n description: \"커스텀 메시지 렌더러. 기본: plain text\",\n },\n {\n name: \"assistantAvatar\",\n type: \"string\",\n description: \"어시스턴트 아바타 이미지 URL\",\n },\n {\n name: \"showTimestamps\",\n type: \"boolean\",\n default: \"true\",\n description: \"타임스탬프 표시 여부\",\n },\n {\n name: \"autoScroll\",\n type: \"boolean\",\n default: \"true\",\n description: \"새 메시지 시 자동 스크롤\",\n },\n {\n name: \"labels\",\n type: \"ChatMessageListLabels\",\n description: \"i18n 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [\n { slug: \"scroll-area\", category: \"core\" },\n { slug: \"avatar\", category: \"core\" },\n { slug: \"empty-state\", category: \"core\" },\n ],\n testDescribe: \"ChatMessageList\",\n examples: [\n {\n title: \"메시지 목록\",\n code: `import { ChatMessageList } from \"@reopt-ai/opt-ui\";\n\nconst messages = [\n { id: \"1\", role: \"user\", content: \"안녕하세요!\", timestamp: new Date() },\n { id: \"2\", role: \"assistant\", content: \"반갑습니다.\", timestamp: new Date() },\n];\n\n<ChatMessageList messages={messages} loading={false} />`,\n },\n ],\n};\n\nexport const pageAsideMeta: ComponentMeta = {\n name: \"PageAside\",\n category: \"shell\",\n description:\n \"Sticky 페이지 사이드 aside chrome. 고정 너비 + header/body/footer 3-slot.\",\n slug: \"page-aside\",\n exports: [\"PageAside\"],\n props: {\n PageAside: [\n {\n name: \"header\",\n type: \"ReactNode\",\n description: \"상단 고정 슬롯 (예: package switcher).\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"스크롤 가능한 네비게이션 영역.\",\n },\n {\n name: \"footer\",\n type: \"ReactNode\",\n description: \"하단 고정 슬롯 (예: version label).\",\n },\n {\n name: \"widthClassName\",\n type: \"string\",\n description: \"너비 Tailwind 클래스. 기본값 `w-60`.\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"`<aside>`의 aria-label.\",\n },\n {\n name: \"hideOnMobile\",\n type: \"boolean\",\n description: \"md 아래에서 숨김. 기본값 true.\",\n },\n ],\n },\n testDescribe: \"PageAside\",\n};\n\nexport const timeRangeControlMeta: ComponentMeta = {\n name: \"TimeRangeControl\",\n category: \"shell\",\n description:\n \"date math(now-7d, now/d) 기반 시간 범위 컨트롤. quick select, 프리셋/최근 사용, 명시적 Update, 자동 갱신, 창 이동·확대/축소 버튼을 제공합니다.\",\n slug: \"time-range-control\",\n exports: [\"TimeRangeControl\", \"DEFAULT_TIME_PRESETS\"],\n props: {\n TimeRangeControl: [\n {\n name: \"value\",\n type: \"TimeRange\",\n required: true,\n description: \"{ from, to } — date math 문자열 또는 ISO\",\n },\n {\n name: \"onChange\",\n type: \"(range: TimeRange) => void\",\n required: true,\n description: \"범위가 커밋되었을 때 호출\",\n },\n {\n name: \"presets\",\n type: \"TimeRangePreset[]\",\n description: \"자주 쓰는 범위 목록\",\n },\n {\n name: \"recentRanges\",\n type: \"TimeRangePreset[]\",\n description: \"최근 사용한 범위 (호출자 소유)\",\n },\n {\n name: \"timeZone\",\n type: \"string\",\n description: \"라운딩·표시에 쓸 IANA 타임존\",\n },\n {\n name: \"showUpdateButton\",\n type: \"boolean\",\n default: \"true\",\n description: \"편집을 명시적으로 커밋\",\n },\n {\n name: \"showWindowButtons\",\n type: \"boolean\",\n default: \"true\",\n description: \"이전/다음 창, 확대/축소 버튼\",\n },\n {\n name: \"refresh\",\n type: \"RefreshSetting\",\n description: \"{ interval, paused } 자동 갱신 설정\",\n },\n {\n name: \"onRefresh\",\n type: \"() => void | Promise<unknown>\",\n description: \"갱신 요청 — 프라미스가 끝난 뒤 다음 tick\",\n },\n ],\n },\n ariaRole: \"group\",\n testDescribe: \"TimeRangeControl\",\n};\n\nexport const timeSeriesPanelMeta: ComponentMeta = {\n name: \"TimeSeriesPanel\",\n category: \"shell\",\n description:\n \"시간 범위 컨트롤과 시계열 차트를 한 단위로 묶은 패널. 드래그 줌과 줌 히스토리(되돌리기), 범례 토글을 포함합니다.\",\n slug: \"time-series-panel\",\n exports: [\"TimeSeriesPanel\"],\n props: {\n TimeSeriesPanel: [\n {\n name: \"data\",\n type: \"TimeSeriesPoint[]\",\n required: true,\n description: \"시계열 데이터\",\n },\n {\n name: \"series\",\n type: \"TimeSeriesDef[]\",\n required: true,\n description: \"시리즈 정의\",\n },\n {\n name: \"range\",\n type: \"TimeRange\",\n required: true,\n description: \"조회 구간 — 차트 축도 여기에 고정됩니다\",\n },\n {\n name: \"onRangeChange\",\n type: \"(range: TimeRange) => void\",\n required: true,\n description: \"드래그 줌·컨트롤 변경으로 구간이 바뀔 때 호출\",\n },\n {\n name: \"showRangeControl\",\n type: \"boolean\",\n default: \"true\",\n description: \"헤더에 TimeRangeControl 렌더\",\n },\n {\n name: \"toggleableLegend\",\n type: \"boolean\",\n default: \"false\",\n description: \"범례 클릭으로 시리즈 숨김\",\n },\n {\n name: \"annotations\",\n type: \"TimeSeriesAnnotation[]\",\n description: \"시간축 마커/구간\",\n },\n {\n name: \"height\",\n type: \"number\",\n default: \"280\",\n description: \"차트 높이\",\n },\n ],\n },\n ariaRole: \"region\",\n testDescribe: \"TimeSeriesPanel\",\n};\n\nexport const logTableMeta: ComponentMeta = {\n name: \"LogTable\",\n category: \"shell\",\n description:\n \"계속 도착하는 로그용 윈도잉 테이블. 컬럼 정의 기반, 상단 삽입 시 스크롤 위치 보존, follow 상태 보고, 셀 값 즉시 필터, 밀도·정렬을 지원합니다.\",\n slug: \"log-table\",\n exports: [\"LogTable\"],\n props: {\n LogTable: [\n { name: \"rows\", type: \"Row[]\", required: true, description: \"표시할 행\" },\n {\n name: \"columns\",\n type: \"LogColumn<Row>[]\",\n required: true,\n description: \"컬럼 정의 (표시 중인 것만)\",\n },\n {\n name: \"getRowId\",\n type: \"(row: Row) => string\",\n required: true,\n description: \"행 식별자\",\n },\n { name: \"selectedId\", type: \"string | null\", description: \"선택된 행\" },\n {\n name: \"onSelect\",\n type: \"(id: string) => void\",\n description: \"행 선택\",\n },\n {\n name: \"onLoadMore\",\n type: \"() => void\",\n description: \"다음 페이지 요청\",\n },\n {\n name: \"prepending\",\n type: \"boolean\",\n default: \"false\",\n description: \"상단에 행이 삽입되는 라이브 목록\",\n },\n {\n name: \"onFollowChange\",\n type: \"(following: boolean) => void\",\n description: \"최신 행 고정 여부 보고\",\n },\n {\n name: \"isNew\",\n type: \"(row: Row) => boolean\",\n description: \"방금 도착한 행 강조\",\n },\n { name: \"sort\", type: \"LogSort | null\", description: \"정렬 상태\" },\n {\n name: \"onSortChange\",\n type: \"(sort: LogSort) => void\",\n description: \"헤더 클릭 정렬\",\n },\n {\n name: \"onCellAction\",\n type: \"(action: LogCellAction) => void\",\n description: \"셀 값 포함/제외 필터\",\n },\n {\n name: \"density\",\n type: '\"compact\" | \"normal\" | \"comfortable\"',\n default: '\"normal\"',\n description: \"행 높이와 글자 크기\",\n },\n ],\n },\n ariaRole: \"listbox\",\n testDescribe: \"LogTable\",\n};\n\nexport const queryBarMeta: ComponentMeta = {\n name: \"QueryBar\",\n category: \"shell\",\n description:\n \"검색과 필터를 한 입력으로 합친 쿼리 바. field:value, -부정, (a or b), 비교 연산, 필드·값 자동완성, 절(clause) 칩을 지원합니다.\",\n slug: \"query-bar\",\n exports: [\"QueryBar\"],\n props: {\n QueryBar: [\n {\n name: \"value\",\n type: \"Query\",\n required: true,\n description: \"파싱된 쿼리\",\n },\n {\n name: \"onChange\",\n type: \"(query: Query) => void\",\n required: true,\n description: \"커밋 시 호출 (Enter·blur)\",\n },\n {\n name: \"fields\",\n type: \"QueryField[]\",\n description: \"자동완성할 필드와 알려진 값\",\n },\n {\n name: \"showClauses\",\n type: \"boolean\",\n default: \"false\",\n description: \"절을 제거 가능한 칩으로 표시\",\n },\n {\n name: \"live\",\n type: \"boolean\",\n default: \"false\",\n description: \"키 입력마다 커밋\",\n },\n ],\n },\n ariaRole: \"combobox\",\n testDescribe: \"QueryBar\",\n};\n\nexport const fieldSidebarMeta: ComponentMeta = {\n name: \"FieldSidebar\",\n category: \"shell\",\n description:\n \"데이터에 어떤 필드가 있고 각 필드가 무슨 값을 갖는지 보여주는 사이드바. 값 분포 막대, 컬럼으로 승격, 값 기준 포함/제외 필터를 제공합니다.\",\n slug: \"field-sidebar\",\n exports: [\"FieldSidebar\"],\n props: {\n FieldSidebar: [\n {\n name: \"fields\",\n type: \"FieldSummary[]\",\n required: true,\n description: \"필드 목록\",\n },\n {\n name: \"expandedField\",\n type: \"string | null\",\n description: \"값을 펼친 필드\",\n },\n {\n name: \"onExpandedFieldChange\",\n type: \"(field: string | null) => void\",\n description: \"펼침 전환 — 호출자가 값을 조회\",\n },\n {\n name: \"values\",\n type: \"FieldValueCount[]\",\n description: \"펼친 필드의 상위 값\",\n },\n {\n name: \"valuesLoading\",\n type: \"boolean\",\n default: \"false\",\n description: \"값 조회 중\",\n },\n {\n name: \"sampledRows\",\n type: \"number\",\n description: \"집계 대상 행 수 (분모)\",\n },\n {\n name: \"onToggleColumn\",\n type: \"(field: string, next: boolean) => void\",\n description: \"컬럼 추가/제거\",\n },\n {\n name: \"onFilter\",\n type: '(field: string, value: string, intent: \"include\" | \"exclude\") => void',\n description: \"값 기준 필터\",\n },\n ],\n },\n ariaRole: \"complementary\",\n testDescribe: \"FieldSidebar\",\n};\n\nexport const shellMetas = [\n faqAccordionMeta,\n pageAsideMeta,\n contentTabsMeta,\n dashboardGridMeta,\n searchComboboxMeta,\n statusSelectMeta,\n editorToolbarMeta,\n sidebarNavMeta,\n settingsFormMeta,\n appMenubarMeta,\n commandPaletteMeta,\n commandPaletteTriggerMeta,\n deploymentTimelineMeta,\n projectSwitcherMeta,\n envPanelMeta,\n branchSelectMeta,\n domainTableMeta,\n dataTableMeta,\n notificationToastMeta,\n designGuidePanelMeta,\n taskListMeta,\n activityFeedMeta,\n filterBarMeta,\n quickActionsMeta,\n teamMemberListMeta,\n formLoginMeta,\n formWizardMeta,\n formDynamicMeta,\n formUploadMeta,\n eventIconMeta,\n connectionIndicatorMeta,\n floatingActionBarMeta,\n templatePickerMeta,\n failureListMeta,\n keyValueEditorMeta,\n workflowCanvasMeta,\n codeSnippetViewerMeta,\n propertyExplorerMeta,\n queryResultsTableMeta,\n alertBuilderMeta,\n sqlEditorMeta,\n eventMetaEditorMeta,\n widgetGridMeta,\n reportBuilderMeta,\n segmentBuilderMeta,\n insightsPanelMeta,\n timeRangeSelectorMeta,\n exportButtonMeta,\n summaryRowMeta,\n comparisonSelectorMeta,\n themeSwitcherMeta,\n promptTemplateMeta,\n sidebarMeta,\n appShellMeta,\n confirmDialogMeta,\n asyncComboboxMeta,\n verticalTabsMeta,\n columnTogglerMeta,\n treeTableMeta,\n inlineEditTableMeta,\n kanbanBoardMeta,\n richTextEditorMeta,\n codeDiffViewerMeta,\n webhookConfigMeta,\n featureFlagPanelMeta,\n dataImportWizardMeta,\n megaMenuMeta,\n bulkActionsMeta,\n savedFiltersMeta,\n notificationCenterMeta,\n auditLogMeta,\n auditTimelineMeta,\n chatSidebarMeta,\n chatInputMeta,\n chatMessageListMeta,\n timeRangeControlMeta,\n timeSeriesPanelMeta,\n logTableMeta,\n queryBarMeta,\n fieldSidebarMeta,\n];\n"],"mappings":"AAy2HA,MAAa,YAAY;CACvB;EAv2HA,MAAM;EACN,UAAU;EACV,oBAAoB;EACpB,UAAU;EACV,UAAU;GAAC;GAAc;GAAQ;GAAS;GAAc;EAAM;EAC9D,aACE;EACF,MAAM;EACN,SAAS,CAAC,MAAM;EAChB,OAAO,EACL,MAAM;GACJ;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAY,MAAM;IAAW,aAAa;GAAa;GAC/D;IAAE,MAAM;IAAY,MAAM;IAAa,aAAa;GAAU;EAChE,EACF;EACA,OAAO;GACL,eAAe,CACb,+CACF;GACA,OAAO,CAAC,2CAA2C;EACrD;EACA,SAAS;GACP,QAAQ;GACR,OAAO,CAAC,MAAM;GACd,WAAW;IACT;IACA;IACA;IACA;GACF;EACF;EACA,WAAW,CACT;GACE,MAAM;GACN,aAAa;GACb,UAAU;EACZ,CACF;EACA,cAAc;CAkzHd;CACA;EA/yHA,MAAM;EACN,UAAU;EACV,oBAAoB;EACpB,UAAU;EACV,UAAU;GAAC;GAAc;GAAW;GAAW;EAAW;EAC1D,aACE;EACF,MAAM;EACN,SAAS,CAAC,SAAS;EACnB,OAAO,EACL,SAAS;GACP;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAY,MAAM;IAAa,aAAa;GAAS;EAC/D,EACF;EACA,OAAO;GACL,eAAe,CACb,4CACF;GACA,OAAO,CAAC,+BAA+B;EACzC;EACA,SAAS;GACP,QAAQ;GACR,OAAO,CAAC,MAAM;GACd,WAAW;IACT;IACA;IACA;GACF;EACF;EACA,WAAW,CACT;GACE,MAAM;GACN,aAAa;GACb,UAAU;EACZ,CACF;EACA,cAAc;CAiwHd;CACA;EA9vHA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,KAAK;EACf,OAAO,EACL,KAAK;GACH;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;CAouHd;CACA;EAjuHA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,WAAW;EACrB,OAAO,EACL,WAAW;GACT;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAa;EACjE,EACF;EACA,cAAc;CAusHd;CACA;EApsHA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,UAAU;EACpB,OAAO,EACL,UAAU;GACR;IAAE,MAAM;IAAU,MAAM;IAAU,aAAa;GAAc;GAC7D;IAAE,MAAM;IAAS,MAAM;IAAU,aAAa;GAAU;GACxD;IAAE,MAAM;IAAgB,MAAM;IAAU,aAAa;GAAU;GAC/D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAY,MAAM;IAAW,aAAa;GAAO;GACzD;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAS,MAAM;IAAU,aAAa;GAAS;GACvD;IAAE,MAAM;IAAS,MAAM;IAAU,aAAa;GAAS;GACvD;IAAE,MAAM;IAAQ,MAAM;IAAU,aAAa;GAAU;EACzD,EACF;EACA,cAAc;CA0pHd;CACA;EAvpHA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,UAAU,aAAa;EACjC,OAAO;GACL,QAAQ;IACN;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KAAE,MAAM;KAAY,MAAM;KAAW,aAAa;IAAO;IACzD;KAAE,MAAM;KAAY,MAAM;KAAa,aAAa;IAAS;GAC/D;GACA,aAAa;IACX;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KAAE,MAAM;KAAY,MAAM;KAAW,aAAa;IAAa;IAC/D;KAAE,MAAM;KAAY,MAAM;KAAa,aAAa;IAAa;GACnE;EACF;EACA,cAAc;CAqlHd;CACA;EAllHA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;EACF;EACA,OAAO;GACL,eAAe;IACb;KACE,MAAM;KACN,MAAM;KACN,aACE;IACJ;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KAAE,MAAM;KAAY,MAAM;KAAW,aAAa;IAAU;IAC5D;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,eAAe;IACb;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KAAE,MAAM;KAAY,MAAM;KAAW,aAAa;IAAa;IAC/D;KAAE,MAAM;KAAY,MAAM;KAAa,aAAa;IAAoB;GAC1E;GACA,kBAAkB,CAChB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,kBAAkB,CAChB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;EACF;EACA,cAAc;CAogHd;CACA;EAjgHA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,UAAU;EACpB,OAAO,EACL,UAAU;GACR;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IAAE,MAAM;IAAS,MAAM;IAAU,UAAU;IAAM,aAAa;GAAO;GACrE;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAo+Gd;CACA;EAj+GA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,eAAe;EACzB,mBAAmB;GACjB;IAAE,MAAM;IAAW,QAAQ;GAAW;GACtC;IAAE,MAAM;IAAQ,QAAQ;GAAY;GACpC;IAAE,MAAM;IAAO,QAAQ;GAAc;GACrC;IAAE,MAAM;IAAO,QAAQ;GAAY;EACrC;EACA,OAAO,EACL,eAAe;GACb;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAe;EACnE,EACF;EACA,UAAU;EACV,cAAc;CAu7Gd;CACA;EAp7GA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GAAC;GAAkB;GAAqB;EAAmB;EACpE,mBAAmB,CAAC;GAAE,MAAM;GAAiB,QAAQ;EAAW,CAAC;EACjE,OAAO;GACL,gBAAgB;IACd;KAAE,MAAM;KAAQ,MAAM;KAAW,aAAa;IAAe;IAC7D;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;GACA,mBAAmB,CACjB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,mBAAmB,CACjB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;EACF;EACA,cAAc;CAm4Gd;CACA;EAh4GA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS;GAAC;GAAY;GAAW;GAAO;EAAU;EAClD,mBAAmB;GACjB;IAAE,MAAM;IAAO,QAAQ;GAAO;GAC9B;IAAE,MAAM;IAAQ,QAAQ;GAAc;GACtC;IAAE,MAAM;IAAO,QAAQ;GAAa;EACtC;EACA,OAAO;GACL,UAAU;IACR;KACE,MAAM;KACN,MAAM;KACN,aACE;IACJ;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aACE;IACJ;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,KAAK;IACH;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,UAAU;IACR;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;EACF;EACA,UAAU;EACV,cAAc;CAoxGd;CACA;EAjxGA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;EACF;EACA,mBAAmB;GACjB;IAAE,MAAM;IAAO,QAAQ;GAAQ;GAC/B;IAAE,MAAM;IAAiB,QAAQ;GAAQ;GACzC;IAAE,MAAM;IAAO,QAAQ;GAAS;GAChC;IAAE,MAAM;IAAS,QAAQ;GAAe;EAC1C;EACA,OAAO;GACL,YAAY;IACV;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,aAAa,CACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,eAAe,CACb;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,eAAe;IACb;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,YAAY;IACV;KAAE,MAAM;KAAS,MAAM;KAAU,UAAU;KAAM,aAAa;IAAO;IACrE;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;EACF;EACA,UAAU;EACV,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;;;;;EAWR,CACF;CAqpGA;CACA;EAlpGA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,mBAAmB,CACjB;GAAE,MAAM;GAAO,QAAQ;EAAW,GAClC;GAAE,MAAM;GAAO,QAAQ;EAAsB,CAC/C;EACA,OAAO;GACL,YAAY,CACV;IAAE,MAAM;IAAQ,MAAM;IAAW,aAAa;GAAe,GAC7D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,kBAAkB,CAChB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,aAAa;IACX;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,eAAe,CACb;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,mBAAmB,CACjB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,eAAe,CACb;IAAE,MAAM;IAAY,MAAM;IAAa,aAAa;GAAW,CACjE;GACA,cAAc,CACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,YAAY,CACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,cAAc,CACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;EACF;EACA,UAAU;EACV,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;;;;EAUR,CACF;CAkhGA;CACA;EA/gGA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,mBAAmB;GACjB;IAAE,MAAM;IAAO,QAAQ;GAAQ;GAC/B;IAAE,MAAM;IAAS,QAAQ;GAAQ;GACjC;IAAE,MAAM;IAAO,QAAQ;GAAS;EAClC;EACA,uBAAuB;EACvB,4BACE;EACF,OAAO;GACL,cAAc,CACZ;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf,CACF;GACA,eAAe;IACb;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,iBAAiB;IACf;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,cAAc;IACZ;KAAE,MAAM;KAAS,MAAM;KAAU,UAAU;KAAM,aAAa;IAAO;IACrE;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,eAAe,CACb;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,oBAAoB,CAClB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,eAAe,CACb;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;EACF;EACA,UAAU;EACV,cAAc;CA84Fd;CACA;EA34FA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,mBAAmB;GACjB;IAAE,MAAM;IAAO,QAAQ;GAAU;GACjC;IAAE,MAAM;IAAO,QAAQ;GAAW;GAClC;IAAE,MAAM;IAAiB,QAAQ;GAAW;GAC5C;IAAE,MAAM;IAAO,QAAQ;GAAQ;EACjC;EACA,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,OAAO;GACL,aAAa,CAAC;GACd,kBAAkB,CAChB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,UAAU,CAAC;GACX,aAAa,CACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,iBAAiB,CACf;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAc,CAClE;GACA,aAAa;IACX;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,UAAU;IACR;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KAAE,MAAM;KAAW,MAAM;KAAc,aAAa;IAAS;IAC7D;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,kBAAkB;IAChB;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KAAE,MAAM;KAAW,MAAM;KAAW,aAAa;IAAQ;IACzD;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,eAAe;IACb;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KAAE,MAAM;KAAW,MAAM;KAAW,aAAa;IAAQ;IACzD;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,eAAe,CACb;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;EACF;EACA,UAAU;EACV,cAAc;CA4uFd;CACA;EAzuFA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,mBAAmB;GACjB;IAAE,MAAM;IAAO,QAAQ;GAAU;GACjC;IAAE,MAAM;IAAiB,QAAQ;GAAS;GAC1C;IAAE,MAAM;IAAQ,QAAQ;GAAe;GACvC;IAAE,MAAM;IAAO,QAAQ;GAAc;EACvC;EACA,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,OAAO;GACL,aAAa,CACX;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf,CACF;GACA,kBAAkB,CAChB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,eAAe;IACb;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KAAE,MAAM;KAAW,MAAM;KAAc,aAAa;IAAS;IAC7D;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,kBAAkB,CAChB;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,iBAAiB,CAAC;GAClB,eAAe,CACb;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,GACA;IAAE,MAAM;IAAY,MAAM;IAAa,aAAa;GAAQ,CAC9D;GACA,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;EACF;EACA,UAAU;EACV,cAAc;CAkpFd;CACA;EA/oFA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,OAAO;GACL,UAAU;IACR;KACE,MAAM;KACN,MAAM;KACN,aACE;IACJ;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KAAE,MAAM;KAAe,MAAM;KAAU,aAAa;IAAS;IAC7D;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,cAAc;IACZ;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KAAE,MAAM;KAAe,MAAM;KAAU,aAAa;IAAS;IAC7D;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,YAAY;IACV;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,mBAAmB;IACjB;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;GACA,gBAAgB,CACd;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,YAAY;IACV;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,YAAY,CACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,cAAc,CACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,gBAAgB,CACd;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,iBAAiB;IACf;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,aAAa,CACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,cAAc,CACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,gBAAgB;IACd;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,UAAU;IACR;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,YAAY;IACV;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,gBAAgB,CAAC;GACjB,cAAc,CACZ;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;EACF;EACA,cAAc;EACd,UAAU;GACR;IACE,OAAO;IACP,MAAM;;;;;;;;;;;;GAYR;GACA;IACE,OAAO;IACP,MAAM;;;;;;;;;;;;;;;;GAgBR;GACA;IACE,OAAO;IACP,MAAM;;;;;;;;;;;;GAYR;EACF;CAoqEA;CACA;EAjqEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,QAAQ;EAClB,OAAO,EACL,QAAQ;GACN;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;EAOR,CACF;CAymEA;CACA;EAtmEA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,OAAO;EACjB,OAAO,EACL,OAAO;GACL;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc;CAgkEd;CACA;EA7jEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,SAAS;EACnB,OAAO,EACL,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACN,SAAS;GACT,aAAa;EACf,CACF,EACF;EACA,UAAU;EACV,cAAc;CA4iEd;CACA;EAziEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,OAAO;EACjB,OAAO,EACL,OAAO;GACL;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAmgEd;CACA;EAhgEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,OAAO;EACjB,OAAO,EACL,OAAO;GACL;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;;;EASR,GACA;GACE,OAAO;GACP,MAAM;;;;;;;;;;EAUR,CACF;CA27DA;CACA;EAx7DA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,QAAQ;EAClB,OAAO,EACL,QAAQ;GACN;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAy4Dd;CACA;EAt4DA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;EACF;EACA,OAAO;GACL,UAAU;IACR;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;GACA,cAAc,CACZ;IACE,M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ACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAS,MAAM;IAAU,aAAa;GAAU;EAC1D,EACF;EACA,UAAU;EACV,cAAc;CAwmDd;CACA;EArmDA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CA0kDd;CACA;EAvkDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;CAwiDd;CACA;EAriDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;EACF;EACA,OAAO;GACL,MAAM;IACJ;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,YAAY,CAAC;GACb,WAAW,CAAC;GACZ,iBAAiB,CAAC;GAClB,aAAa,CAAC;GACd,YAAY,CAAC;EACf;EACA,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;;;;;EAWR,CACF;EACA,cAAc;CAm+Cd;CACA;EAh+CA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY,eAAe;EACrC,OAAO;GACL,UAAU;IACR;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;GACA,eAAe;IACb;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;EACF;EACA,UAAU;EACV,cAAc;CA84Cd;CACA;EA34CA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,cAAc,OAAO;EAC/B,mBAAmB;GACjB;IAAE,MAAM;IAAO,QAAQ;GAAc;GACrC;IAAE,MAAM;IAAO,QAAQ;GAAc;GACrC;IAAE,MAAM;IAAS,QAAQ;GAAW;EACtC;EACA,OAAO;GACL,YAAY;IACV;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,OAAO;IACL;KACE,MAAM;KACN,MAAM;KACN,aACE;IACJ;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;EACF;EACA,UAAU;EACV,cAAc;CAm0Cd;CACA;EAh0CA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,iBAAiB;EAC3B,OAAO,EACL,iBAAiB;GACf;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;CA+uCd;CACA;EA5uCA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,UAAU;EACpB,mBAAmB;GACjB;IAAE,MAAM;IAAS,QAAQ;GAAQ;GACjC;IAAE,MAAM;IAAa,QAAQ;GAAwB;GACrD;IAAE,MAAM;IAAO,QAAQ;GAAsC;GAC7D;IAAE,MAAM;IAAU,QAAQ;GAAa;GACvC;IAAE,MAAM;IAAU,QAAQ;GAAO;GACjC;IAAE,MAAM;IAAgB,QAAQ;GAAO;EACzC;EACA,OAAO,EACL,UAAU;GACR;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc;CAyqCd;CACA;EAtqCA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,aAAa;EACvB,OAAO,EACL,aAAa;GACX;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc;CAmoCd;CACA;EAhoCA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc;CA4lCd;CACA;EAzlCA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,aAAa;EACvB,OAAO,EACL,aAAa;GACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;CA0jCd;CACA;EAvjCA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,kBAAkB;EAC5B,OAAO,EACL,kBAAkB;GAChB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc;CAs/Bd;CACA;EAn/BA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GAAC;GAAe;GAAkB;GAAkB;EAAc;EAC3E,mBAAmB,CACjB;GAAE,MAAM;GAAO,QAAQ;EAAS,GAChC;GAAE,MAAM;GAAiB,QAAQ;EAAU,CAC7C;EACA,OAAO,EACL,gBAAgB,CACd;GACE,MAAM;GACN,MAAM;GACN,SAAS;GACT,aAAa;EACf,GACA;GAAE,MAAM;GAAa,MAAM;GAAU,aAAa;EAAc,CAClE,EACF;EACA,cAAc;CA89Bd;CACA;EA39BA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;EACF;EAEA,gBAAgB,CAAC,cAAc;EAC/B,mBAAmB;GACjB;IAAE,MAAM;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;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAc;EAClE,EACF;EACA,cAAc;CAmuBd;CACA;EAhuBA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,SAAS;EACnB,OAAO,EACL,SAAS;GACP;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IAAE,MAAM;IAAS,MAAM;IAAU,aAAa;GAAa;GAC3D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAc;EAClE,EACF;EACA,cAAc;CAysBd;CACA;EAtsBA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GAAC;GAAuB;GAAkB;EAAiB;EACpE,OAAO;GACL,qBAAqB;IACnB;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAc;GAClE;GACA,gBAAgB;IACd;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAc;GAClE;GACA,iBAAiB;IACf;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAc;GAClE;EACF;EACA,cAAc;CAgmBd;CACA;EA7lBA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,aAAa;EACvB,OAAO,EACL,aAAa;GACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;EAMR,CACF;CAsiBA;CACA;EAniBA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,aAAa;EACvB,OAAO,EACL,aAAa;GACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;;;;;;;;;;EAgBR,CACF;CAmfA;CACA;EAhfA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,MAAM;EAChB,OAAO,EACL,MAAM;GACJ;IAAE,MAAM;IAAO,MAAM;IAAU,aAAa;GAAa;GACzD;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAQ,MAAM;IAAU,aAAa;GAAU;GACvD;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAW,MAAM;IAAc,aAAa;GAAS;GAC7D;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAc;EAClE,EACF;EACA,cAAc;CA4cd;CACA;EAzcA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GAAC;GAAc;GAAe;EAAa;EACpD,mBAAmB,CACjB;GAAE,MAAM;GAAO,QAAQ;EAAS,GAChC;GAAE,MAAM;GAAO,QAAQ;EAAgB,CACzC;EACA,OAAO;GACL,YAAY,CACV;IAAE,MAAM;IAAQ,MAAM;IAAW,aAAa;GAAc,GAC5D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,aAAa;IACX;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;EACF;EACA,UAAU;EACV,cAAc;CA0Zd;CACA;EAvZA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAyUd;CACA;EAtUA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,aAAa;EACvB,OAAO,EACL,aAAa;GACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc;CAoSd;CACA;EAjSA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,gBAAgB;EAC1B,OAAO,EACL,gBAAgB;GACd;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc,CAAC;GAAE,MAAM;GAAW,UAAU;EAAO,CAAC;EACpD,cAAc;CAmQd;CACA;EAhQA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,mBAAmB;GACjB;IAAE,MAAM;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aAAa;EACf,CACF,EACF;EACA,cAAc,CACZ;GAAE,MAAM;GAAQ,UAAU;EAAO,GACjC;GAAE,MAAM;GAAO,UAAU;EAAO,CAClC;EACA,cAAc;CAwuGd;CACA;EAruGA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,gBAAgB;EAC1B,OAAO,EACL,gBAAgB;GACd;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;GACZ;IAAE,MAAM;IAAU,UAAU;GAAO;GACnC;IAAE,MAAM;IAAY,UAAU;GAAO;GACrC;IAAE,MAAM;IAAO,UAAU;GAAO;EAClC;EACA,cAAc;CAqqGd;CACA;EAlqGA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,uBAAuB;EACjC,OAAO,EACL,uBAAuB;GACrB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAmB,UAAU;EAAS,CAAC;EAC9D,cAAc;CAwoGd;CACA;EAroGA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,oBAAoB;EAC9B,OAAO,EACL,oBAAoB,CAClB;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,aAAa;EACf,GACA;GACE,MAAM;GACN,MAAM;GACN,SAAS;GACT,aAAa;EACf,CACF,EACF;EACA,cAAc;CAgnGd;CACA;EA7mGA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,iBAAiB;EAC3B,OAAO,EACL,iBAAiB;GACf;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAY,UAAU;EAAO,CAAC;EACrD,cAAc;CA6kGd;CACA;EA1kGA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,UAAU;EACpB,OAAO,EACL,UAAU,CACR;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,aAAa;EACf,CACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAc,UAAU;EAAO,CAAC;EACvD,cAAc;CAyjGd;CACA;EAtjGA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,cAAc;EACxB,OAAO,EACL,cAAc;GACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAU,UAAU;EAAO,CAAC;EACnD,cAAc;CAshGd;CACA;EAnhGA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,aAAa;EACvB,OAAO,EACL,aAAa,CACX;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,aACE;EACJ,GACA;GACE,MAAM;GACN,MAAM;GACN,SAAS;GACT,aAAa;EACf,CACF,EACF;EACA,cAAc;CA6/Fd;CACA;EA1/FA,MAAM;EACN,UAAU;EAC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,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;GACZ;IAAE,MAAM;IAAQ,UAAU;GAAO;GACjC;IAAE,MAAM;IAAY,UAAU;GAAO;GACrC;IAAE,MAAM;IAAe,UAAU;GAAO;EAC1C;EACA,cAAc;CAk+Ed;CACA;EA/9EA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,YAAY;EACZ,SAAS,CAAC,kBAAkB;EAC5B,OAAO,EACL,kBAAkB;GAChB;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAQ,UAAU;EAAO,CAAC;EACjD,cAAc;CA66Ed;CACA;EA16EA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,YAAY;EACZ,SAAS,CAAC,gBAAgB;EAC1B,OAAO,EACL,gBAAgB;GACd;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAQ,UAAU;EAAO,CAAC;EACjD,cAAc;CA62Ed;CACA;EA12EA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GAAC;GAAa;GAAiB;EAAe;EACvD,OAAO,EACL,WAAW;GACT;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CA20Ed;CACA;EAx0EA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,qBAAqB;EAC/B,OAAO,EACL,qBAAqB;GACnB;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aACE;GACJ;GACA;IAAE,MAAM;IAAS,MAAM;IAAU,aAAa;GAAQ;GACtD;IAAE,MAAM;IAAa,MAAM;IAAW,aAAa;GAAW;GAC9D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAsyEd;CACA;EAnyEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,mBAAmB;EAC7B,OAAO,CAAC;EACR,UAAU;EACV,cAAc,CAAC;GAAE,MAAM;GAAU,UAAU;EAAO,CAAC;EACnD,cAAc;CA0xEd;CACA;EAvxEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,gBAAgB;EAC1B,OAAO,EACL,gBAAgB;GACd;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc;CAqvEd;CACA;EAlvEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,aAAa;EACvB,mBAAmB,CACjB;GAAE,MAAM;GAAO,QAAQ;EAAa,GACpC;GAAE,MAAM;GAAS,QAAQ;EAAW,CACtC;EACA,OAAO,EACL,aAAa;GACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAY,MAAM;IAAU,aAAa;GAAW;GAC5D;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAS,UAAU;EAAO,CAAC;EAClD,cAAc;CAqsEd;CACA;EAlsEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,gBAAgB;EAC1B,mBAAmB,CAAC;GAAE,MAAM;GAAO,QAAQ;EAAc,CAAC;EAC1D,OAAO,EACL,gBAAgB;GACd;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;CAwoEd;CACA;EAroEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,gBAAgB;EAC1B,mBAAmB,CACjB;GAAE,MAAM;GAAW,QAAQ;EAA6B,GACxD;GAAE,MAAM;GAAS,QAAQ;EAAQ,CACnC;EACA,OAAO,EACL,gBAAgB;GACd;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAS,UAAU;EAAO,CAAC;EAClD,cAAc;CAgmEd;CACA;EA7lEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,mBAAmB;EAC7B,OAAO,EACL,mBAAmB;GACjB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAS,MAAM;IAAU,aAAa;GAAa;GAC3D;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAc;GAChE;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;CAwiEd;CACA;EAriEA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,kBAAkB;EAC5B,OAAO,CAAC;EACR,cAAc,CAAC;GAAE,MAAM;GAAS,UAAU;EAAO,CAAC;EAClD,cAAc;CA8hEd;CACA;EA3hEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,mBAAmB;EAC7B,OAAO,EACL,mBAAmB;GACjB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IAAE,MAAM;IAAW,MAAM;IAAW,aAAa;GAAe;GAChE;IAAE,MAAM;IAAS,MAAM;IAAU,aAAa;GAAkB;GAChE;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;CA8/Dd;CACA;EA3/DA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,cAAc;EACxB,OAAO,CAAC;EACR,cAAc,CACZ;GAAE,MAAM;GAAU,UAAU;EAAO,GACnC;GAAE,MAAM;GAAS,UAAU;EAAO,CACpC;EACA,cAAc;CAg/Dd;CACA;EA7+DA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,WAAW;EACrB,OAAO,EACL,WAAW;GACT;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAY,MAAM;IAAW,aAAa;GAAQ;GAC1D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAW,aAAa;GAAY;GAC/D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAU,UAAU;EAAO,CAAC;EACnD,cAAc;CAs5Dd;CACA;EAn5DA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,iBAAiB;EAC3B,OAAO,CAAC;EACR,cAAc;GACZ;IAAE,MAAM;IAAS,UAAU;GAAO;GAClC;IAAE,MAAM;IAAe,UAAU;GAAO;GACxC;IAAE,MAAM;IAAgB,UAAU;GAAO;GACzC;IAAE,MAAM;IAAa,UAAU;GAAO;EACxC;EACA,cAAc;CAs4Dd;CACA;EAn4DA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,CAAC;EACR,cAAc;CA43Dd;CACA;EAz3DA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,eAAe;EACzB,OAAO,EACL,eAAe;GACb;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CACZ;GAAE,MAAM;GAAU,UAAU;EAAO,GACnC;GAAE,MAAM;GAAS,UAAU;EAAO,CACpC;EACA,cAAc;CAm0Dd;CACA;EAh0DA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,gBAAgB;EAC1B,OAAO,CAAC;EACR,cAAc,CACZ;GAAE,MAAM;GAAU,UAAU;EAAO,GACnC;GAAE,MAAM;GAAS,UAAU;EAAO,CACpC;EACA,cAAc;CAqzDd;CACA;EAlzDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,eAAe;EACzB,OAAO,EACL,eAAe;GACb;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;GACZ;IAAE,MAAM;IAAU,UAAU;GAAO;GACnC;IAAE,MAAM;IAAa,UAAU;GAAO;GACtC;IAAE,MAAM;IAAS,UAAU;GAAO;EACpC;EACA,cAAc;CAowDd;CACA;EAjwDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,mBAAmB;EAC7B,OAAO,EACL,mBAAmB;GACjB;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;GACZ;IAAE,MAAM;IAAU,UAAU;GAAO;GACnC;IAAE,MAAM;IAAW,UAAU;GAAO;GACpC;IAAE,MAAM;IAAqB,UAAU;GAAO;EAChD;EACA,cAAc;CA8tDd;CACA;EA3tDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,cAAc;EACxB,OAAO,EACL,cAAc;GACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CACZ;GAAE,MAAM;GAAiB,UAAU;EAAO,GAC1C;GAAE,MAAM;GAAU,UAAU;EAAO,CACrC;EACA,cAAc;CAirDd;CACA;EA5qDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc,CACZ;GAAE,MAAM;GAAa,UAAU;EAAO,GACtC;GAAE,MAAM;GAAY,UAAU;EAAO,CACvC;EACA,cAAc;CAsnDd;CACA;EAnnDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,oBAAoB;EAC9B,OAAO,EACL,oBAAoB;GAClB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CACZ;GAAE,MAAM;GAAU,UAAU;EAAO,GACnC;GAAE,MAAM;GAAU,UAAU;EAAO,CACrC;EACA,cAAc;CAskDd;CACA;EAnkDA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,eAAe;EACzB,OAAO,EACL,eAAe,CACb;GACE,MAAM;GACN,MAAM;GACN,aAAa;EACf,CACF,EACF;EACA,cAAc;CAqjDd;CACA;EAljDA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,gBAAgB;EAC1B,OAAO,EACL,gBAAgB;GACd;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAS,UAAU;EAAO,CAAC;EAClD,cAAc;CA4gDd;CACA;EAzgDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,WAAW,YAAY;EACjC,mBAAmB;GACjB;IAAE,MAAM;IAAU,QAAQ;GAAiB;GAC3C;IAAE,MAAM;IAAO,QAAQ;GAAe;GACtC;IAAE,MAAM;IAAc,QAAQ;GAAwB;EACxD;EACA,OAAO;GACL,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aACE;IACJ;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAc;GAClE;GACA,iBAAiB;IACf;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAc;GAClE;GACA,gBAAgB;IACd;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,a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ACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;GACZ;IAAE,MAAM;IAAU,UAAU;GAAO;GACnC;IAAE,MAAM;IAAO,UAAU;GAAO;GAChC;IAAE,MAAM;IAAU,UAAU;GAAO;EACrC;EACA,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;EAMR,CACF;CA4eA;CACA;EAzeA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,iBAAiB;EAC3B,OAAO,EACL,iBAAiB;GACf;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;GACZ;IAAE,MAAM;IAAe,UAAU;GAAO;GACxC;IAAE,MAAM;IAAU,UAAU;GAAO;GACnC;IAAE,MAAM;IAAe,UAAU;GAAO;EAC1C;EACA,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;;EAQR,CACF;CAsaA;CACA;EAtXA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,oBAAoB,sBAAsB;EACpD,OAAO,EACL,kBAAkB;GAChB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CA0Td;CACA;EAvTA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,iBAAiB;EAC3B,OAAO,EACL,iBAAiB;GACf;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CA6Pd;CACA;EA1PA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,UAAU;EACpB,OAAO,EACL,UAAU;GACR;IAAE,MAAM;IAAQ,MAAM;IAAS,UAAU;IAAM,aAAa;GAAQ;GACpE;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IAAE,MAAM;IAAc,MAAM;IAAiB,aAAa;GAAQ;GAClE;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAQ,MAAM;IAAkB,aAAa;GAAQ;GAC7D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAsLd;CACA;EAnLA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,UAAU;EACpB,OAAO,EACL,UAAU;GACR;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CA2Id;CACA;EAxIA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,cAAc;EACxB,OAAO,EACL,cAAc;GACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAmFd;AACF"}
|
|
1
|
+
{"version":3,"file":"meta.js","names":[],"sources":["../src/core/_meta.ts","../src/visuals/_meta.ts","../src/shells/_meta.ts"],"sourcesContent":["import type { ComponentMeta } from \"@reopt-ai/opt-doc-kit\";\n\nexport const textMeta: ComponentMeta = {\n name: \"Text\",\n category: \"core\",\n functionalCategory: \"typography\",\n maturity: \"stable\",\n keywords: [\"typography\", \"body\", \"label\", \"supporting\", \"code\"],\n description:\n \"본문, 레이블, 보조 설명, 코드에 일관된 의미 기반 타이포그래피를 적용합니다.\",\n slug: \"text\",\n exports: [\"Text\"],\n props: {\n Text: [\n {\n name: \"as\",\n type: '\"span\" | \"p\" | \"div\" | \"label\" | \"code\"',\n description: \"렌더링할 HTML 요소\",\n },\n {\n name: \"variant\",\n type: '\"body\" | \"label\" | \"supporting\" | \"code\"',\n description: \"시각적 텍스트 역할\",\n },\n {\n name: \"tone\",\n type: '\"primary\" | \"secondary\" | \"tertiary\" | \"inherit\"',\n description: \"의미 기반 텍스트 색상\",\n },\n { name: \"truncate\", type: \"boolean\", description: \"한 줄 말줄임 적용\" },\n { name: \"children\", type: \"ReactNode\", description: \"텍스트 콘텐츠\" },\n ],\n },\n usage: {\n bestPractices: [\n \"텍스트 크기를 직접 지정하기보다 콘텐츠의 역할에 맞는 variant를 선택합니다.\",\n ],\n avoid: [\"Heading 대신 Text의 크기를 키워 문서 제목을 표현하지 않습니다.\"],\n },\n theming: {\n target: \"text\",\n parts: [\"root\"],\n variables: [\n \"--opt-text-body-size\",\n \"--opt-text-label-size\",\n \"--opt-text-supporting-size\",\n \"--opt-text-code-size\",\n ],\n },\n scenarios: [\n {\n name: \"semantic roles\",\n description: \"모든 텍스트 역할과 색상 톤을 함께 검증합니다.\",\n viewport: \"responsive\",\n },\n ],\n testDescribe: \"Text and Heading\",\n};\n\nexport const headingMeta: ComponentMeta = {\n name: \"Heading\",\n category: \"core\",\n functionalCategory: \"typography\",\n maturity: \"stable\",\n keywords: [\"typography\", \"heading\", \"display\", \"hierarchy\"],\n description:\n \"문서의 의미 계층과 시각적 타이포그래피 계층을 독립적으로 제어합니다.\",\n slug: \"heading\",\n exports: [\"Heading\"],\n props: {\n Heading: [\n {\n name: \"level\",\n type: \"1 | 2 | 3 | 4 | 5 | 6\",\n description: \"의미 기반 HTML 제목 레벨\",\n },\n {\n name: \"variant\",\n type: '\"heading-1\" … \"heading-6\" | \"display-1\" | \"display-2\" | \"display-3\"',\n description: \"시각적 제목 역할\",\n },\n { name: \"children\", type: \"ReactNode\", description: \"제목 콘텐츠\" },\n ],\n },\n usage: {\n bestPractices: [\n \"level은 문서 구조로, variant는 시각적 강조 수준으로 선택합니다.\",\n ],\n avoid: [\"시각적 크기만을 위해 제목 레벨을 건너뛰지 않습니다.\"],\n },\n theming: {\n target: \"heading\",\n parts: [\"root\"],\n variables: [\n \"--opt-text-heading-1-size\",\n \"--opt-text-heading-2-size\",\n \"--opt-text-display-1-size\",\n ],\n },\n scenarios: [\n {\n name: \"hierarchy\",\n description: \"heading 및 display 계층과 의미 레벨 분리를 검증합니다.\",\n viewport: \"responsive\",\n },\n ],\n testDescribe: \"Text and Heading\",\n};\n\nexport const kbdMeta: ComponentMeta = {\n name: \"Kbd\",\n category: \"core\",\n description: \"키보드 단축키를 시각적으로 표시하는 인라인 뱃지 컴포넌트.\",\n slug: \"kbd\",\n exports: [\"Kbd\"],\n props: {\n Kbd: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"표시할 단축키 텍스트\",\n },\n {\n name: \"hint\",\n type: \"boolean\",\n description:\n '인라인 힌트 배지로 표시. `data-shortcut-hints=\"hidden\"`일 때 숨겨진다 (app.css)',\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n testDescribe: \"Kbd\",\n};\n\nexport const separatorMeta: ComponentMeta = {\n name: \"Separator\",\n category: \"core\",\n description:\n \"콘텐츠를 구분하는 가로/세로 디바이더. 라벨을 넣으면 가운데 정렬 구분선이 된다.\",\n slug: \"separator\",\n exports: [\"Separator\"],\n props: {\n Separator: [\n {\n name: \"orientation\",\n type: '\"horizontal\" | \"vertical\"',\n description: \"구분선 방향 (기본 horizontal)\",\n },\n {\n name: \"decorative\",\n type: \"boolean\",\n description: \"접근성 트리에서 숨김 (순수 시각 구분)\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n description: \"가운데 라벨 (horizontal 전용)\",\n },\n { name: \"className\", type: \"string\", description: \"추가 CSS 클래스\" },\n ],\n },\n testDescribe: \"Separator\",\n};\n\nexport const otpFieldMeta: ComponentMeta = {\n name: \"OtpField\",\n category: \"core\",\n description:\n \"일회용 코드(OTP)/PIN 입력. 셀 단위 입력, 붙여넣기 분배, 자동 포커스 이동, 백스페이스 네비게이션과 폼 이름/오류 연결을 지원합니다.\",\n slug: \"otp-field\",\n exports: [\"OtpField\"],\n props: {\n OtpField: [\n { name: \"length\", type: \"number\", description: \"셀 개수 (기본 6)\" },\n { name: \"value\", type: \"string\", description: \"제어 모드 값\" },\n { name: \"defaultValue\", type: \"string\", description: \"비제어 초기값\" },\n {\n name: \"onChange\",\n type: \"(value: string) => void\",\n description: \"값 변경 콜백\",\n },\n {\n name: \"onComplete\",\n type: \"(value: string) => void\",\n description: \"모든 셀이 채워지면 1회 호출\",\n },\n {\n name: \"type\",\n type: '\"numeric\" | \"alphanumeric\"',\n description: \"허용 문자 (기본 numeric)\",\n },\n {\n name: \"mask\",\n type: \"boolean\",\n description: \"채워진 셀을 점(•)으로 마스킹 (PIN 용)\",\n },\n { name: \"disabled\", type: \"boolean\", description: \"비활성화\" },\n {\n name: \"name\",\n type: \"string\",\n description: \"폼 필드명. 전체 값을 담은 hidden input 렌더\",\n },\n { name: \"label\", type: \"string\", description: \"필드 레이블\" },\n { name: \"error\", type: \"string\", description: \"에러 메시지\" },\n { name: \"hint\", type: \"string\", description: \"도움말 텍스트\" },\n ],\n },\n testDescribe: \"OtpField\",\n};\n\nexport const toggleMeta: ComponentMeta = {\n name: \"Toggle\",\n category: \"core\",\n description:\n \"눌림(pressed) 두 상태 버튼. 단독 사용하거나 ToggleGroup으로 묶어 단일/다중 선택을 만든다.\",\n slug: \"toggle\",\n exports: [\"Toggle\", \"ToggleGroup\"],\n props: {\n Toggle: [\n {\n name: \"pressed\",\n type: \"boolean\",\n description: \"제어 모드: 눌림 상태 (단독 사용)\",\n },\n {\n name: \"defaultPressed\",\n type: \"boolean\",\n description: \"비제어 초기 눌림 상태 (단독 사용)\",\n },\n {\n name: \"onPressedChange\",\n type: \"(pressed: boolean) => void\",\n description: \"눌림 상태 변경 콜백 (단독 사용)\",\n },\n {\n name: \"value\",\n type: \"string\",\n description: \"ToggleGroup 내에서 이 토글을 식별하는 값\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\"',\n description: \"크기 (기본 md)\",\n },\n { name: \"disabled\", type: \"boolean\", description: \"비활성화\" },\n { name: \"children\", type: \"ReactNode\", description: \"토글 콘텐츠\" },\n ],\n ToggleGroup: [\n {\n name: \"value\",\n type: \"string | string[]\",\n description: \"선택 값. 단일은 string, toggleMultiple은 string[]\",\n },\n {\n name: \"defaultValue\",\n type: \"string | string[]\",\n description: \"비제어 초기 선택 값\",\n },\n {\n name: \"onValueChange\",\n type: \"(value: string | string[]) => void\",\n description: \"선택 변경 콜백\",\n },\n {\n name: \"toggleMultiple\",\n type: \"boolean\",\n description: \"동시에 여러 개 눌림 허용\",\n },\n {\n name: \"orientation\",\n type: '\"horizontal\" | \"vertical\"',\n description: \"배치 방향 (기본 horizontal)\",\n },\n { name: \"disabled\", type: \"boolean\", description: \"그룹 전체 비활성화\" },\n { name: \"children\", type: \"ReactNode\", description: \"Toggle 항목들\" },\n ],\n },\n testDescribe: \"Toggle\",\n};\n\nexport const accordionMeta: ComponentMeta = {\n name: \"Accordion\",\n category: \"core\",\n description:\n \"수직으로 쌓인 펼침/접힘 패널. single(한 개)/multiple(여러 개) 모드와 collapsible 지원.\",\n slug: \"accordion\",\n exports: [\n \"AccordionRoot\",\n \"AccordionItem\",\n \"AccordionTrigger\",\n \"AccordionContent\",\n ],\n props: {\n AccordionRoot: [\n {\n name: \"type\",\n type: '\"single\" | \"multiple\"',\n description:\n \"한 개만 열림(single) 또는 여러 개 열림(multiple). 기본 single\",\n },\n {\n name: \"value\",\n type: \"string | string[] | null\",\n description: \"열린 항목 값. single은 string|null, multiple은 string[]\",\n },\n {\n name: \"defaultValue\",\n type: \"string | string[] | null\",\n description: \"비제어 초기 열림 값\",\n },\n {\n name: \"onValueChange\",\n type: \"(value: string | string[] | null) => void\",\n description: \"열림 변경 콜백\",\n },\n {\n name: \"collapsible\",\n type: \"boolean\",\n description: \"single 모드에서 열린 패널을 다시 닫을 수 있게 허용\",\n },\n { name: \"disabled\", type: \"boolean\", description: \"전체 비활성화\" },\n {\n name: \"animated\",\n type: \"boolean\",\n description: \"콘텐츠 enter/leave 애니메이션 (기본 true)\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n description: \"AccordionItem 목록\",\n },\n ],\n AccordionItem: [\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"항목 식별 값\",\n },\n { name: \"disabled\", type: \"boolean\", description: \"이 항목만 비활성화\" },\n { name: \"children\", type: \"ReactNode\", description: \"Trigger + Content\" },\n ],\n AccordionTrigger: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"헤더 라벨 (쉐브론 아이콘 자동 추가)\",\n },\n ],\n AccordionContent: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"펼쳐지는 패널 본문\",\n },\n ],\n },\n testDescribe: \"Accordion\",\n};\n\nexport const statCardMeta: ComponentMeta = {\n name: \"StatCard\",\n category: \"core\",\n description: \"트렌드 방향과 변화량을 표시하는 통계 카드.\",\n slug: \"stat-card\",\n exports: [\"StatCard\"],\n props: {\n StatCard: [\n {\n name: \"title\",\n type: \"string\",\n required: true,\n description: \"통계 제목\",\n },\n { name: \"value\", type: \"string\", required: true, description: \"통계 값\" },\n {\n name: \"change\",\n type: \"string\",\n required: true,\n description: \"변화량 텍스트 (예: '+12.5%')\",\n },\n {\n name: \"trend\",\n type: '\"up\" | \"down\" | \"neutral\"',\n required: true,\n description: \"트렌드 방향. 색상과 아이콘 결정\",\n },\n ],\n },\n ariaRole: \"presentation\",\n testDescribe: \"StatCard\",\n};\n\nexport const compositeZoneMeta: ComponentMeta = {\n name: \"CompositeZone\",\n category: \"core\",\n description:\n \"Composite 기반 2D 키보드 탐색 컨테이너. 화살표 키로 자식 요소 간 이동 가능.\",\n slug: \"composite-zone\",\n exports: [\"CompositeZone\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓ ← →\", action: \"2D 방향 탐색\" },\n { keys: \"Home\", action: \"첫 항목으로 이동\" },\n { keys: \"End\", action: \"마지막 항목으로 이동\" },\n { keys: \"Tab\", action: \"영역 밖으로 이동\" },\n ],\n props: {\n CompositeZone: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"CompositeRow + CompositeItem 자식\",\n },\n {\n name: \"label\",\n type: \"string\",\n required: true,\n description: \"aria-label 값\",\n },\n {\n name: \"focusLoop\",\n type: \"boolean\",\n default: \"true\",\n description: \"포커스가 끝에서 처음으로 순환\",\n },\n {\n name: \"focusWrap\",\n type: \"boolean\",\n default: \"true\",\n description: \"행 끝에서 다음 행으로 이동\",\n },\n { name: \"className\", type: \"string\", description: \"컨테이너 CSS 클래스\" },\n ],\n },\n ariaRole: \"grid\",\n testDescribe: \"CompositeZone\",\n};\n\nexport const disclosureMeta: ComponentMeta = {\n name: \"Disclosure\",\n category: \"core\",\n description:\n \"접기/펼치기 콘텐츠 영역. 3-part anatomy: Root, Trigger, Content.\",\n slug: \"disclosure\",\n exports: [\"DisclosureRoot\", \"DisclosureTrigger\", \"DisclosureContent\"],\n keyboardShortcuts: [{ keys: \"Enter / Space\", action: \"열기/닫기 토글\" }],\n props: {\n DisclosureRoot: [\n { name: \"open\", type: \"boolean\", description: \"제어 모드: 열림 상태\" },\n {\n name: \"setOpen\",\n type: \"(open: boolean) => void\",\n description: \"제어 모드: 상태 변경 핸들러\",\n },\n {\n name: \"defaultOpen\",\n type: \"boolean\",\n default: \"false\",\n description: \"비제어 모드: 초기 열림 상태\",\n },\n ],\n DisclosureTrigger: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"트리거 내용\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n DisclosureContent: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"접히는 콘텐츠\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n testDescribe: \"Disclosure\",\n};\n\nexport const tabsMeta: ComponentMeta = {\n name: \"Tabs\",\n category: \"core\",\n description: \"탭 패널 시스템. 4-part anatomy: Root, TabList, Tab, TabPanel.\",\n slug: \"tabs\",\n exports: [\"TabsRoot\", \"TabList\", \"Tab\", \"TabPanel\"],\n keyboardShortcuts: [\n { keys: \"← →\", action: \"탭 탐색\" },\n { keys: \"Home\", action: \"첫 번째 탭으로 이동\" },\n { keys: \"End\", action: \"마지막 탭으로 이동\" },\n ],\n props: {\n TabsRoot: [\n {\n name: \"variant\",\n type: '\"underline\" | \"workspace\"',\n description:\n \"탭 프레임 형태. workspace는 편집기 탭(문서/쿼리처럼 열고 닫히며 상태를 갖는 작업 단위)\",\n },\n {\n name: \"defaultSelectedId\",\n type: \"string\",\n description: \"초기 선택된 탭 ID\",\n },\n {\n name: \"selectedId\",\n type: \"string | null\",\n description: \"제어 모드: 선택된 탭 ID\",\n },\n {\n name: \"setSelectedId\",\n type: \"(id: string | null) => void\",\n description: \"제어 모드: 탭 변경 핸들러\",\n },\n ],\n TabList: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"Tab 요소들\",\n },\n {\n name: \"actions\",\n type: \"ReactNode\",\n description:\n \"탭 줄 오른쪽 액션 영역 (새 탭, 닫기 등). tablist 바깥에 렌더돼 탭 순회에 끼어들지 않음\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n Tab: [\n {\n name: \"id\",\n type: \"string\",\n required: true,\n description: \"탭 고유 ID (TabPanel의 tabId와 매칭)\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"탭 레이블\",\n },\n {\n name: \"icon\",\n type: \"ReactNode\",\n description: \"탭 이름 앞 아이콘. 활성 탭에서 accent 색으로 전환\",\n },\n {\n name: \"status\",\n type: '\"dirty\" | \"running\"',\n description: \"저장되지 않은 변경 / 실행 중 인디케이터\",\n },\n {\n name: \"statusLabel\",\n type: \"string\",\n description: \"status 인디케이터의 접근성 레이블\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n TabPanel: [\n {\n name: \"tabId\",\n type: \"string\",\n required: true,\n description: \"연결된 Tab의 ID\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"패널 콘텐츠\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n ariaRole: \"tablist\",\n testDescribe: \"Tabs\",\n};\n\nexport const selectMeta: ComponentMeta = {\n name: \"Select\",\n category: \"core\",\n description:\n \"드롭다운 선택 컴포넌트. 5-part anatomy: Root, Label, Trigger, Popover, Item.\",\n slug: \"select\",\n exports: [\n \"SelectRoot\",\n \"SelectLabel\",\n \"SelectTrigger\",\n \"SelectPopover\",\n \"SelectItem\",\n ],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"옵션 탐색\" },\n { keys: \"Enter / Space\", action: \"옵션 선택\" },\n { keys: \"Esc\", action: \"팝오버 닫기\" },\n { keys: \"문자 입력\", action: \"Typeahead 탐색\" },\n ],\n props: {\n SelectRoot: [\n {\n name: \"value\",\n type: \"string | string[]\",\n description: \"제어 모드: 현재 선택 값 (multiple이면 string[])\",\n },\n {\n name: \"onValueChange\",\n type: \"(value: string | string[]) => void\",\n description: \"제어 모드: 값 변경 핸들러\",\n },\n {\n name: \"defaultValue\",\n type: \"string | string[]\",\n description: \"비제어 모드: 초기값\",\n },\n {\n name: \"multiple\",\n type: \"boolean\",\n description: \"다중 선택 허용 (값이 string[]이 됨)\",\n },\n {\n name: \"name\",\n type: \"string\",\n description: \"폼 필드명. 선택값마다 hidden input을 렌더해 폼 전송 지원\",\n },\n ],\n SelectLabel: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"레이블 텍스트\",\n },\n ],\n SelectTrigger: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"트리거 내용 (선택된 값 표시)\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n SelectPopover: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"SelectItem 목록\",\n },\n {\n name: \"sameWidth\",\n type: \"boolean\",\n default: \"true\",\n description: \"트리거와 같은 너비\",\n },\n {\n name: \"gutter\",\n type: \"number\",\n default: \"4\",\n description: \"트리거와의 간격 (px)\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n SelectItem: [\n { name: \"value\", type: \"string\", required: true, description: \"옵션 값\" },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"옵션 레이블\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n ariaRole: \"listbox\",\n testDescribe: \"Select\",\n examples: [\n {\n title: \"기본 선택\",\n code: `import { SelectRoot, SelectLabel, SelectTrigger, SelectPopover, SelectItem } from \"@reopt-ai/opt-ui\";\n\n<SelectRoot value={role} onValueChange={setRole}>\n <SelectLabel>역할</SelectLabel>\n <SelectTrigger>{role || \"선택하세요\"}</SelectTrigger>\n <SelectPopover>\n <SelectItem value=\"admin\">관리자</SelectItem>\n <SelectItem value=\"editor\">편집자</SelectItem>\n <SelectItem value=\"viewer\">뷰어</SelectItem>\n </SelectPopover>\n</SelectRoot>`,\n },\n ],\n};\n\nexport const dialogMeta: ComponentMeta = {\n name: \"Dialog\",\n category: \"core\",\n description:\n \"모달 다이얼로그. 9-part anatomy: Root, Disclosure, Panel, Heading, Description, Dismiss, Header, Body, Footer.\",\n slug: \"dialog\",\n exports: [\n \"DialogRoot\",\n \"DialogDisclosure\",\n \"DialogPanel\",\n \"AlertDialogPanel\",\n \"DialogHeading\",\n \"DialogDescription\",\n \"DialogDismiss\",\n \"DialogHeader\",\n \"DialogBody\",\n \"DialogFooter\",\n ],\n keyboardShortcuts: [\n { keys: \"Esc\", action: \"다이얼로그 닫기\" },\n { keys: \"Tab\", action: \"다이얼로그 내 포커스 이동 (트랩)\" },\n ],\n props: {\n DialogRoot: [\n { name: \"open\", type: \"boolean\", description: \"제어 모드: 열림 상태\" },\n {\n name: \"setOpen\",\n type: \"(open: boolean) => void\",\n description: \"제어 모드: 상태 변경 핸들러\",\n },\n ],\n DialogDisclosure: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"트리거 버튼 내용\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n DialogPanel: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"다이얼로그 콘텐츠\",\n },\n {\n name: \"size\",\n type: '\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"',\n default: '\"md\"',\n description: \"최대 너비 프리셋\",\n },\n {\n name: \"backdrop\",\n type: \"ReactElement\",\n default: \"<div> (반투명 배경)\",\n description: \"배경 오버레이 요소\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n DialogHeading: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"제목 텍스트 (자동 aria-labelledby 연결)\",\n },\n ],\n DialogDescription: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"설명 텍스트 (자동 aria-describedby 연결)\",\n },\n ],\n DialogDismiss: [\n { name: \"children\", type: \"ReactNode\", description: \"닫기 버튼 내용\" },\n ],\n DialogHeader: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"Heading, Description, Dismiss 등 헤더 콘텐츠\",\n },\n ],\n DialogBody: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"스크롤 가능한 본문 콘텐츠\",\n },\n ],\n DialogFooter: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"액션 버튼 영역\",\n },\n ],\n },\n ariaRole: \"dialog\",\n testDescribe: \"Dialog\",\n examples: [\n {\n title: \"모달 대화상자\",\n code: `import { DialogRoot, DialogDisclosure, DialogPanel, DialogHeading, DialogDismiss } from \"@reopt-ai/opt-ui\";\n\n<DialogRoot>\n <DialogDisclosure>열기</DialogDisclosure>\n <DialogPanel size=\"md\">\n <DialogHeading>확인</DialogHeading>\n <p>변경 사항을 저장하시겠습니까?</p>\n <DialogDismiss>닫기</DialogDismiss>\n </DialogPanel>\n</DialogRoot>`,\n },\n ],\n};\n\nexport const comboboxMeta: ComponentMeta = {\n name: \"Combobox\",\n category: \"core\",\n description:\n \"자동완성 검색 입력. 7 exports: Root, Input, Popover, Item, Group, GroupLabel, Empty.\",\n slug: \"combobox\",\n exports: [\n \"ComboboxRoot\",\n \"ComboboxInput\",\n \"ComboboxPopover\",\n \"ComboboxItem\",\n \"ComboboxGroup\",\n \"ComboboxGroupLabel\",\n \"ComboboxEmpty\",\n ],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"항목 탐색\" },\n { keys: \"Enter\", action: \"항목 선택\" },\n { keys: \"Esc\", action: \"팝오버 닫기\" },\n ],\n advancedPatternAnchor: \"combobox-grouping\",\n advancedPatternDescription:\n \"비동기 검색, 커스텀 아이템 렌더링, 선택 상태 관리 등 고급 패턴\",\n props: {\n ComboboxRoot: [\n {\n name: \"setValue\",\n type: \"(value: string) => void\",\n description: \"입력값 변경 핸들러\",\n },\n {\n name: \"resetValueOnHide\",\n type: \"boolean\",\n default: \"false\",\n description: \"팝오버 닫힐 때 입력값 리셋\",\n },\n ],\n ComboboxInput: [\n {\n name: \"placeholder\",\n type: \"string\",\n description: \"플레이스홀더 텍스트\",\n },\n {\n name: \"autoSelect\",\n type: \"boolean\",\n default: \"false\",\n description: \"첫 항목 자동 선택\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n ComboboxPopover: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"ComboboxItem/Group 목록\",\n },\n {\n name: \"sameWidth\",\n type: \"boolean\",\n default: \"true\",\n description: \"입력과 같은 너비\",\n },\n {\n name: \"gutter\",\n type: \"number\",\n default: \"4\",\n description: \"입력과의 간격 (px)\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n ComboboxItem: [\n { name: \"value\", type: \"string\", required: true, description: \"항목 값\" },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"항목 내용\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n ComboboxGroup: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"GroupLabel + Item 그룹\",\n },\n ],\n ComboboxGroupLabel: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"그룹 레이블\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n ComboboxEmpty: [\n {\n name: \"children\",\n type: \"ReactNode\",\n default: '\"결과가 없습니다.\"',\n description: \"빈 상태 메시지\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n ariaRole: \"combobox\",\n testDescribe: \"Combobox\",\n};\n\nexport const menuMeta: ComponentMeta = {\n name: \"Menu\",\n category: \"core\",\n description:\n \"메뉴바 + 개별 메뉴 시스템. 10 exports: MenubarRoot, MenubarContainer, MenuRoot, MenuTrigger, MenuButtonArrow, MenuPopover, MenuItem, MenuItemCheckbox, MenuItemRadio, MenuSeparator.\",\n slug: \"menu\",\n keyboardShortcuts: [\n { keys: \"← →\", action: \"메뉴 간 탐색\" },\n { keys: \"↑ ↓\", action: \"메뉴 항목 탐색\" },\n { keys: \"Enter / Space\", action: \"항목 선택/토글\" },\n { keys: \"Esc\", action: \"메뉴 닫기\" },\n ],\n exports: [\n \"MenubarRoot\",\n \"MenubarContainer\",\n \"MenuRoot\",\n \"MenuTrigger\",\n \"MenuButtonArrow\",\n \"MenuPopover\",\n \"MenuItem\",\n \"MenuItemCheckbox\",\n \"MenuItemRadio\",\n \"MenuSeparator\",\n ],\n props: {\n MenubarRoot: [],\n MenubarContainer: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"MenuRoot 요소들\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n MenuRoot: [],\n MenuTrigger: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"메뉴 버튼 레이블\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n MenuButtonArrow: [\n { name: \"className\", type: \"string\", description: \"화살표 CSS 클래스\" },\n ],\n MenuPopover: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"MenuItem 목록\",\n },\n {\n name: \"gutter\",\n type: \"number\",\n default: \"8\",\n description: \"트리거와의 간격 (px)\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n MenuItem: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"메뉴 항목 내용\",\n },\n { name: \"onClick\", type: \"() => void\", description: \"클릭 핸들러\" },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n MenuItemCheckbox: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"체크박스 이름\",\n },\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"체크박스 값\",\n },\n { name: \"checked\", type: \"boolean\", description: \"체크 상태\" },\n {\n name: \"onChange\",\n type: \"(e: ChangeEvent) => void\",\n description: \"변경 핸들러\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"항목 내용\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n MenuItemRadio: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"라디오 그룹 이름\",\n },\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"라디오 값\",\n },\n { name: \"checked\", type: \"boolean\", description: \"선택 상태\" },\n {\n name: \"onChange\",\n type: \"(e: ChangeEvent) => void\",\n description: \"변경 핸들러\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"항목 내용\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n MenuSeparator: [\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n ariaRole: \"menubar\",\n testDescribe: \"Menu\",\n};\n\nexport const toolbarMeta: ComponentMeta = {\n name: \"Toolbar\",\n category: \"core\",\n description:\n \"툴바 컨테이너 + 툴팁. 7 exports: ToolbarRoot, ToolbarContainer, ToolbarButton, ToolbarSeparator, TooltipProvider, TooltipAnchor, Tooltip.\",\n slug: \"toolbar\",\n keyboardShortcuts: [\n { keys: \"← →\", action: \"버튼 간 탐색\" },\n { keys: \"Enter / Space\", action: \"버튼 활성화\" },\n { keys: \"Home\", action: \"첫 번째 버튼으로 이동\" },\n { keys: \"End\", action: \"마지막 버튼으로 이동\" },\n ],\n exports: [\n \"ToolbarRoot\",\n \"ToolbarContainer\",\n \"ToolbarButton\",\n \"ToolbarSeparator\",\n \"TooltipProvider\",\n \"TooltipAnchor\",\n \"Tooltip\",\n ],\n props: {\n ToolbarRoot: [\n {\n name: \"focusLoop\",\n type: \"boolean\",\n default: \"false\",\n description: \"포커스 순환 여부\",\n },\n ],\n ToolbarContainer: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"ToolbarButton/Separator 요소들\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n ToolbarButton: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"버튼 내용\",\n },\n { name: \"onClick\", type: \"() => void\", description: \"클릭 핸들러\" },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n ToolbarSeparator: [\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n TooltipProvider: [],\n TooltipAnchor: [\n {\n name: \"render\",\n type: \"ReactElement\",\n description: \"앵커로 사용할 요소\",\n },\n { name: \"children\", type: \"ReactNode\", description: \"앵커 내용\" },\n ],\n Tooltip: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"툴팁 내용\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n ariaRole: \"toolbar\",\n testDescribe: \"Toolbar\",\n};\n\nexport const formMeta: ComponentMeta = {\n name: \"Form\",\n category: \"core\",\n description:\n \"접근성 폼 시스템. opt-ui-primitives Form API 기반. 31 exports: FormRoot, FormProvider, FormGroup, FormGroupLabel, FormDescription, FormField, FormControl, FormInput, FormTextarea, FormSelect, FormSelectPopover, FormSelectItem, FormSwitch, FormLabel, FormError, FormSubmit, FormCheckbox, FormRadioGroup, FormRadio, FormPush, FormRemove, FormReset, FormNumberInput, FormSlider, FormStarRating, FormColorPicker, FormIconPicker, FormTagInput, FormDateRangePicker + useFormStore, useFormContext hooks.\",\n slug: \"form\",\n exports: [\n \"FormRoot\",\n \"FormProvider\",\n \"FormGroup\",\n \"FormGroupLabel\",\n \"FormDescription\",\n \"FormField\",\n \"FormControl\",\n \"FormInput\",\n \"FormTextarea\",\n \"FormSelect\",\n \"FormSelectPopover\",\n \"FormSelectItem\",\n \"FormSwitch\",\n \"FormLabel\",\n \"FormError\",\n \"FormSubmit\",\n \"FormCheckbox\",\n \"FormRadioGroup\",\n \"FormRadio\",\n \"FormPush\",\n \"FormRemove\",\n \"FormReset\",\n \"FormNumberInput\",\n \"FormSlider\",\n \"FormStarRating\",\n \"FormColorPicker\",\n \"FormIconPicker\",\n \"FormTagInput\",\n \"FormDateRangePicker\",\n \"useFormStore\",\n \"useFormContext\",\n ],\n props: {\n FormRoot: [\n {\n name: \"store\",\n type: \"FormStore\",\n description:\n \"useFormStore()로 생성한 폼 스토어. 미지정 시 자식의 FormProvider가 제공.\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"폼 필드들\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormInput: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"폼 필드 이름 (스토어 키와 매칭)\",\n },\n {\n name: \"type\",\n type: \"string\",\n default: '\"text\"',\n description: \"입력 타입\",\n },\n { name: \"placeholder\", type: \"string\", description: \"플레이스홀더\" },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormTextarea: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"폼 필드 이름\",\n },\n {\n name: \"rows\",\n type: \"number\",\n default: \"4\",\n description: \"표시 줄 수\",\n },\n {\n name: \"resize\",\n type: '\"none\" | \"vertical\" | \"horizontal\" | \"both\"',\n default: '\"vertical\"',\n description: \"크기 조절 방향\",\n },\n { name: \"placeholder\", type: \"string\", description: \"플레이스홀더\" },\n {\n name: \"className\",\n type: \"string\",\n description: \"추가 CSS 클래스\",\n },\n ],\n FormSelect: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"폼 필드 이름\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"FormSelectPopover 등 자식 요소\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n description: \"미선택 시 표시 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"추가 CSS 클래스\",\n },\n ],\n FormSelectPopover: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"FormSelectItem 목록\",\n },\n {\n name: \"sameWidth\",\n type: \"boolean\",\n default: \"true\",\n description: \"트리거와 같은 너비\",\n },\n {\n name: \"gutter\",\n type: \"number\",\n default: \"4\",\n description: \"트리거와의 간격 (px)\",\n },\n ],\n FormSelectItem: [\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"옵션 값\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"옵션 레이블\",\n },\n ],\n FormSwitch: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"폼 필드 이름\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"스위치 크기\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n description: \"비활성화 상태\",\n },\n ],\n FormLabel: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"연결된 필드 이름\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"레이블 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormError: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"연결된 필드 이름\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormSubmit: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"버튼 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormProvider: [\n {\n name: \"store\",\n type: \"FormStore\",\n required: true,\n description: \"useFormStore()로 생성한 폼 스토어\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"자식 폼 요소\",\n },\n ],\n FormGroup: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"그룹 내 필드들\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormGroupLabel: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"그룹 레이블 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormDescription: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"연결된 필드 이름\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"도움말 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormField: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"필드 이름\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"label + input + error 등\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormControl: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"연결된 필드 이름\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormCheckbox: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"폼 필드 이름 (스토어 키)\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormRadioGroup: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"폼 필드 이름 (스토어 키)\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"FormRadio 목록\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormRadio: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"폼 필드 이름 (스토어 키)\",\n },\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"라디오 값\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormPush: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"배열 필드 이름\",\n },\n {\n name: \"value\",\n type: \"unknown\",\n required: true,\n description: \"추가할 기본값\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"버튼 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormRemove: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"배열 필드 이름\",\n },\n {\n name: \"index\",\n type: \"number\",\n required: true,\n description: \"제거할 인덱스\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"버튼 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n FormReset: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"버튼 텍스트\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n useFormContext: [],\n useFormStore: [\n {\n name: \"defaultValues\",\n type: \"Record<string, unknown>\",\n description: \"초기 폼 값\",\n },\n ],\n },\n testDescribe: \"Form\",\n examples: [\n {\n title: \"기본 폼\",\n code: `import { useFormStore, FormRoot, FormField, FormControl, FormLabel, FormError, FormSubmit, Input } from \"@reopt-ai/opt-ui\";\n\nconst store = useFormStore({ defaultValues: { name: \"\", email: \"\" } });\n\n<FormRoot store={store}>\n <FormField name=\"name\">\n <FormLabel name=\"name\">이름</FormLabel>\n <FormControl name=\"name\"><Input /></FormControl>\n <FormError name=\"name\" />\n </FormField>\n <FormSubmit>저장</FormSubmit>\n</FormRoot>`,\n },\n {\n title: \"검증 + 비동기 제출\",\n code: `import { useFormStore, FormRoot, FormField, FormControl, FormLabel, FormError, FormSubmit, Input } from \"@reopt-ai/opt-ui\";\n\nconst store = useFormStore({\n defaultValues: { email: \"\" },\n validate: (values) => {\n const errors: Record<string, string> = {};\n if (!values.email) errors.email = \"이메일을 입력하세요\";\n return errors;\n },\n onSubmit: async (values) => {\n await fetch(\"/api/submit\", {\n method: \"POST\",\n body: JSON.stringify(values),\n });\n },\n});`,\n },\n {\n title: \"schemaValidator (Zod)\",\n code: `import { useFormStore, schemaValidator } from \"@reopt-ai/opt-ui\";\nimport { z } from \"zod\";\n\nconst schema = z.object({\n name: z.string().min(1, \"필수 항목\"),\n age: z.number().min(0, \"0 이상\"),\n});\n\nconst store = useFormStore({\n defaultValues: { name: \"\", age: 0 },\n validate: schemaValidator(schema),\n});`,\n },\n ],\n};\n\nexport const buttonMeta: ComponentMeta = {\n name: \"Button\",\n category: \"core\",\n description:\n \"접근성 버튼 컴포넌트. 4가지 변형(primary, secondary, ghost, danger), 3가지 크기, 로딩/아이콘과 aria-busy 상태를 지원합니다.\",\n slug: \"button\",\n exports: [\"Button\"],\n props: {\n Button: [\n {\n name: \"variant\",\n type: '\"primary\" | \"secondary\" | \"ghost\" | \"danger\"',\n default: '\"primary\"',\n description: \"버튼 스타일 변형\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"버튼 크기\",\n },\n {\n name: \"loading\",\n type: \"boolean\",\n default: \"false\",\n description: \"로딩 상태. true면 스피너 표시 및 비활성화\",\n },\n {\n name: \"leftIcon\",\n type: \"ReactNode\",\n description: \"버튼 텍스트 왼쪽에 표시할 아이콘\",\n },\n {\n name: \"rightIcon\",\n type: \"ReactNode\",\n description: \"버튼 텍스트 오른쪽에 표시할 아이콘\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n description: \"비활성화 상태\",\n },\n ],\n },\n ariaRole: \"button\",\n testDescribe: \"Button\",\n examples: [\n {\n title: \"버튼 변형\",\n code: `import { Button } from \"@reopt-ai/opt-ui\";\n\n<Button variant=\"primary\">Primary</Button>\n<Button variant=\"secondary\">Secondary</Button>\n<Button variant=\"ghost\">Ghost</Button>\n<Button variant=\"danger\" disabled>Danger</Button>\n<Button variant=\"primary\" loading>저장 중...</Button>`,\n },\n ],\n};\n\nexport const badgeMeta: ComponentMeta = {\n name: \"Badge\",\n category: \"core\",\n description: \"인라인 상태 뱃지. 5가지 색상 변형, 상태 점(dot) 옵션 지원.\",\n slug: \"badge\",\n exports: [\"Badge\"],\n props: {\n Badge: [\n {\n name: \"variant\",\n type: '\"default\" | \"success\" | \"warning\" | \"error\" | \"info\"',\n default: '\"default\"',\n description: \"뱃지 색상 변형\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\"',\n default: '\"md\"',\n description: \"뱃지 크기\",\n },\n {\n name: \"dot\",\n type: \"boolean\",\n default: \"false\",\n description: \"상태 점 표시 여부\",\n },\n {\n name: \"progress\",\n type: \"number\",\n description: \"원형 프로그레스 값 (0-100). 설정 시 dot 무시\",\n },\n {\n name: \"progressSize\",\n type: \"number\",\n default: \"16\",\n description: \"프로그레스 링 SVG 크기 (px)\",\n },\n ],\n },\n testDescribe: \"Badge\",\n};\n\nexport const spinnerMeta: ComponentMeta = {\n name: \"Spinner\",\n category: \"core\",\n description:\n \"로딩 상태 표시 스피너. 3가지 크기와 장식용 aria-hidden 모드를 지원합니다.\",\n slug: \"spinner\",\n exports: [\"Spinner\"],\n props: {\n Spinner: [\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"스피너 크기\",\n },\n ],\n },\n ariaRole: \"status\",\n testDescribe: \"Spinner\",\n};\n\nexport const alertMeta: ComponentMeta = {\n name: \"Alert\",\n category: \"core\",\n description:\n \"알림 메시지 컴포넌트. 4가지 변형(info, success, warning, error), 제목/본문/닫기 버튼 지원.\",\n slug: \"alert\",\n exports: [\"Alert\"],\n props: {\n Alert: [\n {\n name: \"variant\",\n type: '\"info\" | \"success\" | \"warning\" | \"error\"',\n default: '\"info\"',\n description: \"알림 변형 (색상 및 아이콘 결정)\",\n },\n {\n name: \"title\",\n type: \"string\",\n description: \"알림 제목\",\n },\n {\n name: \"icon\",\n type: \"ReactNode\",\n description: \"커스텀 아이콘. 미지정 시 변형에 따른 기본 아이콘 사용\",\n },\n {\n name: \"dismissible\",\n type: \"boolean\",\n default: \"false\",\n description: \"닫기 버튼 표시 여부\",\n },\n {\n name: \"onDismiss\",\n type: \"() => void\",\n description: \"닫기 버튼 클릭 핸들러\",\n },\n ],\n },\n ariaRole: \"alert\",\n testDescribe: \"Alert\",\n};\n\nexport const inputMeta: ComponentMeta = {\n name: \"Input\",\n category: \"core\",\n description:\n \"독립적인 텍스트 입력 컴포넌트. 레이블, 에러, 힌트, 아이콘 지원.\",\n slug: \"input\",\n exports: [\"Input\"],\n props: {\n Input: [\n {\n name: \"label\",\n type: \"string\",\n description: \"입력 필드 레이블\",\n },\n {\n name: \"error\",\n type: \"string\",\n description: \"에러 메시지. 표시 시 aria-invalid=true 설정\",\n },\n {\n name: \"hint\",\n type: \"string\",\n description: \"힌트 텍스트 (에러 없을 때만 표시)\",\n },\n {\n name: \"leftIcon\",\n type: \"ReactNode\",\n description: \"입력 필드 왼쪽에 표시할 아이콘\",\n },\n {\n name: \"rightIcon\",\n type: \"ReactNode\",\n description: \"입력 필드 오른쪽에 표시할 아이콘\",\n },\n {\n name: \"fullWidth\",\n type: \"boolean\",\n default: \"false\",\n description: \"전체 너비 사용 여부\",\n },\n ],\n },\n ariaRole: \"textbox\",\n testDescribe: \"Input\",\n examples: [\n {\n title: \"기본 사용\",\n code: `import { Input } from \"@reopt-ai/opt-ui\";\n\n<Input\n label=\"이메일\"\n hint=\"업무용 이메일을 입력하세요\"\n placeholder=\"user@example.com\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n/>`,\n },\n {\n title: \"FormStore 연동\",\n code: `import { useFormStore, FormRoot, FormField, FormControl, FormLabel, Input } from \"@reopt-ai/opt-ui\";\n\nconst store = useFormStore({ defaultValues: { name: \"\" } });\n\n<FormRoot store={store}>\n <FormField name=\"name\">\n <FormLabel name=\"name\">이름</FormLabel>\n <FormControl name=\"name\"><Input /></FormControl>\n </FormField>\n</FormRoot>`,\n },\n ],\n};\n\nexport const switchMeta: ComponentMeta = {\n name: \"Switch\",\n category: \"core\",\n description:\n \"토글 스위치 컴포넌트. 3가지 크기와 레이블/설명의 명시적 접근성 연결을 지원합니다.\",\n slug: \"switch\",\n exports: [\"Switch\"],\n props: {\n Switch: [\n {\n name: \"label\",\n type: \"string\",\n description: \"스위치 레이블\",\n },\n {\n name: \"description\",\n type: \"string\",\n description: \"레이블 아래 설명 텍스트\",\n },\n {\n name: \"checked\",\n type: \"boolean\",\n description: \"제어 모드: 체크 상태\",\n },\n {\n name: \"defaultChecked\",\n type: \"boolean\",\n description: \"비제어 모드: 초기 체크 상태\",\n },\n {\n name: \"onChange\",\n type: \"(checked: boolean) => void\",\n description: \"상태 변경 핸들러\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"스위치 크기\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n description: \"비활성화 상태\",\n },\n ],\n },\n ariaRole: \"switch\",\n testDescribe: \"Switch\",\n};\n\nexport const skeletonMeta: ComponentMeta = {\n name: \"Skeleton\",\n category: \"core\",\n description:\n \"로딩 플레이스홀더. text/circular/rectangular 변형. 프리셋 컴포넌트 포함.\",\n slug: \"skeleton\",\n exports: [\n \"Skeleton\",\n \"SkeletonText\",\n \"SkeletonAvatar\",\n \"SkeletonCard\",\n \"SkeletonTable\",\n ],\n props: {\n Skeleton: [\n {\n name: \"variant\",\n type: '\"text\" | \"circular\" | \"rectangular\"',\n default: '\"text\"',\n description: \"스켈레톤 형태\",\n },\n {\n name: \"width\",\n type: \"string | number\",\n description: \"너비 (px 또는 CSS 값)\",\n },\n {\n name: \"height\",\n type: \"string | number\",\n description: \"높이 (px 또는 CSS 값)\",\n },\n {\n name: \"lines\",\n type: \"number\",\n default: \"1\",\n description: \"text variant일 때 줄 수\",\n },\n {\n name: \"animated\",\n type: \"boolean\",\n default: \"true\",\n description: \"펄스 애니메이션 활성화\",\n },\n ],\n SkeletonText: [\n {\n name: \"lines\",\n type: \"number\",\n default: \"3\",\n description: \"텍스트 줄 수\",\n },\n ],\n SkeletonAvatar: [\n {\n name: \"size\",\n type: \"number\",\n default: \"40\",\n description: \"아바타 크기 (px)\",\n },\n ],\n SkeletonTable: [\n {\n name: \"rows\",\n type: \"number\",\n default: \"5\",\n description: \"테이블 행 수\",\n },\n {\n name: \"columns\",\n type: \"number\",\n default: \"4\",\n description: \"테이블 열 수\",\n },\n ],\n },\n ariaRole: \"status\",\n testDescribe: \"Skeleton\",\n};\n\nexport const textareaMeta: ComponentMeta = {\n name: \"Textarea\",\n category: \"core\",\n description: \"멀티라인 텍스트 입력. Input과 동일한 API (label, error, hint).\",\n slug: \"textarea\",\n exports: [\"Textarea\"],\n props: {\n Textarea: [\n { name: \"label\", type: \"string\", description: \"입력 필드 레이블\" },\n { name: \"error\", type: \"string\", description: \"에러 메시지\" },\n { name: \"hint\", type: \"string\", description: \"힌트 텍스트\" },\n {\n name: \"fullWidth\",\n type: \"boolean\",\n default: \"false\",\n description: \"전체 너비 사용\",\n },\n {\n name: \"resize\",\n type: '\"none\" | \"vertical\" | \"horizontal\" | \"both\"',\n default: '\"vertical\"',\n description: \"크기 조절 방향\",\n },\n { name: \"rows\", type: \"number\", default: \"4\", description: \"표시 줄 수\" },\n ],\n },\n ariaRole: \"textbox\",\n testDescribe: \"Textarea\",\n};\n\nexport const avatarMeta: ComponentMeta = {\n name: \"Avatar\",\n category: \"core\",\n description:\n \"사용자 아바타. 이미지, 이니셜 자동 생성, 스크린 리더에 노출되는 상태 인디케이터, 그룹을 지원합니다.\",\n slug: \"avatar\",\n exports: [\"Avatar\", \"AvatarGroup\"],\n props: {\n Avatar: [\n { name: \"src\", type: \"string\", description: \"이미지 URL\" },\n { name: \"alt\", type: \"string\", description: \"이미지 대체 텍스트\" },\n {\n name: \"name\",\n type: \"string\",\n description: \"사용자 이름 (이니셜 생성 및 색상 결정)\",\n },\n {\n name: \"size\",\n type: '\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\"',\n default: '\"md\"',\n description: \"아바타 크기\",\n },\n {\n name: \"fallback\",\n type: \"ReactNode\",\n description: \"이미지 실패 시 표시할 콘텐츠\",\n },\n {\n name: \"status\",\n type: '\"online\" | \"offline\" | \"busy\" | \"away\"',\n description: \"상태 인디케이터\",\n },\n ],\n AvatarGroup: [\n {\n name: \"max\",\n type: \"number\",\n default: \"4\",\n description: \"최대 표시 개수\",\n },\n {\n name: \"size\",\n type: '\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\"',\n default: '\"md\"',\n description: \"아바타 크기\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"Avatar 요소들\",\n },\n ],\n },\n testDescribe: \"Avatar\",\n};\n\nexport const progressMeta: ComponentMeta = {\n name: \"Progress\",\n category: \"core\",\n description:\n \"진행률 표시. Linear/Circular, determinate/indeterminate 변형과 안전하게 보정된 ARIA 값을 지원합니다.\",\n slug: \"progress\",\n exports: [\"Progress\", \"CircularProgress\"],\n props: {\n Progress: [\n {\n name: \"value\",\n type: \"number\",\n description: \"현재 값. 생략하면 indeterminate 상태\",\n },\n { name: \"max\", type: \"number\", default: \"100\", description: \"최대 값\" },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"진행바 높이\",\n },\n {\n name: \"variant\",\n type: '\"default\" | \"success\" | \"warning\" | \"error\"',\n default: '\"default\"',\n description: \"색상 변형\",\n },\n {\n name: \"showLabel\",\n type: \"boolean\",\n default: \"false\",\n description: \"퍼센트 표시\",\n },\n { name: \"label\", type: \"string\", description: \"레이블 텍스트\" },\n {\n name: \"animated\",\n type: \"boolean\",\n default: \"true\",\n description: \"애니메이션 활성화\",\n },\n {\n name: \"indeterminate\",\n type: \"boolean\",\n default: \"false\",\n description: \"값을 알 수 없는 진행 상태\",\n },\n ],\n CircularProgress: [\n {\n name: \"value\",\n type: \"number\",\n description: \"현재 값. 생략하면 indeterminate 상태\",\n },\n { name: \"max\", type: \"number\", default: \"100\", description: \"최대 값\" },\n {\n name: \"size\",\n type: \"number\",\n default: \"48\",\n description: \"원 크기 (px)\",\n },\n {\n name: \"strokeWidth\",\n type: \"number\",\n default: \"4\",\n description: \"선 두께\",\n },\n {\n name: \"variant\",\n type: '\"default\" | \"success\" | \"warning\" | \"error\"',\n default: '\"default\"',\n description: \"색상 변형\",\n },\n {\n name: \"showLabel\",\n type: \"boolean\",\n default: \"false\",\n description: \"중앙에 퍼센트 표시\",\n },\n { name: \"label\", type: \"string\", description: \"접근성 레이블\" },\n {\n name: \"indeterminate\",\n type: \"boolean\",\n default: \"false\",\n description: \"값을 알 수 없는 진행 상태\",\n },\n ],\n },\n ariaRole: \"progressbar\",\n testDescribe: \"Progress\",\n};\n\nexport const meterMeta: ComponentMeta = {\n name: \"Meter\",\n category: \"core\",\n description:\n \"범위 내 스칼라 측정값 게이지 (디스크 사용량·점수·용량 등). role=meter로 작업 진행률(Progress)과 구분된다.\",\n slug: \"meter\",\n exports: [\"Meter\"],\n props: {\n Meter: [\n { name: \"value\", type: \"number\", required: true, description: \"현재 값\" },\n { name: \"min\", type: \"number\", default: \"0\", description: \"최소 값\" },\n { name: \"max\", type: \"number\", default: \"100\", description: \"최대 값\" },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"게이지 높이\",\n },\n {\n name: \"variant\",\n type: '\"default\" | \"success\" | \"warning\" | \"error\"',\n default: '\"default\"',\n description: \"색상 변형\",\n },\n {\n name: \"showValue\",\n type: \"boolean\",\n default: \"false\",\n description: \"퍼센트 표시\",\n },\n { name: \"label\", type: \"string\", description: \"레이블 텍스트\" },\n ],\n },\n ariaRole: \"meter\",\n testDescribe: \"Meter\",\n};\n\nexport const breadcrumbMeta: ComponentMeta = {\n name: \"Breadcrumb\",\n category: \"core\",\n description: \"현재 위치를 표시하고 계층 탐색을 제공하는 컴포넌트.\",\n slug: \"breadcrumb\",\n exports: [\"Breadcrumb\"],\n props: {\n Breadcrumb: [\n {\n name: \"items\",\n type: \"BreadcrumbItem[]\",\n required: true,\n description: \"경로 항목 배열. { id, label, href?, icon? }\",\n },\n {\n name: \"separator\",\n type: \"ReactNode\",\n default: '\"/\"',\n description: \"항목 간 구분자\",\n },\n {\n name: \"onNavigate\",\n type: \"(item: BreadcrumbItem) => void\",\n description: \"항목 클릭 핸들러\",\n },\n ],\n },\n ariaRole: \"navigation\",\n testDescribe: \"Breadcrumb\",\n};\n\nexport const emptyStateMeta: ComponentMeta = {\n name: \"EmptyState\",\n category: \"core\",\n description:\n \"데이터가 없을 때 표시하는 빈 상태 컴포넌트. 아이콘, 제목, 설명, 액션 버튼 지원.\",\n slug: \"empty-state\",\n exports: [\"EmptyState\"],\n props: {\n EmptyState: [\n {\n name: \"title\",\n type: \"string\",\n required: true,\n description: \"빈 상태 제목\",\n },\n {\n name: \"description\",\n type: \"string\",\n description: \"빈 상태 설명\",\n },\n {\n name: \"icon\",\n type: \"ReactNode\",\n description: \"표시할 아이콘\",\n },\n {\n name: \"actions\",\n type: \"EmptyStateAction[]\",\n description: \"액션 버튼 배열. { label, onClick, variant? }\",\n },\n ],\n },\n testDescribe: \"EmptyState\",\n};\n\nexport const cardMeta: ComponentMeta = {\n name: \"Card\",\n category: \"core\",\n description:\n \"범용 카드 컨테이너. Header, Title, Description, Content, Footer 하위 컴포넌트 포함.\",\n slug: \"card\",\n exports: [\n \"Card\",\n \"CardHeader\",\n \"CardTitle\",\n \"CardDescription\",\n \"CardContent\",\n \"CardFooter\",\n ],\n props: {\n Card: [\n {\n name: \"variant\",\n type: '\"default\" | \"outline\" | \"ghost\"',\n default: '\"default\"',\n description: \"카드 스타일 변형\",\n },\n {\n name: \"padding\",\n type: '\"none\" | \"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"내부 패딩 크기\",\n },\n {\n name: \"selectable\",\n type: \"boolean\",\n default: \"false\",\n description: \"선택 가능 모드 활성화\",\n },\n {\n name: \"selected\",\n type: \"boolean\",\n description: \"선택 상태 (selectable=true 시)\",\n },\n {\n name: \"onSelectedChange\",\n type: \"(selected: boolean) => void\",\n description: \"선택 상태 변경 콜백\",\n },\n ],\n CardHeader: [],\n CardTitle: [],\n CardDescription: [],\n CardContent: [],\n CardFooter: [],\n },\n examples: [\n {\n title: \"카드 레이아웃\",\n code: `import { Card, CardHeader, CardTitle, CardDescription, CardContent } from \"@reopt-ai/opt-ui\";\n\n<Card>\n <CardHeader>\n <CardTitle>프로젝트 요약</CardTitle>\n <CardDescription>최근 7일간 활동 현황</CardDescription>\n </CardHeader>\n <CardContent>\n <p>활성 사용자: 1,234명</p>\n </CardContent>\n</Card>`,\n },\n ],\n testDescribe: \"Card\",\n};\n\nexport const checkboxMeta: ComponentMeta = {\n name: \"Checkbox\",\n category: \"core\",\n description:\n \"독립적인 체크박스 컴포넌트. 레이블, 설명, 그룹과 DOM property까지 동기화되는 indeterminate 상태를 지원합니다.\",\n slug: \"checkbox\",\n exports: [\"Checkbox\", \"CheckboxGroup\"],\n props: {\n Checkbox: [\n {\n name: \"label\",\n type: \"string\",\n description: \"체크박스 레이블\",\n },\n {\n name: \"description\",\n type: \"string\",\n description: \"레이블 아래 설명 텍스트\",\n },\n {\n name: \"checked\",\n type: \"boolean\",\n description: \"제어 모드: 체크 상태\",\n },\n {\n name: \"defaultChecked\",\n type: \"boolean\",\n description: \"비제어 모드: 초기 체크 상태\",\n },\n {\n name: \"onChange\",\n type: \"(checked: boolean) => void\",\n description: \"상태 변경 핸들러\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"체크박스 크기\",\n },\n {\n name: \"value\",\n type: \"string\",\n description: \"CheckboxGroup 내에서 사용할 값\",\n },\n {\n name: \"indeterminate\",\n type: \"boolean\",\n default: \"false\",\n description: \"불확정 상태 표시 (마이너스 아이콘)\",\n },\n ],\n CheckboxGroup: [\n {\n name: \"value\",\n type: \"string[]\",\n description: \"제어 모드: 선택된 값 배열\",\n },\n {\n name: \"defaultValue\",\n type: \"string[]\",\n default: \"[]\",\n description: \"비제어 모드: 초기 선택 값 배열\",\n },\n {\n name: \"onChange\",\n type: \"(value: string[]) => void\",\n description: \"선택 변경 핸들러\",\n },\n {\n name: \"orientation\",\n type: '\"horizontal\" | \"vertical\"',\n default: '\"vertical\"',\n description: \"레이아웃 방향\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"그룹 레이블\",\n },\n ],\n },\n ariaRole: \"checkbox\",\n testDescribe: \"Checkbox\",\n};\n\nexport const radioGroupMeta: ComponentMeta = {\n name: \"RadioGroup\",\n category: \"core\",\n description:\n \"독립적인 라디오 그룹 컴포넌트. 그룹 설명과 항목별 설명을 분리 연결하고 다양한 크기를 지원합니다.\",\n slug: \"radio-group\",\n exports: [\"RadioGroup\", \"Radio\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"라디오 옵션 간 탐색\" },\n { keys: \"← →\", action: \"라디오 옵션 간 탐색\" },\n { keys: \"Space\", action: \"현재 옵션 선택\" },\n ],\n props: {\n RadioGroup: [\n {\n name: \"value\",\n type: \"string\",\n description: \"제어 모드: 선택된 값\",\n },\n {\n name: \"defaultValue\",\n type: \"string\",\n default: '\"\"',\n description: \"비제어 모드: 초기 선택 값\",\n },\n {\n name: \"onChange\",\n type: \"(value: string) => void\",\n description: \"선택 변경 핸들러\",\n },\n {\n name: \"orientation\",\n type: '\"horizontal\" | \"vertical\"',\n default: '\"vertical\"',\n description: \"레이아웃 방향\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"그룹 레이블\",\n },\n {\n name: \"name\",\n type: \"string\",\n description: \"폼 제출 시 사용할 이름\",\n },\n ],\n Radio: [\n {\n name: \"value\",\n type: \"string\",\n description:\n \"라디오 값 (RadioGroup 안에서는 부모가 관리하므로 optional)\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"라디오 레이블\",\n },\n {\n name: \"description\",\n type: \"string\",\n description: \"레이블 아래 설명 텍스트\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"라디오 크기\",\n },\n ],\n },\n ariaRole: \"radiogroup\",\n testDescribe: \"RadioGroup\",\n};\n\nexport const dateRangePickerMeta: ComponentMeta = {\n name: \"DateRangePicker\",\n category: \"core\",\n description:\n \"날짜 범위 선택 컴포넌트. 프리셋, 달력 UI, 포커스 관리와 RTL 방향 탐색 아이콘을 지원합니다.\",\n slug: \"date-range-picker\",\n exports: [\"DateRangePicker\"],\n props: {\n DateRangePicker: [\n {\n name: \"value\",\n type: \"DateRange\",\n description: \"제어 모드: { start: Date | null, end: Date | null }\",\n },\n {\n name: \"onChange\",\n type: \"(range: DateRange) => void\",\n description: \"범위 변경 핸들러\",\n },\n {\n name: \"presets\",\n type: \"DateRangePreset[]\",\n description: \"빠른 선택 프리셋 배열 (기본: Today, Last 7/30/90 days)\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n default: '\"Select date range\"',\n description: \"미선택 시 표시 텍스트\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"입력 필드 레이블\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n default: \"false\",\n description: \"비활성화 상태\",\n },\n {\n name: \"format\",\n type: \"(date: Date) => string\",\n description: \"날짜 포맷 함수\",\n },\n {\n name: \"comparison\",\n type: \"boolean\",\n default: \"false\",\n description: \"비교 모드 활성화\",\n },\n {\n name: \"comparisonMode\",\n type: '\"previous\" | \"year-over-year\"',\n default: '\"previous\"',\n description: \"비교 기준 (이전 기간 / 전년 동기)\",\n },\n {\n name: \"onComparisonChange\",\n type: \"(comparison: boolean, mode: ComparisonMode) => void\",\n description: \"비교 모드 변경 콜백\",\n },\n {\n name: \"showGranularity\",\n type: \"boolean\",\n default: \"false\",\n description: \"시간 단위 선택기 표시\",\n },\n {\n name: \"granularity\",\n type: '\"hour\" | \"day\" | \"week\" | \"month\"',\n default: '\"day\"',\n description: \"시간 단위\",\n },\n {\n name: \"onGranularityChange\",\n type: \"(granularity: DateGranularity) => void\",\n description: \"시간 단위 변경 콜백\",\n },\n ],\n },\n testDescribe: \"DateRangePicker\",\n};\n\nexport const tagInputMeta: ComponentMeta = {\n name: \"TagInput\",\n category: \"core\",\n description:\n \"태그 입력 컴포넌트. 텍스트를 입력하고 Enter로 태그를 추가, Backspace로 삭제합니다.\",\n slug: \"tag-input\",\n exports: [\"TagInput\"],\n keyboardShortcuts: [\n { keys: \"Enter\", action: \"태그 추가\" },\n { keys: \"Backspace\", action: \"마지막 태그 삭제 (입력 비어있을 때)\" },\n { keys: \"←/→\", action: \"태그 간 이동 (Composite roving tabindex)\" },\n { keys: \"Delete\", action: \"포커스된 태그 삭제\" },\n { keys: \"Ctrl+Z\", action: \"실행취소\" },\n { keys: \"Ctrl+Shift+Z\", action: \"다시실행\" },\n ],\n props: {\n TagInput: [\n {\n name: \"value\",\n type: \"string[]\",\n description: \"제어 모드: 현재 태그 배열\",\n },\n {\n name: \"onChange\",\n type: \"(tags: string[]) => void\",\n description: \"태그 변경 핸들러\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n default: '\"Add tag...\"',\n description: \"입력 플레이스홀더\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"입력 필드 레이블\",\n },\n {\n name: \"maxTags\",\n type: \"number\",\n description: \"최대 태그 수\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n default: \"false\",\n description: \"비활성화 상태\",\n },\n {\n name: \"suggestions\",\n type: \"string[]\",\n description: \"자동완성 드롭다운에 표시할 추천 태그 목록\",\n },\n {\n name: \"delimiters\",\n type: \"(string | RegExp)[]\",\n default: '[\",\", \";\", \"\\\\n\"]',\n description: \"붙여넣기 시 태그를 분할할 구분자 목록\",\n },\n {\n name: \"allowDuplicates\",\n type: \"boolean\",\n default: \"false\",\n description: \"중복 태그 허용 여부\",\n },\n ],\n },\n testDescribe: \"TagInput\",\n};\n\nexport const colorPickerMeta: ComponentMeta = {\n name: \"ColorPicker\",\n category: \"core\",\n description: \"색상 선택 컴포넌트. 프리셋 팔레트와 hex 입력을 지원합니다.\",\n slug: \"color-picker\",\n exports: [\"ColorPicker\"],\n props: {\n ColorPicker: [\n {\n name: \"value\",\n type: \"string\",\n description: \"제어 모드: hex 색상 값 (예: '#3b82f6')\",\n },\n {\n name: \"onChange\",\n type: \"(color: string) => void\",\n description: \"색상 변경 핸들러\",\n },\n {\n name: \"presets\",\n type: \"string[]\",\n description: \"프리셋 색상 배열 (기본 16색)\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"입력 필드 레이블\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n default: \"false\",\n description: \"비활성화 상태\",\n },\n ],\n },\n testDescribe: \"ColorPicker\",\n};\n\nexport const iconPickerMeta: ComponentMeta = {\n name: \"IconPicker\",\n category: \"core\",\n description:\n \"아이콘 선택 컴포넌트. 검색, 그룹별 분류, semantic key 기반 Lucide 아이콘과 커스텀 ReactNode를 지원합니다.\",\n slug: \"icon-picker\",\n exports: [\"IconPicker\"],\n props: {\n IconPicker: [\n {\n name: \"value\",\n type: \"string\",\n description: \"제어 모드: 선택된 아이콘 ID\",\n },\n {\n name: \"onChange\",\n type: \"(iconId: string) => void\",\n description: \"아이콘 변경 핸들러\",\n },\n {\n name: \"icons\",\n type: \"IconDef[]\",\n description: \"아이콘 목록 (기본 24개 Lucide 아이콘 제공)\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"입력 필드 레이블\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n default: \"false\",\n description: \"비활성화 상태\",\n },\n ],\n },\n testDescribe: \"IconPicker\",\n};\n\nexport const stepBuilderMeta: ComponentMeta = {\n name: \"StepBuilder\",\n category: \"core\",\n description: \"순서가 있는 단계를 추가, 제거, 재정렬할 수 있는 빌더 컴포넌트.\",\n slug: \"step-builder\",\n exports: [\"StepBuilder\"],\n props: {\n StepBuilder: [\n {\n name: \"steps\",\n type: \"StepDef[]\",\n required: true,\n description: \"단계 배열 ({ id, label, description? })\",\n },\n {\n name: \"onChange\",\n type: \"(steps: StepDef[]) => void\",\n required: true,\n description: \"단계 변경 핸들러\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"빌더 레이블\",\n },\n {\n name: \"maxSteps\",\n type: \"number\",\n description: \"최대 단계 수\",\n },\n ],\n },\n testDescribe: \"StepBuilder\",\n};\n\nexport const conditionBuilderMeta: ComponentMeta = {\n name: \"ConditionBuilder\",\n category: \"core\",\n description:\n \"AND/OR 로직으로 조건 그룹을 구성하는 빌더. 속성, 연산자, 값을 조합합니다.\",\n slug: \"condition-builder\",\n exports: [\"ConditionBuilder\"],\n props: {\n ConditionBuilder: [\n {\n name: \"groups\",\n type: \"ConditionGroup[]\",\n required: true,\n description: \"조건 그룹 배열\",\n },\n {\n name: \"onChange\",\n type: \"(groups: ConditionGroup[]) => void\",\n required: true,\n description: \"그룹 변경 핸들러\",\n },\n {\n name: \"properties\",\n type: \"string[]\",\n description: \"선택 가능한 속성 목록 (기본 10개 제공)\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"빌더 레이블\",\n },\n {\n name: \"nested\",\n type: \"boolean\",\n default: \"false\",\n description: \"중첩 AND/OR 그룹 활성화\",\n },\n {\n name: \"maxDepth\",\n type: \"number\",\n default: \"3\",\n description: \"최대 중첩 깊이\",\n },\n {\n name: \"conditionTypes\",\n type: \"Record<string, ConditionTypeRenderer>\",\n description: \"이질적 조건 타입 렌더러 레지스트리\",\n },\n {\n name: \"onPreview\",\n type: \"(groups: ConditionGroup[]) => void\",\n description: \"조건 변경 시 미리보기 콜백\",\n },\n {\n name: \"previewCount\",\n type: \"number\",\n description: \"매치 카운트 표시 (toLocaleString 포맷)\",\n },\n {\n name: \"addNestedGroupLabel\",\n type: \"string\",\n default: '\"Add nested group\"',\n description: \"중첩 그룹 추가 버튼 텍스트\",\n },\n ],\n },\n testDescribe: \"ConditionBuilder\",\n};\n\nexport const popoverMeta: ComponentMeta = {\n name: \"Popover\",\n category: \"core\",\n description:\n \"Popover 프리미티브 래퍼. 트리거 요소에 연결된 플로팅 콘텐츠를 표시합니다.\",\n slug: \"popover\",\n exports: [\"PopoverRoot\", \"PopoverTrigger\", \"PopoverContent\", \"PopoverClose\"],\n keyboardShortcuts: [\n { keys: \"Esc\", action: \"팝오버 닫기\" },\n { keys: \"Enter / Space\", action: \"트리거 활성화\" },\n ],\n props: {\n PopoverContent: [\n {\n name: \"gutter\",\n type: \"number\",\n default: \"8\",\n description: \"트리거와의 간격 (px)\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n testDescribe: \"Popover\",\n};\n\nexport const dropdownMenuMeta: ComponentMeta = {\n name: \"DropdownMenu\",\n category: \"core\",\n description:\n \"Menu Core 위의 간편 래퍼. 단일 트리거 드롭다운 메뉴에 특화되었습니다.\",\n slug: \"dropdown-menu\",\n exports: [\n \"DropdownMenu\",\n \"DropdownTrigger\",\n \"DropdownContent\",\n \"DropdownItem\",\n \"DropdownSeparator\",\n ],\n // DropdownMenu = MenuRoot alias — DOM은 MenuRoot의 ID로 식별됨.\n domlessExports: [\"DropdownMenu\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"메뉴 항목 탐색\" },\n { keys: \"Enter / Space\", action: \"항목 선택\" },\n { keys: \"Esc\", action: \"메뉴 닫기\" },\n ],\n props: {\n DropdownContent: [\n {\n name: \"gutter\",\n type: \"number\",\n default: \"4\",\n description: \"트리거와의 간격 (px)\",\n },\n ],\n DropdownItem: [\n {\n name: \"variant\",\n type: '\"default\" | \"destructive\"',\n default: '\"default\"',\n description: \"메뉴 아이템 시각 변형. destructive는 위험 작업 강조\",\n },\n {\n name: \"onClick\",\n type: \"() => void\",\n description: \"항목 클릭 핸들러\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n description: \"비활성 상태\",\n },\n ],\n },\n testDescribe: \"DropdownMenu\",\n};\n\nexport const numberInputMeta: ComponentMeta = {\n name: \"NumberInput\",\n category: \"core\",\n description:\n \"숫자 입력 컴포넌트. +/- 버튼, nullable/clear, unit suffix, invalid draft alert, min/max, step, 키보드 화살표를 지원합니다.\",\n slug: \"number-input\",\n exports: [\"NumberInput\"],\n keyboardShortcuts: [\n { keys: \"↑\", action: \"값 증가 (step 단위)\" },\n { keys: \"↓\", action: \"값 감소 (step 단위)\" },\n ],\n props: {\n NumberInput: [\n {\n name: \"value\",\n type: \"number | null\",\n description: \"제어 모드 값. nullable=true일 때 null 허용\",\n },\n {\n name: \"defaultValue\",\n type: \"number | null\",\n default: \"0\",\n description: \"비제어 모드 초기값. nullable=true일 때 null 허용\",\n },\n {\n name: \"onChange\",\n type: \"(value: number | null) => void\",\n description: \"값 변경 핸들러\",\n },\n {\n name: \"nullable\",\n type: \"boolean\",\n default: \"false\",\n description: \"빈 값을 null로 커밋할지 여부\",\n },\n {\n name: \"clearable\",\n type: \"boolean\",\n default: \"false\",\n description: \"nullable 값 지우기 버튼 표시\",\n },\n { name: \"min\", type: \"number\", description: \"최솟값\" },\n { name: \"max\", type: \"number\", description: \"최댓값\" },\n {\n name: \"step\",\n type: \"number\",\n default: \"1\",\n description: \"증감 단위\",\n },\n { name: \"label\", type: \"string\", description: \"라벨 텍스트\" },\n {\n name: \"unit\",\n type: \"ReactNode\",\n description: \"입력값 단위 suffix\",\n },\n { name: \"disabled\", type: \"boolean\", description: \"비활성 상태\" },\n {\n name: \"disabledReason\",\n type: \"string\",\n description: \"aria-disabled 상태에서 노출할 비활성 사유\",\n },\n {\n name: \"labels\",\n type: \"NumberInputLabels\",\n description: \"입력/증감/clear/invalid 접근성 문구\",\n },\n ],\n },\n testDescribe: \"NumberInput\",\n};\n\nexport const sliderMeta: ComponentMeta = {\n name: \"Slider\",\n category: \"core\",\n description:\n \"범위 슬라이더 입력. native range input 래핑, 범위로 정규화된 값/ARIA 상태, 값 표시와 포맷 함수를 지원합니다.\",\n slug: \"slider\",\n exports: [\"Slider\"],\n props: {\n Slider: [\n { name: \"value\", type: \"number\", description: \"제어 모드 값\" },\n {\n name: \"defaultValue\",\n type: \"number\",\n default: \"0\",\n description: \"비제어 모드 초기값\",\n },\n {\n name: \"onChange\",\n type: \"(value: number) => void\",\n description: \"값 변경 핸들러\",\n },\n { name: \"min\", type: \"number\", default: \"0\", description: \"최솟값\" },\n { name: \"max\", type: \"number\", default: \"100\", description: \"최댓값\" },\n { name: \"step\", type: \"number\", default: \"1\", description: \"증감 단위\" },\n { name: \"label\", type: \"string\", description: \"레이블 텍스트\" },\n {\n name: \"showValue\",\n type: \"boolean\",\n default: \"false\",\n description: \"현재 값 표시 여부\",\n },\n {\n name: \"formatValue\",\n type: \"(value: number) => string\",\n description: \"값 포맷 함수\",\n },\n { name: \"disabled\", type: \"boolean\", description: \"비활성화\" },\n { name: \"className\", type: \"string\", description: \"최외곽 CSS 클래스\" },\n ],\n },\n dependencies: [],\n testDescribe: \"Slider\",\n};\n\nexport const pageHeaderMeta: ComponentMeta = {\n name: \"PageHeader\",\n category: \"core\",\n description:\n \"페이지 제목, 설명, 액션 슬롯을 제공하는 레이아웃 헤더 컴포넌트.\",\n slug: \"page-header\",\n exports: [\"PageHeader\"],\n props: {\n PageHeader: [\n {\n name: \"title\",\n type: \"string\",\n required: true,\n description: \"페이지 제목\",\n },\n {\n name: \"description\",\n type: \"string\",\n description: \"제목 아래 설명 텍스트\",\n },\n {\n name: \"actions\",\n type: \"ReactNode\",\n description: \"오른쪽에 표시할 액션 슬롯 (버튼 등)\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n testDescribe: \"PageHeader\",\n};\n\nexport const scrollAreaMeta: ComponentMeta = {\n name: \"ScrollArea\",\n category: \"core\",\n description:\n \"커스텀 스크롤바를 제공하는 스크롤 컨테이너. 수직/수평/양방향 지원.\",\n slug: \"scroll-area\",\n exports: [\"ScrollArea\"],\n props: {\n ScrollArea: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"스크롤할 콘텐츠\",\n },\n {\n name: \"orientation\",\n type: '\"vertical\" | \"horizontal\" | \"both\"',\n default: '\"vertical\"',\n description: \"스크롤 방향\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n testDescribe: \"ScrollArea\",\n};\n\nexport const containerMeta: ComponentMeta = {\n name: \"Container\",\n category: \"core\",\n description:\n \"최대 너비 제약과 중앙 정렬을 제공하는 래퍼. 페이지 콘텐츠 폭 제한용.\",\n slug: \"container\",\n exports: [\"Container\"],\n props: {\n Container: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"래핑할 콘텐츠\",\n },\n {\n name: \"maxWidth\",\n type: '\"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"full\"',\n default: '\"xl\"',\n description: \"최대 너비 크기\",\n },\n {\n name: \"center\",\n type: \"boolean\",\n default: \"true\",\n description: \"중앙 정렬 여부 (mx-auto)\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n testDescribe: \"Container\",\n};\n\nexport const sectionMeta: ComponentMeta = {\n name: \"Section\",\n category: \"core\",\n description:\n \"시맨틱 스페이싱 블록. 제목이 있으면 aria-labelledby를 자동 설정합니다.\",\n slug: \"section\",\n exports: [\"Section\"],\n props: {\n Section: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"섹션 콘텐츠\",\n },\n { name: \"title\", type: \"string\", description: \"섹션 제목 (h3)\" },\n {\n name: \"description\",\n type: \"string\",\n description: \"제목 아래 설명 텍스트\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n testDescribe: \"Section\",\n};\n\nexport const resizableMeta: ComponentMeta = {\n name: \"Resizable\",\n category: \"core\",\n description:\n \"react-resizable-panels 래퍼. 드래그로 크기를 조절할 수 있는 패널 분할 레이아웃.\",\n slug: \"resizable\",\n exports: [\"ResizablePanelGroup\", \"ResizablePanel\", \"ResizableHandle\"],\n props: {\n ResizablePanelGroup: [\n {\n name: \"direction\",\n type: '\"horizontal\" | \"vertical\"',\n required: true,\n description: \"패널 분할 방향\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"ResizablePanel + ResizableHandle 조합\",\n },\n {\n name: \"id\",\n type: \"string\",\n description: \"그룹과 defaultLayout의 패널 크기를 식별하는 고유 ID\",\n },\n {\n name: \"defaultLayout\",\n type: \"Record<string, number>\",\n description: \"패널 ID별 초기 비율(0-100)\",\n },\n {\n name: \"onLayoutChanged\",\n type: \"(layout: Record<string, number>) => void\",\n description: \"드래그가 끝난 뒤 확정된 레이아웃 콜백\",\n },\n {\n name: \"groupRef\",\n type: \"Ref<ResizablePanelGroupHandle>\",\n description: \"레이아웃 조회·설정을 위한 명령형 그룹 ref\",\n },\n {\n name: \"autoSaveId\",\n type: \"string\",\n description: \"id의 deprecated 별칭\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n ResizablePanel: [\n {\n name: \"defaultSize\",\n type: \"number | string\",\n description: \"초기 크기. 숫자는 퍼센트, 문자열은 명시한 CSS 단위\",\n },\n {\n name: \"minSize\",\n type: \"number | string\",\n description: \"최소 크기. 숫자는 퍼센트\",\n },\n {\n name: \"maxSize\",\n type: \"number | string\",\n description: \"최대 크기. 숫자는 퍼센트\",\n },\n {\n name: \"collapsible\",\n type: \"boolean\",\n default: \"false\",\n description: \"최소 크기 이하 시 접히기 허용\",\n },\n {\n name: \"onResize\",\n type: \"(size: ResizablePanelSize, id?: string | number, previous?: ResizablePanelSize) => void\",\n description: \"패널 크기 변경 콜백\",\n },\n {\n name: \"panelRef\",\n type: \"Ref<ResizablePanelHandle>\",\n description: \"접기·펼치기·크기 제어를 위한 명령형 패널 ref\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"패널 콘텐츠\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n ResizableHandle: [\n {\n name: \"withHandle\",\n type: \"boolean\",\n default: \"false\",\n description: \"시각적 드래그 핸들 표시\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n description: \"드래그 및 키보드 리사이즈 비활성화\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n testDescribe: \"Resizable\",\n};\n\nexport const blockLayoutMeta: ComponentMeta = {\n name: \"BlockLayout\",\n category: \"core\",\n description:\n \"Block 루트 레이아웃. 자식 간 section spacing과 선택적 시맨틱 inset을 제공하고 loading prop으로 LoadingOverlay를 자동 래핑합니다.\",\n slug: \"block-layout\",\n exports: [\"BlockLayout\"],\n props: {\n BlockLayout: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"Block 콘텐츠\",\n },\n {\n name: \"loading\",\n type: \"boolean\",\n description: \"로딩 상태. 설정 시 LoadingOverlay로 자동 래핑\",\n },\n {\n name: \"loadingLabel\",\n type: \"string\",\n description: \"LoadingOverlay 접근성 레이블\",\n },\n {\n name: \"spacing\",\n type: '\"section\" | \"group\" | \"element\" | \"none\"',\n default: '\"section\"',\n description:\n \"Block 최상위 자식 사이 간격. 데이터 밀도가 높은 Block는 group/element로 낮출 수 있음\",\n },\n {\n name: \"inset\",\n type: '\"section\" | \"group\" | \"element\" | \"none\"',\n description:\n \"Block 안쪽 여백. 페이지 콘텐츠 경계에는 section을 사용하고, 이미 여백을 제공하는 Shell 안에서는 생략\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n testDescribe: \"BlockLayout\",\n examples: [\n {\n title: \"Block 루트\",\n code: `import { BlockLayout, PageHeader } from \"@reopt-ai/opt-ui\";\n\n<BlockLayout loading={isLoading} spacing=\"section\" inset=\"section\">\n <PageHeader title=\"대시보드\" description=\"프로젝트 현황\" />\n <section>콘텐츠 영역</section>\n</BlockLayout>`,\n },\n ],\n};\n\nexport const createBlockMeta: ComponentMeta = {\n name: \"createBlock\",\n category: \"core\",\n description:\n \"Block 팩토리 함수. BlockLayout 래핑을 구조적으로 강제하여 loading/className 처리를 자동화합니다.\",\n slug: \"create-block\",\n exports: [\"createBlock\"],\n props: {\n createBlock: [\n {\n name: \"name\",\n type: \"string\",\n required: true,\n description: \"컴포넌트 displayName\",\n },\n {\n name: \"render\",\n type: \"(props: Omit<P, 'loading' | 'className'>) => ReactNode\",\n required: true,\n description: \"콘텐츠를 반환하는 렌더 함수\",\n },\n {\n name: \"options.layoutClassName\",\n type: \"string\",\n description: \"BlockLayout에 전달할 기본 className\",\n },\n ],\n },\n testDescribe: \"createBlock\",\n examples: [\n {\n title: \"Block 팩토리\",\n code: `import { createBlock, PageHeader } from \"@reopt-ai/opt-ui\";\n\ninterface MyDashboardProps { title: string; count: number }\n\nconst MyDashboard = createBlock<MyDashboardProps>(\n \"MyDashboard\",\n ({ title, count }) => (\n <>\n <PageHeader title={title} />\n <p>항목 수: {count}</p>\n </>\n ),\n);\n\n// loading, className은 자동 처리\n<MyDashboard title=\"개요\" count={42} loading={false} />`,\n },\n ],\n};\n\nexport const logoMeta: ComponentMeta = {\n name: \"Logo\",\n category: \"core\",\n description:\n \"아이콘+텍스트 조합, 이미지, 링크 래핑을 지원하는 로고 컴포넌트. Sidebar 등에서 활용.\",\n slug: \"logo\",\n exports: [\"Logo\"],\n props: {\n Logo: [\n { name: \"src\", type: \"string\", description: \"로고 이미지 URL\" },\n {\n name: \"icon\",\n type: \"ReactNode\",\n description: \"로고 아이콘 — src 미설정 시 표시\",\n },\n { name: \"text\", type: \"string\", description: \"텍스트 레이블\" },\n {\n name: \"alt\",\n type: \"string\",\n default: '\"Logo\"',\n description: \"이미지 alt 텍스트\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"크기 (sm=24px, md=32px, lg=40px)\",\n },\n {\n name: \"href\",\n type: \"string\",\n description: \"링크 URL — 설정 시 <a>로 래핑\",\n },\n { name: \"onClick\", type: \"() => void\", description: \"클릭 핸들러\" },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n testDescribe: \"Logo\",\n};\n\nexport const drawerMeta: ComponentMeta = {\n name: \"Drawer\",\n category: \"core\",\n description:\n \"사이드/하단 슬라이드 패널. Dialog 기반 compound 패턴으로 접근성을 보장합니다.\",\n slug: \"drawer\",\n exports: [\"DrawerRoot\", \"DrawerPanel\", \"DrawerClose\"],\n keyboardShortcuts: [\n { keys: \"Esc\", action: \"드로어 닫기\" },\n { keys: \"Tab\", action: \"드로어 내부 포커스 이동\" },\n ],\n props: {\n DrawerRoot: [\n { name: \"open\", type: \"boolean\", description: \"제어 모드 열림 상태\" },\n {\n name: \"onClose\",\n type: \"() => void\",\n description: \"닫힘 콜백\",\n },\n ],\n DrawerPanel: [\n {\n name: \"side\",\n type: '\"left\" | \"right\" | \"bottom\"',\n default: '\"right\"',\n description: \"슬라이드 방향\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\" | \"full\"',\n default: '\"md\"',\n description: \"패널 크기\",\n },\n {\n name: \"swipeToDismiss\",\n type: \"boolean\",\n default: \"true\",\n description: \"가장자리 방향으로 드래그해 닫기 활성화\",\n },\n {\n name: \"swipeDismissThreshold\",\n type: \"number\",\n default: \"80\",\n description: \"닫힘 커밋에 필요한 드래그 거리(px)\",\n },\n ],\n },\n ariaRole: \"dialog\",\n testDescribe: \"Drawer\",\n};\n\nexport const paginationMeta: ComponentMeta = {\n name: \"Pagination\",\n category: \"core\",\n description:\n \"페이지 넘김 네비게이션. ellipsis 포함 페이지 번호, compact/count variant, totalPages/cursor pagination, Prev/Next 버튼을 제공합니다.\",\n slug: \"pagination\",\n exports: [\"Pagination\"],\n props: {\n Pagination: [\n {\n name: \"totalItems\",\n type: \"number\",\n description: \"전체 항목 수\",\n },\n {\n name: \"totalPages\",\n type: \"number\",\n description: \"전체 페이지 수. 전체 항목 수를 모를 때 사용\",\n },\n {\n name: \"hasMore\",\n type: \"boolean\",\n description: \"cursor pagination에서 다음 페이지 존재 여부\",\n },\n {\n name: \"pageSize\",\n type: \"number\",\n description: \"페이지당 항목 수\",\n },\n {\n name: \"currentPage\",\n type: \"number\",\n required: true,\n description: \"현재 페이지 (1부터 시작)\",\n },\n {\n name: \"onPageChange\",\n type: \"(page: number) => void\",\n required: true,\n description: \"페이지 변경 콜백\",\n },\n {\n name: \"showPageNumbers\",\n type: \"boolean\",\n default: \"true\",\n description: \"페이지 번호 표시 여부\",\n },\n {\n name: \"siblingCount\",\n type: \"number\",\n default: \"1\",\n description: \"현재 페이지 좌우 표시할 페이지 수\",\n },\n {\n name: \"variant\",\n type: '\"pages\" | \"count\" | \"compact\" | \"none\"',\n default: '\"pages\"',\n description: \"중앙 표시 방식\",\n },\n {\n name: \"isDisabled\",\n type: \"boolean\",\n default: \"false\",\n description: \"전체 pagination 비활성화\",\n },\n {\n name: \"label\",\n type: \"string\",\n default: '\"Pagination\"',\n description: \"navigation landmark 접근성 라벨\",\n },\n {\n name: \"labels\",\n type: \"PaginationLabels\",\n description: \"Prev/Next/page/count 접근성 및 표시 문구\",\n },\n ],\n },\n ariaRole: \"navigation\",\n testDescribe: \"Pagination\",\n};\n\nexport const virtualListMeta: ComponentMeta = {\n name: \"VirtualList\",\n category: \"core\",\n description:\n \"가상 스크롤 리스트. 대량 데이터를 윈도잉 기법으로 효율적으로 렌더링합니다.\",\n slug: \"virtual-list\",\n exports: [\"VirtualList\"],\n props: {\n VirtualList: [\n {\n name: \"items\",\n type: \"T[]\",\n required: true,\n description: \"렌더링할 항목 배열\",\n },\n {\n name: \"renderItem\",\n type: \"(item: T, index: number) => ReactNode\",\n required: true,\n description: \"항목 렌더 함수\",\n },\n {\n name: \"itemHeight\",\n type: \"number\",\n required: true,\n description: \"각 항목의 고정 높이(px)\",\n },\n {\n name: \"overscan\",\n type: \"number\",\n default: \"3\",\n description: \"뷰포트 밖에 미리 렌더링할 항목 수\",\n },\n ],\n },\n testDescribe: \"VirtualList\",\n};\n\nexport const loadingOverlayMeta: ComponentMeta = {\n name: \"LoadingOverlay\",\n category: \"core\",\n description:\n \"로딩 오버레이. 중복 status 없이 하나의 aria-busy 라이브 영역으로 콘텐츠 위 로딩 상태를 표시합니다.\",\n slug: \"loading-overlay\",\n exports: [\"LoadingOverlay\"],\n props: {\n LoadingOverlay: [\n {\n name: \"loading\",\n type: \"boolean\",\n required: true,\n description: \"로딩 상태\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"감싸는 콘텐츠\",\n },\n {\n name: \"label\",\n type: \"string\",\n default: '\"Loading…\"',\n description: \"로딩 텍스트\",\n },\n ],\n },\n ariaRole: \"status\",\n dependencies: [{ slug: \"spinner\", category: \"core\" }],\n testDescribe: \"LoadingOverlay\",\n};\n\nexport const starRatingMeta: ComponentMeta = {\n name: \"StarRating\",\n category: \"core\",\n description:\n \"1~N점 별점을 선택하는 인터랙티브 레이팅 입력. 읽기 전용 표시도 지원.\",\n slug: \"star-rating\",\n exports: [\"StarRating\"],\n props: {\n StarRating: [\n {\n name: \"value\",\n type: \"number\",\n description: \"현재 선택된 별점\",\n },\n {\n name: \"onChange\",\n type: \"(value: number) => void\",\n description: \"별점 변경 콜백\",\n },\n {\n name: \"max\",\n type: \"number\",\n default: \"5\",\n description: \"최대 별 개수\",\n },\n {\n name: \"readOnly\",\n type: \"boolean\",\n default: \"false\",\n description: \"읽기 전용 모드\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"별 아이콘 크기\",\n },\n ],\n },\n keyboardShortcuts: [\n { keys: \"ArrowRight / ArrowUp\", action: \"별점 1 증가\" },\n { keys: \"ArrowLeft / ArrowDown\", action: \"별점 1 감소\" },\n { keys: \"Home\", action: \"별점 1로 설정\" },\n { keys: \"End\", action: \"별점 최대로 설정\" },\n ],\n testDescribe: \"StarRating\",\n};\n\nexport const errorBoundaryMeta: ComponentMeta = {\n name: \"ErrorBoundary\",\n category: \"core\",\n description:\n \"React 에러 바운더리. 자식 컴포넌트 렌더 에러를 잡아 fallback UI를 표시합니다.\",\n slug: \"error-boundary\",\n exports: [\"ErrorBoundary\"],\n // class component / transparent wrapper — children passthrough 또는 fallback\n // Alert를 반환할 뿐 자체 DOM이 없음.\n domlessExports: [\"ErrorBoundary\"],\n props: {\n ErrorBoundary: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"에러를 감시할 자식 컴포넌트\",\n },\n {\n name: \"fallback\",\n type: \"ReactNode | ((error: Error) => ReactNode)\",\n description:\n \"에러 발생 시 표시할 UI. 함수 전달 시 에러 객체를 인자로 받음. 미지정 시 Alert error 표시\",\n },\n {\n name: \"onError\",\n type: \"(error: Error, info: ErrorInfo) => void\",\n description: \"에러 발생 시 호출되는 콜백 (에러 리포팅용)\",\n },\n ],\n },\n testDescribe: \"ErrorBoundary\",\n};\n\nexport const commandMeta: ComponentMeta = {\n name: \"Command\",\n category: \"core\",\n description:\n \"cmdk 스타일 명령 anatomy. 자동 필터링 + 키보드 내비게이션. 인라인 또는 CommandDialog로 사용.\",\n slug: \"command\",\n exports: [\n \"Command\",\n \"CommandDialog\",\n \"CommandInput\",\n \"CommandList\",\n \"CommandEmpty\",\n \"CommandGroup\",\n \"CommandItem\",\n \"CommandSeparator\",\n \"CommandShortcut\",\n ],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"활성 항목 이동\" },\n { keys: \"Home / End\", action: \"처음/마지막 항목\" },\n { keys: \"Enter\", action: \"활성 항목 선택\" },\n { keys: \"Esc\", action: \"dialog 닫기\" },\n ],\n props: {\n Command: [\n {\n name: \"shouldFilter\",\n type: \"boolean\",\n description: \"자동 필터링 여부 (기본 true)\",\n },\n {\n name: \"filter\",\n type: \"(value: string, search: string, keywords: string[]) => boolean\",\n description: \"커스텀 필터 함수 (기본: case-insensitive substring)\",\n },\n ],\n CommandInput: [\n {\n name: \"trailing\",\n type: \"ReactNode\",\n description: \"검색 입력 우측에 표시할 보조 콘텐츠\",\n },\n {\n name: \"wrapperClassName\",\n type: \"string\",\n description: \"입력 wrapper className\",\n },\n ],\n CommandList: [\n {\n name: \"aria-label\",\n type: \"string\",\n default: '\"Commands\"',\n description: \"listbox 접근성 라벨\",\n },\n ],\n CommandItem: [\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"이 항목의 검색 가능 값 (고유 식별자)\",\n },\n {\n name: \"keywords\",\n type: \"string[]\",\n description: \"value에 더해 검색어와 비교할 추가 키워드\",\n },\n {\n name: \"onSelect\",\n type: \"(value: string) => void\",\n description: \"Enter/클릭 시 호출\",\n },\n ],\n },\n testDescribe: \"Command\",\n};\n\nexport const shaderSurfaceMeta: ComponentMeta = {\n name: \"ShaderSurface\",\n category: \"core\",\n description:\n \"ogl 기반 애니메이션 WebGL 셰이더 배경. 럭셔리 프리셋(메탈릭/실크/유리 등) + 색·파라미터로 배경·카드 배경을 만든다. 정지 프레임·PNG 캡처·WebGL 폴백 지원.\",\n slug: \"shader-surface\",\n exports: [\"ShaderSurface\"],\n props: {\n ShaderSurface: [\n {\n name: \"preset\",\n type: \"ShaderPresetId\",\n required: true,\n description: \"렌더할 셰이더 프리셋 id\",\n },\n {\n name: \"colors\",\n type: \"string[]\",\n description: \"hex 색상 배열 (미지정 시 프리셋 기본 색)\",\n },\n { name: \"scale\", type: \"number\", description: \"패턴 스케일\" },\n { name: \"speed\", type: \"number\", description: \"애니메이션 속도\" },\n { name: \"distortion\", type: \"number\", description: \"왜곡 강도\" },\n { name: \"grain\", type: \"number\", description: \"필름 그레인 양\" },\n { name: \"contrast\", type: \"number\", description: \"하이라이트 대비\" },\n { name: \"angle\", type: \"number\", description: \"회전 각도(도)\" },\n {\n name: \"paused\",\n type: \"boolean\",\n description: \"true면 단일 프레임만 렌더 (카드 배경 등)\",\n },\n {\n name: \"dpr\",\n type: \"number\",\n description: \"device pixel ratio 상한 (기본 min(dpr, 2))\",\n },\n ],\n },\n testDescribe: \"ShaderSurface\",\n};\n\n// ── Data primitives (eui parity: Token / Facet / Expression / TextTruncate /\n// Highlight / ScreenReaderLive / ColorPalette / InlineEdit / KeyPadMenu) ──\n\nexport const fieldTokenMeta: ComponentMeta = {\n name: \"FieldToken\",\n category: \"core\",\n description:\n \"필드 타입을 글리프 하나로 표현하는 토큰. 문자열·숫자·날짜·IP·지오 등 분석 스키마 타입마다 고정된 아이콘과 팔레트 슬롯을 부여해 필드 목록·컬럼 헤더·속성 테이블 전역에서 같은 어휘를 쓴다.\",\n slug: \"field-token\",\n exports: [\"FieldToken\", \"FIELD_TYPE_TOKENS\", \"resolveFieldType\"],\n props: {\n FieldToken: [\n {\n name: \"type\",\n type: \"FieldDataType\",\n required: true,\n description: \"필드 타입. 백엔드 원본 타입은 resolveFieldType으로 변환\",\n },\n {\n name: \"size\",\n type: '\"xs\" | \"sm\" | \"md\" | \"lg\"',\n default: '\"sm\"',\n description: \"토큰 크기\",\n },\n {\n name: \"fill\",\n type: '\"subtle\" | \"solid\" | \"none\"',\n default: '\"subtle\"',\n description: \"배경 채우기 방식\",\n },\n {\n name: \"shape\",\n type: '\"square\" | \"circle\"',\n default: '\"square\"',\n description: \"토큰 모양\",\n },\n {\n name: \"title\",\n type: \"string\",\n description: \"접근성 이름. 기본값은 타입 이름\",\n },\n {\n name: \"decorative\",\n type: \"boolean\",\n default: \"false\",\n description: \"인접 텍스트가 타입을 이미 말할 때 접근성 트리에서 제외\",\n },\n { name: \"className\", type: \"string\", description: \"추가 CSS 클래스\" },\n ],\n },\n ariaRole: \"img\",\n testDescribe: \"FieldToken\",\n};\n\nexport const facetMeta: ComponentMeta = {\n name: \"Facet\",\n category: \"core\",\n description:\n \"필드 값 분포를 카운트와 점유율 막대로 보여주고 그 행 자체가 필터가 되는 패싯. 긴 꼬리는 접어 두고 상위 값부터 읽힌다.\",\n slug: \"facet\",\n exports: [\"Facet\", \"FacetGroup\"],\n props: {\n Facet: [\n {\n name: \"item\",\n type: \"FacetItem\",\n required: true,\n description: \"표시할 값\",\n },\n {\n name: \"selected\",\n type: \"boolean\",\n default: \"false\",\n description: \"선택 상태\",\n },\n {\n name: \"onSelect\",\n type: \"(id: string) => void\",\n description: \"선택 콜백\",\n },\n {\n name: \"showShare\",\n type: \"boolean\",\n default: \"true\",\n description: \"점유율 막대 표시\",\n },\n {\n name: \"share\",\n type: \"number\",\n description: \"0–1 점유율. 그룹이 계산해 내려줌\",\n },\n {\n name: \"countFormatter\",\n type: \"(count: number) => string\",\n description: \"카운트 포맷터\",\n },\n {\n name: \"layout\",\n type: '\"vertical\" | \"horizontal\"',\n default: '\"vertical\"',\n description: \"배치 방향\",\n },\n {\n name: \"labels\",\n type: \"FacetGroupLabels\",\n description: \"지역화 문자열\",\n },\n { name: \"className\", type: \"string\", description: \"추가 CSS 클래스\" },\n ],\n FacetGroup: [\n {\n name: \"items\",\n type: \"FacetItem[]\",\n required: true,\n description: \"값 목록\",\n },\n {\n name: \"selected\",\n type: \"string[]\",\n description: \"선택된 id. 생략 시 비제어\",\n },\n {\n name: \"onSelectedChange\",\n type: \"(next: string[]) => void\",\n description: \"선택 변경 콜백\",\n },\n {\n name: \"selection\",\n type: '\"single\" | \"multiple\" | \"none\"',\n default: '\"multiple\"',\n description: \"선택 모드\",\n },\n {\n name: \"layout\",\n type: '\"vertical\" | \"horizontal\"',\n default: '\"vertical\"',\n description: \"배치 방향\",\n },\n {\n name: \"showShare\",\n type: \"boolean\",\n default: \"true\",\n description: \"점유율 막대 표시\",\n },\n {\n name: \"countFormatter\",\n type: \"(count: number) => string\",\n description: \"카운트 포맷터\",\n },\n { name: \"max\", type: \"number\", description: \"접기 전 표시 행 수\" },\n {\n name: \"total\",\n type: \"number\",\n description: \"점유율 분모. 생략 시 카운트 합\",\n },\n {\n name: \"loading\",\n type: \"boolean\",\n default: \"false\",\n description: \"로딩 상태\",\n },\n { name: \"emptyState\", type: \"ReactNode\", description: \"빈 상태 렌더\" },\n {\n name: \"labels\",\n type: \"FacetGroupLabels\",\n description: \"지역화 문자열\",\n },\n { name: \"className\", type: \"string\", description: \"추가 CSS 클래스\" },\n { name: \"aria-label\", type: \"string\", description: \"그룹 접근성 이름\" },\n ],\n },\n ariaRole: \"group\",\n testDescribe: \"Facet\",\n};\n\nexport const expressionMeta: ComponentMeta = {\n name: \"Expression\",\n category: \"core\",\n description:\n \"조건을 폼이 아니라 문장으로 쓰고 그 자리에서 편집하는 표현식 절. 알림 규칙·세그먼트 필터처럼 읽어서 검증해야 하는 조건에 쓴다.\",\n slug: \"expression\",\n exports: [\"Expression\", \"ExpressionGroup\"],\n props: {\n Expression: [\n {\n name: \"description\",\n type: \"ReactNode\",\n required: true,\n description: \"고정되는 절반 (WHEN, IS ABOVE …)\",\n },\n { name: \"value\", type: \"ReactNode\", description: \"편집되는 절반\" },\n {\n name: \"tone\",\n type: \"ExpressionTone\",\n default: '\"accent\"',\n description: \"의미별 색상\",\n },\n {\n name: \"active\",\n type: \"boolean\",\n default: \"false\",\n description: \"편집기 열림 상태\",\n },\n {\n name: \"invalid\",\n type: \"boolean\",\n default: \"false\",\n description: \"유효하지 않은 절\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n default: \"false\",\n description: \"비활성\",\n },\n { name: \"onClick\", type: \"() => void\", description: \"편집기 열기\" },\n {\n name: \"display\",\n type: '\"inline\" | \"stacked\"',\n default: '\"inline\"',\n description: \"문장 흐름 유지 vs 값 아래 배치\",\n },\n { name: \"aria-label\", type: \"string\", description: \"접근성 이름\" },\n { name: \"className\", type: \"string\", description: \"추가 CSS 클래스\" },\n ],\n ExpressionGroup: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"절들\",\n },\n {\n name: \"display\",\n type: '\"sentence\" | \"columns\"',\n default: '\"sentence\"',\n description: \"문장 배치 vs 컬럼 정렬\",\n },\n { name: \"className\", type: \"string\", description: \"추가 CSS 클래스\" },\n { name: \"aria-label\", type: \"string\", description: \"그룹 접근성 이름\" },\n ],\n },\n ariaRole: \"group\",\n testDescribe: \"Expression\",\n};\n\nexport const textTruncateMeta: ComponentMeta = {\n name: \"TextTruncate\",\n category: \"core\",\n description:\n \"실제 폰트로 실제 가용 폭을 측정해 문자열의 식별력이 가장 낮은 부분을 잘라내는 생략. CSS가 못 하는 앞·중간·양끝 생략을 지원하고 전체 문자열은 접근성 트리에 남는다.\",\n slug: \"text-truncate\",\n exports: [\"TextTruncate\"],\n props: {\n TextTruncate: [\n {\n name: \"text\",\n type: \"string\",\n required: true,\n description: \"전체 문자열\",\n },\n {\n name: \"truncation\",\n type: \"TruncationSide\",\n default: '\"startEnd\"',\n description: \"생략 위치: end | start | middle | startEnd\",\n },\n {\n name: \"ellipsis\",\n type: \"string\",\n default: '\"…\"',\n description: \"생략 기호\",\n },\n {\n name: \"width\",\n type: \"number\",\n description: \"고정 폭(px). 생략 시 컨테이너 측정\",\n },\n {\n name: \"children\",\n type: \"(truncated: string) => React.ReactNode\",\n description: \"잘린 문자열을 직접 렌더\",\n },\n { name: \"className\", type: \"string\", description: \"추가 CSS 클래스\" },\n ],\n },\n testDescribe: \"TextTruncate\",\n};\n\nexport const highlightMeta: ComponentMeta = {\n name: \"Highlight\",\n category: \"core\",\n description:\n \"검색어에 해당하는 구간을 <mark>로 표시. 긴 항목 우선 매칭이라 겹치는 검색어도 조각나지 않는다.\",\n slug: \"highlight\",\n exports: [\"Highlight\"],\n props: {\n Highlight: [\n {\n name: \"text\",\n type: \"string\",\n required: true,\n description: \"전체 텍스트\",\n },\n {\n name: \"search\",\n type: \"string | string[]\",\n required: true,\n description: \"검색어 하나 또는 여러 개\",\n },\n {\n name: \"caseSensitive\",\n type: \"boolean\",\n default: \"false\",\n description: \"대소문자 구분\",\n },\n {\n name: \"firstOnly\",\n type: \"boolean\",\n default: \"false\",\n description: \"첫 일치만 표시\",\n },\n { name: \"className\", type: \"string\", description: \"추가 CSS 클래스\" },\n {\n name: \"markClassName\",\n type: \"string\",\n description: \"mark 요소 추가 클래스\",\n },\n ],\n },\n testDescribe: \"Highlight\",\n};\n\nexport const liveRegionMeta: ComponentMeta = {\n name: \"LiveRegion\",\n category: \"core\",\n description:\n \"라이브 뷰의 변화를 스크린 리더에 읽어 주는 영역. 스로틀로 폭주를 요약하고 두 노드를 번갈아 써서 같은 문구도 다시 읽힌다.\",\n slug: \"live-region\",\n exports: [\"LiveRegion\"],\n props: {\n LiveRegion: [\n {\n name: \"message\",\n type: \"string\",\n required: true,\n description: \"안내할 문구\",\n },\n {\n name: \"nonce\",\n type: \"string | number\",\n description: \"문구가 같아도 다시 읽히게 하는 값 (카운터·배치 id)\",\n },\n {\n name: \"politeness\",\n type: '\"polite\" | \"assertive\"',\n default: '\"polite\"',\n description: \"끼어들기 여부\",\n },\n {\n name: \"throttleMs\",\n type: \"number\",\n default: \"0\",\n description: \"안내 병합 간격(ms)\",\n },\n {\n name: \"muted\",\n type: \"boolean\",\n default: \"false\",\n description: \"안내 일시 중단\",\n },\n ],\n },\n ariaRole: \"status\",\n testDescribe: \"LiveRegion\",\n};\n\nexport const colorPaletteMeta: ComponentMeta = {\n name: \"ColorPalette\",\n category: \"core\",\n description:\n \"시각화 색 팔레트를 그 팔레트의 모습 그대로 보여 주고 고르게 하는 컴포넌트. 범주형은 블록, 순차·발산형은 그라디언트로 그려 데이터 종류를 그림이 말한다.\",\n slug: \"color-palette\",\n exports: [\"ColorPaletteDisplay\", \"ColorPalettePicker\", \"THEME_PALETTES\"],\n props: {\n ColorPaletteDisplay: [\n {\n name: \"palette\",\n type: \"ColorPalette\",\n required: true,\n description: \"표시할 팔레트\",\n },\n {\n name: \"render\",\n type: '\"stops\" | \"gradient\"',\n description: \"블록 vs 그라디언트. 기본은 palette.kind에서 결정\",\n },\n {\n name: \"size\",\n type: '\"xs\" | \"sm\" | \"md\" | \"lg\"',\n default: '\"sm\"',\n description: \"스와치 높이\",\n },\n { name: \"aria-label\", type: \"string\", description: \"접근성 이름\" },\n { name: \"className\", type: \"string\", description: \"추가 CSS 클래스\" },\n ],\n ColorPalettePicker: [\n {\n name: \"palettes\",\n type: \"ColorPalette[]\",\n required: true,\n description: \"선택지\",\n },\n { name: \"value\", type: \"string\", description: \"선택된 팔레트 id\" },\n {\n name: \"onValueChange\",\n type: \"(id: string) => void\",\n description: \"선택 콜백\",\n },\n {\n name: \"label\",\n type: \"string\",\n default: '\"Colour palette\"',\n description: \"레이블\",\n },\n {\n name: \"hideLabel\",\n type: \"boolean\",\n default: \"false\",\n description: \"레이블 시각적 숨김\",\n },\n {\n name: \"size\",\n type: '\"xs\" | \"sm\" | \"md\" | \"lg\"',\n default: '\"sm\"',\n description: \"스와치 높이\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n default: \"false\",\n description: \"비활성\",\n },\n { name: \"className\", type: \"string\", description: \"추가 CSS 클래스\" },\n ],\n },\n testDescribe: \"ColorPalette\",\n};\n\nexport const inlineEditMeta: ComponentMeta = {\n name: \"InlineEdit\",\n category: \"core\",\n description:\n \"대시보드 제목·지표 이름처럼 읽히는 횟수가 훨씬 많은 값을 그 자리에서 고치는 편집. Enter 확정, Escape 되돌리기, 거절된 저장은 입력을 유지한다.\",\n slug: \"inline-edit\",\n exports: [\"InlineEdit\"],\n props: {\n InlineEdit: [\n { name: \"value\", type: \"string\", required: true, description: \"현재 값\" },\n {\n name: \"onSave\",\n type: \"(next: string) => boolean | void | Promise<boolean | void>\",\n required: true,\n description: \"저장. false를 반환하면 거절하고 편집을 유지\",\n },\n {\n name: \"as\",\n type: '\"span\" | \"h1\" | \"h2\" | \"h3\" | \"h4\"',\n default: '\"span\"',\n description: \"읽기 모드 요소\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\" | \"xl\"',\n default: '\"md\"',\n description: \"타이포 크기\",\n },\n { name: \"placeholder\", type: \"string\", description: \"입력 자리표시자\" },\n {\n name: \"emptyText\",\n type: \"string\",\n default: '\"Untitled\"',\n description: \"빈 값 표시\",\n },\n {\n name: \"disabled\",\n type: \"boolean\",\n default: \"false\",\n description: \"편집 불가\",\n },\n { name: \"maxLength\", type: \"number\", description: \"최대 길이\" },\n {\n name: \"suffix\",\n type: \"ReactNode\",\n description: \"읽기 모드 텍스트 뒤 요소\",\n },\n {\n name: \"labels\",\n type: \"InlineEditLabels\",\n description: \"지역화 문자열\",\n },\n { name: \"className\", type: \"string\", description: \"추가 CSS 클래스\" },\n ],\n },\n testDescribe: \"InlineEdit\",\n};\n\nexport const keyPadMenuMeta: ComponentMeta = {\n name: \"KeyPadMenu\",\n category: \"core\",\n description:\n \"이름보다 그림으로 알아보기 쉬운 선택지를 타일로 고르는 메뉴. 내부는 실제 radio·checkbox라 키보드와 스크린 리더가 그대로 동작한다.\",\n slug: \"key-pad-menu\",\n exports: [\"KeyPadMenu\"],\n props: {\n KeyPadMenu: [\n {\n name: \"items\",\n type: \"KeyPadItem[]\",\n required: true,\n description: \"타일 목록\",\n },\n {\n name: \"label\",\n type: \"string\",\n required: true,\n description: \"그룹 레이블\",\n },\n {\n name: \"selection\",\n type: '\"single\" | \"multiple\"',\n default: '\"single\"',\n description: \"선택 모드. value·onValueChange의 형태를 결정\",\n },\n { name: \"value\", type: \"string | string[]\", description: \"선택된 id\" },\n {\n name: \"onValueChange\",\n type: \"((next: string) => void) | ((next: string[]) => void)\",\n description: \"선택 콜백. value의 형태를 그대로 받는다\",\n },\n {\n name: \"columns\",\n type: 'number | \"auto\"',\n default: '\"auto\"',\n description: \"행당 타일 수\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\"',\n default: '\"md\"',\n description: \"타일 크기\",\n },\n {\n name: \"hideLabel\",\n type: \"boolean\",\n default: \"false\",\n description: \"레전드 시각적 숨김\",\n },\n { name: \"className\", type: \"string\", description: \"추가 CSS 클래스\" },\n ],\n },\n testDescribe: \"KeyPadMenu\",\n};\n\nexport const coreMetas = [\n fieldTokenMeta,\n facetMeta,\n expressionMeta,\n textTruncateMeta,\n highlightMeta,\n liveRegionMeta,\n colorPaletteMeta,\n inlineEditMeta,\n keyPadMenuMeta,\n textMeta,\n headingMeta,\n kbdMeta,\n separatorMeta,\n otpFieldMeta,\n toggleMeta,\n accordionMeta,\n statCardMeta,\n compositeZoneMeta,\n disclosureMeta,\n tabsMeta,\n selectMeta,\n dialogMeta,\n comboboxMeta,\n menuMeta,\n toolbarMeta,\n formMeta,\n buttonMeta,\n badgeMeta,\n spinnerMeta,\n alertMeta,\n inputMeta,\n switchMeta,\n skeletonMeta,\n textareaMeta,\n avatarMeta,\n progressMeta,\n meterMeta,\n breadcrumbMeta,\n emptyStateMeta,\n cardMeta,\n checkboxMeta,\n radioGroupMeta,\n dateRangePickerMeta,\n tagInputMeta,\n colorPickerMeta,\n iconPickerMeta,\n stepBuilderMeta,\n conditionBuilderMeta,\n popoverMeta,\n dropdownMenuMeta,\n numberInputMeta,\n sliderMeta,\n pageHeaderMeta,\n scrollAreaMeta,\n containerMeta,\n sectionMeta,\n resizableMeta,\n blockLayoutMeta,\n createBlockMeta,\n logoMeta,\n drawerMeta,\n paginationMeta,\n virtualListMeta,\n loadingOverlayMeta,\n starRatingMeta,\n errorBoundaryMeta,\n commandMeta,\n shaderSurfaceMeta,\n];\n","import type { ComponentMeta } from \"@reopt-ai/opt-doc-kit\";\n\n/** @deprecated Chart metadata moved to `@reopt-ai/opt-charts/meta`. */\nexport const visualMetas: ComponentMeta[] = [];\n","import type { ComponentMeta } from \"@reopt-ai/opt-doc-kit\";\n\nexport const faqAccordionMeta: ComponentMeta = {\n name: \"FaqAccordion\",\n category: \"shell\",\n description: \"FAQ 질문/답변 아코디언. Composite + Disclosure 조합.\",\n slug: \"faq-accordion\",\n exports: [\"FaqAccordion\"],\n props: {\n FaqAccordion: [\n {\n name: \"items\",\n type: \"FaqItem[]\",\n required: true,\n description: \"FAQ 항목 배열. { id, question, answer }\",\n },\n ],\n },\n dependencies: [{ slug: \"disclosure\", category: \"core\" }],\n testDescribe: \"FaqAccordion\",\n};\n\nexport const contentTabsMeta: ComponentMeta = {\n name: \"ContentTabs\",\n category: \"shell\",\n description: \"탭 콘텐츠 패널. Tabs primitive 래퍼.\",\n slug: \"content-tabs\",\n exports: [\"ContentTabs\"],\n props: {\n ContentTabs: [\n {\n name: \"tabs\",\n type: \"TabDef[]\",\n required: true,\n description: \"탭 정의 배열. { id, label, content }\",\n },\n {\n name: \"defaultTabId\",\n type: \"string\",\n description: \"초기 선택 탭 ID. 미지정 시 첫 탭\",\n },\n ],\n },\n dependencies: [{ slug: \"tabs\", category: \"core\" }],\n testDescribe: \"ContentTabs\",\n};\n\nexport const dashboardGridMeta: ComponentMeta = {\n name: \"DashboardGrid\",\n category: \"shell\",\n description:\n \"Composite 기반 통계 카드 그리드. 유효한 1–4열 레이아웃과 화살표 키 2D 탐색을 지원합니다.\",\n slug: \"dashboard-grid\",\n exports: [\"DashboardGrid\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓ ← →\", action: \"카드 간 2D 탐색\" },\n { keys: \"Tab\", action: \"다음 섹션으로 이동\" },\n ],\n advancedPatternAnchor: \"dashboard-responsive\",\n advancedPatternDescription: \"반응형 컬럼 조절, 기간 필터 연동 등 고급 패턴\",\n dependencies: [\n { slug: \"stat-card\", category: \"core\" },\n { slug: \"composite-zone\", category: \"core\" },\n ],\n props: {\n DashboardGrid: [\n {\n name: \"stats\",\n type: \"StatCard[]\",\n required: true,\n description: \"통계 데이터 배열. { id, title, value, change, trend }\",\n },\n {\n name: \"columns\",\n type: \"number\",\n default: \"3\",\n description: \"행당 컬럼 수\",\n },\n ],\n },\n testDescribe: \"DashboardGrid\",\n};\n\nexport const searchComboboxMeta: ComponentMeta = {\n name: \"SearchCombobox\",\n category: \"shell\",\n description: \"match-sorter 기반 퍼지 검색 콤보박스.\",\n slug: \"search-combobox\",\n exports: [\"SearchCombobox\"],\n props: {\n SearchCombobox: [\n {\n name: \"items\",\n type: \"string[]\",\n required: true,\n description: \"검색 대상 문자열 목록\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n default: '\"검색...\"',\n description: \"입력 플레이스홀더\",\n },\n {\n name: \"label\",\n type: \"string\",\n default: '\"검색\"',\n description: \"입력 레이블\",\n },\n {\n name: \"onSelect\",\n type: \"(item: string) => void\",\n description: \"항목 선택 핸들러\",\n },\n {\n name: \"labels\",\n type: \"SearchComboboxLabels\",\n description: \"noResults/loading 문구\",\n },\n {\n name: \"async\",\n type: \"boolean\",\n default: \"false\",\n description: \"비동기 검색 모드 활성화\",\n },\n {\n name: \"onSearch\",\n type: \"(query: string) => Promise<string[]>\",\n description: \"async=true일 때 사용할 검색 콜백\",\n },\n {\n name: \"debounceMs\",\n type: \"number\",\n default: \"300\",\n description: \"비동기 검색 디바운스 ms\",\n },\n ],\n },\n dependencies: [{ slug: \"combobox\", category: \"core\" }],\n testDescribe: \"SearchCombobox\",\n examples: [\n {\n title: \"검색 + 선택\",\n code: `import { SearchCombobox } from \"@reopt-ai/opt-ui\";\n\n<SearchCombobox\n items={[\"React\", \"Vue\", \"Angular\", \"Svelte\"]}\n placeholder=\"프레임워크 검색...\"\n onSelect={(item) => console.log(item)}\n/>`,\n },\n ],\n};\n\nexport const statusSelectMeta: ComponentMeta = {\n name: \"StatusSelect\",\n category: \"shell\",\n description: \"색상 인디케이터가 있는 상태 선택 드롭다운.\",\n slug: \"status-select\",\n exports: [\"StatusSelect\"],\n props: {\n StatusSelect: [\n {\n name: \"options\",\n type: \"SelectOption[]\",\n required: true,\n description: \"옵션 목록. { value, label, color? }\",\n },\n { name: \"value\", type: \"string\", description: \"제어 모드: 현재 선택 값\" },\n {\n name: \"onChange\",\n type: \"(value: string) => void\",\n description: \"제어 모드: 값 변경 핸들러\",\n },\n {\n name: \"label\",\n type: \"string\",\n default: '\"상태\"',\n description: \"Select 레이블\",\n },\n ],\n },\n dependencies: [{ slug: \"select\", category: \"core\" }],\n testDescribe: \"StatusSelect\",\n};\n\nexport const editorToolbarMeta: ComponentMeta = {\n name: \"EditorToolbar\",\n category: \"shell\",\n description: \"리치 텍스트 에디터 스타일 툴바. Toolbar + Tooltip 조합.\",\n slug: \"editor-toolbar\",\n exports: [\"EditorToolbar\"],\n props: {\n EditorToolbar: [\n {\n name: \"buttons\",\n type: \"ToolbarButtonDef[]\",\n required: true,\n description: \"버튼 정의. { id, label, icon, separator? }\",\n },\n {\n name: \"onAction\",\n type: \"(id: string) => void\",\n description: \"버튼 클릭 핸들러\",\n },\n {\n name: \"activeButtons\",\n type: \"string[]\",\n default: \"[]\",\n description: \"활성 상태 버튼 ID 배열\",\n },\n ],\n },\n dependencies: [{ slug: \"toolbar\", category: \"core\" }],\n testDescribe: \"EditorToolbar\",\n};\n\nexport const sidebarNavMeta: ComponentMeta = {\n name: \"SidebarNav\",\n category: \"shell\",\n description: \"Composite 기반 사이드바 네비게이션. pathname 자동 동기화.\",\n slug: \"sidebar-nav\",\n exports: [\"SidebarNav\"],\n props: {\n SidebarNav: [\n {\n name: \"items\",\n type: \"NavItemDef[]\",\n required: true,\n description:\n \"네비게이션 항목. { id, label, href, separator?, sectionLabel? }\",\n },\n ],\n },\n testDescribe: \"SidebarNav\",\n};\n\nexport const settingsFormMeta: ComponentMeta = {\n name: \"SettingsForm\",\n category: \"shell\",\n description: \"데이터 기반 설정 폼. 유효성 검증, 라디오, 체크박스 지원.\",\n slug: \"settings-form\",\n exports: [\"SettingsForm\"],\n props: {\n SettingsForm: [\n {\n name: \"fields\",\n type: \"FormFieldDef[]\",\n required: true,\n description: \"폼 필드 정의 배열\",\n },\n {\n name: \"onSubmit\",\n type: \"(values: Record<string, unknown>) => void\",\n description: \"제출 핸들러\",\n },\n ],\n },\n dependencies: [\n { slug: \"form\", category: \"core\" },\n { slug: \"checkbox\", category: \"core\" },\n { slug: \"radio-group\", category: \"core\" },\n { slug: \"switch\", category: \"core\" },\n ],\n testDescribe: \"SettingsForm\",\n examples: [\n {\n title: \"설정 폼\",\n code: `import { SettingsForm } from \"@reopt-ai/opt-ui\";\n\nconst fields = [\n { name: \"username\", label: \"사용자명\", type: \"text\", required: true },\n { name: \"theme\", label: \"테마\", type: \"select\", options: [\"light\", \"dark\"] },\n { name: \"notifications\", label: \"알림\", type: \"switch\" },\n];\n\n<SettingsForm fields={fields} onSubmit={(values) => console.log(values)} />`,\n },\n ],\n};\n\nexport const appMenubarMeta: ComponentMeta = {\n name: \"AppMenubar\",\n category: \"shell\",\n description: \"데스크톱 스타일 메뉴바. 체크박스, 라디오 메뉴 항목 지원.\",\n slug: \"app-menubar\",\n exports: [\"AppMenubar\"],\n props: {\n AppMenubar: [\n {\n name: \"menus\",\n type: \"MenuDef[]\",\n required: true,\n description: \"메뉴 정의 배열. { id, label, items: MenuItemDef[] }\",\n },\n ],\n },\n dependencies: [\n { slug: \"menu\", category: \"core\" },\n { slug: \"kbd\", category: \"core\" },\n ],\n testDescribe: \"AppMenubar\",\n};\n\nexport const commandPaletteMeta: ComponentMeta = {\n name: \"CommandPalette\",\n category: \"shell\",\n description:\n \"Cmd+K 스타일 커맨드 팔레트. Dialog + Combobox + match-sorter 퍼지 검색.\",\n slug: \"command-palette\",\n exports: [\"CommandPalette\"],\n props: {\n CommandPalette: [\n {\n name: \"commands\",\n type: 'Omit<Command, \"action\">[]',\n required: true,\n description: \"커맨드 목록. { id, label, group, shortcut? }\",\n },\n {\n name: \"open\",\n type: \"boolean\",\n required: true,\n description: \"열림 상태\",\n },\n {\n name: \"onOpenChange\",\n type: \"(open: boolean) => void\",\n required: true,\n description: \"상태 변경 핸들러\",\n },\n {\n name: \"onSelect\",\n type: \"(command: Omit<Command, 'action'>) => void\",\n description: \"커맨드 선택 핸들러\",\n },\n {\n name: \"inline\",\n type: \"boolean\",\n default: \"false\",\n description: \"true일 때 풀스크린 Dialog 대신 인라인 팝업으로 렌더링\",\n },\n {\n name: \"labels\",\n type: \"CommandPaletteLabels\",\n description: \"title/description/input/list/empty/escape 문구\",\n },\n {\n name: \"footer\",\n type: \"ReactNode\",\n description: \"명령 목록 아래에 표시할 footer slot\",\n },\n {\n name: \"empty\",\n type: \"ReactNode\",\n description: \"결과가 없을 때 표시할 empty slot\",\n },\n {\n name: \"inputTrailing\",\n type: \"ReactNode\",\n description: \"검색 입력 우측 보조 콘텐츠\",\n },\n ],\n },\n dependencies: [\n { slug: \"dialog\", category: \"core\" },\n { slug: \"combobox\", category: \"core\" },\n { slug: \"kbd\", category: \"core\" },\n ],\n testDescribe: \"CommandPalette\",\n};\n\nexport const commandPaletteTriggerMeta: ComponentMeta = {\n name: \"CommandPaletteTrigger\",\n category: \"shell\",\n description: \"CommandPalette + Cmd+K 키보드 단축키 자동 바인딩.\",\n slug: \"command-palette-trigger\",\n exports: [\"CommandPaletteTrigger\"],\n props: {\n CommandPaletteTrigger: [\n {\n name: \"commands\",\n type: 'Omit<Command, \"action\">[]',\n required: true,\n description: \"커맨드 목록\",\n },\n {\n name: \"onSelect\",\n type: \"(command: Omit<Command, 'action'>) => void\",\n description: \"커맨드 선택 핸들러\",\n },\n {\n name: \"labels\",\n type: \"CommandPaletteTriggerLabels\",\n description: \"내부 CommandPalette에 전달할 title/input/list 문구\",\n },\n ],\n },\n dependencies: [{ slug: \"command-palette\", category: \"shells\" }],\n testDescribe: \"CommandPaletteTrigger\",\n};\n\nexport const deploymentTimelineMeta: ComponentMeta = {\n name: \"DeploymentTimeline\",\n category: \"shell\",\n description: \"배포 단계 타임라인. Composite 기반 키보드 탐색 지원.\",\n slug: \"deployment-timeline\",\n exports: [\"DeploymentTimeline\"],\n props: {\n DeploymentTimeline: [\n {\n name: \"steps\",\n type: \"DeploymentStep[]\",\n required: true,\n description: \"배포 단계 배열. { id, name, status, duration?, detail? }\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"배포 타임라인\"',\n description: \"타임라인 제목\",\n },\n ],\n },\n testDescribe: \"DeploymentTimeline\",\n};\n\nexport const projectSwitcherMeta: ComponentMeta = {\n name: \"ProjectSwitcher\",\n category: \"shell\",\n description: \"프로젝트 검색 전환기. Combobox + match-sorter 퍼지 검색 지원.\",\n slug: \"project-switcher\",\n exports: [\"ProjectSwitcher\"],\n props: {\n ProjectSwitcher: [\n {\n name: \"projects\",\n type: \"ProjectDef[]\",\n required: true,\n description: \"프로젝트 목록. { id, name, framework, status, domain? }\",\n },\n {\n name: \"value\",\n type: \"string\",\n description: \"제어 모드: 현재 선택된 프로젝트 ID\",\n },\n {\n name: \"onChange\",\n type: \"(id: string) => void\",\n description: \"프로젝트 선택 핸들러\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n default: '\"프로젝트 검색...\"',\n description: \"검색 입력 플레이스홀더\",\n },\n ],\n },\n dependencies: [{ slug: \"combobox\", category: \"core\" }],\n testDescribe: \"ProjectSwitcher\",\n};\n\nexport const envPanelMeta: ComponentMeta = {\n name: \"EnvPanel\",\n category: \"shell\",\n description:\n \"환경변수 패널. Disclosure로 환경별 그룹 접기/펼치기, Composite로 변수 탐색.\",\n slug: \"env-panel\",\n exports: [\"EnvPanel\"],\n props: {\n EnvPanel: [\n {\n name: \"groups\",\n type: \"EnvGroupDef[]\",\n required: true,\n description: \"환경 그룹 배열. { env, vars: EnvVarDef[] }\",\n },\n ],\n },\n dependencies: [{ slug: \"disclosure\", category: \"core\" }],\n testDescribe: \"EnvPanel\",\n};\n\nexport const branchSelectMeta: ComponentMeta = {\n name: \"BranchSelect\",\n category: \"shell\",\n description: \"Git 브랜치 선택 드롭다운. Select primitive 래퍼.\",\n slug: \"branch-select\",\n exports: [\"BranchSelect\"],\n props: {\n BranchSelect: [\n {\n name: \"branches\",\n type: \"BranchDef[]\",\n required: true,\n description: \"브랜치 목록. { name, isDefault?, lastCommit?, author? }\",\n },\n {\n name: \"value\",\n type: \"string\",\n description: \"제어 모드: 현재 선택된 브랜치 이름\",\n },\n {\n name: \"onChange\",\n type: \"(name: string) => void\",\n description: \"브랜치 선택 핸들러\",\n },\n {\n name: \"label\",\n type: \"string\",\n default: '\"브랜치\"',\n description: \"Select 레이블\",\n },\n ],\n },\n dependencies: [{ slug: \"select\", category: \"core\" }],\n testDescribe: \"BranchSelect\",\n};\n\nexport const domainTableMeta: ComponentMeta = {\n name: \"DomainTable\",\n category: \"shell\",\n description: \"도메인 테이블. Composite 기반 그리드로 키보드 탐색 지원.\",\n slug: \"domain-table\",\n exports: [\"DomainTable\"],\n props: {\n DomainTable: [\n {\n name: \"domains\",\n type: \"DomainDef[]\",\n required: true,\n description:\n \"도메인 목록. { domain, status, ssl, redirect?, addedAt? }\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"도메인\"',\n description: \"테이블 제목\",\n },\n ],\n },\n testDescribe: \"DomainTable\",\n};\n\nexport const dataTableMeta: ComponentMeta = {\n name: \"DataTable\",\n category: \"shell\",\n description:\n \"제네릭 데이터 테이블. 동적 컬럼, 결측값 안전 정렬, 키보드 컬럼 리사이즈, 보정된 인라인 진행률과 Composite 탐색을 지원합니다.\",\n slug: \"data-table\",\n exports: [\"DataTable\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"행 탐색\" },\n { keys: \"← →\", action: \"셀 탐색\" },\n { keys: \"Enter / Space\", action: \"정렬 가능한 헤더 또는 행 활성화\" },\n { keys: \"리사이즈 핸들: ← →\", action: \"컬럼 너비를 10px 단위로 조절\" },\n {\n keys: \"리사이즈 핸들: Shift+← Shift+→\",\n action: \"컬럼 너비를 40px 단위로 조절\",\n },\n {\n keys: \"리사이즈 핸들: Home / End\",\n action: \"컬럼 너비를 최솟값/최댓값으로 이동\",\n },\n ],\n advancedPatternAnchor: \"data-table-filtering\",\n advancedPatternDescription:\n \"실시간 필터링, 커스텀 컬럼 렌더링, Badge 상태 표시 등 고급 패턴\",\n dependencies: [\n { slug: \"composite-zone\", category: \"core\" },\n { slug: \"button\", category: \"core\" },\n { slug: \"checkbox\", category: \"core\" },\n ],\n props: {\n DataTable: [\n {\n name: \"data\",\n type: \"T[]\",\n required: true,\n description: \"테이블 데이터 배열\",\n },\n {\n name: \"columns\",\n type: \"ColumnDef<T>[]\",\n required: true,\n description: \"컬럼 정의. { id, header, accessor, width?, align? }\",\n },\n {\n name: \"keyExtractor\",\n type: \"(row: T) => string\",\n required: true,\n description: \"각 행의 고유 키 추출 함수\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"데이터 테이블\"',\n description: \"테이블 제목\",\n },\n {\n name: \"onRowClick\",\n type: \"(row: T) => void\",\n description: \"행 클릭 핸들러\",\n },\n {\n name: \"emptyMessage\",\n type: \"string\",\n default: '\"데이터가 없습니다\"',\n description: \"데이터 없을 때 표시할 메시지\",\n },\n ],\n ColumnDef: [\n {\n name: \"bar\",\n type: \"(row: T) => number\",\n description:\n \"인라인 프로그레스 바 비율(0-1) 계산 함수. 범위 밖/NaN은 보정\",\n },\n {\n name: \"barColor\",\n type: \"string\",\n default: '\"bg-accent\"',\n description: \"인라인 바 색상 클래스\",\n },\n ],\n },\n testDescribe: \"DataTable\",\n examples: [\n {\n title: \"기본 테이블\",\n code: `import { DataTable } from \"@reopt-ai/opt-ui\";\n\nconst columns = [\n { id: \"name\", header: \"이름\", accessor: (r) => r.name },\n { id: \"email\", header: \"이메일\", accessor: (r) => r.email },\n];\nconst data = [\n { name: \"홍길동\", email: \"hong@example.com\" },\n { name: \"김철수\", email: \"kim@example.com\" },\n];\n\n<DataTable columns={columns} data={data} keyExtractor={(r) => r.email} />`,\n },\n {\n title: \"선택 + 정렬\",\n code: `import { DataTable } from \"@reopt-ai/opt-ui\";\n\n<DataTable\n columns={columns}\n data={data}\n keyExtractor={(r) => r.id}\n selectable\n selectedKeys={selected}\n onSelectionChange={setSelected}\n sortable\n onSort={(colId, dir) => console.log(colId, dir)}\n/>`,\n },\n ],\n};\n\nexport const notificationToastMeta: ComponentMeta = {\n name: \"NotificationToast\",\n category: \"shell\",\n description:\n \"토스트 알림 시스템. 포인터/키보드 상호작용 중 자동 닫힘을 일시 정지하고, 중요도별 live region으로 전역 알림을 관리합니다.\",\n slug: \"notification-toast\",\n exports: [\"ToastProvider\", \"useToast\", \"NotificationToast\", \"toast\"],\n advancedPatternAnchor: \"toast-notifications\",\n advancedPatternDescription:\n \"에러 핸들링과 함께 사용하기, 커스텀 duration 설정 등 고급 패턴\",\n dependencies: [{ slug: \"alert\", category: \"core\" }],\n props: {\n ToastProvider: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"앱 컨텐츠\",\n },\n {\n name: \"position\",\n type: '\"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\"',\n default: '\"top-right\"',\n description: \"토스트 표시 위치\",\n },\n {\n name: \"defaultDuration\",\n type: \"number\",\n default: \"5000\",\n description: \"기본 표시 시간 (ms)\",\n },\n ],\n useToast: [\n {\n name: \"returns\",\n type: \"{ toasts, addToast, removeToast }\",\n description: \"토스트 상태 및 제어 함수\",\n },\n ],\n toast: [\n {\n name: \"toast.success / error / info / warning\",\n type: \"(message: string, options?) => string\",\n description:\n \"훅 없이 어디서든 호출하는 프로그램매틱 API. toast.dismiss(id) / toast.clear()도 제공\",\n },\n ],\n NotificationToast: [\n {\n name: \"toast\",\n type: \"ToastMessage\",\n required: true,\n description: \"토스트 메시지 객체\",\n },\n {\n name: \"onDismiss\",\n type: \"() => void\",\n required: true,\n description: \"닫기 핸들러\",\n },\n ],\n },\n testDescribe: \"ToastProvider\",\n};\n\nexport const designGuidePanelMeta: ComponentMeta = {\n name: \"DesignGuidePanel\",\n category: \"devtools\",\n description:\n \"디자인 시스템 참조 패널. 프리미티브 맵, 키보드 패턴, Tailwind 셀렉터, 접근성 속성 등 6개 섹션 제공.\",\n slug: \"design-guide-panel\",\n sourceFile: \"devtools/design-guide-panel\",\n exports: [\"DesignGuidePanel\"],\n props: {\n DesignGuidePanel: [\n {\n name: \"className\",\n type: \"string\",\n description: \"추가 CSS 클래스\",\n },\n ],\n },\n testDescribe: \"DesignGuidePanel\",\n};\n\nexport const taskListMeta: ComponentMeta = {\n name: \"TaskList\",\n category: \"shell\",\n description:\n \"작업 목록 관리 컴포넌트. 우선순위, 상태, 담당자, 태그, 하위 작업 지원.\",\n slug: \"task-list\",\n exports: [\"TaskList\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"작업 간 이동\" },\n { keys: \"Enter\", action: \"작업 선택\" },\n { keys: \"Space\", action: \"완료 토글\" },\n ],\n props: {\n TaskList: [\n {\n name: \"tasks\",\n type: \"TaskDef[]\",\n required: true,\n description:\n \"작업 배열. { id, title, status, priority, assignee?, ... }\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"작업 목록\"',\n description: \"섹션 제목\",\n },\n {\n name: \"onTaskClick\",\n type: \"(task: TaskDef) => void\",\n description: \"작업 클릭 핸들러\",\n },\n {\n name: \"onTaskStatusChange\",\n type: \"(task: TaskDef, completed: boolean) => void\",\n description: \"완료 상태 변경 핸들러\",\n },\n {\n name: \"showSubtasks\",\n type: \"boolean\",\n default: \"false\",\n description: \"하위 작업 표시 여부\",\n },\n ],\n },\n dependencies: [\n { slug: \"avatar\", category: \"core\" },\n { slug: \"checkbox\", category: \"core\" },\n ],\n testDescribe: \"TaskList\",\n};\n\nexport const activityFeedMeta: ComponentMeta = {\n name: \"ActivityFeed\",\n category: \"shell\",\n description: \"활동 피드/로그 컴포넌트. 타임라인 스타일, 상대 시간 표시.\",\n slug: \"activity-feed\",\n exports: [\"ActivityFeed\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"활동 간 이동\" },\n { keys: \"Enter\", action: \"활동 선택\" },\n ],\n props: {\n ActivityFeed: [\n {\n name: \"activities\",\n type: \"ActivityDef[]\",\n required: true,\n description: \"활동 배열. { id, type, title, actor, timestamp, ... }\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"활동 피드\"',\n description: \"섹션 제목\",\n },\n { name: \"maxItems\", type: \"number\", description: \"최대 표시 개수\" },\n {\n name: \"onActivityClick\",\n type: \"(activity: ActivityDef) => void\",\n description: \"활동 클릭 핸들러\",\n },\n {\n name: \"layout\",\n type: '\"list\" | \"compact\"',\n default: '\"list\"',\n description: \"시간 표시 레이아웃 모드\",\n },\n {\n name: \"renderActions\",\n type: \"(activity: ActivityDef) => ReactNode\",\n description: \"각 활동 항목 우측 액션 슬롯 렌더 함수\",\n },\n ],\n },\n dependencies: [{ slug: \"avatar\", category: \"core\" }],\n testDescribe: \"ActivityFeed\",\n};\n\nexport const filterBarMeta: ComponentMeta = {\n name: \"FilterBar\",\n category: \"shell\",\n description: \"필터링 바 컴포넌트. 검색, 선택, 다중 선택 필터 지원.\",\n slug: \"filter-bar\",\n exports: [\"FilterBar\"],\n props: {\n FilterBar: [\n {\n name: \"filters\",\n type: \"FilterGroupDef[]\",\n required: true,\n description: \"필터 그룹 배열. { id, label, type, options?, value? }\",\n },\n {\n name: \"onFilterChange\",\n type: \"(filterId: string, value: string | string[]) => void\",\n description: \"필터 변경 핸들러\",\n },\n {\n name: \"onClearAll\",\n type: \"() => void\",\n description: \"모든 필터 초기화 핸들러\",\n },\n ],\n },\n dependencies: [\n { slug: \"select\", category: \"core\" },\n { slug: \"input\", category: \"core\" },\n { slug: \"button\", category: \"core\" },\n { slug: \"switch\", category: \"core\" },\n { slug: \"checkbox\", category: \"core\" },\n { slug: \"date-range-picker\", category: \"core\" },\n ],\n examples: [\n {\n title: \"필터 바\",\n code: `import { FilterBar } from \"@reopt-ai/opt-ui\";\n\nconst filters = [\n { id: \"status\", label: \"상태\", type: \"select\", options: [\"활성\", \"비활성\"] },\n { id: \"search\", label: \"검색\", type: \"search\" },\n];\n\n<FilterBar\n filters={filters}\n onFilterChange={(id, value) => console.log(id, value)}\n onClearAll={() => console.log(\"clear\")}\n/>`,\n },\n ],\n testDescribe: \"FilterBar\",\n};\n\nexport const quickActionsMeta: ComponentMeta = {\n name: \"QuickActions\",\n category: \"shell\",\n description: \"빠른 작업 패널. 그리드/리스트 레이아웃, 단축키 표시 지원.\",\n slug: \"quick-actions\",\n exports: [\"QuickActions\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓ ← →\", action: \"그리드에서 4방향 탐색\" },\n { keys: \"↑ ↓\", action: \"리스트에서 수직 탐색\" },\n { keys: \"Enter\", action: \"작업 실행\" },\n ],\n props: {\n QuickActions: [\n {\n name: \"actions\",\n type: \"QuickActionDef[]\",\n required: true,\n description:\n \"작업 배열. { id, label, description?, icon?, shortcut?, onClick }\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"빠른 작업\"',\n description: \"섹션 제목\",\n },\n {\n name: \"layout\",\n type: '\"grid\" | \"list\"',\n default: '\"grid\"',\n description: \"레이아웃 모드\",\n },\n {\n name: \"columns\",\n type: \"2 | 3 | 4\",\n default: \"3\",\n description: \"그리드 컬럼 수\",\n },\n ],\n },\n dependencies: [{ slug: \"kbd\", category: \"core\" }],\n testDescribe: \"QuickActions\",\n};\n\nexport const teamMemberListMeta: ComponentMeta = {\n name: \"TeamMemberList\",\n category: \"shell\",\n description:\n \"팀원 목록 컴포넌트. 온라인 상태, 다양한 레이아웃(list, compact, avatars-only) 지원.\",\n slug: \"team-member-list\",\n exports: [\"TeamMemberList\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"팀원 간 이동\" },\n { keys: \"Enter\", action: \"팀원 선택\" },\n ],\n props: {\n TeamMemberList: [\n {\n name: \"members\",\n type: \"TeamMemberDef[]\",\n required: true,\n description: \"팀원 배열. { id, name, email, avatar?, role?, status? }\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"팀원\"',\n description: \"섹션 제목\",\n },\n {\n name: \"layout\",\n type: '\"list\" | \"compact\" | \"avatars-only\"',\n default: '\"list\"',\n description: \"레이아웃 모드\",\n },\n { name: \"maxDisplay\", type: \"number\", description: \"최대 표시 인원\" },\n {\n name: \"onMemberClick\",\n type: \"(member: TeamMemberDef) => void\",\n description: \"팀원 클릭 핸들러\",\n },\n ],\n },\n dependencies: [{ slug: \"avatar\", category: \"core\" }],\n testDescribe: \"TeamMemberList\",\n};\n\nexport const formLoginMeta: ComponentMeta = {\n name: \"AuthForm\",\n category: \"shell\",\n description:\n \"로그인/회원가입 모드 전환 가능한 인증 폼. 이메일·비밀번호 검증, FormSwitch로 로그인 상태 유지 옵션 지원.\",\n slug: \"form-login\",\n sourceFile: \"auth-form\",\n exports: [\"AuthForm\"],\n props: {\n AuthForm: [\n {\n name: \"defaultMode\",\n type: '\"login\" | \"signup\"',\n default: '\"login\"',\n description: \"초기 모드 (비제어)\",\n },\n {\n name: \"mode\",\n type: '\"login\" | \"signup\"',\n description: \"제어 모드: 현재 모드\",\n },\n {\n name: \"onModeChange\",\n type: '(mode: \"login\" | \"signup\") => void',\n description: \"모드 변경 핸들러\",\n },\n {\n name: \"showRememberMe\",\n type: \"boolean\",\n default: \"true\",\n description: \"로그인 모드에서 '로그인 상태 유지' 표시 여부\",\n },\n {\n name: \"minPasswordLength\",\n type: \"number\",\n default: \"8\",\n description: \"비밀번호 최소 길이\",\n },\n {\n name: \"onSubmit\",\n type: \"(values: { email, password, confirmPassword?, rememberMe?, mode }) => void\",\n description: \"제출 핸들러\",\n },\n {\n name: \"labels\",\n type: \"AuthFormLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [{ slug: \"form\", category: \"core\" }],\n testDescribe: \"AuthForm\",\n};\n\nexport const formWizardMeta: ComponentMeta = {\n name: \"WizardForm\",\n category: \"shell\",\n description:\n \"다단계 순차 입력 폼. FormFieldDef 기반 필드 정의, 단계별 검증, 현재 단계가 연결된 진행 표시기, 리뷰 단계를 지원합니다.\",\n slug: \"form-wizard\",\n sourceFile: \"wizard-form\",\n exports: [\"WizardForm\"],\n props: {\n WizardForm: [\n {\n name: \"fields\",\n type: \"FormFieldDef[]\",\n required: true,\n description: \"폼 필드 정의 배열\",\n },\n {\n name: \"steps\",\n type: \"WizardStepDef[]\",\n required: true,\n description: \"단계 정의. { id, label, fields: string[] }\",\n },\n {\n name: \"showReview\",\n type: \"boolean\",\n default: \"true\",\n description: \"마지막 리뷰 단계 표시 여부\",\n },\n {\n name: \"onSubmit\",\n type: \"(values: Record<string, unknown>) => void\",\n description: \"제출 핸들러\",\n },\n {\n name: \"onStepChange\",\n type: \"(stepIndex: number) => void\",\n description: \"단계 변경 핸들러\",\n },\n {\n name: \"labels\",\n type: \"WizardFormLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [\n { slug: \"form\", category: \"core\" },\n { slug: \"checkbox\", category: \"core\" },\n { slug: \"radio-group\", category: \"core\" },\n ],\n testDescribe: \"WizardForm\",\n};\n\nexport const formDynamicMeta: ComponentMeta = {\n name: \"DynamicFieldForm\",\n category: \"shell\",\n description:\n \"런타임 필드 추가/제거 폼. 최소/최대 필드 수 제약, 개별 검증, 동적 스토어 업데이트 지원.\",\n slug: \"form-dynamic\",\n sourceFile: \"dynamic-field-form\",\n exports: [\"DynamicFieldForm\"],\n props: {\n DynamicFieldForm: [\n {\n name: \"initialCount\",\n type: \"number\",\n default: \"1\",\n description: \"초기 필드 수\",\n },\n {\n name: \"minFields\",\n type: \"number\",\n default: \"1\",\n description: \"최소 필드 수\",\n },\n {\n name: \"maxFields\",\n type: \"number\",\n description: \"최대 필드 수\",\n },\n {\n name: \"fieldType\",\n type: '\"text\" | \"email\" | \"url\" | \"number\"',\n default: '\"text\"',\n description: \"필드 입력 타입\",\n },\n {\n name: \"validateField\",\n type: \"(value: string, index: number) => string | undefined\",\n description: \"커스텀 필드 검증 함수\",\n },\n {\n name: \"onSubmit\",\n type: \"(values: string[]) => void\",\n description: \"제출 핸들러\",\n },\n {\n name: \"labels\",\n type: \"DynamicFieldFormLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [{ slug: \"form\", category: \"core\" }],\n testDescribe: \"DynamicFieldForm\",\n};\n\nexport const formUploadMeta: ComponentMeta = {\n name: \"FileUploadForm\",\n category: \"shell\",\n description:\n \"파일 선택, 메타데이터 표시, 이미지 미리보기를 포함한 업로드 폼. 파일 크기 제한, 설명 입력 지원.\",\n slug: \"form-upload\",\n sourceFile: \"file-upload-form\",\n exports: [\"FileUploadForm\"],\n props: {\n FileUploadForm: [\n {\n name: \"accept\",\n type: \"string\",\n default: '\"image/*,.pdf,.doc,.docx\"',\n description: \"허용 파일 타입\",\n },\n {\n name: \"showPreview\",\n type: \"boolean\",\n default: \"true\",\n description: \"이미지 미리보기 표시\",\n },\n {\n name: \"showFileInfo\",\n type: \"boolean\",\n default: \"true\",\n description: \"파일 정보 표시\",\n },\n {\n name: \"showDescription\",\n type: \"boolean\",\n default: \"true\",\n description: \"설명 텍스트영역 표시\",\n },\n {\n name: \"maxFileSize\",\n type: \"number\",\n description: \"최대 파일 크기 (bytes)\",\n },\n {\n name: \"onSubmit\",\n type: \"(values: { title, description, file }) => void\",\n description: \"제출 핸들러\",\n },\n {\n name: \"labels\",\n type: \"FileUploadFormLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n {\n name: \"onPreview\",\n type: \"(file: File) => void\",\n description: \"파일 선택 후 프리뷰 콜백\",\n },\n {\n name: \"columnMapping\",\n type: \"ReactNode\",\n description: \"CSV 컬럼 매핑 UI 슬롯 (파일 선택 후 표시)\",\n },\n ],\n },\n dependencies: [{ slug: \"form\", category: \"core\" }],\n testDescribe: \"FileUploadForm\",\n};\n\nexport const eventIconMeta: ComponentMeta = {\n name: \"EventIcon\",\n category: \"shell\",\n description:\n \"이벤트 아이콘. semantic key 또는 ReactNode 아이콘과 배경색을 표시합니다.\",\n slug: \"event-icon\",\n exports: [\"EventIcon\", \"POPULAR_ICONS\", \"COLOR_PRESETS\"],\n props: {\n EventIcon: [\n {\n name: \"icon\",\n type: \"string | React.ReactNode\",\n required: true,\n description:\n \"semantic icon key, legacy key, 또는 React 노드 (Lucide 등)\",\n },\n {\n name: \"color\",\n type: \"string\",\n default: \"theme accent\",\n description:\n \"사용자 지정 아이콘 색상. 없으면 theme accent 토큰을 사용하고, 전달하면 전경색과 tint 배경에 적용됩니다.\",\n },\n {\n name: \"size\",\n type: '\"sm\" | \"md\" | \"lg\"',\n default: '\"md\"',\n description: \"아이콘 크기 (sm=20px, md=28px, lg=36px)\",\n },\n ],\n },\n ariaRole: \"img\",\n testDescribe: \"EventIcon\",\n};\n\nexport const connectionIndicatorMeta: ComponentMeta = {\n name: \"ConnectionIndicator\",\n category: \"shell\",\n description:\n \"연결 상태 표시기. connected, connecting, disconnected, error 상태를 지원합니다.\",\n slug: \"connection-indicator\",\n exports: [\"ConnectionIndicator\"],\n props: {\n ConnectionIndicator: [\n {\n name: \"status\",\n type: '\"connected\" | \"connecting\" | \"disconnected\" | \"error\"',\n description: \"연결 상태 프리셋. tone과 pulse의 기본값을 정함\",\n },\n {\n name: \"tone\",\n type: '\"neutral\" | \"success\" | \"warning\" | \"danger\" | \"info\"',\n description:\n \"status로 표현되지 않는 도메인 상태의 색을 직접 지정 (status보다 우선)\",\n },\n { name: \"label\", type: \"string\", description: \"상태 문구\" },\n { name: \"showLabel\", type: \"boolean\", description: \"문구 표시 여부\" },\n {\n name: \"pulse\",\n type: \"boolean\",\n description: \"점 애니메이션. 생략하면 status 프리셋을 따름\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n ariaRole: \"status\",\n testDescribe: \"ConnectionIndicator\",\n};\n\nexport const floatingActionBarMeta: ComponentMeta = {\n name: \"FloatingActionBar\",\n category: \"shell\",\n description:\n \"플로팅 액션 바. 선택된 항목에 대한 일괄 작업 버튼을 하단에 표시합니다.\",\n slug: \"floating-action-bar\",\n exports: [\"FloatingActionBar\"],\n props: {},\n ariaRole: \"toolbar\",\n dependencies: [{ slug: \"button\", category: \"core\" }],\n testDescribe: \"FloatingActionBar\",\n};\n\nexport const templatePickerMeta: ComponentMeta = {\n name: \"TemplatePicker\",\n category: \"shell\",\n description:\n \"템플릿 선택기. 카테고리별 그리드와 검색을 제공하며 featured/tags 표시를 지원합니다.\",\n slug: \"template-picker\",\n exports: [\"TemplatePicker\"],\n props: {\n TemplatePicker: [\n {\n name: \"templates\",\n type: \"TemplateDef[]\",\n required: true,\n description:\n \"템플릿 배열. { id, name, description?, icon?, category?, featured?, tags? }\",\n },\n {\n name: \"selected\",\n type: \"string\",\n description: \"현재 선택된 템플릿 ID\",\n },\n {\n name: \"onSelect\",\n type: \"(templateId: string) => void\",\n required: true,\n description: \"템플릿 선택 핸들러\",\n },\n {\n name: \"showSearch\",\n type: \"boolean\",\n default: \"false\",\n description: \"검색 입력 표시 여부\",\n },\n ],\n },\n testDescribe: \"TemplatePicker\",\n};\n\nexport const failureListMeta: ComponentMeta = {\n name: \"FailureList\",\n category: \"shell\",\n description:\n \"실패 목록 패널. severity별 색상 강조, 그룹핑, 액션 슬롯을 지원합니다.\",\n slug: \"failure-list\",\n exports: [\"FailureList\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"실패 항목 간 이동\" },\n { keys: \"Enter\", action: \"실패 항목 선택\" },\n ],\n props: {\n FailureList: [\n {\n name: \"failures\",\n type: \"FailureItem[]\",\n required: true,\n description:\n \"실패 항목 배열. { id, title, message?, severity, timestamp, group? }\",\n },\n {\n name: \"title\",\n type: \"string\",\n default: '\"최근 실패\"',\n description: \"섹션 제목\",\n },\n { name: \"maxItems\", type: \"number\", description: \"최대 표시 개수\" },\n {\n name: \"grouped\",\n type: \"boolean\",\n default: \"false\",\n description: \"group 필드 기준으로 그룹핑 표시\",\n },\n {\n name: \"onFailureClick\",\n type: \"(failure: FailureItem) => void\",\n description: \"실패 항목 클릭 핸들러\",\n },\n {\n name: \"renderActions\",\n type: \"(failure: FailureItem) => ReactNode\",\n description: \"각 항목 우측 액션 슬롯 렌더 함수\",\n },\n ],\n },\n dependencies: [{ slug: \"badge\", category: \"core\" }],\n testDescribe: \"FailureList\",\n};\n\nexport const keyValueEditorMeta: ComponentMeta = {\n name: \"KeyValueEditor\",\n category: \"shell\",\n description:\n \"키-값 쌍 편집기. 동적 행 추가/삭제, 비밀값 토글, 유효성 검사를 지원합니다.\",\n slug: \"key-value-editor\",\n exports: [\"KeyValueEditor\"],\n keyboardShortcuts: [{ keys: \"Tab\", action: \"키/값 필드 간 이동\" }],\n props: {\n KeyValueEditor: [\n {\n name: \"value\",\n type: \"KeyValueEntry[]\",\n description: \"현재 엔트리 (controlled 모드)\",\n },\n {\n name: \"defaultValue\",\n type: \"KeyValueEntry[]\",\n description: \"초기 엔트리 (uncontrolled 모드)\",\n },\n {\n name: \"onChange\",\n type: \"(entries: KeyValueEntry[]) => void\",\n description: \"엔트리 변경 핸들러\",\n },\n {\n name: \"showSecretToggle\",\n type: \"boolean\",\n default: \"false\",\n description: \"비밀값 표시/숨김 토글 버튼 활성화\",\n },\n {\n name: \"maxEntries\",\n type: \"number\",\n description: \"최대 항목 수 제한\",\n },\n {\n name: \"readOnly\",\n type: \"boolean\",\n default: \"false\",\n description: \"읽기 전용 모드\",\n },\n {\n name: \"labels\",\n type: \"KeyValueEditorLabels\",\n description: \"i18n 라벨 오버라이드\",\n },\n {\n name: \"renderActions\",\n type: \"(entry: KeyValueEntry, index: number) => ReactNode\",\n description: \"항목별 커스텀 액션 슬롯\",\n },\n {\n name: \"validateKey\",\n type: \"(key: string, entries: KeyValueEntry[]) => string | undefined\",\n description: \"키 유효성 검사 함수\",\n },\n ],\n },\n testDescribe: \"KeyValueEditor\",\n};\n\nexport const workflowCanvasMeta: ComponentMeta = {\n name: \"WorkflowCanvas\",\n category: \"shell\",\n description:\n \"워크플로우 캔버스. 그리드 셀 기반 스텝 배치, SVG 연결선, 키보드 이동을 지원합니다.\",\n slug: \"workflow-canvas\",\n exports: [\"WorkflowCanvas\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓ ← →\", action: \"선택 스텝 이동 (onStepMove 제공 시)\" },\n { keys: \"Enter\", action: \"스텝 선택\" },\n ],\n props: {\n WorkflowCanvas: [\n {\n name: \"steps\",\n type: \"WorkflowCanvasStep[]\",\n required: true,\n description: \"스텝 배열. { id, title, row, col, status? }\",\n },\n {\n name: \"connections\",\n type: \"WorkflowCanvasConnection[]\",\n default: \"[]\",\n description: \"연결선 배열. { from, to, label? }\",\n },\n {\n name: \"onStepMove\",\n type: \"(stepId: string, row: number, col: number) => void\",\n description: \"화살표 키 이동 핸들러\",\n },\n {\n name: \"onSelectStep\",\n type: \"(step: WorkflowCanvasStep) => void\",\n description: \"스텝 선택 핸들러\",\n },\n ],\n },\n dependencies: [{ slug: \"badge\", category: \"core\" }],\n testDescribe: \"WorkflowCanvas\",\n};\n\nexport const codeSnippetViewerMeta: ComponentMeta = {\n name: \"CodeSnippetViewer\",\n category: \"shell\",\n description:\n \"코드 스니펫 뷰어. 줄 번호, 복사 버튼, 포커스 가능한 스크롤 영역, syntaxTheme 톤을 지원합니다.\",\n slug: \"code-snippet-viewer\",\n exports: [\"CodeSnippetViewer\"],\n props: {\n CodeSnippetViewer: [\n {\n name: \"code\",\n type: \"string\",\n required: true,\n description: \"표시할 코드 문자열\",\n },\n {\n name: \"language\",\n type: \"string\",\n default: '\"text\"',\n description: \"코드 언어 라벨\",\n },\n { name: \"title\", type: \"string\", description: \"헤더에 표시할 제목\" },\n {\n name: \"showLineNumbers\",\n type: \"boolean\",\n default: \"true\",\n description: \"줄 번호 표시 여부\",\n },\n {\n name: \"showCopyButton\",\n type: \"boolean\",\n default: \"true\",\n description: \"복사 버튼 표시 여부\",\n },\n {\n name: \"maxHeight\",\n type: \"number\",\n default: \"400\",\n description: \"스크롤 영역의 최대 높이(px)\",\n },\n {\n name: \"syntaxTheme\",\n type: '\"default\" | \"muted\" | \"dark\" | \"terminal\"',\n default: '\"default\"',\n description: \"코드 블록 색상 톤\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n {\n name: \"labels\",\n type: \"CodeSnippetViewerLabels\",\n description: \"복사 버튼과 코드 영역 레이블 문구\",\n },\n ],\n },\n testDescribe: \"CodeSnippetViewer\",\n};\n\nexport const propertyExplorerMeta: ComponentMeta = {\n name: \"PropertyExplorer\",\n category: \"shell\",\n description: \"프로퍼티 탐색기. 검색 가능한 속성 목록을 그룹별로 표시합니다.\",\n slug: \"property-explorer\",\n exports: [\"PropertyExplorer\"],\n props: {},\n dependencies: [{ slug: \"input\", category: \"core\" }],\n testDescribe: \"PropertyExplorer\",\n};\n\nexport const queryResultsTableMeta: ComponentMeta = {\n name: \"QueryResultsTable\",\n category: \"shell\",\n description:\n \"쿼리 결과 테이블. SQL 결과와 스크린 리더에 안내되는 로딩, 에러, 빈 상태를 지원합니다.\",\n slug: \"query-results-table\",\n exports: [\"QueryResultsTable\"],\n props: {\n QueryResultsTable: [\n {\n name: \"columns\",\n type: \"string[]\",\n required: true,\n description: \"컬럼 이름\",\n },\n {\n name: \"rows\",\n type: \"Array<Record<string, unknown>>\",\n required: true,\n description: \"결과 행\",\n },\n { name: \"loading\", type: \"boolean\", description: \"polite 로딩 상태\" },\n { name: \"error\", type: \"string\", description: \"assertive 오류 상태\" },\n {\n name: \"labels\",\n type: \"QueryResultsTableLabels\",\n description: \"로딩/빈 상태/행 수 문구\",\n },\n ],\n },\n testDescribe: \"QueryResultsTable\",\n};\n\nexport const alertBuilderMeta: ComponentMeta = {\n name: \"AlertBuilder\",\n category: \"shell\",\n description:\n \"알림 빌더. 명시적으로 연결된 폼 레이블로 메트릭 조건, 빈도, 채널을 구성합니다.\",\n slug: \"alert-builder\",\n exports: [\"AlertBuilder\"],\n props: {},\n dependencies: [\n { slug: \"button\", category: \"core\" },\n { slug: \"input\", category: \"core\" },\n ],\n testDescribe: \"AlertBuilder\",\n};\n\nexport const sqlEditorMeta: ComponentMeta = {\n name: \"SqlEditor\",\n category: \"shell\",\n description:\n \"SQL 에디터. CodeMirror 기반의 SQL 편집기로 구문 강조와 자동 완성을 지원합니다.\",\n slug: \"sql-editor\",\n exports: [\"SqlEditor\"],\n props: {\n SqlEditor: [\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"편집 중인 SQL\",\n },\n {\n name: \"onChange\",\n type: \"(sql: string) => void\",\n required: true,\n description: \"본문 변경 핸들러\",\n },\n {\n name: \"onRun\",\n type: \"(sql: string) => void\",\n description: \"Mod+Enter 실행 핸들러\",\n },\n {\n name: \"onRunAndAdvance\",\n type: \"(sql: string) => void\",\n description: \"Shift+Enter — 실행 후 다음 셀/탭으로 이동\",\n },\n {\n name: \"schema\",\n type: \"SqlEditorSchema\",\n description:\n \"테이블/컬럼 자동완성 스키마. 변경 시 에디터를 다시 만들지 않고 자동완성만 재구성\",\n },\n {\n name: \"completionSources\",\n type: \"SqlEditorCompletionSource[]\",\n description: \"스키마 자동완성에 더할 완성 소스 (함수 시그니처, 스니펫)\",\n },\n {\n name: \"keymap\",\n type: \"SqlEditorKeyBinding[]\",\n description: \"추가 키 바인딩. 내장 실행 바인딩보다 먼저 평가\",\n },\n {\n name: \"extensions\",\n type: \"SqlEditorExtension[]\",\n description:\n \"임의의 CodeMirror 확장. 내장 확장 뒤에 붙어 우선권을 가짐\",\n },\n {\n name: \"height\",\n type: 'number | \"fill\"',\n description: \"px 고정 높이. fill이면 부모가 정한 높이를 채움\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n description: \"빈 편집기 안내 문구\",\n },\n { name: \"readOnly\", type: \"boolean\", description: \"편집 잠금\" },\n {\n name: \"ariaLabel\",\n type: \"string\",\n description: \"편집 영역 접근성 레이블\",\n },\n { name: \"autoFocus\", type: \"boolean\", description: \"마운트 시 포커스\" },\n {\n name: \"showFooter\",\n type: \"boolean\",\n description: \"실행 힌트/버튼 표시. 기본값은 onRun이 있을 때 표시\",\n },\n {\n name: \"labels\",\n type: \"SqlEditorLabels\",\n description: \"문구 오버라이드\",\n },\n {\n name: \"className\",\n type: \"string\",\n description: \"기본 스타일 오버라이드\",\n },\n ],\n },\n dependencies: [{ slug: \"button\", category: \"core\" }],\n testDescribe: \"SqlEditor\",\n};\n\nexport const eventMetaEditorMeta: ComponentMeta = {\n name: \"EventMetaEditor\",\n category: \"shell\",\n description:\n \"이벤트 메타 에디터. 레이블이 연결된 IconPicker + ColorPicker + TagInput 조합으로 이벤트 메타데이터를 편집합니다.\",\n slug: \"event-meta-editor\",\n exports: [\"EventMetaEditor\"],\n props: {},\n dependencies: [\n { slug: \"input\", category: \"core\" },\n { slug: \"icon-picker\", category: \"core\" },\n { slug: \"color-picker\", category: \"core\" },\n { slug: \"tag-input\", category: \"core\" },\n ],\n testDescribe: \"EventMetaEditor\",\n};\n\nexport const widgetGridMeta: ComponentMeta = {\n name: \"WidgetGrid\",\n category: \"shell\",\n description:\n \"위젯 그리드. react-grid-layout 래퍼로 드래그/리사이즈 가능한 대시보드 위젯을 배치합니다.\",\n slug: \"widget-grid\",\n exports: [\"WidgetGrid\"],\n props: {},\n testDescribe: \"WidgetGrid\",\n};\n\nexport const reportBuilderMeta: ComponentMeta = {\n name: \"ReportBuilder\",\n category: \"shell\",\n description:\n \"리포트 빌더. 레이블이 연결된 4단계 위저드 (차트 타입 → 데이터 설정 → 스타일 → 미리보기).\",\n slug: \"report-builder\",\n exports: [\"ReportBuilder\"],\n props: {\n ReportBuilder: [\n {\n name: \"chartTypes\",\n type: \"ChartTypeDef[]\",\n description: \"차트 타입 그리드 (기본 9종 제공)\",\n },\n {\n name: \"dataSources\",\n type: \"DataSourceDef[]\",\n description: \"데이터 소스 드롭다운 옵션\",\n },\n {\n name: \"configForm\",\n type: \"ReactNode\",\n description: \"차트별 데이터 설정 폼 슬롯 (step 2)\",\n },\n {\n name: \"styleForm\",\n type: \"ReactNode\",\n description: \"차트별 스타일 설정 폼 슬롯 (step 3)\",\n },\n {\n name: \"preview\",\n type: \"ReactNode\",\n description: \"차트 미리보기 슬롯 (step 4)\",\n },\n {\n name: \"onSave\",\n type: \"(report: { name, description, chartType, dataSourceId }) => void\",\n description: \"저장 콜백\",\n },\n {\n name: \"onCancel\",\n type: \"() => void\",\n description: \"취소 콜백\",\n },\n {\n name: \"labels\",\n type: \"ReportBuilderLabels\",\n description: \"UI 텍스트 커스터마이징\",\n },\n ],\n },\n dependencies: [\n { slug: \"button\", category: \"core\" },\n { slug: \"input\", category: \"core\" },\n ],\n testDescribe: \"ReportBuilder\",\n};\n\nexport const segmentBuilderMeta: ComponentMeta = {\n name: \"SegmentBuilder\",\n category: \"shell\",\n description:\n \"세그먼트 빌더. 각 조건 컨트롤의 접근 가능한 이름을 유지하며 event, property, cohort, custom 세그먼트를 정의합니다.\",\n slug: \"segment-builder\",\n exports: [\"SegmentBuilder\"],\n props: {},\n dependencies: [\n { slug: \"button\", category: \"core\" },\n { slug: \"input\", category: \"core\" },\n ],\n testDescribe: \"SegmentBuilder\",\n};\n\nexport const insightsPanelMeta: ComponentMeta = {\n name: \"InsightsPanel\",\n category: \"shell\",\n description:\n \"이상 탐지 인사이트 패널. severity별 카드, 통계 필터, dismiss 기능, 검출 설정(유형/Z-score/days).\",\n slug: \"insights-panel\",\n exports: [\"InsightsPanel\"],\n props: {\n InsightsPanel: [\n {\n name: \"insights\",\n type: \"InsightItem[]\",\n required: true,\n description: \"인사이트 항목 배열\",\n },\n {\n name: \"stats\",\n type: \"InsightsStat[]\",\n description: \"통계 필터 카드 배열 (클릭 가능)\",\n },\n {\n name: \"detectionTypes\",\n type: \"DetectionTypeDef[]\",\n description: \"검출 유형 토글 배열 (volume_anomaly, new_event 등)\",\n },\n {\n name: \"detectionConfig\",\n type: \"DetectionConfig\",\n description: \"검출 파라미터 (days, zScoreThreshold)\",\n },\n {\n name: \"onDetectionConfigChange\",\n type: \"(config: DetectionConfig) => void\",\n description: \"검출 파라미터 변경 핸들러\",\n },\n {\n name: \"onDismiss\",\n type: \"(id: string) => void\",\n description: \"인사이트 dismiss 핸들러\",\n },\n ],\n },\n dependencies: [\n { slug: \"button\", category: \"core\" },\n { slug: \"stat-card\", category: \"core\" },\n { slug: \"badge\", category: \"core\" },\n ],\n testDescribe: \"InsightsPanel\",\n};\n\nexport const timeRangeSelectorMeta: ComponentMeta = {\n name: \"TimeRangeSelector\",\n category: \"shell\",\n description:\n \"시간 범위 선택기. Popover + DateRangePicker + 프리셋 버튼 조합. 12개 시계열 Surface에서 사용.\",\n slug: \"time-range-selector\",\n exports: [\"TimeRangeSelector\"],\n props: {\n TimeRangeSelector: [\n {\n name: \"value\",\n type: \"DateRange\",\n description: \"현재 선택된 날짜 범위\",\n },\n {\n name: \"onChange\",\n type: \"(range: DateRange) => void\",\n description: \"범위 변경 핸들러\",\n },\n {\n name: \"presets\",\n type: \"TimePresetDef[]\",\n description: \"빠른 프리셋 목록 (Today, Last 7d 등)\",\n },\n {\n name: \"labels\",\n type: \"TimeRangeSelectorLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [\n { slug: \"button\", category: \"core\" },\n { slug: \"popover\", category: \"core\" },\n { slug: \"date-range-picker\", category: \"core\" },\n ],\n testDescribe: \"TimeRangeSelector\",\n};\n\nexport const exportButtonMeta: ComponentMeta = {\n name: \"ExportButton\",\n category: \"shell\",\n description:\n \"데이터 내보내기 버튼. CSV/JSON 변환 내장, PDF는 콜백 위임. DropdownMenu 기반.\",\n slug: \"export-button\",\n exports: [\"ExportButton\"],\n props: {\n ExportButton: [\n {\n name: \"data\",\n type: \"Record<string, unknown>[]\",\n required: true,\n description: \"내보낼 데이터 배열\",\n },\n {\n name: \"columns\",\n type: \"ExportColumn[]\",\n description: \"컬럼 매핑 (key → header)\",\n },\n {\n name: \"fileName\",\n type: \"string\",\n default: '\"export\"',\n description: \"파일 이름\",\n },\n {\n name: \"formats\",\n type: \"ExportFormat[]\",\n default: '[\"csv\", \"json\"]',\n description: \"지원 포맷\",\n },\n {\n name: \"onExport\",\n type: \"(format: ExportFormat) => void\",\n description: \"커스텀 내보내기 핸들러\",\n },\n ],\n },\n dependencies: [\n { slug: \"dropdown-menu\", category: \"core\" },\n { slug: \"button\", category: \"core\" },\n ],\n testDescribe: \"ExportButton\",\n};\n\n// LoadingOverlay moved to core/_meta.ts (C01 layer violation fix)\n\nexport const summaryRowMeta: ComponentMeta = {\n name: \"SummaryRow\",\n category: \"shell\",\n description:\n \"통계 요약 행. StatCard 그리드 레이아웃을 표준화합니다. loading 시 SkeletonCard 표시.\",\n slug: \"summary-row\",\n exports: [\"SummaryRow\"],\n props: {\n SummaryRow: [\n {\n name: \"stats\",\n type: \"StatCardType[]\",\n required: true,\n description: \"통계 카드 배열\",\n },\n {\n name: \"columns\",\n type: \"2 | 3 | 4\",\n default: \"4\",\n description: \"컬럼 수\",\n },\n {\n name: \"onStatClick\",\n type: \"(stat: StatCardType) => void\",\n description: \"카드 클릭 핸들러\",\n },\n {\n name: \"formatValue\",\n type: \"(stat: StatCardType) => string\",\n description: \"값 표시 커스텀 포맷 함수\",\n },\n {\n name: \"durationFractionDigits\",\n type: \"number\",\n default: \"1\",\n description: \"duration 포맷 시 소수점 자리수\",\n },\n {\n name: \"percentageFractionDigits\",\n type: \"number\",\n default: \"1\",\n description: \"percentage 포맷 시 소수점 자리수\",\n },\n {\n name: \"loading\",\n type: \"boolean\",\n default: \"false\",\n description: \"로딩 시 스켈레톤 표시\",\n },\n ],\n },\n dependencies: [\n { slug: \"stat-card\", category: \"core\" },\n { slug: \"skeleton\", category: \"core\" },\n ],\n testDescribe: \"SummaryRow\",\n};\n\nexport const comparisonSelectorMeta: ComponentMeta = {\n name: \"ComparisonSelector\",\n category: \"shell\",\n description:\n \"비교 선택기. 고유 레이블이 연결된 Select × 2 + Swap 버튼 조합. CohortComparison, FunnelAnalysis 등에서 사용합니다.\",\n slug: \"comparison-selector\",\n exports: [\"ComparisonSelector\"],\n props: {\n ComparisonSelector: [\n {\n name: \"segments\",\n type: \"ComparisonOption[]\",\n required: true,\n description: \"선택 가능한 세그먼트 목록\",\n },\n {\n name: \"valueA\",\n type: \"string\",\n description: \"Base 선택값\",\n },\n {\n name: \"valueB\",\n type: \"string\",\n description: \"Compare 선택값\",\n },\n {\n name: \"onChangeA\",\n type: \"(value: string) => void\",\n description: \"Base 변경 핸들러\",\n },\n {\n name: \"onChangeB\",\n type: \"(value: string) => void\",\n description: \"Compare 변경 핸들러\",\n },\n {\n name: \"labels\",\n type: \"ComparisonSelectorLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [\n { slug: \"select\", category: \"core\" },\n { slug: \"button\", category: \"core\" },\n ],\n testDescribe: \"ComparisonSelector\",\n};\n\nexport const themeSwitcherMeta: ComponentMeta = {\n name: \"ThemeSwitcher\",\n category: \"shell\",\n description: \"테마 프리셋 선택기. 프리셋과 light/dark/system 모드 전환.\",\n slug: \"theme-switcher\",\n exports: [\"ThemeSwitcher\"],\n props: {\n ThemeSwitcher: [\n {\n name: \"labels\",\n type: \"ThemeSwitcherLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n ],\n },\n testDescribe: \"ThemeSwitcher\",\n};\n\nexport const promptTemplateMeta: ComponentMeta = {\n name: \"PromptTemplate\",\n category: \"shell\",\n description: \"AI 프롬프트 뷰어/헬퍼. 변수 입력 → 실시간 치환 → 복사 기능.\",\n slug: \"prompt-template\",\n exports: [\"PromptTemplate\"],\n props: {\n PromptTemplate: [\n {\n name: \"title\",\n type: \"string\",\n required: true,\n description: \"프롬프트 제목\",\n },\n {\n name: \"description\",\n type: \"string\",\n description: \"프롬프트 설명 (헤더 아래 표시)\",\n },\n {\n name: \"template\",\n type: \"string\",\n required: true,\n description: \"프롬프트 템플릿. {변수명}으로 치환 가능\",\n },\n {\n name: \"variables\",\n type: \"PromptVariable[]\",\n description:\n \"변수 정의 배열. { name, label, placeholder?, defaultValue? }\",\n },\n {\n name: \"labels\",\n type: \"PromptTemplateLabels\",\n description: \"i18n용 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [{ slug: \"input\", category: \"core\" }],\n testDescribe: \"PromptTemplate\",\n};\n\nexport const sidebarMeta: ComponentMeta = {\n name: \"Sidebar\",\n category: \"shell\",\n description:\n \"접기/펼치기를 지원하는 compound 사이드바. Header/Content/Footer 구조 + Group/Item으로 네비게이션 구성. Ctrl+[ 단축키.\",\n slug: \"sidebar\",\n exports: [\"Sidebar\", \"useSidebar\"],\n keyboardShortcuts: [\n { keys: \"Ctrl+[\", action: \"사이드바 접기/펼치기 토글\" },\n { keys: \"↑ ↓\", action: \"사이드바 항목 간 이동\" },\n { keys: \"Home / End\", action: \"첫 번째/마지막 사이드바 항목으로 이동\" },\n ],\n props: {\n Sidebar: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description:\n \"Sidebar.Header, Sidebar.Content, Sidebar.Footer 자식 요소\",\n },\n {\n name: \"collapsible\",\n type: \"boolean\",\n default: \"false\",\n description: \"접기/펼치기 토글 지원\",\n },\n {\n name: \"defaultCollapsed\",\n type: \"boolean\",\n default: \"false\",\n description: \"초기 접힘 상태\",\n },\n {\n name: \"collapsed\",\n type: \"boolean\",\n description: \"제어 모드: 접힘 상태\",\n },\n {\n name: \"onCollapsedChange\",\n type: \"(collapsed: boolean) => void\",\n description: \"제어 모드: 접힘 상태 변경 핸들러\",\n },\n {\n name: \"width\",\n type: \"number\",\n default: \"280\",\n description: \"펼침 상태 너비 (px)\",\n },\n {\n name: \"collapsedWidth\",\n type: \"number\",\n default: \"56\",\n description: \"접힘 상태 너비 (px)\",\n },\n {\n name: \"side\",\n type: '\"left\" | \"right\"',\n default: '\"left\"',\n description: \"사이드바 위치\",\n },\n {\n name: \"label\",\n type: \"string\",\n default: '\"사이드바\"',\n description: \"aside aria-label\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n \"Sidebar.Group\": [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"Sidebar.Item 요소들\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"그룹 레이블 (접힌 상태에서 숨겨짐)\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n \"Sidebar.Item\": [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"항목 레이블 텍스트\",\n },\n {\n name: \"icon\",\n type: \"ReactNode\",\n description: \"아이콘 (접힌 상태에서도 표시)\",\n },\n {\n name: \"active\",\n type: \"boolean\",\n default: \"false\",\n description: \"활성 상태 (aria-current=page)\",\n },\n {\n name: \"onClick\",\n type: \"() => void\",\n description: \"클릭 핸들러\",\n },\n {\n name: \"href\",\n type: \"string\",\n description: \"링크 URL — 설정 시 <a> 태그로 렌더링\",\n },\n {\n name: \"tooltip\",\n type: \"string\",\n description: \"접힌 상태에서 Tooltip 표시 (미지정 시 children 텍스트)\",\n },\n {\n name: \"badge\",\n type: \"ReactNode\",\n description:\n \"우측 배지 (숫자/텍스트). 접힌 상태에서 아이콘 위 dot으로 축소\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [{ slug: \"sidebar-nav\", category: \"shells\" }],\n testDescribe: \"Sidebar\",\n};\n\nexport const appShellMeta: ComponentMeta = {\n name: \"AppShell\",\n category: \"shell\",\n description:\n \"Header + Sidebar + Content + Footer 4영역 페이지 레이아웃 템플릿. AppShell.Sidebar는 모든 viewport에서 기본 표시되며 반응형 숨김/Drawer 전환은 소비자가 제어합니다.\",\n slug: \"app-shell\",\n exports: [\"AppShell\"],\n props: {\n AppShell: [\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description:\n \"AppShell.Header, AppShell.Sidebar, AppShell.Content, AppShell.Footer 자식 요소\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [\n { slug: \"sidebar\", category: \"shells\" },\n { slug: \"page-header\", category: \"core\" },\n ],\n testDescribe: \"AppShell\",\n examples: [\n {\n title: \"앱 레이아웃\",\n code: `import { AppShell } from \"@reopt-ai/opt-ui\";\n\n<AppShell>\n <AppShell.Header>헤더 영역</AppShell.Header>\n <AppShell.Sidebar>사이드바 영역</AppShell.Sidebar>\n <AppShell.Content>메인 콘텐츠</AppShell.Content>\n</AppShell>`,\n },\n ],\n};\n\nexport const confirmDialogMeta: ComponentMeta = {\n name: \"ConfirmDialog\",\n category: \"shell\",\n description:\n \"확인/취소 대화 상자. danger 변형으로 위험 작업 확인을 지원합니다.\",\n slug: \"confirm-dialog\",\n exports: [\"ConfirmDialog\"],\n props: {\n ConfirmDialog: [\n {\n name: \"open\",\n type: \"boolean\",\n required: true,\n description: \"열림 상태\",\n },\n {\n name: \"onConfirm\",\n type: \"() => void\",\n required: true,\n description: \"확인 콜백\",\n },\n {\n name: \"onCancel\",\n type: \"() => void\",\n required: true,\n description: \"취소 콜백\",\n },\n {\n name: \"title\",\n type: \"string\",\n required: true,\n description: \"대화 상자 제목\",\n },\n { name: \"description\", type: \"string\", description: \"설명 텍스트\" },\n {\n name: \"confirmLabel\",\n type: \"string\",\n default: '\"Confirm\"',\n description: \"확인 버튼 텍스트\",\n },\n {\n name: \"cancelLabel\",\n type: \"string\",\n default: '\"Cancel\"',\n description: \"취소 버튼 텍스트\",\n },\n {\n name: \"variant\",\n type: '\"default\" | \"danger\"',\n default: '\"default\"',\n description: \"변형\",\n },\n ],\n },\n dependencies: [{ slug: \"dialog\", category: \"core\" }],\n testDescribe: \"ConfirmDialog\",\n};\n\nexport const asyncComboboxMeta: ComponentMeta = {\n name: \"AsyncCombobox\",\n category: \"shell\",\n description:\n \"비동기 검색 콤보박스. 디바운스 + 로딩 스피너와 stale response 방어를 내장합니다.\",\n slug: \"async-combobox\",\n exports: [\"AsyncCombobox\"],\n props: {\n AsyncCombobox: [\n {\n name: \"onSearch\",\n type: \"(q: string) => Promise<string[]>\",\n required: true,\n description: \"검색 콜백\",\n },\n {\n name: \"debounceMs\",\n type: \"number\",\n default: \"300\",\n description: \"디바운스 ms\",\n },\n {\n name: \"minChars\",\n type: \"number\",\n default: \"1\",\n description: \"최소 검색 글자 수\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n default: '\"Search…\"',\n description: \"플레이스홀더\",\n },\n {\n name: \"onSelect\",\n type: \"(value: string) => void\",\n description: \"선택 콜백\",\n },\n {\n name: \"labels\",\n type: \"AsyncComboboxLabels\",\n description: \"input/loading/noResults/placeholder 문구\",\n },\n {\n name: \"loadingText\",\n type: \"string\",\n description: \"로딩 문구. labels.loading 사용 권장\",\n },\n ],\n },\n dependencies: [\n { slug: \"combobox\", category: \"core\" },\n { slug: \"spinner\", category: \"core\" },\n ],\n testDescribe: \"AsyncCombobox\",\n};\n\nexport const verticalTabsMeta: ComponentMeta = {\n name: \"VerticalTabs\",\n category: \"shell\",\n description: \"세로 탭 레이아웃. 좌측 탭 리스트 + 우측 패널 구성입니다.\",\n slug: \"vertical-tabs\",\n exports: [\"VerticalTabs\"],\n props: {\n VerticalTabs: [\n {\n name: \"tabs\",\n type: \"TabDef[]\",\n required: true,\n description: \"탭 정의 배열\",\n },\n { name: \"defaultTabId\", type: \"string\", description: \"기본 선택 탭 ID\" },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [{ slug: \"tabs\", category: \"core\" }],\n testDescribe: \"VerticalTabs\",\n};\n\nexport const columnTogglerMeta: ComponentMeta = {\n name: \"ColumnToggler\",\n category: \"shell\",\n description: \"테이블 컬럼 표시/숨김 토글러. Popover + Checkbox 리스트입니다.\",\n slug: \"column-toggler\",\n exports: [\"ColumnToggler\"],\n props: {\n ColumnToggler: [\n {\n name: \"columns\",\n type: \"ColumnTogglerColumn[]\",\n required: true,\n description: \"전체 컬럼 목록\",\n },\n {\n name: \"visibleColumns\",\n type: \"string[]\",\n required: true,\n description: \"표시 중인 컬럼 ID 배열\",\n },\n {\n name: \"onChange\",\n type: \"(visibleColumns: string[]) => void\",\n required: true,\n description: \"변경 콜백\",\n },\n ],\n },\n dependencies: [\n { slug: \"popover\", category: \"core\" },\n { slug: \"checkbox\", category: \"core\" },\n ],\n testDescribe: \"ColumnToggler\",\n};\n\nexport const bulkActionsMeta: ComponentMeta = {\n name: \"BulkActions\",\n category: \"shell\",\n description:\n \"일괄 작업 바. 선택 카운트 배지 + DropdownMenu 액션 목록 + 해제 버튼.\",\n slug: \"bulk-actions\",\n exports: [\"BulkActions\"],\n props: {\n BulkActions: [\n {\n name: \"selectedCount\",\n type: \"number\",\n required: true,\n description: \"선택된 항목 수\",\n },\n {\n name: \"actions\",\n type: \"BulkActionDef[]\",\n required: true,\n description: '액션 목록. { id, label, variant?: \"danger\" }',\n },\n {\n name: \"onAction\",\n type: \"(actionId: string) => void\",\n required: true,\n description: \"액션 실행 콜백\",\n },\n {\n name: \"onClear\",\n type: \"() => void\",\n required: true,\n description: \"선택 해제 콜백\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [\n { slug: \"dropdown-menu\", category: \"core\" },\n { slug: \"badge\", category: \"core\" },\n ],\n testDescribe: \"BulkActions\",\n};\n\nexport const savedFiltersMeta: ComponentMeta = {\n name: \"SavedFilters\",\n category: \"shell\",\n description:\n \"필터 프리셋 관리. 키보드 목록 탐색, 현재 필터 저장, 안전한 삭제 확인 흐름을 제공하는 Popover UI.\",\n slug: \"saved-filters\",\n exports: [\"SavedFilters\"],\n keyboardShortcuts: [\n { keys: \"↑ ↓\", action: \"저장된 프리셋 간 이동\" },\n { keys: \"Home / End\", action: \"첫 번째/마지막 프리셋으로 이동\" },\n { keys: \"Enter\", action: \"프리셋 불러오기 또는 새 프리셋 저장\" },\n { keys: \"Escape\", action: \"삭제 확인 취소 후 삭제 버튼으로 포커스 복귀\" },\n ],\n props: {\n SavedFilters: [\n {\n name: \"currentFilters\",\n type: \"Record<string, unknown>\",\n required: true,\n description: \"현재 적용 중인 필터\",\n },\n {\n name: \"presets\",\n type: \"FilterPreset[]\",\n required: true,\n description: \"저장된 프리셋 목록\",\n },\n {\n name: \"onSavePreset\",\n type: \"(name: string, filters: Record<string, unknown>) => void\",\n required: true,\n description: \"프리셋 저장 콜백\",\n },\n {\n name: \"onLoadPreset\",\n type: \"(preset: FilterPreset) => void\",\n required: true,\n description: \"프리셋 불러오기 콜백\",\n },\n {\n name: \"onDeletePreset\",\n type: \"(presetId: string) => void\",\n required: true,\n description: \"프리셋 삭제 콜백\",\n },\n {\n name: \"labels\",\n type: \"SavedFiltersLabels\",\n description: \"트리거, 빈 상태, 저장 및 삭제 확인 문구 오버라이드\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n SavedFiltersLabels: [\n {\n name: \"triggerLabel\",\n type: \"(count: number) => string\",\n description: \"저장된 프리셋 수를 포함한 트리거 레이블\",\n },\n {\n name: \"emptyMessage\",\n type: \"string\",\n default: '\"No saved filters\"',\n description: \"프리셋이 없을 때 표시할 메시지\",\n },\n {\n name: \"deleteLabel\",\n type: \"(name: string) => string\",\n description: \"프리셋 삭제 버튼의 접근 가능한 이름\",\n },\n {\n name: \"namePlaceholder\",\n type: \"string\",\n default: '\"Filter name…\"',\n description: \"새 프리셋 이름 입력 안내\",\n },\n {\n name: \"saveLabel\",\n type: \"string\",\n default: '\"Save\"',\n description: \"새 프리셋 저장 버튼 레이블\",\n },\n {\n name: \"confirmDeleteLabel\",\n type: \"string\",\n default: '\"Confirm\"',\n description: \"삭제 확인 버튼 레이블\",\n },\n {\n name: \"cancelDeleteLabel\",\n type: \"string\",\n default: '\"Cancel\"',\n description: \"삭제 취소 버튼 레이블\",\n },\n ],\n },\n dependencies: [\n { slug: \"popover\", category: \"core\" },\n { slug: \"input\", category: \"core\" },\n { slug: \"button\", category: \"core\" },\n ],\n testDescribe: \"SavedFilters\",\n};\n\nexport const notificationCenterMeta: ComponentMeta = {\n name: \"NotificationCenter\",\n category: \"shell\",\n description: \"알림 센터. 벨 아이콘 트리거 + 미읽음 배지 + 스크롤 알림 목록.\",\n slug: \"notification-center\",\n exports: [\"NotificationCenter\"],\n props: {\n NotificationCenter: [\n {\n name: \"notifications\",\n type: \"NotificationItem[]\",\n required: true,\n description: \"알림 목록\",\n },\n {\n name: \"onMarkRead\",\n type: \"(id: string) => void\",\n required: true,\n description: \"읽음 처리 콜백\",\n },\n {\n name: \"onMarkAllRead\",\n type: \"() => void\",\n required: true,\n description: \"전체 읽음 처리 콜백\",\n },\n {\n name: \"onAction\",\n type: \"(id: string) => void\",\n description: \"알림 액션 콜백\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [\n { slug: \"popover\", category: \"core\" },\n { slug: \"badge\", category: \"core\" },\n { slug: \"scroll-area\", category: \"core\" },\n ],\n testDescribe: \"NotificationCenter\",\n};\n\nexport const auditLogMeta: ComponentMeta = {\n name: \"AuditLog\",\n category: \"shell\",\n description:\n \"감사 로그 타임라인. 아바타 + 액션 텍스트 + 메타데이터 배지 레이아웃.\",\n slug: \"audit-log\",\n exports: [\"AuditLog\"],\n props: {\n AuditLog: [\n {\n name: \"entries\",\n type: \"AuditEntry[]\",\n required: true,\n description: \"감사 로그 항목 배열\",\n },\n {\n name: \"onLoadMore\",\n type: \"() => void\",\n description: \"더 보기 콜백\",\n },\n {\n name: \"loading\",\n type: \"boolean\",\n default: \"false\",\n description: \"로딩 상태\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [\n { slug: \"avatar\", category: \"core\" },\n { slug: \"badge\", category: \"core\" },\n ],\n testDescribe: \"AuditLog\",\n};\n\nexport const auditTimelineMeta: ComponentMeta = {\n name: \"AuditTimeline\",\n category: \"shell\",\n description: \"변경 이력 타임라인. 액션별 색상 코딩 + 확장 가능한 diff 뷰.\",\n slug: \"audit-timeline\",\n exports: [\"AuditTimeline\"],\n props: {\n AuditTimeline: [\n {\n name: \"entries\",\n type: \"AuditEntry[]\",\n required: true,\n description: \"변경 이력 항목 배열\",\n },\n {\n name: \"labels\",\n type: \"AuditTimelineLabels\",\n description: \"UI 텍스트 커스터마이징\",\n },\n {\n name: \"onEntryClick\",\n type: \"(entry: AuditEntry) => void\",\n description: \"항목 클릭 콜백\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [\n { slug: \"badge\", category: \"core\" },\n { slug: \"button\", category: \"core\" },\n { slug: \"empty-state\", category: \"core\" },\n ],\n testDescribe: \"AuditTimeline\",\n};\n\nexport const treeTableMeta: ComponentMeta = {\n name: \"TreeTable\",\n category: \"shell\",\n description: \"계층형 트리 테이블. 재귀 행 렌더링 + 펼침/접기 셰브론.\",\n slug: \"tree-table\",\n exports: [\"TreeTable\"],\n props: {\n TreeTable: [\n {\n name: \"data\",\n type: \"TreeNode<T>[]\",\n required: true,\n description: \"트리 노드 배열\",\n },\n {\n name: \"columns\",\n type: \"TreeColumnDef<T>[]\",\n required: true,\n description: \"컬럼 정의\",\n },\n {\n name: \"defaultExpanded\",\n type: \"string[]\",\n default: \"[]\",\n description: \"기본 펼침 노드 ID\",\n },\n {\n name: \"indentSize\",\n type: \"number\",\n default: \"24\",\n description: \"들여쓰기 크기 (px)\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [{ slug: \"data-table\", category: \"shells\" }],\n testDescribe: \"TreeTable\",\n};\n\nexport const inlineEditTableMeta: ComponentMeta = {\n name: \"InlineEditTable\",\n category: \"shell\",\n description:\n \"인라인 편집 테이블. 더블클릭으로 셀 편집, Enter 확정, Escape 취소.\",\n slug: \"inline-edit-table\",\n exports: [\"InlineEditTable\"],\n props: {\n InlineEditTable: [\n {\n name: \"data\",\n type: \"T[]\",\n required: true,\n description: \"행 데이터 배열\",\n },\n {\n name: \"columns\",\n type: \"InlineEditColumnDef<T>[]\",\n required: true,\n description: \"컬럼 정의 (editable 플래그 포함)\",\n },\n {\n name: \"keyExtractor\",\n type: \"(row: T) => string\",\n required: true,\n description: \"행 키 추출기\",\n },\n {\n name: \"onCellEdit\",\n type: \"(rowId: string, columnId: string, value: string) => void\",\n description: \"셀 편집 확정 콜백\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [{ slug: \"data-table\", category: \"shells\" }],\n testDescribe: \"InlineEditTable\",\n};\n\nexport const kanbanBoardMeta: ComponentMeta = {\n name: \"KanbanBoard\",\n category: \"shell\",\n description: \"칸반 보드. HTML5 DnD로 카드를 컬럼 간 드래그&드롭.\",\n slug: \"kanban-board\",\n exports: [\"KanbanBoard\"],\n props: {\n KanbanBoard: [\n {\n name: \"columns\",\n type: \"KanbanColumn<T>[]\",\n required: true,\n description: \"컬럼 목록 (각 컬럼에 items 배열)\",\n },\n {\n name: \"onDragEnd\",\n type: \"(itemId, fromCol, toCol, toIndex) => void\",\n required: true,\n description: \"드래그 완료 콜백\",\n },\n {\n name: \"renderCard\",\n type: \"(item: T) => ReactNode\",\n required: true,\n description: \"카드 렌더링 함수\",\n },\n {\n name: \"keyExtractor\",\n type: \"(item: T) => string\",\n required: true,\n description: \"항목 키 추출기\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [{ slug: \"scroll-area\", category: \"core\" }],\n testDescribe: \"KanbanBoard\",\n};\n\nexport const richTextEditorMeta: ComponentMeta = {\n name: \"RichTextEditor\",\n category: \"shell\",\n description: \"마크다운 리치 텍스트 에디터. 서식 툴바 + textarea 조합.\",\n slug: \"rich-text-editor\",\n exports: [\"RichTextEditor\"],\n props: {\n RichTextEditor: [\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"텍스트 값\",\n },\n {\n name: \"onChange\",\n type: \"(value: string) => void\",\n required: true,\n description: \"변경 콜백\",\n },\n {\n name: \"placeholder\",\n type: \"string\",\n default: '\"Write something…\"',\n description: \"플레이스홀더\",\n },\n {\n name: \"toolbar\",\n type: \"ToolbarAction[]\",\n default: '[\"bold\",\"italic\",\"code\",\"link\",\"heading\",\"list\",\"quote\"]',\n description: \"툴바 액션 목록\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [],\n testDescribe: \"RichTextEditor\",\n};\n\nexport const codeDiffViewerMeta: ComponentMeta = {\n name: \"CodeDiffViewer\",\n category: \"shell\",\n description:\n \"코드 비교 뷰어. LCS 알고리즘 기반 unified/split 모드 diff와 포커스 가능한 스크롤 영역을 제공합니다.\",\n slug: \"code-diff-viewer\",\n exports: [\"CodeDiffViewer\"],\n props: {\n CodeDiffViewer: [\n {\n name: \"original\",\n type: \"string\",\n required: true,\n description: \"원본 코드\",\n },\n {\n name: \"modified\",\n type: \"string\",\n required: true,\n description: \"수정된 코드\",\n },\n {\n name: \"mode\",\n type: '\"split\" | \"unified\"',\n default: '\"unified\"',\n description: \"뷰 모드\",\n },\n {\n name: \"showLineNumbers\",\n type: \"boolean\",\n default: \"true\",\n description: \"줄 번호 표시\",\n },\n {\n name: \"scrollLabel\",\n type: \"string\",\n description: \"스크롤 가능한 diff 영역의 접근성 레이블\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [],\n testDescribe: \"CodeDiffViewer\",\n};\n\nexport const webhookConfigMeta: ComponentMeta = {\n name: \"WebhookConfig\",\n category: \"shell\",\n description:\n \"웹훅 설정 패널. URL 입력 + 이벤트 체크박스 + 재시도 설정 + 테스트 버튼.\",\n slug: \"webhook-config\",\n exports: [\"WebhookConfig\"],\n props: {\n WebhookConfig: [\n {\n name: \"webhook\",\n type: \"WebhookDef\",\n required: true,\n description: \"웹훅 설정 객체\",\n },\n {\n name: \"onChange\",\n type: \"(webhook: WebhookDef) => void\",\n required: true,\n description: \"변경 콜백\",\n },\n {\n name: \"availableEvents\",\n type: \"string[]\",\n required: true,\n description: \"선택 가능한 이벤트 목록\",\n },\n { name: \"onTest\", type: \"() => void\", description: \"테스트 버튼 콜백\" },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [\n { slug: \"input\", category: \"core\" },\n { slug: \"checkbox\", category: \"core\" },\n { slug: \"number-input\", category: \"core\" },\n { slug: \"button\", category: \"core\" },\n ],\n testDescribe: \"WebhookConfig\",\n};\n\nexport const featureFlagPanelMeta: ComponentMeta = {\n name: \"FeatureFlagPanel\",\n category: \"shell\",\n description:\n \"피처 플래그 관리 패널. 플래그 토글 + 환경 배지 + 롤아웃 % 조절.\",\n slug: \"feature-flag-panel\",\n exports: [\"FeatureFlagPanel\"],\n props: {\n FeatureFlagPanel: [\n {\n name: \"flags\",\n type: \"FeatureFlag[]\",\n required: true,\n description: \"피처 플래그 목록\",\n },\n {\n name: \"onToggle\",\n type: \"(flagId: string, enabled: boolean) => void\",\n required: true,\n description: \"토글 콜백\",\n },\n {\n name: \"onRolloutChange\",\n type: \"(flagId: string, percentage: number) => void\",\n description: \"롤아웃 % 변경 콜백\",\n },\n {\n name: \"environments\",\n type: \"string[]\",\n required: true,\n description: \"전체 환경 목록\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [\n { slug: \"switch\", category: \"core\" },\n { slug: \"badge\", category: \"core\" },\n { slug: \"number-input\", category: \"core\" },\n ],\n testDescribe: \"FeatureFlagPanel\",\n};\n\nexport const dataImportWizardMeta: ComponentMeta = {\n name: \"DataImportWizard\",\n category: \"shell\",\n description:\n \"데이터 임포트 마법사. 4단계: 업로드 → 컬럼 매핑 → 미리보기 → 확인.\",\n slug: \"data-import-wizard\",\n exports: [\"DataImportWizard\"],\n props: {\n DataImportWizard: [\n {\n name: \"fields\",\n type: \"ImportFieldDef[]\",\n required: true,\n description: \"매핑 대상 필드 목록\",\n },\n {\n name: \"onImport\",\n type: \"(mapping, data) => void\",\n required: true,\n description: \"임포트 확정 콜백\",\n },\n {\n name: \"acceptedFormats\",\n type: \"string\",\n default: '\".csv\"',\n description: \"허용 파일 형식\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [{ slug: \"button\", category: \"core\" }],\n testDescribe: \"DataImportWizard\",\n};\n\nexport const megaMenuMeta: ComponentMeta = {\n name: \"MegaMenu\",\n category: \"shell\",\n description:\n \"메가 메뉴. Popover + CSS grid 멀티컬럼 + 카테고리 헤딩 + footer 슬롯.\",\n slug: \"mega-menu\",\n exports: [\"MegaMenu\"],\n props: {\n MegaMenu: [\n {\n name: \"menus\",\n type: \"MegaMenuSection[]\",\n required: true,\n description: \"메뉴 섹션 배열\",\n },\n {\n name: \"columns\",\n type: \"number\",\n default: \"3\",\n description: \"그리드 컬럼 수\",\n },\n { name: \"footer\", type: \"ReactNode\", description: \"하단 footer 슬롯\" },\n {\n name: \"triggerLabel\",\n type: \"string\",\n default: '\"Menu\"',\n description: \"트리거 버튼 텍스트\",\n },\n { name: \"className\", type: \"string\", description: \"커스텀 CSS 클래스\" },\n ],\n },\n dependencies: [{ slug: \"popover\", category: \"core\" }],\n testDescribe: \"MegaMenu\",\n};\n\nexport const chatSidebarMeta: ComponentMeta = {\n name: \"ChatSidebar\",\n category: \"shell\",\n description: \"AI 채팅 사이드바. 대화 목록, 검색, 새 대화 버튼.\",\n slug: \"chat-sidebar\",\n exports: [\"ChatSidebar\"],\n props: {\n ChatSidebar: [\n {\n name: \"conversations\",\n type: \"ChatConversationDef[]\",\n required: true,\n description:\n \"대화 목록 배열. { id, title, lastMessage?, timestamp, unread? }\",\n },\n {\n name: \"activeConversationId\",\n type: \"string\",\n description: \"현재 활성 대화 ID\",\n },\n {\n name: \"onConversationSelect\",\n type: \"(conversation: ChatConversationDef) => void\",\n description: \"대화 선택 핸들러\",\n },\n {\n name: \"onNewChat\",\n type: \"() => void\",\n description: \"새 대화 생성 핸들러\",\n },\n {\n name: \"onSearch\",\n type: \"(query: string) => void\",\n description: \"검색 핸들러\",\n },\n {\n name: \"labels\",\n type: \"ChatSidebarLabels\",\n description: \"i18n 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [\n { slug: \"button\", category: \"core\" },\n { slug: \"input\", category: \"core\" },\n { slug: \"scroll-area\", category: \"core\" },\n { slug: \"empty-state\", category: \"core\" },\n ],\n testDescribe: \"ChatSidebar\",\n};\n\nexport const chatInputMeta: ComponentMeta = {\n name: \"ChatInput\",\n category: \"shell\",\n description:\n \"채팅 입력 컴포넌트. 자동 리사이즈 textarea, 파일 첨부, 모델/스타일 Select.\",\n slug: \"chat-input\",\n exports: [\"ChatInput\"],\n keyboardShortcuts: [\n { keys: \"Enter\", action: \"메시지 전송\" },\n { keys: \"Shift + Enter\", action: \"줄바꿈\" },\n ],\n props: {\n ChatInput: [\n {\n name: \"value\",\n type: \"string\",\n description: \"제어 모드: 입력 값\",\n },\n {\n name: \"onSend\",\n type: \"(message: string) => void\",\n description: \"메시지 전송 핸들러\",\n },\n {\n name: \"onFileAttach\",\n type: \"() => void\",\n description: \"파일 첨부 클릭 핸들러\",\n },\n {\n name: \"models\",\n type: \"ChatModelDef[]\",\n description: \"모델 선택 옵션\",\n },\n {\n name: \"stylePresets\",\n type: \"ChatStylePresetDef[]\",\n description: \"스타일 프리셋 옵션\",\n },\n {\n name: \"maxRows\",\n type: \"number\",\n default: \"6\",\n description: \"textarea 최대 행 수\",\n },\n {\n name: \"showHint\",\n type: \"boolean\",\n default: \"true\",\n description: \"Shift+Enter 힌트 표시 여부\",\n },\n {\n name: \"labels\",\n type: \"ChatInputLabels\",\n description: \"i18n 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [\n { slug: \"button\", category: \"core\" },\n { slug: \"kbd\", category: \"core\" },\n { slug: \"select\", category: \"core\" },\n ],\n testDescribe: \"ChatInput\",\n examples: [\n {\n title: \"채팅 입력\",\n code: `import { ChatInput } from \"@reopt-ai/opt-ui\";\n\n<ChatInput\n placeholder=\"메시지를 입력하세요...\"\n onSend={(message) => console.log(message)}\n/>`,\n },\n ],\n};\n\nexport const chatMessageListMeta: ComponentMeta = {\n name: \"ChatMessageList\",\n category: \"shell\",\n description:\n \"채팅 메시지 목록. 역할별 말풍선, 타이핑 인디케이터, 자동 스크롤.\",\n slug: \"chat-message-list\",\n exports: [\"ChatMessageList\"],\n props: {\n ChatMessageList: [\n {\n name: \"messages\",\n type: \"ChatMessageDef[]\",\n required: true,\n description: \"메시지 배열. { id, role, content, timestamp }\",\n },\n {\n name: \"loading\",\n type: \"boolean\",\n default: \"false\",\n description: \"타이핑 인디케이터 표시\",\n },\n {\n name: \"renderContent\",\n type: \"(message: ChatMessageDef) => ReactNode\",\n description: \"커스텀 메시지 렌더러. 기본: plain text\",\n },\n {\n name: \"assistantAvatar\",\n type: \"string\",\n description: \"어시스턴트 아바타 이미지 URL\",\n },\n {\n name: \"showTimestamps\",\n type: \"boolean\",\n default: \"true\",\n description: \"타임스탬프 표시 여부\",\n },\n {\n name: \"autoScroll\",\n type: \"boolean\",\n default: \"true\",\n description: \"새 메시지 시 자동 스크롤\",\n },\n {\n name: \"labels\",\n type: \"ChatMessageListLabels\",\n description: \"i18n 라벨 오버라이드\",\n },\n ],\n },\n dependencies: [\n { slug: \"scroll-area\", category: \"core\" },\n { slug: \"avatar\", category: \"core\" },\n { slug: \"empty-state\", category: \"core\" },\n ],\n testDescribe: \"ChatMessageList\",\n examples: [\n {\n title: \"메시지 목록\",\n code: `import { ChatMessageList } from \"@reopt-ai/opt-ui\";\n\nconst messages = [\n { id: \"1\", role: \"user\", content: \"안녕하세요!\", timestamp: new Date() },\n { id: \"2\", role: \"assistant\", content: \"반갑습니다.\", timestamp: new Date() },\n];\n\n<ChatMessageList messages={messages} loading={false} />`,\n },\n ],\n};\n\nexport const pageAsideMeta: ComponentMeta = {\n name: \"PageAside\",\n category: \"shell\",\n description:\n \"Sticky 페이지 사이드 aside chrome. 고정 너비 + header/body/footer 3-slot.\",\n slug: \"page-aside\",\n exports: [\"PageAside\"],\n props: {\n PageAside: [\n {\n name: \"header\",\n type: \"ReactNode\",\n description: \"상단 고정 슬롯 (예: package switcher).\",\n },\n {\n name: \"children\",\n type: \"ReactNode\",\n required: true,\n description: \"스크롤 가능한 네비게이션 영역.\",\n },\n {\n name: \"footer\",\n type: \"ReactNode\",\n description: \"하단 고정 슬롯 (예: version label).\",\n },\n {\n name: \"widthClassName\",\n type: \"string\",\n description: \"너비 Tailwind 클래스. 기본값 `w-60`.\",\n },\n {\n name: \"label\",\n type: \"string\",\n description: \"`<aside>`의 aria-label.\",\n },\n {\n name: \"hideOnMobile\",\n type: \"boolean\",\n description: \"md 아래에서 숨김. 기본값 true.\",\n },\n ],\n },\n testDescribe: \"PageAside\",\n};\n\nexport const timeRangeControlMeta: ComponentMeta = {\n name: \"TimeRangeControl\",\n category: \"shell\",\n description:\n \"date math(now-7d, now/d) 기반 시간 범위 컨트롤. quick select, 프리셋/최근 사용, 명시적 Update, 자동 갱신, 창 이동·확대/축소 버튼을 제공합니다.\",\n slug: \"time-range-control\",\n exports: [\"TimeRangeControl\", \"DEFAULT_TIME_PRESETS\"],\n props: {\n TimeRangeControl: [\n {\n name: \"value\",\n type: \"TimeRange\",\n required: true,\n description: \"{ from, to } — date math 문자열 또는 ISO\",\n },\n {\n name: \"onChange\",\n type: \"(range: TimeRange) => void\",\n required: true,\n description: \"범위가 커밋되었을 때 호출\",\n },\n {\n name: \"presets\",\n type: \"TimeRangePreset[]\",\n description: \"자주 쓰는 범위 목록\",\n },\n {\n name: \"recentRanges\",\n type: \"TimeRangePreset[]\",\n description: \"최근 사용한 범위 (호출자 소유)\",\n },\n {\n name: \"timeZone\",\n type: \"string\",\n description: \"라운딩·표시에 쓸 IANA 타임존\",\n },\n {\n name: \"showUpdateButton\",\n type: \"boolean\",\n default: \"true\",\n description: \"편집을 명시적으로 커밋\",\n },\n {\n name: \"showWindowButtons\",\n type: \"boolean\",\n default: \"true\",\n description: \"이전/다음 창, 확대/축소 버튼\",\n },\n {\n name: \"refresh\",\n type: \"RefreshSetting\",\n description: \"{ interval, paused } 자동 갱신 설정\",\n },\n {\n name: \"onRefresh\",\n type: \"() => void | Promise<unknown>\",\n description: \"갱신 요청 — 프라미스가 끝난 뒤 다음 tick\",\n },\n ],\n },\n ariaRole: \"group\",\n testDescribe: \"TimeRangeControl\",\n};\n\nexport const timeSeriesPanelMeta: ComponentMeta = {\n name: \"TimeSeriesPanel\",\n category: \"shell\",\n description:\n \"시간 범위 컨트롤과 시계열 차트를 한 단위로 묶은 패널. 드래그 줌과 줌 히스토리(되돌리기), 범례 토글을 포함합니다.\",\n slug: \"time-series-panel\",\n exports: [\"TimeSeriesPanel\"],\n props: {\n TimeSeriesPanel: [\n {\n name: \"data\",\n type: \"TimeSeriesPoint[]\",\n required: true,\n description: \"시계열 데이터\",\n },\n {\n name: \"series\",\n type: \"TimeSeriesDef[]\",\n required: true,\n description: \"시리즈 정의\",\n },\n {\n name: \"range\",\n type: \"TimeRange\",\n required: true,\n description: \"조회 구간 — 차트 축도 여기에 고정됩니다\",\n },\n {\n name: \"onRangeChange\",\n type: \"(range: TimeRange) => void\",\n required: true,\n description: \"드래그 줌·컨트롤 변경으로 구간이 바뀔 때 호출\",\n },\n {\n name: \"showRangeControl\",\n type: \"boolean\",\n default: \"true\",\n description: \"헤더에 TimeRangeControl 렌더\",\n },\n {\n name: \"toggleableLegend\",\n type: \"boolean\",\n default: \"false\",\n description: \"범례 클릭으로 시리즈 숨김\",\n },\n {\n name: \"annotations\",\n type: \"TimeSeriesAnnotation[]\",\n description: \"시간축 마커/구간\",\n },\n {\n name: \"height\",\n type: \"number\",\n default: \"280\",\n description: \"차트 높이\",\n },\n ],\n },\n ariaRole: \"region\",\n testDescribe: \"TimeSeriesPanel\",\n};\n\nexport const logTableMeta: ComponentMeta = {\n name: \"LogTable\",\n category: \"shell\",\n description:\n \"계속 도착하는 로그용 윈도잉 테이블. 컬럼 정의 기반, 상단 삽입 시 스크롤 위치 보존, follow 상태 보고, 셀 값 즉시 필터, 밀도·정렬을 지원합니다.\",\n slug: \"log-table\",\n exports: [\"LogTable\"],\n props: {\n LogTable: [\n { name: \"rows\", type: \"Row[]\", required: true, description: \"표시할 행\" },\n {\n name: \"columns\",\n type: \"LogColumn<Row>[]\",\n required: true,\n description: \"컬럼 정의 (표시 중인 것만)\",\n },\n {\n name: \"getRowId\",\n type: \"(row: Row) => string\",\n required: true,\n description: \"행 식별자\",\n },\n { name: \"selectedId\", type: \"string | null\", description: \"선택된 행\" },\n {\n name: \"onSelect\",\n type: \"(id: string) => void\",\n description: \"행 선택\",\n },\n {\n name: \"onLoadMore\",\n type: \"() => void\",\n description: \"다음 페이지 요청\",\n },\n {\n name: \"prepending\",\n type: \"boolean\",\n default: \"false\",\n description: \"상단에 행이 삽입되는 라이브 목록\",\n },\n {\n name: \"onFollowChange\",\n type: \"(following: boolean) => void\",\n description: \"최신 행 고정 여부 보고\",\n },\n {\n name: \"isNew\",\n type: \"(row: Row) => boolean\",\n description: \"방금 도착한 행 강조\",\n },\n { name: \"sort\", type: \"LogSort | null\", description: \"정렬 상태\" },\n {\n name: \"onSortChange\",\n type: \"(sort: LogSort) => void\",\n description: \"헤더 클릭 정렬\",\n },\n {\n name: \"onCellAction\",\n type: \"(action: LogCellAction) => void\",\n description: \"셀 값 포함/제외 필터\",\n },\n {\n name: \"highlightTerms\",\n type: \"string[]\",\n description: \"셀 텍스트에서 표시할 검색어. 쿼리의 자유 텍스트만 넘긴다\",\n },\n {\n name: \"density\",\n type: '\"compact\" | \"normal\" | \"comfortable\"',\n default: '\"normal\"',\n description: \"행 높이와 글자 크기\",\n },\n ],\n },\n ariaRole: \"listbox\",\n testDescribe: \"LogTable\",\n};\n\nexport const queryBarMeta: ComponentMeta = {\n name: \"QueryBar\",\n category: \"shell\",\n description:\n \"검색과 필터를 한 입력으로 합친 쿼리 바. field:value, -부정, (a or b), 비교 연산, 필드·값 자동완성, 절(clause) 칩을 지원합니다.\",\n slug: \"query-bar\",\n exports: [\"QueryBar\"],\n props: {\n QueryBar: [\n {\n name: \"value\",\n type: \"Query\",\n required: true,\n description: \"파싱된 쿼리\",\n },\n {\n name: \"onChange\",\n type: \"(query: Query) => void\",\n required: true,\n description: \"커밋 시 호출 (Enter·blur)\",\n },\n {\n name: \"fields\",\n type: \"QueryField[]\",\n description: \"자동완성할 필드와 알려진 값\",\n },\n {\n name: \"showClauses\",\n type: \"boolean\",\n default: \"false\",\n description: \"절을 제거 가능한 칩으로 표시\",\n },\n {\n name: \"live\",\n type: \"boolean\",\n default: \"false\",\n description: \"키 입력마다 커밋\",\n },\n ],\n },\n ariaRole: \"combobox\",\n testDescribe: \"QueryBar\",\n};\n\nexport const fieldSidebarMeta: ComponentMeta = {\n name: \"FieldSidebar\",\n category: \"shell\",\n description:\n \"데이터에 어떤 필드가 있고 각 필드가 무슨 값을 갖는지 보여주는 사이드바. 값 분포 막대, 컬럼으로 승격, 값 기준 포함/제외 필터를 제공합니다.\",\n slug: \"field-sidebar\",\n exports: [\"FieldSidebar\"],\n props: {\n FieldSidebar: [\n {\n name: \"fields\",\n type: \"FieldSummary[]\",\n required: true,\n description: \"필드 목록\",\n },\n {\n name: \"expandedField\",\n type: \"string | null\",\n description: \"값을 펼친 필드\",\n },\n {\n name: \"onExpandedFieldChange\",\n type: \"(field: string | null) => void\",\n description: \"펼침 전환 — 호출자가 값을 조회\",\n },\n {\n name: \"values\",\n type: \"FieldValueCount[]\",\n description: \"펼친 필드의 상위 값\",\n },\n {\n name: \"valuesLoading\",\n type: \"boolean\",\n default: \"false\",\n description: \"값 조회 중\",\n },\n {\n name: \"sampledRows\",\n type: \"number\",\n description: \"집계 대상 행 수 (분모)\",\n },\n {\n name: \"onToggleColumn\",\n type: \"(field: string, next: boolean) => void\",\n description: \"컬럼 추가/제거\",\n },\n {\n name: \"onFilter\",\n type: '(field: string, value: string, intent: \"include\" | \"exclude\") => void',\n description: \"값 기준 필터\",\n },\n ],\n },\n ariaRole: \"complementary\",\n testDescribe: \"FieldSidebar\",\n};\n\nexport const shellMetas = [\n faqAccordionMeta,\n pageAsideMeta,\n contentTabsMeta,\n dashboardGridMeta,\n searchComboboxMeta,\n statusSelectMeta,\n editorToolbarMeta,\n sidebarNavMeta,\n settingsFormMeta,\n appMenubarMeta,\n commandPaletteMeta,\n commandPaletteTriggerMeta,\n deploymentTimelineMeta,\n projectSwitcherMeta,\n envPanelMeta,\n branchSelectMeta,\n domainTableMeta,\n dataTableMeta,\n notificationToastMeta,\n designGuidePanelMeta,\n taskListMeta,\n activityFeedMeta,\n filterBarMeta,\n quickActionsMeta,\n teamMemberListMeta,\n formLoginMeta,\n formWizardMeta,\n formDynamicMeta,\n formUploadMeta,\n eventIconMeta,\n connectionIndicatorMeta,\n floatingActionBarMeta,\n templatePickerMeta,\n failureListMeta,\n keyValueEditorMeta,\n workflowCanvasMeta,\n codeSnippetViewerMeta,\n propertyExplorerMeta,\n queryResultsTableMeta,\n alertBuilderMeta,\n sqlEditorMeta,\n eventMetaEditorMeta,\n widgetGridMeta,\n reportBuilderMeta,\n segmentBuilderMeta,\n insightsPanelMeta,\n timeRangeSelectorMeta,\n exportButtonMeta,\n summaryRowMeta,\n comparisonSelectorMeta,\n themeSwitcherMeta,\n promptTemplateMeta,\n sidebarMeta,\n appShellMeta,\n confirmDialogMeta,\n asyncComboboxMeta,\n verticalTabsMeta,\n columnTogglerMeta,\n treeTableMeta,\n inlineEditTableMeta,\n kanbanBoardMeta,\n richTextEditorMeta,\n codeDiffViewerMeta,\n webhookConfigMeta,\n featureFlagPanelMeta,\n dataImportWizardMeta,\n megaMenuMeta,\n bulkActionsMeta,\n savedFiltersMeta,\n notificationCenterMeta,\n auditLogMeta,\n auditTimelineMeta,\n chatSidebarMeta,\n chatInputMeta,\n chatMessageListMeta,\n timeRangeControlMeta,\n timeSeriesPanelMeta,\n logTableMeta,\n queryBarMeta,\n fieldSidebarMeta,\n];\n"],"mappings":"AA65IA,MAAa,YAAY;CACvB;EAjjBA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GAAC;GAAc;GAAqB;EAAkB;EAC/D,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAa;EACjE,EACF;EACA,UAAU;EACV,cAAc;CAkgBd;CACA;EA/fA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,SAAS,YAAY;EAC/B,OAAO;GACL,OAAO;IACL;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAa;GACjE;GACA,YAAY;IACV;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KAAE,MAAM;KAAO,MAAM;KAAU,aAAa;IAAc;IAC1D;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KAAE,MAAM;KAAc,MAAM;KAAa,aAAa;IAAU;IAChE;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAa;IAC/D;KAAE,MAAM;KAAc,MAAM;KAAU,aAAa;IAAY;GACjE;EACF;EACA,UAAU;EACV,cAAc;CA0Yd;CACA;EAvYA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,cAAc,iBAAiB;EACzC,OAAO;GACL,YAAY;IACV;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KAAE,MAAM;KAAS,MAAM;KAAa,aAAa;IAAU;IAC3D;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KAAE,MAAM;KAAW,MAAM;KAAc,aAAa;IAAS;IAC7D;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KAAE,MAAM;KAAc,MAAM;KAAU,aAAa;IAAS;IAC5D;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAa;GACjE;GACA,iBAAiB;IACf;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAa;IAC/D;KAAE,MAAM;KAAc,MAAM;KAAU,aAAa;IAAY;GACjE;EACF;EACA,UAAU;EACV,cAAc;CAoUd;CACA;EAjUA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,cAAc;EACxB,OAAO,EACL,cAAc;GACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAa;EACjE,EACF;EACA,cAAc;CA0Rd;CACA;EAvRA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,WAAW;EACrB,OAAO,EACL,WAAW;GACT;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAa;GAC/D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;CA+Od;CACA;EA5OA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAoMd;CACA;EAjMA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GAAC;GAAuB;GAAsB;EAAgB;EACvE,OAAO;GACL,qBAAqB;IACnB;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KAAE,MAAM;KAAc,MAAM;KAAU,aAAa;IAAS;IAC5D;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAa;GACjE;GACA,oBAAoB;IAClB;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KAAE,MAAM;KAAS,MAAM;KAAU,aAAa;IAAa;IAC3D;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAa;GACjE;EACF;EACA,cAAc;CA6Hd;CACA;EA1HA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IAAE,MAAM;IAAS,MAAM;IAAU,UAAU;IAAM,aAAa;GAAO;GACrE;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAe,MAAM;IAAU,aAAa;GAAW;GAC/D;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAQ;GAC1D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAa;EACjE,EACF;EACA,cAAc;CAoEd;CACA;EAjEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAS,MAAM;IAAqB,aAAa;GAAS;GAClE;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAa;EACjE,EACF;EACA,cAAc;CAYd;CACA;EAp6IA,MAAM;EACN,UAAU;EACV,oBAAoB;EACpB,UAAU;EACV,UAAU;GAAC;GAAc;GAAQ;GAAS;GAAc;EAAM;EAC9D,aACE;EACF,MAAM;EACN,SAAS,CAAC,MAAM;EAChB,OAAO,EACL,MAAM;GACJ;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAY,MAAM;IAAW,aAAa;GAAa;GAC/D;IAAE,MAAM;IAAY,MAAM;IAAa,aAAa;GAAU;EAChE,EACF;EACA,OAAO;GACL,eAAe,CACb,+CACF;GACA,OAAO,CAAC,2CAA2C;EACrD;EACA,SAAS;GACP,QAAQ;GACR,OAAO,CAAC,MAAM;GACd,WAAW;IACT;IACA;IACA;IACA;GACF;EACF;EACA,WAAW,CACT;GACE,MAAM;GACN,aAAa;GACb,UAAU;EACZ,CACF;EACA,cAAc;CA+2Id;CACA;EA52IA,MAAM;EACN,UAAU;EACV,oBAAoB;EACpB,UAAU;EACV,UAAU;GAAC;GAAc;GAAW;GAAW;EAAW;EAC1D,aACE;EACF,MAAM;EACN,SAAS,CAAC,SAAS;EACnB,OAAO,EACL,SAAS;GACP;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAY,MAAM;IAAa,aAAa;GAAS;EAC/D,EACF;EACA,OAAO;GACL,eAAe,CACb,4CACF;GACA,OAAO,CAAC,+BAA+B;EACzC;EACA,SAAS;GACP,QAAQ;GACR,OAAO,CAAC,MAAM;GACd,WAAW;IACT;IACA;IACA;GACF;EACF;EACA,WAAW,CACT;GACE,MAAM;GACN,aAAa;GACb,UAAU;EACZ,CACF;EACA,cAAc;CA8zId;CACA;EA3zIA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,KAAK;EACf,OAAO,EACL,KAAK;GACH;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;CAiyId;CACA;EA9xIA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,WAAW;EACrB,OAAO,EACL,WAAW;GACT;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAa;EACjE,EACF;EACA,cAAc;CAowId;CACA;EAjwIA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,UAAU;EACpB,OAAO,EACL,UAAU;GACR;IAAE,MAAM;IAAU,MAAM;IAAU,aAAa;GAAc;GAC7D;IAAE,MAAM;IAAS,M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MAAM;KACN,aAAa;IACf;GACF;GACA,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aACE;IACJ;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,KAAK;IACH;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,UAAU;IACR;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;EACF;EACA,UAAU;EACV,cAAc;CAi1Hd;CACA;EA90HA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;EACF;EACA,mBAAmB;GACjB;IAAE,MAAM;IAAO,QAAQ;GAAQ;GAC/B;IAAE,MAAM;IAAiB,QAAQ;GAAQ;GACzC;IAAE,MAAM;IAAO,QAAQ;GAAS;GAChC;IAAE,MAAM;IAAS,QAAQ;GAAe;EAC1C;EACA,OAAO;GACL,YAAY;IACV;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,aAAa,CACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,eAAe,CACb;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,eAAe;IACb;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,YAAY;IACV;KAAE,MAAM;KAAS,MAAM;KAAU,UAAU;KAAM,aAAa;IAAO;IACrE;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;EACF;EACA,UAAU;EACV,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;;;;;EAWR,CACF;CAktHA;CACA;EA/sHA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,mBAAmB,CACjB;GAAE,MAAM;GAAO,QAAQ;EAAW,GAClC;GAAE,MAAM;GAAO,QAAQ;EAAsB,CAC/C;EACA,OAAO;GACL,YAAY,CACV;IAAE,MAAM;IAAQ,MAAM;IAAW,aAAa;GAAe,GAC7D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,kBAAkB,CAChB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,aAAa;IACX;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,eAAe,CACb;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,mBAAmB,CACjB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,eAAe,CACb;IAAE,MAAM;IAAY,MAAM;IAAa,aAAa;GAAW,CACjE;GACA,cAAc,CACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,YAAY,CACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,cAAc,CACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;EACF;EACA,UAAU;EACV,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;;;;EAUR,CACF;CA+kHA;CACA;EA5kHA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,mBAAmB;GACjB;IAAE,MAAM;IAAO,QAAQ;GAAQ;GAC/B;IAAE,MAAM;IAAS,QAAQ;GAAQ;GACjC;IAAE,MAAM;IAAO,QAAQ;GAAS;EAClC;EACA,uBAAuB;EACvB,4BACE;EACF,OAAO;GACL,cAAc,CACZ;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf,CACF;GACA,eAAe;IACb;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,iBAAiB;IACf;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,cAAc;IACZ;KAAE,MAAM;KAAS,MAAM;KAAU,UAAU;KAAM,aAAa;IAAO;IACrE;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,eAAe,CACb;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,oBAAoB,CAClB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,eAAe,CACb;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;EACF;EACA,UAAU;EACV,cAAc;CA28Gd;CACA;EAx8GA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,mBAAmB;GACjB;IAAE,MAAM;IAAO,QAAQ;GAAU;GACjC;IAAE,MAAM;IAAO,QAAQ;GAAW;GAClC;IAAE,MAAM;IAAiB,QAAQ;GAAW;GAC5C;IAAE,MAAM;IAAO,QAAQ;GAAQ;EACjC;EACA,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,OAAO;GACL,aAAa,CAAC;GACd,kBAAkB,CAChB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,UAAU,CAAC;GACX,aAAa,CACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,iBAAiB,CACf;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAc,CAClE;GACA,aAAa;IACX;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,UAAU;IACR;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KAAE,MAAM;KAAW,MAAM;KAAc,aAAa;IAAS;IAC7D;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,kBAAkB;IAChB;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KAAE,MAAM;KAAW,MAAM;KAAW,aAAa;IAAQ;IACzD;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,eAAe;IACb;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KAAE,MAAM;KAAW,MAAM;KAAW,aAAa;IAAQ;IACzD;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,eAAe,CACb;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;EACF;EACA,UAAU;EACV,cAAc;CAyyGd;CACA;EAtyGA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,mBAAmB;GACjB;IAAE,MAAM;IAAO,QAAQ;GAAU;GACjC;IAAE,MAAM;IAAiB,QAAQ;GAAS;GAC1C;IAAE,MAAM;IAAQ,QAAQ;GAAe;GACvC;IAAE,MAAM;IAAO,QAAQ;GAAc;EACvC;EACA,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,OAAO;GACL,aAAa,CACX;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf,CACF;GACA,kBAAkB,CAChB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,eAAe;IACb;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KAAE,MAAM;KAAW,MAAM;KAAc,aAAa;IAAS;IAC7D;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,kBAAkB,CAChB;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,iBAAiB,CAAC;GAClB,eAAe,CACb;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,GACA;IAAE,MAAM;IAAY,MAAM;IAAa,aAAa;GAAQ,CAC9D;GACA,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;EACF;EACA,UAAU;EACV,cAAc;CA+sGd;CACA;EA5sGA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,OAAO;GACL,UAAU;IACR;KACE,MAAM;KACN,MAAM;KACN,aACE;IACJ;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KAAE,MAAM;KAAe,MAAM;KAAU,aAAa;IAAS;IAC7D;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,cAAc;IACZ;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KAAE,MAAM;KAAe,MAAM;KAAU,aAAa;IAAS;IAC7D;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,YAAY;IACV;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,mBAAmB;IACjB;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;GACA,gBAAgB,CACd;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,YAAY;IACV;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,YAAY,CACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,cAAc,CACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,gBAAgB,CACd;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,iBAAiB;IACf;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,aAAa,CACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,cAAc,CACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,gBAAgB;IACd;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,UAAU;IACR;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,YAAY;IACV;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,gBAAgB,CAAC;GACjB,cAAc,CACZ;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;EACF;EACA,cAAc;EACd,UAAU;GACR;IACE,OAAO;IACP,MAAM;;;;;;;;;;;;GAYR;GACA;IACE,OAAO;IACP,MAAM;;;;;;;;;;;;;;;;GAgBR;GACA;IACE,OAAO;IACP,MAAM;;;;;;;;;;;;GAYR;EACF;CAiuFA;CACA;EA9tFA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,QAAQ;EAClB,OAAO,EACL,QAAQ;GACN;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;EAOR,CACF;CAsqFA;CACA;EAnqFA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,OAAO;EACjB,OAAO,EACL,OAAO;GACL;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc;CA6nFd;CACA;EA1nFA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,SAAS;EACnB,OAAO,EACL,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACN,SAAS;GACT,aAAa;EACf,CACF,EACF;EACA,UAAU;EACV,cAAc;CAymFd;CACA;EAtmFA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,OAAO;EACjB,OAAO,EACL,OAAO;GACL;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAgkFd;CACA;EA7jFA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,OAAO;EACjB,OAAO,EACL,OAAO;GACL;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;;;EASR,GACA;GACE,OAAO;GACP,MAAM;;;;;;;;;;EAUR,CACF;CAw/EA;CACA;EAr/EA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,QAAQ;EAClB,OAAO,EACL,QAAQ;GACN;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAs8Ed;CACA;EAn8EA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;EACF;EACA,OAAO;GACL,UAAU;IACR;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;GACA,cAAc,CACZ;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf,CACF;GACA,gBAAgB,CACd;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf,CACF;GACA,eAAe,CACb;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf,CACF;EACF;EACA,UAAU;EACV,cAAc;CAw3Ed;CACA;EAr3EA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,UAAU;EACpB,OAAO,EACL,UAAU;GACR;IAAE,MAAM;IAAS,MAAM;IAAU,aAAa;GAAY;GAC1D;IAAE,MAAM;IAAS,MAAM;IAAU,aAAa;GAAS;GACvD;IAAE,MAAM;IAAQ,MAAM;IAAU,aAAa;GAAS;GACtD;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAQ,MAAM;IAAU,SAAS;IAAK,aAAa;GAAS;EACtE,EACF;EACA,UAAU;EACV,cAAc;CA21Ed;CACA;EAx1EA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,UAAU,aAAa;EACjC,OAAO;GACL,QAAQ;IACN;KAAE,MAAM;KAAO,MAAM;KAAU,aAAa;IAAU;IACtD;KAAE,MAAM;KAAO,MAAM;KAAU,aAAa;IAAa;IACzD;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,aAAa;IACX;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;GACF;EACF;EACA,cAAc;CAmyEd;CACA;EAhyEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY,kBAAkB;EACxC,OAAO;GACL,UAAU;IACR;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KAAE,MAAM;KAAO,MAAM;KAAU,SAAS;KAAO,aAAa;IAAO;IACnE;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KAAE,MAAM;KAAS,MAAM;KAAU,aAAa;IAAU;IACxD;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;GACA,kBAAkB;IAChB;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KAAE,MAAM;KAAO,MAAM;KAAU,SAAS;KAAO,aAAa;IAAO;IACnE;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KAAE,MAAM;KAAS,MAAM;KAAU,aAAa;IAAU;IACxD;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;EACF;EACA,UAAU;EACV,cAAc;CAysEd;CACA;EAtsEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,OAAO;EACjB,OAAO,EACL,OAAO;GACL;IAAE,MAAM;IAAS,MAAM;IAAU,UAAU;IAAM,aAAa;GAAO;GACrE;IAAE,MAAM;IAAO,MAAM;IAAU,SAAS;IAAK,aAAa;GAAO;GACjE;IAAE,MAAM;IAAO,MAAM;IAAU,SAAS;IAAO,aAAa;GAAO;GACnE;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAS,MAAM;IAAU,aAAa;GAAU;EAC1D,EACF;EACA,UAAU;EACV,cAAc;CAqqEd;CACA;EAlqEA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAuoEd;CACA;EApoEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;CAqmEd;CACA;EAlmEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;EACF;EACA,OAAO;GACL,MAAM;IACJ;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,YAAY,CAAC;GACb,WAAW,CAAC;GACZ,iBAAiB,CAAC;GAClB,aAAa,CAAC;GACd,YAAY,CAAC;EACf;EACA,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;;;;;EAWR,CACF;EACA,cAAc;CAgiEd;CACA;EA7hEA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY,eAAe;EACrC,OAAO;GACL,UAAU;IACR;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;GACA,eAAe;IACb;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;EACF;EACA,UAAU;EACV,cAAc;CA28Dd;CACA;EAx8DA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,cAAc,OAAO;EAC/B,mBAAmB;GACjB;IAAE,MAAM;IAAO,QAAQ;GAAc;GACrC;IAAE,MAAM;IAAO,QAAQ;GAAc;GACrC;IAAE,MAAM;IAAS,QAAQ;GAAW;EACtC;EACA,OAAO;GACL,YAAY;IACV;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;GACF;GACA,OAAO;IACL;KACE,MAAM;KACN,MAAM;KACN,aACE;IACJ;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;EACF;EACA,UAAU;EACV,cAAc;CAg4Dd;CACA;EA73DA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,iBAAiB;EAC3B,OAAO,EACL,iBAAiB;GACf;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;CA4yDd;CACA;EAzyDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,UAAU;EACpB,mBAAmB;GACjB;IAAE,MAAM;IAAS,QAAQ;GAAQ;GACjC;IAAE,MAAM;IAAa,QAAQ;GAAwB;GACrD;IAAE,MAAM;IAAO,QAAQ;GAAsC;GAC7D;IAAE,MAAM;IAAU,QAAQ;GAAa;GACvC;IAAE,MAAM;IAAU,QAAQ;GAAO;GACjC;IAAE,MAAM;IAAgB,QAAQ;GAAO;EACzC;EACA,OAAO,EACL,UAAU;GACR;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc;CAsuDd;CACA;EAnuDA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,aAAa;EACvB,OAAO,EACL,aAAa;GACX;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc;CAgsDd;CACA;EA7rDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc;CAypDd;CACA;EAtpDA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,aAAa;EACvB,OAAO,EACL,aAAa;GACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;CAunDd;CACA;EApnDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,kBAAkB;EAC5B,OAAO,EACL,kBAAkB;GAChB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IAC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,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAc;EAClE,EACF;EACA,cAAc;CA01Cd;CACA;EAv1CA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAc;EAClE,EACF;EACA,cAAc;CAg0Cd;CACA;EA7zCA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,WAAW;EACrB,OAAO,EACL,WAAW;GACT;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAc;EAClE,EACF;EACA,cAAc;CAgyCd;CACA;EA7xCA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,SAAS;EACnB,OAAO,EACL,SAAS;GACP;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IAAE,MAAM;IAAS,MAAM;IAAU,aAAa;GAAa;GAC3D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAc;EAClE,EACF;EACA,cAAc;CAswCd;CACA;EAnwCA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GAAC;GAAuB;GAAkB;EAAiB;EACpE,OAAO;GACL,qBAAqB;IACnB;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAc;GAClE;GACA,gBAAgB;IACd;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAc;GAClE;GACA,iBAAiB;IACf;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAc;GAClE;EACF;EACA,cAAc;CA6pCd;CACA;EA1pCA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,aAAa;EACvB,OAAO,EACL,aAAa;GACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;EAMR,CACF;CAmmCA;CACA;EAhmCA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,aAAa;EACvB,OAAO,EACL,aAAa;GACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;;;;;;;;;;EAgBR,CACF;CAgjCA;CACA;EA7iCA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,MAAM;EAChB,OAAO,EACL,MAAM;GACJ;IAAE,MAAM;IAAO,MAAM;IAAU,aAAa;GAAa;GACzD;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAQ,MAAM;IAAU,aAAa;GAAU;GACvD;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAW,MAAM;IAAc,aAAa;GAAS;GAC7D;IAAE,MAAM;IAAa,MAAM;IAAU,aAAa;GAAc;EAClE,EACF;EACA,cAAc;CAygCd;CACA;EAtgCA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GAAC;GAAc;GAAe;EAAa;EACpD,mBAAmB,CACjB;GAAE,MAAM;GAAO,QAAQ;EAAS,GAChC;GAAE,MAAM;GAAO,QAAQ;EAAgB,CACzC;EACA,OAAO;GACL,YAAY,CACV;IAAE,MAAM;IAAQ,MAAM;IAAW,aAAa;GAAc,GAC5D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,aAAa;IACX;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;EACF;EACA,UAAU;EACV,cAAc;CAu9Bd;CACA;EAp9BA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAs4Bd;CACA;EAn4BA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,aAAa;EACvB,OAAO,EACL,aAAa;GACX;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc;CAi2Bd;CACA;EA91BA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,gBAAgB;EAC1B,OAAO,EACL,gBAAgB;GACd;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc,CAAC;GAAE,MAAM;GAAW,UAAU;EAAO,CAAC;EACpD,cAAc;CAg0Bd;CACA;EA7zBA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,mBAAmB;GACjB;IAAE,MAAM;IAAwB,QAAQ;GAAU;GAClD;IAAE,MAAM;IAAyB,QAAQ;GAAU;GACnD;IAAE,MAAM;IAAQ,QAAQ;GAAW;GACnC;IAAE,MAAM;IAAO,QAAQ;GAAY;EACrC;EACA,cAAc;CAixBd;CACA;EA9wBA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,eAAe;EAGzB,gBAAgB,CAAC,eAAe;EAChC,OAAO,EACL,eAAe;GACb;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;CAgvBd;CACA;EA7uBA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,mBAAmB;GACjB;IAAE,MAAM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ACN,SAAS,CAAC,gBAAgB;EAC1B,OAAO,EACL,gBAAgB;GACd;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAY,UAAU;EAAO,CAAC;EACrD,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;EAOR,CACF;CA83GA;CACA;EA33GA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,cAAc;EACxB,OAAO,EACL,cAAc;GACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IAAE,MAAM;IAAS,MAAM;IAAU,aAAa;GAAiB;GAC/D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAU,UAAU;EAAO,CAAC;EACnD,cAAc;CA+1Gd;CACA;EA51GA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,eAAe;EACzB,OAAO,EACL,eAAe;GACb;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAW,UAAU;EAAO,CAAC;EACpD,cAAc;CAi0Gd;CACA;EA9zGA,MAAM;E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AAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,aACE;GACJ,GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf,CACF;EACF;EACA,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;;;;;;EAYR,GACA;GACE,OAAO;GACP,MAAM;;;;;;;;;;;;EAYR,CACF;CA84FA;CACA;EA34FA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GAAC;GAAiB;GAAY;GAAqB;EAAO;EACnE,uBAAuB;EACvB,4BACE;EACF,cAAc,CAAC;GAAE,MAAM;GAAS,UAAU;EAAO,CAAC;EAClD,OAAO;GACL,eAAe;IACb;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;GACA,UAAU,CACR;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf,CACF;GACA,OAAO,CACL;IACE,MAAM;IACN,MAAM;IACN,aACE;GACJ,CACF;GACA,mBAAmB,CACjB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf,CACF;EACF;EACA,cAAc;CA80Fd;CACA;EA30FA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,YAAY;EACZ,SAAS,CAAC,kBAAkB;EAC5B,OAAO,EACL,kBAAkB,CAChB;GACE,MAAM;GACN,MAAM;GACN,aAAa;EACf,CACF,EACF;EACA,cAAc;CA2zFd;CACA;EAxzFA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,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,UAAU;EAAO,CAAC;EACnD,cAAc;CAglFd;CACA;EA7kFA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,YAAY;EACZ,SAAS,CAAC,UAAU;EACpB,OAAO,EACL,UAAU;GACR;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAQ,UAAU;EAAO,CAAC;EACjD,cAAc;CA2hFd;CACA;EAxhFA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,YAAY;EACZ,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;GACZ;IAAE,MAAM;IAAQ,UAAU;GAAO;GACjC;IAAE,MAAM;IAAY,UAAU;GAAO;GACrC;IAAE,MAAM;IAAe,UAAU;GAAO;EAC1C;EACA,cAAc;CAu+Ed;CACA;EAp+EA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,YAAY;EACZ,SAAS,CAAC,kBAAkB;EAC5B,OAAO,EACL,kBAAkB;GAChB;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAQ,UAAU;EAAO,CAAC;EACjD,cAAc;CAk7Ed;CACA;EA/6EA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,YAAY;EACZ,SAAS,CAAC,gBAAgB;EAC1B,OAAO,EACL,gBAAgB;GACd;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAQ,UAAU;EAAO,CAAC;EACjD,cAAc;CAk3Ed;CACA;EA/2EA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS;GAAC;GAAa;GAAiB;EAAe;EACvD,OAAO,EACL,WAAW;GACT;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAg1Ed;CACA;EA70EA,MAAM;EACN,UAAU;EACV,aAC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E,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CACZ;GAAE,MAAM;GAAU,UAAU;EAAO,GACnC;GAAE,MAAM;GAAS,UAAU;EAAO,CACpC;EACA,cAAc;CAw0Dd;CACA;EAr0DA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,gBAAgB;EAC1B,OAAO,CAAC;EACR,cAAc,CACZ;GAAE,MAAM;GAAU,UAAU;EAAO,GACnC;GAAE,MAAM;GAAS,UAAU;EAAO,CACpC;EACA,cAAc;CA0zDd;CACA;EAvzDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,eAAe;EACzB,OAAO,EACL,eAAe;GACb;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;GACZ;IAAE,MAAM;IAAU,UAAU;GAAO;GACnC;IAAE,MAAM;IAAa,UAAU;GAAO;GACtC;IAAE,MAAM;IAAS,UAAU;GAAO;EACpC;EACA,cAAc;CAywDd;CACA;EAtwDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,mBAAmB;EAC7B,OAAO,EACL,mBAAmB;GACjB;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;GACZ;IAAE,MAAM;IAAU,UAAU;GAAO;GACnC;IAAE,MAAM;IAAW,UAAU;GAAO;GACpC;IAAE,MAAM;IAAqB,UAAU;GAAO;EAChD;EACA,cAAc;CAmuDd;CACA;EAhuDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,cAAc;EACxB,OAAO,EACL,cAAc;GACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CACZ;GAAE,MAAM;GAAiB,UAAU;EAAO,GAC1C;GAAE,MAAM;GAAU,UAAU;EAAO,CACrC;EACA,cAAc;CAsrDd;CACA;EAjrDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,YAAY;EACtB,OAAO,EACL,YAAY;GACV;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc,CACZ;GAAE,MAAM;GAAa,UAAU;EAAO,GACtC;GAAE,MAAM;GAAY,UAAU;EAAO,CACvC;EACA,cAAc;CA2nDd;CACA;EAxnDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,oBAAoB;EAC9B,OAAO,EACL,oBAAoB;GAClB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CACZ;GAAE,MAAM;GAAU,UAAU;EAAO,GACnC;GAAE,MAAM;GAAU,UAAU;EAAO,CACrC;EACA,cAAc;CA2kDd;CACA;EAxkDA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,eAAe;EACzB,OAAO,EACL,eAAe,CACb;GACE,MAAM;GACN,MAAM;GACN,aAAa;EACf,CACF,EACF;EACA,cAAc;CA0jDd;CACA;EAvjDA,MAAM;EACN,UAAU;EACV,aAAa;EACb,MAAM;EACN,SAAS,CAAC,gBAAgB;EAC1B,OAAO,EACL,gBAAgB;GACd;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aACE;GACJ;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAS,UAAU;EAAO,CAAC;EAClD,cAAc;CAihDd;CACA;EA9gDA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,WAAW,YAAY;EACjC,mBAAmB;GACjB;IAAE,MAAM;IAAU,QAAQ;GAAiB;GAC3C;IAAE,MAAM;IAAO,QAAQ;GAAe;GACtC;IAAE,MAAM;IAAc,QAAQ;GAAwB;EACxD;EACA,OAAO;GACL,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aACE;IACJ;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAc;GAClE;GACA,iBAAiB;IACf;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAc;GAClE;GACA,gBAAgB;IACd;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,SAAS;KACT,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aAAa;IACf;IACA;KACE,MAAM;KACN,MAAM;KACN,aACE;IACJ;IACA;KAAE,MAAM;KAAa,MAAM;KAAU,aAAa;IAAc;GAClE;EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAe,UAAU;EAAS,CAAC;EAC1D,cAAc;CAi5Cd;CACA;EA94CA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,UAAU;EACpB,OAAO,EACL,UAAU,CACR;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,aACE;EACJ,GACA;GAAE,MAAM;GAAa,MAAM;GAAU,aAAa;EAAc,CAClE,EACF;EACA,cAAc,CACZ;GAAE,MAAM;GAAW,UAAU;EAAS,GACtC;GAAE,MAAM;GAAe,UAAU;EAAO,CAC1C;EACA,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;EAOR,CACF;CA42CA;CACA;EAz2CA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,eAAe;EACzB,OAAO,EACL,eAAe;GACb;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IAAE,MAAM;IAAe,MAAM;IAAU,aAAa;GAAS;GAC7D;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,cAAc,CAAC;GAAE,MAAM;GAAU,UAAU;EAAO,CAAC;EACnD,cAAc;CAmzCd;CACA;EAhzCA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,eAAe;EACzB,OAAO,EACL,eAAe;GACb;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc,CACZ;GAAE,MAAM;GAAY,UAAU;EAAO,GACrC;GAAE,MAAM;GAAW,UAAU;EAAO,CACtC;EACA,cAAc;CA2v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,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;GACZ;IAAE,MAAM;IAAU,UAAU;GAAO;GACnC;IAAE,MAAM;IAAS,UAAU;GAAO;GAClC;IAAE,MAAM;IAAe,UAAU;GAAO;GACxC;IAAE,MAAM;IAAe,UAAU;GAAO;EAC1C;EACA,cAAc;CA4jBd;CACA;EAzjBA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,WAAW;EACrB,mBAAmB,CACjB;GAAE,MAAM;GAAS,QAAQ;EAAS,GAClC;GAAE,MAAM;GAAiB,QAAQ;EAAM,CACzC;EACA,OAAO,EACL,WAAW;GACT;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;GACZ;IAAE,MAAM;IAAU,UAAU;GAAO;GACnC;IAAE,MAAM;IAAO,UAAU;GAAO;GAChC;IAAE,MAAM;IAAU,UAAU;GAAO;EACrC;EACA,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;EAMR,CACF;CAifA;CACA;EA9eA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,iBAAiB;EAC3B,OAAO,EACL,iBAAiB;GACf;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,cAAc;GACZ;IAAE,MAAM;IAAe,UAAU;GAAO;GACxC;IAAE,MAAM;IAAU,UAAU;GAAO;GACnC;IAAE,MAAM;IAAe,UAAU;GAAO;EAC1C;EACA,cAAc;EACd,UAAU,CACR;GACE,OAAO;GACP,MAAM;;;;;;;;EAQR,CACF;CA2aA;CACA;EA3XA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,oBAAoB,sBAAsB;EACpD,OAAO,EACL,kBAAkB;GAChB;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CA+Td;CACA;EA5TA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,iBAAiB;EAC3B,OAAO,EACL,iBAAiB;GACf;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAkQd;CACA;EA/PA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,UAAU;EACpB,OAAO,EACL,UAAU;GACR;IAAE,MAAM;IAAQ,MAAM;IAAS,UAAU;IAAM,aAAa;GAAQ;GACpE;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IAAE,MAAM;IAAc,MAAM;IAAiB,aAAa;GAAQ;GAClE;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IAAE,MAAM;IAAQ,MAAM;IAAkB,aAAa;GAAQ;GAC7D;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAsLd;CACA;EAnLA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,UAAU;EACpB,OAAO,EACL,UAAU;GACR;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CA2Id;CACA;EAxIA,MAAM;EACN,UAAU;EACV,aACE;EACF,MAAM;EACN,SAAS,CAAC,cAAc;EACxB,OAAO,EACL,cAAc;GACZ;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;GACA;IACE,MAAM;IACN,MAAM;IACN,aAAa;GACf;EACF,EACF;EACA,UAAU;EACV,cAAc;CAmFd;AACF"}
|