boottent-design 0.1.258 → 0.1.260

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 (251) hide show
  1. package/README.md +10 -1
  2. package/bin/sync-docs.mjs +112 -6
  3. package/dist/article-asset-card-DGa_XWK1.js +96 -0
  4. package/dist/article-asset-card-DRRl2BH8.cjs +1 -0
  5. package/dist/camp-card-DM2V71SW.cjs +1 -0
  6. package/dist/{camp-card-Bi7Li0p5.js → camp-card-nUdSAdXo.js} +70 -59
  7. package/dist/common-DeneXo5X.cjs +1 -0
  8. package/dist/common-zQ5XY0UN.js +11 -0
  9. package/dist/company-info-card-BXAempVI.cjs +1 -0
  10. package/dist/{company-info-card-D1U_poOk.js → company-info-card-DJTgItPu.js} +4 -3
  11. package/dist/components/article-asset-card.cjs.js +1 -1
  12. package/dist/components/article-asset-card.es.js +1 -1
  13. package/dist/components/camp-card.cjs.js +1 -1
  14. package/dist/components/camp-card.es.js +1 -1
  15. package/dist/components/company-info-card.cjs.js +1 -1
  16. package/dist/components/company-info-card.es.js +1 -1
  17. package/dist/components/dday-card.cjs.js +1 -0
  18. package/dist/components/dday-card.es.js +5 -0
  19. package/dist/components/event-asset-banner.cjs.js +1 -1
  20. package/dist/components/event-asset-banner.es.js +1 -1
  21. package/dist/components/event-card.cjs.js +1 -1
  22. package/dist/components/event-card.es.js +1 -1
  23. package/dist/components/lecturer-card.cjs.js +1 -1
  24. package/dist/components/lecturer-card.es.js +1 -1
  25. package/dist/components/main-banner-image.cjs.js +1 -1
  26. package/dist/components/main-banner-image.es.js +1 -1
  27. package/dist/components/mobile-camp-card.cjs.js +1 -1
  28. package/dist/components/mobile-camp-card.es.js +1 -1
  29. package/dist/components/portfolio-asset-card.cjs.js +1 -1
  30. package/dist/components/portfolio-asset-card.es.js +1 -1
  31. package/dist/components/premium-card.cjs.js +1 -1
  32. package/dist/components/premium-card.es.js +1 -1
  33. package/dist/components/title-tag-card.cjs.js +1 -1
  34. package/dist/components/title-tag-card.es.js +1 -1
  35. package/dist/components/youtube-video-modal.cjs.js +1 -1
  36. package/dist/components/youtube-video-modal.es.js +1 -1
  37. package/dist/components.cjs.js +1 -1
  38. package/dist/components.es.js +41 -39
  39. package/dist/dday-card-Diku8WyO.cjs +1 -0
  40. package/dist/dday-card-HrnKCR_0.js +140 -0
  41. package/dist/design-system/components/article-asset-card.md +1 -1
  42. package/dist/design-system/components/blog-review-card.md +1 -1
  43. package/dist/design-system/components/camp-card.md +1 -1
  44. package/dist/design-system/components/company-info-card.md +1 -1
  45. package/dist/design-system/components/dday-card.md +47 -0
  46. package/dist/design-system/components/environment-asset-photo.md +1 -1
  47. package/dist/design-system/components/event-asset-banner.md +1 -1
  48. package/dist/design-system/components/event-card.md +1 -3
  49. package/dist/design-system/components/lecturer-card.md +1 -1
  50. package/dist/design-system/components/main-banner-image.md +1 -1
  51. package/dist/design-system/components/mobile-camp-card.md +1 -1
  52. package/dist/design-system/components/partner-list-card.md +1 -1
  53. package/dist/design-system/components/portfolio-asset-card.md +1 -1
  54. package/dist/design-system/components/premium-card.md +1 -1
  55. package/dist/design-system/components/title-tag-card.md +2 -2
  56. package/dist/design-system/components/youtube-video-modal.md +1 -1
  57. package/dist/design-system/design-system.md +7 -6
  58. package/dist/design-system/tokens.md +1 -1
  59. package/dist/design-system/ui/accordion.md +1 -1
  60. package/dist/design-system/ui/alert-dialog.md +1 -1
  61. package/dist/design-system/ui/anchor.md +1 -1
  62. package/dist/design-system/ui/aspect-ratio.md +1 -1
  63. package/dist/design-system/ui/avatar.md +1 -1
  64. package/dist/design-system/ui/badge.md +1 -1
  65. package/dist/design-system/ui/button.md +1 -1
  66. package/dist/design-system/ui/calendar.md +1 -1
  67. package/dist/design-system/ui/callout.md +1 -1
  68. package/dist/design-system/ui/card-label.md +56 -0
  69. package/dist/design-system/ui/card.md +1 -1
  70. package/dist/design-system/ui/checkbox.md +1 -1
  71. package/dist/design-system/ui/circled-check-button.md +1 -1
  72. package/dist/design-system/ui/command.md +1 -1
  73. package/dist/design-system/ui/dialog.md +1 -1
  74. package/dist/design-system/ui/dropdown-menu.md +1 -1
  75. package/dist/design-system/ui/file-uploader.md +1 -1
  76. package/dist/design-system/ui/form.md +1 -1
  77. package/dist/design-system/ui/highlight-text.md +1 -1
  78. package/dist/design-system/ui/icons.md +1 -1
  79. package/dist/design-system/ui/image.md +1 -1
  80. package/dist/design-system/ui/input.md +1 -1
  81. package/dist/design-system/ui/label.md +1 -1
  82. package/dist/design-system/ui/month-picker.md +1 -1
  83. package/dist/design-system/ui/multi-select.md +1 -1
  84. package/dist/design-system/ui/navigation-menu.md +1 -1
  85. package/dist/design-system/ui/popover.md +1 -1
  86. package/dist/design-system/ui/progress.md +1 -1
  87. package/dist/design-system/ui/radio-group.md +1 -1
  88. package/dist/design-system/ui/scroll-area.md +1 -1
  89. package/dist/design-system/ui/select.md +1 -1
  90. package/dist/design-system/ui/separator.md +1 -1
  91. package/dist/design-system/ui/simple-table.md +1 -1
  92. package/dist/design-system/ui/skeleton.md +1 -1
  93. package/dist/design-system/ui/slider.md +1 -1
  94. package/dist/design-system/ui/switch.md +1 -1
  95. package/dist/design-system/ui/symbols.md +1 -1
  96. package/dist/design-system/ui/tabs.md +1 -1
  97. package/dist/design-system/ui/tag.md +6 -4
  98. package/dist/design-system/ui/text.md +1 -1
  99. package/dist/design-system/ui/textarea.md +1 -1
  100. package/dist/design-system/ui/toast.md +1 -1
  101. package/dist/design-system/ui/toggle-group.md +2 -2
  102. package/dist/design-system/ui/toggle.md +1 -1
  103. package/dist/design-system/ui/tooltip.md +1 -1
  104. package/dist/design-system/usage.md +1 -1
  105. package/dist/design-system/when-to-use.md +3 -1
  106. package/dist/{event-asset-banner-CbhdfmpK.js → event-asset-banner-BW6nZaJq.js} +20 -27
  107. package/dist/event-asset-banner-m607rLD9.cjs +1 -0
  108. package/dist/event-card-580Y5jgk.js +137 -0
  109. package/dist/event-card-BlNRSE2x.cjs +1 -0
  110. package/dist/{lecturer-card-BlzA-YP6.js → lecturer-card-BBkqiic3.js} +4 -3
  111. package/dist/lecturer-card-C7E4UkU8.cjs +1 -0
  112. package/dist/{main-banner-image-BRLhiQJZ.js → main-banner-image-BYIEit_f.js} +33 -33
  113. package/dist/main-banner-image-By44s_XP.cjs +1 -0
  114. package/dist/{mobile-camp-card-B8rTQeTh.js → mobile-camp-card-1dxI-BCc.js} +28 -21
  115. package/dist/mobile-camp-card-D-5N6bex.cjs +1 -0
  116. package/dist/portfolio-asset-card-8mBpumTp.cjs +1 -0
  117. package/dist/{portfolio-asset-card-DEMARh53.js → portfolio-asset-card-mAkXH6Qc.js} +12 -11
  118. package/dist/{premium-card-CFQKDWqN.js → premium-card-CLC7dc-g.js} +48 -60
  119. package/dist/premium-card-CThRJYXd.cjs +1 -0
  120. package/dist/styles.css +1 -1
  121. package/dist/title-tag-card-C-AvnXtC.cjs +1 -0
  122. package/dist/{title-tag-card-Iowzns_v.js → title-tag-card-hb6ub3gc.js} +59 -81
  123. package/dist/tokens.cjs.js +1 -1
  124. package/dist/tokens.es.js +18 -11
  125. package/dist/types/article-asset-card.d.ts +7 -29
  126. package/dist/types/badge.d.ts +1 -1
  127. package/dist/types/button.d.ts +1 -1
  128. package/dist/types/card-label.d.ts +15 -0
  129. package/dist/types/components/dday-card.d.ts +2 -0
  130. package/dist/types/components.d.ts +32 -34
  131. package/dist/types/dday-card.d.ts +32 -0
  132. package/dist/types/event-asset-banner.d.ts +1 -1
  133. package/dist/types/event-card.d.ts +1 -3
  134. package/dist/types/tag.d.ts +2 -2
  135. package/dist/types/text.d.ts +2 -2
  136. package/dist/types/title-tag-card.d.ts +8 -1
  137. package/dist/types/tokens.d.ts +48 -33
  138. package/dist/types/tooltip.d.ts +1 -1
  139. package/dist/types/ui/card-label.d.ts +2 -0
  140. package/dist/types/ui.d.ts +14 -5
  141. package/dist/ui/accordion.cjs.js +1 -1
  142. package/dist/ui/accordion.es.js +1 -1
  143. package/dist/ui/alert-dialog.cjs.js +1 -1
  144. package/dist/ui/alert-dialog.es.js +1 -1
  145. package/dist/ui/anchor.cjs.js +1 -1
  146. package/dist/ui/anchor.es.js +1 -1
  147. package/dist/ui/avatar.cjs.js +1 -1
  148. package/dist/ui/avatar.es.js +1 -1
  149. package/dist/ui/badge.cjs.js +1 -1
  150. package/dist/ui/badge.es.js +1 -1
  151. package/dist/ui/button.cjs.js +1 -1
  152. package/dist/ui/button.es.js +1 -1
  153. package/dist/ui/calendar.cjs.js +1 -1
  154. package/dist/ui/calendar.es.js +1 -1
  155. package/dist/ui/callout.cjs.js +1 -1
  156. package/dist/ui/callout.es.js +1 -1
  157. package/dist/ui/card-label.cjs.js +1 -0
  158. package/dist/ui/card-label.es.js +27 -0
  159. package/dist/ui/card.cjs.js +1 -1
  160. package/dist/ui/card.es.js +1 -1
  161. package/dist/ui/checkbox.cjs.js +1 -1
  162. package/dist/ui/checkbox.es.js +1 -1
  163. package/dist/ui/command.cjs.js +1 -1
  164. package/dist/ui/command.es.js +1 -1
  165. package/dist/ui/dialog.cjs.js +1 -1
  166. package/dist/ui/dialog.es.js +1 -1
  167. package/dist/ui/dropdown-menu.cjs.js +1 -1
  168. package/dist/ui/dropdown-menu.es.js +1 -1
  169. package/dist/ui/file-uploader.cjs.js +1 -1
  170. package/dist/ui/file-uploader.es.js +1 -1
  171. package/dist/ui/form.cjs.js +1 -1
  172. package/dist/ui/form.es.js +1 -1
  173. package/dist/ui/icons.cjs.js +1 -1
  174. package/dist/ui/icons.es.js +1 -1
  175. package/dist/ui/image.cjs.js +1 -1
  176. package/dist/ui/image.es.js +1 -1
  177. package/dist/ui/input.cjs.js +1 -1
  178. package/dist/ui/input.es.js +1 -1
  179. package/dist/ui/label.cjs.js +1 -1
  180. package/dist/ui/label.es.js +1 -1
  181. package/dist/ui/month-picker.cjs.js +1 -1
  182. package/dist/ui/month-picker.es.js +1 -1
  183. package/dist/ui/multi-select.cjs.js +1 -1
  184. package/dist/ui/multi-select.es.js +1 -1
  185. package/dist/ui/navigation-menu.cjs.js +1 -1
  186. package/dist/ui/navigation-menu.es.js +1 -1
  187. package/dist/ui/popover.cjs.js +1 -1
  188. package/dist/ui/popover.es.js +1 -1
  189. package/dist/ui/progress.cjs.js +1 -1
  190. package/dist/ui/progress.es.js +3 -12
  191. package/dist/ui/radio-group.cjs.js +1 -1
  192. package/dist/ui/radio-group.es.js +1 -1
  193. package/dist/ui/scroll-area.cjs.js +1 -1
  194. package/dist/ui/scroll-area.es.js +1 -1
  195. package/dist/ui/select.cjs.js +1 -1
  196. package/dist/ui/select.es.js +1 -1
  197. package/dist/ui/separator.cjs.js +1 -1
  198. package/dist/ui/separator.es.js +1 -1
  199. package/dist/ui/simple-table.cjs.js +1 -1
  200. package/dist/ui/simple-table.es.js +1 -1
  201. package/dist/ui/skeleton.cjs.js +1 -1
  202. package/dist/ui/skeleton.es.js +1 -1
  203. package/dist/ui/slider.cjs.js +1 -1
  204. package/dist/ui/slider.es.js +1 -1
  205. package/dist/ui/switch.cjs.js +1 -1
  206. package/dist/ui/switch.es.js +1 -1
  207. package/dist/ui/tabs.cjs.js +1 -1
  208. package/dist/ui/tabs.es.js +1 -1
  209. package/dist/ui/tag.cjs.js +1 -1
  210. package/dist/ui/tag.es.js +6 -8
  211. package/dist/ui/text.cjs.js +1 -1
  212. package/dist/ui/text.es.js +1 -1
  213. package/dist/ui/textarea.cjs.js +1 -1
  214. package/dist/ui/textarea.es.js +1 -1
  215. package/dist/ui/toast.cjs.js +1 -1
  216. package/dist/ui/toast.es.js +1 -1
  217. package/dist/ui/toggle-group.cjs.js +1 -1
  218. package/dist/ui/toggle-group.es.js +1 -1
  219. package/dist/ui/toggle.cjs.js +1 -1
  220. package/dist/ui/toggle.es.js +1 -1
  221. package/dist/ui/tooltip.cjs.js +1 -1
  222. package/dist/ui/tooltip.es.js +1 -1
  223. package/dist/ui.cjs.js +1 -1
  224. package/dist/ui.es.js +157 -155
  225. package/dist/utils-CvQG8ZyC.js +36 -0
  226. package/dist/utils-DDqioO-T.cjs +1 -0
  227. package/dist/youtube-video-modal-CNTPCinc.cjs +1 -0
  228. package/dist/{youtube-video-modal-B_vy97Tt.js → youtube-video-modal-CrkV3YQc.js} +4 -3
  229. package/package.json +1 -1
  230. package/dist/article-asset-card-CGSemovn.cjs +0 -1
  231. package/dist/article-asset-card-D1Ipe86b.js +0 -97
  232. package/dist/camp-card-BRs3koNF.cjs +0 -1
  233. package/dist/common-C3JaD1vJ.js +0 -25
  234. package/dist/common-Ds1lanOg.cjs +0 -1
  235. package/dist/company-info-card-C00gMHAv.cjs +0 -1
  236. package/dist/event-asset-banner-BRsgu3Hc.cjs +0 -1
  237. package/dist/event-card-C1mSACOR.js +0 -158
  238. package/dist/event-card-DebLbRKd.cjs +0 -1
  239. package/dist/index-0QN4lVFQ.js +0 -130
  240. package/dist/index-B8SY6s5B.cjs +0 -1
  241. package/dist/index-DWvwbdTU.js +0 -44
  242. package/dist/index-Dhd1jlaC.cjs +0 -1
  243. package/dist/lecturer-card-CgSWLJ8r.cjs +0 -1
  244. package/dist/main-banner-image-Bh3AZqac.cjs +0 -1
  245. package/dist/mobile-camp-card-B4L0Eq0v.cjs +0 -1
  246. package/dist/portfolio-asset-card-BdS7kkkT.cjs +0 -1
  247. package/dist/premium-card-1vtWPIUr.cjs +0 -1
  248. package/dist/title-tag-card-MFpE2-Nb.cjs +0 -1
  249. package/dist/utils-B1DD9KJ8.js +0 -42
  250. package/dist/utils-B5U1QyKF.cjs +0 -1
  251. package/dist/youtube-video-modal-C4a0lovb.cjs +0 -1
