@reopt-ai/opt-ui 1.13.0 → 1.15.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.
Files changed (40) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/COMPONENT_CATALOG.md +644 -123
  3. package/README.md +35 -7
  4. package/dist/core/index.cjs +4 -4
  5. package/dist/core/index.d.cts +2 -2
  6. package/dist/core/index.d.ts +2 -2
  7. package/dist/core/index.js +2 -2
  8. package/dist/docs/02-components/01-core.md +261 -58
  9. package/dist/docs/02-components/02-visuals.md +1 -1
  10. package/dist/docs/02-components/03-shells.md +391 -65
  11. package/dist/docs/02-components/04-surfaces.md +1 -1
  12. package/dist/docs/02-components/index.md +4 -4
  13. package/dist/id-registry.cjs +32 -0
  14. package/dist/id-registry.js +32 -0
  15. package/dist/id-registry.json +68 -0
  16. package/dist/index.cjs +1196 -427
  17. package/dist/index.d.cts +208 -19
  18. package/dist/index.d.ts +208 -19
  19. package/dist/index.js +1050 -295
  20. package/dist/{key-pad-menu-DMmbQ1jF.js → key-pad-menu-BCOeYvsH.js} +59 -67
  21. package/dist/{key-pad-menu-BOVu97bj.d.cts → key-pad-menu-CaIsTHB2.d.cts} +22 -9
  22. package/dist/{key-pad-menu-0KWOnELe.cjs → key-pad-menu-Jaqxhx9P.cjs} +57 -77
  23. package/dist/{key-pad-menu-NlZ9zNF8.d.ts → key-pad-menu-odAEycIX.d.ts} +22 -9
  24. package/dist/meta.cjs +877 -26
  25. package/dist/meta.js +877 -26
  26. package/dist/{field-sidebar-CRdToHRO.js → replay-player-layout-BVUNsUS1.js} +904 -203
  27. package/dist/{field-sidebar-CxxSK4JO.cjs → replay-player-layout-Cmzptq89.cjs} +944 -201
  28. package/dist/{field-sidebar-D-rwuN_w.d.cts → replay-player-layout-DpqdfdQ6.d.ts} +246 -3
  29. package/dist/{field-sidebar-Dz7J4ett.d.ts → replay-player-layout-DuZW-gFF.d.cts} +246 -3
  30. package/dist/shells/index.cjs +58 -52
  31. package/dist/shells/index.d.cts +2 -2
  32. package/dist/shells/index.d.ts +2 -2
  33. package/dist/shells/index.js +2 -2
  34. package/dist/{text-truncate-Bd-0WkSP.js → text-truncate-B-8nJgnu.js} +200 -101
  35. package/dist/{text-truncate-eMzvU_7k.d.cts → text-truncate-DOxUijpB.d.cts} +3 -30
  36. package/dist/{text-truncate-eMzvU_7k.d.ts → text-truncate-DOxUijpB.d.ts} +3 -30
  37. package/dist/{text-truncate-BeYW6XZu.cjs → text-truncate-gQhpMy-Z.cjs} +214 -97
  38. package/dist/theme/server.d.cts +2 -2
  39. package/dist/theme/server.d.ts +2 -2
  40. package/package.json +2 -2
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: "Core Components"
3
3
  description: "74 Core layer components — props, examples, keyboard shortcuts."
4
- version: "1.13.0"
4
+ version: "1.15.0"
5
5
  generated: true
6
6
  ---
7
7
 
@@ -95,6 +95,25 @@ const store = useFormStore({ defaultValues: { name: "" } });
95
95
  | `resize` | `"none" \| "vertical" \| "horizontal" \| "both"` | | "vertical" | 크기 조절 방향 |
96
96
  | `rows` | `number` | | 4 | 표시 줄 수 |
97
97
 
98
+ **Examples:**
99
+
100
+ _설명 입력:_
101
+
102
+ ```tsx
103
+ import { Textarea } from "@reopt-ai/opt-ui";
104
+ export function Example() {
105
+ return (
106
+ <Textarea
107
+ label="변경 이유"
108
+ name="reason"
109
+ hint="검토자가 알아야 할 내용을 적어주세요"
110
+ rows={4}
111
+ resize="vertical"
112
+ />
113
+ );
114
+ }
115
+ ```
116
+
98
117
  ### NumberInput
