@yeongseoksong/framework 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -38,22 +38,41 @@ export default function RootLayout({ children }: { children: React.ReactNode })
38
38
  }
39
39
  ```
40
40
 
41
- ### 2. 회사명 설정
41
+ ### 2. 환경변수 설정
42
42
 
43
- `%c` 토큰을 회사명으로 치환합니다.진입점에서 번만 호출합니다.
43
+ 소비자별 상수는 환경변수로 주입합니다.루트에 `.env.local`을 만드세요.
44
44
 
45
- ```ts
46
- import { setCompanyName } from '@yeongseoksong/framework/util'
45
+ ```bash
46
+ # [필수] SdText/SdTitle 문자열의 %c 토큰이 이 값으로 치환됩니다.
47
+ NEXT_PUBLIC_COMPANY_NAME=내 회사
47
48
 
48
- setCompanyName('내 회사')
49
+ # [선택] 헤더 로고. 기본값: /logo.svg, "로고"
50
+ NEXT_PUBLIC_LOGO_SRC=/logo.svg
51
+ NEXT_PUBLIC_LOGO_ALT=내 회사 로고
49
52
  ```
50
53
 
54
+ 값은 빌드 시점에 번들로 인라인되므로 **런타임에 바꿀 수 없고**, 비밀값을 넣어서도 안 됩니다.
55
+
56
+ `NEXT_PUBLIC_COMPANY_NAME`이 없으면 `%c`가 빈 문자열로 치환됩니다. 누락을 배포 전에 잡으려면 `next.config.mjs`에서 검증하세요:
57
+
58
+ ```js
59
+ // env.mjs
60
+ if (!process.env.NEXT_PUBLIC_COMPANY_NAME) {
61
+ throw new Error('NEXT_PUBLIC_COMPANY_NAME이 설정되지 않았습니다.')
62
+ }
63
+
64
+ // next.config.mjs
65
+ import './env.mjs'
66
+ ```
67
+
68
+ `navItems` / `companyInfo`처럼 배열·객체인 값은 환경변수로 담을 수 없으므로 `MainLayout`에 prop으로 넘깁니다 (아래 MainLayout 항목 참고).
69
+
51
70
  ## 임포트 경로
52
71
 
53
72
  | 경로 | 내용 |
54
73
  |---|---|
55
74
  | `@yeongseoksong/framework/ui` | UI 컴포넌트 전체 + `theme` (`"use client"`) |
56
- | `@yeongseoksong/framework/util` | `t()`, `setCompanyName()` |
75
+ | `@yeongseoksong/framework/util` | `t()`, `COMPANY_NAME`, `LOGO_SRC`, `LOGO_ALT` |
57
76
  | `@yeongseoksong/framework/types` | 공유 인터페이스 |
58
77
 
59
78
  ---
@@ -102,7 +121,7 @@ import { SdText, SdTitle } from '@yeongseoksong/framework/ui'
102
121
  <SdText.Error>필수 항목입니다.</SdText.Error>
103
122
  <SdText.Hint>최대 100자까지 입력 가능합니다.</SdText.Hint>
104
123
 
105
- {/* %c → setCompanyName()으로 설정한 회사명으로 치환됨 */}
124
+ {/* %c → NEXT_PUBLIC_COMPANY_NAME 값으로 치환됨 */}
106
125
  <SdText.Body>%c 서비스에 오신 것을 환영합니다.</SdText.Body>
107
126
  ```
108
127
 
@@ -338,15 +357,19 @@ export default function Page() {
338
357
 
339
358
  ### t() — 회사명 치환
340
359
 
341
- ```ts
342
- import { t, setCompanyName } from '@yeongseoksong/framework/util'
360
+ `NEXT_PUBLIC_COMPANY_NAME=내 회사` 일 때:
343
361
 
344
- setCompanyName('내 회사')
362
+ ```ts
363
+ import { t } from '@yeongseoksong/framework/util'
345
364
 
346
365
  t('%c 서비스') // → '내 회사 서비스'
347
366
  t('%c에 오신 것을 환영합니다') // → '내 회사에 오신 것을 환영합니다'
348
367
  ```
349
368
 
369
+ `SdText`/`SdTitle`은 문자열 children에 `t()`를 자동으로 적용하므로 직접 호출할 일은 드뭅니다.
370
+
371
+ > `setCompanyName()`은 **deprecated이며 2.0.0에서 제거됩니다.** tsup이 `ui`와 `util`을 별개 번들로 빌드하면서 `text.util`이 `dist/ui`에 인라인 복사되기 때문에, 이 함수로 값을 바꿔도 `t()`를 실제로 호출하는 `SdText`/`SdTitle`은 다른 사본을 읽습니다. 즉 처음부터 동작하지 않았습니다. 환경변수는 번들러가 양쪽 번들에 동일한 리터럴을 박아넣으므로 이 문제가 없습니다.
372
+
350
373
  ---
351
374
 
352
375
  ## 타입
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+
16
+ // types/index.ts
17
+ var types_exports = {};
18
+ module.exports = __toCommonJS(types_exports);
@@ -1,22 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
2
 
