designbase-wp-library 0.6.0 → 0.6.1
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 +365 -317
- package/dist/js/dewp.min.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,196 +1,163 @@
|
|
|
1
1
|
# DesignBase WordPress Library (DEWP)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/designbase-wp-library)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
워드프레스 플러그인 개발을 위한 재사용 가능한 프론트엔드 UI 라이브러리입니다.
|
|
7
|
+
|
|
8
|
+
> **DEWP** = **D**esignBase W**o**rdPress Library
|
|
6
9
|
|
|
7
10
|
## ✨ 특징
|
|
8
11
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
- **접근성
|
|
13
|
-
- **TypeScript
|
|
14
|
-
- **
|
|
12
|
+
- 🎨 **THEME_GUIDE.md v0.1.16 기준** - 최신 디자인 토큰 시스템
|
|
13
|
+
- 🌙 **자동 다크모드** - theme.css와 완벽 통합
|
|
14
|
+
- 📱 **완전 반응형** - 모바일 우선 설계
|
|
15
|
+
- ♿ **접근성 준수** - WCAG 가이드라인 적용
|
|
16
|
+
- 🔧 **TypeScript 지원** - 완전한 타입 정의
|
|
17
|
+
- 🚀 **CDN 지원** - unpkg, jsDelivr
|
|
18
|
+
|
|
19
|
+
---
|
|
15
20
|
|
|
16
21
|
## 📦 설치
|
|
17
22
|
|
|
18
|
-
###
|
|
23
|
+
### NPM
|
|
19
24
|
```bash
|
|
20
25
|
npm install designbase-wp-library
|
|
21
26
|
```
|
|
22
27
|
|
|
23
|
-
###
|
|
24
|
-
|
|
25
|
-
#### npm 설치 방식
|
|
26
|
-
```bash
|
|
27
|
-
# 아이콘 시스템 사용시
|
|
28
|
-
npm install @designbasekorea/icons-webfont
|
|
29
|
-
|
|
30
|
-
# 테마 시스템 사용시
|
|
31
|
-
npm install @designbasekorea/theme
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
#### CDN 방식 (권장)
|
|
28
|
+
### CDN (권장)
|
|
35
29
|
```html
|
|
36
|
-
<!--
|
|
37
|
-
<link rel="stylesheet" href="https://unpkg.com/@designbasekorea/icons-webfont@latest/dist/webfont/icons.css">
|
|
38
|
-
|
|
39
|
-
<!-- 테마 시스템 -->
|
|
30
|
+
<!-- 1. Theme System (필수) -->
|
|
40
31
|
<link rel="stylesheet" href="https://unpkg.com/@designbasekorea/theme@latest/dist/css/theme.css">
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
> **💡 팁**: CDN 방식을 사용하면 자동으로 최신 버전이 적용되며, 별도 설치나 업데이트가 필요 없습니다!
|
|
44
|
-
|
|
45
|
-
### 문서/데모 사이트
|
|
46
|
-
|
|
47
|
-
- 최신 문서와 라이브 데모: [DEWP Docs & Examples](https://designbasekorea.github.io/designbase-wp-library/)
|
|
48
|
-
|
|
49
|
-
### 로컬 테스트
|
|
50
|
-
|
|
51
|
-
로컬에서 라이브러리를 테스트하려면:
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
# 1. 라이브러리 빌드
|
|
55
|
-
npm run build
|
|
56
|
-
|
|
57
|
-
# 2. 로컬 서버 실행
|
|
58
|
-
python3 -m http.server 8000
|
|
59
|
-
|
|
60
|
-
# 3. 브라우저에서 테스트
|
|
61
|
-
# http://localhost:8000/test/local-test.html
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
> **💡 팁**: `test/` 폴더는 `.gitignore`에 포함되어 있어 Git에 커밋되지 않습니다.
|
|
65
|
-
|
|
66
|
-
> **🔒 보안**: `src/` 폴더(소스 코드)도 `.gitignore`에 포함되어 있어 핵심 코드가 공개되지 않습니다.
|
|
67
32
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
#### 기본 DEWP 라이브러리
|
|
71
|
-
```html
|
|
72
|
-
<!-- CSS -->
|
|
73
|
-
<link rel="stylesheet" href="https://unpkg.com/designbase-wp-library@latest/dist/css/dewp.min.css">
|
|
74
|
-
|
|
75
|
-
<!-- JavaScript -->
|
|
76
|
-
<script src="https://unpkg.com/designbase-wp-library@latest/dist/js/dewp.min.js"></script>
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
#### 아이콘 시스템 (선택사항)
|
|
80
|
-
```html
|
|
81
|
-
<!-- 아이콘 CSS -->
|
|
33
|
+
<!-- 2. Icon System (필수) -->
|
|
82
34
|
<link rel="stylesheet" href="https://unpkg.com/@designbasekorea/icons-webfont@latest/dist/webfont/icons.css">
|
|
83
|
-
```
|
|
84
35
|
|
|
85
|
-
|
|
86
|
-
```html
|
|
87
|
-
<!-- 테마 CSS -->
|
|
88
|
-
<link rel="stylesheet" href="https://unpkg.com/@designbasekorea/theme@latest/dist/css/theme.css">
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
#### 전체 패키지 (권장)
|
|
92
|
-
```html
|
|
93
|
-
<!-- 테마 시스템 -->
|
|
94
|
-
<link rel="stylesheet" href="https://unpkg.com/@designbasekorea/theme@latest/dist/css/theme.css">
|
|
95
|
-
|
|
96
|
-
<!-- 아이콘 시스템 -->
|
|
97
|
-
<link rel="stylesheet" href="https://unpkg.com/@designbasekorea/icons-webfont@latest/dist/webfont/icons.css">
|
|
98
|
-
|
|
99
|
-
<!-- DEWP 라이브러리 -->
|
|
36
|
+
<!-- 3. DEWP Library -->
|
|
100
37
|
<link rel="stylesheet" href="https://unpkg.com/designbase-wp-library@latest/dist/css/dewp.min.css">
|
|
101
38
|
<script src="https://unpkg.com/designbase-wp-library@latest/dist/js/dewp.min.js"></script>
|
|
102
39
|
```
|
|
103
40
|
|
|
104
|
-
|
|
41
|
+
---
|
|
105
42
|
|
|
106
|
-
|
|
107
|
-
- npm: `npm i designbase-wp-library@latest`
|
|
108
|
-
- unpkg: `https://unpkg.com/designbase-wp-library@latest/dist/{css|js}/dewp.min.{css|js}`
|
|
109
|
-
- jsDelivr: `https://cdn.jsdelivr.net/npm/designbase-wp-library@latest/dist/{css|js}/dewp.min.{css|js}`
|
|
43
|
+
## 🚀 빠른 시작
|
|
110
44
|
|
|
111
|
-
|
|
45
|
+
### 기본 사용법
|
|
112
46
|
|
|
113
|
-
### JavaScript 사용
|
|
114
|
-
|
|
115
|
-
#### 브라우저에서 직접 사용
|
|
116
47
|
```html
|
|
117
|
-
|
|
118
|
-
<
|
|
119
|
-
|
|
120
|
-
|
|
48
|
+
<!DOCTYPE html>
|
|
49
|
+
<html lang="ko">
|
|
50
|
+
<head>
|
|
51
|
+
<meta charset="UTF-8">
|
|
52
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
53
|
+
<title>DEWP 라이브러리</title>
|
|
121
54
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
55
|
+
<!-- CDN -->
|
|
56
|
+
<link rel="stylesheet" href="https://unpkg.com/@designbasekorea/theme@latest/dist/css/theme.css">
|
|
57
|
+
<link rel="stylesheet" href="https://unpkg.com/@designbasekorea/icons-webfont@latest/dist/webfont/icons.css">
|
|
58
|
+
<link rel="stylesheet" href="https://unpkg.com/designbase-wp-library@latest/dist/css/dewp.min.css">
|
|
59
|
+
</head>
|
|
60
|
+
<body>
|
|
61
|
+
<!-- 버튼 -->
|
|
62
|
+
<button class="dewp-button dewp-button--primary">Primary Button</button>
|
|
63
|
+
|
|
64
|
+
<!-- 카드 -->
|
|
65
|
+
<div class="dewp-card">
|
|
66
|
+
<div class="dewp-card-header">카드 제목</div>
|
|
67
|
+
<div class="dewp-card-body">카드 내용</div>
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<script src="https://unpkg.com/designbase-wp-library@latest/dist/js/dewp.min.js"></script>
|
|
71
|
+
</body>
|
|
72
|
+
</html>
|
|
125
73
|
```
|
|
126
74
|
|
|
127
|
-
|
|
128
|
-
```javascript
|
|
129
|
-
import { showToast, showModal, showConfirmModal } from 'designbase-wp-library';
|
|
75
|
+
---
|
|
130
76
|
|
|
131
|
-
|
|
132
|
-
showToast('성공!', 'success');
|
|
77
|
+
## 🧩 주요 컴포넌트
|
|
133
78
|
|
|
134
|
-
|
|
135
|
-
|
|
79
|
+
### 1. 버튼 (Button)
|
|
80
|
+
```html
|
|
81
|
+
<!-- 기본 버튼 -->
|
|
82
|
+
<button class="dewp-button dewp-button--primary">Primary</button>
|
|
83
|
+
<button class="dewp-button dewp-button--secondary">Secondary</button>
|
|
84
|
+
<button class="dewp-button dewp-button--tertiary">Tertiary</button>
|
|
136
85
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
86
|
+
<!-- 상태별 버튼 -->
|
|
87
|
+
<button class="dewp-button dewp-button--success">Success</button>
|
|
88
|
+
<button class="dewp-button dewp-button--warning">Warning</button>
|
|
89
|
+
<button class="dewp-button dewp-button--danger">Danger</button>
|
|
140
90
|
|
|
141
|
-
|
|
91
|
+
<!-- 크기 변형 -->
|
|
92
|
+
<button class="dewp-button dewp-button--primary dewp-button--sm">Small</button>
|
|
93
|
+
<button class="dewp-button dewp-button--primary dewp-button--lg">Large</button>
|
|
142
94
|
|
|
143
|
-
|
|
144
|
-
<
|
|
95
|
+
<!-- Outline 스타일 -->
|
|
96
|
+
<button class="dewp-button dewp-button--outline-primary">Outline</button>
|
|
145
97
|
```
|
|
146
98
|
|
|
147
|
-
|
|
99
|
+
### 2. 카드 (Card)
|
|
100
|
+
```html
|
|
101
|
+
<!-- 기본 카드 -->
|
|
102
|
+
<div class="dewp-card">
|
|
103
|
+
<div class="dewp-card-header">카드 제목</div>
|
|
104
|
+
<div class="dewp-card-body">카드 내용입니다.</div>
|
|
105
|
+
<div class="dewp-card-footer">푸터 영역</div>
|
|
106
|
+
</div>
|
|
148
107
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
// 타입별 토스트 (크기 옵션 포함)
|
|
155
|
-
window.DEWP.showSuccessToast('성공 메시지', 3000, 'lg');
|
|
156
|
-
window.DEWP.showWarningToast('경고 메시지', 5000, 'sm');
|
|
157
|
-
window.DEWP.showErrorToast('오류 메시지', 4000, 'md');
|
|
158
|
-
window.DEWP.showInfoToast('정보 메시지', 3000, 'sm');
|
|
108
|
+
<!-- 카드 변형 -->
|
|
109
|
+
<div class="dewp-card dewp-card--outlined">Outlined</div>
|
|
110
|
+
<div class="dewp-card dewp-card--elevated">Elevated</div>
|
|
111
|
+
<div class="dewp-card dewp-card--hover">Hover Effect</div>
|
|
159
112
|
```
|
|
160
113
|
|
|
161
|
-
###
|
|
114
|
+
### 3. 모달 (Modal)
|
|
162
115
|
```javascript
|
|
163
116
|
// 기본 모달
|
|
164
|
-
window.DEWP.showModal({
|
|
117
|
+
window.DEWP.showModal({
|
|
118
|
+
title: '모달 제목',
|
|
119
|
+
content: '모달 내용입니다.',
|
|
120
|
+
size: 'md' // sm, md, lg, xl
|
|
121
|
+
});
|
|
165
122
|
|
|
166
123
|
// 확인 모달
|
|
167
|
-
window.DEWP.showConfirmModal({
|
|
124
|
+
window.DEWP.showConfirmModal({
|
|
125
|
+
title: '확인',
|
|
126
|
+
message: '정말 삭제하시겠습니까?',
|
|
127
|
+
confirmText: '삭제',
|
|
128
|
+
cancelText: '취소',
|
|
129
|
+
onConfirm: () => console.log('삭제됨')
|
|
130
|
+
});
|
|
131
|
+
```
|
|
168
132
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
window.DEWP.
|
|
133
|
+
### 4. 토스트 (Toast)
|
|
134
|
+
```javascript
|
|
135
|
+
// 타입별 토스트
|
|
136
|
+
window.DEWP.showSuccessToast('성공 메시지', 3000);
|
|
137
|
+
window.DEWP.showErrorToast('오류 메시지', 3000);
|
|
138
|
+
window.DEWP.showWarningToast('경고 메시지', 3000);
|
|
139
|
+
window.DEWP.showInfoToast('정보 메시지', 3000);
|
|
140
|
+
|
|
141
|
+
// 커스텀 토스트
|
|
142
|
+
window.DEWP.showToast('메시지', 'success', 3000, 'lg');
|
|
173
143
|
```
|
|
174
144
|
|
|
175
|
-
###
|
|
145
|
+
### 5. 드롭다운 (Dropdown)
|
|
176
146
|
```html
|
|
177
147
|
<div class="dewp-dropdown">
|
|
178
|
-
<button class="dewp-dropdown-toggle">
|
|
179
|
-
선택하세요
|
|
180
|
-
</button>
|
|
148
|
+
<button class="dewp-dropdown-toggle">선택하세요</button>
|
|
181
149
|
<div class="dewp-dropdown-menu">
|
|
182
|
-
<div class="dewp-dropdown-item" data-value="
|
|
183
|
-
<div class="dewp-dropdown-item" data-value="
|
|
150
|
+
<div class="dewp-dropdown-item" data-value="1">옵션 1</div>
|
|
151
|
+
<div class="dewp-dropdown-item" data-value="2">옵션 2</div>
|
|
184
152
|
</div>
|
|
185
153
|
</div>
|
|
186
154
|
|
|
187
155
|
<script>
|
|
188
|
-
|
|
189
|
-
window.DEWP.autoInitializeDropdowns();
|
|
156
|
+
window.DEWP.autoInitializeDropdowns();
|
|
190
157
|
</script>
|
|
191
158
|
```
|
|
192
159
|
|
|
193
|
-
###
|
|
160
|
+
### 6. 탭 (Tabs)
|
|
194
161
|
```html
|
|
195
162
|
<div class="dewp-tabs">
|
|
196
163
|
<button class="dewp-tab-btn active" data-tab="tab1">탭 1</button>
|
|
@@ -203,250 +170,317 @@ window.DEWP.autoInitializeDropdowns();
|
|
|
203
170
|
</div>
|
|
204
171
|
|
|
205
172
|
<script>
|
|
206
|
-
|
|
207
|
-
window.DEWP.initTabs();
|
|
208
|
-
|
|
209
|
-
// 특정 탭 활성화
|
|
210
|
-
window.DEWP.activateTab('tab2');
|
|
211
|
-
|
|
212
|
-
// 활성 탭 정보 가져오기
|
|
213
|
-
const activeTab = window.DEWP.getActiveTab('.dewp-tabs');
|
|
173
|
+
window.DEWP.initTabs();
|
|
214
174
|
</script>
|
|
215
175
|
```
|
|
216
176
|
|
|
217
|
-
###
|
|
218
|
-
```html
|
|
219
|
-
<div class="dewp-header">
|
|
220
|
-
<div class="dewp-header-content">
|
|
221
|
-
<h1 class="dewp-header-title">플러그인 설정</h1>
|
|
222
|
-
<p class="dewp-header-description">플러그인의 기본 설정을 관리할 수 있습니다.</p>
|
|
223
|
-
</div>
|
|
224
|
-
<div class="dewp-header-actions">
|
|
225
|
-
<button class="dewp-header-btn dewp-btn-primary">설정 저장</button>
|
|
226
|
-
</div>
|
|
227
|
-
</div>
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
### 6. 섹션 컴포넌트
|
|
177
|
+
### 7. 아코디언 (Accordion)
|
|
231
178
|
```html
|
|
232
|
-
<div class="dewp-
|
|
233
|
-
<div class="dewp-
|
|
234
|
-
<div class="dewp-
|
|
235
|
-
<
|
|
236
|
-
<
|
|
237
|
-
</div>
|
|
238
|
-
<div class="dewp-section-actions">
|
|
239
|
-
<button class="dewp-section-btn dewp-btn-primary">저장</button>
|
|
179
|
+
<div class="dewp-accordion">
|
|
180
|
+
<div class="dewp-accordion-item">
|
|
181
|
+
<div class="dewp-accordion-header">
|
|
182
|
+
<span class="dewp-accordion-title">아코디언 제목 1</span>
|
|
183
|
+
<span class="dewp-accordion-icon">▼</span>
|
|
240
184
|
</div>
|
|
241
|
-
|
|
242
|
-
<div class="dewp-section-content">
|
|
243
|
-
<!-- 폼 요소들 -->
|
|
185
|
+
<div class="dewp-accordion-content">아코디언 내용 1</div>
|
|
244
186
|
</div>
|
|
245
187
|
</div>
|
|
188
|
+
|
|
189
|
+
<script>
|
|
190
|
+
window.DEWP.initAccordions();
|
|
191
|
+
</script>
|
|
246
192
|
```
|
|
247
193
|
|
|
248
|
-
###
|
|
194
|
+
### 8. Drawer
|
|
249
195
|
```html
|
|
250
|
-
<!-- 기본 Drawer 구조 -->
|
|
251
196
|
<div class="dewp-drawer" id="my-drawer">
|
|
252
197
|
<div class="dewp-drawer-header">
|
|
253
|
-
<h3 class="dewp-drawer-title"
|
|
254
|
-
<button class="dewp-drawer-close">
|
|
255
|
-
<svg viewBox="0 0 24 24">
|
|
256
|
-
<path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
|
|
257
|
-
</svg>
|
|
258
|
-
</button>
|
|
198
|
+
<h3 class="dewp-drawer-title">Drawer 제목</h3>
|
|
199
|
+
<button class="dewp-drawer-close">×</button>
|
|
259
200
|
</div>
|
|
260
201
|
<div class="dewp-drawer-content">
|
|
261
|
-
|
|
202
|
+
Drawer 내용
|
|
262
203
|
</div>
|
|
263
204
|
</div>
|
|
264
205
|
|
|
265
206
|
<script>
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
window.DEWP.openDrawer(drawerId);
|
|
274
|
-
window.DEWP.closeDrawer(drawerId);
|
|
275
|
-
window.DEWP.toggleDrawer(drawerId);
|
|
207
|
+
const drawer = window.DEWP.createDrawer({
|
|
208
|
+
target: '#my-drawer',
|
|
209
|
+
overlay: true,
|
|
210
|
+
closeOnEscape: true
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
window.DEWP.openDrawer(drawer);
|
|
276
214
|
</script>
|
|
277
215
|
```
|
|
278
216
|
|
|
279
|
-
###
|
|
280
|
-
```javascript
|
|
281
|
-
// DOM 요소 선택
|
|
282
|
-
const element = window.DEWP.qs('.my-class');
|
|
283
|
-
const elements = window.DEWP.qsa('.my-class');
|
|
284
|
-
|
|
285
|
-
// 클래스 조작
|
|
286
|
-
window.DEWP.addClass(element, 'active');
|
|
287
|
-
window.DEWP.removeClass(element, 'inactive');
|
|
288
|
-
window.DEWP.toggleClass(element, 'visible');
|
|
289
|
-
|
|
290
|
-
// 텍스트 및 HTML 설정
|
|
291
|
-
window.DEWP.setText(element, '새로운 텍스트');
|
|
292
|
-
window.DEWP.setHTML(element, '<strong>HTML</strong>');
|
|
293
|
-
|
|
294
|
-
// 이벤트 처리
|
|
295
|
-
window.DEWP.on(element, 'click', (e) => console.log('클릭됨'));
|
|
296
|
-
window.DEWP.off(element, 'click');
|
|
297
|
-
|
|
298
|
-
// DOM 상태 확인
|
|
299
|
-
if (window.DEWP.isDOMReady()) {
|
|
300
|
-
// DOM이 준비됨
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
window.DEWP.onDOMReady(() => {
|
|
304
|
-
// DOM 로드 완료 후 실행
|
|
305
|
-
});
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
## 🎨 SCSS 컴포넌트
|
|
309
|
-
|
|
310
|
-
### 기본 컴포넌트
|
|
311
|
-
|
|
312
|
-
#### 버튼
|
|
313
|
-
```html
|
|
314
|
-
<button class="dewp-btn dewp-btn-primary">Primary Button</button>
|
|
315
|
-
<button class="dewp-btn dewp-btn-outline-secondary">Outline Button</button>
|
|
316
|
-
<button class="dewp-btn dewp-btn-success dewp-btn-lg">Large Success Button</button>
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
#### 배지
|
|
320
|
-
```html
|
|
321
|
-
<span class="dewp-badge dewp-badge-primary">Primary</span>
|
|
322
|
-
<span class="dewp-badge dewp-badge-success dewp-badge-pill">Success</span>
|
|
323
|
-
<span class="dewp-badge dewp-badge-danger dewp-badge-ring">Danger</span>
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
#### 폼
|
|
217
|
+
### 9. 폼 요소 (Forms)
|
|
327
218
|
```html
|
|
219
|
+
<!-- 입력 필드 -->
|
|
328
220
|
<div class="dewp-form-group">
|
|
329
221
|
<label class="dewp-form-label">이름</label>
|
|
330
|
-
<input type="text" class="dewp-form-input" placeholder="
|
|
222
|
+
<input type="text" class="dewp-form-input" placeholder="이름 입력">
|
|
331
223
|
</div>
|
|
224
|
+
|
|
225
|
+
<!-- 체크박스 -->
|
|
226
|
+
<div class="dewp-form-check dewp-form-checkbox">
|
|
227
|
+
<input type="checkbox" class="dewp-form-check-input" id="check1">
|
|
228
|
+
<label class="dewp-form-check-label" for="check1">동의합니다</label>
|
|
229
|
+
</div>
|
|
230
|
+
|
|
231
|
+
<!-- 라디오 버튼 -->
|
|
232
|
+
<div class="dewp-form-check dewp-form-radio">
|
|
233
|
+
<input type="radio" class="dewp-form-check-input" name="radio" id="radio1">
|
|
234
|
+
<label class="dewp-form-check-label" for="radio1">옵션 1</label>
|
|
235
|
+
</div>
|
|
236
|
+
|
|
237
|
+
<!-- 토글 스위치 -->
|
|
238
|
+
<label class="dewp-toggle-label">
|
|
239
|
+
<input type="checkbox" class="dewp-toggle-input">
|
|
240
|
+
<span class="dewp-toggle-slider"></span>
|
|
241
|
+
<span class="dewp-toggle-text">알림 받기</span>
|
|
242
|
+
</label>
|
|
332
243
|
```
|
|
333
244
|
|
|
334
|
-
|
|
245
|
+
### 10. 테이블 (Table)
|
|
335
246
|
```html
|
|
336
247
|
<table class="dewp-table">
|
|
337
248
|
<thead>
|
|
338
249
|
<tr>
|
|
339
250
|
<th>제목</th>
|
|
340
|
-
<th
|
|
251
|
+
<th>작성자</th>
|
|
252
|
+
<th>날짜</th>
|
|
341
253
|
</tr>
|
|
342
254
|
</thead>
|
|
343
255
|
<tbody>
|
|
344
256
|
<tr>
|
|
345
|
-
<td
|
|
346
|
-
<td
|
|
257
|
+
<td>게시글 1</td>
|
|
258
|
+
<td>홍길동</td>
|
|
259
|
+
<td>2025-01-01</td>
|
|
347
260
|
</tr>
|
|
348
261
|
</tbody>
|
|
349
262
|
</table>
|
|
350
263
|
```
|
|
351
264
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
</div>
|
|
364
|
-
</div>
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## 🎨 디자인 시스템
|
|
268
|
+
|
|
269
|
+
### CSS 변수 (THEME_GUIDE.md v0.1.16 기준)
|
|
270
|
+
|
|
271
|
+
#### Surface (배경)
|
|
272
|
+
```css
|
|
273
|
+
--db-surface-base /* 기본 배경 */
|
|
274
|
+
--db-surface-layer-1 /* 1단계 높이 */
|
|
275
|
+
--db-surface-layer-2 /* 2단계 높이 */
|
|
365
276
|
```
|
|
366
277
|
|
|
367
|
-
####
|
|
368
|
-
```
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
278
|
+
#### Text (텍스트)
|
|
279
|
+
```css
|
|
280
|
+
--db-text-primary /* 주요 텍스트 */
|
|
281
|
+
--db-text-secondary /* 보조 텍스트 */
|
|
282
|
+
--db-text-tertiary /* 부가 텍스트 */
|
|
283
|
+
--db-text-link /* 링크 텍스트 */
|
|
284
|
+
--db-text-inverse-primary /* 반전 텍스트 */
|
|
285
|
+
```
|
|
375
286
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
287
|
+
#### Border (테두리)
|
|
288
|
+
```css
|
|
289
|
+
--db-border-base /* 기본 테두리 */
|
|
290
|
+
--db-border-layer-1 /* 1단계 테두리 */
|
|
291
|
+
--db-border-layer-2 /* 2단계 테두리 */
|
|
292
|
+
```
|
|
382
293
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
294
|
+
#### Feedback (상태)
|
|
295
|
+
```css
|
|
296
|
+
--db-feedback-success-fg/bg /* 성공 */
|
|
297
|
+
--db-feedback-warning-fg/bg /* 경고 */
|
|
298
|
+
--db-feedback-error-fg/bg /* 에러 */
|
|
299
|
+
--db-feedback-info-fg/bg /* 정보 */
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
#### Brand (브랜드)
|
|
303
|
+
```css
|
|
304
|
+
--db-brand-primary /* 주요 브랜드 색상 */
|
|
305
|
+
--db-brand-secondary /* 보조 브랜드 색상 */
|
|
388
306
|
```
|
|
389
307
|
|
|
390
|
-
|
|
308
|
+
### 다크 모드
|
|
309
|
+
|
|
310
|
+
다크 모드는 **자동으로 적용**됩니다:
|
|
311
|
+
|
|
391
312
|
```html
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
313
|
+
<!-- 다크 모드 활성화 -->
|
|
314
|
+
<body data-theme="dark">
|
|
315
|
+
<!-- 모든 컴포넌트가 자동으로 다크 모드로 전환됩니다 -->
|
|
316
|
+
</body>
|
|
395
317
|
|
|
396
|
-
<
|
|
397
|
-
|
|
398
|
-
|
|
318
|
+
<script>
|
|
319
|
+
// JavaScript로 다크 모드 토글
|
|
320
|
+
const toggleDarkMode = () => {
|
|
321
|
+
const currentTheme = document.body.getAttribute('data-theme');
|
|
322
|
+
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
|
|
323
|
+
document.body.setAttribute('data-theme', newTheme);
|
|
324
|
+
};
|
|
325
|
+
</script>
|
|
399
326
|
```
|
|
400
327
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
<!-- SCSS 커스터마이징 가이드는 문서 사이트로 이관했습니다. -->
|
|
328
|
+
---
|
|
404
329
|
|
|
405
330
|
## 📱 반응형 브레이크포인트
|
|
406
331
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
332
|
+
| 사이즈 | 최소 너비 |
|
|
333
|
+
|--------|-----------|
|
|
334
|
+
| xs | 0px |
|
|
335
|
+
| sm | 576px |
|
|
336
|
+
| md | 768px |
|
|
337
|
+
| lg | 992px |
|
|
338
|
+
| xl | 1200px |
|
|
339
|
+
| xxl | 1400px |
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## 🔧 개발
|
|
344
|
+
|
|
345
|
+
### 빌드
|
|
346
|
+
```bash
|
|
347
|
+
# CSS + JS 빌드
|
|
348
|
+
npm run build
|
|
349
|
+
|
|
350
|
+
# CSS만 빌드
|
|
351
|
+
npm run build:css
|
|
352
|
+
|
|
353
|
+
# JS만 빌드
|
|
354
|
+
npm run build:js
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### 개발 모드 (Watch)
|
|
358
|
+
```bash
|
|
359
|
+
# CSS + JS 동시 감시
|
|
360
|
+
npm run dev
|
|
361
|
+
|
|
362
|
+
# CSS만 감시
|
|
363
|
+
npm run dev:css
|
|
364
|
+
|
|
365
|
+
# JS만 감시
|
|
366
|
+
npm run dev:js
|
|
367
|
+
```
|
|
413
368
|
|
|
414
|
-
|
|
369
|
+
### 로컬 테스트
|
|
370
|
+
```bash
|
|
371
|
+
# 1. 빌드
|
|
372
|
+
npm run build
|
|
373
|
+
|
|
374
|
+
# 2. 서버 실행 (프로젝트 루트에서)
|
|
375
|
+
python3 -m http.server 8001
|
|
376
|
+
|
|
377
|
+
# 3. 브라우저에서 접속
|
|
378
|
+
# http://localhost:8001/test/local-test.html
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
---
|
|
382
|
+
|
|
383
|
+
## 📂 빌드 출력
|
|
415
384
|
|
|
416
385
|
```
|
|
417
386
|
dist/
|
|
418
387
|
├── css/
|
|
419
|
-
│ └── dewp.min.css
|
|
388
|
+
│ └── dewp.min.css # 압축된 CSS (152.8 kB)
|
|
420
389
|
└── js/
|
|
421
|
-
└── dewp.min.js
|
|
390
|
+
└── dewp.min.js # 압축된 JavaScript (40.7 kB)
|
|
422
391
|
```
|
|
423
392
|
|
|
424
|
-
|
|
393
|
+
---
|
|
425
394
|
|
|
426
|
-
|
|
427
|
-
```bash
|
|
428
|
-
npm run build:prod
|
|
429
|
-
```
|
|
395
|
+
## 🌐 CDN 링크
|
|
430
396
|
|
|
431
|
-
###
|
|
432
|
-
```bash
|
|
433
|
-
npm run preview
|
|
397
|
+
### unpkg
|
|
434
398
|
```
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
```bash
|
|
438
|
-
npm run release
|
|
399
|
+
https://unpkg.com/designbase-wp-library@latest/dist/css/dewp.min.css
|
|
400
|
+
https://unpkg.com/designbase-wp-library@latest/dist/js/dewp.min.js
|
|
439
401
|
```
|
|
440
402
|
|
|
441
|
-
###
|
|
442
|
-
```
|
|
443
|
-
npm
|
|
444
|
-
npm
|
|
403
|
+
### jsDelivr
|
|
404
|
+
```
|
|
405
|
+
https://cdn.jsdelivr.net/npm/designbase-wp-library@latest/dist/css/dewp.min.css
|
|
406
|
+
https://cdn.jsdelivr.net/npm/designbase-wp-library@latest/dist/js/dewp.min.js
|
|
445
407
|
```
|
|
446
408
|
|
|
447
|
-
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
## 📚 문서
|
|
448
412
|
|
|
449
|
-
|
|
413
|
+
자세한 사용법과 예제는 다음 링크에서 확인하세요:
|
|
414
|
+
|
|
415
|
+
- 📖 **공식 문서**: https://designbasekorea.github.io/designbase-wp-library/
|
|
416
|
+
- 🎨 **라이브 데모**: https://designbasekorea.github.io/designbase-wp-library/
|
|
417
|
+
- 📦 **NPM**: https://www.npmjs.com/package/designbase-wp-library
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
## 🎯 전체 컴포넌트 목록
|
|
422
|
+
|
|
423
|
+
### Layout
|
|
424
|
+
- Header
|
|
425
|
+
- Section
|
|
426
|
+
- Sidebar
|
|
427
|
+
- Card
|
|
428
|
+
- List
|
|
429
|
+
|
|
430
|
+
### Navigation
|
|
431
|
+
- Tabs
|
|
432
|
+
- Breadcrumb
|
|
433
|
+
- Pagination
|
|
434
|
+
- Dropdown
|
|
435
|
+
|
|
436
|
+
### Forms
|
|
437
|
+
- Input
|
|
438
|
+
- Textarea
|
|
439
|
+
- Select
|
|
440
|
+
- Checkbox
|
|
441
|
+
- Radio
|
|
442
|
+
- Toggle
|
|
443
|
+
- Stepper
|
|
444
|
+
- Range Slider
|
|
445
|
+
|
|
446
|
+
### Feedback
|
|
447
|
+
- Toast
|
|
448
|
+
- Modal
|
|
449
|
+
- Notice
|
|
450
|
+
- Badge
|
|
451
|
+
- Spinner
|
|
452
|
+
- Progress
|
|
453
|
+
- Progress Step
|
|
454
|
+
- Empty State
|
|
455
|
+
|
|
456
|
+
### Interactive
|
|
457
|
+
- Accordion
|
|
458
|
+
- Drawer
|
|
459
|
+
- Popover
|
|
460
|
+
- Tooltip
|
|
461
|
+
|
|
462
|
+
### Display
|
|
463
|
+
- Table
|
|
464
|
+
- Stat
|
|
465
|
+
- Chip
|
|
466
|
+
- Divider
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## 🔄 버전 히스토리
|
|
471
|
+
|
|
472
|
+
### v0.6.0 (최신)
|
|
473
|
+
- 🎨 THEME_GUIDE.md v0.1.16 기준 전체 변수 시스템 통일
|
|
474
|
+
- ✨ 새로운 변수 시스템 적용 (Surface, Border, Feedback, Interactive, Brand)
|
|
475
|
+
- 🗑️ 하드코딩된 색상 및 수동 다크모드 제거
|
|
476
|
+
- ♿ 접근성 개선
|
|
477
|
+
|
|
478
|
+
### v0.5.6
|
|
479
|
+
- 이전 안정 버전
|
|
480
|
+
|
|
481
|
+
전체 변경 이력은 [CHANGELOG.md](./CHANGELOG.md)를 참조하세요.
|
|
482
|
+
|
|
483
|
+
---
|
|
450
484
|
|
|
451
485
|
## 🤝 기여
|
|
452
486
|
|
|
@@ -456,14 +490,28 @@ npm publish
|
|
|
456
490
|
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
457
491
|
5. Open a Pull Request
|
|
458
492
|
|
|
493
|
+
---
|
|
494
|
+
|
|
495
|
+
## 📄 라이선스
|
|
496
|
+
|
|
497
|
+
이 프로젝트는 MIT License를 따릅니다.
|
|
498
|
+
|
|
499
|
+
재배포 시 원저작권 고지와 라이선스 전문을 반드시 포함해 주세요.
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
459
503
|
## 📞 지원
|
|
460
504
|
|
|
461
|
-
|
|
505
|
+
- **이메일**: designbasekorea@gmail.com
|
|
506
|
+
- **Issues**: [GitHub Issues](https://github.com/designbasekorea/designbase-wp-library/issues)
|
|
507
|
+
|
|
508
|
+
---
|
|
509
|
+
|
|
510
|
+
## 🔗 관련 프로젝트
|
|
462
511
|
|
|
463
|
-
-
|
|
512
|
+
- [@designbasekorea/theme](https://www.npmjs.com/package/@designbasekorea/theme) - 디자인 토큰 시스템
|
|
513
|
+
- [@designbasekorea/icons-webfont](https://www.npmjs.com/package/@designbasekorea/icons-webfont) - 아이콘 시스템
|
|
464
514
|
|
|
465
|
-
|
|
515
|
+
---
|
|
466
516
|
|
|
467
|
-
|
|
468
|
-
- [CDN (unpkg)](https://unpkg.com/designbase-wp-library@latest/)
|
|
469
|
-
- [CDN (jsDelivr)](https://cdn.jsdelivr.net/npm/designbase-wp-library@latest/)
|
|
517
|
+
**Made with ❤️ by DesignBase Korea**
|
package/dist/js/dewp.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var DEWP=function(){"use strict";function e(e,t=document){return t.querySelector(e)}function t(e,t=document){return Array.from(t.querySelectorAll(e))}function s(e,t={}){const s=document.createElement(e);return Object.assign(s,t),s}function i(e,t){e.classList.add(t)}function n(e,t){e.classList.remove(t)}function o(e,t,s){return e.classList.toggle(t,s)}function r(e,t){return e.classList.contains(t)}function a(e,t){e.textContent=t}function d(e,t){e.innerHTML=t}function c(e,t,s,i){e.addEventListener(t,s,i)}function l(e,t,s,i){e.removeEventListener(t,s,i)}function p(e){e.remove()}function h(e,t){e.appendChild(t)}function u(e,t,s){e.insertBefore(t,s)}function m(e,t,s){e.style.setProperty(t,s)}function w(e,t,s){e.setAttribute(`data-${t}`,s)}function g(e,t){return e.getAttribute(`data-${t}`)}function v(){return"loading"!==document.readyState}function b(e){v()?e():c(document,"DOMContentLoaded",e,{once:!0})}function f(e,t=0){return new Promise(s=>{const i=new IntersectionObserver(([e])=>{i.disconnect(),s(e.isIntersecting)},{threshold:t});i.observe(e)})}function y(e,t="smooth"){e.scrollIntoView({behavior:t,block:"start"})}function E(e){return e.getBoundingClientRect()}function A(e,t){return t.contains(e)}function I(e){for(;e.firstChild;)e.removeChild(e.firstChild)}const D=new class{constructor(){this.container=null,this.init()}init(){this.createContainer()}createContainer(){const e=document.getElementById("dewp-toast-container");e&&e.remove(),this.container=document.createElement("div"),this.container.id="dewp-toast-container",this.container.className="dewp-toast-container dewp-toast-container-top-right",document.body.appendChild(this.container)}show(e,t="info",s=5e3,i="md"){this.container||this.createContainer();const n="dewp-toast-"+Date.now(),o=this.createToastElement(n,e,t,i);try{Array.from(this.container.querySelectorAll(".dewp-toast .dewp-toast-message")).some(t=>t.textContent===String(e))&&this.hideAll()}catch(e){}return this.container.appendChild(o),requestAnimationFrame(()=>{o.classList.add("show"),o.classList.add("toast-slide-in")}),s>0&&setTimeout(()=>{this.hide(n)},s),n}createToastElement(e,t,s,i="md"){const n=document.createElement("div");n.id=e,n.className=`dewp-toast dewp-toast-${s} dewp-toast-${i}`;const o=document.createElement("div");o.className="dewp-toast-content";const r=document.createElement("span");r.className="dewp-toast-icon",r.innerHTML=this.getTypeIcon(s);const a=document.createElement("div");a.className="dewp-toast-message",a.textContent=t;const d=document.createElement("button");return d.className="dewp-toast-close",d.type="button",d.innerHTML="<span>×</span>",d.setAttribute("aria-label","토스트 닫기"),d.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.hide(e)}),o.appendChild(r),o.appendChild(a),o.appendChild(d),n.appendChild(o),n}getTypeIcon(e){return{info:"ℹ️",success:"✅",warning:"⚠️",error:"❌"}[e]}hide(e){const t=document.getElementById(e);t&&(t.classList.remove("show","toast-slide-in"),t.classList.add("toast-slide-out"),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t)},300))}hideAll(){if(this.container){this.container.querySelectorAll(".dewp-toast").forEach(e=>{const t=e.id;t&&this.hide(t)})}}success(e,t,s){return this.show(e,"success",t,s)}error(e,t,s){return this.show(e,"error",t,s)}warning(e,t,s){return this.show(e,"warning",t,s)}info(e,t,s){return this.show(e,"info",t,s)}},L=(e,t,s,i)=>D.show(e,t||"info",s,i),T=(e,t,s)=>D.success(e,t,s),C=(e,t,s)=>D.error(e,t,s),x=(e,t,s)=>D.warning(e,t,s),S=(e,t,s)=>D.info(e,t,s);const k=new class{constructor(){this.modals=new Map,this.activeModal=null,this.backdrop=null,this.zIndex=1050,this.init()}init(){this.createBackdrop(),this.bindEvents()}createBackdrop(){this.backdrop=document.createElement("div"),this.backdrop.className="dewp-modal-backdrop",document.body.appendChild(this.backdrop)}bindEvents(){document.addEventListener("keydown",e=>{"Escape"===e.key&&this.activeModal&&this.close(this.activeModal.id)}),this.backdrop&&this.backdrop.addEventListener("click",()=>{this.activeModal&&this.close(this.activeModal.id)})}create(e={}){const t="dewp-modal-"+Date.now(),s=this.createModalElement(t,e);return this.modals.set(t,s),document.body.appendChild(s),t}createModalElement(e,t){const s=document.createElement("div");s.id=e,s.className="dewp-modal";const i=t.size||"md";if(s.className=`dewp-modal ${{sm:"dewp-modal-sm",md:"dewp-modal-md",lg:"dewp-modal-lg",xl:"dewp-modal-xl",full:"dewp-modal-full"}[i]}`,t.title){const i=document.createElement("div");i.className="dewp-modal-header";const n=document.createElement("h3");if(n.textContent=t.title,i.appendChild(n),!1!==t.closable){const t=document.createElement("button");t.className="dewp-modal-close",t.innerHTML="×",t.addEventListener("click",()=>{this.close(e)}),i.appendChild(t)}s.appendChild(i)}if(t.content){const e=document.createElement("div");e.className="dewp-modal-body","string"==typeof t.content?e.innerHTML=t.content:e.appendChild(t.content),s.appendChild(e)}if(t.showCancel||t.confirmText){const i=document.createElement("div");if(i.className="dewp-modal-footer",t.showCancel){const s=document.createElement("button");s.className="dewp-modal-cancel",s.textContent=t.cancelText||"취소",s.addEventListener("click",()=>{t.onCancel&&t.onCancel(),this.close(e)}),i.appendChild(s)}if(t.confirmText){const s=document.createElement("button");s.className="dewp-modal-confirm",s.textContent=t.confirmText,s.addEventListener("click",()=>{t.onConfirm&&t.onConfirm(),this.close(e)}),i.appendChild(s)}s.appendChild(i)}return s}open(e){const t=this.modals.get(e);t&&(this.activeModal=t,this.showBackdrop(),t.style.opacity="1",t.style.visibility="visible",t.style.transform="translate(-50%, -50%) scale(1)",t.querySelector("button")&&t.querySelector("button").focus())}close(e){const t=this.modals.get(e);t&&(t.style.opacity="0",t.style.visibility="hidden",t.style.transform="translate(-50%, -50%) scale(0.9)",setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t),this.modals.delete(e),this.activeModal===t&&(this.activeModal=null,this.hideBackdrop())},300))}showBackdrop(){this.backdrop&&(this.backdrop.style.opacity="1",this.backdrop.style.visibility="visible")}hideBackdrop(){this.backdrop&&(this.backdrop.style.opacity="0",this.backdrop.style.visibility="hidden")}show(e={}){const t=this.create(e);return this.open(t),t}confirm(e){const t=this.create({title:e.title||"확인",content:e.message,confirmText:e.confirmText||"확인",cancelText:"취소",showCancel:!0,onConfirm:e.onConfirm,onCancel:e.onCancel});this.open(t)}alert(e,t){const s=this.create({title:t||"알림",content:e,confirmText:"확인"});this.open(s)}getModal(e){return this.modals.get(e)}isOpen(e){const t=this.modals.get(e);return!!t&&"visible"===t.style.visibility}closeAll(){this.modals.forEach((e,t)=>{this.close(t)})}},M=(e={})=>k.create(e),$=e=>{k.open(e)},O=e=>{k.close(e)},q=(e={})=>k.show(e),P=e=>{k.confirm(e)};const N=new class{constructor(){this.dropdowns=new Map,this.activeDropdown=null,this.zIndex=1e3,this.uidCounter=0,this.init()}init(){this.bindGlobalEvents()}generateId(){return`dewp-dropdown-${"undefined"!=typeof crypto&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}-${++this.uidCounter}`}`}bindGlobalEvents(){document.addEventListener("click",e=>{if(!this.activeDropdown)return;const t=e.target,s=this.activeDropdown.trigger.contains(t),i=this.activeDropdown.element.contains(t);s||i||!1!==this.activeDropdown.options.autoClose&&this.hide(this.activeDropdown.id)}),document.addEventListener("keydown",e=>{"Escape"===e.key&&this.activeDropdown&&!1!==this.activeDropdown.options.autoClose&&this.hide(this.activeDropdown.id)});const e=()=>{this.activeDropdown&&this.positionDropdown(this.activeDropdown)};window.addEventListener("resize",e),window.addEventListener("scroll",e,!0)}create(e){const t="string"==typeof e.trigger?document.querySelector(e.trigger):e.trigger;if(!t)throw console.error("🔽 드롭다운 트리거 요소를 찾을 수 없음:",e.trigger),new Error("드롭다운 트리거 요소를 찾을 수 없습니다.");const s=this.findDropdownContainer(t);if(!s)throw console.error("🔽 드롭다운 컨테이너를 찾을 수 없음"),new Error("드롭다운 컨테이너(.dewp-dropdown)를 찾을 수 없습니다.");const i=s.dataset.dropdownId;if(i&&this.dropdowns.has(i))return i;const n=s.querySelector(".dewp-dropdown-menu");if(!n)throw console.error("🔽 기존 드롭다운 메뉴를 찾을 수 없음"),new Error("기존 드롭다운 메뉴(.dewp-dropdown-menu)를 찾을 수 없습니다.");const o=this.generateId(),r={id:o,element:n,options:e,trigger:t,container:s};this.dropdowns.set(o,r),s.dataset.dropdownId=o;const a=r.trigger,d=r.element;return a.id||(a.id=`${o}-trigger`),d.id||(d.id=`${o}-menu`),a.setAttribute("aria-haspopup","true"),a.setAttribute("aria-controls",d.id),a.setAttribute("aria-expanded","false"),d.setAttribute("role","menu"),d.setAttribute("aria-labelledby",a.id),this.bindDropdownItemEvents(d,o),this.bindTriggerEvents(r),this.updateTriggerText(r,e.placeholder||"선택하세요"),o}findDropdownContainer(e){let t=e.parentElement,s=0;for(;t&&s<10;){if(t.classList.contains("dewp-dropdown")){if(t.querySelector(".dewp-dropdown-menu"))return t}t=t.parentElement,s++}return null}bindDropdownItemEvents(e,t){e.querySelectorAll(".dewp-dropdown-item").forEach(e=>{e.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation();const s=e.currentTarget,i=s.getAttribute("data-value")||s.textContent||"",n=s.textContent||"";this.selectItem(t,i,n);const o=this.dropdowns.get(t);o&&!1!==o.options.autoClose&&this.hide(t)})})}selectItem(e,t,s){const i=this.dropdowns.get(e);i&&(i.selectedValue=t,i.selectedText=s,this.updateTriggerText(i,s),i.options.onSelect&&i.options.onSelect(t,s))}updateTriggerText(e,t){const s=e.trigger,i=s.querySelector(".dewp-dropdown-text");if(i)return void(i.textContent=t);const n=Array.from(s.childNodes).find(e=>{var t;return e.nodeType===Node.TEXT_NODE&&(null===(t=e.textContent)||void 0===t?void 0:t.trim())});if(n)n.textContent=t;else{const e=document.createTextNode(t);s.insertBefore(e,s.firstChild)}}bindTriggerEvents(e){const{trigger:t,id:s}=e,i=s;t.removeEventListener("click",t.__dewpHandler);const n=e=>{e.preventDefault(),e.stopPropagation(),this.activeDropdown&&this.activeDropdown.id===i?this.hide(i):(this.activeDropdown&&this.hide(this.activeDropdown.id),this.show(i))};t.__dewpHandler=n,t.addEventListener("click",n)}show(e){const t=this.dropdowns.get(e);t?(this.activeDropdown&&this.activeDropdown.id!==e&&this.hide(this.activeDropdown.id),this.activeDropdown=t,this.positionDropdown(t),t.element.classList.add("show"),t.trigger.setAttribute("aria-expanded","true"),t.options.onShow&&t.options.onShow()):console.error("🔽 드롭다운 인스턴스를 찾을 수 없음:",e)}hide(e){const t=this.dropdowns.get(e);if(t){t.element.classList.remove("show"),t.trigger.setAttribute("aria-expanded","false");try{t.trigger.focus()}catch{}this.activeDropdown&&this.activeDropdown.id===e&&(this.activeDropdown=null),t.options.onHide&&t.options.onHide()}else console.error("🔽 드롭다운 인스턴스를 찾을 수 없음:",e)}positionDropdown(e){var t;const{element:s,trigger:i,options:n}=e,o=n.position||"bottom",r=n.align||"start",a=null!==(t=n.offset)&&void 0!==t?t:8,d=i.getBoundingClientRect(),c=e.container.getBoundingClientRect(),l=s.getBoundingClientRect();let p=0,h=0;switch(o){case"bottom":p=d.bottom-c.top+a;break;case"top":p=d.top-c.top-l.height-a;break;case"left":h=d.left-c.left-l.width-a,p=d.top-c.top+d.height/2-l.height/2;break;case"right":h=d.right-c.left+a,p=d.top-c.top+d.height/2-l.height/2}switch(r){case"center":"top"!==o&&"bottom"!==o||(h=d.left-c.left+d.width/2-l.width/2);break;case"end":"top"!==o&&"bottom"!==o||(h=d.right-c.left-l.width);break;default:"top"!==o&&"bottom"!==o||(h=d.left-c.left)}s.style.top=`${p}px`,s.style.left=`${h}px`,s.style.zIndex=""+this.zIndex++}toggle(e){this.dropdowns.get(e)?this.activeDropdown&&this.activeDropdown.id===e?this.hide(e):this.show(e):console.error("🔽 드롭다운 인스턴스를 찾을 수 없음:",e)}getSelectedValue(e){var t;return null===(t=this.dropdowns.get(e))||void 0===t?void 0:t.selectedValue}getSelectedText(e){var t;return null===(t=this.dropdowns.get(e))||void 0===t?void 0:t.selectedText}setValue(e,t,s){this.dropdowns.get(e)&&this.selectItem(e,t,s)}getDropdown(e){var t;return null===(t=this.dropdowns.get(e))||void 0===t?void 0:t.element}isOpen(e){const t=this.dropdowns.get(e);return!!t&&t.element.classList.contains("show")}closeAll(){this.dropdowns.forEach((e,t)=>this.hide(t))}destroy(e){const t=this.dropdowns.get(e);if(!t)return;this.hide(e);const s=t.trigger;s.__dewpHandler&&(s.removeEventListener("click",s.__dewpHandler),delete s.__dewpHandler),delete t.container.dataset.dropdownId,this.dropdowns.delete(e)}autoInitialize(){document.querySelectorAll(".dewp-dropdown").forEach(e=>{var t;const s=e.dataset.dropdownId;if(s&&this.dropdowns.has(s))return;const i=e.querySelector(".dewp-dropdown-toggle"),n=e.querySelector(".dewp-dropdown-menu");if(i&&n)try{const s=this.create({trigger:i,content:"",position:"bottom",align:"start",autoClose:!0,placeholder:((null===(t=i.querySelector(".dewp-dropdown-text"))||void 0===t?void 0:t.textContent)||"선택하세요").trim(),onSelect:(t,s)=>{const i=e.querySelector(".dewp-dropdown-text");i&&(i.textContent=s),e.setAttribute("data-selected-value",t)}});n.setAttribute("data-dropdown-id",s)}catch(e){console.error("❌ 드롭다운 자동 초기화 실패:",e)}else console.warn("⚠️ 드롭다운 구조 불완전:",{container:e})})}},z=e=>N.create(e),B=e=>{N.show(e)},H=e=>{N.hide(e)},W=e=>{N.toggle(e)},_=()=>{N.closeAll()},R=e=>N.getSelectedValue(e),V=e=>N.getSelectedText(e),G=(e,t,s)=>{N.setValue(e,t,s)},F=()=>{N.autoInitialize()};const j=new class{constructor(){this.drawers=new Map,this.activeDrawer=null,this.overlay=null,this.initGlobalEvents()}create(e){const t="dewp-drawer-"+Date.now();let s=null;if(e.target&&(s="string"==typeof e.target?document.querySelector(e.target):e.target),!s)throw new Error("Drawer 대상 요소를 찾을 수 없습니다.");let i=null;!1!==e.overlay&&(i=this.createOverlay(),document.body.appendChild(i));const n={id:t,element:s,options:e,trigger:void 0,isOpen:!1,overlay:i||void 0};return this.drawers.set(t,n),this.bindDrawerEvents(n),t}createDrawerElement(e){const t=document.createElement("div");t.className="dewp-drawer",e.position&&t.classList.add(`dewp-drawer-${e.position}`),e.size&&t.classList.add(`dewp-drawer-${e.size}`),e.theme&&t.classList.add(`dewp-drawer-${e.theme}`);const s=this.getDrawerTitle(e);return t.innerHTML=`\n <div class="dewp-drawer-header">\n <h3 class="dewp-drawer-title">${s}</h3>\n <button class="dewp-drawer-close">\n <svg viewBox="0 0 24 24">\n <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>\n </svg>\n </button>\n </div>\n <div class="dewp-drawer-content">\n ${e.content||"<p>Drawer 내용을 여기에 입력하세요.</p>"}\n </div>\n `,t}createOverlay(){const e=document.createElement("div");return e.className="dewp-drawer-overlay",e.addEventListener("click",()=>{this.closeAll()}),e}bindDrawerEvents(e){const{element:t,id:s}=e,i=t.querySelector(".dewp-drawer-close");if(i){const e=i;e.setAttribute("type","button"),e.setAttribute("aria-label","닫기"),e.setAttribute("title","닫기"),e.setAttribute("role","button"),e.addEventListener("click",()=>{this.close(s)}),e.addEventListener("keydown",e=>{const t=e;"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),this.close(s))})}!1!==e.options.closeOnEscape&&document.addEventListener("keydown",t=>{"Escape"===t.key&&e.isOpen&&this.close(s)})}bindTriggerEvents(e){const{trigger:t,id:s}=e;t&&t.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),e.isOpen?this.close(s):this.open(s)})}open(e){const t=this.drawers.get(e);t&&!t.isOpen&&(this.closeAll(),t.options.onBeforeOpen&&t.options.onBeforeOpen(),t.element.classList.add("dewp-drawer-open"),t.isOpen=!0,this.activeDrawer=t,t.overlay&&t.overlay.classList.add("show"),document.body.style.overflow="hidden",t.options.onOpen&&t.options.onOpen())}close(e){const t=this.drawers.get(e);t&&t.isOpen&&(t.options.onBeforeClose&&t.options.onBeforeClose(),t.element.classList.remove("dewp-drawer-open"),t.isOpen=!1,this.activeDrawer=null,t.overlay&&t.overlay.classList.remove("show"),document.body.style.overflow="",t.options.onClose&&t.options.onClose())}closeAll(){this.drawers.forEach(e=>{e.isOpen&&this.close(e.id)})}toggle(e){const t=this.drawers.get(e);t&&(t.isOpen?this.close(e):this.open(e))}destroy(e){const t=this.drawers.get(e);t&&(this.close(e),t.element.parentNode&&t.element.parentNode.removeChild(t.element),this.drawers.delete(e))}getInstance(e){return this.drawers.get(e)}isOpen(e){const t=this.drawers.get(e);return!!t&&t.isOpen}initGlobalEvents(){window.addEventListener("resize",()=>{this.activeDrawer&&this.adjustDrawerPosition(this.activeDrawer)}),window.addEventListener("scroll",()=>{this.activeDrawer&&this.adjustDrawerPosition(this.activeDrawer)},!0)}adjustDrawerPosition(e){}getDrawerTitle(e){return"right"===e.position?"정보 패널":"dark"===e.theme?"다크 테마":"sm"===e.size?"작은 Drawer":"lg"===e.size?"큰 Drawer":"xl"===e.size?"매우 큰 Drawer":"네비게이션"}autoInitialize(){document.querySelectorAll(".dewp-drawer").forEach((e,t)=>{if(!e.getAttribute("data-drawer-id"))try{const t=this.create({target:e,position:this.detectPosition(e),size:this.detectSize(e),theme:this.detectTheme(e),overlay:!0,closeOnEscape:!0,closeOnOverlayClick:!0});e.setAttribute("data-drawer-id",t)}catch(e){console.error("❌ Drawer 자동 초기화 실패:",e)}})}detectPosition(e){return e.classList.contains("dewp-drawer-right")?"right":e.classList.contains("dewp-drawer-top")?"top":e.classList.contains("dewp-drawer-bottom")?"bottom":"left"}detectSize(e){return e.classList.contains("dewp-drawer-sm")?"sm":e.classList.contains("dewp-drawer-lg")?"lg":e.classList.contains("dewp-drawer-xl")?"xl":"md"}detectTheme(e){return e.classList.contains("dewp-drawer-dark")?"dark":e.classList.contains("dewp-drawer-primary")?"primary":"default"}},U=e=>j.create(e),Y=e=>{j.open(e)},X=e=>{j.close(e)},J=e=>{j.toggle(e)},K=()=>{j.closeAll()},Q=e=>{j.destroy(e)},Z=e=>j.isOpen(e),ee=()=>{j.autoInitialize()};const te=new class{constructor(){this.tabInstances=new Map,this.autoInit()}autoInit(){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>this.autoInitTabs()):this.autoInitTabs()}autoInitTabs(){document.querySelectorAll("[data-tabs]").forEach(e=>{e.getAttribute("data-tabs")||e.id||Date.now(),this.initTabs(e,{container:e})})}initTabs(e,t){const s=e.id||"tabs-"+Date.now();this.tabInstances.has(s)&&this.destroy(s);const i=e.querySelector(".dewp-tabs");i&&i.setAttribute("role","tablist");const n=this.findTabElements(e),o=this.findPanelElements(e);if(0===n.size||0===o.size)throw new Error("탭 또는 패널 요소를 찾을 수 없습니다.");const r={id:s,container:e,options:t,tabs:n,panels:o,activeTabId:null};this.tabInstances.set(s,r),n.forEach((e,t)=>{const i=`${s}-tab-${t}`,n=o.get(t);if(n){const o=`${s}-panel-${t}`;e.setAttribute("id",i),e.setAttribute("role","tab"),e.setAttribute("aria-controls",o),e.setAttribute("tabindex","-1"),n.setAttribute("id",o),n.setAttribute("role","tabpanel"),n.setAttribute("aria-labelledby",i),n.setAttribute("tabindex","0")}}),this.bindTabEvents(r);const a=t.activeTab||Array.from(n.keys())[0];return this.activateTab(s,a),s}findTabElements(e){const t=new Map;if(e.querySelectorAll("[data-tab]").forEach(e=>{const s=e.getAttribute("data-tab");s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-tab-btn").forEach((e,s)=>{const i=e.getAttribute("data-tab")||`tab-${s}`;t.set(i,e)})}return t}findPanelElements(e){const t=new Map;if(e.querySelectorAll("[data-panel]").forEach(e=>{const s=e.getAttribute("data-panel");s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-tab-panel").forEach((e,s)=>{const i=e.getAttribute("data-panel")||`panel-${s}`;t.set(i,e)})}return t}bindTabEvents(e){const{tabs:t,container:s}=e;t.forEach((s,i)=>{s.addEventListener("click",t=>{t.preventDefault(),this.activateTab(e.id,i)}),s.addEventListener("keydown",s=>{["Enter"," "].includes(s.key)&&(s.preventDefault(),this.activateTab(e.id,i));const n=Array.from(t.keys()),o=n.indexOf(i);if("ArrowRight"===s.key){const e=n[(o+1)%n.length],s=t.get(e);null==s||s.focus()}else if("ArrowLeft"===s.key){const e=n[(o-1+n.length)%n.length],s=t.get(e);null==s||s.focus()}})})}activateTab(e,t){const s=this.tabInstances.get(e);if(!s)return;const{tabs:i,panels:n,activeTabId:o,options:r}=s,a=i.get(t),d=n.get(t);if(!a||!d)return;if(o){const e=i.get(o),t=n.get(o);e&&(e.classList.remove("active"),e.setAttribute("aria-selected","false"),e.setAttribute("tabindex","-1")),t&&(t.classList.remove("active"),t.setAttribute("aria-hidden","true"))}a.classList.add("active"),a.setAttribute("aria-selected","true"),a.setAttribute("tabindex","0"),a.focus(),d.classList.add("active"),d.setAttribute("aria-hidden","false");const c=s.activeTabId;s.activeTabId=t,r.onTabChange&&r.onTabChange(t,c||void 0),!1!==r.animation&&this.animateTabChange(d)}animateTabChange(e){e.style.opacity="0",e.style.transform="translateY(10px)",requestAnimationFrame(()=>{e.style.transition="all 0.3s ease",e.style.opacity="1",e.style.transform="translateY(0)"})}getActiveTab(e){const t=this.tabInstances.get(e);return t?t.activeTabId:null}getTabInstance(e){return this.tabInstances.get(e)}destroy(e){const t=this.tabInstances.get(e);t&&(t.tabs.forEach(e=>{e.replaceWith(e.cloneNode(!0))}),this.tabInstances.delete(e))}destroyAll(){this.tabInstances.forEach((e,t)=>{this.destroy(t)})}},se=(e,t)=>te.initTabs(e,t||{container:e}),ie=(e,t)=>{te.activateTab(e,t)},ne=e=>te.getActiveTab(e),oe=e=>te.getTabInstance(e),re=e=>{te.destroy(e)};const ae=new class{constructor(){this.accordionInstances=new Map,this.autoInit()}autoInit(){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>this.autoInitAccordions(),100)}):setTimeout(()=>this.autoInitAccordions(),100)}autoInitAccordions(){document.querySelectorAll("[data-accordion]").forEach(e=>{try{e.getAttribute("data-accordion")||e.id||Date.now();this.initAccordion(e,{})}catch(e){}})}initAccordion(e,t){const s=e.getAttribute("data-accordion")||e.id||"accordion-"+Date.now();if(e.hasAttribute("data-accordion-initialized"))return s;this.accordionInstances.has(s)&&this.destroy(s);const i=this.findAccordionItems(e),n=this.findAccordionHeaders(e),o=this.findAccordionContents(e);if(0===i.size)throw new Error("아코디언 아이템을 찾을 수 없습니다.");const r={id:s,container:e,options:{...this.getDefaultOptions(),...t},items:i,headers:n,contents:o,activeItems:new Set};return this.accordionInstances.set(s,r),this.bindAccordionEvents(r),i.forEach((e,t)=>{const s=n.get(t),i=o.get(t);s&&i&&(e.classList.remove("active"),s.classList.remove("active"),s.setAttribute("aria-expanded","false"),i.style.display="none",i.style.height="",i.style.opacity="",i.style.transform="",i.style.transition="",i.style.overflow="")}),t.activeItem&&i.has(t.activeItem)&&this.toggleItem(s,t.activeItem,!0),e.setAttribute("data-accordion-initialized","true"),s}getDefaultOptions(){return{animation:!0,multiple:!1,autoClose:!0}}findAccordionItems(e){const t=new Map;if(e.querySelectorAll("[data-accordion-item]").forEach(e=>{const s=e.getAttribute("data-accordion-item");s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-accordion-item").forEach((e,s)=>{const i=e.id||`accordion-item-${s}`;t.set(i,e)})}return t}findAccordionHeaders(e){const t=new Map;if(e.querySelectorAll("[data-accordion-header]").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-accordion-header").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)})}return t}findAccordionContents(e){const t=new Map;if(e.querySelectorAll("[data-accordion-content]").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-accordion-content").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)})}return t}findParentItemId(e){let t=e.parentElement;for(;t;){if(t.hasAttribute("data-accordion-item")||t.classList.contains("dewp-accordion-item"))return t.getAttribute("data-accordion-item")||t.id||null;t=t.parentElement}return null}bindAccordionEvents(e){const{headers:t,container:s}=e;t.forEach((t,s)=>{t.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.toggleItem(e.id,s)}),t.addEventListener("keydown",t=>{"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),t.stopPropagation(),this.toggleItem(e.id,s))}),t.setAttribute("tabindex","0"),t.setAttribute("role","button"),t.setAttribute("aria-expanded","false"),t.setAttribute("aria-controls",`accordion-content-${s}`)}),e.contents.forEach((e,t)=>{e.setAttribute("id",`accordion-content-${t}`),e.setAttribute("role","region"),e.setAttribute("aria-labelledby",`accordion-header-${t}`)})}toggleItem(e,t,s){const i=this.accordionInstances.get(e);if(!i)return;const{items:n,headers:o,contents:r,options:a}=i,d=n.get(t),c=o.get(t),l=r.get(t);if(!d||!c||!l)return;const p=i.activeItems.has(t),h=void 0!==s?s:!p;h?this.openItemInternal(i,t,d,c,l):this.closeItemInternal(i,t,d,c,l),a.onItemToggle&&a.onItemToggle(t,h)}openItemInternal(e,t,s,i,n){const{options:o,activeItems:r}=e;!o.multiple&&o.autoClose&&r.forEach(s=>{s!==t&&this.closeItemInternal(e,s,e.items.get(s),e.headers.get(s),e.contents.get(s))}),r.add(t),s.classList.add("active"),i.classList.add("active"),i.setAttribute("aria-expanded","true"),o.animation?this.animateContent(n,!0):n.style.display="block"}closeItemInternal(e,t,s,i,n){const{options:o,activeItems:r}=e;r.delete(t),s.classList.remove("active"),i.classList.remove("active"),i.setAttribute("aria-expanded","false"),o.animation?this.animateContent(n,!1):n.style.display="none"}animateContent(e,t){t?(e.style.display="block",e.style.overflow="hidden",e.style.height="0px",e.style.opacity="0",e.style.transform="translateY(-10px)",e.offsetHeight,e.style.transition="all 0.4s cubic-bezier(0.4, 0, 0.2, 1)",e.style.height=e.scrollHeight+"px",e.style.opacity="1",e.style.transform="translateY(0)",setTimeout(()=>{e.style.height="",e.style.overflow="",e.style.transition="",e.style.opacity="",e.style.transform=""},400)):(e.style.overflow="hidden",e.style.height=e.scrollHeight+"px",e.style.opacity="1",e.style.transform="translateY(0)",e.offsetHeight,e.style.transition="all 0.4s cubic-bezier(0.4, 0, 0.2, 1)",e.style.height="0px",e.style.opacity="0",e.style.transform="translateY(-10px)",setTimeout(()=>{e.style.display="none",e.style.height="",e.style.overflow="",e.style.transition="",e.style.opacity="",e.style.transform=""},400))}openItem(e,t){this.toggleItem(e,t,!0)}closeItem(e,t){this.toggleItem(e,t,!1)}openAllItems(e){const t=this.accordionInstances.get(e);t&&t.items.forEach((t,s)=>{this.openItem(e,s)})}closeAllItems(e){const t=this.accordionInstances.get(e);t&&t.items.forEach((t,s)=>{this.closeItem(e,s)})}getActiveItems(e){const t=this.accordionInstances.get(e);return t?Array.from(t.activeItems):[]}isItemOpen(e,t){const s=this.accordionInstances.get(e);return!!s&&s.activeItems.has(t)}getAccordionInstance(e){return this.accordionInstances.get(e)||null}destroy(e){const t=this.accordionInstances.get(e);t&&(t.headers.forEach(e=>{e.removeEventListener("click",()=>{}),e.removeEventListener("keydown",()=>{})}),this.accordionInstances.delete(e))}destroyAll(){this.accordionInstances.forEach((e,t)=>{this.destroy(t)})}},de=(e,t)=>ae.initAccordion(e,t),ce=(e,t,s)=>{ae.toggleItem(e,t,s)},le=(e,t)=>{ae.openItem(e,t)},pe=(e,t)=>{ae.closeItem(e,t)},he=e=>{ae.openAllItems(e)},ue=e=>{ae.closeAllItems(e)},me=e=>ae.getActiveItems(e),we=(e,t)=>ae.isItemOpen(e,t),ge=e=>ae.getAccordionInstance(e),ve=e=>{ae.destroy(e)},be=()=>{ae.destroyAll()};const fe=new class{constructor(){this.popovers=new Map,this.triggerIndex=new WeakMap,this.active=null,this.uid=0,this.docHandlersBound=!1,this.bindDocumentHandlers()}genId(){var e,t;const s=(++this.uid).toString(36);try{return`dewp-popover-${null!==(t=null===(e=crypto.randomUUID)||void 0===e?void 0:e.call(crypto))&&void 0!==t?t:`${Date.now().toString(36)}-${s}`}`}catch{return`dewp-popover-${Date.now().toString(36)}-${s}`}}create(e){const t=this.genId(),s="string"==typeof e.trigger?document.querySelector(e.trigger):e.trigger;if(!s)throw new Error("Popover trigger not found");let i;"string"==typeof e.content?(i=document.createElement("div"),i.className="dewp-popover-content dewp-popover-bottom",i.innerHTML=e.content):(i=e.content,i.classList.add("dewp-popover-content")),s.id||(s.id=`${t}-trigger`),i.id||(i.id=`${t}-content`),s.setAttribute("aria-haspopup","dialog"),s.setAttribute("aria-controls",i.id),s.setAttribute("aria-expanded","false"),i.setAttribute("role","dialog"),i.setAttribute("aria-labelledby",s.id);const n=s.closest(".dewp-popover")||s.parentElement;!i.parentElement&&n&&n.appendChild(i);const o=e.placement||"bottom";i.classList.remove("dewp-popover-top","dewp-popover-bottom","dewp-popover-left","dewp-popover-right"),i.classList.add(`dewp-popover-${o}`);const r={id:t,trigger:s,popover:i,options:{placement:o,closeOnEscape:!1!==e.closeOnEscape},isOpen:!1};return this.popovers.set(t,r),this.triggerIndex.set(s,t),s.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),this.toggle(t)}),t}bindDocumentHandlers(){this.docHandlersBound||(document.addEventListener("click",e=>{const t=e.target,s=this.active;s&&(s.trigger.contains(t)||s.popover.contains(t)||this.close(s.id))}),document.addEventListener("keydown",e=>{if("Escape"!==e.key)return;const t=this.active;t&&t.options.closeOnEscape&&this.close(t.id)}),this.docHandlersBound=!0)}open(e){var t;const s=this.popovers.get(e);s&&(this.active&&this.active.id!==e&&this.close(this.active.id),null===(t=s.popover.parentElement)||void 0===t||t.classList.add("is-open"),s.popover.classList.add("is-open"),s.trigger.setAttribute("aria-expanded","true"),s.isOpen=!0,this.active=s)}close(e){var t;const s=this.popovers.get(e);if(s){null===(t=s.popover.parentElement)||void 0===t||t.classList.remove("is-open"),s.popover.classList.remove("is-open"),s.trigger.setAttribute("aria-expanded","false"),s.isOpen=!1,this.active&&this.active.id===e&&(this.active=null);try{s.trigger.focus()}catch{}}}toggle(e){const t=this.popovers.get(e);t&&(t.isOpen?this.close(e):this.open(e))}toggleByTrigger(e){const t=this.triggerIndex.get(e);t&&this.toggle(t)}destroy(e){const t=this.popovers.get(e);t&&(this.close(e),this.triggerIndex.delete(t.trigger),this.popovers.delete(e))}},ye=e=>fe.create(e),Ee=e=>fe.open(e),Ae=e=>fe.close(e),Ie=e=>fe.toggle(e);class De{constructor(e){this.sidebar=null,this.activeItemId=null,this.isCollapsed=!1,this.config=e,this.init()}init(){this.createSidebar(),this.render(),this.bindEvents(),this.setActiveItem()}createSidebar(){const e=document.querySelector(".dewp-sidebar");e&&e.remove(),this.sidebar=document.createElement("div"),this.sidebar.className="dewp-sidebar dewp-sidebar--wrapper is-sticky",this.sidebar.id="dewp-sidebar",document.body.appendChild(this.sidebar)}render(){this.sidebar&&(this.sidebar.innerHTML=`\n <div class="dewp-sidebar-inner">\n ${this.renderHeader()}\n ${this.renderGroups()}\n ${this.renderFooter()}\n </div>\n `)}renderHeader(){const e=this.config.subtitle?`<p class="dewp-sidebar-subtitle">${this.config.subtitle}</p>`:"";return`\n <div class="dewp-sidebar-header">\n <h1 class="dewp-sidebar-title">${this.config.title}</h1>\n ${e}\n </div>\n `}renderGroups(){return this.config.groups.map(e=>`\n <div class="dewp-sidebar-group" data-group-id="${e.id}">\n ${e.title?`<h2 class="dewp-sidebar-group-title">${e.title}</h2>`:""}\n <ul class="dewp-sidebar-menu">\n ${this.renderMenuItems(e.items)}\n </ul>\n </div>\n `).join("")}renderMenuItems(e){return e.map(e=>{const t=e.icon?`<span class="dewp-sidebar-menu-icon">${e.icon}</span>`:"",s=e.hasSubmenu?'\n <span class="dewp-sidebar-menu-arrow">\n <svg viewBox="0 0 24 24">\n <path d="M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z"/>\n </svg>\n </span>\n ':"",i=e.hasSubmenu&&e.submenu?`\n <ul class="dewp-sidebar-submenu" id="submenu-${e.id}" aria-hidden="true">\n ${this.renderMenuItems(e.submenu)}\n </ul>\n `:"";return`\n <li class="dewp-sidebar-menu-item ${e.isActive?"is-active":""} ${e.hasSubmenu?"has-submenu":""}" data-item-id="${e.id}">\n <a href="${e.url||"#"}" class="dewp-sidebar-menu-link" ${e.url?"":'onclick="return false;"'} ${e.hasSubmenu?'role="button" aria-expanded="false" aria-controls="submenu-'+e.id+'"':""}>\n ${t}\n <span class="dewp-sidebar-menu-text">${e.text}</span>\n ${s}\n </a>\n ${i}\n </li>\n `}).join("")}renderFooter(){return this.config.footerText?`\n <div class="dewp-sidebar-footer">\n <p class="dewp-sidebar-footer-text">${this.config.footerText}</p>\n </div>\n `:""}bindEvents(){this.sidebar&&(this.sidebar.addEventListener("click",e=>{const t=e.target.closest(".dewp-sidebar-menu-item");if(!t)return;const s=t.getAttribute("data-item-id");s&&(t.classList.contains("has-submenu")?(e.preventDefault(),this.toggleSubmenu(t)):this.setActiveItem(s))}),document.addEventListener("keydown",e=>{"Escape"===e.key&&window.innerWidth<=768&&this.closeMobileSidebar()}))}toggleSubmenu(e){var t;const s=e.querySelector(".dewp-sidebar-submenu");if(!s)return;const i=s.classList.contains("expanded"),n=null===(t=e.parentElement)||void 0===t?void 0:t.querySelectorAll(".dewp-sidebar-menu-item.has-submenu");if(null==n||n.forEach(t=>{if(t!==e){const e=t.querySelector(".dewp-sidebar-submenu"),s=t.querySelector(".dewp-sidebar-menu-link");e&&e.classList.contains("expanded")&&(e.classList.remove("expanded"),e.style.maxHeight="0",null==s||s.setAttribute("aria-expanded","false"),e.setAttribute("aria-hidden","true")),t.classList.remove("is-open")}}),i){s.classList.remove("expanded"),s.style.maxHeight="0";const t=e.querySelector(".dewp-sidebar-menu-link");null==t||t.setAttribute("aria-expanded","false"),s.setAttribute("aria-hidden","true"),e.classList.remove("is-open")}else{s.classList.add("expanded"),s.style.maxHeight=s.scrollHeight+"px";const t=e.querySelector(".dewp-sidebar-menu-link");null==t||t.setAttribute("aria-expanded","true"),s.setAttribute("aria-hidden","false"),e.classList.add("is-open")}}setActiveItem(e){var t,s;e&&(this.activeItemId=e);const i=null===(t=this.sidebar)||void 0===t?void 0:t.querySelectorAll(".dewp-sidebar-menu-item.is-active");if(null==i||i.forEach(e=>e.classList.remove("is-active")),this.activeItemId){const e=null===(s=this.sidebar)||void 0===s?void 0:s.querySelector(`[data-item-id="${this.activeItemId}"]`);null==e||e.classList.add("is-active")}}addDivider(e,t="after"){var s;const i=null===(s=this.sidebar)||void 0===s?void 0:s.querySelector(`[data-group-id="${e}"]`);if(!i)return;const n=document.createElement("div");n.className="dewp-sidebar-divider","before"===t?i.insertBefore(n,i.firstChild):i.appendChild(n)}addGroup(e){this.config.groups.push(e),this.render(),this.bindEvents()}addMenuItem(e,t){const s=this.config.groups.find(t=>t.id===e);s&&(s.items.push(t),this.render(),this.bindEvents())}removeMenuItem(e,t){const s=this.config.groups.find(t=>t.id===e);s&&(s.items=s.items.filter(e=>e.id!==t),this.render(),this.bindEvents())}toggle(){this.sidebar&&window.innerWidth<=768&&this.sidebar.classList.toggle("is-open")}toggleCollapse(){this.sidebar&&(this.isCollapsed=!this.isCollapsed,this.sidebar.classList.toggle("is-collapsed",this.isCollapsed))}collapse(){this.sidebar&&(this.isCollapsed=!0,this.sidebar.classList.add("is-collapsed"))}expand(){this.sidebar&&(this.isCollapsed=!1,this.sidebar.classList.remove("is-collapsed"))}openMobileSidebar(){this.sidebar&&this.sidebar.classList.add("is-open")}closeMobileSidebar(){this.sidebar&&this.sidebar.classList.remove("is-open")}destroy(){this.sidebar&&(this.sidebar.remove(),this.sidebar=null)}updateConfig(e){this.config={...this.config,...e},this.render(),this.bindEvents()}getActiveItemId(){return this.activeItemId}getElement(){return this.sidebar}}window.DEWPSidebar=De;class Le{constructor(e,t={}){var s,i,n;this.input=e.querySelector(".dewp-stepper-input"),this.decrementBtn=e.querySelector(".dewp-stepper-decrement"),this.incrementBtn=e.querySelector(".dewp-stepper-increment"),this.options={min:null!==(s=t.min)&&void 0!==s?s:Number.MIN_SAFE_INTEGER,max:null!==(i=t.max)&&void 0!==i?i:Number.MAX_SAFE_INTEGER,step:null!==(n=t.step)&&void 0!==n?n:1},"number"==typeof t.value&&(this.input.value=String(t.value)),this.bindEvents(t.onChange),this.syncDisabled()}bindEvents(e){const t=()=>this.clamp(parseFloat(this.input.value||"0")),s=t=>{e&&e(t)};this.decrementBtn.addEventListener("click",()=>{const e=this.clamp(t()-this.options.step);this.input.value=String(e),this.syncDisabled(),s(e)}),this.incrementBtn.addEventListener("click",()=>{const e=this.clamp(t()+this.options.step);this.input.value=String(e),this.syncDisabled(),s(e)}),this.input.addEventListener("input",()=>{const e=t();this.input.value=String(e),this.syncDisabled(),s(e)})}clamp(e){return Math.min(this.options.max,Math.max(this.options.min,isNaN(e)?0:e))}syncDisabled(){const e=parseFloat(this.input.value||"0");this.decrementBtn.disabled=e<=this.options.min,this.incrementBtn.disabled=e>=this.options.max}}const Te="0.6.0";var Ce={qs:e,qsa:t,create:s,addClass:i,removeClass:n,toggleClass:o,hasClass:r,setText:a,setHTML:d,on:c,off:l,remove:p,append:h,insertBefore:u,clearChildren:I,setStyle:m,setData:w,getData:g,isDOMReady:v,onDOMReady:b,isElementVisible:f,scrollToElement:y,getElementRect:E,isChildOf:A,showToast:L,showSuccessToast:T,showWarningToast:x,showErrorToast:C,showInfoToast:S,createModal:M,openModal:$,closeModal:O,showModal:q,showConfirmModal:P,createDropdown:z,toggleDropdown:W,showDropdown:B,hideDropdown:H,closeAllDropdowns:_,getSelectedValue:R,getSelectedText:V,setDropdownValue:G,autoInitializeDropdowns:F,initTabs:se,activateTab:ie,getActiveTab:ne,getTabInstance:oe,destroyTabs:re,initAccordion:de,toggleAccordionItem:ce,openAccordionItem:le,closeAccordionItem:pe,openAllAccordionItems:he,closeAllAccordionItems:ue,getActiveAccordionItems:me,isAccordionItemOpen:we,getAccordionInstance:ge,destroyAccordion:ve,destroyAllAccordions:be,createDrawer:U,openDrawer:Y,closeDrawer:X,toggleDrawer:J,closeAllDrawers:K,destroyDrawer:Q,isDrawerOpen:Z,autoInitializeDrawers:ee,createPopover:ye,openPopover:Ee,closePopover:Ae,togglePopover:Ie,DEWPSidebar:De,DEWPStepper:Le,initStepper:(e,t={})=>new Le(e,t),ready:b,version:Te,info:{name:"DesignBase WordPress Library",description:"간단하고 강력한 프론트엔드 라이브러리",version:Te,author:"DesignBase",license:"MIT"}};if("undefined"!=typeof window){const D=window.DEWP={},k={qs:e,qsa:t,create:s,addClass:i,removeClass:n,toggleClass:o,hasClass:r,setText:a,setHTML:d,on:c,off:l,remove:p,append:h,insertBefore:u,clearChildren:I,setStyle:m,setData:w,getData:g,isDOMReady:v,onDOMReady:b,isElementVisible:f,scrollToElement:y,getElementRect:E,isChildOf:A,showToast:L,showSuccessToast:T,showWarningToast:x,showErrorToast:C,showInfoToast:S,createModal:M,openModal:$,closeModal:O,showModal:q,showConfirmModal:P,createDropdown:z,toggleDropdown:W,showDropdown:B,hideDropdown:H,closeAllDropdowns:_,getSelectedValue:R,getSelectedText:V,setDropdownValue:G,autoInitializeDropdowns:F,createDrawer:U,openDrawer:Y,closeDrawer:X,toggleDrawer:J,closeAllDrawers:K,destroyDrawer:Q,isDrawerOpen:Z,autoInitializeDrawers:ee,initTabs:se,activateTab:ie,getActiveTab:ne,getTabInstance:oe,destroyTabs:re,initAccordion:de,toggleAccordionItem:ce,openAccordionItem:le,closeAccordionItem:pe,openAllAccordionItems:he,closeAllAccordionItems:ue,getActiveAccordionItems:me,isAccordionItemOpen:we,getAccordionInstance:ge,destroyAccordion:ve,destroyAllAccordions:be,DEWPSidebar:De,createPopover:ye,openPopover:Ee,closePopover:Ae,togglePopover:Ie,ready:b,version:Te,info:{name:"DesignBase WordPress Library",description:"간단하고 강력한 프론트엔드 라이브러리",version:Te,author:"DesignBase",license:"MIT"}};Object.keys(k).forEach(e=>{D[e]=k[e]});try{console.log(`[DEWP] v${Te} loaded`)}catch{}b(()=>{try{F()}catch{}try{ee()}catch{}});try{"loading"!==document.readyState&&(F(),ee())}catch{}}return Ce}();
|
|
1
|
+
var DEWP=function(){"use strict";function e(e,t=document){return t.querySelector(e)}function t(e,t=document){return Array.from(t.querySelectorAll(e))}function s(e,t={}){const s=document.createElement(e);return Object.assign(s,t),s}function i(e,t){e.classList.add(t)}function n(e,t){e.classList.remove(t)}function o(e,t,s){return e.classList.toggle(t,s)}function r(e,t){return e.classList.contains(t)}function a(e,t){e.textContent=t}function d(e,t){e.innerHTML=t}function c(e,t,s,i){e.addEventListener(t,s,i)}function l(e,t,s,i){e.removeEventListener(t,s,i)}function p(e){e.remove()}function h(e,t){e.appendChild(t)}function u(e,t,s){e.insertBefore(t,s)}function m(e,t,s){e.style.setProperty(t,s)}function w(e,t,s){e.setAttribute(`data-${t}`,s)}function g(e,t){return e.getAttribute(`data-${t}`)}function v(){return"loading"!==document.readyState}function b(e){v()?e():c(document,"DOMContentLoaded",e,{once:!0})}function f(e,t=0){return new Promise(s=>{const i=new IntersectionObserver(([e])=>{i.disconnect(),s(e.isIntersecting)},{threshold:t});i.observe(e)})}function y(e,t="smooth"){e.scrollIntoView({behavior:t,block:"start"})}function E(e){return e.getBoundingClientRect()}function A(e,t){return t.contains(e)}function I(e){for(;e.firstChild;)e.removeChild(e.firstChild)}const D=new class{constructor(){this.container=null,this.init()}init(){this.createContainer()}createContainer(){const e=document.getElementById("dewp-toast-container");e&&e.remove(),this.container=document.createElement("div"),this.container.id="dewp-toast-container",this.container.className="dewp-toast-container dewp-toast-container-top-right",document.body.appendChild(this.container)}show(e,t="info",s=5e3,i="md"){this.container||this.createContainer();const n="dewp-toast-"+Date.now(),o=this.createToastElement(n,e,t,i);try{Array.from(this.container.querySelectorAll(".dewp-toast .dewp-toast-message")).some(t=>t.textContent===String(e))&&this.hideAll()}catch(e){}return this.container.appendChild(o),requestAnimationFrame(()=>{o.classList.add("show"),o.classList.add("toast-slide-in")}),s>0&&setTimeout(()=>{this.hide(n)},s),n}createToastElement(e,t,s,i="md"){const n=document.createElement("div");n.id=e,n.className=`dewp-toast dewp-toast-${s} dewp-toast-${i}`;const o=document.createElement("div");o.className="dewp-toast-content";const r=document.createElement("span");r.className="dewp-toast-icon",r.innerHTML=this.getTypeIcon(s);const a=document.createElement("div");a.className="dewp-toast-message",a.textContent=t;const d=document.createElement("button");return d.className="dewp-toast-close",d.type="button",d.innerHTML="<span>×</span>",d.setAttribute("aria-label","토스트 닫기"),d.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.hide(e)}),o.appendChild(r),o.appendChild(a),o.appendChild(d),n.appendChild(o),n}getTypeIcon(e){return{info:"ℹ️",success:"✅",warning:"⚠️",error:"❌"}[e]}hide(e){const t=document.getElementById(e);t&&(t.classList.remove("show","toast-slide-in"),t.classList.add("toast-slide-out"),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t)},300))}hideAll(){if(this.container){this.container.querySelectorAll(".dewp-toast").forEach(e=>{const t=e.id;t&&this.hide(t)})}}success(e,t,s){return this.show(e,"success",t,s)}error(e,t,s){return this.show(e,"error",t,s)}warning(e,t,s){return this.show(e,"warning",t,s)}info(e,t,s){return this.show(e,"info",t,s)}},L=(e,t,s,i)=>D.show(e,t||"info",s,i),T=(e,t,s)=>D.success(e,t,s),C=(e,t,s)=>D.error(e,t,s),x=(e,t,s)=>D.warning(e,t,s),S=(e,t,s)=>D.info(e,t,s);const k=new class{constructor(){this.modals=new Map,this.activeModal=null,this.backdrop=null,this.zIndex=1050,this.init()}init(){this.createBackdrop(),this.bindEvents()}createBackdrop(){this.backdrop=document.createElement("div"),this.backdrop.className="dewp-modal-backdrop",document.body.appendChild(this.backdrop)}bindEvents(){document.addEventListener("keydown",e=>{"Escape"===e.key&&this.activeModal&&this.close(this.activeModal.id)}),this.backdrop&&this.backdrop.addEventListener("click",()=>{this.activeModal&&this.close(this.activeModal.id)})}create(e={}){const t="dewp-modal-"+Date.now(),s=this.createModalElement(t,e);return this.modals.set(t,s),document.body.appendChild(s),t}createModalElement(e,t){const s=document.createElement("div");s.id=e,s.className="dewp-modal";const i=t.size||"md";if(s.className=`dewp-modal ${{sm:"dewp-modal-sm",md:"dewp-modal-md",lg:"dewp-modal-lg",xl:"dewp-modal-xl",full:"dewp-modal-full"}[i]}`,t.title){const i=document.createElement("div");i.className="dewp-modal-header";const n=document.createElement("h3");if(n.textContent=t.title,i.appendChild(n),!1!==t.closable){const t=document.createElement("button");t.className="dewp-modal-close",t.innerHTML="×",t.addEventListener("click",()=>{this.close(e)}),i.appendChild(t)}s.appendChild(i)}if(t.content){const e=document.createElement("div");e.className="dewp-modal-body","string"==typeof t.content?e.innerHTML=t.content:e.appendChild(t.content),s.appendChild(e)}if(t.showCancel||t.confirmText){const i=document.createElement("div");if(i.className="dewp-modal-footer",t.showCancel){const s=document.createElement("button");s.className="dewp-modal-cancel",s.textContent=t.cancelText||"취소",s.addEventListener("click",()=>{t.onCancel&&t.onCancel(),this.close(e)}),i.appendChild(s)}if(t.confirmText){const s=document.createElement("button");s.className="dewp-modal-confirm",s.textContent=t.confirmText,s.addEventListener("click",()=>{t.onConfirm&&t.onConfirm(),this.close(e)}),i.appendChild(s)}s.appendChild(i)}return s}open(e){const t=this.modals.get(e);t&&(this.activeModal=t,this.showBackdrop(),t.style.opacity="1",t.style.visibility="visible",t.style.transform="translate(-50%, -50%) scale(1)",t.querySelector("button")&&t.querySelector("button").focus())}close(e){const t=this.modals.get(e);t&&(t.style.opacity="0",t.style.visibility="hidden",t.style.transform="translate(-50%, -50%) scale(0.9)",setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t),this.modals.delete(e),this.activeModal===t&&(this.activeModal=null,this.hideBackdrop())},300))}showBackdrop(){this.backdrop&&(this.backdrop.style.opacity="1",this.backdrop.style.visibility="visible")}hideBackdrop(){this.backdrop&&(this.backdrop.style.opacity="0",this.backdrop.style.visibility="hidden")}show(e={}){const t=this.create(e);return this.open(t),t}confirm(e){const t=this.create({title:e.title||"확인",content:e.message,confirmText:e.confirmText||"확인",cancelText:"취소",showCancel:!0,onConfirm:e.onConfirm,onCancel:e.onCancel});this.open(t)}alert(e,t){const s=this.create({title:t||"알림",content:e,confirmText:"확인"});this.open(s)}getModal(e){return this.modals.get(e)}isOpen(e){const t=this.modals.get(e);return!!t&&"visible"===t.style.visibility}closeAll(){this.modals.forEach((e,t)=>{this.close(t)})}},M=(e={})=>k.create(e),$=e=>{k.open(e)},O=e=>{k.close(e)},q=(e={})=>k.show(e),P=e=>{k.confirm(e)};const N=new class{constructor(){this.dropdowns=new Map,this.activeDropdown=null,this.zIndex=1e3,this.uidCounter=0,this.init()}init(){this.bindGlobalEvents()}generateId(){return`dewp-dropdown-${"undefined"!=typeof crypto&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}-${++this.uidCounter}`}`}bindGlobalEvents(){document.addEventListener("click",e=>{if(!this.activeDropdown)return;const t=e.target,s=this.activeDropdown.trigger.contains(t),i=this.activeDropdown.element.contains(t);s||i||!1!==this.activeDropdown.options.autoClose&&this.hide(this.activeDropdown.id)}),document.addEventListener("keydown",e=>{"Escape"===e.key&&this.activeDropdown&&!1!==this.activeDropdown.options.autoClose&&this.hide(this.activeDropdown.id)});const e=()=>{this.activeDropdown&&this.positionDropdown(this.activeDropdown)};window.addEventListener("resize",e),window.addEventListener("scroll",e,!0)}create(e){const t="string"==typeof e.trigger?document.querySelector(e.trigger):e.trigger;if(!t)throw console.error("🔽 드롭다운 트리거 요소를 찾을 수 없음:",e.trigger),new Error("드롭다운 트리거 요소를 찾을 수 없습니다.");const s=this.findDropdownContainer(t);if(!s)throw console.error("🔽 드롭다운 컨테이너를 찾을 수 없음"),new Error("드롭다운 컨테이너(.dewp-dropdown)를 찾을 수 없습니다.");const i=s.dataset.dropdownId;if(i&&this.dropdowns.has(i))return i;const n=s.querySelector(".dewp-dropdown-menu");if(!n)throw console.error("🔽 기존 드롭다운 메뉴를 찾을 수 없음"),new Error("기존 드롭다운 메뉴(.dewp-dropdown-menu)를 찾을 수 없습니다.");const o=this.generateId(),r={id:o,element:n,options:e,trigger:t,container:s};this.dropdowns.set(o,r),s.dataset.dropdownId=o;const a=r.trigger,d=r.element;return a.id||(a.id=`${o}-trigger`),d.id||(d.id=`${o}-menu`),a.setAttribute("aria-haspopup","true"),a.setAttribute("aria-controls",d.id),a.setAttribute("aria-expanded","false"),d.setAttribute("role","menu"),d.setAttribute("aria-labelledby",a.id),this.bindDropdownItemEvents(d,o),this.bindTriggerEvents(r),this.updateTriggerText(r,e.placeholder||"선택하세요"),o}findDropdownContainer(e){let t=e.parentElement,s=0;for(;t&&s<10;){if(t.classList.contains("dewp-dropdown")){if(t.querySelector(".dewp-dropdown-menu"))return t}t=t.parentElement,s++}return null}bindDropdownItemEvents(e,t){e.querySelectorAll(".dewp-dropdown-item").forEach(e=>{e.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation();const s=e.currentTarget,i=s.getAttribute("data-value")||s.textContent||"",n=s.textContent||"";this.selectItem(t,i,n);const o=this.dropdowns.get(t);o&&!1!==o.options.autoClose&&this.hide(t)})})}selectItem(e,t,s){const i=this.dropdowns.get(e);i&&(i.selectedValue=t,i.selectedText=s,this.updateTriggerText(i,s),i.options.onSelect&&i.options.onSelect(t,s))}updateTriggerText(e,t){const s=e.trigger,i=s.querySelector(".dewp-dropdown-text");if(i)return void(i.textContent=t);const n=Array.from(s.childNodes).find(e=>{var t;return e.nodeType===Node.TEXT_NODE&&(null===(t=e.textContent)||void 0===t?void 0:t.trim())});if(n)n.textContent=t;else{const e=document.createTextNode(t);s.insertBefore(e,s.firstChild)}}bindTriggerEvents(e){const{trigger:t,id:s}=e,i=s;t.removeEventListener("click",t.__dewpHandler);const n=e=>{e.preventDefault(),e.stopPropagation(),this.activeDropdown&&this.activeDropdown.id===i?this.hide(i):(this.activeDropdown&&this.hide(this.activeDropdown.id),this.show(i))};t.__dewpHandler=n,t.addEventListener("click",n)}show(e){const t=this.dropdowns.get(e);t?(this.activeDropdown&&this.activeDropdown.id!==e&&this.hide(this.activeDropdown.id),this.activeDropdown=t,this.positionDropdown(t),t.element.classList.add("show"),t.trigger.setAttribute("aria-expanded","true"),t.options.onShow&&t.options.onShow()):console.error("🔽 드롭다운 인스턴스를 찾을 수 없음:",e)}hide(e){const t=this.dropdowns.get(e);if(t){t.element.classList.remove("show"),t.trigger.setAttribute("aria-expanded","false");try{t.trigger.focus()}catch{}this.activeDropdown&&this.activeDropdown.id===e&&(this.activeDropdown=null),t.options.onHide&&t.options.onHide()}else console.error("🔽 드롭다운 인스턴스를 찾을 수 없음:",e)}positionDropdown(e){var t;const{element:s,trigger:i,options:n}=e,o=n.position||"bottom",r=n.align||"start",a=null!==(t=n.offset)&&void 0!==t?t:8,d=i.getBoundingClientRect(),c=e.container.getBoundingClientRect(),l=s.getBoundingClientRect();let p=0,h=0;switch(o){case"bottom":p=d.bottom-c.top+a;break;case"top":p=d.top-c.top-l.height-a;break;case"left":h=d.left-c.left-l.width-a,p=d.top-c.top+d.height/2-l.height/2;break;case"right":h=d.right-c.left+a,p=d.top-c.top+d.height/2-l.height/2}switch(r){case"center":"top"!==o&&"bottom"!==o||(h=d.left-c.left+d.width/2-l.width/2);break;case"end":"top"!==o&&"bottom"!==o||(h=d.right-c.left-l.width);break;default:"top"!==o&&"bottom"!==o||(h=d.left-c.left)}s.style.top=`${p}px`,s.style.left=`${h}px`,s.style.zIndex=""+this.zIndex++}toggle(e){this.dropdowns.get(e)?this.activeDropdown&&this.activeDropdown.id===e?this.hide(e):this.show(e):console.error("🔽 드롭다운 인스턴스를 찾을 수 없음:",e)}getSelectedValue(e){var t;return null===(t=this.dropdowns.get(e))||void 0===t?void 0:t.selectedValue}getSelectedText(e){var t;return null===(t=this.dropdowns.get(e))||void 0===t?void 0:t.selectedText}setValue(e,t,s){this.dropdowns.get(e)&&this.selectItem(e,t,s)}getDropdown(e){var t;return null===(t=this.dropdowns.get(e))||void 0===t?void 0:t.element}isOpen(e){const t=this.dropdowns.get(e);return!!t&&t.element.classList.contains("show")}closeAll(){this.dropdowns.forEach((e,t)=>this.hide(t))}destroy(e){const t=this.dropdowns.get(e);if(!t)return;this.hide(e);const s=t.trigger;s.__dewpHandler&&(s.removeEventListener("click",s.__dewpHandler),delete s.__dewpHandler),delete t.container.dataset.dropdownId,this.dropdowns.delete(e)}autoInitialize(){document.querySelectorAll(".dewp-dropdown").forEach(e=>{var t;const s=e.dataset.dropdownId;if(s&&this.dropdowns.has(s))return;const i=e.querySelector(".dewp-dropdown-toggle"),n=e.querySelector(".dewp-dropdown-menu");if(i&&n)try{const s=this.create({trigger:i,content:"",position:"bottom",align:"start",autoClose:!0,placeholder:((null===(t=i.querySelector(".dewp-dropdown-text"))||void 0===t?void 0:t.textContent)||"선택하세요").trim(),onSelect:(t,s)=>{const i=e.querySelector(".dewp-dropdown-text");i&&(i.textContent=s),e.setAttribute("data-selected-value",t)}});n.setAttribute("data-dropdown-id",s)}catch(e){console.error("❌ 드롭다운 자동 초기화 실패:",e)}else console.warn("⚠️ 드롭다운 구조 불완전:",{container:e})})}},z=e=>N.create(e),B=e=>{N.show(e)},H=e=>{N.hide(e)},W=e=>{N.toggle(e)},_=()=>{N.closeAll()},R=e=>N.getSelectedValue(e),V=e=>N.getSelectedText(e),G=(e,t,s)=>{N.setValue(e,t,s)},F=()=>{N.autoInitialize()};const j=new class{constructor(){this.drawers=new Map,this.activeDrawer=null,this.overlay=null,this.initGlobalEvents()}create(e){const t="dewp-drawer-"+Date.now();let s=null;if(e.target&&(s="string"==typeof e.target?document.querySelector(e.target):e.target),!s)throw new Error("Drawer 대상 요소를 찾을 수 없습니다.");let i=null;!1!==e.overlay&&(i=this.createOverlay(),document.body.appendChild(i));const n={id:t,element:s,options:e,trigger:void 0,isOpen:!1,overlay:i||void 0};return this.drawers.set(t,n),this.bindDrawerEvents(n),t}createDrawerElement(e){const t=document.createElement("div");t.className="dewp-drawer",e.position&&t.classList.add(`dewp-drawer-${e.position}`),e.size&&t.classList.add(`dewp-drawer-${e.size}`),e.theme&&t.classList.add(`dewp-drawer-${e.theme}`);const s=this.getDrawerTitle(e);return t.innerHTML=`\n <div class="dewp-drawer-header">\n <h3 class="dewp-drawer-title">${s}</h3>\n <button class="dewp-drawer-close">\n <svg viewBox="0 0 24 24">\n <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>\n </svg>\n </button>\n </div>\n <div class="dewp-drawer-content">\n ${e.content||"<p>Drawer 내용을 여기에 입력하세요.</p>"}\n </div>\n `,t}createOverlay(){const e=document.createElement("div");return e.className="dewp-drawer-overlay",e.addEventListener("click",()=>{this.closeAll()}),e}bindDrawerEvents(e){const{element:t,id:s}=e,i=t.querySelector(".dewp-drawer-close");if(i){const e=i;e.setAttribute("type","button"),e.setAttribute("aria-label","닫기"),e.setAttribute("title","닫기"),e.setAttribute("role","button"),e.addEventListener("click",()=>{this.close(s)}),e.addEventListener("keydown",e=>{const t=e;"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),this.close(s))})}!1!==e.options.closeOnEscape&&document.addEventListener("keydown",t=>{"Escape"===t.key&&e.isOpen&&this.close(s)})}bindTriggerEvents(e){const{trigger:t,id:s}=e;t&&t.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),e.isOpen?this.close(s):this.open(s)})}open(e){const t=this.drawers.get(e);t&&!t.isOpen&&(this.closeAll(),t.options.onBeforeOpen&&t.options.onBeforeOpen(),t.element.classList.add("dewp-drawer-open"),t.isOpen=!0,this.activeDrawer=t,t.overlay&&t.overlay.classList.add("show"),document.body.style.overflow="hidden",t.options.onOpen&&t.options.onOpen())}close(e){const t=this.drawers.get(e);t&&t.isOpen&&(t.options.onBeforeClose&&t.options.onBeforeClose(),t.element.classList.remove("dewp-drawer-open"),t.isOpen=!1,this.activeDrawer=null,t.overlay&&t.overlay.classList.remove("show"),document.body.style.overflow="",t.options.onClose&&t.options.onClose())}closeAll(){this.drawers.forEach(e=>{e.isOpen&&this.close(e.id)})}toggle(e){const t=this.drawers.get(e);t&&(t.isOpen?this.close(e):this.open(e))}destroy(e){const t=this.drawers.get(e);t&&(this.close(e),t.element.parentNode&&t.element.parentNode.removeChild(t.element),this.drawers.delete(e))}getInstance(e){return this.drawers.get(e)}isOpen(e){const t=this.drawers.get(e);return!!t&&t.isOpen}initGlobalEvents(){window.addEventListener("resize",()=>{this.activeDrawer&&this.adjustDrawerPosition(this.activeDrawer)}),window.addEventListener("scroll",()=>{this.activeDrawer&&this.adjustDrawerPosition(this.activeDrawer)},!0)}adjustDrawerPosition(e){}getDrawerTitle(e){return"right"===e.position?"정보 패널":"dark"===e.theme?"다크 테마":"sm"===e.size?"작은 Drawer":"lg"===e.size?"큰 Drawer":"xl"===e.size?"매우 큰 Drawer":"네비게이션"}autoInitialize(){document.querySelectorAll(".dewp-drawer").forEach((e,t)=>{if(!e.getAttribute("data-drawer-id"))try{const t=this.create({target:e,position:this.detectPosition(e),size:this.detectSize(e),theme:this.detectTheme(e),overlay:!0,closeOnEscape:!0,closeOnOverlayClick:!0});e.setAttribute("data-drawer-id",t)}catch(e){console.error("❌ Drawer 자동 초기화 실패:",e)}})}detectPosition(e){return e.classList.contains("dewp-drawer-right")?"right":e.classList.contains("dewp-drawer-top")?"top":e.classList.contains("dewp-drawer-bottom")?"bottom":"left"}detectSize(e){return e.classList.contains("dewp-drawer-sm")?"sm":e.classList.contains("dewp-drawer-lg")?"lg":e.classList.contains("dewp-drawer-xl")?"xl":"md"}detectTheme(e){return e.classList.contains("dewp-drawer-dark")?"dark":e.classList.contains("dewp-drawer-primary")?"primary":"default"}},U=e=>j.create(e),Y=e=>{j.open(e)},X=e=>{j.close(e)},J=e=>{j.toggle(e)},K=()=>{j.closeAll()},Q=e=>{j.destroy(e)},Z=e=>j.isOpen(e),ee=()=>{j.autoInitialize()};const te=new class{constructor(){this.tabInstances=new Map,this.autoInit()}autoInit(){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>this.autoInitTabs()):this.autoInitTabs()}autoInitTabs(){document.querySelectorAll("[data-tabs]").forEach(e=>{e.getAttribute("data-tabs")||e.id||Date.now(),this.initTabs(e,{container:e})})}initTabs(e,t){const s=e.id||"tabs-"+Date.now();this.tabInstances.has(s)&&this.destroy(s);const i=e.querySelector(".dewp-tabs");i&&i.setAttribute("role","tablist");const n=this.findTabElements(e),o=this.findPanelElements(e);if(0===n.size||0===o.size)throw new Error("탭 또는 패널 요소를 찾을 수 없습니다.");const r={id:s,container:e,options:t,tabs:n,panels:o,activeTabId:null};this.tabInstances.set(s,r),n.forEach((e,t)=>{const i=`${s}-tab-${t}`,n=o.get(t);if(n){const o=`${s}-panel-${t}`;e.setAttribute("id",i),e.setAttribute("role","tab"),e.setAttribute("aria-controls",o),e.setAttribute("tabindex","-1"),n.setAttribute("id",o),n.setAttribute("role","tabpanel"),n.setAttribute("aria-labelledby",i),n.setAttribute("tabindex","0")}}),this.bindTabEvents(r);const a=t.activeTab||Array.from(n.keys())[0];return this.activateTab(s,a),s}findTabElements(e){const t=new Map;if(e.querySelectorAll("[data-tab]").forEach(e=>{const s=e.getAttribute("data-tab");s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-tab-btn").forEach((e,s)=>{const i=e.getAttribute("data-tab")||`tab-${s}`;t.set(i,e)})}return t}findPanelElements(e){const t=new Map;if(e.querySelectorAll("[data-panel]").forEach(e=>{const s=e.getAttribute("data-panel");s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-tab-panel").forEach((e,s)=>{const i=e.getAttribute("data-panel")||`panel-${s}`;t.set(i,e)})}return t}bindTabEvents(e){const{tabs:t,container:s}=e;t.forEach((s,i)=>{s.addEventListener("click",t=>{t.preventDefault(),this.activateTab(e.id,i)}),s.addEventListener("keydown",s=>{["Enter"," "].includes(s.key)&&(s.preventDefault(),this.activateTab(e.id,i));const n=Array.from(t.keys()),o=n.indexOf(i);if("ArrowRight"===s.key){const e=n[(o+1)%n.length],s=t.get(e);null==s||s.focus()}else if("ArrowLeft"===s.key){const e=n[(o-1+n.length)%n.length],s=t.get(e);null==s||s.focus()}})})}activateTab(e,t){const s=this.tabInstances.get(e);if(!s)return;const{tabs:i,panels:n,activeTabId:o,options:r}=s,a=i.get(t),d=n.get(t);if(!a||!d)return;if(o){const e=i.get(o),t=n.get(o);e&&(e.classList.remove("active"),e.setAttribute("aria-selected","false"),e.setAttribute("tabindex","-1")),t&&(t.classList.remove("active"),t.setAttribute("aria-hidden","true"))}a.classList.add("active"),a.setAttribute("aria-selected","true"),a.setAttribute("tabindex","0"),a.focus(),d.classList.add("active"),d.setAttribute("aria-hidden","false");const c=s.activeTabId;s.activeTabId=t,r.onTabChange&&r.onTabChange(t,c||void 0),!1!==r.animation&&this.animateTabChange(d)}animateTabChange(e){e.style.opacity="0",e.style.transform="translateY(10px)",requestAnimationFrame(()=>{e.style.transition="all 0.3s ease",e.style.opacity="1",e.style.transform="translateY(0)"})}getActiveTab(e){const t=this.tabInstances.get(e);return t?t.activeTabId:null}getTabInstance(e){return this.tabInstances.get(e)}destroy(e){const t=this.tabInstances.get(e);t&&(t.tabs.forEach(e=>{e.replaceWith(e.cloneNode(!0))}),this.tabInstances.delete(e))}destroyAll(){this.tabInstances.forEach((e,t)=>{this.destroy(t)})}},se=(e,t)=>te.initTabs(e,t||{container:e}),ie=(e,t)=>{te.activateTab(e,t)},ne=e=>te.getActiveTab(e),oe=e=>te.getTabInstance(e),re=e=>{te.destroy(e)};const ae=new class{constructor(){this.accordionInstances=new Map,this.autoInit()}autoInit(){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>this.autoInitAccordions(),100)}):setTimeout(()=>this.autoInitAccordions(),100)}autoInitAccordions(){document.querySelectorAll("[data-accordion]").forEach(e=>{try{e.getAttribute("data-accordion")||e.id||Date.now();this.initAccordion(e,{})}catch(e){}})}initAccordion(e,t){const s=e.getAttribute("data-accordion")||e.id||"accordion-"+Date.now();if(e.hasAttribute("data-accordion-initialized"))return s;this.accordionInstances.has(s)&&this.destroy(s);const i=this.findAccordionItems(e),n=this.findAccordionHeaders(e),o=this.findAccordionContents(e);if(0===i.size)throw new Error("아코디언 아이템을 찾을 수 없습니다.");const r={id:s,container:e,options:{...this.getDefaultOptions(),...t},items:i,headers:n,contents:o,activeItems:new Set};return this.accordionInstances.set(s,r),this.bindAccordionEvents(r),i.forEach((e,t)=>{const s=n.get(t),i=o.get(t);s&&i&&(e.classList.remove("active"),s.classList.remove("active"),s.setAttribute("aria-expanded","false"),i.style.display="none",i.style.height="",i.style.opacity="",i.style.transform="",i.style.transition="",i.style.overflow="")}),t.activeItem&&i.has(t.activeItem)&&this.toggleItem(s,t.activeItem,!0),e.setAttribute("data-accordion-initialized","true"),s}getDefaultOptions(){return{animation:!0,multiple:!1,autoClose:!0}}findAccordionItems(e){const t=new Map;if(e.querySelectorAll("[data-accordion-item]").forEach(e=>{const s=e.getAttribute("data-accordion-item");s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-accordion-item").forEach((e,s)=>{const i=e.id||`accordion-item-${s}`;t.set(i,e)})}return t}findAccordionHeaders(e){const t=new Map;if(e.querySelectorAll("[data-accordion-header]").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-accordion-header").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)})}return t}findAccordionContents(e){const t=new Map;if(e.querySelectorAll("[data-accordion-content]").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)}),0===t.size){e.querySelectorAll(".dewp-accordion-content").forEach(e=>{const s=this.findParentItemId(e);s&&t.set(s,e)})}return t}findParentItemId(e){let t=e.parentElement;for(;t;){if(t.hasAttribute("data-accordion-item")||t.classList.contains("dewp-accordion-item"))return t.getAttribute("data-accordion-item")||t.id||null;t=t.parentElement}return null}bindAccordionEvents(e){const{headers:t,container:s}=e;t.forEach((t,s)=>{t.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.toggleItem(e.id,s)}),t.addEventListener("keydown",t=>{"Enter"!==t.key&&" "!==t.key||(t.preventDefault(),t.stopPropagation(),this.toggleItem(e.id,s))}),t.setAttribute("tabindex","0"),t.setAttribute("role","button"),t.setAttribute("aria-expanded","false"),t.setAttribute("aria-controls",`accordion-content-${s}`)}),e.contents.forEach((e,t)=>{e.setAttribute("id",`accordion-content-${t}`),e.setAttribute("role","region"),e.setAttribute("aria-labelledby",`accordion-header-${t}`)})}toggleItem(e,t,s){const i=this.accordionInstances.get(e);if(!i)return;const{items:n,headers:o,contents:r,options:a}=i,d=n.get(t),c=o.get(t),l=r.get(t);if(!d||!c||!l)return;const p=i.activeItems.has(t),h=void 0!==s?s:!p;h?this.openItemInternal(i,t,d,c,l):this.closeItemInternal(i,t,d,c,l),a.onItemToggle&&a.onItemToggle(t,h)}openItemInternal(e,t,s,i,n){const{options:o,activeItems:r}=e;!o.multiple&&o.autoClose&&r.forEach(s=>{s!==t&&this.closeItemInternal(e,s,e.items.get(s),e.headers.get(s),e.contents.get(s))}),r.add(t),s.classList.add("active"),i.classList.add("active"),i.setAttribute("aria-expanded","true"),o.animation?this.animateContent(n,!0):n.style.display="block"}closeItemInternal(e,t,s,i,n){const{options:o,activeItems:r}=e;r.delete(t),s.classList.remove("active"),i.classList.remove("active"),i.setAttribute("aria-expanded","false"),o.animation?this.animateContent(n,!1):n.style.display="none"}animateContent(e,t){t?(e.style.display="block",e.style.overflow="hidden",e.style.height="0px",e.style.opacity="0",e.style.transform="translateY(-10px)",e.offsetHeight,e.style.transition="all 0.4s cubic-bezier(0.4, 0, 0.2, 1)",e.style.height=e.scrollHeight+"px",e.style.opacity="1",e.style.transform="translateY(0)",setTimeout(()=>{e.style.height="",e.style.overflow="",e.style.transition="",e.style.opacity="",e.style.transform=""},400)):(e.style.overflow="hidden",e.style.height=e.scrollHeight+"px",e.style.opacity="1",e.style.transform="translateY(0)",e.offsetHeight,e.style.transition="all 0.4s cubic-bezier(0.4, 0, 0.2, 1)",e.style.height="0px",e.style.opacity="0",e.style.transform="translateY(-10px)",setTimeout(()=>{e.style.display="none",e.style.height="",e.style.overflow="",e.style.transition="",e.style.opacity="",e.style.transform=""},400))}openItem(e,t){this.toggleItem(e,t,!0)}closeItem(e,t){this.toggleItem(e,t,!1)}openAllItems(e){const t=this.accordionInstances.get(e);t&&t.items.forEach((t,s)=>{this.openItem(e,s)})}closeAllItems(e){const t=this.accordionInstances.get(e);t&&t.items.forEach((t,s)=>{this.closeItem(e,s)})}getActiveItems(e){const t=this.accordionInstances.get(e);return t?Array.from(t.activeItems):[]}isItemOpen(e,t){const s=this.accordionInstances.get(e);return!!s&&s.activeItems.has(t)}getAccordionInstance(e){return this.accordionInstances.get(e)||null}destroy(e){const t=this.accordionInstances.get(e);t&&(t.headers.forEach(e=>{e.removeEventListener("click",()=>{}),e.removeEventListener("keydown",()=>{})}),this.accordionInstances.delete(e))}destroyAll(){this.accordionInstances.forEach((e,t)=>{this.destroy(t)})}},de=(e,t)=>ae.initAccordion(e,t),ce=(e,t,s)=>{ae.toggleItem(e,t,s)},le=(e,t)=>{ae.openItem(e,t)},pe=(e,t)=>{ae.closeItem(e,t)},he=e=>{ae.openAllItems(e)},ue=e=>{ae.closeAllItems(e)},me=e=>ae.getActiveItems(e),we=(e,t)=>ae.isItemOpen(e,t),ge=e=>ae.getAccordionInstance(e),ve=e=>{ae.destroy(e)},be=()=>{ae.destroyAll()};const fe=new class{constructor(){this.popovers=new Map,this.triggerIndex=new WeakMap,this.active=null,this.uid=0,this.docHandlersBound=!1,this.bindDocumentHandlers()}genId(){var e,t;const s=(++this.uid).toString(36);try{return`dewp-popover-${null!==(t=null===(e=crypto.randomUUID)||void 0===e?void 0:e.call(crypto))&&void 0!==t?t:`${Date.now().toString(36)}-${s}`}`}catch{return`dewp-popover-${Date.now().toString(36)}-${s}`}}create(e){const t=this.genId(),s="string"==typeof e.trigger?document.querySelector(e.trigger):e.trigger;if(!s)throw new Error("Popover trigger not found");let i;"string"==typeof e.content?(i=document.createElement("div"),i.className="dewp-popover-content dewp-popover-bottom",i.innerHTML=e.content):(i=e.content,i.classList.add("dewp-popover-content")),s.id||(s.id=`${t}-trigger`),i.id||(i.id=`${t}-content`),s.setAttribute("aria-haspopup","dialog"),s.setAttribute("aria-controls",i.id),s.setAttribute("aria-expanded","false"),i.setAttribute("role","dialog"),i.setAttribute("aria-labelledby",s.id);const n=s.closest(".dewp-popover")||s.parentElement;!i.parentElement&&n&&n.appendChild(i);const o=e.placement||"bottom";i.classList.remove("dewp-popover-top","dewp-popover-bottom","dewp-popover-left","dewp-popover-right"),i.classList.add(`dewp-popover-${o}`);const r={id:t,trigger:s,popover:i,options:{placement:o,closeOnEscape:!1!==e.closeOnEscape},isOpen:!1};return this.popovers.set(t,r),this.triggerIndex.set(s,t),s.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),this.toggle(t)}),t}bindDocumentHandlers(){this.docHandlersBound||(document.addEventListener("click",e=>{const t=e.target,s=this.active;s&&(s.trigger.contains(t)||s.popover.contains(t)||this.close(s.id))}),document.addEventListener("keydown",e=>{if("Escape"!==e.key)return;const t=this.active;t&&t.options.closeOnEscape&&this.close(t.id)}),this.docHandlersBound=!0)}open(e){var t;const s=this.popovers.get(e);s&&(this.active&&this.active.id!==e&&this.close(this.active.id),null===(t=s.popover.parentElement)||void 0===t||t.classList.add("is-open"),s.popover.classList.add("is-open"),s.trigger.setAttribute("aria-expanded","true"),s.isOpen=!0,this.active=s)}close(e){var t;const s=this.popovers.get(e);if(s){null===(t=s.popover.parentElement)||void 0===t||t.classList.remove("is-open"),s.popover.classList.remove("is-open"),s.trigger.setAttribute("aria-expanded","false"),s.isOpen=!1,this.active&&this.active.id===e&&(this.active=null);try{s.trigger.focus()}catch{}}}toggle(e){const t=this.popovers.get(e);t&&(t.isOpen?this.close(e):this.open(e))}toggleByTrigger(e){const t=this.triggerIndex.get(e);t&&this.toggle(t)}destroy(e){const t=this.popovers.get(e);t&&(this.close(e),this.triggerIndex.delete(t.trigger),this.popovers.delete(e))}},ye=e=>fe.create(e),Ee=e=>fe.open(e),Ae=e=>fe.close(e),Ie=e=>fe.toggle(e);class De{constructor(e){this.sidebar=null,this.activeItemId=null,this.isCollapsed=!1,this.config=e,this.init()}init(){this.createSidebar(),this.render(),this.bindEvents(),this.setActiveItem()}createSidebar(){const e=document.querySelector(".dewp-sidebar");e&&e.remove(),this.sidebar=document.createElement("div"),this.sidebar.className="dewp-sidebar dewp-sidebar--wrapper is-sticky",this.sidebar.id="dewp-sidebar",document.body.appendChild(this.sidebar)}render(){this.sidebar&&(this.sidebar.innerHTML=`\n <div class="dewp-sidebar-inner">\n ${this.renderHeader()}\n ${this.renderGroups()}\n ${this.renderFooter()}\n </div>\n `)}renderHeader(){const e=this.config.subtitle?`<p class="dewp-sidebar-subtitle">${this.config.subtitle}</p>`:"";return`\n <div class="dewp-sidebar-header">\n <h1 class="dewp-sidebar-title">${this.config.title}</h1>\n ${e}\n </div>\n `}renderGroups(){return this.config.groups.map(e=>`\n <div class="dewp-sidebar-group" data-group-id="${e.id}">\n ${e.title?`<h2 class="dewp-sidebar-group-title">${e.title}</h2>`:""}\n <ul class="dewp-sidebar-menu">\n ${this.renderMenuItems(e.items)}\n </ul>\n </div>\n `).join("")}renderMenuItems(e){return e.map(e=>{const t=e.icon?`<span class="dewp-sidebar-menu-icon">${e.icon}</span>`:"",s=e.hasSubmenu?'\n <span class="dewp-sidebar-menu-arrow">\n <svg viewBox="0 0 24 24">\n <path d="M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z"/>\n </svg>\n </span>\n ':"",i=e.hasSubmenu&&e.submenu?`\n <ul class="dewp-sidebar-submenu" id="submenu-${e.id}" aria-hidden="true">\n ${this.renderMenuItems(e.submenu)}\n </ul>\n `:"";return`\n <li class="dewp-sidebar-menu-item ${e.isActive?"is-active":""} ${e.hasSubmenu?"has-submenu":""}" data-item-id="${e.id}">\n <a href="${e.url||"#"}" class="dewp-sidebar-menu-link" ${e.url?"":'onclick="return false;"'} ${e.hasSubmenu?'role="button" aria-expanded="false" aria-controls="submenu-'+e.id+'"':""}>\n ${t}\n <span class="dewp-sidebar-menu-text">${e.text}</span>\n ${s}\n </a>\n ${i}\n </li>\n `}).join("")}renderFooter(){return this.config.footerText?`\n <div class="dewp-sidebar-footer">\n <p class="dewp-sidebar-footer-text">${this.config.footerText}</p>\n </div>\n `:""}bindEvents(){this.sidebar&&(this.sidebar.addEventListener("click",e=>{const t=e.target.closest(".dewp-sidebar-menu-item");if(!t)return;const s=t.getAttribute("data-item-id");s&&(t.classList.contains("has-submenu")?(e.preventDefault(),this.toggleSubmenu(t)):this.setActiveItem(s))}),document.addEventListener("keydown",e=>{"Escape"===e.key&&window.innerWidth<=768&&this.closeMobileSidebar()}))}toggleSubmenu(e){var t;const s=e.querySelector(".dewp-sidebar-submenu");if(!s)return;const i=s.classList.contains("expanded"),n=null===(t=e.parentElement)||void 0===t?void 0:t.querySelectorAll(".dewp-sidebar-menu-item.has-submenu");if(null==n||n.forEach(t=>{if(t!==e){const e=t.querySelector(".dewp-sidebar-submenu"),s=t.querySelector(".dewp-sidebar-menu-link");e&&e.classList.contains("expanded")&&(e.classList.remove("expanded"),e.style.maxHeight="0",null==s||s.setAttribute("aria-expanded","false"),e.setAttribute("aria-hidden","true")),t.classList.remove("is-open")}}),i){s.classList.remove("expanded"),s.style.maxHeight="0";const t=e.querySelector(".dewp-sidebar-menu-link");null==t||t.setAttribute("aria-expanded","false"),s.setAttribute("aria-hidden","true"),e.classList.remove("is-open")}else{s.classList.add("expanded"),s.style.maxHeight=s.scrollHeight+"px";const t=e.querySelector(".dewp-sidebar-menu-link");null==t||t.setAttribute("aria-expanded","true"),s.setAttribute("aria-hidden","false"),e.classList.add("is-open")}}setActiveItem(e){var t,s;e&&(this.activeItemId=e);const i=null===(t=this.sidebar)||void 0===t?void 0:t.querySelectorAll(".dewp-sidebar-menu-item.is-active");if(null==i||i.forEach(e=>e.classList.remove("is-active")),this.activeItemId){const e=null===(s=this.sidebar)||void 0===s?void 0:s.querySelector(`[data-item-id="${this.activeItemId}"]`);null==e||e.classList.add("is-active")}}addDivider(e,t="after"){var s;const i=null===(s=this.sidebar)||void 0===s?void 0:s.querySelector(`[data-group-id="${e}"]`);if(!i)return;const n=document.createElement("div");n.className="dewp-sidebar-divider","before"===t?i.insertBefore(n,i.firstChild):i.appendChild(n)}addGroup(e){this.config.groups.push(e),this.render(),this.bindEvents()}addMenuItem(e,t){const s=this.config.groups.find(t=>t.id===e);s&&(s.items.push(t),this.render(),this.bindEvents())}removeMenuItem(e,t){const s=this.config.groups.find(t=>t.id===e);s&&(s.items=s.items.filter(e=>e.id!==t),this.render(),this.bindEvents())}toggle(){this.sidebar&&window.innerWidth<=768&&this.sidebar.classList.toggle("is-open")}toggleCollapse(){this.sidebar&&(this.isCollapsed=!this.isCollapsed,this.sidebar.classList.toggle("is-collapsed",this.isCollapsed))}collapse(){this.sidebar&&(this.isCollapsed=!0,this.sidebar.classList.add("is-collapsed"))}expand(){this.sidebar&&(this.isCollapsed=!1,this.sidebar.classList.remove("is-collapsed"))}openMobileSidebar(){this.sidebar&&this.sidebar.classList.add("is-open")}closeMobileSidebar(){this.sidebar&&this.sidebar.classList.remove("is-open")}destroy(){this.sidebar&&(this.sidebar.remove(),this.sidebar=null)}updateConfig(e){this.config={...this.config,...e},this.render(),this.bindEvents()}getActiveItemId(){return this.activeItemId}getElement(){return this.sidebar}}window.DEWPSidebar=De;class Le{constructor(e,t={}){var s,i,n;this.input=e.querySelector(".dewp-stepper-input"),this.decrementBtn=e.querySelector(".dewp-stepper-decrement"),this.incrementBtn=e.querySelector(".dewp-stepper-increment"),this.options={min:null!==(s=t.min)&&void 0!==s?s:Number.MIN_SAFE_INTEGER,max:null!==(i=t.max)&&void 0!==i?i:Number.MAX_SAFE_INTEGER,step:null!==(n=t.step)&&void 0!==n?n:1},"number"==typeof t.value&&(this.input.value=String(t.value)),this.bindEvents(t.onChange),this.syncDisabled()}bindEvents(e){const t=()=>this.clamp(parseFloat(this.input.value||"0")),s=t=>{e&&e(t)};this.decrementBtn.addEventListener("click",()=>{const e=this.clamp(t()-this.options.step);this.input.value=String(e),this.syncDisabled(),s(e)}),this.incrementBtn.addEventListener("click",()=>{const e=this.clamp(t()+this.options.step);this.input.value=String(e),this.syncDisabled(),s(e)}),this.input.addEventListener("input",()=>{const e=t();this.input.value=String(e),this.syncDisabled(),s(e)})}clamp(e){return Math.min(this.options.max,Math.max(this.options.min,isNaN(e)?0:e))}syncDisabled(){const e=parseFloat(this.input.value||"0");this.decrementBtn.disabled=e<=this.options.min,this.incrementBtn.disabled=e>=this.options.max}}const Te="0.6.1";var Ce={qs:e,qsa:t,create:s,addClass:i,removeClass:n,toggleClass:o,hasClass:r,setText:a,setHTML:d,on:c,off:l,remove:p,append:h,insertBefore:u,clearChildren:I,setStyle:m,setData:w,getData:g,isDOMReady:v,onDOMReady:b,isElementVisible:f,scrollToElement:y,getElementRect:E,isChildOf:A,showToast:L,showSuccessToast:T,showWarningToast:x,showErrorToast:C,showInfoToast:S,createModal:M,openModal:$,closeModal:O,showModal:q,showConfirmModal:P,createDropdown:z,toggleDropdown:W,showDropdown:B,hideDropdown:H,closeAllDropdowns:_,getSelectedValue:R,getSelectedText:V,setDropdownValue:G,autoInitializeDropdowns:F,initTabs:se,activateTab:ie,getActiveTab:ne,getTabInstance:oe,destroyTabs:re,initAccordion:de,toggleAccordionItem:ce,openAccordionItem:le,closeAccordionItem:pe,openAllAccordionItems:he,closeAllAccordionItems:ue,getActiveAccordionItems:me,isAccordionItemOpen:we,getAccordionInstance:ge,destroyAccordion:ve,destroyAllAccordions:be,createDrawer:U,openDrawer:Y,closeDrawer:X,toggleDrawer:J,closeAllDrawers:K,destroyDrawer:Q,isDrawerOpen:Z,autoInitializeDrawers:ee,createPopover:ye,openPopover:Ee,closePopover:Ae,togglePopover:Ie,DEWPSidebar:De,DEWPStepper:Le,initStepper:(e,t={})=>new Le(e,t),ready:b,version:Te,info:{name:"DesignBase WordPress Library",description:"간단하고 강력한 프론트엔드 라이브러리",version:Te,author:"DesignBase",license:"MIT"}};if("undefined"!=typeof window){const D=window.DEWP={},k={qs:e,qsa:t,create:s,addClass:i,removeClass:n,toggleClass:o,hasClass:r,setText:a,setHTML:d,on:c,off:l,remove:p,append:h,insertBefore:u,clearChildren:I,setStyle:m,setData:w,getData:g,isDOMReady:v,onDOMReady:b,isElementVisible:f,scrollToElement:y,getElementRect:E,isChildOf:A,showToast:L,showSuccessToast:T,showWarningToast:x,showErrorToast:C,showInfoToast:S,createModal:M,openModal:$,closeModal:O,showModal:q,showConfirmModal:P,createDropdown:z,toggleDropdown:W,showDropdown:B,hideDropdown:H,closeAllDropdowns:_,getSelectedValue:R,getSelectedText:V,setDropdownValue:G,autoInitializeDropdowns:F,createDrawer:U,openDrawer:Y,closeDrawer:X,toggleDrawer:J,closeAllDrawers:K,destroyDrawer:Q,isDrawerOpen:Z,autoInitializeDrawers:ee,initTabs:se,activateTab:ie,getActiveTab:ne,getTabInstance:oe,destroyTabs:re,initAccordion:de,toggleAccordionItem:ce,openAccordionItem:le,closeAccordionItem:pe,openAllAccordionItems:he,closeAllAccordionItems:ue,getActiveAccordionItems:me,isAccordionItemOpen:we,getAccordionInstance:ge,destroyAccordion:ve,destroyAllAccordions:be,DEWPSidebar:De,createPopover:ye,openPopover:Ee,closePopover:Ae,togglePopover:Ie,ready:b,version:Te,info:{name:"DesignBase WordPress Library",description:"간단하고 강력한 프론트엔드 라이브러리",version:Te,author:"DesignBase",license:"MIT"}};Object.keys(k).forEach(e=>{D[e]=k[e]});try{console.log(`[DEWP] v${Te} loaded`)}catch{}b(()=>{try{F()}catch{}try{ee()}catch{}});try{"loading"!==document.readyState&&(F(),ee())}catch{}}return Ce}();
|