99
118
 
100
119
  > 숫자 입력 컴포넌트. +/- 버튼, nullable/clear, unit suffix, invalid draft alert, min/max, step, 키보드 화살표를 지원합니다.
@@ -154,6 +173,22 @@ const store = useFormStore({ defaultValues: { name: "" } });
154
173
  | `orientation` | `"horizontal" \| "vertical"` | | "vertical" | 레이아웃 방향 |
155
174
  | `label` | `string` | | | 그룹 레이블 |
156
175
 
176
+ **Examples:**
177
+
178
+ _복수 선택 그룹:_
179
+
180
+ ```tsx
181
+ import { Checkbox, CheckboxGroup } from "@reopt-ai/opt-ui";
182
+ export function Example() {
183
+ return (
184
+ <CheckboxGroup label="알림 채널" defaultValue={["email"]}>
185
+ <Checkbox value="email" label="이메일" />
186
+ <Checkbox value="push" label="푸시" />
187
+ </CheckboxGroup>
188
+ );
189
+ }
190
+ ```
191
+
157
192
  ### RadioGroup
158
193
 
159
194
  > 독립적인 라디오 그룹 컴포넌트. 그룹 설명과 항목별 설명을 분리 연결하고 다양한 크기를 지원합니다.
@@ -206,6 +241,27 @@ const store = useFormStore({ defaultValues: { name: "" } });
206
241
  | `size` | `"sm" \| "md" \| "lg"` | | "md" | 스위치 크기 |
207
242
  | `disabled` | `boolean` | | | 비활성화 상태 |
208
243
 
244
+ **Examples:**
245
+
246
+ _제어되는 알림 설정:_
247
+
248
+ ```tsx
249
+ "use client";
250
+ import { useState } from "react";
251
+ import { Switch } from "@reopt-ai/opt-ui";
252
+ export function Example() {
253
+ const [enabled, setEnabled] = useState(false);
254
+ return (
255
+ <Switch
256
+ label="이메일 알림"
257
+ hint="새 댓글을 이메일로 받습니다"
258
+ checked={enabled}
259
+ onChange={setEnabled}
260
+ />
261
+ );
262
+ }
263
+ ```
264
+
209
265
  ### Select
210
266
 
211
267
  > 드롭다운 선택 컴포넌트. 5-part anatomy: Root, Label, Trigger, Popover, Item.
@@ -241,7 +297,7 @@ const store = useFormStore({ defaultValues: { name: "" } });
241
297
  | ----------- | ----------- | -------- | ------- | ------------------------------------------------------------------------------ |
242
298
  | `children` | `ReactNode` | Yes | | SelectItem 목록 |
243
299
  | `sameWidth` | `boolean` | | true | 트리거와 같은 너비 |
244
- | `gutter` | `number` | | 4 | 트리거와의 간격 (px) **⚠️ deprecated since 1.12.5 — use `sideOffset` instead** |
300
+ | `gutter` | `number` | | 4 | 트리거와의 간격 (px) **⚠️ deprecated since 1.13.0 — use `sideOffset` instead** |
245
301
  | `className` | `string` | | | 기본 스타일 오버라이드 |
246
302
 
247
303
  **SelectItem:**