3
- declare const navItems: NavItem[];
4
- declare const heroSlides: HeroSlide[];
5
- declare const featureItems: FeatureItem[];
6
- declare const serviceItems: FeatureItem[];
7
- declare const timelineEvents: TimelineEvent[];
8
- declare const ceoMessage: {
9
- lines: string[];
10
- name: string;
11
- role: string;
12
- };
13
- declare const testimonialItems: TestimonialItem[];
14
- declare const pricingItems: PricingItem[];
15
- declare const faqItems: FaqItem[];
16
- declare const solutionItems: SolutionItem[];
17
- declare const clientItems: ClientItem[];
18
- declare const companyInfo: CompanyInfo;
19
-
20
3
  interface CommonInfo {
21
4
  id: number;
22
5
  order: number;
@@ -112,4 +95,4 @@ interface SolutionItem extends CommonInfo {
112
95
  icon?: ReactNode;
113
96
  }
114
97
 
115
- export { type ClientItem, type CommonInfo, type CompanyAddress, type CompanyInfo, type FaqItem, type FeatureItem, type HeroCta, type HeroSlide, type NavItem, type PricingFeature, type PricingItem, type SolutionItem, type StepItem, type TestimonialItem, type TimelineEvent, ceoMessage, clientItems, companyInfo, faqItems, featureItems, heroSlides, navItems, pricingItems, serviceItems, solutionItems, testimonialItems, timelineEvents };
98
+ export type { ClientItem, CommonInfo, CompanyAddress, CompanyInfo, FaqItem, FeatureItem, HeroCta, HeroSlide, NavItem, PricingFeature, PricingItem, SolutionItem, StepItem, TestimonialItem, TimelineEvent };
@@ -1,22 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
2
 
3
- declare const navItems: NavItem[];
4
- declare const heroSlides: HeroSlide[];
5
- declare const featureItems: FeatureItem[];
6
- declare const serviceItems: FeatureItem[];
7
- declare const timelineEvents: TimelineEvent[];
8
- declare const ceoMessage: {
9
- lines: string[];
10
- name: string;
11
- role: string;
12
- };
13
- declare const testimonialItems: TestimonialItem[];
14
- declare const pricingItems: PricingItem[];
15
- declare const faqItems: FaqItem[];
16
- declare const solutionItems: SolutionItem[];
17
- declare const clientItems: ClientItem[];
18
- declare const companyInfo: CompanyInfo;
19
-
20
3
  interface CommonInfo {
21
4
  id: number;
22
5
  order: number;
@@ -112,4 +95,4 @@ interface SolutionItem extends CommonInfo {
112
95
  icon?: ReactNode;
113
96
  }
114
97
 
115
- export { type ClientItem, type CommonInfo, type CompanyAddress, type CompanyInfo, type FaqItem, type FeatureItem, type HeroCta, type HeroSlide, type NavItem, type PricingFeature, type PricingItem, type SolutionItem, type StepItem, type TestimonialItem, type TimelineEvent, ceoMessage, clientItems, companyInfo, faqItems, featureItems, heroSlides, navItems, pricingItems, serviceItems, solutionItems, testimonialItems, timelineEvents };
98
+ export type { ClientItem, CommonInfo, CompanyAddress, CompanyInfo, FaqItem, FeatureItem, HeroCta, HeroSlide, NavItem, PricingFeature, PricingItem, SolutionItem, StepItem, TestimonialItem, TimelineEvent };
@@ -1,386 +0,0 @@
1
- // types/example.tsx
2
- var navItems = [
3
- { id: 1, order: 1, isShow: true, label: "\uC18C\uAC1C", href: "/about" },
4
- { id: 11, order: 1, isShow: true, label: "\uD68C\uC0AC\uC18C\uAC1C", href: "/about/company", parentId: 1 },
5
- { id: 12, order: 2, isShow: true, label: "\uD300\uC18C\uAC1C", href: "/about/team", parentId: 1 },
6
- { id: 2, order: 2, isShow: true, label: "\uC11C\uBE44\uC2A4", href: "/services" },
7
- { id: 3, order: 3, isShow: true, label: "\uC194\uB8E8\uC158", href: "/solutions" },
8
- { id: 4, order: 4, isShow: true, label: "\uC0C1\uC138\uBCF4\uAE30", href: "/solutions/detail" },
9
- { id: 5, order: 5, isShow: true, label: "\uAE30\uD0C0\uD14C\uC2A4\uD2B8", href: "/solutions/detail" },
10
- { id: 15, order: 1, isShow: true, label: "\uAE30\uD0C0\uD14C\uC2A4\uD2B8", href: "/solutions/detail", parentId: 5 },
11
- { id: 16, order: 2, isShow: true, label: "\uAE30\uD0C0\uD14C\uC2A4\uD2B8", href: "/solutions/detail", parentId: 5 },
12
- { id: 6, order: 6, isShow: true, label: "\uC694\uAE08\uC81C", href: "/pricing" }
13
- ];
14
- var heroSlides = [
15
- {
16
- id: 1,
17
- order: 10,
18
- isShow: true,
19
- image: "https://images.unsplash.com/photo-1497366754035-f200968a6e72?w=1600&q=80",
20
- title: "\uC5C5\uBB34\uB97C \uB354 \uC2A4\uB9C8\uD2B8\uD558\uAC8C, %c",
21
- description: "ASM\uACFC PIMS\uB85C \uC790\uC0B0 \uAD00\uB9AC\uBD80\uD130 \uD504\uB85C\uC81D\uD2B8 \uC6B4\uC601\uAE4C\uC9C0 \u2014 \uD558\uB098\uC758 \uD50C\uB7AB\uD3FC\uC73C\uB85C \uBAA8\uB4E0 \uC5C5\uBB34 \uD750\uB984\uC744 \uC5F0\uACB0\uD558\uC138\uC694."
22
- },
23
- {
24
- id: 2,
25
- order: 1,
26
- isShow: true,
27
- image: "https://images.unsplash.com/photo-1497366754035-f200968a6e72?w=1600&q=80",
28
- title: "\uC5C5\uBB34\uB97C \uB354 \uC2A4\uB9C8\uD2B8\uD558\uAC8C, %c",
29
- description: "ASM\uACFC PIMS\uB85C \uC790\uC0B0 \uAD00\uB9AC\uBD80\uD130 \uD504\uB85C\uC81D\uD2B8 \uC6B4\uC601\uAE4C\uC9C0 \u2014 \uD558\uB098\uC758 \uD50C\uB7AB\uD3FC\uC73C\uB85C \uC5F0\uACB0\uD558\uC138\uC694.",
30
- ctas: [
31
- { label: "\uBB34\uB8CC \uCCB4\uD5D8 \uC2DC\uC791", href: "/pricing", icon: false },
32
- // variant 생략 → primary
33
- { label: "\uB3C4\uC785 \uBB38\uC758\uD558\uAE30", href: "/contact", variant: "secondary", icon: true }
34
- ]
35
- },
36
- {
37
- id: 2,
38
- order: 2,
39
- isShow: true,
40
- image: "https://images.unsplash.com/photo-1497366754035-f200968a6e72?w=1600&q=80",
41
- title: "\uC790\uC0B0\uC744 \uD55C\uB208\uC5D0, \uC2A4\uB9C8\uD2B8 \uC790\uC0B0 \uAD00\uB9AC",
42
- description: "\uC7A5\uBE44\xB7\uC124\uBE44\xB7IT \uC790\uC0B0\uC758 \uC218\uBA85 \uC8FC\uAE30\uB97C \uC790\uB3D9\uC73C\uB85C \uCD94\uC801\uD558\uACE0 \uC720\uC9C0\uBCF4\uC218 \uC77C\uC815\uC744 \uAD00\uB9AC\uD558\uC138\uC694."
43
- // ctaLabel 없으면 버튼 미노출
44
- }
45
- ];
46
- var featureItems = [
47
- {
48
- id: 1,
49
- order: 1,
50
- isShow: true,
51
- label: "\uC790\uC0B0 \uAD00\uB9AC",
52
- title: "\uC2A4\uB9C8\uD2B8 \uC790\uC0B0 \uCD94\uC801",
53
- description: "\uC7A5\uBE44\xB7\uC124\uBE44\xB7IT \uC790\uC0B0\uC758 \uC218\uBA85 \uC8FC\uAE30\uB97C \uC790\uB3D9\uC73C\uB85C \uCD94\uC801\uD558\uACE0 \uC720\uC9C0\uBCF4\uC218 \uC77C\uC815\uC744 \uAD00\uB9AC\uD558\uC138\uC694."
54
- },
55
- {
56
- id: 2,
57
- order: 2,
58
- isShow: true,
59
- label: "\uD504\uB85C\uC81D\uD2B8",
60
- title: "\uC77C\uC815 & \uB9AC\uC18C\uC2A4 \uAD00\uB9AC",
61
- description: "WBS\xB7\uC77C\uC815\xB7\uB9AC\uC18C\uC2A4\xB7\uBE44\uC6A9\uC744 \uD55C \uD654\uBA74\uC5D0\uC11C \uAD00\uB9AC\uD558\uACE0 AI\uAC00 \uB9AC\uC2A4\uD06C\uB97C \uC0AC\uC804\uC5D0 \uAC10\uC9C0\uD569\uB2C8\uB2E4."
62
- },
63
- {
64
- id: 3,
65
- order: 3,
66
- isShow: true,
67
- label: "\uB300\uC2DC\uBCF4\uB4DC",
68
- title: "\uC2E4\uC2DC\uAC04 \uD604\uD669 \uD30C\uC545",
69
- description: "\uC870\uC9C1 \uC804\uCCB4\uC758 \uC790\uC0B0 \uD604\uD669\uACFC \uD504\uB85C\uC81D\uD2B8 \uC9C4\uD589\uB960\uC744 \uD558\uB098\uC758 \uB300\uC2DC\uBCF4\uB4DC\uC5D0\uC11C \uD655\uC778\uD558\uC138\uC694."
70
- },
71
- {
72
- id: 4,
73
- order: 4,
74
- isShow: true,
75
- label: "\uD611\uC5C5",
76
- title: "\uD300 \uD611\uC5C5 \uAC15\uD654",
77
- description: "\uBD80\uC11C \uAC04 \uC5C5\uBB34 \uC694\uCCAD\uACFC \uC2B9\uC778 \uD750\uB984\uC744 \uC790\uB3D9\uD654\uD558\uC5EC \uCEE4\uBBA4\uB2C8\uCF00\uC774\uC158 \uBE44\uC6A9\uC744 \uC904\uC785\uB2C8\uB2E4."
78
- },
79
- {
80
- id: 5,
81
- order: 5,
82
- isShow: true,
83
- label: "\uBCF4\uC548",
84
- title: "\uC5D4\uD130\uD504\uB77C\uC774\uC988 \uBCF4\uC548",
85
- description: "\uC5ED\uD560 \uAE30\uBC18 \uC811\uADFC \uC81C\uC5B4\uC640 \uAC10\uC0AC \uB85C\uADF8\uB85C \uB370\uC774\uD130 \uBCF4\uC548 \uC694\uAC74\uC744 \uCDA9\uC871\uD569\uB2C8\uB2E4."
86
- },
87
- {
88
- id: 6,
89
- order: 6,
90
- isShow: true,
91
- label: "\uC5F0\uB3D9",
92
- title: "\uAE30\uC874 \uC2DC\uC2A4\uD15C \uC5F0\uB3D9",
93
- description: "ERP\xB7HR\xB7\uD68C\uACC4 \uC2DC\uC2A4\uD15C\uACFC API\uB85C \uC5F0\uACB0\uD558\uC5EC \uB370\uC774\uD130\uB97C \uC77C\uC6D0\uD654\uD558\uC138\uC694."
94
- }
95
- ];
96
- var serviceItems = [
97
- {
98
- id: 1,
99
- order: 1,
100
- isShow: true,
101
- label: "\uCEE8\uC124\uD305",
102
- title: "IT \uC804\uB7B5 \uCEE8\uC124\uD305",
103
- description: "\uC5C5\uBB34 \uD504\uB85C\uC138\uC2A4\uB97C \uBD84\uC11D\uD558\uACE0 \uCD5C\uC801\uC758 \uB514\uC9C0\uD138 \uC804\uD658 \uB85C\uB4DC\uB9F5\uC744 \uC218\uB9BD\uD569\uB2C8\uB2E4."
104
- },
105
- {
106
- id: 2,
107
- order: 2,
108
- isShow: true,
109
- label: "\uAD6C\uCD95",
110
- title: "\uC2DC\uC2A4\uD15C \uAD6C\uCD95 \xB7 \uCEE4\uC2A4\uD130\uB9C8\uC774\uC9D5",
111
- description: "\uACE0\uAC1D\uC0AC \uD658\uACBD\uC5D0 \uB9DE\uAC8C ASM\xB7PIMS\uB97C \uCEE4\uC2A4\uD130\uB9C8\uC774\uC9D5\uD558\uACE0 \uC548\uC815\uC801\uC73C\uB85C \uAD6C\uCD95\uD569\uB2C8\uB2E4."
112
- },
113
- {
114
- id: 3,
115
- order: 3,
116
- isShow: true,
117
- label: "\uAD50\uC721",
118
- title: "\uC0AC\uC6A9\uC790 \uAD50\uC721 \xB7 \uC628\uBCF4\uB529",
119
- description: "\uD604\uC7A5 \uB2F4\uB2F9\uC790\uBD80\uD130 \uAD00\uB9AC\uC790\uAE4C\uC9C0 \uC5ED\uD560\uBCC4 \uB9DE\uCDA4 \uAD50\uC721\uC73C\uB85C \uBE60\uB978 \uC815\uCC29\uC744 \uB3D5\uC2B5\uB2C8\uB2E4."
120
- },
121
- {
122
- id: 4,
123
- order: 4,
124
- isShow: true,
125
- label: "\uC720\uC9C0\uBCF4\uC218",
126
- title: "\uC6B4\uC601 \xB7 \uC720\uC9C0\uBCF4\uC218",
127
- description: "\uC804\uB2F4 \uAE30\uC220\uC9C0\uC6D0\uD300\uC774 \uC7A5\uC560 \uB300\uC751\uBD80\uD130 \uC815\uAE30 \uC810\uAC80\uAE4C\uC9C0 \uC6B4\uC601 \uC804\uBC18\uC744 \uCC45\uC784\uC9D1\uB2C8\uB2E4."
128
- },
129
- {
130
- id: 5,
131
- order: 5,
132
- isShow: true,
133
- label: "\uC5F0\uB3D9",
134
- title: "ERP \xB7 \uB808\uAC70\uC2DC \uC5F0\uB3D9",
135
- description: "\uAE30\uC874 ERP\xB7HR\xB7\uD68C\uACC4 \uC2DC\uC2A4\uD15C\uACFC API \uC5F0\uB3D9\uC73C\uB85C \uB370\uC774\uD130 \uB2E8\uC808 \uC5C6\uC774 \uC5F0\uACB0\uD569\uB2C8\uB2E4."
136
- },
137
- {
138
- id: 6,
139
- order: 6,
140
- isShow: true,
141
- label: "\uD074\uB77C\uC6B0\uB4DC",
142
- title: "\uD074\uB77C\uC6B0\uB4DC \uB9C8\uC774\uADF8\uB808\uC774\uC158",
143
- description: "\uC628\uD504\uB808\uBBF8\uC2A4 \uD658\uACBD\uC744 \uD074\uB77C\uC6B0\uB4DC\uB85C \uC548\uC804\uD558\uAC8C \uC774\uC804\uD558\uACE0 \uC778\uD504\uB77C \uBE44\uC6A9\uC744 \uCD5C\uC801\uD654\uD569\uB2C8\uB2E4."
144
- }
145
- ];
146
- var timelineEvents = [
147
- { id: 1, order: 1, isShow: true, year: 2024, month: 11, description: "\uAE30\uC5C5 \uBD80\uC124 \uC5F0\uAD6C\uC18C \uC124\uB9BD" },
148
- { id: 2, order: 2, isShow: true, year: 2024, month: 8, description: "PIMS v2.0 \uC815\uC2DD \uCD9C\uC2DC" },
149
- { id: 3, order: 3, isShow: true, year: 2024, month: 3, description: "\uACF5\uACF5\uAE30\uAD00 ASM \uACF5\uAE09 \uACC4\uC57D \uCCB4\uACB0" },
150
- { id: 4, order: 4, isShow: true, year: 2023, month: 10, description: "ISO 27001 \uC815\uBCF4\uBCF4\uC548 \uC778\uC99D \uCDE8\uB4DD" },
151
- { id: 5, order: 5, isShow: true, year: 2023, month: 6, description: "ASM \uBAA8\uBC14\uC77C \uC571 \uCD9C\uC2DC (iOS\xB7Android)" },
152
- { id: 6, order: 6, isShow: true, year: 2023, month: 2, description: "\uC2DC\uB9AC\uC988 A \uD22C\uC790 \uC720\uCE58" },
153
- { id: 7, order: 7, isShow: true, year: 2022, month: 9, description: "PIMS(\uD504\uB85C\uC81D\uD2B8 \uAD00\uB9AC \uC2DC\uC2A4\uD15C) \uB860\uCE6D" },
154
- { id: 8, order: 8, isShow: true, year: 2022, month: 4, description: "\uBCA4\uCC98\uAE30\uC5C5 \uC778\uC99D" },
155
- { id: 9, order: 9, isShow: true, year: 2021, month: 7, description: "ASM(\uC790\uC0B0 \uAD00\uB9AC \uC2DC\uC2A4\uD15C) \uBCA0\uD0C0 \uC11C\uBE44\uC2A4 \uAC1C\uC2DC" },
156
- { id: 10, order: 10, isShow: true, year: 2021, month: 3, description: "\uBC95\uC778 \uC124\uB9BD" }
157
- ];
158
- var ceoMessage = {
159
- lines: [
160
- "\uC800\uD76C \uD68C\uC0AC\uB294 \uACE0\uAC1D\uC758 \uC2E0\uB8B0\uB97C \uCD5C\uC6B0\uC120\uC73C\uB85C \uC0DD\uAC01\uD569\uB2C8\uB2E4.",
161
- "\uB04A\uC784\uC5C6\uB294 \uD601\uC2E0\uACFC \uB3C4\uC804\uC744 \uD1B5\uD574 \uB354 \uB098\uC740 \uB0B4\uC77C\uC744 \uB9CC\uB4E4\uC5B4 \uAC00\uACA0\uC2B5\uB2C8\uB2E4.",
162
- "\uACE0\uAC1D \uC5EC\uB7EC\uBD84\uC758 \uC131\uACF5\uC774 \uACE7 \uC800\uD76C\uC758 \uC131\uACF5\uC774\uBA70, \uC55E\uC73C\uB85C\uB3C4 \uBCC0\uD568\uC5C6\uC774 \uD568\uAED8\uD558\uACA0\uC2B5\uB2C8\uB2E4."
163
- ],
164
- name: "\uD64D\uAE38\uB3D9",
165
- role: "\uB300\uD45C\uC774\uC0AC"
166
- };
167
- var testimonialItems = [
168
- {
169
- lines: [
170
- "\uB3C4\uC785 \uC774\uD6C4 \uC790\uC0B0 \uAD00\uB9AC \uC5C5\uBB34 \uD6A8\uC728\uC774 40% \uD5A5\uC0C1\uB410\uC2B5\uB2C8\uB2E4.",
171
- "\uC9C0\uC6D0\uD300\uC758 \uC751\uB300\uB3C4 \uB9E4\uC6B0 \uBE60\uB974\uACE0 \uCE5C\uC808\uD569\uB2C8\uB2E4."
172
- ],
173
- name: "\uAE40\uBBFC\uC900",
174
- role: "IT \uC778\uD504\uB77C \uD300\uC7A5",
175
- company: "\uD55C\uAD6D\uC81C\uC870 \uC8FC\uC2DD\uD68C\uC0AC",
176
- rating: 5
177
- },
178
- {
179
- lines: [
180
- "\uAE30\uC874 ERP\uC640 \uC5F0\uB3D9\uC774 \uAE54\uB054\uD558\uAC8C \uB418\uC5B4 \uB370\uC774\uD130 \uC774\uC911 \uC785\uB825\uC774 \uC0AC\uB77C\uC84C\uC2B5\uB2C8\uB2E4.",
181
- "\uC9C1\uAD00\uC801\uC778 UI \uB355\uBD84\uC5D0 \uC9C1\uC6D0\uB4E4\uB3C4 \uBE60\uB974\uAC8C \uC801\uC751\uD588\uC5B4\uC694."
182
- ],
183
- name: "\uC774\uC218\uC9C4",
184
- role: "\uACBD\uC601\uC9C0\uC6D0 \uD300\uC7A5",
185
- company: "\uAE00\uB85C\uBC8C\uD14C\uD06C \uC8FC\uC2DD\uD68C\uC0AC",
186
- rating: 5
187
- },
188
- {
189
- lines: [
190
- "\uD504\uB85C\uC81D\uD2B8 \uB0A9\uAE30 \uC900\uC218\uC728\uC774 \uB208\uC5D0 \uB744\uAC8C \uC62C\uB790\uC2B5\uB2C8\uB2E4.",
191
- "\uB9AC\uC18C\uC2A4 \uBC30\uBD84 \uBDF0\uAC00 \uD2B9\uD788 \uC720\uC6A9\uD569\uB2C8\uB2E4."
192
- ],
193
- name: "\uBC15\uC131\uD638",
194
- role: "PMO \uC2E4\uC7A5",
195
- company: "\uBBF8\uB798\uAC74\uC124 \uC8FC\uC2DD\uD68C\uC0AC",
196
- rating: 4
197
- }
198
- ];
199
- var pricingItems = [
200
- {
201
- name: "\uC2A4\uD0C0\uD130",
202
- price: "\u20A9290,000",
203
- period: "\uC6D4",
204
- description: "\uC18C\uADDC\uBAA8 \uD300\uC744 \uC704\uD55C \uC785\uBB38 \uD50C\uB79C",
205
- features: [
206
- { text: "\uC0AC\uC6A9\uC790 \uCD5C\uB300 10\uBA85", included: true },
207
- { text: "\uC790\uC0B0 \uB4F1\uB85D \uCD5C\uB300 500\uAC74", included: true },
208
- { text: "\uAE30\uBCF8 \uB300\uC2DC\uBCF4\uB4DC", included: true },
209
- { text: "\uC774\uBA54\uC77C \uC9C0\uC6D0", included: true },
210
- { text: "API \uC5F0\uB3D9", included: false },
211
- { text: "\uCEE4\uC2A4\uD140 \uBCF4\uACE0\uC11C", included: false },
212
- { text: "\uC804\uB2F4 \uC9C0\uC6D0 \uB9E4\uB2C8\uC800", included: false }
213
- ],
214
- ctaLabel: "\uBB34\uB8CC\uB85C \uC2DC\uC791\uD558\uAE30"
215
- },
216
- {
217
- name: "\uD504\uB85C",
218
- price: "\u20A9690,000",
219
- period: "\uC6D4",
220
- description: "\uC131\uC7A5\uD558\uB294 \uD300\uC744 \uC704\uD55C \uD575\uC2EC \uD50C\uB79C",
221
- features: [
222
- { text: "\uC0AC\uC6A9\uC790 \uCD5C\uB300 50\uBA85", included: true },
223
- { text: "\uC790\uC0B0 \uB4F1\uB85D \uBB34\uC81C\uD55C", included: true },
224
- { text: "\uACE0\uAE09 \uB300\uC2DC\uBCF4\uB4DC & \uBD84\uC11D", included: true },
225
- { text: "\uC6B0\uC120 \uC774\uBA54\uC77C\xB7\uC804\uD654 \uC9C0\uC6D0", included: true },
226
- { text: "API \uC5F0\uB3D9", included: true },
227
- { text: "\uCEE4\uC2A4\uD140 \uBCF4\uACE0\uC11C", included: true },
228
- { text: "\uC804\uB2F4 \uC9C0\uC6D0 \uB9E4\uB2C8\uC800", included: false }
229
- ],
230
- ctaLabel: "14\uC77C \uBB34\uB8CC \uCCB4\uD5D8",
231
- isPopular: true
232
- },
233
- {
234
- name: "\uC5D4\uD130\uD504\uB77C\uC774\uC988",
235
- price: "\uBB38\uC758",
236
- description: "\uB300\uADDC\uBAA8 \uC870\uC9C1\uC744 \uC704\uD55C \uB9DE\uCDA4 \uD50C\uB79C",
237
- features: [
238
- { text: "\uC0AC\uC6A9\uC790 \uBB34\uC81C\uD55C", included: true },
239
- { text: "\uC790\uC0B0 \uB4F1\uB85D \uBB34\uC81C\uD55C", included: true },
240
- { text: "\uC804\uC6A9 \uB300\uC2DC\uBCF4\uB4DC \uAD6C\uC131", included: true },
241
- { text: "24/7 \uC804\uC6A9 \uAE30\uC220 \uC9C0\uC6D0", included: true },
242
- { text: "API & \uB808\uAC70\uC2DC \uC5F0\uB3D9", included: true },
243
- { text: "\uCEE4\uC2A4\uD140 \uBCF4\uACE0\uC11C", included: true },
244
- { text: "\uC804\uB2F4 \uC9C0\uC6D0 \uB9E4\uB2C8\uC800", included: true }
245
- ],
246
- ctaLabel: "\uB3C4\uC785 \uBB38\uC758\uD558\uAE30"
247
- }
248
- ];
249
- var faqItems = [
250
- {
251
- question: "\uBB34\uB8CC \uCCB4\uD5D8 \uAE30\uAC04\uC774 \uC788\uB098\uC694?",
252
- answer: "\uD504\uB85C \uD50C\uB79C\uC740 \uC2E0\uC6A9\uCE74\uB4DC \uC5C6\uC774 14\uC77C \uBB34\uB8CC \uCCB4\uD5D8\uC774 \uAC00\uB2A5\uD569\uB2C8\uB2E4. \uCCB4\uD5D8 \uAE30\uAC04 \uC911 \uC5B8\uC81C\uB4E0\uC9C0 \uCDE8\uC18C\uD560 \uC218 \uC788\uC73C\uBA70, \uBE44\uC6A9\uC774 \uCCAD\uAD6C\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."
253
- },
254
- {
255
- question: "\uAE30\uC874 ERP\xB7HR \uC2DC\uC2A4\uD15C\uACFC \uC5F0\uB3D9\uC774 \uAC00\uB2A5\uD55C\uAC00\uC694?",
256
- answer: "\uD504\uB85C \uD50C\uB79C \uC774\uC0C1\uC5D0\uC11C REST API \uC5F0\uB3D9\uC744 \uC9C0\uC6D0\uD569\uB2C8\uB2E4. SAP, Oracle, \uB354\uC874 \uB4F1 \uAD6D\uB0B4\uC678 \uC8FC\uC694 ERP\uC640\uC758 \uC5F0\uB3D9 \uC0AC\uB840\uAC00 \uC788\uC73C\uBA70, \uC5D4\uD130\uD504\uB77C\uC774\uC988 \uD50C\uB79C\uC5D0\uC11C\uB294 \uC804\uB2F4 \uC5D4\uC9C0\uB2C8\uC5B4\uAC00 \uCEE4\uC2A4\uD140 \uC5F0\uB3D9\uC744 \uC9C0\uC6D0\uD569\uB2C8\uB2E4."
257
- },
258
- {
259
- question: "\uB370\uC774\uD130 \uBCF4\uC548\uC740 \uC5B4\uB5BB\uAC8C \uAD00\uB9AC\uB418\uB098\uC694?",
260
- answer: "ISO 27001 \uC778\uC99D\uC744 \uBCF4\uC720\uD558\uACE0 \uC788\uC73C\uBA70, \uBAA8\uB4E0 \uB370\uC774\uD130\uB294 AES-256\uC73C\uB85C \uC554\uD638\uD654\uB418\uC5B4 \uAD6D\uB0B4 \uB370\uC774\uD130\uC13C\uD130\uC5D0 \uC800\uC7A5\uB429\uB2C8\uB2E4. \uC5ED\uD560 \uAE30\uBC18 \uC811\uADFC \uC81C\uC5B4(RBAC)\uC640 \uAC10\uC0AC \uB85C\uADF8\uB97C \uD1B5\uD574 \uB370\uC774\uD130 \uC811\uADFC\uC744 \uCCA0\uC800\uD788 \uAD00\uB9AC\uD569\uB2C8\uB2E4."
261
- },
262
- {
263
- question: "\uB3C4\uC785\uAE4C\uC9C0 \uC5BC\uB9C8\uB098 \uAC78\uB9AC\uB098\uC694?",
264
- answer: "\uC2A4\uD0C0\uD130\xB7\uD504\uB85C \uD50C\uB79C\uC740 \uB2F9\uC77C \uC140\uD504 \uC628\uBCF4\uB529\uC774 \uAC00\uB2A5\uD569\uB2C8\uB2E4. \uC5D4\uD130\uD504\uB77C\uC774\uC988 \uD50C\uB79C\uC740 \uC694\uAD6C\uC0AC\uD56D \uBD84\uC11D \u2192 \uC124\uACC4 \u2192 \uAD6C\uCD95 \u2192 \uAD50\uC721\uC758 4\uB2E8\uACC4\uB85C \uC9C4\uD589\uB418\uBA70, \uADDC\uBAA8\uC5D0 \uB530\uB77C \uC77C\uC815\uC774 \uACB0\uC815\uB429\uB2C8\uB2E4."
265
- },
266
- {
267
- question: "\uD50C\uB79C\uC744 \uC911\uAC04\uC5D0 \uBCC0\uACBD\uD560 \uC218 \uC788\uB098\uC694?",
268
- answer: "\uC5B8\uC81C\uB4E0\uC9C0 \uC5C5\uADF8\uB808\uC774\uB4DC \uB610\uB294 \uB2E4\uC6B4\uADF8\uB808\uC774\uB4DC\uAC00 \uAC00\uB2A5\uD569\uB2C8\uB2E4. \uC5C5\uADF8\uB808\uC774\uB4DC \uC2DC \uC794\uC5EC \uAE30\uAC04 \uAE08\uC561\uC740 \uC989\uC2DC \uCC28\uAC10\uB418\uBA70, \uB2E4\uC6B4\uADF8\uB808\uC774\uB4DC\uB294 \uB2E4\uC74C \uACB0\uC81C \uC8FC\uAE30\uBD80\uD130 \uC801\uC6A9\uB429\uB2C8\uB2E4."
269
- }
270
- ];
271
- var solutionItems = [
272
- {
273
- id: 1,
274
- order: 1,
275
- isShow: true,
276
- category: "\uC81C\uC870",
277
- title: "ERP \uD1B5\uD569 \uC194\uB8E8\uC158",
278
- description: "\uC0DD\uC0B0\xB7\uC7AC\uACE0\xB7\uAD6C\uB9E4\uB97C \uD558\uB098\uC758 \uD50C\uB7AB\uD3FC\uC73C\uB85C \uD1B5\uD569\uD558\uC5EC \uC6B4\uC601 \uD6A8\uC728\uC744 \uB192\uC785\uB2C8\uB2E4.",
279
- ctaLabel: "\uC790\uC138\uD788 \uBCF4\uAE30"
280
- },
281
- {
282
- id: 2,
283
- order: 2,
284
- isShow: true,
285
- category: "\uBB3C\uB958",
286
- title: "\uC2A4\uB9C8\uD2B8 \uBB3C\uB958 \uAD00\uB9AC",
287
- description: "\uC785\uCD9C\uACE0\xB7\uBC30\uC1A1\xB7\uC7AC\uACE0\uB97C \uC2E4\uC2DC\uAC04\uC73C\uB85C \uCD94\uC801\uD558\uC5EC \uACF5\uAE09\uB9DD \uAC00\uC2DC\uC131\uC744 \uD655\uBCF4\uD569\uB2C8\uB2E4.",
288
- ctaLabel: "\uC790\uC138\uD788 \uBCF4\uAE30"
289
- },
290
- {
291
- id: 3,
292
- order: 3,
293
- isShow: true,
294
- category: "\uAE08\uC735",
295
- title: "\uB514\uC9C0\uD138 \uAE08\uC735 \uD50C\uB7AB\uD3FC",
296
- description: "\uC5EC\uC2E0\xB7\uC218\uC2E0\xB7\uB9AC\uC2A4\uD06C \uAD00\uB9AC\uB97C \uD1B5\uD569\uD558\uC5EC \uAE08\uC735 \uC5C5\uBB34\uC758 \uB514\uC9C0\uD138 \uC804\uD658\uC744 \uC9C0\uC6D0\uD569\uB2C8\uB2E4.",
297
- ctaLabel: "\uC790\uC138\uD788 \uBCF4\uAE30"
298
- },
299
- {
300
- id: 4,
301
- order: 4,
302
- isShow: true,
303
- category: "\uC720\uD1B5",
304
- title: "\uC634\uB2C8\uCC44\uB110 \uC720\uD1B5 \uC194\uB8E8\uC158",
305
- description: "\uC628\xB7\uC624\uD504\uB77C\uC778 \uCC44\uB110\uC744 \uD1B5\uD569\uD558\uACE0 \uACE0\uAC1D \uB370\uC774\uD130\uB97C \uBD84\uC11D\uD558\uC5EC \uB9E4\uCD9C\uC744 \uADF9\uB300\uD654\uD569\uB2C8\uB2E4.",
306
- ctaLabel: "\uC790\uC138\uD788 \uBCF4\uAE30"
307
- },
308
- {
309
- id: 5,
310
- order: 5,
311
- isShow: true,
312
- category: "\uC758\uB8CC",
313
- title: "\uC2A4\uB9C8\uD2B8 \uBCD1\uC6D0 \uAD00\uB9AC",
314
- description: "\uC804\uC790\uC758\uBB34\uAE30\uB85D\xB7\uC608\uC57D\xB7\uCCAD\uAD6C\uB97C \uC5F0\uACC4\uD558\uC5EC \uD658\uC790 \uC911\uC2EC\uC758 \uC758\uB8CC \uC11C\uBE44\uC2A4\uB97C \uC2E4\uD604\uD569\uB2C8\uB2E4.",
315
- ctaLabel: "\uC790\uC138\uD788 \uBCF4\uAE30"
316
- },
317
- {
318
- id: 6,
319
- order: 6,
320
- isShow: true,
321
- category: "\uACF5\uACF5",
322
- title: "\uACF5\uACF5\uAE30\uAD00 \uD589\uC815 \uC2DC\uC2A4\uD15C",
323
- description: "\uBBFC\uC6D0\xB7\uD589\uC815\xB7\uC608\uC0B0 \uAD00\uB9AC\uB97C \uB514\uC9C0\uD138\uD654\uD558\uC5EC \uD589\uC815 \uD6A8\uC728\uC744 \uB192\uC774\uACE0 \uC2DC\uBBFC \uC11C\uBE44\uC2A4\uB97C \uAC1C\uC120\uD569\uB2C8\uB2E4.",
324
- ctaLabel: "\uC790\uC138\uD788 \uBCF4\uAE30"
325
- }
326
- ];
327
- var clientItems = [
328
- { name: "\uAD6D\uB9BD\uC804\uD30C\uC5F0\uAD6C\uC6D0", url: "https://www.rra.go.kr/", logo: "/clients/rra.jpg" },
329
- { name: "\uD589\uC815\uC548\uC804\uBD80", url: "https://www.mois.go.kr/", logo: "/clients/mois.png" },
330
- { name: "\uAD6D\uBBFC\uAD8C\uC775\uC704\uC6D0\uD68C", url: "https://www.acrc.go.kr/", logo: "/clients/acrc.svg" },
331
- { name: "\uAD6D\uBBFC\uAC74\uAC15\uBCF4\uD5D8\uACF5\uB2E8", url: "https://www.nhis.or.kr/", logo: "/clients/nhis.png" },
332
- { name: "\uAD6D\uAC00\uC0DD\uBA85\uC724\uB9AC\uC815\uCC45\uC6D0", url: "https://nibp.kr/", logo: "/clients/nibp.png" },
333
- { name: "\uAD6D\uBBFC\uC5F0\uAE08\uAD00\uB9AC\uACF5\uB2E8", url: "https://www.nps.or.kr", logo: "/clients/nps.svg" },
334
- { name: "\uD55C\uAD6D\uC9C0\uB2A5\uC815\uBCF4\uC0AC\uD68C\uC9C4\uD765\uC6D0", url: "https://www.nia.or.kr/", logo: "/clients/nia.png" },
335
- { name: "\uD55C\uAD6D\uBC29\uC1A1\uD1B5\uC2E0\uC804\uD30C\uC9C4\uD765\uC6D0", url: "https://www.kca.kr/", logo: "/clients/kca.png" },
336
- { name: "\uD55C\uAD6D\uAD50\uC721\uD559\uC220\uC815\uBCF4\uC6D0", url: "https://www.keris.or.kr", logo: "/clients/keris.png" },
337
- { name: "\uD55C\uAD6D\uC790\uC0B0\uAD00\uB9AC\uACF5\uC0AC", url: "https://www.kamco.or.kr/", logo: "/clients/kamco.png" },
338
- { name: "\uD55C\uAD6D\uC815\uBCF4\uD1B5\uC2E0\uAE30\uC220\uD611\uD68C", url: "https://www.tta.or.kr/", logo: "/clients/tta.svg" },
339
- { name: "\uD55C\uAD6D\uC218\uB825\uC6D0\uC790\uB825", url: "https://www.khnp.co.kr/", logo: "/clients/khnp.png" },
340
- { name: "\uD55C\uAD6D\uC8FC\uD0DD\uAE08\uC735\uACF5\uC0AC", url: "https://www.hf.go.kr/", logo: "/clients/hf.png" },
341
- { name: "\uD55C\uAD6D\uC0B0\uC5C5\uC740\uD589", url: "https://www.kdb.co.kr", logo: "/clients/kdb.png" },
342
- { name: "\uAD50\uBCF4\uC0DD\uBA85", url: "https://www.kyobo.com/", logo: "/clients/kyobo.png" },
343
- { name: "\uBBF8\uB798\uC5D0\uC14B\uC0DD\uBA85", url: "https://life.miraeasset.com/", logo: "/clients/miraeasset.png" },
344
- { name: "NH\uB18D\uD611\uC190\uD574\uBCF4\uD5D8", url: "https://www.nhfire.co.kr/", logo: "/clients/nhfire.png" },
345
- { name: "\uB77C\uC774\uB098\uC0DD\uBA85", url: "https://direct.e-lina.co.kr/", logo: "/clients/lina.png" },
346
- { name: "SBI\uC800\uCD95\uC740\uD589", url: "https://www.babilloan.com/", logo: "/clients/sbi.png" },
347
- { name: "\uC6B0\uC815\uC815\uBCF4\uAD00\uB9AC\uC6D0(\uC6B0\uCCB4\uAD6D\uAE08\uC735)", url: "https://kpds.koreapost.go.kr/", logo: "/clients/koreapost.png" },
348
- { name: "\uD55C\uAD6D\uBB34\uC5ED\uC815\uBCF4\uD1B5\uC2E0", url: "https://www.ktnet.com/", logo: "/clients/ktnet.svg" },
349
- { name: "SK \uC8FC\uC2DD\uD68C\uC0AC", url: "https://www.sk.co.kr", logo: "/clients/sk.png" }
350
- ];
351
- var companyInfo = {
352
- name: "\uC8FC\uC2DD\uD68C\uC0AC \uD68C\uC0AC\uBA85",
353
- registrationNumber: "000-00-00000",
354
- addresses: [
355
- {
356
- label: "\uBCF8\uC0AC",
357
- address: "\uC11C\uC6B8\uD2B9\uBCC4\uC2DC \uC911\uAD6C \uD0DC\uD3C9\uB85C1\uAC00 31",
358
- order: 1,
359
- embbedUrl: "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3162.919945!2d126.977929!3d37.566576!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357ca2012d5c39cf%3A0x7e11eca1405bf29b!2z7ISc7Jq47IucIOyEseyLnCDshqHsmIHroZw!5e0!3m2!1sko!2skr!4v1700000000000!5m2!1sko!2skr"
360
- },
361
- {
362
- label: "\uC9C0\uC0AC",
363
- address: "\uACBD\uAE30\uB3C4 \uC218\uC6D0\uC2DC \uD314\uB2EC\uAD6C \uD6A8\uC6D0\uB85C 1",
364
- order: 2,
365
- embbedUrl: "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3171.836!2d127.028873!3d37.263504!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357b5f9c56e7cd67%3A0x84e78ef4e31b7bab!2z7IiY7JWE7IucIOyEseyLnCDsiJjslYTrjIDsnYQ!5e0!3m2!1sko!2skr!4v1700000000000!5m2!1sko!2skr"
366
- }
367
- ],
368
- tel: "000-000-0000",
369
- fax: "000-000-0000",
370
- email: "contact@company.kr",
371
- copyrightYear: (/* @__PURE__ */ new Date()).getFullYear()
372
- };
373
- export {
374
- ceoMessage,
375
- clientItems,
376
- companyInfo,
377
- faqItems,
378
- featureItems,
379
- heroSlides,
380
- navItems,
381
- pricingItems,
382
- serviceItems,
383
- solutionItems,
384
- testimonialItems,
385
- timelineEvents
386
- };