@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.
Files changed (77) hide show
  1. package/README.ko.md +484 -0
  2. package/README.md +484 -0
  3. package/dist/chunk-B3MQL6ZR.mjs +79 -0
  4. package/dist/chunk-B3MQL6ZR.mjs.map +1 -0
  5. package/dist/chunk-BC3TPJQY.mjs +122 -0
  6. package/dist/chunk-BC3TPJQY.mjs.map +1 -0
  7. package/dist/chunk-BTLELFKC.mjs +11 -0
  8. package/dist/chunk-BTLELFKC.mjs.map +1 -0
  9. package/dist/chunk-GDUGKVDQ.mjs +50 -0
  10. package/dist/chunk-GDUGKVDQ.mjs.map +1 -0
  11. package/dist/chunk-GFOWZGJX.js +50 -0
  12. package/dist/chunk-GFOWZGJX.js.map +1 -0
  13. package/dist/chunk-ILSZPLME.js +47 -0
  14. package/dist/chunk-ILSZPLME.js.map +1 -0
  15. package/dist/chunk-M7CCTDUG.js +122 -0
  16. package/dist/chunk-M7CCTDUG.js.map +1 -0
  17. package/dist/chunk-WVRTM6E7.js +19 -0
  18. package/dist/chunk-WVRTM6E7.js.map +1 -0
  19. package/dist/chunk-XLPMNJJV.js +11 -0
  20. package/dist/chunk-XLPMNJJV.js.map +1 -0
  21. package/dist/chunk-XSPWM4DD.js +79 -0
  22. package/dist/chunk-XSPWM4DD.js.map +1 -0
  23. package/dist/chunk-YUMB3GBN.mjs +47 -0
  24. package/dist/chunk-YUMB3GBN.mjs.map +1 -0
  25. package/dist/chunk-ZEZCUJJD.mjs +19 -0
  26. package/dist/chunk-ZEZCUJJD.mjs.map +1 -0
  27. package/dist/components/gallery.css +1074 -0
  28. package/dist/components/index.d.mts +156 -0
  29. package/dist/components/index.d.ts +156 -0
  30. package/dist/components/index.js +1215 -0
  31. package/dist/components/index.js.map +1 -0
  32. package/dist/components/index.mjs +1215 -0
  33. package/dist/components/index.mjs.map +1 -0
  34. package/dist/errors-B9gzUsX-.d.ts +39 -0
  35. package/dist/errors-DYrlDCzP.d.mts +39 -0
  36. package/dist/gallery.css +1074 -0
  37. package/dist/hooks/index.d.mts +65 -0
  38. package/dist/hooks/index.d.ts +65 -0
  39. package/dist/hooks/index.js +14 -0
  40. package/dist/hooks/index.js.map +1 -0
  41. package/dist/hooks/index.mjs +14 -0
  42. package/dist/hooks/index.mjs.map +1 -0
  43. package/dist/index.d.mts +17 -0
  44. package/dist/index.d.ts +17 -0
  45. package/dist/index.js +37 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/index.mjs +37 -0
  48. package/dist/index.mjs.map +1 -0
  49. package/dist/presets/ballet.d.mts +64 -0
  50. package/dist/presets/ballet.d.ts +64 -0
  51. package/dist/presets/ballet.js +162 -0
  52. package/dist/presets/ballet.js.map +1 -0
  53. package/dist/presets/ballet.mjs +162 -0
  54. package/dist/presets/ballet.mjs.map +1 -0
  55. package/dist/server/index.d.mts +157 -0
  56. package/dist/server/index.d.ts +157 -0
  57. package/dist/server/index.js +619 -0
  58. package/dist/server/index.js.map +1 -0
  59. package/dist/server/index.mjs +619 -0
  60. package/dist/server/index.mjs.map +1 -0
  61. package/dist/types/index.d.mts +137 -0
  62. package/dist/types/index.d.ts +137 -0
  63. package/dist/types/index.js +1 -0
  64. package/dist/types/index.js.map +1 -0
  65. package/dist/types/index.mjs +1 -0
  66. package/dist/types/index.mjs.map +1 -0
  67. package/dist/useGalleryLightbox-BYzPyBYB.d.mts +22 -0
  68. package/dist/useGalleryLightbox-BYzPyBYB.d.ts +22 -0
  69. package/dist/validators/index.d.mts +68 -0
  70. package/dist/validators/index.d.ts +68 -0
  71. package/dist/validators/index.js +7 -0
  72. package/dist/validators/index.js.map +1 -0
  73. package/dist/validators/index.mjs +7 -0
  74. package/dist/validators/index.mjs.map +1 -0
  75. package/package.json +85 -0
  76. package/prisma/gallery.schema.prisma +62 -0
  77. package/prisma/migrations/2026-05-24-enum-to-table.sql +65 -0
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "@withwiz/gallery",
3
+ "version": "0.1.0",
4
+ "description": "Headless gallery module — Prisma 7 + Next 16, host-agnostic. Drop-in admin + public surface.",
5
+ "license": "MIT",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.js"
14
+ },
15
+ "./server": {
16
+ "types": "./dist/server/index.d.ts",
17
+ "import": "./dist/server/index.mjs",
18
+ "require": "./dist/server/index.js"
19
+ },
20
+ "./components": {
21
+ "types": "./dist/components/index.d.ts",
22
+ "import": "./dist/components/index.mjs",
23
+ "require": "./dist/components/index.js"
24
+ },
25
+ "./components/gallery.css": "./dist/components/gallery.css",
26
+ "./hooks": {
27
+ "types": "./dist/hooks/index.d.ts",
28
+ "import": "./dist/hooks/index.mjs",
29
+ "require": "./dist/hooks/index.js"
30
+ },
31
+ "./validators": {
32
+ "types": "./dist/validators/index.d.ts",
33
+ "import": "./dist/validators/index.mjs",
34
+ "require": "./dist/validators/index.js"
35
+ },
36
+ "./types": {
37
+ "types": "./dist/types/index.d.ts",
38
+ "import": "./dist/types/index.mjs",
39
+ "require": "./dist/types/index.js"
40
+ },
41
+ "./presets/ballet": {
42
+ "types": "./dist/presets/ballet.d.ts",
43
+ "import": "./dist/presets/ballet.mjs",
44
+ "require": "./dist/presets/ballet.js"
45
+ }
46
+ },
47
+ "files": ["dist", "prisma", "README.md"],
48
+ "scripts": {
49
+ "build": "tsup",
50
+ "dev": "tsup --watch",
51
+ "test": "vitest run",
52
+ "test:watch": "vitest",
53
+ "prepublishOnly": "npm run build"
54
+ },
55
+ "peerDependencies": {
56
+ "next": ">=16",
57
+ "react": ">=19",
58
+ "react-dom": ">=19",
59
+ "zod": ">=4",
60
+ "@prisma/client": ">=7",
61
+ "clsx": ">=2",
62
+ "tailwind-merge": ">=3",
63
+ "sonner": ">=2"
64
+ },
65
+ "peerDependenciesMeta": {
66
+ "sonner": { "optional": true }
67
+ },
68
+ "devDependencies": {
69
+ "@types/node": "^25.6.2",
70
+ "@types/react": "^19.2.14",
71
+ "@testing-library/react": "^16.3.2",
72
+ "@vitejs/plugin-react": "^6.0.1",
73
+ "clsx": "^2.1.1",
74
+ "jsdom": "^29.1.1",
75
+ "next": "^16.2.6",
76
+ "react": "^19.2.6",
77
+ "react-dom": "^19.2.6",
78
+ "sonner": "^2.0.7",
79
+ "tailwind-merge": "^3.5.0",
80
+ "tsup": "^8.5.1",
81
+ "typescript": "^6.0.3",
82
+ "vitest": "^4.1.5",
83
+ "zod": "^4.4.3"
84
+ }
85
+ }
@@ -0,0 +1,62 @@
1
+ // @withwiz/gallery-kit 가 제공하는 partial Prisma schema.
2
+ // host 의 prisma/ 디렉토리에 multi-file 로 머지한다 (Prisma 7 multi-file schema GA).
3
+ //
4
+ // 사용법:
5
+ // 1) host package.json 에 prisma schema 디렉토리 설정
6
+ // "prisma": { "schema": "./prisma" }
7
+ // 2) host 의 prisma/ 디렉토리에 자기 schema.prisma 와 함께 이 파일을 복사 또는 symlink
8
+ // cp node_modules/@withwiz/gallery-kit/prisma/gallery.schema.prisma prisma/
9
+ // 3) prisma generate / migrate 실행
10
+ // npx prisma generate
11
+ // npx prisma migrate dev --create-only
12
+ //
13
+ // Host-independence 원칙:
14
+ // - 본 partial 은 host 의 User/Admin/Account 등 어떤 모델도 가정하지 않는다.
15
+ // - Gallery 모델은 authorId 를 String 컬럼으로만 두며, Prisma 의 @relation 을 정의하지 않는다.
16
+ // → host 모델 이름이 무엇이든 (User/Admin/Account/Member) Prisma validate 가 통과한다.
17
+ // → 작성자 표시가 필요한 admin UI 는 application layer 가 별도 query 로 join 한다.
18
+ // - 카테고리 삭제 시 cascade 위험 차단: Gallery.category 의 onDelete = Restrict.
19
+ // 사용 중 카테고리는 CategoryAdminManager 가 삭제 버튼을 비활성화한다.
20
+
21
+ model GalleryCategory {
22
+ id String @id @default(cuid())
23
+ slug String @unique
24
+ labelKo String @map("label_ko")
25
+ labelEn String? @map("label_en")
26
+ sortOrder Int @default(0) @map("sort_order")
27
+ isActive Boolean @default(true) @map("is_active")
28
+ createdAt DateTime @default(now()) @map("created_at")
29
+ updatedAt DateTime @updatedAt @map("updated_at")
30
+
31
+ galleries Gallery[]
32
+
33
+ @@index([isActive, sortOrder])
34
+ @@map("gallery_categories")
35
+ }
36
+
37
+ model Gallery {
38
+ id String @id @default(cuid())
39
+ imageUrl String @map("image_url")
40
+ imageKey String? @map("image_key")
41
+ caption String?
42
+
43
+ categoryId String @map("category_id")
44
+ category GalleryCategory @relation(fields: [categoryId], references: [id], onDelete: Restrict, onUpdate: Cascade)
45
+
46
+ sortOrder Int @default(0) @map("sort_order")
47
+ featured Boolean @default(false)
48
+ published Boolean @default(false)
49
+
50
+ // Host 의 User/Admin/Account 모델 이름을 가정하지 않기 위해 관계 정의 없이 컬럼만 둔다.
51
+ // 작성자 정보가 필요한 경우 application layer 가 별도 query 로 join.
52
+ authorId String @map("author_id")
53
+
54
+ createdAt DateTime @default(now()) @map("created_at")
55
+ updatedAt DateTime @updatedAt @map("updated_at")
56
+
57
+ @@index([published, sortOrder])
58
+ @@index([published, featured])
59
+ @@index([published, categoryId])
60
+ @@index([authorId])
61
+ @@map("galleries")
62
+ }
@@ -0,0 +1,65 @@
1
+ -- ═══════════════════════════════════════════════════════════════════════════
2
+ -- @withwiz/gallery-kit — ballet enum → table backfill migration
3
+ -- ───────────────────────────────────────────────────────────────────────────
4
+ -- 1회용 마이그레이션 스크립트.
5
+ -- ballet 의 기존 schema:
6
+ -- enum GalleryCategory { PERFORMANCE | REHEARSAL | ACTIVITY | ARTIST }
7
+ -- galleries.category ← enum 컬럼
8
+ -- 본 패키지의 새 schema:
9
+ -- gallery_categories ← 4 row seed
10
+ -- galleries.category_id ← cuid FK
11
+ --
12
+ -- ───────────────────────────────────────────────────────────────────────────
13
+ -- 실행 절차 (ballet 환경):
14
+ -- 1. host prisma/ 에 본 패키지의 gallery.schema.prisma 를 머지.
15
+ -- 2. `npx prisma migrate dev --create-only` 로 마이그레이션 SQL 자동 생성.
16
+ -- Prisma 가 만들어준 migration.sql 에서 `DROP COLUMN category` /
17
+ -- `DROP TYPE "GalleryCategory"` 부분은 수동으로 제거하고, 본 파일의 SQL 을
18
+ -- 그 위치에 삽입 (즉, gallery_categories 테이블 / categoryId 컬럼 생성 직후,
19
+ -- enum 컬럼 DROP 이전에 실행되어야 한다).
20
+ -- 3. `npx prisma migrate dev` 로 마이그레이션 실행 + 검증.
21
+ -- 4. 검증 통과 시 별도 후속 마이그레이션에서 enum 컬럼/타입을 DROP.
22
+ -- ───────────────────────────────────────────────────────────────────────────
23
+
24
+ BEGIN;
25
+
26
+ -- ─── 1) 새 테이블 / 컬럼 생성 ──────────────────────────────────────────────
27
+ -- gallery_categories 와 galleries.category_id 컬럼은 prisma migrate 결과로
28
+ -- 이미 생성되어 있다고 가정 (위 실행 절차 2 단계).
29
+
30
+ -- ─── 2) 4개 카테고리 seed (slug = 기존 enum value) ─────────────────────────
31
+ INSERT INTO gallery_categories (id, slug, label_ko, label_en, sort_order, is_active, created_at, updated_at) VALUES
32
+ ('cat_performance', 'PERFORMANCE', '공연', 'Performance', 0, true, NOW(), NOW()),
33
+ ('cat_rehearsal', 'REHEARSAL', '연습', 'Rehearsal', 1, true, NOW(), NOW()),
34
+ ('cat_activity', 'ACTIVITY', '활동', 'Activity', 2, true, NOW(), NOW()),
35
+ ('cat_artist', 'ARTIST', '아티스트', 'Artist', 3, true, NOW(), NOW());
36
+
37
+ -- ─── 3) 기존 galleries.category (enum) → category_id 백필 ──────────────────
38
+ -- 전제: enum 컬럼이 아직 살아있어야 backfill 가능.
39
+ -- prisma migrate 가 enum 컬럼 DROP 을 같은 트랜잭션에 만들었다면, 위 실행 절차
40
+ -- 2 단계에서 DROP 부분을 잘라내고 본 SQL 다음에 별도 마이그레이션으로 분리.
41
+
42
+ UPDATE galleries g
43
+ SET category_id = c.id
44
+ FROM gallery_categories c
45
+ WHERE c.slug = g.category::text;
46
+
47
+ -- ─── 4) 검증 ───────────────────────────────────────────────────────────────
48
+ -- 미매핑 row 가 있으면 트랜잭션 롤백.
49
+ DO $$
50
+ DECLARE
51
+ unmapped_count INT;
52
+ BEGIN
53
+ SELECT COUNT(*) INTO unmapped_count FROM galleries WHERE category_id IS NULL;
54
+ IF unmapped_count > 0 THEN
55
+ RAISE EXCEPTION 'Unmapped gallery rows: % — backfill 실패. enum 값과 slug 매핑을 확인하라.', unmapped_count;
56
+ END IF;
57
+ END $$;
58
+
59
+ COMMIT;
60
+
61
+ -- ───────────────────────────────────────────────────────────────────────────
62
+ -- 후속 마이그레이션 (별도 파일 / 별도 트랜잭션으로 실행):
63
+ -- ALTER TABLE galleries DROP COLUMN category;
64
+ -- DROP TYPE "GalleryCategory";
65
+ -- ───────────────────────────────────────────────────────────────────────────