@reopt-ai/opt-ui 1.12.2 → 1.12.4
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 +32 -29
- package/dist/docs/02-components/01-core.md +1 -1
- package/dist/docs/02-components/02-visuals.md +1 -1
- package/dist/docs/02-components/03-shells.md +32 -29
- package/dist/docs/02-components/04-surfaces.md +1 -1
- package/dist/docs/02-components/index.md +1 -1
- package/dist/{field-sidebar-BXAXigMS.js → field-sidebar-C8bDzGPs.js} +45 -32
- package/dist/{field-sidebar-uXmoyvd7.d.cts → field-sidebar-Ct8c9L4V.d.cts} +38 -2
- package/dist/{field-sidebar-D0ITbhfJ.cjs → field-sidebar-DX5wP0qn.cjs} +45 -32
- package/dist/{field-sidebar-CrYlRZew.d.ts → field-sidebar-YaWHfLLW.d.ts} +38 -2
- package/dist/index.cjs +26 -10
- package/dist/index.d.cts +20 -1
- package/dist/index.d.ts +20 -1
- package/dist/index.js +26 -10
- package/dist/meta.cjs +31 -12
- package/dist/meta.js +31 -12
- 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/COMPONENT_CATALOG.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- DEPRECATED: Prefer dist/docs/02-components/ for per-layer reference. -->
|
|
4
4
|
<!-- Auto-generated from ComponentMeta. Do not edit. -->
|
|
5
|
-
<!-- Version: 1.12.
|
|
5
|
+
<!-- Version: 1.12.3 -->
|
|
6
6
|
|
|
7
7
|
## Quick Stats
|
|
8
8
|
|
|
@@ -2671,22 +2671,24 @@ const fields = [
|
|
|
2671
2671
|
|
|
2672
2672
|
**DataTable:**
|
|
2673
2673
|
|
|
2674
|
-
| Prop | Type | Required | Default | Description
|
|
2675
|
-
| -------------- | -------------------- | -------- | ------------------- |
|
|
2676
|
-
| `data` | `T[]` | Yes | | 테이블 데이터 배열
|
|
2677
|
-
| `columns` | `ColumnDef<T>[]` | Yes | | 컬럼 정의. { id, header, accessor, width?, align? }
|
|
2678
|
-
| `keyExtractor` | `(row: T) => string` | Yes | | 각 행의 고유 키 추출 함수
|
|
2679
|
-
| `title` | `string` | | | 테이블 위에 표시할 제목. 생략하면 제목 영역을 렌더하지 않음
|
|
2680
|
-
| `ariaLabel` | `string` | | | 보이는 제목이 없을 때 grid에 제공할 접근 가능한 이름
|
|
2681
|
-
| `onRowClick` | `(row: T) => void` | | | 행 클릭 핸들러
|
|
2682
|
-
| `emptyMessage` | `string` | | "No data available" | 데이터 없을 때 표시할 메시지
|
|
2674
|
+
| Prop | Type | Required | Default | Description |
|
|
2675
|
+
| -------------- | -------------------- | -------- | ------------------- | -------------------------------------------------------------------------------------------------------------- |
|
|
2676
|
+
| `data` | `T[]` | Yes | | 테이블 데이터 배열 |
|
|
2677
|
+
| `columns` | `ColumnDef<T>[]` | Yes | | 컬럼 정의. { id, header, accessor, width?, align? } |
|
|
2678
|
+
| `keyExtractor` | `(row: T) => string` | Yes | | 각 행의 고유 키 추출 함수 |
|
|
2679
|
+
| `title` | `string` | | | 테이블 위에 표시할 제목. 생략하면 제목 영역을 렌더하지 않음 |
|
|
2680
|
+
| `ariaLabel` | `string` | | | 보이는 제목이 없을 때 grid에 제공할 접근 가능한 이름 |
|
|
2681
|
+
| `onRowClick` | `(row: T) => void` | | | 행 클릭 핸들러 |
|
|
2682
|
+
| `emptyMessage` | `string` | | "No data available" | 데이터 없을 때 표시할 메시지 |
|
|
2683
|
+
| `labels` | `DataTableLabels` | | | 선택·리사이즈·펼치기처럼 스크린리더만 듣는 문구. 보이는 문구는 columns와 emptyMessage가 이미 호출자의 것입니다 |
|
|
2683
2684
|
|
|
2684
2685
|
**ColumnDef:**
|
|
2685
2686
|
|
|
2686
|
-
| Prop
|
|
2687
|
-
|
|
|
2688
|
-
| `
|
|
2689
|
-
| `
|
|
2687
|
+
| Prop | Type | Required | Default | Description |
|
|
2688
|
+
| -------------- | -------------------- | -------- | ----------- | --------------------------------------------------------------------------------------------------- |
|
|
2689
|
+
| `headerHidden` | `boolean` | | false | 이름은 두되 그리지 않음. 행 액션처럼 제목이 필요 없는 컬럼용 — 빈 header는 컬럼을 익명으로 만듭니다 |
|
|
2690
|
+
| `bar` | `(row: T) => number` | | | 인라인 프로그레스 바 비율(0-1) 계산 함수. 범위 밖/NaN은 보정 |
|
|
2691
|
+
| `barColor` | `string` | | "bg-accent" | 인라인 바 색상 클래스 |
|
|
2690
2692
|
|
|
2691
2693
|
**Keyboard Shortcuts:**
|
|
2692
2694
|
|
|
@@ -2742,11 +2744,12 @@ import { DataTable } from "@reopt-ai/opt-ui";
|
|
|
2742
2744
|
|
|
2743
2745
|
**ToastProvider:**
|
|
2744
2746
|
|
|
2745
|
-
| Prop | Type | Required | Default | Description
|
|
2746
|
-
| ----------------- | -------------------------------------------------------------- | -------- | ----------- |
|
|
2747
|
-
| `children` | `ReactNode` | Yes | | 앱 컨텐츠
|
|
2748
|
-
| `position` | `"top-right" \| "top-left" \| "bottom-right" \| "bottom-left"` | | "top-right" | 토스트 표시 위치
|
|
2749
|
-
| `defaultDuration` | `number` | | 5000 | 기본 표시 시간 (ms)
|
|
2747
|
+
| Prop | Type | Required | Default | Description |
|
|
2748
|
+
| ----------------- | -------------------------------------------------------------- | -------- | ----------- | -------------------------------------------------------------------------- |
|
|
2749
|
+
| `children` | `ReactNode` | Yes | | 앱 컨텐츠 |
|
|
2750
|
+
| `position` | `"top-right" \| "top-left" \| "bottom-right" \| "bottom-left"` | | "top-right" | 토스트 표시 위치 |
|
|
2751
|
+
| `defaultDuration` | `number` | | 5000 | 기본 표시 시간 (ms) |
|
|
2752
|
+
| `labels` | `NotificationToastLabels` | | | 토스트 영역의 이름(regionLabel). 토스트 본문은 이미 호출자가 쓴 문장입니다 |
|
|
2750
2753
|
|
|
2751
2754
|
**useToast:**
|
|
2752
2755
|
|
|
@@ -3130,15 +3133,15 @@ const filters = [
|
|
|
3130
3133
|
|
|
3131
3134
|
**EventMetaEditor:**
|
|
3132
3135
|
|
|
3133
|
-
| Prop | Type | Required | Default | Description
|
|
3134
|
-
| ----------- | --------------------------- | -------- | ------- |
|
|
3135
|
-
| `value` | `EventMeta` | Yes | | 편집 중인 이벤트 메타데이터
|
|
3136
|
-
| `onChange` | `(meta: EventMeta) => void` | Yes | | 메타데이터 변경
|
|
3137
|
-
| `icons` | `IconDef[]` | | | 선택 가능한 아이콘
|
|
3138
|
-
| `sections` | `EventMetaEditorSection[]` | | | 기본 여섯 필드 뒤에 렌더할 호출자 소유 섹션
|
|
3139
|
-
| `footer` | `ReactNode` | | | 내장 필드와 추가 섹션을 함께 저장하는 마지막 액션 영역
|
|
3140
|
-
| `className` | `string` | | | 추가 CSS 클래스
|
|
3141
|
-
| `labels` | `EventMetaEditorLabels` | | | 필드 레이블과 placeholder
|
|
3136
|
+
| Prop | Type | Required | Default | Description |
|
|
3137
|
+
| ----------- | --------------------------- | -------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------- |
|
|
3138
|
+
| `value` | `EventMeta` | Yes | | 편집 중인 이벤트 메타데이터 |
|
|
3139
|
+
| `onChange` | `(meta: EventMeta) => void` | Yes | | 메타데이터 변경 |
|
|
3140
|
+
| `icons` | `IconDef[]` | | | 선택 가능한 아이콘 |
|
|
3141
|
+
| `sections` | `EventMetaEditorSection[]` | | | 기본 여섯 필드 뒤에 렌더할 호출자 소유 섹션 |
|
|
3142
|
+
| `footer` | `ReactNode` | | | 내장 필드와 추가 섹션을 함께 저장하는 마지막 액션 영역 |
|
|
3143
|
+
| `className` | `string` | | | 추가 CSS 클래스 |
|
|
3144
|
+
| `labels` | `EventMetaEditorLabels` | | | 필드 레이블과 placeholder 문구. iconPlaceholder는 내부 IconPicker로, iconLabelPrefix·iconAriaLabel은 미리보기 EventIcon으로 전달됩니다 |
|
|
3142
3145
|
|
|
3143
3146
|
**EventMetaEditorSection:**
|
|
3144
3147
|
|
|
@@ -3906,7 +3909,7 @@ const messages = [
|
|
|
3906
3909
|
| `onBulkAction` | `(actionId: string) => void` | | | 일괄 작업 실행 |
|
|
3907
3910
|
| `error` | `ReactNode` | | | 읽기 실패. 빈 목록과 다른 답 |
|
|
3908
3911
|
| `onRetry` | `() => void` | | | 재시도 |
|
|
3909
|
-
| `labels` | `CatalogFrameLabels` | | | 빈/필터된 빈/에러
|
|
3912
|
+
| `labels` | `CatalogFrameLabels` | | | 빈/필터된 빈/에러 문구와 인스펙터 닫기 버튼(closeInspector) |
|
|
3910
3913
|
| `className` | `string` | | | 추가 CSS 클래스 |
|
|
3911
3914
|
|
|
3912
3915
|
**CatalogRowActions:**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Shell Components"
|
|
3
3
|
description: "86 Shell layer components — props, examples, keyboard shortcuts."
|
|
4
|
-
version: "1.12.
|
|
4
|
+
version: "1.12.3"
|
|
5
5
|
generated: true
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -322,22 +322,24 @@ import { AppShell } from "@reopt-ai/opt-ui";
|
|
|
322
322
|
|
|
323
323
|
**DataTable:**
|
|
324
324
|
|
|
325
|
-
| Prop | Type | Required | Default | Description
|
|
326
|
-
| -------------- | -------------------- | -------- | ------------------- |
|
|
327
|
-
| `data` | `T[]` | Yes | | 테이블 데이터 배열
|
|
328
|
-
| `columns` | `ColumnDef<T>[]` | Yes | | 컬럼 정의. { id, header, accessor, width?, align? }
|
|
329
|
-
| `keyExtractor` | `(row: T) => string` | Yes | | 각 행의 고유 키 추출 함수
|
|
330
|
-
| `title` | `string` | | | 테이블 위에 표시할 제목. 생략하면 제목 영역을 렌더하지 않음
|
|
331
|
-
| `ariaLabel` | `string` | | | 보이는 제목이 없을 때 grid에 제공할 접근 가능한 이름
|
|
332
|
-
| `onRowClick` | `(row: T) => void` | | | 행 클릭 핸들러
|
|
333
|
-
| `emptyMessage` | `string` | | "No data available" | 데이터 없을 때 표시할 메시지
|
|
325
|
+
| Prop | Type | Required | Default | Description |
|
|
326
|
+
| -------------- | -------------------- | -------- | ------------------- | -------------------------------------------------------------------------------------------------------------- |
|
|
327
|
+
| `data` | `T[]` | Yes | | 테이블 데이터 배열 |
|
|
328
|
+
| `columns` | `ColumnDef<T>[]` | Yes | | 컬럼 정의. { id, header, accessor, width?, align? } |
|
|
329
|
+
| `keyExtractor` | `(row: T) => string` | Yes | | 각 행의 고유 키 추출 함수 |
|
|
330
|
+
| `title` | `string` | | | 테이블 위에 표시할 제목. 생략하면 제목 영역을 렌더하지 않음 |
|
|
331
|
+
| `ariaLabel` | `string` | | | 보이는 제목이 없을 때 grid에 제공할 접근 가능한 이름 |
|
|
332
|
+
| `onRowClick` | `(row: T) => void` | | | 행 클릭 핸들러 |
|
|
333
|
+
| `emptyMessage` | `string` | | "No data available" | 데이터 없을 때 표시할 메시지 |
|
|
334
|
+
| `labels` | `DataTableLabels` | | | 선택·리사이즈·펼치기처럼 스크린리더만 듣는 문구. 보이는 문구는 columns와 emptyMessage가 이미 호출자의 것입니다 |
|
|
334
335
|
|
|
335
336
|
**ColumnDef:**
|
|
336
337
|
|
|
337
|
-
| Prop
|
|
338
|
-
|
|
|
339
|
-
| `
|
|
340
|
-
| `
|
|
338
|
+
| Prop | Type | Required | Default | Description |
|
|
339
|
+
| -------------- | -------------------- | -------- | ----------- | --------------------------------------------------------------------------------------------------- |
|
|
340
|
+
| `headerHidden` | `boolean` | | false | 이름은 두되 그리지 않음. 행 액션처럼 제목이 필요 없는 컬럼용 — 빈 header는 컬럼을 익명으로 만듭니다 |
|
|
341
|
+
| `bar` | `(row: T) => number` | | | 인라인 프로그레스 바 비율(0-1) 계산 함수. 범위 밖/NaN은 보정 |
|
|
342
|
+
| `barColor` | `string` | | "bg-accent" | 인라인 바 색상 클래스 |
|
|
341
343
|
|
|
342
344
|
**Keyboard Shortcuts:**
|
|
343
345
|
|
|
@@ -1180,15 +1182,15 @@ const fields = [
|
|
|
1180
1182
|
|
|
1181
1183
|
**EventMetaEditor:**
|
|
1182
1184
|
|
|
1183
|
-
| Prop | Type | Required | Default | Description
|
|
1184
|
-
| ----------- | --------------------------- | -------- | ------- |
|
|
1185
|
-
| `value` | `EventMeta` | Yes | | 편집 중인 이벤트 메타데이터
|
|
1186
|
-
| `onChange` | `(meta: EventMeta) => void` | Yes | | 메타데이터 변경
|
|
1187
|
-
| `icons` | `IconDef[]` | | | 선택 가능한 아이콘
|
|
1188
|
-
| `sections` | `EventMetaEditorSection[]` | | | 기본 여섯 필드 뒤에 렌더할 호출자 소유 섹션
|
|
1189
|
-
| `footer` | `ReactNode` | | | 내장 필드와 추가 섹션을 함께 저장하는 마지막 액션 영역
|
|
1190
|
-
| `className` | `string` | | | 추가 CSS 클래스
|
|
1191
|
-
| `labels` | `EventMetaEditorLabels` | | | 필드 레이블과 placeholder
|
|
1185
|
+
| Prop | Type | Required | Default | Description |
|
|
1186
|
+
| ----------- | --------------------------- | -------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------- |
|
|
1187
|
+
| `value` | `EventMeta` | Yes | | 편집 중인 이벤트 메타데이터 |
|
|
1188
|
+
| `onChange` | `(meta: EventMeta) => void` | Yes | | 메타데이터 변경 |
|
|
1189
|
+
| `icons` | `IconDef[]` | | | 선택 가능한 아이콘 |
|
|
1190
|
+
| `sections` | `EventMetaEditorSection[]` | | | 기본 여섯 필드 뒤에 렌더할 호출자 소유 섹션 |
|
|
1191
|
+
| `footer` | `ReactNode` | | | 내장 필드와 추가 섹션을 함께 저장하는 마지막 액션 영역 |
|
|
1192
|
+
| `className` | `string` | | | 추가 CSS 클래스 |
|
|
1193
|
+
| `labels` | `EventMetaEditorLabels` | | | 필드 레이블과 placeholder 문구. iconPlaceholder는 내부 IconPicker로, iconLabelPrefix·iconAriaLabel은 미리보기 EventIcon으로 전달됩니다 |
|
|
1192
1194
|
|
|
1193
1195
|
**EventMetaEditorSection:**
|
|
1194
1196
|
|
|
@@ -1340,11 +1342,12 @@ const fields = [
|
|
|
1340
1342
|
|
|
1341
1343
|
**ToastProvider:**
|
|
1342
1344
|
|
|
1343
|
-
| Prop | Type | Required | Default | Description
|
|
1344
|
-
| ----------------- | -------------------------------------------------------------- | -------- | ----------- |
|
|
1345
|
-
| `children` | `ReactNode` | Yes | | 앱 컨텐츠
|
|
1346
|
-
| `position` | `"top-right" \| "top-left" \| "bottom-right" \| "bottom-left"` | | "top-right" | 토스트 표시 위치
|
|
1347
|
-
| `defaultDuration` | `number` | | 5000 | 기본 표시 시간 (ms)
|
|
1345
|
+
| Prop | Type | Required | Default | Description |
|
|
1346
|
+
| ----------------- | -------------------------------------------------------------- | -------- | ----------- | -------------------------------------------------------------------------- |
|
|
1347
|
+
| `children` | `ReactNode` | Yes | | 앱 컨텐츠 |
|
|
1348
|
+
| `position` | `"top-right" \| "top-left" \| "bottom-right" \| "bottom-left"` | | "top-right" | 토스트 표시 위치 |
|
|
1349
|
+
| `defaultDuration` | `number` | | 5000 | 기본 표시 시간 (ms) |
|
|
1350
|
+
| `labels` | `NotificationToastLabels` | | | 토스트 영역의 이름(regionLabel). 토스트 본문은 이미 호출자가 쓴 문장입니다 |
|
|
1348
1351
|
|
|
1349
1352
|
**useToast:**
|
|
1350
1353
|
|
|
@@ -1831,7 +1834,7 @@ const messages = [
|
|
|
1831
1834
|
| `onBulkAction` | `(actionId: string) => void` | | | 일괄 작업 실행 |
|
|
1832
1835
|
| `error` | `ReactNode` | | | 읽기 실패. 빈 목록과 다른 답 |
|
|
1833
1836
|
| `onRetry` | `() => void` | | | 재시도 |
|
|
1834
|
-
| `labels` | `CatalogFrameLabels` | | | 빈/필터된 빈/에러
|
|
1837
|
+
| `labels` | `CatalogFrameLabels` | | | 빈/필터된 빈/에러 문구와 인스펙터 닫기 버튼(closeInspector) |
|
|
1835
1838
|
| `className` | `string` | | | 추가 CSS 클래스 |
|
|
1836
1839
|
|
|
1837
1840
|
**CatalogRowActions:**
|
|
@@ -253,7 +253,7 @@ function CommandPaletteTrigger({ commands, onSelect, labels }) {
|
|
|
253
253
|
}
|
|
254
254
|
//#endregion
|
|
255
255
|
//#region src/shells/dashboard-grid.tsx
|
|
256
|
-
const defaultLabels$
|
|
256
|
+
const defaultLabels$23 = { ariaLabel: "대시보드 통계" };
|
|
257
257
|
const MIN_DASHBOARD_COLUMNS = 1;
|
|
258
258
|
const MAX_DASHBOARD_COLUMNS = 12;
|
|
259
259
|
function normalizeDashboardColumns(columns) {
|
|
@@ -262,7 +262,7 @@ function normalizeDashboardColumns(columns) {
|
|
|
262
262
|
}
|
|
263
263
|
/** Renders the dashboard grid component. */
|
|
264
264
|
function DashboardGrid({ stats, columns = 3, labels: customLabels }) {
|
|
265
|
-
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$
|
|
265
|
+
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$23), customLabels);
|
|
266
266
|
const columnCount = normalizeDashboardColumns(columns);
|
|
267
267
|
const rowStyle = { "--opt-dashboard-grid-columns": `repeat(${columnCount}, minmax(0, 1fr))` };
|
|
268
268
|
const rows = [];
|
|
@@ -290,13 +290,13 @@ function DashboardGrid({ stats, columns = 3, labels: customLabels }) {
|
|
|
290
290
|
}
|
|
291
291
|
//#endregion
|
|
292
292
|
//#region src/shells/search-combobox.tsx
|
|
293
|
-
const defaultLabels$
|
|
293
|
+
const defaultLabels$22 = {
|
|
294
294
|
noResults: "결과가 없습니다.",
|
|
295
295
|
loading: "Loading…"
|
|
296
296
|
};
|
|
297
297
|
/** Renders the search combobox component. */
|
|
298
298
|
function SearchCombobox({ items, placeholder = "검색...", label = "검색", onSelect, labels: customLabels, async: isAsync = false, onSearch, debounceMs = 300 }) {
|
|
299
|
-
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$
|
|
299
|
+
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$22), customLabels);
|
|
300
300
|
const inputId = useId();
|
|
301
301
|
const [query, setQuery] = useState("");
|
|
302
302
|
const [asyncResults, setAsyncResults] = useState([]);
|
|
@@ -394,14 +394,14 @@ function SearchCombobox({ items, placeholder = "검색...", label = "검색", on
|
|
|
394
394
|
}
|
|
395
395
|
//#endregion
|
|
396
396
|
//#region src/shells/status-select.tsx
|
|
397
|
-
const defaultLabels$
|
|
397
|
+
const defaultLabels$21 = {
|
|
398
398
|
selectLabel: "상태",
|
|
399
399
|
emptyMessage: "사용 가능한 상태 옵션이 없습니다."
|
|
400
400
|
};
|
|
401
401
|
/** Renders the status select component. */
|
|
402
402
|
function StatusSelect({ options, value: controlledValue, onChange, label, labels: customLabels }) {
|
|
403
403
|
var _options$0$value, _options$;
|
|
404
|
-
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$
|
|
404
|
+
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$21), customLabels);
|
|
405
405
|
const resolvedLabel = label !== null && label !== void 0 ? label : labels.selectLabel;
|
|
406
406
|
const [internalValue, setInternalValue] = useState((_options$0$value = (_options$ = options[0]) === null || _options$ === void 0 ? void 0 : _options$.value) !== null && _options$0$value !== void 0 ? _options$0$value : "");
|
|
407
407
|
const value = controlledValue !== null && controlledValue !== void 0 ? controlledValue : internalValue;
|
|
@@ -468,7 +468,7 @@ function StatusSelect({ options, value: controlledValue, onChange, label, labels
|
|
|
468
468
|
}
|
|
469
469
|
//#endregion
|
|
470
470
|
//#region src/shells/app-menubar.tsx
|
|
471
|
-
const defaultLabels$
|
|
471
|
+
const defaultLabels$20 = { ariaLabel: "Application menu" };
|
|
472
472
|
function MenuSection({ menu }) {
|
|
473
473
|
return /* @__PURE__ */ jsxs(MenuRoot$1, { children: [/* @__PURE__ */ jsxs(MenuTrigger$1, { children: [menu.label, /* @__PURE__ */ jsx(MenuButtonArrow$1, {})] }), /* @__PURE__ */ jsx(MenuPopover$1, { children: menu.items.map((item, i) => {
|
|
474
474
|
if (item.type === "separator") return /* @__PURE__ */ jsx(MenuSeparator$1, {}, `sep-${i}`);
|
|
@@ -512,7 +512,7 @@ function MenuSection({ menu }) {
|
|
|
512
512
|
}
|
|
513
513
|
/** Renders the app menubar component. */
|
|
514
514
|
function AppMenubar({ menus, labels: customLabels }) {
|
|
515
|
-
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$
|
|
515
|
+
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$20), customLabels);
|
|
516
516
|
if (menus.length === 0) return null;
|
|
517
517
|
return /* @__PURE__ */ jsx(MenubarRoot$1, {
|
|
518
518
|
"data-opt-id": "BGKHW",
|
|
@@ -551,10 +551,10 @@ const sectionStyles = {
|
|
|
551
551
|
Templates: "text-text-tertiary"
|
|
552
552
|
};
|
|
553
553
|
const defaultSectionStyle = "text-text-secondary";
|
|
554
|
-
const defaultLabels$
|
|
554
|
+
const defaultLabels$19 = { ariaLabel: "문서 네비게이션" };
|
|
555
555
|
/** Renders the sidebar nav component. */
|
|
556
556
|
function SidebarNav({ items, labels: customLabels }) {
|
|
557
|
-
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$
|
|
557
|
+
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$19), customLabels);
|
|
558
558
|
const pathname = usePathname();
|
|
559
559
|
const activeItem = items.find((item) => item.href === pathname);
|
|
560
560
|
const [activeId, setActiveId] = useState(activeItem ? domId(activeItem.id) : void 0);
|
|
@@ -602,7 +602,7 @@ function SidebarNav({ items, labels: customLabels }) {
|
|
|
602
602
|
}
|
|
603
603
|
//#endregion
|
|
604
604
|
//#region src/shells/editor-toolbar.tsx
|
|
605
|
-
const defaultLabels$
|
|
605
|
+
const defaultLabels$18 = { ariaLabel: "텍스트 편집기 툴바" };
|
|
606
606
|
function ToolbarButtonWithTooltip({ button, active, onAction }) {
|
|
607
607
|
return /* @__PURE__ */ jsxs(TooltipProvider$1, { children: [/* @__PURE__ */ jsx(TooltipAnchor$1, { children: /* @__PURE__ */ jsx(ToolbarButton$1, {
|
|
608
608
|
className: `text-text-primary data-[active-item]:bg-bg-subtle data-[focus-visible]:ring-ring rounded-md p-2 transition-colors outline-none data-[focus-visible]:ring-2 ${active ? "bg-bg-muted" : "hover:bg-bg-subtle"}`,
|
|
@@ -612,7 +612,7 @@ function ToolbarButtonWithTooltip({ button, active, onAction }) {
|
|
|
612
612
|
}
|
|
613
613
|
/** Renders the editor toolbar component. */
|
|
614
614
|
function EditorToolbar({ buttons, onAction, activeButtons = [], labels: customLabels }) {
|
|
615
|
-
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$
|
|
615
|
+
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$18), customLabels);
|
|
616
616
|
const groups = [];
|
|
617
617
|
let current = [];
|
|
618
618
|
for (const btn of buttons) {
|
|
@@ -645,14 +645,14 @@ function EditorToolbar({ buttons, onAction, activeButtons = [], labels: customLa
|
|
|
645
645
|
}
|
|
646
646
|
//#endregion
|
|
647
647
|
//#region src/shells/content-tabs.tsx
|
|
648
|
-
const defaultLabels$
|
|
648
|
+
const defaultLabels$17 = {
|
|
649
649
|
ariaLabel: "콘텐츠 탭",
|
|
650
650
|
emptyMessage: "표시할 탭이 없습니다."
|
|
651
651
|
};
|
|
652
652
|
/** Renders the content tabs component. */
|
|
653
653
|
function ContentTabs({ tabs, defaultTabId, labels: customLabels }) {
|
|
654
654
|
var _tabs$, _tabs$find;
|
|
655
|
-
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$
|
|
655
|
+
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$17), customLabels);
|
|
656
656
|
const [selectedTabId, setSelectedTabId] = useState(defaultTabId !== null && defaultTabId !== void 0 ? defaultTabId : (_tabs$ = tabs[0]) === null || _tabs$ === void 0 ? void 0 : _tabs$.id);
|
|
657
657
|
if (tabs.length === 0) return /* @__PURE__ */ jsx("div", {
|
|
658
658
|
className: "text-text-secondary text-sm",
|
|
@@ -684,13 +684,13 @@ function ContentTabs({ tabs, defaultTabId, labels: customLabels }) {
|
|
|
684
684
|
}
|
|
685
685
|
//#endregion
|
|
686
686
|
//#region src/shells/faq-accordion.tsx
|
|
687
|
-
const defaultLabels$
|
|
687
|
+
const defaultLabels$16 = {
|
|
688
688
|
ariaLabel: "자주 묻는 질문",
|
|
689
689
|
emptyMessage: "등록된 FAQ가 없습니다."
|
|
690
690
|
};
|
|
691
691
|
/** Renders the faq accordion component. */
|
|
692
692
|
function FaqAccordion({ items, labels: customLabels }) {
|
|
693
|
-
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$
|
|
693
|
+
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$16), customLabels);
|
|
694
694
|
if (items.length === 0) return /* @__PURE__ */ jsx("div", {
|
|
695
695
|
className: "text-text-secondary text-sm",
|
|
696
696
|
"data-opt-id": "QRBHV",
|
|
@@ -730,14 +730,14 @@ function FaqAccordion({ items, labels: customLabels }) {
|
|
|
730
730
|
}
|
|
731
731
|
//#endregion
|
|
732
732
|
//#region src/shells/settings-form.tsx
|
|
733
|
-
const defaultLabels$
|
|
733
|
+
const defaultLabels$15 = {
|
|
734
734
|
formAriaLabel: "설정 폼",
|
|
735
735
|
submitButton: "저장",
|
|
736
736
|
successMessage: "설정이 저장되었습니다."
|
|
737
737
|
};
|
|
738
738
|
/** Renders the settings form component. */
|
|
739
739
|
function SettingsForm({ fields, onSubmit, labels: customLabels }) {
|
|
740
|
-
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$
|
|
740
|
+
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$15), customLabels);
|
|
741
741
|
const [submitted, setSubmitted] = useState(false);
|
|
742
742
|
const defaultValues = {};
|
|
743
743
|
for (const field of fields) {
|
|
@@ -1063,7 +1063,7 @@ function ProjectSwitcher({ projects, value, onChange, placeholder = "프로젝
|
|
|
1063
1063
|
ProjectSwitcher.displayName = "ProjectSwitcher";
|
|
1064
1064
|
//#endregion
|
|
1065
1065
|
//#region src/shells/env-panel.tsx
|
|
1066
|
-
const defaultLabels$
|
|
1066
|
+
const defaultLabels$14 = {
|
|
1067
1067
|
varCount: (count) => `${count}개 변수`,
|
|
1068
1068
|
envVarsLabel: (env) => `${env} 환경 변수`,
|
|
1069
1069
|
secretBadge: "secret"
|
|
@@ -1075,7 +1075,7 @@ const envDot = {
|
|
|
1075
1075
|
};
|
|
1076
1076
|
/** Renders the env panel component. */
|
|
1077
1077
|
function EnvPanel({ groups, labels: customLabels }) {
|
|
1078
|
-
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$
|
|
1078
|
+
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$14), customLabels);
|
|
1079
1079
|
return /* @__PURE__ */ jsx("div", {
|
|
1080
1080
|
className: `rounded-lg ${OPT_BORDER} divide-y ${OPT_DIVIDER} bg-surface`,
|
|
1081
1081
|
"data-opt-id": "ZBDWK",
|
|
@@ -1148,7 +1148,7 @@ function EnvPanel({ groups, labels: customLabels }) {
|
|
|
1148
1148
|
}
|
|
1149
1149
|
//#endregion
|
|
1150
1150
|
//#region src/shells/branch-select.tsx
|
|
1151
|
-
const defaultLabels$
|
|
1151
|
+
const defaultLabels$13 = {
|
|
1152
1152
|
selectLabel: "브랜치",
|
|
1153
1153
|
emptySelectionLabel: "선택...",
|
|
1154
1154
|
emptyMessage: "사용 가능한 브랜치가 없습니다.",
|
|
@@ -1157,7 +1157,7 @@ const defaultLabels$11 = {
|
|
|
1157
1157
|
/** Renders the branch select component. */
|
|
1158
1158
|
function BranchSelect({ branches, value: controlledValue, onChange, label, labels: customLabels }) {
|
|
1159
1159
|
var _ref, _defaultBranch$name, _branches$, _selected$name;
|
|
1160
|
-
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$
|
|
1160
|
+
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$13), customLabels);
|
|
1161
1161
|
const resolvedLabel = label !== null && label !== void 0 ? label : labels.selectLabel;
|
|
1162
1162
|
const defaultBranch = branches.find((b) => b.isDefault);
|
|
1163
1163
|
const [internalValue, setInternalValue] = useState((_ref = (_defaultBranch$name = defaultBranch === null || defaultBranch === void 0 ? void 0 : defaultBranch.name) !== null && _defaultBranch$name !== void 0 ? _defaultBranch$name : (_branches$ = branches[0]) === null || _branches$ === void 0 ? void 0 : _branches$.name) !== null && _ref !== void 0 ? _ref : "");
|
|
@@ -1266,7 +1266,7 @@ function BranchSelect({ branches, value: controlledValue, onChange, label, label
|
|
|
1266
1266
|
BranchSelect.displayName = "BranchSelect";
|
|
1267
1267
|
//#endregion
|
|
1268
1268
|
//#region src/shells/domain-table.tsx
|
|
1269
|
-
const defaultLabels$
|
|
1269
|
+
const defaultLabels$12 = {
|
|
1270
1270
|
domain: "Domain",
|
|
1271
1271
|
status: "Status",
|
|
1272
1272
|
ssl: "SSL",
|
|
@@ -1296,7 +1296,7 @@ const sslLabel = {
|
|
|
1296
1296
|
};
|
|
1297
1297
|
/** Renders the domain table component. */
|
|
1298
1298
|
function DomainTable({ domains, title = "도메인", labels: customLabels }) {
|
|
1299
|
-
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$
|
|
1299
|
+
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$12), customLabels);
|
|
1300
1300
|
if (domains.length === 0) return /* @__PURE__ */ jsxs("div", {
|
|
1301
1301
|
className: "gap-group flex flex-col",
|
|
1302
1302
|
"data-opt-id": "A7SRM",
|
|
@@ -1414,6 +1414,13 @@ function DomainTable({ domains, title = "도메인", labels: customLabels }) {
|
|
|
1414
1414
|
}
|
|
1415
1415
|
//#endregion
|
|
1416
1416
|
//#region src/shells/data-table.tsx
|
|
1417
|
+
const defaultLabels$11 = {
|
|
1418
|
+
selectAll: "Select all",
|
|
1419
|
+
selectRow: (key) => `Select row ${key}`,
|
|
1420
|
+
resizeColumn: (header) => `Resize ${header}`,
|
|
1421
|
+
expandRow: (key) => `Expand row ${key}`,
|
|
1422
|
+
collapseRow: (key) => `Collapse row ${key}`
|
|
1423
|
+
};
|
|
1417
1424
|
const MIN_COLUMN_WIDTH = 40;
|
|
1418
1425
|
const DEFAULT_COLUMN_RESIZE_MAX = 1200;
|
|
1419
1426
|
const alignmentClass = {
|
|
@@ -1474,7 +1481,8 @@ function DataTableProgressBar({ value, barColor, label }) {
|
|
|
1474
1481
|
});
|
|
1475
1482
|
}
|
|
1476
1483
|
/** Renders the data table component. */
|
|
1477
|
-
function DataTable({ data, columns, keyExtractor, title, ariaLabel, onRowClick, emptyMessage = "No data available", activeRowId, sortable = false, selectable = false, selectedKeys, onSelectionChange, expandable = false, renderExpanded, pageSize, stickyHeader = false, resizableColumns = false, onSort: onSortExternal, className }) {
|
|
1484
|
+
function DataTable({ data, columns, keyExtractor, title, ariaLabel, onRowClick, emptyMessage = "No data available", activeRowId, sortable = false, selectable = false, selectedKeys, onSelectionChange, expandable = false, renderExpanded, pageSize, stickyHeader = false, resizableColumns = false, onSort: onSortExternal, labels: customLabels, className }) {
|
|
1485
|
+
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$11), customLabels);
|
|
1478
1486
|
const [sortCol, setSortCol] = useState(null);
|
|
1479
1487
|
const [sortDir, setSortDir] = useState(null);
|
|
1480
1488
|
const [expandedKeys, setExpandedKeys] = useState(/* @__PURE__ */ new Set());
|
|
@@ -1579,7 +1587,7 @@ function DataTable({ data, columns, keyExtractor, title, ariaLabel, onRowClick,
|
|
|
1579
1587
|
children: /* @__PURE__ */ jsx(Checkbox, {
|
|
1580
1588
|
checked: allSelected,
|
|
1581
1589
|
onChange: toggleSelectAll,
|
|
1582
|
-
"aria-label":
|
|
1590
|
+
"aria-label": labels.selectAll
|
|
1583
1591
|
})
|
|
1584
1592
|
}),
|
|
1585
1593
|
expandable && /* @__PURE__ */ jsx("th", { className: cn("px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-text-tertiary", "w-10") }),
|
|
@@ -1601,11 +1609,14 @@ function DataTable({ data, columns, keyExtractor, title, ariaLabel, onRowClick,
|
|
|
1601
1609
|
"aria-sort": sortCol === col.id && sortDir ? sortDir === "asc" ? "ascending" : "descending" : void 0,
|
|
1602
1610
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
1603
1611
|
className: "flex items-center whitespace-nowrap",
|
|
1604
|
-
children: [
|
|
1612
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
1613
|
+
className: cn(col.headerHidden && "sr-only"),
|
|
1614
|
+
children: col.header
|
|
1615
|
+
}), sortIndicator(col.id)]
|
|
1605
1616
|
}), resizableColumns && /* @__PURE__ */ jsx("span", {
|
|
1606
1617
|
role: "separator",
|
|
1607
1618
|
"aria-orientation": "vertical",
|
|
1608
|
-
"aria-label":
|
|
1619
|
+
"aria-label": labels.resizeColumn(col.header),
|
|
1609
1620
|
"aria-valuemin": MIN_COLUMN_WIDTH,
|
|
1610
1621
|
"aria-valuemax": resizeMax,
|
|
1611
1622
|
"aria-valuenow": resizeValue,
|
|
@@ -1668,7 +1679,7 @@ function DataTable({ data, columns, keyExtractor, title, ariaLabel, onRowClick,
|
|
|
1668
1679
|
children: /* @__PURE__ */ jsx(Checkbox, {
|
|
1669
1680
|
checked: isSelected,
|
|
1670
1681
|
onChange: () => toggleSelectRow(key),
|
|
1671
|
-
"aria-label":
|
|
1682
|
+
"aria-label": labels.selectRow(key)
|
|
1672
1683
|
})
|
|
1673
1684
|
}),
|
|
1674
1685
|
expandable && /* @__PURE__ */ jsx(CompositeItem, {
|
|
@@ -1685,7 +1696,7 @@ function DataTable({ data, columns, keyExtractor, title, ariaLabel, onRowClick,
|
|
|
1685
1696
|
},
|
|
1686
1697
|
className: cn("rounded p-0.5 text-sm transition-transform", "text-text-secondary", "outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-ring-offset", isExpanded && "rotate-90"),
|
|
1687
1698
|
"aria-expanded": isExpanded,
|
|
1688
|
-
"aria-label":
|
|
1699
|
+
"aria-label": isExpanded ? labels.collapseRow(key) : labels.expandRow(key),
|
|
1689
1700
|
children: "▶"
|
|
1690
1701
|
})
|
|
1691
1702
|
}),
|
|
@@ -1791,6 +1802,7 @@ const toast = Object.assign((options) => toastStore.add(options), {
|
|
|
1791
1802
|
clear: () => toastStore.clear()
|
|
1792
1803
|
});
|
|
1793
1804
|
const ToastContext = createContext(null);
|
|
1805
|
+
const defaultLabels$10 = { regionLabel: "Notifications" };
|
|
1794
1806
|
const positionStyles = {
|
|
1795
1807
|
"top-right": "top-4 right-4",
|
|
1796
1808
|
"top-left": "top-4 left-4",
|
|
@@ -1798,7 +1810,8 @@ const positionStyles = {
|
|
|
1798
1810
|
"bottom-left": "bottom-4 left-4"
|
|
1799
1811
|
};
|
|
1800
1812
|
/** Renders the toast provider component. */
|
|
1801
|
-
function ToastProvider({ children, position = "top-right", defaultDuration = 5e3, stackLimit = 5 }) {
|
|
1813
|
+
function ToastProvider({ children, position = "top-right", defaultDuration = 5e3, stackLimit = 5, labels: customLabels }) {
|
|
1814
|
+
const labels = _objectSpread2(_objectSpread2({}, defaultLabels$10), customLabels);
|
|
1802
1815
|
const allToasts = useSyncExternalStore(toastStore.subscribe, toastStore.getSnapshot, toastStore.getSnapshot);
|
|
1803
1816
|
const visibleToasts = allToasts.length > stackLimit ? allToasts.slice(-stackLimit) : allToasts;
|
|
1804
1817
|
const addToast = useCallback((t) => toastStore.add(t), []);
|
|
@@ -1812,7 +1825,7 @@ function ToastProvider({ children, position = "top-right", defaultDuration = 5e3
|
|
|
1812
1825
|
children: [children, /* @__PURE__ */ jsx("div", {
|
|
1813
1826
|
className: cn("gap-element fixed z-50 flex flex-col", positionStyles[position]),
|
|
1814
1827
|
role: "region",
|
|
1815
|
-
"aria-label":
|
|
1828
|
+
"aria-label": labels.regionLabel,
|
|
1816
1829
|
"data-opt-id": "M0KTS",
|
|
1817
1830
|
"data-opt-slug": "notification-toast.ToastProvider",
|
|
1818
1831
|
children: visibleToasts.map((t) => /* @__PURE__ */ jsx(NotificationToast, {
|
|
@@ -282,6 +282,30 @@ interface ColumnDef<T> {
|
|
|
282
282
|
bar?: (row: T) => number;
|
|
283
283
|
/** Bar color class (default: "bg-accent") */
|
|
284
284
|
barColor?: string;
|
|
285
|
+
/**
|
|
286
|
+
* Name the column without drawing the name.
|
|
287
|
+
*
|
|
288
|
+
* A column of row actions or icons needs no visible heading, but a `<th>`
|
|
289
|
+
* with an empty string leaves the column unnamed to anyone navigating the
|
|
290
|
+
* grid by header. `header` stays required so there is always a name to say.
|
|
291
|
+
*/
|
|
292
|
+
headerHidden?: boolean;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Localized labels for the data table component.
|
|
296
|
+
*
|
|
297
|
+
* These were hard-coded English. Everything a caller can see was already
|
|
298
|
+
* theirs to write — headers, empty message, title — but the strings only a
|
|
299
|
+
* screen reader hears were not, so a fully translated table still announced
|
|
300
|
+
* "Select row purchase_completed" in the middle of a Korean page.
|
|
301
|
+
*/
|
|
302
|
+
interface DataTableLabels {
|
|
303
|
+
selectAll?: string;
|
|
304
|
+
/** Named per row, because "select row" alone does not say which. */
|
|
305
|
+
selectRow?: (key: string) => string;
|
|
306
|
+
resizeColumn?: (header: string) => string;
|
|
307
|
+
expandRow?: (key: string) => string;
|
|
308
|
+
collapseRow?: (key: string) => string;
|
|
285
309
|
}
|
|
286
310
|
/** Props for the data table component. */
|
|
287
311
|
interface DataTableProps<T> {
|
|
@@ -321,10 +345,11 @@ interface DataTableProps<T> {
|
|
|
321
345
|
resizableColumns?: boolean;
|
|
322
346
|
/** External (server-side) sort callback */
|
|
323
347
|
onSort?: (columnId: string, direction: "asc" | "desc" | null) => void;
|
|
348
|
+
labels?: DataTableLabels;
|
|
324
349
|
className?: string;
|
|
325
350
|
}
|
|
326
351
|
/** Renders the data table component. */
|
|
327
|
-
declare function DataTable<T>({ data, columns, keyExtractor, title, ariaLabel, onRowClick, emptyMessage, activeRowId, sortable, selectable, selectedKeys, onSelectionChange, expandable, renderExpanded, pageSize, stickyHeader, resizableColumns, onSort: onSortExternal, className }: DataTableProps<T>): import("react").JSX.Element;
|
|
352
|
+
declare function DataTable<T>({ data, columns, keyExtractor, title, ariaLabel, onRowClick, emptyMessage, activeRowId, sortable, selectable, selectedKeys, onSelectionChange, expandable, renderExpanded, pageSize, stickyHeader, resizableColumns, onSort: onSortExternal, labels: customLabels, className }: DataTableProps<T>): import("react").JSX.Element;
|
|
328
353
|
//#endregion
|
|
329
354
|
//#region src/shells/notification-toast.d.ts
|
|
330
355
|
/** Defines the toast action shape. */
|
|
@@ -370,15 +395,26 @@ declare const toast: ((options: ToastOptions) => string) & {
|
|
|
370
395
|
dismiss: (id: string) => void;
|
|
371
396
|
clear: () => void;
|
|
372
397
|
};
|
|
398
|
+
/**
|
|
399
|
+
* Localized labels for the notification toast component.
|
|
400
|
+
*
|
|
401
|
+
* The region's name is the only string here that is not the caller's own text —
|
|
402
|
+
* every toast carries a message they wrote — so it was the one word a fully
|
|
403
|
+
* translated app still announced in English.
|
|
404
|
+
*/
|
|
405
|
+
interface NotificationToastLabels {
|
|
406
|
+
regionLabel?: string;
|
|
407
|
+
}
|
|
373
408
|
/** Props for the toast provider component. */
|
|
374
409
|
interface ToastProviderProps {
|
|
375
410
|
children: ReactNode;
|
|
376
411
|
position?: "top-right" | "top-left" | "bottom-right" | "bottom-left";
|
|
377
412
|
defaultDuration?: number;
|
|
378
413
|
stackLimit?: number;
|
|
414
|
+
labels?: NotificationToastLabels;
|
|
379
415
|
}
|
|
380
416
|
/** Renders the toast provider component. */
|
|
381
|
-
declare function ToastProvider({ children, position, defaultDuration, stackLimit }: ToastProviderProps): import("react").JSX.Element;
|
|
417
|
+
declare function ToastProvider({ children, position, defaultDuration, stackLimit, labels: customLabels }: ToastProviderProps): import("react").JSX.Element;
|
|
382
418
|
/** Provides toast. */
|
|
383
419
|
declare function useToast(): ToastContextValue;
|
|
384
420
|
interface NotificationToastProps {
|