package/README.md CHANGED
@@ -292,10 +292,19 @@ npm 인증 토큰은 레포 파일에 커밋하지 않고 환경변수로만 주
292
292
 
293
293
  ```sh
294
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
+ # 수동 동기화만 필요할 때
295
304
  boottent-design-docs sync # docs/ds/ 로 미러 복사 + docs/design.md scaffold(없을 때만)
296
305
  boottent-design-docs sync --out docs/design # 미러 경로 변경
297
306
  boottent-design-docs sync --no-scaffold # design.md 자동 생성 비활성화
298
307
  ```
299
308
 
300
- 소비처는 자체 `docs/design.md`(허브로 연결, 앱 전용 확장 기록)를 소유하고, `docs/ds/`는 sync가 덮어쓰는 SSOT 미러다.
309
+ 소비처는 자체 `docs/design.md`(허브로 연결, 앱 전용 확장 기록)를 소유하고, `docs/ds/`는 sync가 덮어쓰는 SSOT 미러다. `init --postinstall`을 한 번 실행하면 이후 `yarn install` / `yarn upgrade boottent-design` 때 최신 DS 문서가 자동으로 다시 동기화된다.
301
310
  자세한 연동/업그레이드 루프는 [docs/SSOT-INTEGRATION.md](docs/SSOT-INTEGRATION.md)를 참조하세요.
