boottent-design 0.1.256 → 0.1.259

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 (132) hide show
  1. package/README.md +59 -1
  2. package/bin/sync-docs.mjs +285 -0
  3. package/dist/article-asset-card-CGSemovn.cjs +1 -0
  4. package/dist/{article-asset-card-lw8aNjSM.js → article-asset-card-D1Ipe86b.js} +3 -2
  5. package/dist/camp-card-BRs3koNF.cjs +1 -0
  6. package/dist/{camp-card-7lzkmQep.js → camp-card-Bi7Li0p5.js} +3 -2
  7. package/dist/company-info-card-C00gMHAv.cjs +1 -0
  8. package/dist/{company-info-card-BVCaYbYN.js → company-info-card-D1U_poOk.js} +3 -2
  9. package/dist/components/article-asset-card.cjs.js +1 -1
  10. package/dist/components/article-asset-card.es.js +1 -1
  11. package/dist/components/camp-card.cjs.js +1 -1
  12. package/dist/components/camp-card.es.js +1 -1
  13. package/dist/components/company-info-card.cjs.js +1 -1
  14. package/dist/components/company-info-card.es.js +1 -1
  15. package/dist/components/event-card.cjs.js +1 -1
  16. package/dist/components/event-card.es.js +1 -1
  17. package/dist/components/lecturer-card.cjs.js +1 -1
  18. package/dist/components/lecturer-card.es.js +1 -1
  19. package/dist/components/main-banner-image.cjs.js +1 -1
  20. package/dist/components/main-banner-image.es.js +1 -1
  21. package/dist/components/mobile-camp-card.cjs.js +1 -1
  22. package/dist/components/mobile-camp-card.es.js +1 -1
  23. package/dist/components/portfolio-asset-card.cjs.js +1 -1
  24. package/dist/components/portfolio-asset-card.es.js +1 -1
  25. package/dist/components/premium-card.cjs.js +1 -1
  26. package/dist/components/premium-card.es.js +1 -1
  27. package/dist/components/title-tag-card.cjs.js +1 -1
  28. package/dist/components/title-tag-card.es.js +1 -1
  29. package/dist/components/youtube-video-modal.cjs.js +1 -1
  30. package/dist/components/youtube-video-modal.es.js +1 -1
  31. package/dist/components.cjs.js +1 -1
  32. package/dist/components.es.js +11 -11
  33. package/dist/design-system/components/article-asset-card.md +30 -0
  34. package/dist/design-system/components/blog-review-card.md +29 -0
  35. package/dist/design-system/components/camp-card.md +58 -0
  36. package/dist/design-system/components/company-info-card.md +31 -0
  37. package/dist/design-system/components/environment-asset-photo.md +31 -0
  38. package/dist/design-system/components/event-asset-banner.md +30 -0
  39. package/dist/design-system/components/event-card.md +39 -0
  40. package/dist/design-system/components/lecturer-card.md +37 -0
  41. package/dist/design-system/components/main-banner-image.md +40 -0
  42. package/dist/design-system/components/mobile-camp-card.md +60 -0
  43. package/dist/design-system/components/partner-list-card.md +31 -0
  44. package/dist/design-system/components/portfolio-asset-card.md +30 -0
  45. package/dist/design-system/components/premium-card.md +39 -0
  46. package/dist/design-system/components/title-tag-card.md +38 -0
  47. package/dist/design-system/components/youtube-video-modal.md +34 -0
  48. package/dist/design-system/design-system.md +138 -0
  49. package/dist/design-system/tokens.md +113 -0
  50. package/dist/design-system/ui/accordion.md +42 -0
  51. package/dist/design-system/ui/alert-dialog.md +53 -0
  52. package/dist/design-system/ui/anchor.md +48 -0
  53. package/dist/design-system/ui/aspect-ratio.md +36 -0
  54. package/dist/design-system/ui/avatar.md +35 -0
  55. package/dist/design-system/ui/badge.md +57 -0
  56. package/dist/design-system/ui/button.md +79 -0
  57. package/dist/design-system/ui/calendar.md +47 -0
  58. package/dist/design-system/ui/callout.md +42 -0
  59. package/dist/design-system/ui/card.md +41 -0
  60. package/dist/design-system/ui/checkbox.md +38 -0
  61. package/dist/design-system/ui/circled-check-button.md +33 -0
  62. package/dist/design-system/ui/command.md +50 -0
  63. package/dist/design-system/ui/dialog.md +44 -0
  64. package/dist/design-system/ui/dropdown-menu.md +44 -0
  65. package/dist/design-system/ui/file-uploader.md +49 -0
  66. package/dist/design-system/ui/form.md +52 -0
  67. package/dist/design-system/ui/highlight-text.md +30 -0
  68. package/dist/design-system/ui/icons.md +17 -0
  69. package/dist/design-system/ui/image.md +44 -0
  70. package/dist/design-system/ui/input.md +50 -0
  71. package/dist/design-system/ui/label.md +38 -0
  72. package/dist/design-system/ui/month-picker.md +44 -0
  73. package/dist/design-system/ui/multi-select.md +49 -0
  74. package/dist/design-system/ui/navigation-menu.md +42 -0
  75. package/dist/design-system/ui/popover.md +43 -0
  76. package/dist/design-system/ui/progress.md +45 -0
  77. package/dist/design-system/ui/radio-group.md +40 -0
  78. package/dist/design-system/ui/scroll-area.md +32 -0
  79. package/dist/design-system/ui/select.md +46 -0
  80. package/dist/design-system/ui/separator.md +32 -0
  81. package/dist/design-system/ui/simple-table.md +34 -0
  82. package/dist/design-system/ui/skeleton.md +43 -0
  83. package/dist/design-system/ui/slider.md +30 -0
  84. package/dist/design-system/ui/switch.md +30 -0
  85. package/dist/design-system/ui/symbols.md +17 -0
  86. package/dist/design-system/ui/tabs.md +44 -0
  87. package/dist/design-system/ui/tag.md +79 -0
  88. package/dist/design-system/ui/text.md +50 -0
  89. package/dist/design-system/ui/textarea.md +45 -0
  90. package/dist/design-system/ui/toast.md +66 -0
  91. package/dist/design-system/ui/toggle-group.md +50 -0
  92. package/dist/design-system/ui/toggle.md +68 -0
  93. package/dist/design-system/ui/tooltip.md +55 -0
  94. package/dist/design-system/usage.md +79 -0
  95. package/dist/design-system/when-to-use.md +127 -0
  96. package/dist/{event-card-DoePuHu8.js → event-card-C1mSACOR.js} +3 -2
  97. package/dist/event-card-DebLbRKd.cjs +1 -0
  98. package/dist/{lecturer-card-B80BJVu3.js → lecturer-card-BlzA-YP6.js} +3 -2
  99. package/dist/lecturer-card-CgSWLJ8r.cjs +1 -0
  100. package/dist/{main-banner-image-DoYpMy7T.js → main-banner-image-BRLhiQJZ.js} +8 -7
  101. package/dist/main-banner-image-Bh3AZqac.cjs +1 -0
  102. package/dist/mobile-camp-card-B4L0Eq0v.cjs +1 -0
  103. package/dist/{mobile-camp-card-S0gvQ6bD.js → mobile-camp-card-B8rTQeTh.js} +20 -19
  104. package/dist/portfolio-asset-card-BdS7kkkT.cjs +1 -0
  105. package/dist/{portfolio-asset-card-C_opxeH0.js → portfolio-asset-card-DEMARh53.js} +5 -4
  106. package/dist/premium-card-1vtWPIUr.cjs +1 -0
  107. package/dist/{premium-card-BzFA2A5p.js → premium-card-CFQKDWqN.js} +14 -13
  108. package/dist/styles.css +1 -1
  109. package/dist/{title-tag-card-CEjHX43m.js → title-tag-card-Iowzns_v.js} +3 -2
  110. package/dist/title-tag-card-MFpE2-Nb.cjs +1 -0
  111. package/dist/types/progress.d.ts +13 -0
  112. package/dist/types/ui/progress.d.ts +2 -0
  113. package/dist/types/ui.d.ts +10 -0
  114. package/dist/ui/progress.cjs.js +1 -0
  115. package/dist/ui/progress.es.js +26 -0
  116. package/dist/ui.cjs.js +1 -1
  117. package/dist/ui.es.js +101 -99
  118. package/dist/{youtube-video-modal-CENnr9lf.js → youtube-video-modal-B_vy97Tt.js} +11 -10
  119. package/dist/youtube-video-modal-C4a0lovb.cjs +1 -0
  120. package/package.json +14 -4
  121. package/dist/DESIGN.md +0 -1963
  122. package/dist/article-asset-card-CM_WiHYI.cjs +0 -1
  123. package/dist/camp-card-Dr0h_TPh.cjs +0 -1
  124. package/dist/company-info-card-H1BDbRoL.cjs +0 -1
  125. package/dist/event-card-B7TYQ2do.cjs +0 -1
  126. package/dist/lecturer-card-CGPXVDdx.cjs +0 -1
  127. package/dist/main-banner-image-DdV4qseq.cjs +0 -1
  128. package/dist/mobile-camp-card-DJPf2Efp.cjs +0 -1
  129. package/dist/portfolio-asset-card-BlgNFtHc.cjs +0 -1
  130. package/dist/premium-card-Diea6qG_.cjs +0 -1
  131. package/dist/title-tag-card-Cn0V-8Ga.cjs +0 -1
  132. package/dist/youtube-video-modal-pooOcDO1.cjs +0 -1