@@ -295,7 +351,7 @@ import {
295
351
 
296
352
  | Prop | Type | Required | Default | Description |
297
353
  | ------------------ | ------------------------- | -------- | ------- | ------------------------------------------------------------------------------- |
298
- | `setValue` | `(value: string) => void` | | | 입력값 변경 핸들러 **⚠️ deprecated since 1.12.5 — use `onValueChange` instead** |
354
+ | `setValue` | `(value: string) => void` | | | 입력값 변경 핸들러 **⚠️ deprecated since 1.13.0 — use `onValueChange` instead** |
299
355
  | `resetValueOnHide` | `boolean` | | false | 팝오버 닫힐 때 입력값 리셋 |
300
356
 
301
357
  **ComboboxInput:**
@@ -312,7 +368,7 @@ import {
312
368
  | ----------- | ----------- | -------- | ------- | ---------------------------------------------------------------------------- |
313
369
  | `children` | `ReactNode` | Yes | | ComboboxItem/Group 목록 |
314
370
  | `sameWidth` | `boolean` | | true | 입력과 같은 너비 |
315
- | `gutter` | `number` | | 4 | 입력과의 간격 (px) **⚠️ deprecated since 1.12.5 — use `sideOffset` instead** |
371
+ | `gutter` | `number` | | 4 | 입력과의 간격 (px) **⚠️ deprecated since 1.13.0 — use `sideOffset` instead** |
316
372
  | `className` | `string` | | | 기본 스타일 오버라이드 |
317
373
 
318
374
  **ComboboxItem:**
@@ -436,19 +492,20 @@ import {
436
492
 
437
493
  **Import:** `import { Slider } from "@reopt-ai/opt-ui"`
438
494
 
439
- | Prop | Type | Required | Default | Description |
440
- | -------------- | --------------------------- | -------- | ------- | ------------------ |
441
- | `value` | `number` | | | 제어 모드 값 |
442
- | `defaultValue` | `number` | | 0 | 비제어 모드 초기값 |
443
- | `onChange` | `(value: number) => void` | | | 값 변경 핸들러 |
444
- | `min` | `number` | | 0 | 최솟값 |
445
- | `max` | `number` | | 100 | 최댓값 |
446
- | `step` | `number` | | 1 | 증감 단위 |
447
- | `label` | `string` | | | 레이블 텍스트 |
448
- | `showValue` | `boolean` | | false | 현재 값 표시 여부 |
449
- | `formatValue` | `(value: number) => string` | | | 값 포맷 함수 |
450
- | `disabled` | `boolean` | | | 비활성화 |
451
- | `className` | `string` | | | 최외곽 CSS 클래스 |
495
+ | Prop | Type | Required | Default | Description |
496
+ | --------------- | --------------------------- | -------- | ------- | ----------------------------------------------------------------- |
497
+ | `value` | `number` | | | 제어 모드 값 |
498
+ | `defaultValue` | `number` | | 0 | 비제어 모드 초기값 |
499
+ | `onChange` | `(value: number) => void` | | | 값 변경 핸들러 |
500
+ | `onValueCommit` | `(value: number) => void` | | | 포인터·키보드 편집 완료 시 한 번 호출. 취소와 외부 값 갱신은 제외 |
501
+ | `min` | `number` | | 0 | 최솟값 |
502
+ | `max` | `number` | | 100 | 최댓값 |
503
+ | `step` | `number` | | 1 | 증감 단위 |
504
+ | `label` | `string` | | | 레이블 텍스트 |
505
+ | `showValue` | `boolean` | | false | 현재 표시 여부 |
506
+ | `formatValue` | `(value: number) => string` | | | 값 포맷 함수 |
507
+ | `disabled` | `boolean` | | | 비활성화 |
508
+ | `className` | `string` | | | 최외곽 CSS 클래스 |
452
509
 
453
510
  ## Form Integration
454
511
 
@@ -491,12 +548,15 @@ import {
491
548
 
492
549
  **FormSelect:**
493
550
 
494
- | Prop | Type | Required | Default | Description |
495
- | ------------- | ----------- | -------- | ------- | ------------------------------ |
496
- | `name` | `string` | Yes | | 필드 이름 |
497
- | `children` | `ReactNode` | Yes | | FormSelectPopover 자식 요소 |
498
- | `placeholder` | `string` | | | 미선택 표시 텍스트 |
499
- | `className` | `string` | | | 추가 CSS 클래스 |
551
+ | Prop | Type | Required | Default | Description |
552
+ | ------------------ | ----------- | -------- | ------- | ------------------------------------------ |
553
+ | `id` | `string` | | | 트리거 ID. 외부 FormLabel의 htmlFor와 연결 |
554
+ | `aria-label` | `string` | | | 입력의 접근 가능한 이름 |
555
+ | `aria-describedby` | `string` | | | 설명·오류 요소의 ID 목록 |
556
+ | `name` | `string` | Yes | | 필드 이름 |
557
+ | `children` | `ReactNode` | Yes | | FormSelectPopover 등 자식 요소 |
558
+ | `placeholder` | `string` | | | 미선택 시 표시 텍스트 |
559
+ | `className` | `string` | | | 추가 CSS 클래스 |
500
560
 
501
561
  **FormSelectPopover:**
502
562
 
@@ -504,7 +564,7 @@ import {
504
564
  | ----------- | ----------- | -------- | ------- | ------------------------------------------------------------------------------ |
505
565
  | `children` | `ReactNode` | Yes | | FormSelectItem 목록 |
506
566
  | `sameWidth` | `boolean` | | true | 트리거와 같은 너비 |
507
- | `gutter` | `number` | | 4 | 트리거와의 간격 (px) **⚠️ deprecated since 1.12.5 — use `sideOffset` instead** |
567
+ | `gutter` | `number` | | 4 | 트리거와의 간격 (px) **⚠️ deprecated since 1.13.0 — use `sideOffset` instead** |
508
568
 
509
569
  **FormSelectItem:**
510
570
 
@@ -797,6 +857,21 @@ import { Button } from "@reopt-ai/opt-ui";
797
857
  | `progress` | `number` | | | 원형 프로그레스 값 (0-100). 설정 시 dot 무시 |
798
858
  | `progressSize` | `number` | | 16 | 프로그레스 링 SVG 크기 (px) |
799
859
 
860
+ **Examples:**
861
+
862
+ _텍스트가 있는 상태:_
863
+
864
+ ```tsx
865
+ import { Badge } from "@reopt-ai/opt-ui";
866
+ export function Example() {
867
+ return (
868
+ <Badge variant="success" dot>
869
+ 동기화 완료
870
+ </Badge>
871
+ );
872
+ }
873
+ ```
874
+
800
875
  ### Alert
801
876
 
802
877
  > 알림 메시지 컴포넌트. 4가지 변형(info, success, warning, error), 제목/본문/닫기 버튼 지원.
@@ -811,6 +886,21 @@ import { Button } from "@reopt-ai/opt-ui";
811
886
  | `dismissible` | `boolean` | | false | 닫기 버튼 표시 여부 |
812
887
  | `onDismiss` | `() => void` | | | 닫기 버튼 클릭 핸들러 |
813
888
 
889
+ **Examples:**
890
+
891
+ _재시도 가능한 오류 안내:_
892
+
893
+ ```tsx
894
+ import { Alert } from "@reopt-ai/opt-ui";
895
+ export function Example() {
896
+ return (
897
+ <Alert variant="error" title="저장하지 못했습니다">
898
+ 연결 상태를 확인한 뒤 다시 저장하세요.
899
+ </Alert>
900
+ );
901
+ }
902
+ ```
903
+
814
904
  ### Spinner
815
905
 
816
906
  > 로딩 상태 표시 스피너. 3가지 크기와 장식용 aria-hidden 모드를 지원합니다.
@@ -821,6 +911,17 @@ import { Button } from "@reopt-ai/opt-ui";
821
911
  | ------ | ---------------------- | -------- | ------- | ----------- |
822
912
  | `size` | `"sm" \| "md" \| "lg"` | | "md" | 스피너 크기 |
823
913
 
914
+ **Examples:**
915
+
916
+ _이름 있는 로딩 표시:_
917
+
918
+ ```tsx
919
+ import { Spinner } from "@reopt-ai/opt-ui";
920
+ export function Example() {
921
+ return <Spinner size="sm" aria-label="검색 결과 불러오는 중" />;
922
+ }
923
+ ```
924
+
824
925
  ### LoadingOverlay
825
926
 
826
927
  > 로딩 오버레이. 중복 status 없이 하나의 aria-busy 라이브 영역으로 콘텐츠 위 로딩 상태를 표시합니다.
@@ -834,6 +935,21 @@ import { Button } from "@reopt-ai/opt-ui";
834
935
  | `children` | `ReactNode` | Yes | | 감싸는 콘텐츠 |
835
936
  | `label` | `string` | | "Loading…" | 로딩 텍스트 |
836
937
 
938
+ **Examples:**
939
+
940
+ _기존 결과를 유지하는 갱신 표시:_
941
+
942
+ ```tsx
943
+ import { LoadingOverlay } from "@reopt-ai/opt-ui";
944
+ export function Example() {
945
+ return (
946
+ <LoadingOverlay loading label="목록 새로고침 중">
947
+ <p>이전 조회 결과</p>
948
+ </LoadingOverlay>
949
+ );
950
+ }
951
+ ```
952
+
837
953
  ### Progress
838
954
 
839
955
  > 진행률 표시. Linear/Circular, determinate/indeterminate 변형과 안전하게 보정된 ARIA 값을 지원합니다.
@@ -866,6 +982,17 @@ import { Button } from "@reopt-ai/opt-ui";
866
982
  | `label` | `string` | | | 접근성 레이블 |
867
983
  | `indeterminate` | `boolean` | | false | 값을 알 수 없는 진행 상태 |
868
984
 
985
+ **Examples:**
986
+
987
+ _업로드 진행률:_
988
+
989
+ ```tsx
990
+ import { Progress } from "@reopt-ai/opt-ui";
991
+ export function Example() {
992
+ return <Progress value={35} max={100} aria-label="파일 업로드" />;
993
+ }
994
+ ```
995
+
869
996
  ### Avatar
870
997
 
871
998
  > 사용자 아바타. 이미지, 이니셜 자동 생성, 스크린 리더에 노출되는 상태 인디케이터, 그룹을 지원합니다.
@@ -891,6 +1018,22 @@ import { Button } from "@reopt-ai/opt-ui";
891
1018
  | `size` | `"xs" \| "sm" \| "md" \| "lg" \| "xl"` | | "md" | 아바타 크기 |
892
1019
  | `children` | `ReactNode` | Yes | | Avatar 요소들 |
893
1020
 
1021
+ **Examples:**
1022
+
1023
+ _이미지 없이 사용자 표시:_
1024
+
1025
+ ```tsx
1026
+ import { Avatar, AvatarGroup } from "@reopt-ai/opt-ui";
1027
+ export function Example() {
1028
+ return (
1029
+ <AvatarGroup max={3}>
1030
+ <Avatar name="김민수" />
1031
+ <Avatar name="이지수" />
1032
+ </AvatarGroup>
1033
+ );
1034
+ }
1035
+ ```
1036
+
894
1037
  ### Skeleton
895
1038
 
896
1039
  > 로딩 플레이스홀더. text/circular/rectangular 변형. 프리셋 컴포넌트 포함.
@@ -926,6 +1069,21 @@ import { Button } from "@reopt-ai/opt-ui";
926
1069
  | `rows` | `number` | | 5 | 테이블 행 수 |
927
1070
  | `columns` | `number` | | 4 | 테이블 열 수 |
928
1071
 
1072
+ **Examples:**
1073
+
1074
+ _목록 로딩 자리 확보:_
1075
+
1076
+ ```tsx
1077
+ import { SkeletonTable } from "@reopt-ai/opt-ui";
1078
+ export function Example() {
1079
+ return (
1080
+ <section aria-label="목록 불러오는 중" aria-busy="true">
1081
+ <SkeletonTable rows={3} columns={4} />
1082
+ </section>
1083
+ );
1084
+ }
1085
+ ```
1086
+
929
1087
  ### Card
930
1088
 
931
1089
  > 범용 카드 컨테이너. Header, Title, Description, Content, Footer 하위 컴포넌트 포함.
@@ -1118,7 +1276,7 @@ import {
1118
1276
  | Prop | Type | Required | Default | Description |
1119
1277
  | ----------- | ----------- | -------- | ------- | ------------------------------------------------------------------------------ |
1120
1278
  | `children` | `ReactNode` | Yes | | MenuItem 목록 |
1121
- | `gutter` | `number` | | 8 | 트리거와의 간격 (px) **⚠️ deprecated since 1.12.5 — use `sideOffset` instead** |
1279
+ | `gutter` | `number` | | 8 | 트리거와의 간격 (px) **⚠️ deprecated since 1.13.0 — use `sideOffset` instead** |
1122
1280
  | `className` | `string` | | | 기본 스타일 오버라이드 |
1123
1281
 
1124
1282
  **MenuItem:**
@@ -1176,7 +1334,7 @@ import {
1176
1334
 
1177
1335
  | Prop | Type | Required | Default | Description |
1178
1336
  | -------- | -------- | -------- | ------- | ------------------------------------------------------------------------------ |
1179
- | `gutter` | `number` | | 4 | 트리거와의 간격 (px) **⚠️ deprecated since 1.12.5 — use `sideOffset` instead** |
1337
+ | `gutter` | `number` | | 4 | 트리거와의 간격 (px) **⚠️ deprecated since 1.13.0 — use `sideOffset` instead** |
1180
1338
 
1181
1339
  **DropdownItem:**
1182
1340
 
@@ -1200,10 +1358,9 @@ import {
1200
1358
 
1201
1359
  **Import:** `import { PopoverRoot } from "@reopt-ai/opt-ui"`
1202
1360
 
1203
- | Prop | Type | Required | Default | Description |
1204
- | ----------- | -------- | -------- | ------- | ------------------------------------------------------------------------------ |
1205
- | `gutter` | `number` | | 8 | 트리거와의 간격 (px) **⚠️ deprecated since 1.12.5 — use `sideOffset` instead** |
1206
- | `className` | `string` | | | 커스텀 CSS 클래스 |
1361
+ | Prop | Type | Required | Default | Description |
1362
+ | ----------- | -------- | -------- | ------- | ----------------- |
1363
+ | `className` | `string` | | | 커스텀 CSS 클래스 |
1207
1364
 
1208
1365
  **Keyboard Shortcuts:**
1209
1366
 
@@ -1212,6 +1369,30 @@ import {
1212
1369
  | `Esc` | 팝오버 닫기 |
1213
1370
  | `Enter / Space` | 트리거 활성화 |
1214
1371
 
1372
+ **Examples:**
1373
+
1374
+ _보조 설명 열고 닫기:_
1375
+
1376
+ ```tsx
1377
+ import {
1378
+ PopoverRoot,
1379
+ PopoverTrigger,
1380
+ PopoverContent,
1381
+ PopoverClose,
1382
+ } from "@reopt-ai/opt-ui";
1383
+ export function Example() {
1384
+ return (
1385
+ <PopoverRoot>
1386
+ <PopoverTrigger>공유 안내</PopoverTrigger>
1387
+ <PopoverContent>
1388
+ <p>초대받은 사용자만 문서를 볼 수 있습니다.</p>
1389
+ <PopoverClose>닫기</PopoverClose>
1390
+ </PopoverContent>
1391
+ </PopoverRoot>
1392
+ );
1393
+ }
1394
+ ```
1395
+
1215
1396
  ### Tabs
1216
1397
 
1217
1398
  > 탭 패널 시스템. 4-part anatomy: Root, TabList, Tab, TabPanel.
@@ -1225,7 +1406,7 @@ import {
1225
1406
  | `variant` | `"underline" \| "workspace"` | | | 탭 프레임 형태. workspace는 편집기 탭(문서/쿼리처럼 열고 닫히며 상태를 갖는 작업 단위) |
1226
1407
  | `defaultSelectedId` | `string` | | | 초기 선택된 탭 ID |
1227
1408
  | `selectedId` | `string \| null` | | | 제어 모드: 선택된 탭 ID |
1228
- | `setSelectedId` | `(id: string \| null) => void` | | | 제어 모드: 탭 변경 핸들러 **⚠️ deprecated since 1.12.5 — use `onSelectedIdChange` instead** |
1409
+ | `setSelectedId` | `(id: string \| null) => void` | | | 제어 모드: 탭 변경 핸들러 **⚠️ deprecated since 1.13.0 — use `onSelectedIdChange` instead** |
1229
1410
 
1230
1411
  **TabList:**
1231
1412
 
@@ -1262,6 +1443,27 @@ import {
1262
1443
  | `Home` | 첫 번째 탭으로 이동 |
1263
1444
  | `End` | 마지막 탭으로 이동 |
1264
1445
 
1446
+ **Examples:**
1447
+
1448
+ _이름 있는 두 패널:_
1449
+
1450
+ ```tsx
1451
+ import { TabsRoot, TabList, Tab, TabPanel } from "@reopt-ai/opt-ui";
1452
+
1453
+ export function Example() {
1454
+ return (
1455
+ <TabsRoot defaultSelectedId="overview">
1456
+ <TabList aria-label="프로젝트 정보">
1457
+ <Tab id="overview">개요</Tab>
1458
+ <Tab id="activity">활동</Tab>
1459
+ </TabList>
1460
+ <TabPanel tabId="overview">프로젝트 요약</TabPanel>
1461
+ <TabPanel tabId="activity">최근 활동</TabPanel>
1462
+ </TabsRoot>
1463
+ );
1464
+ }
1465
+ ```
1466
+
1265
1467
  ### Disclosure
1266
1468
 
1267
1469
  > 접기/펼치기 콘텐츠 영역. 3-part anatomy: Root, Trigger, Content.
@@ -1273,7 +1475,7 @@ import {
1273
1475
  | Prop | Type | Required | Default | Description |
1274
1476
  | ------------- | ------------------------- | -------- | ------- | --------------------------------------------------------------------------------------- |
1275
1477
  | `open` | `boolean` | | | 제어 모드: 열림 상태 |
1276
- | `setOpen` | `(open: boolean) => void` | | | 제어 모드: 상태 변경 핸들러 **⚠️ deprecated since 1.12.5 — use `onOpenChange` instead** |
1478
+ | `setOpen` | `(open: boolean) => void` | | | 제어 모드: 상태 변경 핸들러 **⚠️ deprecated since 1.13.0 — use `onOpenChange` instead** |
1277
1479
  | `defaultOpen` | `boolean` | | false | 비제어 모드: 초기 열림 상태 |
1278
1480
 
1279
1481
  **DisclosureTrigger:**
@@ -1307,7 +1509,7 @@ import {
1307
1509
  | Prop | Type | Required | Default | Description |
1308
1510
  | --------- | ------------------------- | -------- | ------- | --------------------------------------------------------------------------------------- |
1309
1511
  | `open` | `boolean` | | | 제어 모드: 열림 상태 |
1310
- | `setOpen` | `(open: boolean) => void` | | | 제어 모드: 상태 변경 핸들러 **⚠️ deprecated since 1.12.5 — use `onOpenChange` instead** |
1512
+ | `setOpen` | `(open: boolean) => void` | | | 제어 모드: 상태 변경 핸들러 **⚠️ deprecated since 1.13.0 — use `onOpenChange` instead** |
1311
1513
 
1312
1514
  **DialogDisclosure:**
1313
1515
 
@@ -1667,18 +1869,19 @@ import {
1667
1869
 
1668
1870
  **Import:** `import { ConditionBuilder } from "@reopt-ai/opt-ui"`
1669
1871
 
1670
- | Prop | Type | Required | Default | Description |
1671
- | --------------------- | --------------------------------------- | -------- | ------------------ | -------------------------------------- |
1672
- | `groups` | `ConditionGroup[]` | Yes | | 조건 그룹 배열 |
1673
- | `onChange` | `(groups: ConditionGroup[]) => void` | Yes | | 그룹 변경 핸들러 |
1674
- | `properties` | `string[]` | | | 선택 가능한 속성 목록 (기본 10개 제공) |
1675
- | `label` | `string` | | | 빌더 레이블 |
1676
- | `nested` | `boolean` | | false | 중첩 AND/OR 그룹 활성화 |
1677
- | `maxDepth` | `number` | | 3 | 최대 중첩 깊이 |
1678
- | `conditionTypes` | `Record<string, ConditionTypeRenderer>` | | | 이질적 조건 타입 렌더러 레지스트리 |
1679
- | `onPreview` | `(groups: ConditionGroup[]) => void` | | | 조건 변경 시 미리보기 콜백 |
1680
- | `previewCount` | `number` | | | 매치 카운트 표시 (toLocaleString 포맷) |
1681
- | `addNestedGroupLabel` | `string` | | "Add nested group" | 중첩 그룹 추가 버튼 텍스트 |
1872
+ | Prop | Type | Required | Default | Description |
1873
+ | --------------------- | --------------------------------------- | -------- | ------------------ | ------------------------------------------------------------------------------ |
1874
+ | `groups` | `ConditionGroup[]` | Yes | | 조건 그룹 배열 |
1875
+ | `onChange` | `(groups: ConditionGroup[]) => void` | Yes | | 그룹 변경 핸들러 |
1876
+ | `properties` | `string[]` | | | 선택 가능한 속성 목록 (기본 10개 제공) |
1877
+ | `label` | `string` | | | 빌더 레이블 |
1878
+ | `nested` | `boolean` | | false | 중첩 AND/OR 그룹 활성화 |
1879
+ | `maxDepth` | `number` | | 3 | 최대 중첩 깊이 |
1880
+ | `conditionTypes` | `Record<string, ConditionTypeRenderer>` | | | 이질적 조건 타입 렌더러 레지스트리 |
1881
+ | `onPreview` | `(groups: ConditionGroup[]) => void` | | | 조건 변경 시 미리보기 콜백 |
1882
+ | `previewCount` | `number` | | | 매치 카운트 표시 (toLocaleString 포맷) |
1883
+ | `labels` | `ConditionBuilderLabels` | | | 미리보기 문구 오버라이드 (previewSuffix, formatPreview). 기본은 영어 "matches" |
1884
+ | `addNestedGroupLabel` | `string` | | "Add nested group" | 중첩 그룹 추가 버튼 텍스트 |
1682
1885
 
1683
1886
  ## Other
1684
1887
 
@@ -1879,19 +2082,19 @@ import {
1879
2082
 
1880
2083
  **Import:** `import { InlineEdit } from "@reopt-ai/opt-ui"`
1881
2084
 
1882
- | Prop | Type | Required | Default | Description |
1883
- | ------------- | --------------------------------------------------------------- | -------- | ---------- | ------------------------------------------- |
1884
- | `value` | `string` | Yes | | 현재 값 |
1885
- | `onSave` | `(next: string) => boolean \| void \| Promise<boolean \| void>` | Yes | | 저장. false 반환하면 거절하고 편집을 유지 |
1886
- | `as` | `"span" \| "h1" \| "h2" \| "h3" \| "h4"` | | "span" | 읽기 모드 요소 |
1887
- | `size` | `"sm" \| "md" \| "lg" \| "xl"` | | "md" | 타이포 크기 |
1888
- | `placeholder` | `string` | | | 입력 자리표시자 |
1889
- | `emptyText` | `string` | | "Untitled" | 빈 값 표시 |
1890
- | `disabled` | `boolean` | | false | 편집 불가 |
1891
- | `maxLength` | `number` | | | 최대 길이 |
1892
- | `suffix` | `ReactNode` | | | 읽기 모드 텍스트 뒤 요소 |
1893
- | `labels` | `InlineEditLabels` | | | 지역화 문자열 |
1894
- | `className` | `string` | | | 추가 CSS 클래스 |
2085
+ | Prop | Type | Required | Default | Description |
2086
+ | ------------- | --------------------------------------------------------------- | -------- | ---------- | ----------------------------------------------------------------- |
2087
+ | `value` | `string` | Yes | | 현재 값 |
2088
+ | `onSave` | `(next: string) => boolean \| void \| Promise<boolean \| void>` | Yes | | 저장. false 반환 또는 Promise 실패 시 입력을 유지하고 오류를 알림 |
2089
+ | `as` | `"span" \| "h1" \| "h2" \| "h3" \| "h4"` | | "span" | 읽기 모드 요소 |
2090
+ | `size` | `"sm" \| "md" \| "lg" \| "xl"` | | "md" | 타이포 크기 |
2091
+ | `placeholder` | `string` | | | 입력 자리표시자 |
2092
+ | `emptyText` | `string` | | "Untitled" | 빈 값 표시 |
2093
+ | `disabled` | `boolean` | | false | 편집 불가 |
2094
+ | `maxLength` | `number` | | | 최대 길이 |
2095
+ | `suffix` | `ReactNode` | | | 읽기 모드 텍스트 뒤 요소 |
2096
+ | `labels` | `InlineEditLabels` | | | 입력 이름(input), 편집·저장·취소·오류 안내 문자열 |
2097
+ | `className` | `string` | | | 추가 CSS 클래스 |
1895
2098
 
1896
2099
  ### KeyPadMenu
1897
2100
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: "Visual Components"
3
3
  description: "0 Visual layer components — props, examples, keyboard shortcuts."
4
- version: "1.13.0"
4
+ version: "1.15.0"
5
5
  generated: true
6
6
  ---
7
7