@designbasekorea/ui-wc 0.5.3 → 0.5.6

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 (156) hide show
  1. package/dist/chunks/lottie-e273b936.js +17032 -0
  2. package/dist/esm/components/animation-background/canvas-controller.js +121 -1
  3. package/dist/esm/components/animation-background/controls.js +180 -1
  4. package/dist/esm/components/animation-background/graphite-controller.js +196 -1
  5. package/dist/esm/components/animation-background/graphite-presets.js +42 -1
  6. package/dist/esm/components/animation-background/graphite-shader.js +111 -1
  7. package/dist/esm/components/animation-background/layers.js +369 -1
  8. package/dist/esm/components/animation-background/lumina-presets.js +53 -1
  9. package/dist/esm/components/animation-background/lumina-shaders.js +181 -1
  10. package/dist/esm/components/animation-background/lumina-utils.js +60 -1
  11. package/dist/esm/components/animation-background/particle-defaults.js +36 -1
  12. package/dist/esm/components/animation-background/renderers.js +167 -1
  13. package/dist/esm/components/animation-background/shader-controller.js +154 -1
  14. package/dist/esm/components/color-picker-utils.js +134 -1
  15. package/dist/esm/components/date-picker-utils.js +140 -1
  16. package/dist/esm/components/db-accordion.js +304 -1
  17. package/dist/esm/components/db-ad-banner.js +455 -1
  18. package/dist/esm/components/db-alert.js +149 -1
  19. package/dist/esm/components/db-animation-background.js +486 -1
  20. package/dist/esm/components/db-animation-text.js +601 -1
  21. package/dist/esm/components/db-app-badge.js +88 -1
  22. package/dist/esm/components/db-audio-player.js +752 -1
  23. package/dist/esm/components/db-avatar.js +188 -1
  24. package/dist/esm/components/db-backdrop.js +139 -1
  25. package/dist/esm/components/db-badge.js +91 -1
  26. package/dist/esm/components/db-banner.js +188 -1
  27. package/dist/esm/components/db-bottom-navigation.js +146 -1
  28. package/dist/esm/components/db-bottom-sheet.js +481 -1
  29. package/dist/esm/components/db-breadcrumbs.js +329 -1
  30. package/dist/esm/components/db-button.js +316 -1
  31. package/dist/esm/components/db-calendar.js +675 -1
  32. package/dist/esm/components/db-card.js +265 -1
  33. package/dist/esm/components/db-carousel.js +264 -1
  34. package/dist/esm/components/db-checkbox.js +202 -1
  35. package/dist/esm/components/db-chip.js +104 -1
  36. package/dist/esm/components/db-code-block.js +304 -1
  37. package/dist/esm/components/db-color-picker.js +746 -1
  38. package/dist/esm/components/db-confirm.js +191 -1
  39. package/dist/esm/components/db-container.js +39 -1
  40. package/dist/esm/components/db-context-menu.js +265 -1
  41. package/dist/esm/components/db-countdown.js +146 -1
  42. package/dist/esm/components/db-cursor-follower.js +173 -1
  43. package/dist/esm/components/db-date-picker.js +837 -1
  44. package/dist/esm/components/db-divider.js +66 -1
  45. package/dist/esm/components/db-drawer.js +245 -1
  46. package/dist/esm/components/db-dropdown.js +493 -1
  47. package/dist/esm/components/db-dropzone.js +266 -1
  48. package/dist/esm/components/db-empty-state.js +97 -1
  49. package/dist/esm/components/db-file-uploader.js +256 -1
  50. package/dist/esm/components/db-floating-action-button.js +139 -1
  51. package/dist/esm/components/db-footer.js +385 -1
  52. package/dist/esm/components/db-form.js +566 -1
  53. package/dist/esm/components/db-gantt.js +882 -1
  54. package/dist/esm/components/db-gradient.js +133 -1
  55. package/dist/esm/components/db-grid-background.js +909 -1
  56. package/dist/esm/components/db-grid.js +73 -1
  57. package/dist/esm/components/db-icons.js +82 -1
  58. package/dist/esm/components/db-image-list.js +214 -1
  59. package/dist/esm/components/db-image-placeholder.js +96 -1
  60. package/dist/esm/components/db-image.js +289 -1
  61. package/dist/esm/components/db-indicator.js +517 -1
  62. package/dist/esm/components/db-input.js +420 -1
  63. package/dist/esm/components/db-kanban.js +538 -1
  64. package/dist/esm/components/db-label.js +66 -1
  65. package/dist/esm/components/db-lightbox.js +372 -1
  66. package/dist/esm/components/db-list.js +340 -1
  67. package/dist/esm/components/db-logo-svg.js +72 -1
  68. package/dist/esm/components/db-logo.js +106 -1
  69. package/dist/esm/components/db-lottie.js +109 -1
  70. package/dist/esm/components/db-markdown-editor.js +458 -1
  71. package/dist/esm/components/db-marquee.js +402 -1
  72. package/dist/esm/components/db-masonry.js +94 -1
  73. package/dist/esm/components/db-menu-item.js +211 -1
  74. package/dist/esm/components/db-modal.js +522 -1
  75. package/dist/esm/components/db-navbar.js +680 -1
  76. package/dist/esm/components/db-onboarding-modal.js +322 -1
  77. package/dist/esm/components/db-page-header.js +312 -1
  78. package/dist/esm/components/db-pagination.js +271 -1
  79. package/dist/esm/components/db-popover.js +580 -1
  80. package/dist/esm/components/db-progress-step.js +166 -1
  81. package/dist/esm/components/db-progress.js +171 -1
  82. package/dist/esm/components/db-progressbar.js +72 -1
  83. package/dist/esm/components/db-radio.js +172 -1
  84. package/dist/esm/components/db-random-gradient.js +121 -1
  85. package/dist/esm/components/db-range-slider.js +811 -1
  86. package/dist/esm/components/db-rating.js +325 -1
  87. package/dist/esm/components/db-reorder.js +286 -1
  88. package/dist/esm/components/db-resizable-panels.js +282 -1
  89. package/dist/esm/components/db-scroll-area.js +126 -1
  90. package/dist/esm/components/db-search-bar.js +668 -1
  91. package/dist/esm/components/db-section-app-download.js +101 -1
  92. package/dist/esm/components/db-section-contact.js +102 -1
  93. package/dist/esm/components/db-section-cta.js +150 -1
  94. package/dist/esm/components/db-section-faq.js +120 -1
  95. package/dist/esm/components/db-section-feature-grid.js +137 -1
  96. package/dist/esm/components/db-section-feature.js +179 -1
  97. package/dist/esm/components/db-section-hero.js +243 -1
  98. package/dist/esm/components/db-section-logo-cloud.js +138 -1
  99. package/dist/esm/components/db-section-pricing.js +166 -1
  100. package/dist/esm/components/db-section-stats.js +129 -1
  101. package/dist/esm/components/db-section-testimonials.js +252 -1
  102. package/dist/esm/components/db-section.js +385 -1
  103. package/dist/esm/components/db-segment-control.js +231 -1
  104. package/dist/esm/components/db-select.js +571 -1
  105. package/dist/esm/components/db-share-icons.js +40 -1
  106. package/dist/esm/components/db-share.js +489 -1
  107. package/dist/esm/components/db-sidebar.js +1068 -1
  108. package/dist/esm/components/db-skeleton.js +94 -1
  109. package/dist/esm/components/db-spinner.js +102 -1
  110. package/dist/esm/components/db-split-view.js +297 -1
  111. package/dist/esm/components/db-stack.js +46 -1
  112. package/dist/esm/components/db-stat.js +218 -1
  113. package/dist/esm/components/db-stepper.js +398 -1
  114. package/dist/esm/components/db-table.js +412 -1
  115. package/dist/esm/components/db-tabs.js +335 -1
  116. package/dist/esm/components/db-testimonial.js +162 -1
  117. package/dist/esm/components/db-textarea.js +233 -1
  118. package/dist/esm/components/db-time-picker.js +523 -1
  119. package/dist/esm/components/db-timeline.js +174 -1
  120. package/dist/esm/components/db-toast.js +158 -1
  121. package/dist/esm/components/db-toggle.js +162 -1
  122. package/dist/esm/components/db-toolbar.js +94 -1
  123. package/dist/esm/components/db-tooltip.js +440 -1
  124. package/dist/esm/components/db-top-banner.js +121 -1
  125. package/dist/esm/components/db-tutorial.js +324 -1
  126. package/dist/esm/components/db-video-player.js +503 -1
  127. package/dist/esm/components/db-youtube-player.js +194 -1
  128. package/dist/esm/components/highlight-code.js +65 -1
  129. package/dist/esm/components/input-validation.js +50 -1
  130. package/dist/esm/components/marketing-block-host-utils.js +9 -1
  131. package/dist/esm/components/number-scrub.js +117 -1
  132. package/dist/esm/components/random-gradient-palettes.js +67 -1
  133. package/dist/esm/components/section-block-header-utils.js +48 -1
  134. package/dist/esm/helpers/confirm.js +52 -1
  135. package/dist/esm/helpers/toast.js +73 -1
  136. package/dist/esm/index.js +111 -1
  137. package/dist/esm/node_modules/prismjs/components/prism-bash.js +235 -1
  138. package/dist/esm/node_modules/prismjs/components/prism-clike.js +31 -1
  139. package/dist/esm/node_modules/prismjs/components/prism-css.js +64 -1
  140. package/dist/esm/node_modules/prismjs/components/prism-javascript.js +172 -1
  141. package/dist/esm/node_modules/prismjs/components/prism-json.js +27 -1
  142. package/dist/esm/node_modules/prismjs/components/prism-jsx.js +143 -1
  143. package/dist/esm/node_modules/prismjs/components/prism-markup.js +186 -1
  144. package/dist/esm/node_modules/prismjs/components/prism-scss.js +81 -1
  145. package/dist/esm/node_modules/prismjs/components/prism-tsx.js +15 -1
  146. package/dist/esm/node_modules/prismjs/components/prism-typescript.js +60 -1
  147. package/dist/index.cjs +55414 -1
  148. package/dist/index.css +1 -1
  149. package/dist/index.esm.js +38284 -1
  150. package/dist/react/chunks/lottie-72a4c6d4.js +17032 -0
  151. package/dist/react/index.cjs +56503 -1
  152. package/dist/react/index.d.ts +1 -1
  153. package/dist/react/index.esm.js +39373 -1
  154. package/package.json +1 -1
  155. package/dist/chunks/lottie-2d1f6278.js +0 -1
  156. package/dist/react/chunks/lottie-14e7addb.js +0 -1