package/README.md CHANGED
@@ -3,8 +3,8 @@
3
3
  ## 목차
4
4
 
5
5
  - [소개](#소개)
6
- - [특징](#특징)
7
6
  - [시작하기](#시작하기)
7
+ - [문서](#문서)
8
8
  - [설치](#설치)
9
9
  - [빠른 사용법 (Tailwind 설정 불필요)](#빠른-사용법-tailwind-설정-불필요)
10
10
  - [Tailwind 앱 권장 사용법](#tailwind-앱-권장-사용법)
@@ -250,3 +250,61 @@ npm 인증 토큰은 레포 파일에 커밋하지 않고 환경변수로만 주
250
250
  - Yarn 설정: `.yarnrc.yml`에서 `npmAuthToken: "${NPM_AUTH_TOKEN:-}"` 사용
251
251
 
252
252
  기존에 파일에 들어가 있던 토큰은 즉시 폐기(rotate/revoke) 후 새 토큰으로 교체해야 합니다.
253
+
254
+ ## 문서
255
+
256
+ ### 레포 문서 (직접 작성)
257
+
258
+ | 문서 | 설명 |
259
+ |------|------|
260
+ | [docs/PRD.md](docs/PRD.md) | 이 라이브러리의 존재 이유, 이해관계자, 목표, 성공 지표 |
261
+ | [docs/Architecture.md](docs/Architecture.md) | 레이어 구조, 빌드 시스템, CSS 모드 2종, CI/CD 파이프라인 |
262
+ | [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md) | 컴포넌트 추가 절차, 브랜치 전략, 버전 bump, npm publish |
263
+ | [docs/COMPONENT-GUIDELINES.md](docs/COMPONENT-GUIDELINES.md) | 컴포넌트 설계 원칙, presentational 철학, props 패턴, anti-pattern |
264
+ | [docs/DESIGN-TOKENS.md](docs/DESIGN-TOKENS.md) | 색상 팔레트, 타이포 스케일, camps/ads 토큰 전체 레퍼런스 |
265
+ | [docs/STORYBOOK.md](docs/STORYBOOK.md) | 스토리 작성 가이드, JSDoc 자동 문서화, Chromatic 회귀 테스트 |
266
+ | [docs/SSOT-INTEGRATION.md](docs/SSOT-INTEGRATION.md) | 소비 레포(frontend/partner)가 DS 문서를 SSOT로 동기화하는 절차 |
267
+
268
+ ### 자동 생성 문서 (SSOT, 허브 & 스포크)
269
+
270
+ 소스(JSDoc·토큰·컴포넌트·결정 매트릭스)에서 **기계 생성**된다. 큰 문서를 통째로 읽지 않고 **필요한 스포크만** 열어보도록 허브 1개 + 작은 스포크 다수로 구성된다. 직접 수정하지 말 것 — 소스를 고치고 `yarn docs:gen`으로 재생성한다.
271
+
272
+ 흐름: **추적 소스 → 빌드 시 dist로 스탬프 → 소비처가 dist 스탬프본을 sync**
273
+
274
+ - `docs/design-system/**` — **git 추적·커밋**되는 클린 소스(GitHub에서 바로 열람). 출력은 **결정적**(버전·날짜 없음)이라 버전 bump·재생성에도 소스 내용이 같으면 diff가 없다.
275
+ - `dist/design-system/**` — `yarn build`(`stamp:design-docs`)가 위를 복사하면서 **버전 + 빌드 날짜를 주입**한 배포본. `files: ["dist", "bin"]`로 npm 배포되는 정본.
276
+
277
+ | 문서 | 경로(추적 소스) | 설명 |
278
+ |------|------|------|
279
+ | 허브 | `docs/design-system/design-system.md` | 원칙(DS-first) · 네비게이션 가이드 · 인벤토리(링크) · import 맵 |
280
+ | 결정 가이드 | `docs/design-system/when-to-use.md` | 어떤 상황에 어떤 컴포넌트를 쓰는가 |
281
+ | 사용법 | `docs/design-system/usage.md` | 설치 · CSS 배포 모드 · presentational 소비 규칙 |
282
+ | 토큰 | `docs/design-system/tokens.md` | 색상 · 타이포 · 기타 토큰 |
283
+ | UI 스포크 | `docs/design-system/ui/<name>.md` | UI 프리미티브당 1파일 |
284
+ | 조합형 스포크 | `docs/design-system/components/<name>.md` | 조합형 컴포넌트당 1파일 |
285
+
286
+ **문서 sync 도구** (이 레포에서):
287
+ - `yarn docs:gen` — 추적 문서 재생성 · `yarn docs:check` — 소스와 sync 검사(deep-entry·토큰·결정 매트릭스·freshness).
288
+ - `/ds-docs-check` (slash) — 읽기전용 sync 리포트 · `/ds-docs-sync` (slash) — 재생성 + 누락 JSDoc·결정 엔트리 초안 작성.
289
+ - husky `pre-commit`이 커밋 시 문서를 자동 재생성·stage 한다.
290
+
291
+ **소비 레포**는 동봉된 `boottent-design-docs` CLI로 dist 스탬프본을 자기 레포로 동기화한다.
292
+
293
+ ```sh
294
+ # 소비 레포(boottent-frontend 등)에서
295
+ yarn boottent-design-docs init --postinstall # docs/ds/ 초기화 + docs/design.md scaffold + install/update 자동 sync 설정
296
+
297
+ # boottent-design이 아직 설치 전이면
298
+ yarn dlx -p boottent-design boottent-design-docs init --postinstall
299
+
300
+ # npm 사용 소비처
301
+ npx -p boottent-design boottent-design-docs init --postinstall
302
+
303
+ # 수동 동기화만 필요할 때
304
+ boottent-design-docs sync # docs/ds/ 로 미러 복사 + docs/design.md scaffold(없을 때만)
305
+ boottent-design-docs sync --out docs/design # 미러 경로 변경
306
+ boottent-design-docs sync --no-scaffold # design.md 자동 생성 비활성화
307
+ ```
308
+
309
+ 소비처는 자체 `docs/design.md`(허브로 연결, 앱 전용 확장 기록)를 소유하고, `docs/ds/`는 sync가 덮어쓰는 SSOT 미러다. `init --postinstall`을 한 번 실행하면 이후 `yarn install` / `yarn upgrade boottent-design` 때 최신 DS 문서가 자동으로 다시 동기화된다.
310
+ 자세한 연동/업그레이드 루프는 [docs/SSOT-INTEGRATION.md](docs/SSOT-INTEGRATION.md)를 참조하세요.
@@ -0,0 +1,285 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * boottent-design-docs — 소비 레포가 DS의 자동 생성 문서를 SSOT로 동기화하는 CLI.
4
+ *
5
+ * 설치된 boottent-design 패키지의 dist/design-system/ (버전·날짜 스탬프본) 허브+스포크 트리를
6
+ * 소비 레포의 문서 디렉터리(기본 docs/ds/)로 재귀 복사한다.
7
+ * 또한 소비 레포가 자체 확장을 적을 design.md(기본 docs/design.md)를 없을 때만 scaffold 한다.
8
+ *
9
+ * 사용법:
10
+ * boottent-design-docs sync [--out <dir>] [--design-doc <path>] [--no-scaffold]
11
+ * boottent-design-docs init [--out <dir>] [--design-doc <path>] [--no-scaffold] [--postinstall]
12
+ *
13
+ * 옵션:
14
+ * --out <dir> SSOT 미러 출력 디렉터리 (기본: docs/ds)
15
+ * --design-doc <path> 소비처 소유 design.md 경로 (기본: docs/design.md). 없을 때만 생성.
16
+ * --no-scaffold design.md scaffold 비활성화
17
+ * --postinstall 소비처 package.json에 install/update 후 자동 sync 스크립트 추가
18
+ * --help 이 도움말
19
+ */
20
+ import fs from "node:fs";
21
+ import path from "node:path";
22
+ import { fileURLToPath } from "node:url";
23
+
24
+ const __filename = fileURLToPath(import.meta.url);
25
+ const __dirname = path.dirname(__filename);
26
+
27
+ // CLI 파일은 <pkg>/bin/sync-docs.mjs → 패키지 루트는 한 단계 위
28
+ const PKG_ROOT = path.join(__dirname, "..");
29
+ const SRC_DOCS = path.join(PKG_ROOT, "dist", "design-system");
30
+
31
+ const DEFAULT_OUT = "docs/ds";
32
+ const DEFAULT_DESIGN_DOC = "docs/design.md";
33
+ const SYNC_COMMAND = "boottent-design-docs sync";
34
+
35
+ function printHelp() {
36
+ console.log(`boottent-design-docs — DS 문서 SSOT 동기화
37
+
38
+ 사용법:
39
+ boottent-design-docs sync [--out <dir>] [--design-doc <path>] [--no-scaffold]
40
+ boottent-design-docs init [--out <dir>] [--design-doc <path>] [--no-scaffold] [--postinstall]
41
+
42
+ 옵션:
43
+ --out <dir> SSOT 미러 출력 디렉터리 (기본: ${DEFAULT_OUT})
44
+ --design-doc <path> 소비처 소유 design.md 경로 (기본: ${DEFAULT_DESIGN_DOC}). 없을 때만 생성.
45
+ --no-scaffold design.md scaffold 비활성화
46
+ --postinstall 소비처 package.json에 install/update 후 자동 sync 스크립트 추가
47
+ --help 이 도움말
48
+
49
+ 동작:
50
+ sync: 설치된 boottent-design 의 dist/design-system/ (허브 + 스포크 스탬프본)를 <dir> 로 미러링하고,
51
+ 소비처 design.md 가 없으면 허브로 연결되는 시작 템플릿을 생성합니다.
52
+ init: sync를 먼저 실행한 뒤, --postinstall 지정 시 소비처 package.json에 자동 동기화 스크립트를 추가합니다.`);
53
+ }
54
+
55
+ function getPkgVersion() {
56
+ try {
57
+ const pkg = JSON.parse(fs.readFileSync(path.join(PKG_ROOT, "package.json"), "utf-8"));
58
+ return pkg.version ?? "unknown";
59
+ } catch {
60
+ return "unknown";
61
+ }
62
+ }
63
+
64
+ function parseArgs(argv) {
65
+ const args = {
66
+ command: undefined,
67
+ out: DEFAULT_OUT,
68
+ designDoc: DEFAULT_DESIGN_DOC,
69
+ scaffold: true,
70
+ postinstall: false,
71
+ help: false,
72
+ };
73
+ for (let i = 0; i < argv.length; i++) {
74
+ const arg = argv[i];
75
+ if (arg === "--help" || arg === "-h") args.help = true;
76
+ else if (arg === "--out" || arg === "-o") args.out = argv[++i];
77
+ else if (arg === "--design-doc") args.designDoc = argv[++i];
78
+ else if (arg === "--no-scaffold") args.scaffold = false;
79
+ else if (arg === "--postinstall") args.postinstall = true;
80
+ else if (!arg.startsWith("-") && !args.command) args.command = arg;
81
+ }
82
+ return args;
83
+ }
84
+
85
+ function fail(message) {
86
+ console.error(`✗ ${message}`);
87
+ process.exit(1);
88
+ }
89
+
90
+ function normalizeRelPath(filePath) {
91
+ return filePath.split(path.sep).join("/");
92
+ }
93
+
94
+ /** 디렉터리 트리를 재귀 복사한다. */
95
+ function copyTree(srcDir, destDir) {
96
+ fs.mkdirSync(destDir, { recursive: true });
97
+ let count = 0;
98
+ for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
99
+ const srcPath = path.join(srcDir, entry.name);
100
+ const destPath = path.join(destDir, entry.name);
101
+ if (entry.isDirectory()) {
102
+ count += copyTree(srcPath, destPath);
103
+ } else if (entry.isFile()) {
104
+ fs.copyFileSync(srcPath, destPath);
105
+ count += 1;
106
+ }
107
+ }
108
+ return count;
109
+ }
110
+
111
+ function mirrorDocs(srcDir, destDir) {
112
+ const cwd = process.cwd();
113
+ const resolvedDest = path.resolve(destDir);
114
+ if (resolvedDest === cwd) {
115
+ fail(`미러 출력 디렉터리로 현재 작업 디렉터리 자체를 사용할 수 없습니다: ${resolvedDest}`);
116
+ }
117
+
118
+ fs.rmSync(resolvedDest, { recursive: true, force: true });
119
+ return copyTree(srcDir, resolvedDest);
120
+ }
121
+
122
+ /** 소비처가 소유하는 design.md 시작 템플릿. */
123
+ function designDocTemplate(version, outRel, generatedAt) {
124
+ const hub = path.posix.join(outRel, "design-system.md");
125
+ const whenToUse = path.posix.join(outRel, "when-to-use.md");
126
+ return `# 디자인 가이드 (이 앱)
127
+
128
+ > 이 파일은 **이 앱이 소유**합니다. 자유롭게 편집하세요.
129
+ > 디자인 시스템 정본(SSOT)은 \`${outRel}/\` 아래에 자동 동기화됩니다. (boottent-design v${version}, ${generatedAt})
130
+
131
+ ## 원칙
132
+
133
+ UI는 [boottent-design](https://boottent.com)을 **단일 진실 원천(SSOT)** 으로 사용합니다.
134
+
135
+ - 새 UI는 먼저 [디자인 시스템 허브](${hub})의 인벤토리에서 찾고, 없을 때만 조합/확장합니다.
136
+ - 어떤 컴포넌트를 쓸지 모르겠으면 [언제 무엇을 쓰나](${whenToUse})를 봅니다.
137
+ - 색·타이포·간격은 DS 토큰만 사용하고, 임의의 hex·px를 직접 쓰지 않습니다.
138
+
139
+ ## 이 앱의 디자인 확장
140
+
141
+ > DS를 기본으로 두고, 이 앱에서만 추가로 지키는 규칙·패턴·컴포넌트를 여기에 적습니다.
142
+ > (예: 앱 전용 레이아웃, 라우팅 래퍼, 도메인 위젯, 색/간격 추가 규칙 등)
143
+
144
+ - (여기에 작성)
145
+ `;
146
+ }
147
+
148
+ function getSyncCommand(args) {
149
+ const parts = [];
150
+ if (args.out !== DEFAULT_OUT) parts.push("--out", args.out);
151
+ if (args.designDoc !== DEFAULT_DESIGN_DOC) parts.push("--design-doc", args.designDoc);
152
+ if (!args.scaffold) parts.push("--no-scaffold");
153
+ const suffix = parts.map((part) => (/\s/.test(part) ? JSON.stringify(part) : part)).join(" ");
154
+ return suffix ? `${SYNC_COMMAND} ${suffix}` : SYNC_COMMAND;
155
+ }
156
+
157
+ function readPackageJson(packageJsonPath) {
158
+ try {
159
+ return JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
160
+ } catch (error) {
161
+ fail(`package.json을 읽을 수 없습니다: ${packageJsonPath}\n ${error.message}`);
162
+ }
163
+ }
164
+
165
+ function writePackageJson(packageJsonPath, pkg) {
166
+ fs.writeFileSync(packageJsonPath, `${JSON.stringify(pkg, null, 2)}\n`);
167
+ }
168
+
169
+ function commandIncludesSync(command) {
170
+ return typeof command === "string" && command.includes(SYNC_COMMAND);
171
+ }
172
+
173
+ function installPackageScripts(args) {
174
+ const packageJsonPath = path.resolve(process.cwd(), "package.json");
175
+ if (!fs.existsSync(packageJsonPath)) {
176
+ fail("--postinstall을 사용하려면 소비처 루트에 package.json이 있어야 합니다.");
177
+ }
178
+
179
+ const pkg = readPackageJson(packageJsonPath);
180
+ const scripts = pkg.scripts && typeof pkg.scripts === "object" ? pkg.scripts : {};
181
+ pkg.scripts = scripts;
182
+
183
+ const syncCommand = getSyncCommand(args);
184
+ let changed = false;
185
+
186
+ if (!scripts["docs:ds"]) {
187
+ scripts["docs:ds"] = syncCommand;
188
+ changed = true;
189
+ console.log(` package.json: scripts.docs:ds 추가 (${syncCommand})`);
190
+ } else {
191
+ console.log(" package.json: scripts.docs:ds 이미 존재 — 보존");
192
+ }
193
+
194
+ if (!scripts.postinstall) {
195
+ scripts.postinstall = syncCommand;
196
+ changed = true;
197
+ console.log(` package.json: scripts.postinstall 추가 (${syncCommand})`);
198
+ } else if (commandIncludesSync(scripts.postinstall)) {
199
+ console.log(" package.json: scripts.postinstall 이미 DS sync 포함 — 보존");
200
+ } else {
201
+ scripts.postinstall = `${scripts.postinstall} && ${syncCommand}`;
202
+ changed = true;
203
+ console.log(" package.json: scripts.postinstall에 DS sync 추가");
204
+ }
205
+
206
+ if (changed) {
207
+ writePackageJson(packageJsonPath, pkg);
208
+ } else {
209
+ console.log(" package.json: 변경 없음");
210
+ }
211
+ }
212
+
213
+ function sync(args) {
214
+ if (!fs.existsSync(SRC_DOCS)) {
215
+ fail(
216
+ `boottent-design 문서를 찾을 수 없습니다: ${SRC_DOCS}\n` +
217
+ ` 설치된 boottent-design 버전이 문서 자동 생성을 지원하는지 확인하세요. (로컬 file: 링크라면 'yarn build' 후 재시도)`,
218
+ );
219
+ }
220
+
221
+ const version = getPkgVersion();
222
+ const generatedAt = new Date().toLocaleString("ko-KR");
223
+ const absOut = path.resolve(process.cwd(), args.out);
224
+
225
+ const count = mirrorDocs(SRC_DOCS, absOut);
226
+ const outRel = normalizeRelPath(path.relative(process.cwd(), absOut) || ".");
227
+
228
+ console.log(`✓ boottent-design v${version} 문서 동기화 완료`);
229
+ console.log(` 미러: ${outRel}/ (${count} files)`);
230
+
231
+ // design.md scaffold (없을 때만)
232
+ if (args.scaffold) {
233
+ const absDesign = path.resolve(process.cwd(), args.designDoc);
234
+ if (fs.existsSync(absDesign)) {
235
+ console.log(
236
+ ` design.md: 이미 존재 — 건너뜀 (${normalizeRelPath(path.relative(process.cwd(), absDesign))})`,
237
+ );
238
+ } else {
239
+ fs.mkdirSync(path.dirname(absDesign), { recursive: true });
240
+ // design.md 위치에서 미러 디렉터리로 가는 상대경로
241
+ const relToOut = path.posix.relative(
242
+ path.dirname(absDesign).split(path.sep).join("/"),
243
+ absOut.split(path.sep).join("/"),
244
+ );
245
+ fs.writeFileSync(absDesign, designDocTemplate(version, relToOut || ".", generatedAt));
246
+ console.log(` design.md: 생성 (${normalizeRelPath(path.relative(process.cwd(), absDesign))})`);
247
+ }
248
+ }
249
+ }
250
+
251
+ function init(args) {
252
+ sync(args);
253
+
254
+ if (args.postinstall) {
255
+ installPackageScripts(args);
256
+ } else {
257
+ console.log(" package.json: --postinstall 미지정 — 자동 sync 스크립트 추가 안 함");
258
+ console.log(" 자동 sync가 필요하면 다시 실행: boottent-design-docs init --postinstall");
259
+ }
260
+ }
261
+
262
+ function main() {
263
+ const args = parseArgs(process.argv.slice(2));
264
+
265
+ if (args.help || !args.command) {
266
+ printHelp();
267
+ process.exit(args.help ? 0 : 1);
268
+ }
269
+
270
+ if (args.command === "sync") {
271
+ sync(args);
272
+ return;
273
+ }
274
+
275
+ if (args.command === "init") {
276
+ init(args);
277
+ return;
278
+ }
279
+
280
+ console.error(`알 수 없는 명령: ${args.command}\n`);
281
+ printHelp();
282
+ process.exit(1);
283
+ }
284
+
285
+ main();
@@ -0,0 +1 @@
1
+ "use strict";const e=require("react/jsx-runtime"),i=require("./index-DKCqkplO.cjs");require("./ui/accordion.cjs.js");require("./ui/alert-dialog.cjs.js");require("@radix-ui/react-aspect-ratio");require("./ui/avatar.cjs.js");require("./ui/badge.cjs.js");require("./ui/button.cjs.js");require("./ui/calendar.cjs.js");require("./ui/callout.cjs.js");require("./ui/card.cjs.js");require("./ui/checkbox.cjs.js");require("lucide-react");require("./ui/command.cjs.js");require("./ui/dialog.cjs.js");require("./ui/dropdown-menu.cjs.js");require("./ui/file-uploader.cjs.js");require("./ui/form.cjs.js");const q=require("./ui/icons.cjs.js");require("./ui/input.cjs.js");require("./ui/label.cjs.js");require("./ui/month-picker.cjs.js");require("./ui/multi-select.cjs.js");require("./ui/navigation-menu.cjs.js");require("./ui/popover.cjs.js");require("./ui/progress.cjs.js");require("./ui/radio-group.cjs.js");require("./ui/scroll-area.cjs.js");require("./ui/select.cjs.js");require("./ui/separator.cjs.js");require("@radix-ui/react-slider");require("react");require("./ui/switch.cjs.js");require("./ui/tabs.cjs.js");require("./ui/tag.cjs.js");require("./ui/text.cjs.js");require("./ui/textarea.cjs.js");require("./ui/toast.cjs.js");require("./ui/toggle.cjs.js");require("./ui/toggle-group.cjs.js");require("./ui/tooltip.cjs.js");const m=require("./image-loading-DZFBFoVv.cjs"),b={bootcamp:{text:"부트캠프",color:i.colors.main[600],background:i.colors.main[50]},job:{text:"취업꿀팁",color:i.colors.brown[500],background:i.colors.brown[50]},study:{text:"개념정리",color:i.colors.lime[500],background:i.colors.lime[50]},insight:{text:"인사이트",color:i.colors.blue[500],background:i.colors.blue[50]},webtoon:{text:"개발자툰",color:i.colors.pink[500],background:i.colors.pink[50]}};function u({children:r,backgroundColor:l,color:o}){return e.jsx("div",{style:{backgroundColor:l,color:o},className:"whitespace-nowrap break-keep rounded bg-grey-100 px-2 py-0.5 text-regular13 text-grey-600 xs:text-regular14",children:r})}function f({article:r,isYoutube:l=!1,imagePriority:o,imageLoading:c,imageFetchPriority:n,imageDecoding:d}){const s=r.category?b[r.category]:void 0,t=!s&&r.tags?r.tags.slice(0,3):[],x=m.getImageLoadingAttributes({imagePriority:o,imageLoading:c,imageFetchPriority:n,imageDecoding:d});return e.jsx("div",{className:"bt-ds-surface bt-ds-radius-10 h-full w-full max-w-[320px] list-none overflow-hidden rounded-[10px] border border-grey-200 bg-background","data-asset-id":r.assetId,children:e.jsxs("div",{className:"flex h-full w-full flex-col",children:[e.jsxs("div",{className:"relative w-full shrink-0 overflow-hidden",children:[e.jsx("img",{src:r.imageUrl,alt:"image",className:"aspect-video w-full object-cover",...x}),l&&e.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-white/30",children:e.jsx(q.Icon.Play,{size:"40"})})]}),e.jsxs("div",{className:"flex flex-col items-start gap-2 p-4",children:[s?e.jsx(u,{backgroundColor:s.background||"",color:s.color||"",children:s.text}):t.length>0?e.jsx("div",{className:"flex flex-wrap items-start gap-1",children:t.map((a,g)=>e.jsx(u,{children:a},`${a}-${g}`))}):null,e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("p",{className:"line-clamp-2 text-semibold14 xs:text-semibold16",children:r.title}),e.jsx("p",{className:"line-clamp-3 text-regular13 text-grey-500 xs:text-regular14",children:r.description})]})]})]})})}exports.ArticleAssetCard=f;
@@ -23,6 +23,7 @@ import "./ui/month-picker.es.js";
23
23
  import "./ui/multi-select.es.js";
24
24
  import "./ui/navigation-menu.es.js";
25
25
  import "./ui/popover.es.js";
26
+ import "./ui/progress.es.js";
26
27
  import "./ui/radio-group.es.js";
27
28
  import "./ui/scroll-area.es.js";
28
29
  import "./ui/select.es.js";
@@ -56,7 +57,7 @@ function p({ children: t, backgroundColor: l, color: a }) {
56
57
  }
57
58
  );
58
59
  }
59
- function lt({
60
+ function at({
60
61
  article: t,
61
62
  isYoutube: l = !1,
62
63
  imagePriority: a,
@@ -92,5 +93,5 @@ function lt({
92
93
  );
93
94
  }
94
95
  export {
95
- lt as A
96
+ at as A
96
97
  };
@@ -0,0 +1 @@
1
+ "use strict";const e=require("react/jsx-runtime");require("./ui/accordion.cjs.js");require("./ui/alert-dialog.cjs.js");const m=require("./common-Ds1lanOg.cjs");require("@radix-ui/react-aspect-ratio");require("./ui/avatar.cjs.js");require("./ui/badge.cjs.js");require("./ui/button.cjs.js");require("./ui/calendar.cjs.js");require("./ui/callout.cjs.js");require("./ui/card.cjs.js");require("./ui/checkbox.cjs.js");require("lucide-react");require("./ui/command.cjs.js");require("./ui/dialog.cjs.js");require("./ui/dropdown-menu.cjs.js");require("./ui/file-uploader.cjs.js");require("./ui/form.cjs.js");require("./ui/input.cjs.js");require("./ui/label.cjs.js");require("./ui/month-picker.cjs.js");require("./ui/multi-select.cjs.js");require("./ui/navigation-menu.cjs.js");require("./ui/popover.cjs.js");require("./ui/progress.cjs.js");require("./ui/radio-group.cjs.js");require("./ui/scroll-area.cjs.js");require("./ui/select.cjs.js");require("./ui/separator.cjs.js");require("@radix-ui/react-slider");require("react");require("./ui/switch.cjs.js");require("./ui/tabs.cjs.js");const O=require("./ui/tag.cjs.js");require("./ui/text.cjs.js");require("./ui/textarea.cjs.js");require("./ui/toast.cjs.js");require("./ui/toggle.cjs.js");require("./ui/toggle-group.cjs.js");require("./ui/tooltip.cjs.js");const P=require("./image-loading-DZFBFoVv.cjs"),s=require("./camp-card-format-rjZZu4G6.cjs");function Q({tag:r}){return e.jsx("li",{className:"rounded",children:e.jsx("div",{style:{color:r.color,backgroundColor:r.background,border:`1px solid ${r.border??"transparent"}`},className:m.cn("inline-block whitespace-nowrap rounded px-1 py-0.5 text-regular13",r.className),children:r.text})})}function x(r,i="sm"){return e.jsx(O.Tag,{style:{background:r.background,color:r.color,border:`1px solid ${r.border??r.background??"transparent"}`},size:i,variant:i==="ad"?"ad":void 0,className:r.className,children:r.text})}function V({brandName:r,title:i,batchName:f="",imageUrl:a,imageAlt:q="header image",tuitionText:h,locationText:p,scheduleText:v,startDate:w,endDate:g,period:j,tuition:b,earlyBirdTuition:N,earlyBirdEndDate:C,isFree:y,onoffText:k,cityLabels:T,costOptionText:L,tags:t=[],statusBadge:n,adBadge:o,adTitle:u,isAd:$=!1,className:S,style:A,bookmarkSlot:B,latestBatchSlot:D,imageOverlaySlot:E,imageWrapper:c,imagePriority:F,imageLoading:I,imageFetchPriority:R,imageDecoding:_}){const z=P.getImageLoadingAttributes({imagePriority:F,imageLoading:I,imageFetchPriority:R,imageDecoding:_}),G=`${i} ${f||""}`.trim(),H=h??L??s.formatCampCardTuitionText({tuition:b??void 0,isFree:y,earlyBirdTuition:N??void 0,earlyBirdEndDate:C??void 0}),J=p??s.formatCampCardLocationText({onoffText:k,cityLabels:T,format:"desktop"}),K=v??s.formatCampCardScheduleText({startDate:w,endDate:g,period:j}),l=a?e.jsx("button",{type:"button",className:"absolute inset-0",children:e.jsx("img",{src:a,alt:q,className:"h-full w-full object-cover transition-all hover:scale-110",...z})}):null;return e.jsxs("div",{className:m.cn("bt-ds-surface bt-ds-text-reset relative flex h-full w-full flex-col overflow-hidden rounded-lg border border-grey-200 bg-white",S),style:A,children:[e.jsxs("div",{className:"relative aspect-[9/5] w-full shrink-0",children:[e.jsxs("div",{className:"absolute inset-0 z-0 flex items-center justify-center overflow-hidden",children:[l?c?c(l):l:null,E,e.jsxs("div",{className:"absolute bottom-2 right-2 flex flex-col items-end gap-1",children:[n?x(n,"sm"):null,D]})]}),o?x(o,"ad"):null,B]}),e.jsxs("div",{className:"flex flex-col gap-2 p-4 text-regular14",children:[e.jsx("div",{children:r}),e.jsxs("div",{className:"flex w-full flex-col gap-3",children:[e.jsx("div",{className:"line-clamp-3 w-full text-semibold16 font-medium",children:G}),$&&u?e.jsx("div",{className:"line-clamp-2 break-keep rounded-md bg-yellow-400/50 px-2 py-1 text-grey-800",children:u}):null,t.length>0?e.jsx("ul",{className:"flex w-full max-w-full shrink-0 grow-0 flex-wrap justify-start gap-[5px] overflow-x-hidden whitespace-normal",children:t.map((d,M)=>e.jsx(Q,{tag:d},`${String(d.text)}-${M}`))}):null]}),e.jsxs("div",{className:"flex w-full flex-col gap-2 text-regular13",children:[e.jsxs("p",{className:"w-full overflow-hidden truncate whitespace-nowrap",children:[e.jsx("span",{children:H})," · ",e.jsx("span",{children:J})]}),e.jsx("p",{className:"w-full overflow-hidden truncate whitespace-nowrap",children:K})]})]})]})}exports.CampCard=V;
@@ -22,6 +22,7 @@ import "./ui/month-picker.es.js";
22
22
  import "./ui/multi-select.es.js";
23
23
  import "./ui/navigation-menu.es.js";
24
24
  import "./ui/popover.es.js";
25
+ import "./ui/progress.es.js";
25
26
  import "./ui/radio-group.es.js";
26
27
  import "./ui/scroll-area.es.js";
27
28
  import "./ui/select.es.js";
@@ -69,7 +70,7 @@ function p(e, o = "sm") {
69
70
  }
70
71
  );
71
72
  }
72
- function Ge({
73
+ function He({
73
74
  brandName: e,
74
75
  title: o,
75
76
  batchName: f = "",
@@ -173,5 +174,5 @@ function Ge({
173
174
  );
174
175
  }
175
176
  export {
176
- Ge as C
177
+ He as C
177
178
  };
@@ -0,0 +1 @@
1
+ "use strict";const e=require("react/jsx-runtime");require("./ui/accordion.cjs.js");require("./ui/alert-dialog.cjs.js");const q=require("./common-Ds1lanOg.cjs");require("@radix-ui/react-aspect-ratio");require("./ui/avatar.cjs.js");require("./ui/badge.cjs.js");const h=require("./ui/button.cjs.js");require("./ui/calendar.cjs.js");const x=require("./ui/callout.cjs.js");require("./ui/card.cjs.js");require("./ui/checkbox.cjs.js");require("lucide-react");require("./ui/command.cjs.js");require("./ui/dialog.cjs.js");require("./ui/dropdown-menu.cjs.js");require("./ui/file-uploader.cjs.js");require("./ui/form.cjs.js");require("./ui/input.cjs.js");require("./ui/label.cjs.js");require("./ui/month-picker.cjs.js");require("./ui/multi-select.cjs.js");require("./ui/navigation-menu.cjs.js");require("./ui/popover.cjs.js");require("./ui/progress.cjs.js");require("./ui/radio-group.cjs.js");require("./ui/scroll-area.cjs.js");require("./ui/select.cjs.js");require("./ui/separator.cjs.js");require("@radix-ui/react-slider");require("react");require("./ui/switch.cjs.js");require("./ui/tabs.cjs.js");require("./ui/tag.cjs.js");const a=require("./ui/text.cjs.js");require("./ui/textarea.cjs.js");require("./ui/toast.cjs.js");require("./ui/toggle.cjs.js");require("./ui/toggle-group.cjs.js");require("./ui/tooltip.cjs.js");const f=require("./image-loading-DZFBFoVv.cjs");function g({intro:i,roleText:s="운영",descriptionId:t,imagePriority:n,imageLoading:u,imageFetchPriority:l,imageDecoding:c}){const{introductionData:r,companyId:o}=i;if(!r)return null;const d=t??`company-info-${o}`,m=f.getImageLoadingAttributes({imagePriority:n,imageLoading:u,imageFetchPriority:l,imageDecoding:c});return e.jsxs(x.Callout.Outline,{size:"lg",className:"bt-ds-surface bt-ds-radius-12 flex max-h-44 min-h-24 w-full max-w-[975px] shrink-0 items-stretch justify-between gap-4 bg-background md:gap-5 xl:max-w-[815px]",children:[e.jsxs("span",{id:d,className:"sr-only",children:[i.companyName,"은(는) 본 부트캠프의 ",s,"사로, 상세 소개 페이지로 이동할 수 있다."]}),e.jsx("div",{className:"bt-ds-surface bt-ds-surface-white bt-ds-radius-full flex aspect-square w-16 shrink-0 items-center justify-center self-start overflow-hidden rounded-full border border-grey-200 bg-white",children:e.jsx("img",{src:r.logo,alt:`${i.companyName} 로고`,width:100,height:100,className:"object-contain",...m})}),e.jsx("div",{className:"min-h-0 flex-1 self-stretch",children:e.jsxs("div",{className:"flex h-full min-h-0 flex-col items-start gap-1 overflow-y-auto pr-1",children:[e.jsxs("div",{className:"flex w-full shrink-0 items-center gap-[5px]",children:[e.jsx(a.Text,{className:"line-clamp-1 font-semibold",children:r.companyName}),e.jsx("span",{"aria-label":"회사 역할",children:s})]}),e.jsx(a.Text,{className:"whitespace-pre-wrap text-start text-grey-600",children:r.title})]})}),e.jsx("span",{className:q.cn(h.buttonVariants({variant:"outline",theme:"secondary"}),"hidden self-center md:inline-flex"),"aria-hidden":"true",children:"자세히 보기"})]})}exports.CompanyInfoCard=g;
@@ -22,6 +22,7 @@ import "./ui/month-picker.es.js";
22
22
  import "./ui/multi-select.es.js";
23
23
  import "./ui/navigation-menu.es.js";
24
24
  import "./ui/popover.es.js";
25
+ import "./ui/progress.es.js";
25
26
  import "./ui/radio-group.es.js";
26
27
  import "./ui/scroll-area.es.js";
27
28
  import "./ui/select.es.js";
@@ -38,7 +39,7 @@ import "./ui/toggle.es.js";
38
39
  import "./ui/toggle-group.es.js";
39
40
  import "./ui/tooltip.es.js";
40
41
  import { g as x } from "./image-loading-BX5rKZfC.js";
41
- function mt({
42
+ function ot({
42
43
  intro: e,
43
44
  roleText: m = "운영",
44
45
  descriptionId: a,
@@ -98,5 +99,5 @@ function mt({
98
99
  );
99
100
  }
100
101
  export {
101
- mt as C
102
+ ot as C
102
103
  };
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../article-asset-card-CM_WiHYI.cjs");exports.ArticleAssetCard=e.ArticleAssetCard;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../article-asset-card-CGSemovn.cjs");exports.ArticleAssetCard=e.ArticleAssetCard;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { A as s } from "../article-asset-card-lw8aNjSM.js";
2
+ import { A as s } from "../article-asset-card-D1Ipe86b.js";
3
3
  export {
4
4
  s as ArticleAssetCard
5
5
  };
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("../camp-card-Dr0h_TPh.cjs"),a=require("../camp-card-format-rjZZu4G6.cjs");exports.CampCard=t.CampCard;exports.formatCampCardDateText=a.formatCampCardDateText;exports.formatCampCardLocationText=a.formatCampCardLocationText;exports.formatCampCardPeriodText=a.formatCampCardPeriodText;exports.formatCampCardScheduleText=a.formatCampCardScheduleText;exports.formatCampCardTuitionText=a.formatCampCardTuitionText;exports.formatTuitionAmountText=a.formatTuitionAmountText;exports.isEarlyBirdApplied=a.isEarlyBirdApplied;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("../camp-card-BRs3koNF.cjs"),a=require("../camp-card-format-rjZZu4G6.cjs");exports.CampCard=t.CampCard;exports.formatCampCardDateText=a.formatCampCardDateText;exports.formatCampCardLocationText=a.formatCampCardLocationText;exports.formatCampCardPeriodText=a.formatCampCardPeriodText;exports.formatCampCardScheduleText=a.formatCampCardScheduleText;exports.formatCampCardTuitionText=a.formatCampCardTuitionText;exports.formatTuitionAmountText=a.formatTuitionAmountText;exports.isEarlyBirdApplied=a.isEarlyBirdApplied;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { C as r } from "../camp-card-7lzkmQep.js";
2
+ import { C as r } from "../camp-card-Bi7Li0p5.js";
3
3
  import { f as o, a as m, b as C, c as d, d as i, e as p, i as s } from "../camp-card-format-QrakDFC6.js";
4
4
  export {
5
5
  r as CampCard,
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../company-info-card-H1BDbRoL.cjs");exports.CompanyInfoCard=e.CompanyInfoCard;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../company-info-card-C00gMHAv.cjs");exports.CompanyInfoCard=e.CompanyInfoCard;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { C as e } from "../company-info-card-BVCaYbYN.js";
2
+ import { C as e } from "../company-info-card-D1U_poOk.js";
3
3
  export {
4
4
  e as CompanyInfoCard
5
5
  };
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../event-card-B7TYQ2do.cjs");exports.EventCard=e.EventCard;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../event-card-DebLbRKd.cjs");exports.EventCard=e.EventCard;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { E as t } from "../event-card-DoePuHu8.js";
2
+ import { E as t } from "../event-card-C1mSACOR.js";
3
3
  export {
4
4
  t as EventCard
5
5
  };
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../lecturer-card-CGPXVDdx.cjs");exports.LecturerCard=e.LecturerCard;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../lecturer-card-CgSWLJ8r.cjs");exports.LecturerCard=e.LecturerCard;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { L as t } from "../lecturer-card-B80BJVu3.js";
2
+ import { L as t } from "../lecturer-card-BlzA-YP6.js";
3
3
  export {
4
4
  t as LecturerCard
5
5
  };
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../main-banner-image-DdV4qseq.cjs");exports.MainBannerImage=e.MainBannerImage;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../main-banner-image-Bh3AZqac.cjs");exports.MainBannerImage=e.MainBannerImage;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { M as n } from "../main-banner-image-DoYpMy7T.js";
2
+ import { M as n } from "../main-banner-image-BRLhiQJZ.js";
3
3
  export {
4
4
  n as MainBannerImage
5
5
  };
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../mobile-camp-card-DJPf2Efp.cjs");exports.MobileCampCard=e.MobileCampCard;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../mobile-camp-card-B4L0Eq0v.cjs");exports.MobileCampCard=e.MobileCampCard;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { M as o } from "../mobile-camp-card-S0gvQ6bD.js";
2
+ import { M as o } from "../mobile-camp-card-B8rTQeTh.js";
3
3
  export {
4
4
  o as MobileCampCard
5
5
  };
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("../portfolio-asset-card-BlgNFtHc.cjs");exports.PortfolioAssetCard=o.PortfolioAssetCard;exports.PortfolioAssetFooter=o.PortfolioAssetFooter;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("../portfolio-asset-card-BdS7kkkT.cjs");exports.PortfolioAssetCard=o.PortfolioAssetCard;exports.PortfolioAssetFooter=o.PortfolioAssetFooter;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { P as t, a as e } from "../portfolio-asset-card-C_opxeH0.js";
2
+ import { P as t, a as e } from "../portfolio-asset-card-DEMARh53.js";
3
3
  export {
4
4
  t as PortfolioAssetCard,
5
5
  e as PortfolioAssetFooter
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../premium-card-Diea6qG_.cjs");exports.PremiumCard=e.PremiumCard;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../premium-card-1vtWPIUr.cjs");exports.PremiumCard=e.PremiumCard;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { P as m } from "../premium-card-BzFA2A5p.js";
2
+ import { P as m } from "../premium-card-CFQKDWqN.js";
3
3
  export {
4
4
  m as PremiumCard
5
5
  };
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../title-tag-card-Cn0V-8Ga.cjs");exports.TitleTagCard=e.TitleTagCard;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../title-tag-card-MFpE2-Nb.cjs");exports.TitleTagCard=e.TitleTagCard;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { T as r } from "../title-tag-card-CEjHX43m.js";
2
+ import { T as r } from "../title-tag-card-Iowzns_v.js";
3
3
  export {
4
4
  r as TitleTagCard
5
5
  };
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../youtube-video-modal-pooOcDO1.cjs");exports.YoutubeVideoModal=e.YoutubeVideoModal;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../youtube-video-modal-C4a0lovb.cjs");exports.YoutubeVideoModal=e.YoutubeVideoModal;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { Y as t } from "../youtube-video-modal-CENnr9lf.js";
2
+ import { Y as t } from "../youtube-video-modal-B_vy97Tt.js";
3
3
  export {
4
4
  t as YoutubeVideoModal
5
5
  };
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./event-card-B7TYQ2do.cjs"),a=require("./main-banner-image-DdV4qseq.cjs"),o=require("./premium-card-Diea6qG_.cjs"),i=require("./title-tag-card-Cn0V-8Ga.cjs"),n=require("./article-asset-card-CM_WiHYI.cjs"),C=require("./blog-review-card-OX6KhSpS.cjs"),d=require("./camp-card-Dr0h_TPh.cjs"),e=require("./camp-card-format-rjZZu4G6.cjs"),s=require("./company-info-card-H1BDbRoL.cjs"),m=require("./environment-asset-photo-CXxtAAax.cjs"),u=require("./event-asset-banner-BRsgu3Hc.cjs"),c=require("./lecturer-card-CGPXVDdx.cjs"),l=require("./partner-list-card-DL_omz4v.cjs"),p=require("./mobile-camp-card-DJPf2Efp.cjs"),r=require("./portfolio-asset-card-BlgNFtHc.cjs"),T=require("./youtube-video-modal-pooOcDO1.cjs");exports.EventCard=t.EventCard;exports.MainBannerImage=a.MainBannerImage;exports.PremiumCard=o.PremiumCard;exports.TitleTagCard=i.TitleTagCard;exports.ArticleAssetCard=n.ArticleAssetCard;exports.BlogReviewCard=C.BlogReviewCard;exports.CampCard=d.CampCard;exports.formatCampCardDateText=e.formatCampCardDateText;exports.formatCampCardLocationText=e.formatCampCardLocationText;exports.formatCampCardPeriodText=e.formatCampCardPeriodText;exports.formatCampCardScheduleText=e.formatCampCardScheduleText;exports.formatCampCardTuitionText=e.formatCampCardTuitionText;exports.formatTuitionAmountText=e.formatTuitionAmountText;exports.isEarlyBirdApplied=e.isEarlyBirdApplied;exports.CompanyInfoCard=s.CompanyInfoCard;exports.EnvironmentAssetPhoto=m.EnvironmentAssetPhoto;exports.EventAssetBanner=u.EventAssetBanner;exports.LecturerCard=c.LecturerCard;exports.PartnerListCard=l.PartnerListCard;exports.MobileCampCard=p.MobileCampCard;exports.PortfolioAssetCard=r.PortfolioAssetCard;exports.PortfolioAssetFooter=r.PortfolioAssetFooter;exports.YoutubeVideoModal=T.YoutubeVideoModal;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./event-card-DebLbRKd.cjs"),a=require("./main-banner-image-Bh3AZqac.cjs"),o=require("./premium-card-1vtWPIUr.cjs"),i=require("./title-tag-card-MFpE2-Nb.cjs"),n=require("./article-asset-card-CGSemovn.cjs"),C=require("./blog-review-card-OX6KhSpS.cjs"),d=require("./camp-card-BRs3koNF.cjs"),e=require("./camp-card-format-rjZZu4G6.cjs"),s=require("./company-info-card-C00gMHAv.cjs"),m=require("./environment-asset-photo-CXxtAAax.cjs"),u=require("./event-asset-banner-BRsgu3Hc.cjs"),c=require("./lecturer-card-CgSWLJ8r.cjs"),l=require("./partner-list-card-DL_omz4v.cjs"),p=require("./mobile-camp-card-B4L0Eq0v.cjs"),r=require("./portfolio-asset-card-BdS7kkkT.cjs"),T=require("./youtube-video-modal-C4a0lovb.cjs");exports.EventCard=t.EventCard;exports.MainBannerImage=a.MainBannerImage;exports.PremiumCard=o.PremiumCard;exports.TitleTagCard=i.TitleTagCard;exports.ArticleAssetCard=n.ArticleAssetCard;exports.BlogReviewCard=C.BlogReviewCard;exports.CampCard=d.CampCard;exports.formatCampCardDateText=e.formatCampCardDateText;exports.formatCampCardLocationText=e.formatCampCardLocationText;exports.formatCampCardPeriodText=e.formatCampCardPeriodText;exports.formatCampCardScheduleText=e.formatCampCardScheduleText;exports.formatCampCardTuitionText=e.formatCampCardTuitionText;exports.formatTuitionAmountText=e.formatTuitionAmountText;exports.isEarlyBirdApplied=e.isEarlyBirdApplied;exports.CompanyInfoCard=s.CompanyInfoCard;exports.EnvironmentAssetPhoto=m.EnvironmentAssetPhoto;exports.EventAssetBanner=u.EventAssetBanner;exports.LecturerCard=c.LecturerCard;exports.PartnerListCard=l.PartnerListCard;exports.MobileCampCard=p.MobileCampCard;exports.PortfolioAssetCard=r.PortfolioAssetCard;exports.PortfolioAssetFooter=r.PortfolioAssetFooter;exports.YoutubeVideoModal=T.YoutubeVideoModal;