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 CHANGED
@@ -1,196 +1,163 @@
1
1
  # DesignBase WordPress Library (DEWP)
2
2
 
3
- 워드프레스 플러그인용 재사용 가능한 프론트엔드 라이브러리입니다.
3
+ [![npm version](https://img.shields.io/npm/v/designbase-wp-library.svg)](https://www.npmjs.com/package/designbase-wp-library)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
4
5
 
5
- > **DEWP** - DesignBase WordPress Library의 약자로, `mcp-` 접두사를 `dewp-`로 변경한 최신 버전입니다.
6
+ 워드프레스 플러그인 개발을 위한 재사용 가능한 프론트엔드 UI 라이브러리입니다.
7
+
8
+ > **DEWP** = **D**esignBase W**o**rdPress Library
6
9
 
7
10
  ## ✨ 특징
8
11
 
9
- - **모듈화된 구조**: TypeScript로 작성된 컴포넌트 기반 아키텍처
10
- - **체계적인 SCSS**: 변수, 믹스인, 컴포넌트를 체계적으로 구성
11
- - **반응형 디자인**: 모바일 우선 접근법으로 모든 디바이스 지원
12
- - **접근성 고려**: WCAG 가이드라인을 준수하는 컴포넌트
13
- - **TypeScript 지원**: 완전한 타입 정의와 ES6+ 모듈 지원
14
- - **WordPress 최적화**: 플러그인 개발에 특화된 컴포넌트
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
- ### CDN 사용
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
- - 문서/예제: https://designbasekorea.github.io/designbase-wp-library/
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
- <script src="https://unpkg.com/designbase-wp-library@latest/dist/js/dewp.min.js"></script>
118
- <script>
119
- // 전역 DEWP 객체 사용
120
- window.DEWP.showToast('안녕하세요!', 'success', 3000, 'md');
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
- window.DEWP.showModal({ title: '알림', content: '모달이 표시됩니다!', size: 'md' });
124
- </script>
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
- showModal({ title: '제목', content: '내용', size: 'lg' });
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
- showConfirmModal({ message: '정말 삭제하시겠습니까?' });
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
- ### CSS 사용
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
- ```html
144
- <link rel="stylesheet" href="https://unpkg.com/designbase-wp-library@latest/dist/css/dewp.min.css">
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
- ### 1. 토스트 알림 (Toast)
150
- ```javascript
151
- // 기본 토스트
152
- window.DEWP.showToast('메시지', 'success', 3000, 'md');
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
- ### 2. 모달 (Modal)
114
+ ### 3. 모달 (Modal)
162
115
  ```javascript
163
116
  // 기본 모달
164
- window.DEWP.showModal({ title: '제목', content: '내용' });
117
+ window.DEWP.showModal({
118
+ title: '모달 제목',
119
+ content: '모달 내용입니다.',
120
+ size: 'md' // sm, md, lg, xl
121
+ });
165
122
 
166
123
  // 확인 모달
167
- window.DEWP.showConfirmModal({ message: '정말 삭제하시겠습니까?' });
124
+ window.DEWP.showConfirmModal({
125
+ title: '확인',
126
+ message: '정말 삭제하시겠습니까?',
127
+ confirmText: '삭제',
128
+ cancelText: '취소',
129
+ onConfirm: () => console.log('삭제됨')
130
+ });
131
+ ```
168
132
 
169
- // 모달 생성 및 제어
170
- const modalId = window.DEWP.createModal({ title: '제목', content: '내용' });
171
- window.DEWP.openModal(modalId);
172
- window.DEWP.closeModal(modalId);
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
- ### 3. 드롭다운 (Dropdown)
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="option1">옵션 1</div>
183
- <div class="dewp-dropdown-item" data-value="option2">옵션 2</div>
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
- ### 4. 탭 (Tabs)
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
- ### 5. 헤더 컴포넌트
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-section">
233
- <div class="dewp-section-header">
234
- <div class="dewp-section-title-area">
235
- <h3 class="dewp-section-title">일반 설정</h3>
236
- <p class="dewp-section-description">플러그인의 기본 동작을 설정합니다.</p>
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
- </div>
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
- ### 7. Drawer 컴포넌트
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">제목</h3>
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
- <!-- Drawer 내용 -->
202
+ Drawer 내용
262
203
  </div>
263
204
  </div>
264
205
 
265
206
  <script>
266
- // Drawer 생성 및 제어
267
- const drawerId = window.DEWP.createDrawer({
268
- target: '#my-drawer',
269
- overlay: true,
270
- closeOnEscape: true
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
- ### 8. DOM 유틸리티
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>설명</th>
251
+ <th>작성자</th>
252
+ <th>날짜</th>
341
253
  </tr>
342
254
  </thead>
343
255
  <tbody>
344
256
  <tr>
345
- <td>내용 1</td>
346
- <td>설명 1</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
- ```html
354
- <div class="dewp-pagination">
355
- <div class="dewp-page-item">
356
- <a href="#" class="dewp-page-link">1</a>
357
- </div>
358
- <div class="dewp-page-item active">
359
- <a href="#" class="dewp-page-link">2</a>
360
- </div>
361
- <div class="dewp-page-item">
362
- <a href="#" class="dewp-page-link">3</a>
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
- ```html
369
- <!-- 기본 토글 -->
370
- <label class="dewp-toggle-label">
371
- <input type="checkbox" class="dewp-toggle-input">
372
- <span class="dewp-toggle-slider"></span>
373
- <span class="dewp-toggle-text">기본 토글</span>
374
- </label>
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
- <label class="dewp-toggle-label dewp-toggle-sm">
378
- <input type="checkbox" class="dewp-toggle-input">
379
- <span class="dewp-toggle-slider"></span>
380
- <span class="dewp-toggle-text">작은 토글</span>
381
- </label>
287
+ #### Border (테두리)
288
+ ```css
289
+ --db-border-base /* 기본 테두리 */
290
+ --db-border-layer-1 /* 1단계 테두리 */
291
+ --db-border-layer-2 /* 2단계 테두리 */
292
+ ```
382
293
 
383
- <label class="dewp-toggle-label dewp-toggle-lg">
384
- <input type="checkbox" class="dewp-toggle-input">
385
- <span class="dewp-toggle-slider"></span>
386
- <span class="dewp-toggle-text">큰 토글</span>
387
- </label>
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
- <div class="dewp-notice dewp-notice-success">
393
- <p>성공 메시지입니다.</p>
394
- </div>
313
+ <!-- 다크 모드 활성화 -->
314
+ <body data-theme="dark">
315
+ <!-- 모든 컴포넌트가 자동으로 다크 모드로 전환됩니다 -->
316
+ </body>
395
317
 
396
- <div class="dewp-notice dewp-notice-warning">
397
- <p>경고 메시지입니다.</p>
398
- </div>
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
- - **xs**: 0px 이상
408
- - **sm**: 576px 이상
409
- - **md**: 768px 이상
410
- - **lg**: 992px 이상
411
- - **xl**: 1200px 이상
412
- - **xxl**: 1400px 이상
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 # 압축된 CSS (80.8kB)
388
+ │ └── dewp.min.css # 압축된 CSS (152.8 kB)
420
389
  └── js/
421
- └── dewp.min.js # 압축된 JavaScript (16.0kB)
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
- ### npm에 배포
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
- ```bash
443
- npm run build:prod
444
- npm publish
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
- 프로젝트는 MIT License를 따릅니다. 재배포 시 원저작권 고지와 라이선스 전문을 반드시 포함해 주세요(출처 표기).
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
- - 이메일: designbasekorea@gmail.com
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
- - [npm 패키지](https://www.npmjs.com/package/designbase-wp-library)
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**
@@ -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}();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "designbase-wp-library",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Reusable CSS/JS kit for WordPress plugins (frontend/admin).",
5
5
  "license": "MIT",
6
6
  "type": "module",