package/bin/sync-docs.mjs CHANGED
@@ -8,11 +8,13 @@
8
8
  *
9
9
  * 사용법:
10
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]
11
12
  *
12
13
  * 옵션:
13
14
  * --out <dir> SSOT 미러 출력 디렉터리 (기본: docs/ds)
14
15
  * --design-doc <path> 소비처 소유 design.md 경로 (기본: docs/design.md). 없을 때만 생성.
15
16
  * --no-scaffold design.md scaffold 비활성화
17
+ * --postinstall 소비처 package.json에 install/update 후 자동 sync 스크립트 추가
16
18
  * --help 이 도움말
17
19
  */
18
20
  import fs from "node:fs";
@@ -28,22 +30,26 @@ const SRC_DOCS = path.join(PKG_ROOT, "dist", "design-system");
28
30
 
29
31
  const DEFAULT_OUT = "docs/ds";
30
32
  const DEFAULT_DESIGN_DOC = "docs/design.md";
33
+ const SYNC_COMMAND = "boottent-design-docs sync";
31
34
 
32
35
  function printHelp() {
33
36
  console.log(`boottent-design-docs — DS 문서 SSOT 동기화
34
37
 
35
38
  사용법:
36
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]
37
41
 
38
42
  옵션:
39
43
  --out <dir> SSOT 미러 출력 디렉터리 (기본: ${DEFAULT_OUT})
40
44
  --design-doc <path> 소비처 소유 design.md 경로 (기본: ${DEFAULT_DESIGN_DOC}). 없을 때만 생성.
41
45
  --no-scaffold design.md scaffold 비활성화
46
+ --postinstall 소비처 package.json에 install/update 후 자동 sync 스크립트 추가
42
47
  --help 이 도움말
43
48
 
44
49
  동작:
45
- 설치된 boottent-design 의 dist/design-system/ (허브 + 스포크 스탬프본)를 <dir> 로 재귀 복사하고,
46
- 소비처 design.md 가 없으면 허브로 연결되는 시작 템플릿을 생성합니다.`);
50
+ sync: 설치된 boottent-design 의 dist/design-system/ (허브 + 스포크 스탬프본)를 <dir> 로 미러링하고,
51
+ 소비처 design.md 가 없으면 허브로 연결되는 시작 템플릿을 생성합니다.
52
+ init: sync를 먼저 실행한 뒤, --postinstall 지정 시 소비처 package.json에 자동 동기화 스크립트를 추가합니다.`);
47
53
  }
48
54
 
49
55
  function getPkgVersion() {
@@ -61,6 +67,7 @@ function parseArgs(argv) {
61
67
  out: DEFAULT_OUT,
62
68
  designDoc: DEFAULT_DESIGN_DOC,
63
69
  scaffold: true,
70
+ postinstall: false,
64
71
  help: false,
65
72
  };
66
73
  for (let i = 0; i < argv.length; i++) {
@@ -69,6 +76,7 @@ function parseArgs(argv) {
69
76
  else if (arg === "--out" || arg === "-o") args.out = argv[++i];
70
77
  else if (arg === "--design-doc") args.designDoc = argv[++i];
71
78
  else if (arg === "--no-scaffold") args.scaffold = false;
79
+ else if (arg === "--postinstall") args.postinstall = true;
72
80
  else if (!arg.startsWith("-") && !args.command) args.command = arg;
73
81
  }
74
82
  return args;
@@ -79,6 +87,10 @@ function fail(message) {
79
87
  process.exit(1);
80
88
  }
81
89
 
90
+ function normalizeRelPath(filePath) {
91
+ return filePath.split(path.sep).join("/");
92
+ }
93
+
82
94
  /** 디렉터리 트리를 재귀 복사한다. */
83
95
  function copyTree(srcDir, destDir) {
84
96
  fs.mkdirSync(destDir, { recursive: true });
@@ -96,6 +108,17 @@ function copyTree(srcDir, destDir) {
96
108
  return count;
97
109
  }
98
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
+
99
122
  /** 소비처가 소유하는 design.md 시작 템플릿. */
100
123
  function designDocTemplate(version, outRel, generatedAt) {
101
124
  const hub = path.posix.join(outRel, "design-system.md");
@@ -122,6 +145,71 @@ UI는 [boottent-design](https://boottent.com)을 **단일 진실 원천(SSOT)**
122
145
  `;
123
146
  }
