@withwiz/gallery 0.1.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/README.ko.md +484 -0
- package/README.md +484 -0
- package/dist/chunk-B3MQL6ZR.mjs +79 -0
- package/dist/chunk-B3MQL6ZR.mjs.map +1 -0
- package/dist/chunk-BC3TPJQY.mjs +122 -0
- package/dist/chunk-BC3TPJQY.mjs.map +1 -0
- package/dist/chunk-BTLELFKC.mjs +11 -0
- package/dist/chunk-BTLELFKC.mjs.map +1 -0
- package/dist/chunk-GDUGKVDQ.mjs +50 -0
- package/dist/chunk-GDUGKVDQ.mjs.map +1 -0
- package/dist/chunk-GFOWZGJX.js +50 -0
- package/dist/chunk-GFOWZGJX.js.map +1 -0
- package/dist/chunk-ILSZPLME.js +47 -0
- package/dist/chunk-ILSZPLME.js.map +1 -0
- package/dist/chunk-M7CCTDUG.js +122 -0
- package/dist/chunk-M7CCTDUG.js.map +1 -0
- package/dist/chunk-WVRTM6E7.js +19 -0
- package/dist/chunk-WVRTM6E7.js.map +1 -0
- package/dist/chunk-XLPMNJJV.js +11 -0
- package/dist/chunk-XLPMNJJV.js.map +1 -0
- package/dist/chunk-XSPWM4DD.js +79 -0
- package/dist/chunk-XSPWM4DD.js.map +1 -0
- package/dist/chunk-YUMB3GBN.mjs +47 -0
- package/dist/chunk-YUMB3GBN.mjs.map +1 -0
- package/dist/chunk-ZEZCUJJD.mjs +19 -0
- package/dist/chunk-ZEZCUJJD.mjs.map +1 -0
- package/dist/components/gallery.css +1074 -0
- package/dist/components/index.d.mts +156 -0
- package/dist/components/index.d.ts +156 -0
- package/dist/components/index.js +1215 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +1215 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/errors-B9gzUsX-.d.ts +39 -0
- package/dist/errors-DYrlDCzP.d.mts +39 -0
- package/dist/gallery.css +1074 -0
- package/dist/hooks/index.d.mts +65 -0
- package/dist/hooks/index.d.ts +65 -0
- package/dist/hooks/index.js +14 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +14 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/index.d.mts +17 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +37 -0
- package/dist/index.mjs.map +1 -0
- package/dist/presets/ballet.d.mts +64 -0
- package/dist/presets/ballet.d.ts +64 -0
- package/dist/presets/ballet.js +162 -0
- package/dist/presets/ballet.js.map +1 -0
- package/dist/presets/ballet.mjs +162 -0
- package/dist/presets/ballet.mjs.map +1 -0
- package/dist/server/index.d.mts +157 -0
- package/dist/server/index.d.ts +157 -0
- package/dist/server/index.js +619 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +619 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/types/index.d.mts +137 -0
- package/dist/types/index.d.ts +137 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +1 -0
- package/dist/types/index.mjs.map +1 -0
- package/dist/useGalleryLightbox-BYzPyBYB.d.mts +22 -0
- package/dist/useGalleryLightbox-BYzPyBYB.d.ts +22 -0
- package/dist/validators/index.d.mts +68 -0
- package/dist/validators/index.d.ts +68 -0
- package/dist/validators/index.js +7 -0
- package/dist/validators/index.js.map +1 -0
- package/dist/validators/index.mjs +7 -0
- package/dist/validators/index.mjs.map +1 -0
- package/package.json +85 -0
- package/prisma/gallery.schema.prisma +62 -0
- package/prisma/migrations/2026-05-24-enum-to-table.sql +65 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { JSX, ReactNode } from 'react';
|
|
2
|
+
import { GalleryI18nKey, GallerySlotName, GalleryListItem, GalleryCategoryItem, CreateGalleryInput, UpdateGalleryInput } from '../types/index.mjs';
|
|
3
|
+
import 'next/server';
|
|
4
|
+
|
|
5
|
+
interface ToggleSwitchProps {
|
|
6
|
+
checked: boolean;
|
|
7
|
+
onChange: (next: boolean) => void;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
/** aria-label 및 시각적 라벨로 모두 사용 (지정 시 옆에 텍스트 노출). */
|
|
10
|
+
label?: string;
|
|
11
|
+
/** size 클래스 — gallery.css 의 `.gallery-toggle--sm/--md/--lg`. 기본 "md". */
|
|
12
|
+
size?: "sm" | "md" | "lg";
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
/** 접근성 - 키보드 정책:
|
|
16
|
+
* - role="switch" + aria-checked
|
|
17
|
+
* - Space / Enter 키로 toggle
|
|
18
|
+
* - disabled 시 모든 인터랙션 차단 + aria-disabled
|
|
19
|
+
*
|
|
20
|
+
* CSS:
|
|
21
|
+
* - `.gallery-toggle` 기본 컨테이너
|
|
22
|
+
* - `.gallery-toggle--checked` / `--disabled` modifier
|
|
23
|
+
* - `.gallery-toggle--sm/--md/--lg` size modifier
|
|
24
|
+
* - `.gallery-toggle__track` / `__thumb` element classes
|
|
25
|
+
* - `.gallery-toggle__label` element class (label 텍스트)
|
|
26
|
+
*/
|
|
27
|
+
declare function ToggleSwitch(props: ToggleSwitchProps): JSX.Element;
|
|
28
|
+
|
|
29
|
+
interface ImageDropZoneProps {
|
|
30
|
+
onFiles: (files: File[]) => void | Promise<void>;
|
|
31
|
+
accept?: string[];
|
|
32
|
+
maxSize?: number;
|
|
33
|
+
multiple?: boolean;
|
|
34
|
+
disabled?: boolean;
|
|
35
|
+
/** 현재 표시할 미리보기 이미지 URL (선택). null/undefined 면 placeholder 표시. */
|
|
36
|
+
previewUrl?: string | null;
|
|
37
|
+
/** i18n 키 미주입 시 fallback 텍스트. host 의 i18n 시스템과 무관. */
|
|
38
|
+
i18n?: {
|
|
39
|
+
dropPrompt?: string;
|
|
40
|
+
replacePrompt?: string;
|
|
41
|
+
rejected?: string;
|
|
42
|
+
};
|
|
43
|
+
className?: string;
|
|
44
|
+
}
|
|
45
|
+
/** primitive UI 드롭존. useImageDropZone hook 위에 얹은 thin component.
|
|
46
|
+
*
|
|
47
|
+
* - 클릭 시 hidden `<input type="file">` 트리거
|
|
48
|
+
* - previewUrl 있으면 이미지 표시 + replace 안내
|
|
49
|
+
* - isDragging 상태에서 `.gallery-dropzone--dragging` 클래스
|
|
50
|
+
* - rejectedReasons 가 있으면 `.gallery-dropzone__rejected` 영역 표시
|
|
51
|
+
*/
|
|
52
|
+
declare function ImageDropZone(props: ImageDropZoneProps): JSX.Element;
|
|
53
|
+
|
|
54
|
+
interface GalleryManagerLayoutProps {
|
|
55
|
+
/** 좌측 페인 — 호스트가 렌더하는 갤러리 목록. */
|
|
56
|
+
listRoot: ReactNode;
|
|
57
|
+
/** 좌측 페인 상단 필터/검색 컨트롤 (선택). */
|
|
58
|
+
filterControls?: ReactNode;
|
|
59
|
+
/** 좌측 페인 위의 툴바 — bulk actions 등 (선택). */
|
|
60
|
+
toolbar?: ReactNode;
|
|
61
|
+
/** 중앙 페인 — 편집 폼. null 이면 emptyState 사용. */
|
|
62
|
+
editForm: ReactNode | null;
|
|
63
|
+
/** editForm 이 null 일 때 표시할 컨텐츠 (미주입 시 i18n fallback). */
|
|
64
|
+
emptyState?: ReactNode;
|
|
65
|
+
/** 우측 페인 — 홈 프리뷰 (선택). 미주입 시 우측 영역 자체가 렌더되지 않음. */
|
|
66
|
+
homePreview?: ReactNode;
|
|
67
|
+
className?: string;
|
|
68
|
+
/** i18n key fallback (영문). */
|
|
69
|
+
i18n?: Partial<Record<GalleryI18nKey, string>>;
|
|
70
|
+
/** 호스트 customization 지점. slots 가 같은 키의 ReactNode prop 보다 우선. */
|
|
71
|
+
ui?: {
|
|
72
|
+
classNames?: Partial<Record<GallerySlotName, string>>;
|
|
73
|
+
slots?: Partial<Record<GallerySlotName, ReactNode>>;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** Gallery admin 의 3-페인 레이아웃. AdminManagerBase 의존 없는 self-contained.
|
|
77
|
+
*
|
|
78
|
+
* - 좌측: toolbar + filterControls + listRoot
|
|
79
|
+
* - 중앙: editForm (없으면 emptyState / i18n fallback)
|
|
80
|
+
* - 우측: homePreview (미주입 시 영역 자체 없음 → grid 2-cols)
|
|
81
|
+
*
|
|
82
|
+
* slot 우선순위:
|
|
83
|
+
* ui.slots[name] > 같은 의미의 props (toolbar/filterControls/listRoot 등) > fallback
|
|
84
|
+
* className 병합:
|
|
85
|
+
* ui.classNames[name] 이 해당 slot wrapper 의 className 에 추가됨.
|
|
86
|
+
*/
|
|
87
|
+
declare function GalleryManagerLayout(props: GalleryManagerLayoutProps): JSX.Element;
|
|
88
|
+
|
|
89
|
+
interface GalleryEditFormProps {
|
|
90
|
+
/** 편집 대상. null 이면 새로 생성 모드. */
|
|
91
|
+
value: GalleryListItem | null;
|
|
92
|
+
categories: GalleryCategoryItem[];
|
|
93
|
+
onSubmit: (data: CreateGalleryInput | UpdateGalleryInput) => void | Promise<void>;
|
|
94
|
+
onCancel?: () => void;
|
|
95
|
+
onDelete?: () => void | Promise<void>;
|
|
96
|
+
/** 다중 모드 (새 모드 + 여러 이미지). onSubmitMany 가 함께 주입되어야 동작. */
|
|
97
|
+
multipleMode?: boolean;
|
|
98
|
+
onSubmitMany?: (items: CreateGalleryInput[]) => void | Promise<void>;
|
|
99
|
+
/** featured 토글 가능 여부. false 이고 현재 미선택 상태이면 토글 비활성. true 이면 자유. */
|
|
100
|
+
canToggleFeatured?: boolean;
|
|
101
|
+
saving?: boolean;
|
|
102
|
+
/** 새 모드에서 이미지 파일을 host 가 업로드하고 그 결과 URL 을 반환. 미주입 시 ObjectURL preview 만 가능. */
|
|
103
|
+
onImageSelect?: (file: File) => Promise<{
|
|
104
|
+
url: string;
|
|
105
|
+
key?: string;
|
|
106
|
+
}>;
|
|
107
|
+
i18n?: Partial<Record<GalleryI18nKey, string>>;
|
|
108
|
+
className?: string;
|
|
109
|
+
}
|
|
110
|
+
/** Gallery admin edit form — self-contained.
|
|
111
|
+
*
|
|
112
|
+
* 단일 모드: 1 image + 메타. value.imageUrl 이 비어있으면 새 이미지를 onImageSelect 로 업로드.
|
|
113
|
+
* 다중 모드 (multipleMode + value=null): 여러 이미지를 자동 caption suffix + sortOrder auto-increment 로 일괄 생성.
|
|
114
|
+
*/
|
|
115
|
+
declare function GalleryEditForm(props: GalleryEditFormProps): JSX.Element;
|
|
116
|
+
|
|
117
|
+
interface GalleryHomePreviewProps {
|
|
118
|
+
/** 표시할 항목들 — 호출자가 published & featured 필터 + 정렬을 마친 상태. */
|
|
119
|
+
items: GalleryListItem[];
|
|
120
|
+
/** 모자이크 셀 개수 (host config.limits.mosaicCount). */
|
|
121
|
+
maxCount: number;
|
|
122
|
+
/** drag-and-drop 으로 재정렬된 결과를 통보. orderedIds 의 길이 = 현재 보이는 items 수. */
|
|
123
|
+
onReorder: (orderedIds: string[]) => void | Promise<void>;
|
|
124
|
+
/** ★ 토글. next = 현재 featured 의 반대값. */
|
|
125
|
+
onToggleFeatured: (id: string, next: boolean) => void | Promise<void>;
|
|
126
|
+
i18n?: Partial<Record<GalleryI18nKey, string>>;
|
|
127
|
+
className?: string;
|
|
128
|
+
}
|
|
129
|
+
/** 어드민 홈 프리뷰 — 모자이크 그리드 + HTML5 drag swap + 별 토글.
|
|
130
|
+
*
|
|
131
|
+
* drag 동작:
|
|
132
|
+
* 1. dragStart 에서 dragIndex 기록
|
|
133
|
+
* 2. dragOver 에서 dragOverIndex 기록 (visual highlight 용)
|
|
134
|
+
* 3. drop 시 dragIndex 와 drop target index 가 다르면 swap 후 onReorder
|
|
135
|
+
*
|
|
136
|
+
* 키보드 접근성은 v0.2 — 현재는 mouse 만.
|
|
137
|
+
*/
|
|
138
|
+
declare function GalleryHomePreview(props: GalleryHomePreviewProps): JSX.Element;
|
|
139
|
+
|
|
140
|
+
interface GalleryAdminManagerProps {
|
|
141
|
+
/** 초기 mode (라우트에서 결정). undefined = list view. */
|
|
142
|
+
initialMode?: "list" | "new" | "edit";
|
|
143
|
+
/** 편집 대상 ID (initialMode === "edit" 또는 URL 진입 시). */
|
|
144
|
+
initialSelectedId?: string;
|
|
145
|
+
className?: string;
|
|
146
|
+
}
|
|
147
|
+
/** 메인 마운트 포인트. host 의 페이지는 단순히 `<GalleryAdminManager initialSelectedId={id} />` 마운트. */
|
|
148
|
+
declare function GalleryAdminManager(props: GalleryAdminManagerProps): JSX.Element;
|
|
149
|
+
|
|
150
|
+
interface CategoryAdminManagerProps {
|
|
151
|
+
className?: string;
|
|
152
|
+
}
|
|
153
|
+
/** 카테고리 어드민 UI. 사용 중인 카테고리는 server 가 409 로 반환 → 안내 표시. */
|
|
154
|
+
declare function CategoryAdminManager(props: CategoryAdminManagerProps): JSX.Element;
|
|
155
|
+
|
|
156
|
+
export { CategoryAdminManager, type CategoryAdminManagerProps, GalleryAdminManager, type GalleryAdminManagerProps, GalleryEditForm, type GalleryEditFormProps, GalleryHomePreview, type GalleryHomePreviewProps, GalleryManagerLayout, type GalleryManagerLayoutProps, ImageDropZone, type ImageDropZoneProps, ToggleSwitch, type ToggleSwitchProps };
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { JSX, ReactNode } from 'react';
|
|
2
|
+
import { GalleryI18nKey, GallerySlotName, GalleryListItem, GalleryCategoryItem, CreateGalleryInput, UpdateGalleryInput } from '../types/index.js';
|
|
3
|
+
import 'next/server';
|
|
4
|
+
|
|
5
|
+
interface ToggleSwitchProps {
|
|
6
|
+
checked: boolean;
|
|
7
|
+
onChange: (next: boolean) => void;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
/** aria-label 및 시각적 라벨로 모두 사용 (지정 시 옆에 텍스트 노출). */
|
|
10
|
+
label?: string;
|
|
11
|
+
/** size 클래스 — gallery.css 의 `.gallery-toggle--sm/--md/--lg`. 기본 "md". */
|
|
12
|
+
size?: "sm" | "md" | "lg";
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
/** 접근성 - 키보드 정책:
|
|
16
|
+
* - role="switch" + aria-checked
|
|
17
|
+
* - Space / Enter 키로 toggle
|
|
18
|
+
* - disabled 시 모든 인터랙션 차단 + aria-disabled
|
|
19
|
+
*
|
|
20
|
+
* CSS:
|
|
21
|
+
* - `.gallery-toggle` 기본 컨테이너
|
|
22
|
+
* - `.gallery-toggle--checked` / `--disabled` modifier
|
|
23
|
+
* - `.gallery-toggle--sm/--md/--lg` size modifier
|
|
24
|
+
* - `.gallery-toggle__track` / `__thumb` element classes
|
|
25
|
+
* - `.gallery-toggle__label` element class (label 텍스트)
|
|
26
|
+
*/
|
|
27
|
+
declare function ToggleSwitch(props: ToggleSwitchProps): JSX.Element;
|
|
28
|
+
|
|
29
|
+
interface ImageDropZoneProps {
|
|
30
|
+
onFiles: (files: File[]) => void | Promise<void>;
|
|
31
|
+
accept?: string[];
|
|
32
|
+
maxSize?: number;
|
|
33
|
+
multiple?: boolean;
|
|
34
|
+
disabled?: boolean;
|
|
35
|
+
/** 현재 표시할 미리보기 이미지 URL (선택). null/undefined 면 placeholder 표시. */
|
|
36
|
+
previewUrl?: string | null;
|
|
37
|
+
/** i18n 키 미주입 시 fallback 텍스트. host 의 i18n 시스템과 무관. */
|
|
38
|
+
i18n?: {
|
|
39
|
+
dropPrompt?: string;
|
|
40
|
+
replacePrompt?: string;
|
|
41
|
+
rejected?: string;
|
|
42
|
+
};
|
|
43
|
+
className?: string;
|
|
44
|
+
}
|
|
45
|
+
/** primitive UI 드롭존. useImageDropZone hook 위에 얹은 thin component.
|
|
46
|
+
*
|
|
47
|
+
* - 클릭 시 hidden `<input type="file">` 트리거
|
|
48
|
+
* - previewUrl 있으면 이미지 표시 + replace 안내
|
|
49
|
+
* - isDragging 상태에서 `.gallery-dropzone--dragging` 클래스
|
|
50
|
+
* - rejectedReasons 가 있으면 `.gallery-dropzone__rejected` 영역 표시
|
|
51
|
+
*/
|
|
52
|
+
declare function ImageDropZone(props: ImageDropZoneProps): JSX.Element;
|
|
53
|
+
|
|
54
|
+
interface GalleryManagerLayoutProps {
|
|
55
|
+
/** 좌측 페인 — 호스트가 렌더하는 갤러리 목록. */
|
|
56
|
+
listRoot: ReactNode;
|
|
57
|
+
/** 좌측 페인 상단 필터/검색 컨트롤 (선택). */
|
|
58
|
+
filterControls?: ReactNode;
|
|
59
|
+
/** 좌측 페인 위의 툴바 — bulk actions 등 (선택). */
|
|
60
|
+
toolbar?: ReactNode;
|
|
61
|
+
/** 중앙 페인 — 편집 폼. null 이면 emptyState 사용. */
|
|
62
|
+
editForm: ReactNode | null;
|
|
63
|
+
/** editForm 이 null 일 때 표시할 컨텐츠 (미주입 시 i18n fallback). */
|
|
64
|
+
emptyState?: ReactNode;
|
|
65
|
+
/** 우측 페인 — 홈 프리뷰 (선택). 미주입 시 우측 영역 자체가 렌더되지 않음. */
|
|
66
|
+
homePreview?: ReactNode;
|
|
67
|
+
className?: string;
|
|
68
|
+
/** i18n key fallback (영문). */
|
|
69
|
+
i18n?: Partial<Record<GalleryI18nKey, string>>;
|
|
70
|
+
/** 호스트 customization 지점. slots 가 같은 키의 ReactNode prop 보다 우선. */
|
|
71
|
+
ui?: {
|
|
72
|
+
classNames?: Partial<Record<GallerySlotName, string>>;
|
|
73
|
+
slots?: Partial<Record<GallerySlotName, ReactNode>>;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** Gallery admin 의 3-페인 레이아웃. AdminManagerBase 의존 없는 self-contained.
|
|
77
|
+
*
|
|
78
|
+
* - 좌측: toolbar + filterControls + listRoot
|
|
79
|
+
* - 중앙: editForm (없으면 emptyState / i18n fallback)
|
|
80
|
+
* - 우측: homePreview (미주입 시 영역 자체 없음 → grid 2-cols)
|
|
81
|
+
*
|
|
82
|
+
* slot 우선순위:
|
|
83
|
+
* ui.slots[name] > 같은 의미의 props (toolbar/filterControls/listRoot 등) > fallback
|
|
84
|
+
* className 병합:
|
|
85
|
+
* ui.classNames[name] 이 해당 slot wrapper 의 className 에 추가됨.
|
|
86
|
+
*/
|
|
87
|
+
declare function GalleryManagerLayout(props: GalleryManagerLayoutProps): JSX.Element;
|
|
88
|
+
|
|
89
|
+
interface GalleryEditFormProps {
|
|
90
|
+
/** 편집 대상. null 이면 새로 생성 모드. */
|
|
91
|
+
value: GalleryListItem | null;
|
|
92
|
+
categories: GalleryCategoryItem[];
|
|
93
|
+
onSubmit: (data: CreateGalleryInput | UpdateGalleryInput) => void | Promise<void>;
|
|
94
|
+
onCancel?: () => void;
|
|
95
|
+
onDelete?: () => void | Promise<void>;
|
|
96
|
+
/** 다중 모드 (새 모드 + 여러 이미지). onSubmitMany 가 함께 주입되어야 동작. */
|
|
97
|
+
multipleMode?: boolean;
|
|
98
|
+
onSubmitMany?: (items: CreateGalleryInput[]) => void | Promise<void>;
|
|
99
|
+
/** featured 토글 가능 여부. false 이고 현재 미선택 상태이면 토글 비활성. true 이면 자유. */
|
|
100
|
+
canToggleFeatured?: boolean;
|
|
101
|
+
saving?: boolean;
|
|
102
|
+
/** 새 모드에서 이미지 파일을 host 가 업로드하고 그 결과 URL 을 반환. 미주입 시 ObjectURL preview 만 가능. */
|
|
103
|
+
onImageSelect?: (file: File) => Promise<{
|
|
104
|
+
url: string;
|
|
105
|
+
key?: string;
|
|
106
|
+
}>;
|
|
107
|
+
i18n?: Partial<Record<GalleryI18nKey, string>>;
|
|
108
|
+
className?: string;
|
|
109
|
+
}
|
|
110
|
+
/** Gallery admin edit form — self-contained.
|
|
111
|
+
*
|
|
112
|
+
* 단일 모드: 1 image + 메타. value.imageUrl 이 비어있으면 새 이미지를 onImageSelect 로 업로드.
|
|
113
|
+
* 다중 모드 (multipleMode + value=null): 여러 이미지를 자동 caption suffix + sortOrder auto-increment 로 일괄 생성.
|
|
114
|
+
*/
|
|
115
|
+
declare function GalleryEditForm(props: GalleryEditFormProps): JSX.Element;
|
|
116
|
+
|
|
117
|
+
interface GalleryHomePreviewProps {
|
|
118
|
+
/** 표시할 항목들 — 호출자가 published & featured 필터 + 정렬을 마친 상태. */
|
|
119
|
+
items: GalleryListItem[];
|
|
120
|
+
/** 모자이크 셀 개수 (host config.limits.mosaicCount). */
|
|
121
|
+
maxCount: number;
|
|
122
|
+
/** drag-and-drop 으로 재정렬된 결과를 통보. orderedIds 의 길이 = 현재 보이는 items 수. */
|
|
123
|
+
onReorder: (orderedIds: string[]) => void | Promise<void>;
|
|
124
|
+
/** ★ 토글. next = 현재 featured 의 반대값. */
|
|
125
|
+
onToggleFeatured: (id: string, next: boolean) => void | Promise<void>;
|
|
126
|
+
i18n?: Partial<Record<GalleryI18nKey, string>>;
|
|
127
|
+
className?: string;
|
|
128
|
+
}
|
|
129
|
+
/** 어드민 홈 프리뷰 — 모자이크 그리드 + HTML5 drag swap + 별 토글.
|
|
130
|
+
*
|
|
131
|
+
* drag 동작:
|
|
132
|
+
* 1. dragStart 에서 dragIndex 기록
|
|
133
|
+
* 2. dragOver 에서 dragOverIndex 기록 (visual highlight 용)
|
|
134
|
+
* 3. drop 시 dragIndex 와 drop target index 가 다르면 swap 후 onReorder
|
|
135
|
+
*
|
|
136
|
+
* 키보드 접근성은 v0.2 — 현재는 mouse 만.
|
|
137
|
+
*/
|
|
138
|
+
declare function GalleryHomePreview(props: GalleryHomePreviewProps): JSX.Element;
|
|
139
|
+
|
|
140
|
+
interface GalleryAdminManagerProps {
|
|
141
|
+
/** 초기 mode (라우트에서 결정). undefined = list view. */
|
|
142
|
+
initialMode?: "list" | "new" | "edit";
|
|
143
|
+
/** 편집 대상 ID (initialMode === "edit" 또는 URL 진입 시). */
|
|
144
|
+
initialSelectedId?: string;
|
|
145
|
+
className?: string;
|
|
146
|
+
}
|
|
147
|
+
/** 메인 마운트 포인트. host 의 페이지는 단순히 `<GalleryAdminManager initialSelectedId={id} />` 마운트. */
|
|
148
|
+
declare function GalleryAdminManager(props: GalleryAdminManagerProps): JSX.Element;
|
|
149
|
+
|
|
150
|
+
interface CategoryAdminManagerProps {
|
|
151
|
+
className?: string;
|
|
152
|
+
}
|
|
153
|
+
/** 카테고리 어드민 UI. 사용 중인 카테고리는 server 가 409 로 반환 → 안내 표시. */
|
|
154
|
+
declare function CategoryAdminManager(props: CategoryAdminManagerProps): JSX.Element;
|
|
155
|
+
|
|
156
|
+
export { CategoryAdminManager, type CategoryAdminManagerProps, GalleryAdminManager, type GalleryAdminManagerProps, GalleryEditForm, type GalleryEditFormProps, GalleryHomePreview, type GalleryHomePreviewProps, GalleryManagerLayout, type GalleryManagerLayoutProps, ImageDropZone, type ImageDropZoneProps, ToggleSwitch, type ToggleSwitchProps };
|