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.
- package/README.md +10 -1
- package/bin/sync-docs.mjs +112 -6
- package/dist/article-asset-card-DGa_XWK1.js +96 -0
- package/dist/article-asset-card-DRRl2BH8.cjs +1 -0
- package/dist/camp-card-DM2V71SW.cjs +1 -0
- package/dist/{camp-card-Bi7Li0p5.js → camp-card-nUdSAdXo.js} +70 -59
- package/dist/common-DeneXo5X.cjs +1 -0
- package/dist/common-zQ5XY0UN.js +11 -0
- package/dist/company-info-card-BXAempVI.cjs +1 -0
- package/dist/{company-info-card-D1U_poOk.js → company-info-card-DJTgItPu.js} +4 -3
- package/dist/components/article-asset-card.cjs.js +1 -1
- package/dist/components/article-asset-card.es.js +1 -1
- package/dist/components/camp-card.cjs.js +1 -1
- package/dist/components/camp-card.es.js +1 -1
- package/dist/components/company-info-card.cjs.js +1 -1
- package/dist/components/company-info-card.es.js +1 -1
- package/dist/components/dday-card.cjs.js +1 -0
- package/dist/components/dday-card.es.js +5 -0
- package/dist/components/event-asset-banner.cjs.js +1 -1
- package/dist/components/event-asset-banner.es.js +1 -1
- package/dist/components/event-card.cjs.js +1 -1
- package/dist/components/event-card.es.js +1 -1
- package/dist/components/lecturer-card.cjs.js +1 -1
- package/dist/components/lecturer-card.es.js +1 -1
- package/dist/components/main-banner-image.cjs.js +1 -1
- package/dist/components/main-banner-image.es.js +1 -1
- package/dist/components/mobile-camp-card.cjs.js +1 -1
- package/dist/components/mobile-camp-card.es.js +1 -1
- package/dist/components/portfolio-asset-card.cjs.js +1 -1
- package/dist/components/portfolio-asset-card.es.js +1 -1
- package/dist/components/premium-card.cjs.js +1 -1
- package/dist/components/premium-card.es.js +1 -1
- package/dist/components/title-tag-card.cjs.js +1 -1
- package/dist/components/title-tag-card.es.js +1 -1
- package/dist/components/youtube-video-modal.cjs.js +1 -1
- package/dist/components/youtube-video-modal.es.js +1 -1
- package/dist/components.cjs.js +1 -1
- package/dist/components.es.js +41 -39
- package/dist/dday-card-Diku8WyO.cjs +1 -0
- package/dist/dday-card-HrnKCR_0.js +140 -0
- package/dist/design-system/components/article-asset-card.md +1 -1
- package/dist/design-system/components/blog-review-card.md +1 -1
- package/dist/design-system/components/camp-card.md +1 -1
- package/dist/design-system/components/company-info-card.md +1 -1
- package/dist/design-system/components/dday-card.md +47 -0
- package/dist/design-system/components/environment-asset-photo.md +1 -1
- package/dist/design-system/components/event-asset-banner.md +1 -1
- package/dist/design-system/components/event-card.md +1 -3
- package/dist/design-system/components/lecturer-card.md +1 -1
- package/dist/design-system/components/main-banner-image.md +1 -1
- package/dist/design-system/components/mobile-camp-card.md +1 -1
- package/dist/design-system/components/partner-list-card.md +1 -1
- package/dist/design-system/components/portfolio-asset-card.md +1 -1
- package/dist/design-system/components/premium-card.md +1 -1
- package/dist/design-system/components/title-tag-card.md +2 -2
- package/dist/design-system/components/youtube-video-modal.md +1 -1
- package/dist/design-system/design-system.md +7 -6
- package/dist/design-system/tokens.md +1 -1
- package/dist/design-system/ui/accordion.md +1 -1
- package/dist/design-system/ui/alert-dialog.md +1 -1
- package/dist/design-system/ui/anchor.md +1 -1
- package/dist/design-system/ui/aspect-ratio.md +1 -1
- package/dist/design-system/ui/avatar.md +1 -1
- package/dist/design-system/ui/badge.md +1 -1
- package/dist/design-system/ui/button.md +1 -1
- package/dist/design-system/ui/calendar.md +1 -1
- package/dist/design-system/ui/callout.md +1 -1
- package/dist/design-system/ui/card-label.md +56 -0
- package/dist/design-system/ui/card.md +1 -1
- package/dist/design-system/ui/checkbox.md +1 -1
- package/dist/design-system/ui/circled-check-button.md +1 -1
- package/dist/design-system/ui/command.md +1 -1
- package/dist/design-system/ui/dialog.md +1 -1
- package/dist/design-system/ui/dropdown-menu.md +1 -1
- package/dist/design-system/ui/file-uploader.md +1 -1
- package/dist/design-system/ui/form.md +1 -1
- package/dist/design-system/ui/highlight-text.md +1 -1
- package/dist/design-system/ui/icons.md +1 -1
- package/dist/design-system/ui/image.md +1 -1
- package/dist/design-system/ui/input.md +1 -1
- package/dist/design-system/ui/label.md +1 -1
- package/dist/design-system/ui/month-picker.md +1 -1
- package/dist/design-system/ui/multi-select.md +1 -1
- package/dist/design-system/ui/navigation-menu.md +1 -1
- package/dist/design-system/ui/popover.md +1 -1
- package/dist/design-system/ui/progress.md +1 -1
- package/dist/design-system/ui/radio-group.md +1 -1
- package/dist/design-system/ui/scroll-area.md +1 -1
- package/dist/design-system/ui/select.md +1 -1
- package/dist/design-system/ui/separator.md +1 -1
- package/dist/design-system/ui/simple-table.md +1 -1
- package/dist/design-system/ui/skeleton.md +1 -1
- package/dist/design-system/ui/slider.md +1 -1
- package/dist/design-system/ui/switch.md +1 -1
- package/dist/design-system/ui/symbols.md +1 -1
- package/dist/design-system/ui/tabs.md +1 -1
- package/dist/design-system/ui/tag.md +6 -4
- package/dist/design-system/ui/text.md +1 -1
- package/dist/design-system/ui/textarea.md +1 -1
- package/dist/design-system/ui/toast.md +1 -1
- package/dist/design-system/ui/toggle-group.md +2 -2
- package/dist/design-system/ui/toggle.md +1 -1
- package/dist/design-system/ui/tooltip.md +1 -1
- package/dist/design-system/usage.md +1 -1
- package/dist/design-system/when-to-use.md +3 -1
- package/dist/{event-asset-banner-CbhdfmpK.js → event-asset-banner-BW6nZaJq.js} +20 -27
- package/dist/event-asset-banner-m607rLD9.cjs +1 -0
- package/dist/event-card-580Y5jgk.js +137 -0
- package/dist/event-card-BlNRSE2x.cjs +1 -0
- package/dist/{lecturer-card-BlzA-YP6.js → lecturer-card-BBkqiic3.js} +4 -3
- package/dist/lecturer-card-C7E4UkU8.cjs +1 -0
- package/dist/{main-banner-image-BRLhiQJZ.js → main-banner-image-BYIEit_f.js} +33 -33
- package/dist/main-banner-image-By44s_XP.cjs +1 -0
- package/dist/{mobile-camp-card-B8rTQeTh.js → mobile-camp-card-1dxI-BCc.js} +28 -21
- package/dist/mobile-camp-card-D-5N6bex.cjs +1 -0
- package/dist/portfolio-asset-card-8mBpumTp.cjs +1 -0
- package/dist/{portfolio-asset-card-DEMARh53.js → portfolio-asset-card-mAkXH6Qc.js} +12 -11
- package/dist/{premium-card-CFQKDWqN.js → premium-card-CLC7dc-g.js} +48 -60
- package/dist/premium-card-CThRJYXd.cjs +1 -0
- package/dist/styles.css +1 -1
- package/dist/title-tag-card-C-AvnXtC.cjs +1 -0
- package/dist/{title-tag-card-Iowzns_v.js → title-tag-card-hb6ub3gc.js} +59 -81
- package/dist/tokens.cjs.js +1 -1
- package/dist/tokens.es.js +18 -11
- package/dist/types/article-asset-card.d.ts +7 -29
- package/dist/types/badge.d.ts +1 -1
- package/dist/types/button.d.ts +1 -1
- package/dist/types/card-label.d.ts +15 -0
- package/dist/types/components/dday-card.d.ts +2 -0
- package/dist/types/components.d.ts +32 -34
- package/dist/types/dday-card.d.ts +32 -0
- package/dist/types/event-asset-banner.d.ts +1 -1
- package/dist/types/event-card.d.ts +1 -3
- package/dist/types/tag.d.ts +2 -2
- package/dist/types/text.d.ts +2 -2
- package/dist/types/title-tag-card.d.ts +8 -1
- package/dist/types/tokens.d.ts +48 -33
- package/dist/types/tooltip.d.ts +1 -1
- package/dist/types/ui/card-label.d.ts +2 -0
- package/dist/types/ui.d.ts +14 -5
- package/dist/ui/accordion.cjs.js +1 -1
- package/dist/ui/accordion.es.js +1 -1
- package/dist/ui/alert-dialog.cjs.js +1 -1
- package/dist/ui/alert-dialog.es.js +1 -1
- package/dist/ui/anchor.cjs.js +1 -1
- package/dist/ui/anchor.es.js +1 -1
- package/dist/ui/avatar.cjs.js +1 -1
- package/dist/ui/avatar.es.js +1 -1
- package/dist/ui/badge.cjs.js +1 -1
- package/dist/ui/badge.es.js +1 -1
- package/dist/ui/button.cjs.js +1 -1
- package/dist/ui/button.es.js +1 -1
- package/dist/ui/calendar.cjs.js +1 -1
- package/dist/ui/calendar.es.js +1 -1
- package/dist/ui/callout.cjs.js +1 -1
- package/dist/ui/callout.es.js +1 -1
- package/dist/ui/card-label.cjs.js +1 -0
- package/dist/ui/card-label.es.js +27 -0
- package/dist/ui/card.cjs.js +1 -1
- package/dist/ui/card.es.js +1 -1
- package/dist/ui/checkbox.cjs.js +1 -1
- package/dist/ui/checkbox.es.js +1 -1
- package/dist/ui/command.cjs.js +1 -1
- package/dist/ui/command.es.js +1 -1
- package/dist/ui/dialog.cjs.js +1 -1
- package/dist/ui/dialog.es.js +1 -1
- package/dist/ui/dropdown-menu.cjs.js +1 -1
- package/dist/ui/dropdown-menu.es.js +1 -1
- package/dist/ui/file-uploader.cjs.js +1 -1
- package/dist/ui/file-uploader.es.js +1 -1
- package/dist/ui/form.cjs.js +1 -1
- package/dist/ui/form.es.js +1 -1
- package/dist/ui/icons.cjs.js +1 -1
- package/dist/ui/icons.es.js +1 -1
- package/dist/ui/image.cjs.js +1 -1
- package/dist/ui/image.es.js +1 -1
- package/dist/ui/input.cjs.js +1 -1
- package/dist/ui/input.es.js +1 -1
- package/dist/ui/label.cjs.js +1 -1
- package/dist/ui/label.es.js +1 -1
- package/dist/ui/month-picker.cjs.js +1 -1
- package/dist/ui/month-picker.es.js +1 -1
- package/dist/ui/multi-select.cjs.js +1 -1
- package/dist/ui/multi-select.es.js +1 -1
- package/dist/ui/navigation-menu.cjs.js +1 -1
- package/dist/ui/navigation-menu.es.js +1 -1
- package/dist/ui/popover.cjs.js +1 -1
- package/dist/ui/popover.es.js +1 -1
- package/dist/ui/progress.cjs.js +1 -1
- package/dist/ui/progress.es.js +3 -12
- package/dist/ui/radio-group.cjs.js +1 -1
- package/dist/ui/radio-group.es.js +1 -1
- package/dist/ui/scroll-area.cjs.js +1 -1
- package/dist/ui/scroll-area.es.js +1 -1
- package/dist/ui/select.cjs.js +1 -1
- package/dist/ui/select.es.js +1 -1
- package/dist/ui/separator.cjs.js +1 -1
- package/dist/ui/separator.es.js +1 -1
- package/dist/ui/simple-table.cjs.js +1 -1
- package/dist/ui/simple-table.es.js +1 -1
- package/dist/ui/skeleton.cjs.js +1 -1
- package/dist/ui/skeleton.es.js +1 -1
- package/dist/ui/slider.cjs.js +1 -1
- package/dist/ui/slider.es.js +1 -1
- package/dist/ui/switch.cjs.js +1 -1
- package/dist/ui/switch.es.js +1 -1
- package/dist/ui/tabs.cjs.js +1 -1
- package/dist/ui/tabs.es.js +1 -1
- package/dist/ui/tag.cjs.js +1 -1
- package/dist/ui/tag.es.js +6 -8
- package/dist/ui/text.cjs.js +1 -1
- package/dist/ui/text.es.js +1 -1
- package/dist/ui/textarea.cjs.js +1 -1
- package/dist/ui/textarea.es.js +1 -1
- package/dist/ui/toast.cjs.js +1 -1
- package/dist/ui/toast.es.js +1 -1
- package/dist/ui/toggle-group.cjs.js +1 -1
- package/dist/ui/toggle-group.es.js +1 -1
- package/dist/ui/toggle.cjs.js +1 -1
- package/dist/ui/toggle.es.js +1 -1
- package/dist/ui/tooltip.cjs.js +1 -1
- package/dist/ui/tooltip.es.js +1 -1
- package/dist/ui.cjs.js +1 -1
- package/dist/ui.es.js +157 -155
- package/dist/utils-CvQG8ZyC.js +36 -0
- package/dist/utils-DDqioO-T.cjs +1 -0
- package/dist/youtube-video-modal-CNTPCinc.cjs +1 -0
- package/dist/{youtube-video-modal-B_vy97Tt.js → youtube-video-modal-CrkV3YQc.js} +4 -3
- package/package.json +1 -1
- package/dist/article-asset-card-CGSemovn.cjs +0 -1
- package/dist/article-asset-card-D1Ipe86b.js +0 -97
- package/dist/camp-card-BRs3koNF.cjs +0 -1
- package/dist/common-C3JaD1vJ.js +0 -25
- package/dist/common-Ds1lanOg.cjs +0 -1
- package/dist/company-info-card-C00gMHAv.cjs +0 -1
- package/dist/event-asset-banner-BRsgu3Hc.cjs +0 -1
- package/dist/event-card-C1mSACOR.js +0 -158
- package/dist/event-card-DebLbRKd.cjs +0 -1
- package/dist/index-0QN4lVFQ.js +0 -130
- package/dist/index-B8SY6s5B.cjs +0 -1
- package/dist/index-DWvwbdTU.js +0 -44
- package/dist/index-Dhd1jlaC.cjs +0 -1
- package/dist/lecturer-card-CgSWLJ8r.cjs +0 -1
- package/dist/main-banner-image-Bh3AZqac.cjs +0 -1
- package/dist/mobile-camp-card-B4L0Eq0v.cjs +0 -1
- package/dist/portfolio-asset-card-BdS7kkkT.cjs +0 -1
- package/dist/premium-card-1vtWPIUr.cjs +0 -1
- package/dist/title-tag-card-MFpE2-Nb.cjs +0 -1
- package/dist/utils-B1DD9KJ8.js +0 -42
- package/dist/utils-B5U1QyKF.cjs +0 -1
- 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
|
-
|
|
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 =
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
42
|
-
import { d as
|
|
43
|
-
function
|
|
44
|
-
return /* @__PURE__ */
|
|
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:
|
|
49
|
-
backgroundColor:
|
|
50
|
-
border: `1px solid ${
|
|
49
|
+
color: r.color,
|
|
50
|
+
backgroundColor: r.background,
|
|
51
|
+
border: `1px solid ${r.border ?? "transparent"}`
|
|
51
52
|
},
|
|
52
|
-
className:
|
|
53
|
-
children:
|
|
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
|
|
58
|
-
return /* @__PURE__ */
|
|
58
|
+
function u(r, t = "sm") {
|
|
59
|
+
return t === "ad" ? /* @__PURE__ */ e(
|
|
59
60
|
Q,
|
|
60
61
|
{
|
|
61
62
|
style: {
|
|
62
|
-
background:
|
|
63
|
-
color:
|
|
64
|
-
border: `1px solid ${
|
|
63
|
+
background: r.background,
|
|
64
|
+
color: r.color,
|
|
65
|
+
border: `1px solid ${r.border ?? r.background ?? "transparent"}`
|
|
65
66
|
},
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
|
74
|
-
brandName:
|
|
75
|
-
title:
|
|
84
|
+
function Kr({
|
|
85
|
+
brandName: r,
|
|
86
|
+
title: t,
|
|
76
87
|
batchName: f = "",
|
|
77
|
-
imageUrl:
|
|
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:
|
|
86
|
-
earlyBirdTuition:
|
|
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:
|
|
93
|
-
statusBadge:
|
|
103
|
+
tags: n = [],
|
|
104
|
+
statusBadge: s,
|
|
94
105
|
adBadge: m,
|
|
95
|
-
adTitle:
|
|
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:
|
|
113
|
+
imageWrapper: d,
|
|
103
114
|
imagePriority: q,
|
|
104
115
|
imageLoading: z,
|
|
105
116
|
imageFetchPriority: F,
|
|
106
117
|
imageDecoding: G
|
|
107
118
|
}) {
|
|
108
|
-
const H =
|
|
119
|
+
const H = V({
|
|
109
120
|
imagePriority: q,
|
|
110
121
|
imageLoading: z,
|
|
111
122
|
imageFetchPriority: F,
|
|
112
123
|
imageDecoding: G
|
|
113
|
-
}), J = `${
|
|
114
|
-
tuition:
|
|
124
|
+
}), J = `${t} ${f || ""}`.trim(), K = x ?? L ?? X({
|
|
125
|
+
tuition: k ?? void 0,
|
|
115
126
|
isFree: T,
|
|
116
|
-
earlyBirdTuition:
|
|
127
|
+
earlyBirdTuition: y ?? void 0,
|
|
117
128
|
earlyBirdEndDate: C ?? void 0
|
|
118
|
-
}), M = v ??
|
|
129
|
+
}), M = v ?? Y({
|
|
119
130
|
onoffText: $,
|
|
120
131
|
cityLabels: j,
|
|
121
132
|
format: "desktop"
|
|
122
|
-
}), O = w ??
|
|
133
|
+
}), O = w ?? Z({
|
|
123
134
|
startDate: b,
|
|
124
135
|
endDate: N,
|
|
125
136
|
period: g
|
|
126
|
-
}), l =
|
|
137
|
+
}), l = a ? /* @__PURE__ */ e("button", { type: "button", className: "absolute inset-0", children: /* @__PURE__ */ e(
|
|
127
138
|
"img",
|
|
128
139
|
{
|
|
129
|
-
src:
|
|
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__ */
|
|
146
|
+
return /* @__PURE__ */ o(
|
|
136
147
|
"div",
|
|
137
148
|
{
|
|
138
|
-
className:
|
|
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__ */
|
|
145
|
-
/* @__PURE__ */
|
|
146
|
-
l ?
|
|
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__ */
|
|
149
|
-
|
|
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 ?
|
|
164
|
+
m ? u(m, "ad") : null,
|
|
154
165
|
D
|
|
155
166
|
] }),
|
|
156
|
-
/* @__PURE__ */
|
|
157
|
-
/* @__PURE__ */
|
|
158
|
-
/* @__PURE__ */
|
|
159
|
-
/* @__PURE__ */
|
|
160
|
-
S &&
|
|
161
|
-
|
|
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__ */
|
|
164
|
-
/* @__PURE__ */
|
|
165
|
-
/* @__PURE__ */
|
|
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__ */
|
|
178
|
+
/* @__PURE__ */ e("span", { children: M })
|
|
168
179
|
] }),
|
|
169
|
-
/* @__PURE__ */
|
|
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
|
-
|
|
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-
|
|
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
|
|
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
|
-
|
|
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-
|
|
1
|
+
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../article-asset-card-DRRl2BH8.cjs");exports.ArticleAssetCard=e.ArticleAssetCard;
|