@@ -1 +1,202 @@
1
- import{createDbIcon as t}from"./db-icons.js";const e=["s","m","l"];class DbCheckbox extends HTMLElement{constructor(){super(...arguments),this.built=!1,this.handleChange=()=>{if(!this.input)return;const t=this.input.checked;this.toggleAttribute("checked",t),this.indeterminate&&(this.removeAttribute("indeterminate"),this.input.indeterminate=!1),this.syncVisual(),this.syncClasses(),this.dispatchEvent(new CustomEvent("db-change",{detail:{checked:t,selected:t},bubbles:!0,composed:!0}))}}static get observedAttributes(){return["checked","selected","default-checked","default-selected","indeterminate","size","disabled","readonly","required","name","value","has-label"]}get checked(){return this.input?.checked??(this.hasAttribute("checked")||this.hasAttribute("selected"))}set checked(t){this.toggleAttribute("checked",t),this.input&&(this.input.checked=t,this.syncVisual(),this.syncClasses())}get indeterminate(){return this.hasAttribute("indeterminate")}set indeterminate(t){this.toggleAttribute("indeterminate",t),this.input&&(this.input.indeterminate=t,this.syncVisual(),this.syncClasses())}get disabled(){return this.hasAttribute("disabled")}set disabled(t){this.toggleAttribute("disabled",t),this.input&&(this.input.disabled=t),this.syncClasses()}get readOnly(){return this.hasAttribute("readonly")}set readOnly(t){this.toggleAttribute("readonly",t),this.input&&(this.input.readOnly=t),this.syncClasses()}get required(){return this.hasAttribute("required")}set required(t){this.toggleAttribute("required",t),this.input&&(this.input.required=t)}get size(){return this.getAttribute("size")||"m"}set size(t){this.setAttribute("size",t)}connectedCallback(){this.style.display="contents",this.built||this.build(),this.syncState()}attributeChangedCallback(t){if(this.built)return"checked"===t||"selected"===t?(this.input&&(this.input.checked=this.hasAttribute("checked")||this.hasAttribute("selected")),this.syncVisual(),void this.syncClasses()):void this.syncState()}get hasLabel(){return!this.hasAttribute("has-label")||"false"!==this.getAttribute("has-label")}build(){for(this.root=document.createElement("label"),this.root.className="designbase-wc-checkbox",this.input=document.createElement("input"),this.input.type="checkbox",this.input.className="designbase-wc-checkbox__input",this.visual=document.createElement("span"),this.visual.className="designbase-wc-checkbox__visual",this.visual.setAttribute("aria-hidden","true"),this.labelEl=document.createElement("span"),this.labelEl.className="designbase-wc-checkbox__label";this.firstChild;)this.labelEl.appendChild(this.firstChild);this.root.append(this.input,this.visual,this.labelEl),this.appendChild(this.root),this.input.addEventListener("change",this.handleChange),this.built=!0}syncState(){if(!this.root||!this.input||!this.visual)return;const t=this.hasAttribute("checked")||this.hasAttribute("selected")||!this.hasAttribute("checked")&&!this.hasAttribute("selected")&&(this.hasAttribute("default-checked")||this.hasAttribute("default-selected")),e=this.hasAttribute("indeterminate");this.input.checked=t,this.input.indeterminate=e,this.input.disabled=this.disabled,this.input.readOnly=this.readOnly,this.input.required=this.required,this.input.name=this.getAttribute("name")||"",this.input.value=this.getAttribute("value")||"",this.hasLabel?this.labelEl?.removeAttribute("hidden"):this.labelEl?.setAttribute("hidden",""),this.syncVisual(),this.syncClasses()}syncVisual(){if(this.visual&&this.input){if(this.visual.replaceChildren(),this.input.indeterminate){const e=document.createElement("span");return e.className="designbase-wc-checkbox__indeterminate-icon",e.appendChild(t("minus",16)),void this.visual.appendChild(e)}if(this.input.checked){const e=document.createElement("span");e.className="designbase-wc-checkbox__check-icon",e.appendChild(t("done",16)),this.visual.appendChild(e)}}}syncClasses(){if(!this.root||!this.input)return;const t=e.includes(this.size)?this.size:"m",i=this.hasLabel&&Boolean(this.labelEl?.textContent?.trim());this.root.className=["designbase-wc-checkbox",`designbase-wc-checkbox--${t}`,this.input.checked&&"designbase-wc-checkbox--selected",this.input.indeterminate&&"designbase-wc-checkbox--indeterminate",this.disabled&&"designbase-wc-checkbox--disabled",this.readOnly&&"designbase-wc-checkbox--readonly",!i&&"designbase-wc-checkbox--no-label"].filter(Boolean).join(" ")}}customElements.get("db-checkbox")||customElements.define("db-checkbox",DbCheckbox);export{DbCheckbox};
1
+ import { createDbIcon } from './db-icons.js';
2
+
3
+ const SIZES = ['s', 'm', 'l'];
4
+ const CHECK_ICON_SIZE = 16;
5
+ class DbCheckbox extends HTMLElement {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.built = false;
9
+ this.handleChange = () => {
10
+ if (!this.input)
11
+ return;
12
+ const checked = this.input.checked;
13
+ this.toggleAttribute('checked', checked);
14
+ if (this.indeterminate) {
15
+ this.removeAttribute('indeterminate');
16
+ this.input.indeterminate = false;
17
+ }
18
+ this.syncVisual();
19
+ this.syncClasses();
20
+ this.dispatchEvent(new CustomEvent('db-change', {
21
+ detail: { checked, selected: checked },
22
+ bubbles: true,
23
+ composed: true,
24
+ }));
25
+ };
26
+ }
27
+ static get observedAttributes() {
28
+ return [
29
+ 'checked',
30
+ 'selected',
31
+ 'default-checked',
32
+ 'default-selected',
33
+ 'indeterminate',
34
+ 'size',
35
+ 'disabled',
36
+ 'readonly',
37
+ 'required',
38
+ 'name',
39
+ 'value',
40
+ 'has-label',
41
+ ];
42
+ }
43
+ get checked() {
44
+ return this.input?.checked ?? (this.hasAttribute('checked') || this.hasAttribute('selected'));
45
+ }
46
+ set checked(value) {
47
+ this.toggleAttribute('checked', value);
48
+ if (this.input) {
49
+ this.input.checked = value;
50
+ this.syncVisual();
51
+ this.syncClasses();
52
+ }
53
+ }
54
+ get indeterminate() {
55
+ return this.hasAttribute('indeterminate');
56
+ }
57
+ set indeterminate(value) {
58
+ this.toggleAttribute('indeterminate', value);
59
+ if (this.input) {
60
+ this.input.indeterminate = value;
61
+ this.syncVisual();
62
+ this.syncClasses();
63
+ }
64
+ }
65
+ get disabled() {
66
+ return this.hasAttribute('disabled');
67
+ }
68
+ set disabled(value) {
69
+ this.toggleAttribute('disabled', value);
70
+ if (this.input)
71
+ this.input.disabled = value;
72
+ this.syncClasses();
73
+ }
74
+ get readOnly() {
75
+ return this.hasAttribute('readonly');
76
+ }
77
+ set readOnly(value) {
78
+ this.toggleAttribute('readonly', value);
79
+ if (this.input)
80
+ this.input.readOnly = value;
81
+ this.syncClasses();
82
+ }
83
+ get required() {
84
+ return this.hasAttribute('required');
85
+ }
86
+ set required(value) {
87
+ this.toggleAttribute('required', value);
88
+ if (this.input)
89
+ this.input.required = value;
90
+ }
91
+ get size() {
92
+ return this.getAttribute('size') || 'm';
93
+ }
94
+ set size(value) {
95
+ this.setAttribute('size', value);
96
+ }
97
+ connectedCallback() {
98
+ this.style.display = 'contents';
99
+ if (!this.built) {
100
+ this.build();
101
+ }
102
+ this.syncState();
103
+ }
104
+ attributeChangedCallback(name) {
105
+ if (!this.built)
106
+ return;
107
+ if (name === 'checked' || name === 'selected') {
108
+ if (this.input) {
109
+ this.input.checked = this.hasAttribute('checked') || this.hasAttribute('selected');
110
+ }
111
+ this.syncVisual();
112
+ this.syncClasses();
113
+ return;
114
+ }
115
+ this.syncState();
116
+ }
117
+ get hasLabel() {
118
+ return !this.hasAttribute('has-label') || this.getAttribute('has-label') !== 'false';
119
+ }
120
+ build() {
121
+ this.root = document.createElement('label');
122
+ this.root.className = 'designbase-wc-checkbox';
123
+ this.input = document.createElement('input');
124
+ this.input.type = 'checkbox';
125
+ this.input.className = 'designbase-wc-checkbox__input';
126
+ this.visual = document.createElement('span');
127
+ this.visual.className = 'designbase-wc-checkbox__visual';
128
+ this.visual.setAttribute('aria-hidden', 'true');
129
+ this.labelEl = document.createElement('span');
130
+ this.labelEl.className = 'designbase-wc-checkbox__label';
131
+ while (this.firstChild) {
132
+ this.labelEl.appendChild(this.firstChild);
133
+ }
134
+ this.root.append(this.input, this.visual, this.labelEl);
135
+ this.appendChild(this.root);
136
+ this.input.addEventListener('change', this.handleChange);
137
+ this.built = true;
138
+ }
139
+ syncState() {
140
+ if (!this.root || !this.input || !this.visual)
141
+ return;
142
+ const checked = this.hasAttribute('checked')
143
+ || this.hasAttribute('selected')
144
+ || (!this.hasAttribute('checked')
145
+ && !this.hasAttribute('selected')
146
+ && (this.hasAttribute('default-checked') || this.hasAttribute('default-selected')));
147
+ const indeterminate = this.hasAttribute('indeterminate');
148
+ this.input.checked = checked;
149
+ this.input.indeterminate = indeterminate;
150
+ this.input.disabled = this.disabled;
151
+ this.input.readOnly = this.readOnly;
152
+ this.input.required = this.required;
153
+ this.input.name = this.getAttribute('name') || '';
154
+ this.input.value = this.getAttribute('value') || '';
155
+ if (this.hasLabel) {
156
+ this.labelEl?.removeAttribute('hidden');
157
+ }
158
+ else {
159
+ this.labelEl?.setAttribute('hidden', '');
160
+ }
161
+ this.syncVisual();
162
+ this.syncClasses();
163
+ }
164
+ syncVisual() {
165
+ if (!this.visual || !this.input)
166
+ return;
167
+ this.visual.replaceChildren();
168
+ if (this.input.indeterminate) {
169
+ const iconHost = document.createElement('span');
170
+ iconHost.className = 'designbase-wc-checkbox__indeterminate-icon';
171
+ iconHost.appendChild(createDbIcon('minus', CHECK_ICON_SIZE));
172
+ this.visual.appendChild(iconHost);
173
+ return;
174
+ }
175
+ if (this.input.checked) {
176
+ const iconHost = document.createElement('span');
177
+ iconHost.className = 'designbase-wc-checkbox__check-icon';
178
+ iconHost.appendChild(createDbIcon('done', CHECK_ICON_SIZE));
179
+ this.visual.appendChild(iconHost);
180
+ }
181
+ }
182
+ syncClasses() {
183
+ if (!this.root || !this.input)
184
+ return;
185
+ const size = SIZES.includes(this.size) ? this.size : 'm';
186
+ const hasLabelText = this.hasLabel && Boolean(this.labelEl?.textContent?.trim());
187
+ this.root.className = [
188
+ 'designbase-wc-checkbox',
189
+ `designbase-wc-checkbox--${size}`,
190
+ this.input.checked && 'designbase-wc-checkbox--selected',
191
+ this.input.indeterminate && 'designbase-wc-checkbox--indeterminate',
192
+ this.disabled && 'designbase-wc-checkbox--disabled',
193
+ this.readOnly && 'designbase-wc-checkbox--readonly',
194
+ !hasLabelText && 'designbase-wc-checkbox--no-label',
195
+ ].filter(Boolean).join(' ');
196
+ }
197
+ }
198
+ if (!customElements.get('db-checkbox')) {
199
+ customElements.define('db-checkbox', DbCheckbox);
200
+ }
201
+
202
+ export { DbCheckbox };
@@ -1 +1,104 @@
1
- import{createDbIcon as e}from"./db-icons.js";const t=["s","m","l"],i=["default","primary","success","warning","danger","info","neutral"];class DbChip extends HTMLElement{static get observedAttributes(){return["label","size","variant","deletable","disabled","selected","full-width","clickable","start-icon","end-icon"]}connectedCallback(){this.render()}attributeChangedCallback(){this.render()}iconSize(e){return"s"===e?12:"l"===e?20:16}render(){const s=this.getAttribute("label")||this.textContent?.trim()||"",n=this.getAttribute("size")||"m",c=this.getAttribute("variant")||"default",a=this.hasAttribute("disabled"),d=this.hasAttribute("deletable"),l=this.hasAttribute("selected"),b=this.hasAttribute("full-width"),h=this.hasAttribute("clickable"),r=this.getAttribute("start-icon"),o=this.getAttribute("end-icon"),p=t.includes(n)?n:"m",u=i.includes(c)?c:"default",m=this.iconSize(p);if(this.className=["designbase-wc-chip",`designbase-wc-chip--${p}`,`designbase-wc-chip--${u}`,d&&"designbase-wc-chip--deletable",a&&"designbase-wc-chip--disabled",l&&"designbase-wc-chip--selected",h&&"designbase-wc-chip--clickable",b&&"designbase-wc-chip--full-width"].filter(Boolean).join(" "),this.replaceChildren(),h&&!a?(this.setAttribute("role","button"),this.tabIndex=0):(this.removeAttribute("role"),this.removeAttribute("tabindex")),r){const t=document.createElement("span");t.className="designbase-wc-chip__start-icon",t.append(e(r,m)),this.append(t)}const g=document.createElement("span");if(g.className="designbase-wc-chip__label",g.textContent=s,this.append(g),o&&!d){const t=document.createElement("span");t.className="designbase-wc-chip__end-icon",t.append(e(o,m)),this.append(t)}if(d){const t=document.createElement("button");t.type="button",t.className="designbase-wc-chip__delete-button",t.disabled=a,t.setAttribute("aria-label",`${s} 삭제`),t.append(e("close",m)),t.addEventListener("click",e=>{e.stopPropagation(),a||this.dispatchEvent(new CustomEvent("db-delete",{bubbles:!0,composed:!0}))}),this.append(t)}this.onclick=()=>{!a&&h&&this.dispatchEvent(new CustomEvent("db-click",{bubbles:!0,composed:!0}))},this.onkeydown=e=>{"Enter"!==e.key&&" "!==e.key||a||!h||(e.preventDefault(),this.dispatchEvent(new CustomEvent("db-click",{bubbles:!0,composed:!0})))}}}customElements.get("db-chip")||customElements.define("db-chip",DbChip);export{DbChip};
1
+ import { createDbIcon } from './db-icons.js';
2
+
3
+ const SIZES = ['s', 'm', 'l'];
4
+ const VARIANTS = ['default', 'primary', 'success', 'warning', 'danger', 'info', 'neutral'];
5
+ class DbChip extends HTMLElement {
6
+ static get observedAttributes() {
7
+ return ['label', 'size', 'variant', 'deletable', 'disabled', 'selected', 'full-width', 'clickable', 'start-icon', 'end-icon'];
8
+ }
9
+ connectedCallback() {
10
+ this.render();
11
+ }
12
+ attributeChangedCallback() {
13
+ this.render();
14
+ }
15
+ iconSize(size) {
16
+ if (size === 's')
17
+ return 12;
18
+ if (size === 'l')
19
+ return 20;
20
+ return 16;
21
+ }
22
+ render() {
23
+ const label = this.getAttribute('label') || this.textContent?.trim() || '';
24
+ const size = this.getAttribute('size') || 'm';
25
+ const variant = this.getAttribute('variant') || 'default';
26
+ const disabled = this.hasAttribute('disabled');
27
+ const deletable = this.hasAttribute('deletable');
28
+ const selected = this.hasAttribute('selected');
29
+ const fullWidth = this.hasAttribute('full-width');
30
+ const clickable = this.hasAttribute('clickable');
31
+ const startIcon = this.getAttribute('start-icon');
32
+ const endIcon = this.getAttribute('end-icon');
33
+ const resolvedSize = SIZES.includes(size) ? size : 'm';
34
+ const resolvedVariant = VARIANTS.includes(variant) ? variant : 'default';
35
+ const iconPx = this.iconSize(resolvedSize);
36
+ this.className = [
37
+ 'designbase-wc-chip',
38
+ `designbase-wc-chip--${resolvedSize}`,
39
+ `designbase-wc-chip--${resolvedVariant}`,
40
+ deletable && 'designbase-wc-chip--deletable',
41
+ disabled && 'designbase-wc-chip--disabled',
42
+ selected && 'designbase-wc-chip--selected',
43
+ clickable && 'designbase-wc-chip--clickable',
44
+ fullWidth && 'designbase-wc-chip--full-width',
45
+ ]
46
+ .filter(Boolean)
47
+ .join(' ');
48
+ this.replaceChildren();
49
+ if (clickable && !disabled) {
50
+ this.setAttribute('role', 'button');
51
+ this.tabIndex = 0;
52
+ }
53
+ else {
54
+ this.removeAttribute('role');
55
+ this.removeAttribute('tabindex');
56
+ }
57
+ if (startIcon) {
58
+ const iconWrap = document.createElement('span');
59
+ iconWrap.className = 'designbase-wc-chip__start-icon';
60
+ iconWrap.append(createDbIcon(startIcon, iconPx));
61
+ this.append(iconWrap);
62
+ }
63
+ const text = document.createElement('span');
64
+ text.className = 'designbase-wc-chip__label';
65
+ text.textContent = label;
66
+ this.append(text);
67
+ if (endIcon && !deletable) {
68
+ const iconWrap = document.createElement('span');
69
+ iconWrap.className = 'designbase-wc-chip__end-icon';
70
+ iconWrap.append(createDbIcon(endIcon, iconPx));
71
+ this.append(iconWrap);
72
+ }
73
+ if (deletable) {
74
+ const button = document.createElement('button');
75
+ button.type = 'button';
76
+ button.className = 'designbase-wc-chip__delete-button';
77
+ button.disabled = disabled;
78
+ button.setAttribute('aria-label', `${label} 삭제`);
79
+ button.append(createDbIcon('close', iconPx));
80
+ button.addEventListener('click', (event) => {
81
+ event.stopPropagation();
82
+ if (!disabled) {
83
+ this.dispatchEvent(new CustomEvent('db-delete', { bubbles: true, composed: true }));
84
+ }
85
+ });
86
+ this.append(button);
87
+ }
88
+ this.onclick = () => {
89
+ if (!disabled && clickable) {
90
+ this.dispatchEvent(new CustomEvent('db-click', { bubbles: true, composed: true }));
91
+ }
92
+ };
93
+ this.onkeydown = (event) => {
94
+ if ((event.key === 'Enter' || event.key === ' ') && !disabled && clickable) {
95
+ event.preventDefault();
96
+ this.dispatchEvent(new CustomEvent('db-click', { bubbles: true, composed: true }));
97
+ }
98
+ };
99
+ }
100
+ }
101
+ if (!customElements.get('db-chip'))
102
+ customElements.define('db-chip', DbChip);
103
+
104
+ export { DbChip };
@@ -1 +1,304 @@
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};
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 };