@designbasekorea/ui-wc 0.5.6 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/dist/chunks/lottie-0e23d630.js +1 -0
  2. package/dist/esm/components/animation-background/canvas-controller.js +1 -121
  3. package/dist/esm/components/animation-background/controls.js +1 -180
  4. package/dist/esm/components/animation-background/graphite-controller.js +1 -196
  5. package/dist/esm/components/animation-background/graphite-presets.js +1 -42
  6. package/dist/esm/components/animation-background/graphite-shader.js +1 -111
  7. package/dist/esm/components/animation-background/layers.js +1 -369
  8. package/dist/esm/components/animation-background/lumina-presets.js +1 -53
  9. package/dist/esm/components/animation-background/lumina-shaders.js +1 -181
  10. package/dist/esm/components/animation-background/lumina-utils.js +1 -60
  11. package/dist/esm/components/animation-background/particle-defaults.js +1 -36
  12. package/dist/esm/components/animation-background/renderers.js +1 -167
  13. package/dist/esm/components/animation-background/shader-controller.js +1 -154
  14. package/dist/esm/components/color-picker-utils.js +1 -134
  15. package/dist/esm/components/date-picker-utils.js +1 -140
  16. package/dist/esm/components/db-accordion.js +1 -304
  17. package/dist/esm/components/db-ad-banner.js +1 -455
  18. package/dist/esm/components/db-ai-chat-list.d.ts +43 -0
  19. package/dist/esm/components/db-ai-chat-list.js +1 -0
  20. package/dist/esm/components/db-ai-chat.d.ts +159 -0
  21. package/dist/esm/components/db-ai-chat.js +1 -0
  22. package/dist/esm/components/db-alert.js +1 -149
  23. package/dist/esm/components/db-animation-background.js +1 -486
  24. package/dist/esm/components/db-animation-text.js +1 -601
  25. package/dist/esm/components/db-app-badge.js +1 -88
  26. package/dist/esm/components/db-audio-player.js +1 -752
  27. package/dist/esm/components/db-avatar.js +1 -188
  28. package/dist/esm/components/db-backdrop.js +1 -139
  29. package/dist/esm/components/db-badge.js +1 -91
  30. package/dist/esm/components/db-banner.js +1 -188
  31. package/dist/esm/components/db-bottom-navigation.js +1 -146
  32. package/dist/esm/components/db-bottom-sheet.js +1 -481
  33. package/dist/esm/components/db-breadcrumbs.js +1 -329
  34. package/dist/esm/components/db-button.js +1 -316
  35. package/dist/esm/components/db-calendar.js +1 -675
  36. package/dist/esm/components/db-card.js +1 -265
  37. package/dist/esm/components/db-carousel.js +1 -264
  38. package/dist/esm/components/db-chat-composer.d.ts +134 -0
  39. package/dist/esm/components/db-chat-composer.js +1 -0
  40. package/dist/esm/components/db-chat-list.d.ts +47 -0
  41. package/dist/esm/components/db-chat-list.js +1 -0
  42. package/dist/esm/components/db-chat-message.d.ts +39 -0
  43. package/dist/esm/components/db-chat-message.js +1 -0
  44. package/dist/esm/components/db-chat-orb.d.ts +99 -0
  45. package/dist/esm/components/db-chat-orb.js +1 -0
  46. package/dist/esm/components/db-chat-room.d.ts +71 -0
  47. package/dist/esm/components/db-chat-room.js +1 -0
  48. package/dist/esm/components/db-chat-suggestions.d.ts +44 -0
  49. package/dist/esm/components/db-chat-suggestions.js +1 -0
  50. package/dist/esm/components/db-chat-typing.d.ts +22 -0
  51. package/dist/esm/components/db-chat-typing.js +1 -0
  52. package/dist/esm/components/db-chat-welcome.d.ts +32 -0
  53. package/dist/esm/components/db-chat-welcome.js +1 -0
  54. package/dist/esm/components/db-chat-widget.d.ts +146 -0
  55. package/dist/esm/components/db-chat-widget.js +1 -0
  56. package/dist/esm/components/db-checkbox.js +1 -202
  57. package/dist/esm/components/db-chip.js +1 -104
  58. package/dist/esm/components/db-code-block.js +1 -304
  59. package/dist/esm/components/db-color-picker.js +1 -746
  60. package/dist/esm/components/db-confirm.js +1 -191
  61. package/dist/esm/components/db-container.js +1 -39
  62. package/dist/esm/components/db-context-menu.js +1 -265
  63. package/dist/esm/components/db-countdown.js +1 -146
  64. package/dist/esm/components/db-cursor-follower.js +1 -173
  65. package/dist/esm/components/db-date-picker.js +1 -837
  66. package/dist/esm/components/db-divider.js +1 -66
  67. package/dist/esm/components/db-download-progress.d.ts +89 -0
  68. package/dist/esm/components/db-download-progress.js +1 -0
  69. package/dist/esm/components/db-drawer.js +1 -245
  70. package/dist/esm/components/db-dropdown.js +1 -493
  71. package/dist/esm/components/db-dropzone.js +1 -266
  72. package/dist/esm/components/db-email-verify.d.ts +62 -0
  73. package/dist/esm/components/db-email-verify.js +1 -0
  74. package/dist/esm/components/db-empty-state.js +1 -97
  75. package/dist/esm/components/db-file-uploader.js +1 -256
  76. package/dist/esm/components/db-floating-action-button.js +1 -139
  77. package/dist/esm/components/db-footer.js +1 -385
  78. package/dist/esm/components/db-form.js +1 -566
  79. package/dist/esm/components/db-gantt.js +1 -882
  80. package/dist/esm/components/db-gradient.js +1 -133
  81. package/dist/esm/components/db-grid-background.js +1 -909
  82. package/dist/esm/components/db-grid.js +1 -73
  83. package/dist/esm/components/db-icons.d.ts +3 -0
  84. package/dist/esm/components/db-icons.js +1 -82
  85. package/dist/esm/components/db-image-list.js +1 -214
  86. package/dist/esm/components/db-image-placeholder.js +1 -96
  87. package/dist/esm/components/db-image.js +1 -289
  88. package/dist/esm/components/db-indicator.js +1 -517
  89. package/dist/esm/components/db-input.js +1 -420
  90. package/dist/esm/components/db-kanban.js +1 -538
  91. package/dist/esm/components/db-label.js +1 -66
  92. package/dist/esm/components/db-lightbox.js +1 -372
  93. package/dist/esm/components/db-list.js +1 -340
  94. package/dist/esm/components/db-logo-svg.js +1 -72
  95. package/dist/esm/components/db-logo.js +1 -106
  96. package/dist/esm/components/db-lottie.js +1 -109
  97. package/dist/esm/components/db-markdown-editor.js +1 -458
  98. package/dist/esm/components/db-marquee.js +1 -402
  99. package/dist/esm/components/db-masonry.js +1 -94
  100. package/dist/esm/components/db-menu-item.js +1 -211
  101. package/dist/esm/components/db-modal.js +1 -522
  102. package/dist/esm/components/db-navbar.js +1 -680
  103. package/dist/esm/components/db-onboarding-modal.js +1 -322
  104. package/dist/esm/components/db-otp-input.d.ts +53 -0
  105. package/dist/esm/components/db-otp-input.js +1 -0
  106. package/dist/esm/components/db-page-header.js +1 -312
  107. package/dist/esm/components/db-pagination.js +1 -271
  108. package/dist/esm/components/db-phone-verify.d.ts +61 -0
  109. package/dist/esm/components/db-phone-verify.js +1 -0
  110. package/dist/esm/components/db-popover.js +1 -580
  111. package/dist/esm/components/db-progress-step.js +1 -166
  112. package/dist/esm/components/db-progress.js +1 -171
  113. package/dist/esm/components/db-progressbar.js +1 -72
  114. package/dist/esm/components/db-radio.js +1 -172
  115. package/dist/esm/components/db-random-gradient.js +1 -121
  116. package/dist/esm/components/db-range-slider.js +1 -811
  117. package/dist/esm/components/db-rating.js +1 -325
  118. package/dist/esm/components/db-reorder.js +1 -286
  119. package/dist/esm/components/db-resizable-panels.js +1 -282
  120. package/dist/esm/components/db-scroll-area.js +1 -126
  121. package/dist/esm/components/db-search-bar.js +1 -668
  122. package/dist/esm/components/db-section-app-download.js +1 -101
  123. package/dist/esm/components/db-section-contact.js +1 -102
  124. package/dist/esm/components/db-section-cta.js +1 -150
  125. package/dist/esm/components/db-section-faq.js +1 -120
  126. package/dist/esm/components/db-section-feature-grid.js +1 -137
  127. package/dist/esm/components/db-section-feature.js +1 -179
  128. package/dist/esm/components/db-section-hero.js +1 -243
  129. package/dist/esm/components/db-section-logo-cloud.js +1 -138
  130. package/dist/esm/components/db-section-pricing.js +1 -166
  131. package/dist/esm/components/db-section-stats.js +1 -129
  132. package/dist/esm/components/db-section-testimonials.js +1 -252
  133. package/dist/esm/components/db-section.js +1 -385
  134. package/dist/esm/components/db-segment-control.js +1 -231
  135. package/dist/esm/components/db-select.js +1 -571
  136. package/dist/esm/components/db-share-icons.js +1 -40
  137. package/dist/esm/components/db-share.js +1 -489
  138. package/dist/esm/components/db-sidebar.js +1 -1068
  139. package/dist/esm/components/db-skeleton.js +1 -94
  140. package/dist/esm/components/db-spinner.js +1 -102
  141. package/dist/esm/components/db-split-view.js +1 -297
  142. package/dist/esm/components/db-stack.js +1 -46
  143. package/dist/esm/components/db-stat.js +1 -218
  144. package/dist/esm/components/db-stepper.js +1 -398
  145. package/dist/esm/components/db-table.js +1 -412
  146. package/dist/esm/components/db-tabs.js +1 -335
  147. package/dist/esm/components/db-testimonial.d.ts +2 -0
  148. package/dist/esm/components/db-testimonial.js +1 -162
  149. package/dist/esm/components/db-textarea.js +1 -233
  150. package/dist/esm/components/db-time-picker.js +1 -523
  151. package/dist/esm/components/db-timeline.js +1 -174
  152. package/dist/esm/components/db-toast.js +1 -158
  153. package/dist/esm/components/db-toggle.js +1 -162
  154. package/dist/esm/components/db-toolbar.js +1 -94
  155. package/dist/esm/components/db-tooltip.js +1 -440
  156. package/dist/esm/components/db-top-banner.js +1 -121
  157. package/dist/esm/components/db-tutorial.js +1 -324
  158. package/dist/esm/components/db-two-factor.d.ts +60 -0
  159. package/dist/esm/components/db-two-factor.js +1 -0
  160. package/dist/esm/components/db-video-player.js +1 -503
  161. package/dist/esm/components/db-youtube-player.js +1 -194
  162. package/dist/esm/components/highlight-code.js +1 -65
  163. package/dist/esm/components/input-validation.js +1 -50
  164. package/dist/esm/components/marketing-block-host-utils.js +1 -9
  165. package/dist/esm/components/number-scrub.js +1 -117
  166. package/dist/esm/components/random-gradient-palettes.js +1 -67
  167. package/dist/esm/components/section-block-header-utils.js +1 -48
  168. package/dist/esm/helpers/confirm.js +1 -52
  169. package/dist/esm/helpers/toast.js +1 -73
  170. package/dist/esm/index.d.ts +16 -0
  171. package/dist/esm/index.js +1 -111
  172. package/dist/esm/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-bash.js +1 -0
  173. package/dist/esm/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-clike.js +1 -0
  174. package/dist/esm/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-css.js +1 -0
  175. package/dist/esm/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-javascript.js +1 -0
  176. package/dist/esm/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-json.js +1 -0
  177. package/dist/esm/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-jsx.js +1 -0
  178. package/dist/esm/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-markup.js +1 -0
  179. package/dist/esm/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-scss.js +1 -0
  180. package/dist/esm/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-tsx.js +1 -0
  181. package/dist/esm/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-typescript.js +1 -0
  182. package/dist/index.cjs +1 -55414
  183. package/dist/index.css +1 -1
  184. package/dist/index.d.ts +1091 -2
  185. package/dist/index.esm.js +1 -38284
  186. package/dist/react/chunks/lottie-14e7addb.js +1 -0
  187. package/dist/react/index.cjs +1 -56503
  188. package/dist/react/index.d.ts +1620 -54
  189. package/dist/react/index.esm.js +1 -39373
  190. package/package.json +1 -1
  191. package/dist/chunks/lottie-e273b936.js +0 -17032
  192. package/dist/esm/node_modules/prismjs/components/prism-bash.js +0 -235
  193. package/dist/esm/node_modules/prismjs/components/prism-clike.js +0 -31
  194. package/dist/esm/node_modules/prismjs/components/prism-css.js +0 -64
  195. package/dist/esm/node_modules/prismjs/components/prism-javascript.js +0 -172
  196. package/dist/esm/node_modules/prismjs/components/prism-json.js +0 -27
  197. package/dist/esm/node_modules/prismjs/components/prism-jsx.js +0 -143
  198. package/dist/esm/node_modules/prismjs/components/prism-markup.js +0 -186
  199. package/dist/esm/node_modules/prismjs/components/prism-scss.js +0 -81
  200. package/dist/esm/node_modules/prismjs/components/prism-tsx.js +0 -15
  201. package/dist/esm/node_modules/prismjs/components/prism-typescript.js +0 -60
  202. package/dist/react/chunks/lottie-72a4c6d4.js +0 -17032