124
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
+
125
213
  function sync(args) {
126
214
  if (!fs.existsSync(SRC_DOCS)) {
127
215
  fail(
@@ -134,8 +222,8 @@ function sync(args) {
134
222
  const generatedAt = new Date().toLocaleString("ko-KR");
135
223
  const absOut = path.resolve(process.cwd(), args.out);
136
224
 
137
- const count = copyTree(SRC_DOCS, absOut);
138
- const outRel = path.relative(process.cwd(), absOut) || ".";
225
+ const count = mirrorDocs(SRC_DOCS, absOut);
226
+ const outRel = normalizeRelPath(path.relative(process.cwd(), absOut) || ".");
139
227
 
140
228
  console.log(`✓ boottent-design v${version} 문서 동기화 완료`);
141
229
  console.log(` 미러: ${outRel}/ (${count} files)`);
@@ -144,7 +232,9 @@ function sync(args) {
144
232
  if (args.scaffold) {
145
233
  const absDesign = path.resolve(process.cwd(), args.designDoc);
146
234
  if (fs.existsSync(absDesign)) {
147
- console.log(` design.md: 이미 존재 — 건너뜀 (${path.relative(process.cwd(), absDesign)})`);
235
+ console.log(
236
+ ` design.md: 이미 존재 — 건너뜀 (${normalizeRelPath(path.relative(process.cwd(), absDesign))})`,
237
+ );
148
238
  } else {
149
239
  fs.mkdirSync(path.dirname(absDesign), { recursive: true });
150
240
  // design.md 위치에서 미러 디렉터리로 가는 상대경로
@@ -153,11 +243,22 @@ function sync(args) {
153
243
  absOut.split(path.sep).join("/"),
154
244
  );
155
245
  fs.writeFileSync(absDesign, designDocTemplate(version, relToOut || ".", generatedAt));
156
- console.log(` design.md: 생성 (${path.relative(process.cwd(), absDesign)})`);
246
+ console.log(` design.md: 생성 (${normalizeRelPath(path.relative(process.cwd(), absDesign))})`);
157
247
  }
158
248
  }
159
249
  }
160
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
+
161
262
  function main() {
162
263
  const args = parseArgs(process.argv.slice(2));
163
264
 
@@ -171,6 +272,11 @@ function main() {
171
272
  return;
172
273
  }
173
274
 
275
+ if (args.command === "init") {
276
+ init(args);
277
+ return;
278
+ }
279
+
174
280
  console.error(`알 수 없는 명령: ${args.command}\n`);
175
281
  printHelp();
176
282
  process.exit(1);
@@ -0,0 +1,96 @@
1
+ import { jsx as r, jsxs as e } from "react/jsx-runtime";
2
+ import "./ui/accordion.es.js";
3
+ import "./ui/alert-dialog.es.js";
4
+ import "@radix-ui/react-aspect-ratio";
5
+ import "./ui/avatar.es.js";
6
+ import "./ui/badge.es.js";
7
+ import "./ui/button.es.js";
8
+ import "./ui/calendar.es.js";
9
+ import "./ui/callout.es.js";
10
+ import "./ui/card.es.js";
11
+ import "./ui/card-label.es.js";
12
+ import "./ui/checkbox.es.js";
13
+ import "lucide-react";
14
+ import "./ui/command.es.js";
15
+ import "./ui/dialog.es.js";
16
+ import "./ui/dropdown-menu.es.js";
17
+ import "./ui/file-uploader.es.js";
18
+ import "./ui/form.es.js";
19
+ import { Icon as g } from "./ui/icons.es.js";
20
+ import "./ui/input.es.js";
21
+ import "./ui/label.es.js";
22
+ import "./ui/month-picker.es.js";
23
+ import "./ui/multi-select.es.js";
24
+ import "./ui/navigation-menu.es.js";
25
+ import "./ui/popover.es.js";
26
+ import "./ui/progress.es.js";
27
+ import "./ui/radio-group.es.js";
28
+ import "./ui/scroll-area.es.js";
29
+ import "./ui/select.es.js";
30
+ import "./ui/separator.es.js";
31
+ import "@radix-ui/react-slider";
32
+ import "react";
33
+ import "./ui/switch.es.js";
34
+ import "./ui/tabs.es.js";
35
+ import { Tag as m } from "./ui/tag.es.js";
36
+ import "./ui/text.es.js";
37
+ import "./ui/textarea.es.js";
38
+ import "./ui/toast.es.js";
39
+ import "./ui/toggle.es.js";
40
+ import "./ui/toggle-group.es.js";
41
+ import "./ui/tooltip.es.js";
42
+ import { g as f } from "./image-loading-BX5rKZfC.js";
43
+ function it({
44
+ article: t,
45
+ isYoutube: s = !1,
46
+ imagePriority: a,
47
+ imageLoading: l,
48
+ imageFetchPriority: p,
49
+ imageDecoding: d
50
+ }) {
51
+ const i = !t.categoryTag && t.tags ? t.tags.slice(0, 3) : [], c = f({
52
+ imagePriority: a,
53
+ imageLoading: l,
54
+ imageFetchPriority: p,
55
+ imageDecoding: d
56
+ });
57
+ return /* @__PURE__ */ r(
58
+ "div",
59
+ {
60
+ 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",
61
+ "data-asset-id": t.assetId,
62
+ children: /* @__PURE__ */ e("div", { className: "flex h-full w-full flex-col", children: [
63
+ /* @__PURE__ */ e("div", { className: "relative w-full shrink-0 overflow-hidden", children: [
64
+ /* @__PURE__ */ r(
65
+ "img",
66
+ {
67
+ src: t.imageUrl,
68
+ alt: "image",
69
+ className: "aspect-video w-full object-cover",
70
+ ...c
71
+ }
72
+ ),
73
+ s && /* @__PURE__ */ r("div", { className: "absolute inset-0 flex items-center justify-center bg-white/30", children: /* @__PURE__ */ r(g.Play, { size: "40" }) })
74
+ ] }),
75
+ /* @__PURE__ */ e("div", { className: "flex flex-col items-start gap-2 p-4", children: [
76
+ t.categoryTag ? /* @__PURE__ */ r(
77
+ m,
78
+ {
79
+ size: "sm",
80
+ variant: "etc",
81
+ style: { background: t.categoryTag.background, color: t.categoryTag.color },
82
+ children: t.categoryTag.text
83
+ }
84
+ ) : i.length > 0 ? /* @__PURE__ */ r("div", { className: "flex flex-wrap items-start gap-1", children: i.map((o, n) => /* @__PURE__ */ r(m, { size: "sm", variant: "solid-secondary-100", children: o }, `${o}-${n}`)) }) : null,
85
+ /* @__PURE__ */ e("div", { className: "flex flex-col gap-2", children: [
86
+ /* @__PURE__ */ r("p", { className: "line-clamp-2 text-semibold14 xs:text-semibold16", children: t.title }),
87
+ /* @__PURE__ */ r("p", { className: "line-clamp-3 text-regular13 text-grey-500 xs:text-regular14", children: t.description })
88
+ ] })
89
+ ] })
90
+ ] })
91
+ }
92
+ );
93
+ }
94
+ export {
95
+ it as A
96
+ };
@@ -0,0 +1 @@
1
+ "use strict";const e=require("react/jsx-runtime");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/card-label.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 g=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");const a=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 q=require("./image-loading-DZFBFoVv.cjs");function x({article:r,isYoutube:u=!1,imagePriority:l,imageLoading:t,imageFetchPriority:c,imageDecoding:d}){const i=!r.categoryTag&&r.tags?r.tags.slice(0,3):[],n=q.getImageLoadingAttributes({imagePriority:l,imageLoading:t,imageFetchPriority:c,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",...n}),u&&e.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-white/30",children:e.jsx(g.Icon.Play,{size:"40"})})]}),e.jsxs("div",{className:"flex flex-col items-start gap-2 p-4",children:[r.categoryTag?e.jsx(a.Tag,{size:"sm",variant:"etc",style:{background:r.categoryTag.background,color:r.categoryTag.color},children:r.categoryTag.text}):i.length>0?e.jsx("div",{className:"flex flex-wrap items-start gap-1",children:i.map((s,o)=>e.jsx(a.Tag,{size:"sm",variant:"solid-secondary-100",children:s},`${s}-${o}`))}):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=x;
@@ -0,0 +1 @@
1
+ "use strict";const e=require("react/jsx-runtime");require("./ui/accordion.cjs.js");require("./ui/alert-dialog.cjs.js");const t=require("./common-DeneXo5X.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");const O=require("./ui/card-label.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 P=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 Q=require("./image-loading-DZFBFoVv.cjs"),s=require("./camp-card-format-rjZZu4G6.cjs");function V({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:t.cn("inline-block whitespace-nowrap rounded px-1 py-0.5 text-regular13",r.className),children:r.text})})}function m(r,l="sm"){return l==="ad"?e.jsx(O.CardLabel,{style:{background:r.background,color:r.color,border:`1px solid ${r.border??r.background??"transparent"}`},className:t.cn("absolute right-0 top-0",r.className),children:r.text}):e.jsx(P.Tag,{style:{background:r.background,color:r.color,border:`1px solid ${r.border??r.background??"transparent"}`},size:l,className:r.className,children:r.text})}function X({brandName:r,title:l,batchName:f="",imageUrl:a,imageAlt:q="header image",tuitionText:p,locationText:h,scheduleText:j,startDate:v,endDate:w,period:b,tuition:g,earlyBirdTuition:N,earlyBirdEndDate:k,isFree:C,onoffText:y,cityLabels:T,costOptionText:L,tags:o=[],statusBadge:n,adBadge:u,adTitle:c,isAd:$=!1,className:S,style:A,bookmarkSlot:_,latestBatchSlot:B,imageOverlaySlot:D,imageWrapper:d,imagePriority:E,imageLoading:F,imageFetchPriority:I,imageDecoding:R}){const z=Q.getImageLoadingAttributes({imagePriority:E,imageLoading:F,imageFetchPriority:I,imageDecoding:R}),G=`${l} ${f||""}`.trim(),H=p??L??s.formatCampCardTuitionText({tuition:g??void 0,isFree:C,earlyBirdTuition:N??void 0,earlyBirdEndDate:k??void 0}),J=h??s.formatCampCardLocationText({onoffText:y,cityLabels:T,format:"desktop"}),K=j??s.formatCampCardScheduleText({startDate:v,endDate:w,period:b}),i=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:t.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:[i?d?d(i):i:null,D,e.jsxs("div",{className:"absolute bottom-2 right-2 flex flex-col items-end gap-1",children:[n?m(n,"sm"):null,B]})]}),u?m(u,"ad"):null,_]}),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}),$&&c?e.jsx("div",{className:"line-clamp-2 break-keep rounded-md bg-yellow-400/50 px-2 py-1 text-grey-800",children:c}):null,o.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:o.map((x,M)=>e.jsx(V,{tag:x},`${String(x.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=X;
@@ -1,7 +1,7 @@
1
- import { jsx as r, jsxs as t } from "react/jsx-runtime";
1
+ import { jsx as e, jsxs as o } from "react/jsx-runtime";
2
2
  import "./ui/accordion.es.js";
3
3
  import "./ui/alert-dialog.es.js";
4
- import { c as u } from "./common-C3JaD1vJ.js";
4
+ import { c as i } from "./common-zQ5XY0UN.js";
5
5
  import "@radix-ui/react-aspect-ratio";
6
6
  import "./ui/avatar.es.js";
7
7
  import "./ui/badge.es.js";
@@ -9,6 +9,7 @@ import "./ui/button.es.js";
9
9
  import "./ui/calendar.es.js";
10
10
  import "./ui/callout.es.js";
11
11
  import "./ui/card.es.js";
12
+ import { CardLabel as Q } from "./ui/card-label.es.js";
12
13
  import "./ui/checkbox.es.js";
13
14
  import "lucide-react";
14
15
  import "./ui/command.es.js";
@@ -31,50 +32,60 @@ import "@radix-ui/react-slider";
31
32
  import "react";
32
33
  import "./ui/switch.es.js";
33
34
  import "./ui/tabs.es.js";
34
- import { Tag as Q } from "./ui/tag.es.js";
35
+ import { Tag as R } from "./ui/tag.es.js";
35
36
  import "./ui/text.es.js";
36
37
  import "./ui/textarea.es.js";
37
38
  import "./ui/toast.es.js";
38
39
  import "./ui/toggle.es.js";
39
40
  import "./ui/toggle-group.es.js";
40
41
  import "./ui/tooltip.es.js";
41
- import { g as R } from "./image-loading-BX5rKZfC.js";
42
- import { d as V, a as X, c as Y } from "./camp-card-format-QrakDFC6.js";
43
- function Z({ tag: e }) {
44
- return /* @__PURE__ */ r("li", { className: "rounded", children: /* @__PURE__ */ r(
42
+ import { g as V } from "./image-loading-BX5rKZfC.js";
43
+ import { d as X, a as Y, c as Z } from "./camp-card-format-QrakDFC6.js";
44
+ function _({ tag: r }) {
45
+ return /* @__PURE__ */ e("li", { className: "rounded", children: /* @__PURE__ */ e(
45
46
  "div",
46
47
  {
47
48
  style: {
48
- color: e.color,
49
- backgroundColor: e.background,
50
- border: `1px solid ${e.border ?? "transparent"}`
49
+ color: r.color,
50
+ backgroundColor: r.background,
51
+ border: `1px solid ${r.border ?? "transparent"}`
51
52
  },
52
- className: u("inline-block whitespace-nowrap rounded px-1 py-0.5 text-regular13", e.className),
53
- children: e.text
53
+ className: i("inline-block whitespace-nowrap rounded px-1 py-0.5 text-regular13", r.className),
54
+ children: r.text
54
55
  }
55
56
  ) });
56
57
  }
57
- function p(e, o = "sm") {
58
- return /* @__PURE__ */ r(
58
+ function u(r, t = "sm") {
59
+ return t === "ad" ? /* @__PURE__ */ e(
59
60
  Q,
60
61
  {
61
62
  style: {
62
- background: e.background,
63
- color: e.color,
64
- border: `1px solid ${e.border ?? e.background ?? "transparent"}`
63
+ background: r.background,
64
+ color: r.color,
65
+ border: `1px solid ${r.border ?? r.background ?? "transparent"}`
65
66
  },
66
- size: o,
67
- variant: o === "ad" ? "ad" : void 0,
68
- className: e.className,
69
- children: e.text
67
+ className: i("absolute right-0 top-0", r.className),
68
+ children: r.text
69
+ }
70
+ ) : /* @__PURE__ */ e(
71
+ R,
72
+ {
73
+ style: {
74
+ background: r.background,
75
+ color: r.color,
76
+ border: `1px solid ${r.border ?? r.background ?? "transparent"}`
77
+ },
78
+ size: t,
79
+ className: r.className,
80
+ children: r.text
70
81
  }
71
82
  );
72
83
  }
73
- function He({
74
- brandName: e,
75
- title: o,
84
+ function Kr({
85
+ brandName: r,
86
+ title: t,
76
87
  batchName: f = "",
77
- imageUrl: i,
88
+ imageUrl: a,
78
89
  imageAlt: h = "header image",
79
90
  tuitionText: x,
80
91
  locationText: v,
@@ -82,91 +93,91 @@ function He({
82
93
  startDate: b,
83
94
  endDate: N,
84
95
  period: g,
85
- tuition: y,
86
- earlyBirdTuition: k,
96
+ tuition: k,
97
+ earlyBirdTuition: y,
87
98
  earlyBirdEndDate: C,
88
99
  isFree: T,
89
100
  onoffText: $,
90
101
  cityLabels: j,
91
102
  costOptionText: L,
92
- tags: a = [],
93
- statusBadge: n,
103
+ tags: n = [],
104
+ statusBadge: s,
94
105
  adBadge: m,
95
- adTitle: s,
106
+ adTitle: c,
96
107
  isAd: S = !1,
97
108
  className: A,
98
109
  style: B,
99
110
  bookmarkSlot: D,
100
111
  latestBatchSlot: E,
101
112
  imageOverlaySlot: I,
102
- imageWrapper: c,
113
+ imageWrapper: d,
103
114
  imagePriority: q,
104
115
  imageLoading: z,
105
116
  imageFetchPriority: F,
106
117
  imageDecoding: G
107
118
  }) {
108
- const H = R({
119
+ const H = V({
109
120
  imagePriority: q,
110
121
  imageLoading: z,
111
122
  imageFetchPriority: F,
112
123
  imageDecoding: G
113
- }), J = `${o} ${f || ""}`.trim(), K = x ?? L ?? V({
114
- tuition: y ?? void 0,
124
+ }), J = `${t} ${f || ""}`.trim(), K = x ?? L ?? X({
125
+ tuition: k ?? void 0,
115
126
  isFree: T,
116
- earlyBirdTuition: k ?? void 0,
127
+ earlyBirdTuition: y ?? void 0,
117
128
  earlyBirdEndDate: C ?? void 0
118
- }), M = v ?? X({
129
+ }), M = v ?? Y({
119
130
  onoffText: $,
120
131
  cityLabels: j,
121
132
  format: "desktop"
122
- }), O = w ?? Y({
133
+ }), O = w ?? Z({
123
134
  startDate: b,
124
135
  endDate: N,
125
136
  period: g
126
- }), l = i ? /* @__PURE__ */ r("button", { type: "button", className: "absolute inset-0", children: /* @__PURE__ */ r(
137
+ }), l = a ? /* @__PURE__ */ e("button", { type: "button", className: "absolute inset-0", children: /* @__PURE__ */ e(
127
138
  "img",
128
139
  {
129
- src: i,
140
+ src: a,
130
141
  alt: h,
131
142
  className: "h-full w-full object-cover transition-all hover:scale-110",
132
143
  ...H
133
144
  }
134
145
  ) }) : null;
135
- return /* @__PURE__ */ t(
146
+ return /* @__PURE__ */ o(
136
147
  "div",
137
148
  {
138
- className: u(
149
+ className: i(
139
150
  "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",
140
151
  A
141
152
  ),
142
153
  style: B,
143
154
  children: [
144
- /* @__PURE__ */ t("div", { className: "relative aspect-[9/5] w-full shrink-0", children: [
145
- /* @__PURE__ */ t("div", { className: "absolute inset-0 z-0 flex items-center justify-center overflow-hidden", children: [
146
- l ? c ? c(l) : l : null,
155
+ /* @__PURE__ */ o("div", { className: "relative aspect-[9/5] w-full shrink-0", children: [
156
+ /* @__PURE__ */ o("div", { className: "absolute inset-0 z-0 flex items-center justify-center overflow-hidden", children: [
157
+ l ? d ? d(l) : l : null,
147
158
  I,
148
- /* @__PURE__ */ t("div", { className: "absolute bottom-2 right-2 flex flex-col items-end gap-1", children: [
149
- n ? p(n, "sm") : null,
159
+ /* @__PURE__ */ o("div", { className: "absolute bottom-2 right-2 flex flex-col items-end gap-1", children: [
160
+ s ? u(s, "sm") : null,
150
161
  E
151
162
  ] })
152
163
  ] }),
153
- m ? p(m, "ad") : null,
164
+ m ? u(m, "ad") : null,
154
165
  D
155
166
  ] }),
156
- /* @__PURE__ */ t("div", { className: "flex flex-col gap-2 p-4 text-regular14", children: [
157
- /* @__PURE__ */ r("div", { children: e }),
158
- /* @__PURE__ */ t("div", { className: "flex w-full flex-col gap-3", children: [
159
- /* @__PURE__ */ r("div", { className: "line-clamp-3 w-full text-semibold16 font-medium", children: J }),
160
- S && s ? /* @__PURE__ */ r("div", { className: "line-clamp-2 break-keep rounded-md bg-yellow-400/50 px-2 py-1 text-grey-800", children: s }) : null,
161
- a.length > 0 ? /* @__PURE__ */ r("ul", { className: "flex w-full max-w-full shrink-0 grow-0 flex-wrap justify-start gap-[5px] overflow-x-hidden whitespace-normal", children: a.map((d, P) => /* @__PURE__ */ r(Z, { tag: d }, `${String(d.text)}-${P}`)) }) : null
167
+ /* @__PURE__ */ o("div", { className: "flex flex-col gap-2 p-4 text-regular14", children: [
168
+ /* @__PURE__ */ e("div", { children: r }),
169
+ /* @__PURE__ */ o("div", { className: "flex w-full flex-col gap-3", children: [
170
+ /* @__PURE__ */ e("div", { className: "line-clamp-3 w-full text-semibold16 font-medium", children: J }),
171
+ S && c ? /* @__PURE__ */ e("div", { className: "line-clamp-2 break-keep rounded-md bg-yellow-400/50 px-2 py-1 text-grey-800", children: c }) : null,
172
+ n.length > 0 ? /* @__PURE__ */ e("ul", { className: "flex w-full max-w-full shrink-0 grow-0 flex-wrap justify-start gap-[5px] overflow-x-hidden whitespace-normal", children: n.map((p, P) => /* @__PURE__ */ e(_, { tag: p }, `${String(p.text)}-${P}`)) }) : null
162
173
  ] }),
163
- /* @__PURE__ */ t("div", { className: "flex w-full flex-col gap-2 text-regular13", children: [
164
- /* @__PURE__ */ t("p", { className: "w-full overflow-hidden truncate whitespace-nowrap", children: [
165
- /* @__PURE__ */ r("span", { children: K }),
174
+ /* @__PURE__ */ o("div", { className: "flex w-full flex-col gap-2 text-regular13", children: [
175
+ /* @__PURE__ */ o("p", { className: "w-full overflow-hidden truncate whitespace-nowrap", children: [
176
+ /* @__PURE__ */ e("span", { children: K }),
166
177
  " · ",
167
- /* @__PURE__ */ r("span", { children: M })
178
+ /* @__PURE__ */ e("span", { children: M })
168
179
  ] }),
169
- /* @__PURE__ */ r("p", { className: "w-full overflow-hidden truncate whitespace-nowrap", children: O })
180
+ /* @__PURE__ */ e("p", { className: "w-full overflow-hidden truncate whitespace-nowrap", children: O })
170
181
  ] })
171
182
  ] })
172
183
  ]
@@ -174,5 +185,5 @@ function He({
174
185
  );
175
186
  }
176
187
  export {
177
- He as C
188
+ Kr as C
178
189
  };
@@ -0,0 +1 @@
1
+ "use strict";const r=require("clsx"),n=require("tailwind-merge"),o=(...e)=>n.twMerge(r(e));function s(e){const t=!e||e.includes("utm_source")?"":"utm_source=boottent&utm_medium=referral",c=e&&e.includes("?")?"&":"?";return`${e}${c}${t}`}exports.addUTMtoUrl=s;exports.cn=o;
@@ -0,0 +1,11 @@
1
+ import c from "clsx";
2
+ import { twMerge as m } from "tailwind-merge";
3
+ const a = (...t) => m(c(t));
4
+ function u(t) {
5
+ const e = !t || t.includes("utm_source") ? "" : "utm_source=boottent&utm_medium=referral", o = t && t.includes("?") ? "&" : "?";
6
+ return `${t}${o}${e}`;
7
+ }
8
+ export {
9
+ u as a,
10
+ a as c
11
+ };
@@ -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-DeneXo5X.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/card-label.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:u,imageLoading:n,imageFetchPriority:l,imageDecoding:c}){const{introductionData:r,companyId:o}=i;if(!r)return null;const d=t??`company-info-${o}`,m=f.getImageLoadingAttributes({imagePriority:u,imageLoading:n,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;
@@ -1,7 +1,7 @@
1
1
  import { jsxs as i, jsx as t } from "react/jsx-runtime";
2
2
  import "./ui/accordion.es.js";
3
3
  import "./ui/alert-dialog.es.js";
4
- import { c as h } from "./common-C3JaD1vJ.js";
4
+ import { c as h } from "./common-zQ5XY0UN.js";
5
5
  import "@radix-ui/react-aspect-ratio";
6
6
  import "./ui/avatar.es.js";
7
7
  import "./ui/badge.es.js";
@@ -9,6 +9,7 @@ import { buttonVariants as u } from "./ui/button.es.js";
9
9
  import "./ui/calendar.es.js";
10
10
  import { Callout as g } from "./ui/callout.es.js";
11
11
  import "./ui/card.es.js";
12
+ import "./ui/card-label.es.js";
12
13
  import "./ui/checkbox.es.js";
13
14
  import "lucide-react";
14
15
  import "./ui/command.es.js";
@@ -39,7 +40,7 @@ import "./ui/toggle.es.js";
39
40
  import "./ui/toggle-group.es.js";
40
41
  import "./ui/tooltip.es.js";
41
42
  import { g as x } from "./image-loading-BX5rKZfC.js";
42
- function ot({
43
+ function at({
43
44
  intro: e,
44
45
  roleText: m = "운영",
45
46
  descriptionId: a,
@@ -99,5 +100,5 @@ function ot({
99
100
  );
100
101
  }
101
102
  export {
102
- ot as C
103
+ at as C
103
104
  };
@@ -1 +1 @@
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
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../article-asset-card-DRRl2BH8.cjs");exports.ArticleAssetCard=e.ArticleAssetCard;