@@ -1,304 +1 @@
1
- import { ensureHighlightReady, highlightCodeSync, formatLanguageLabel } from './highlight-code.js';
2
-
3
- const CLASS = 'designbase-wc-code-block';
4
- class DbCodeBlock extends HTMLElement {
5
- constructor() {
6
- super(...arguments);
7
- this.built = false;
8
- this.renderToken = 0;
9
- this.internalActiveId = '';
10
- this.copied = false;
11
- this.editedCodes = {};
12
- this.handleSegmentChange = (event) => {
13
- const custom = event;
14
- const value = custom.detail?.value;
15
- if (!value)
16
- return;
17
- if (!this.hasAttribute('active-id')) {
18
- this.internalActiveId = value;
19
- }
20
- this.dispatchEvent(new CustomEvent('db-active-id-change', {
21
- detail: { activeId: value },
22
- bubbles: true,
23
- composed: true,
24
- }));
25
- this.render();
26
- };
27
- }
28
- static get observedAttributes() {
29
- return [
30
- 'items',
31
- 'code',
32
- 'language',
33
- 'default-active-id',
34
- 'active-id',
35
- 'show-language',
36
- 'highlight',
37
- 'theme',
38
- 'show-copy',
39
- 'copied-label',
40
- 'copy-label',
41
- 'min-height',
42
- 'max-height',
43
- 'overflow',
44
- 'editable',
45
- ];
46
- }
47
- connectedCallback() {
48
- this.style.display = 'block';
49
- if (!this.built) {
50
- this.built = true;
51
- this.internalActiveId =
52
- this.getAttribute('default-active-id') || this.getResolvedItems()[0]?.id || '';
53
- }
54
- this.render();
55
- void ensureHighlightReady().then(() => {
56
- if (this.isConnected && this.built)
57
- this.render();
58
- });
59
- this.addEventListener('db-change', this.handleSegmentChange);
60
- }
61
- disconnectedCallback() {
62
- this.removeEventListener('db-change', this.handleSegmentChange);
63
- if (this.copyTimeout)
64
- window.clearTimeout(this.copyTimeout);
65
- }
66
- attributeChangedCallback(name) {
67
- if (!this.built)
68
- return;
69
- if (name === 'active-id') {
70
- this.render();
71
- return;
72
- }
73
- if (name === 'items' || name === 'code' || name === 'language') {
74
- const items = this.getResolvedItems();
75
- if (!items.find((item) => item.id === this.getActiveId())) {
76
- this.internalActiveId = items[0]?.id || '';
77
- }
78
- }
79
- this.render();
80
- }
81
- getBool(name, fallback = true) {
82
- if (!this.hasAttribute(name))
83
- return fallback;
84
- const value = this.getAttribute(name);
85
- return value === '' || value === 'true';
86
- }
87
- getResolvedItems() {
88
- const rawItems = this.getAttribute('items');
89
- if (rawItems) {
90
- try {
91
- const parsed = JSON.parse(rawItems);
92
- if (Array.isArray(parsed) && parsed.length > 0)
93
- return parsed;
94
- }
95
- catch {
96
- /* ignore */
97
- }
98
- }
99
- const code = this.getAttribute('code');
100
- if (code) {
101
- const language = this.getAttribute('language') || 'tsx';
102
- return [{ id: 'default', label: language, code, language }];
103
- }
104
- return [];
105
- }
106
- getActiveId() {
107
- return this.getAttribute('active-id') || this.internalActiveId;
108
- }
109
- getActiveItem() {
110
- const items = this.getResolvedItems();
111
- return items.find((item) => item.id === this.getActiveId()) || items[0];
112
- }
113
- toCssSize(value) {
114
- if (!value)
115
- return undefined;
116
- return /^\d+$/.test(value) ? `${value}px` : value;
117
- }
118
- async handleCopy() {
119
- const activeItem = this.getActiveItem();
120
- const editable = this.getBool('editable', false);
121
- const text = (editable
122
- ? (this.editedCodes[activeItem?.id ?? ''] ?? activeItem?.code)
123
- : activeItem?.code)?.trim();
124
- if (!text)
125
- return;
126
- try {
127
- await navigator.clipboard.writeText(text);
128
- }
129
- catch {
130
- const textarea = document.createElement('textarea');
131
- textarea.value = text;
132
- textarea.style.position = 'fixed';
133
- textarea.style.opacity = '0';
134
- document.body.appendChild(textarea);
135
- textarea.select();
136
- document.execCommand('copy');
137
- textarea.remove();
138
- }
139
- this.copied = true;
140
- this.render();
141
- if (this.copyTimeout)
142
- window.clearTimeout(this.copyTimeout);
143
- this.copyTimeout = window.setTimeout(() => {
144
- this.copied = false;
145
- this.render();
146
- }, 1600);
147
- }
148
- render() {
149
- const token = ++this.renderToken;
150
- this.renderNow(token);
151
- }
152
- renderNow(token) {
153
- const activeItem = this.getActiveItem();
154
- if (!activeItem) {
155
- this.replaceChildren();
156
- return;
157
- }
158
- const items = this.getResolvedItems();
159
- const hasSegments = items.length > 1;
160
- const language = this.getAttribute('language') || 'tsx';
161
- const activeLanguage = activeItem.language ?? language;
162
- const showLanguage = this.getBool('show-language', true);
163
- const highlight = this.getBool('highlight', true);
164
- const theme = this.getAttribute('theme') || 'auto';
165
- const showCopy = this.getBool('show-copy', true);
166
- const copiedLabel = this.getAttribute('copied-label') || '복사됨';
167
- const copyLabel = this.getAttribute('copy-label') || '복사';
168
- const overflow = this.getAttribute('overflow') || 'scroll-x';
169
- const editable = this.getBool('editable', false);
170
- const sourceCode = editable
171
- ? (this.editedCodes[activeItem.id] ?? activeItem.code)
172
- : activeItem.code;
173
- const trimmedCode = sourceCode.trim();
174
- let highlightedCode = null;
175
- if (highlight && sourceCode) {
176
- try {
177
- highlightedCode = highlightCodeSync(sourceCode, activeLanguage);
178
- }
179
- catch {
180
- highlightedCode = null;
181
- }
182
- }
183
- if (token !== this.renderToken)
184
- return;
185
- const minHeight = this.toCssSize(this.getAttribute('min-height'));
186
- const maxHeight = this.toCssSize(this.getAttribute('max-height'));
187
- if (minHeight)
188
- this.style.setProperty('--db-code-block-min-height', minHeight);
189
- else
190
- this.style.removeProperty('--db-code-block-min-height');
191
- if (maxHeight)
192
- this.style.setProperty('--db-code-block-max-height', maxHeight);
193
- else
194
- this.style.removeProperty('--db-code-block-max-height');
195
- this.className = [
196
- CLASS,
197
- `${CLASS}--overflow-${overflow}`,
198
- theme !== 'auto' && `${CLASS}--theme-${theme}`,
199
- editable && `${CLASS}--editable`,
200
- ]
201
- .filter(Boolean)
202
- .join(' ');
203
- const toolbar = document.createElement('div');
204
- toolbar.className = `${CLASS}__toolbar`;
205
- const toolbarLeft = document.createElement('div');
206
- toolbarLeft.className = `${CLASS}__toolbar-left`;
207
- if (hasSegments) {
208
- const segment = document.createElement('db-segment-control');
209
- segment.setAttribute('size', 's');
210
- segment.setAttribute('options', JSON.stringify(items.map((item) => ({ value: item.id, label: item.label }))));
211
- segment.setAttribute('value', this.getActiveId());
212
- toolbarLeft.append(segment);
213
- }
214
- if (showLanguage) {
215
- const languageEl = document.createElement('span');
216
- languageEl.className = `${CLASS}__language`;
217
- languageEl.textContent = formatLanguageLabel(activeLanguage);
218
- toolbarLeft.append(languageEl);
219
- }
220
- toolbar.append(toolbarLeft);
221
- if (showCopy) {
222
- const copyButton = document.createElement('db-button');
223
- copyButton.setAttribute('type', 'button');
224
- copyButton.setAttribute('variant', 'tertiary');
225
- copyButton.setAttribute('size', 's');
226
- copyButton.setAttribute('start-icon', this.copied ? 'done' : 'copy');
227
- copyButton.textContent = this.copied ? copiedLabel : copyLabel;
228
- copyButton.addEventListener('db-click', () => this.handleCopy());
229
- toolbar.append(copyButton);
230
- }
231
- const body = document.createElement('div');
232
- body.className = `${CLASS}__body`;
233
- if (hasSegments && activeItem.description) {
234
- const caption = document.createElement('p');
235
- caption.className = `${CLASS}__caption`;
236
- caption.textContent = activeItem.description;
237
- body.append(caption);
238
- }
239
- if (editable) {
240
- if (this.editedCodes[activeItem.id] === undefined) {
241
- this.editedCodes[activeItem.id] = activeItem.code;
242
- }
243
- const editor = document.createElement('div');
244
- editor.className = `${CLASS}__editor`;
245
- const mirrorPre = document.createElement('pre');
246
- mirrorPre.className = `${CLASS}__pre ${CLASS}__pre--mirror`;
247
- mirrorPre.setAttribute('aria-hidden', 'true');
248
- const mirrorCode = document.createElement('code');
249
- mirrorCode.className = `${CLASS}__code language-${activeLanguage}`;
250
- if (highlightedCode) {
251
- mirrorCode.innerHTML = highlightedCode;
252
- }
253
- else {
254
- mirrorCode.textContent = sourceCode;
255
- }
256
- mirrorPre.append(mirrorCode);
257
- const textarea = document.createElement('textarea');
258
- textarea.className = `${CLASS}__textarea`;
259
- textarea.value = sourceCode;
260
- textarea.spellcheck = false;
261
- textarea.setAttribute('autocapitalize', 'off');
262
- textarea.setAttribute('autocorrect', 'off');
263
- textarea.setAttribute('aria-label', `${formatLanguageLabel(activeLanguage)} 코드 편집`);
264
- textarea.addEventListener('input', () => {
265
- this.editedCodes[activeItem.id] = textarea.value;
266
- const nextHighlight = highlight && textarea.value
267
- ? highlightCodeSync(textarea.value, activeLanguage)
268
- : null;
269
- if (nextHighlight) {
270
- mirrorCode.innerHTML = nextHighlight;
271
- }
272
- else {
273
- mirrorCode.textContent = textarea.value;
274
- }
275
- this.dispatchEvent(new CustomEvent('db-code-change', {
276
- detail: { code: textarea.value, itemId: activeItem.id },
277
- bubbles: true,
278
- composed: true,
279
- }));
280
- });
281
- editor.append(mirrorPre, textarea);
282
- body.append(editor);
283
- }
284
- else {
285
- const pre = document.createElement('pre');
286
- pre.className = `${CLASS}__pre`;
287
- const code = document.createElement('code');
288
- code.className = `${CLASS}__code language-${activeLanguage}`;
289
- if (highlightedCode) {
290
- code.innerHTML = highlightedCode;
291
- }
292
- else {
293
- code.textContent = trimmedCode;
294
- }
295
- pre.append(code);
296
- body.append(pre);
297
- }
298
- this.replaceChildren(toolbar, body);
299
- }
300
- }
301
- if (!customElements.get('db-code-block'))
302
- customElements.define('db-code-block', DbCodeBlock);
303
-
304
- export { DbCodeBlock };
1
+ import{ensureHighlightReady as e,highlightCodeSync as t,formatLanguageLabel as i}from"./highlight-code.js";const s="designbase-wc-code-block";class DbCodeBlock extends HTMLElement{constructor(){super(...arguments),this.built=!1,this.renderToken=0,this.internalActiveId="",this.copied=!1,this.editedCodes={},this.handleSegmentChange=e=>{const t=e,i=t.detail?.value;i&&(this.hasAttribute("active-id")||(this.internalActiveId=i),this.dispatchEvent(new CustomEvent("db-active-id-change",{detail:{activeId:i},bubbles:!0,composed:!0})),this.render())}}static get observedAttributes(){return["items","code","language","default-active-id","active-id","show-language","highlight","theme","show-copy","copied-label","copy-label","min-height","max-height","overflow","editable"]}connectedCallback(){this.style.display="block",this.built||(this.built=!0,this.internalActiveId=this.getAttribute("default-active-id")||this.getResolvedItems()[0]?.id||""),this.render(),e().then(()=>{this.isConnected&&this.built&&this.render()}),this.addEventListener("db-change",this.handleSegmentChange)}disconnectedCallback(){this.removeEventListener("db-change",this.handleSegmentChange),this.copyTimeout&&window.clearTimeout(this.copyTimeout)}attributeChangedCallback(e){if(this.built)if("active-id"!==e){if("items"===e||"code"===e||"language"===e){const e=this.getResolvedItems();e.find(e=>e.id===this.getActiveId())||(this.internalActiveId=e[0]?.id||"")}this.render()}else this.render()}getBool(e,t=!0){if(!this.hasAttribute(e))return t;const i=this.getAttribute(e);return""===i||"true"===i}getResolvedItems(){const e=this.getAttribute("items");if(e)try{const t=JSON.parse(e);if(Array.isArray(t)&&t.length>0)return t}catch{}const t=this.getAttribute("code");if(t){const e=this.getAttribute("language")||"tsx";return[{id:"default",label:e,code:t,language:e}]}return[]}getActiveId(){return this.getAttribute("active-id")||this.internalActiveId}getActiveItem(){const e=this.getResolvedItems();return e.find(e=>e.id===this.getActiveId())||e[0]}toCssSize(e){if(e)return/^\d+$/.test(e)?`${e}px`:e}async handleCopy(){const e=this.getActiveItem(),t=this.getBool("editable",!1),i=(t?this.editedCodes[e?.id??""]??e?.code:e?.code)?.trim();if(i){try{await navigator.clipboard.writeText(i)}catch{const e=document.createElement("textarea");e.value=i,e.style.position="fixed",e.style.opacity="0",document.body.appendChild(e),e.select(),document.execCommand("copy"),e.remove()}this.copied=!0,this.render(),this.copyTimeout&&window.clearTimeout(this.copyTimeout),this.copyTimeout=window.setTimeout(()=>{this.copied=!1,this.render()},1600)}}render(){const e=++this.renderToken;this.renderNow(e)}renderNow(e){const o=this.getActiveItem();if(!o)return void this.replaceChildren();const n=this.getResolvedItems(),d=n.length>1,c=this.getAttribute("language")||"tsx",a=o.language??c,r=this.getBool("show-language",!0),l=this.getBool("highlight",!0),h=this.getAttribute("theme")||"auto",u=this.getBool("show-copy",!0),m=this.getAttribute("copied-label")||"복사됨",b=this.getAttribute("copy-label")||"복사",g=this.getAttribute("overflow")||"scroll-x",p=this.getBool("editable",!1),v=p?this.editedCodes[o.id]??o.code:o.code,A=v.trim();let y=null;if(l&&v)try{y=t(v,a)}catch{y=null}if(e!==this.renderToken)return;const f=this.toCssSize(this.getAttribute("min-height")),C=this.toCssSize(this.getAttribute("max-height"));f?this.style.setProperty("--db-code-block-min-height",f):this.style.removeProperty("--db-code-block-min-height"),C?this.style.setProperty("--db-code-block-max-height",C):this.style.removeProperty("--db-code-block-max-height"),this.className=[s,`${s}--overflow-${g}`,"auto"!==h&&`${s}--theme-${h}`,p&&`${s}--editable`].filter(Boolean).join(" ");const E=document.createElement("div");E.className=`${s}__toolbar`;const _=document.createElement("div");if(_.className=`${s}__toolbar-left`,d){const e=document.createElement("db-segment-control");e.setAttribute("size","s"),e.setAttribute("options",JSON.stringify(n.map(e=>({value:e.id,label:e.label})))),e.setAttribute("value",this.getActiveId()),_.append(e)}if(r){const e=document.createElement("span");e.className=`${s}__language`,e.textContent=i(a),_.append(e)}if(E.append(_),u){const e=document.createElement("db-button");e.setAttribute("type","button"),e.setAttribute("variant","tertiary"),e.setAttribute("size","s"),e.setAttribute("start-icon",this.copied?"done":"copy"),e.textContent=this.copied?m:b,e.addEventListener("db-click",()=>this.handleCopy()),E.append(e)}const x=document.createElement("div");if(x.className=`${s}__body`,d&&o.description){const e=document.createElement("p");e.className=`${s}__caption`,e.textContent=o.description,x.append(e)}if(p){void 0===this.editedCodes[o.id]&&(this.editedCodes[o.id]=o.code);const e=document.createElement("div");e.className=`${s}__editor`;const n=document.createElement("pre");n.className=`${s}__pre ${s}__pre--mirror`,n.setAttribute("aria-hidden","true");const d=document.createElement("code");d.className=`${s}__code language-${a}`,y?d.innerHTML=y:d.textContent=v,n.append(d);const c=document.createElement("textarea");c.className=`${s}__textarea`,c.value=v,c.spellcheck=!1,c.setAttribute("autocapitalize","off"),c.setAttribute("autocorrect","off"),c.setAttribute("aria-label",`${i(a)} 코드 편집`),c.addEventListener("input",()=>{this.editedCodes[o.id]=c.value;const e=l&&c.value?t(c.value,a):null;e?d.innerHTML=e:d.textContent=c.value,this.dispatchEvent(new CustomEvent("db-code-change",{detail:{code:c.value,itemId:o.id},bubbles:!0,composed:!0}))}),e.append(n,c),x.append(e)}else{const e=document.createElement("pre");e.className=`${s}__pre`;const t=document.createElement("code");t.className=`${s}__code language-${a}`,y?t.innerHTML=y:t.textContent=A,e.append(t),x.append(e)}this.replaceChildren(E,x)}}customElements.get("db-code-block")||customElements.define("db-code-block",DbCodeBlock);export{DbCodeBlock};