@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,233 +1 @@
1
- const SIZES = ['s', 'm', 'l'];
2
- class DbTextarea extends HTMLElement {
3
- constructor() {
4
- super(...arguments);
5
- this.built = false;
6
- this.handleInput = (event) => {
7
- event.stopPropagation();
8
- if (!this.field)
9
- return;
10
- this.updateCharacterCount();
11
- this.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true }));
12
- this.dispatchEvent(new CustomEvent('db-input', {
13
- detail: { value: this.field.value, nativeEvent: event },
14
- bubbles: true,
15
- composed: true,
16
- }));
17
- };
18
- this.handleChange = (event) => {
19
- event.stopPropagation();
20
- if (!this.field)
21
- return;
22
- const nextValue = this.field.value;
23
- if (this.getAttribute('value') !== nextValue) {
24
- this.setAttribute('value', nextValue);
25
- }
26
- this.updateCharacterCount();
27
- this.dispatchEvent(new Event('change', { bubbles: true }));
28
- this.dispatchEvent(new CustomEvent('db-change', {
29
- detail: { value: nextValue, nativeEvent: event },
30
- bubbles: true,
31
- composed: true,
32
- }));
33
- };
34
- }
35
- static get observedAttributes() {
36
- return [
37
- 'label',
38
- 'placeholder',
39
- 'value',
40
- 'default-value',
41
- 'name',
42
- 'size',
43
- 'rows',
44
- 'max-length',
45
- 'show-character-count',
46
- 'character-count-position',
47
- 'disabled',
48
- 'readonly',
49
- 'required',
50
- 'error',
51
- 'error-message',
52
- 'helper-text',
53
- 'full-width',
54
- 'resizable',
55
- ];
56
- }
57
- get value() {
58
- return this.field?.value ?? this.getAttribute('value') ?? '';
59
- }
60
- set value(value) {
61
- this.setAttribute('value', value);
62
- if (this.field) {
63
- this.field.value = value;
64
- this.updateCharacterCount();
65
- }
66
- }
67
- get size() {
68
- return this.getAttribute('size') || 'm';
69
- }
70
- set size(value) {
71
- this.setAttribute('size', value);
72
- }
73
- connectedCallback() {
74
- if (!this.built) {
75
- this.build();
76
- }
77
- this.syncState();
78
- }
79
- attributeChangedCallback(name) {
80
- if (!this.built)
81
- return;
82
- if (name === 'value' && this.field) {
83
- const next = this.getAttribute('value') || '';
84
- if (this.field.value !== next) {
85
- this.field.value = next;
86
- }
87
- this.updateCharacterCount();
88
- return;
89
- }
90
- this.syncState();
91
- }
92
- focus() {
93
- this.field?.focus();
94
- }
95
- get showCharacterCount() {
96
- return this.hasAttribute('show-character-count');
97
- }
98
- get characterCountPosition() {
99
- return this.getAttribute('character-count-position') || 'bottom';
100
- }
101
- build() {
102
- const id = this.getAttribute('id') || `db-textarea-${Math.random().toString(36).slice(2)}`;
103
- if (!this.hasAttribute('id'))
104
- this.setAttribute('id', id);
105
- this.labelEl = document.createElement('label');
106
- this.labelEl.className = 'designbase-wc-textarea__label';
107
- this.labelEl.htmlFor = id;
108
- this.countTop = document.createElement('div');
109
- this.countTop.className = 'designbase-wc-textarea__character-count designbase-wc-textarea__character-count--top';
110
- this.countTop.hidden = true;
111
- const wrapper = document.createElement('div');
112
- wrapper.className = 'designbase-wc-textarea__wrapper';
113
- this.field = document.createElement('textarea');
114
- this.field.id = id;
115
- this.field.className = 'designbase-wc-textarea__field';
116
- this.field.addEventListener('input', this.handleInput);
117
- this.field.addEventListener('change', this.handleChange);
118
- wrapper.appendChild(this.field);
119
- this.footerEl = document.createElement('div');
120
- this.footerEl.className = 'designbase-wc-textarea__footer';
121
- this.errorEl = document.createElement('div');
122
- this.errorEl.className = 'designbase-wc-textarea__error-message';
123
- this.errorEl.setAttribute('role', 'alert');
124
- this.helperEl = document.createElement('div');
125
- this.helperEl.className = 'designbase-wc-textarea__helper-text';
126
- this.countBottom = document.createElement('div');
127
- this.countBottom.className = 'designbase-wc-textarea__character-count designbase-wc-textarea__character-count--bottom';
128
- this.countBottom.hidden = true;
129
- this.footerEl.append(this.errorEl, this.helperEl, this.countBottom);
130
- this.append(this.labelEl, this.countTop, wrapper, this.footerEl);
131
- this.built = true;
132
- }
133
- syncState() {
134
- if (!this.field)
135
- return;
136
- const size = SIZES.includes(this.size) ? this.size : 'm';
137
- const label = this.getAttribute('label') || '';
138
- const helperText = this.getAttribute('helper-text') || '';
139
- const errorMessage = this.getAttribute('error-message') || '';
140
- const hasError = this.hasAttribute('error');
141
- const value = this.getAttribute('value') ?? this.getAttribute('default-value') ?? '';
142
- this.className = [
143
- 'designbase-wc-textarea',
144
- `designbase-wc-textarea--${size}`,
145
- hasError && 'designbase-wc-textarea--error',
146
- this.hasAttribute('disabled') && 'designbase-wc-textarea--disabled',
147
- this.hasAttribute('readonly') && 'designbase-wc-textarea--readonly',
148
- this.hasAttribute('full-width') && 'designbase-wc-textarea--full-width',
149
- this.hasAttribute('resizable') ? '' : 'designbase-wc-textarea--not-resizable',
150
- ].filter(Boolean).join(' ');
151
- if (this.labelEl) {
152
- const requiredMark = this.hasAttribute('required') ? '<span aria-hidden="true"> *</span>' : '';
153
- this.labelEl.innerHTML = label ? `${this.escape(label)}${requiredMark}` : '';
154
- this.labelEl.hidden = !label;
155
- }
156
- this.field.placeholder = this.getAttribute('placeholder') || '';
157
- this.field.name = this.getAttribute('name') || '';
158
- if (this.field.value !== value) {
159
- this.field.value = value;
160
- }
161
- this.field.rows = Number(this.getAttribute('rows') || 4);
162
- this.field.disabled = this.hasAttribute('disabled');
163
- this.field.readOnly = this.hasAttribute('readonly');
164
- this.field.required = this.hasAttribute('required');
165
- this.field.setAttribute('aria-invalid', String(hasError));
166
- const maxLength = this.getAttribute('max-length');
167
- if (maxLength)
168
- this.field.maxLength = Number(maxLength);
169
- else
170
- this.field.removeAttribute('maxLength');
171
- const helperId = `${this.getAttribute('id')}-helper`;
172
- const errorId = `${this.getAttribute('id')}-error`;
173
- if (hasError && errorMessage) {
174
- this.errorEl.id = errorId;
175
- this.errorEl.textContent = errorMessage;
176
- this.errorEl.hidden = false;
177
- this.helperEl.hidden = true;
178
- this.field.setAttribute('aria-describedby', errorId);
179
- }
180
- else if (helperText) {
181
- this.helperEl.id = helperId;
182
- this.helperEl.textContent = helperText;
183
- this.helperEl.hidden = false;
184
- this.errorEl.hidden = true;
185
- this.field.setAttribute('aria-describedby', helperId);
186
- }
187
- else {
188
- this.helperEl.hidden = true;
189
- this.errorEl.hidden = true;
190
- this.field.removeAttribute('aria-describedby');
191
- }
192
- this.updateCharacterCount();
193
- }
194
- updateCharacterCount() {
195
- if (!this.field || !this.countTop || !this.countBottom)
196
- return;
197
- const currentLength = this.field.value.length;
198
- const maxLength = this.getAttribute('max-length');
199
- const isOverLimit = Boolean(maxLength && currentLength > Number(maxLength));
200
- const countText = `${currentLength}${maxLength ? ` / ${maxLength}` : ''}`;
201
- const renderCount = (host) => {
202
- host.innerHTML = `<span class="designbase-wc-textarea__character-count-text${isOverLimit ? ' designbase-wc-textarea__character-count-text--error' : ''}">${countText}</span>`;
203
- };
204
- if (this.showCharacterCount && this.characterCountPosition === 'top') {
205
- renderCount(this.countTop);
206
- this.countTop.hidden = false;
207
- this.countBottom.hidden = true;
208
- }
209
- else if (this.showCharacterCount) {
210
- renderCount(this.countBottom);
211
- this.countBottom.hidden = false;
212
- this.countTop.hidden = true;
213
- }
214
- else {
215
- this.countTop.hidden = true;
216
- this.countBottom.hidden = true;
217
- }
218
- }
219
- escape(value) {
220
- return value.replace(/[&<>"']/g, (char) => ({
221
- '&': '&amp;',
222
- '<': '&lt;',
223
- '>': '&gt;',
224
- '"': '&quot;',
225
- "'": '&#39;',
226
- }[char] || char));
227
- }
228
- }
229
- if (!customElements.get('db-textarea')) {
230
- customElements.define('db-textarea', DbTextarea);
231
- }
232
-
233
- export { DbTextarea };
1
+ const t=["s","m","l"];class DbTextarea extends HTMLElement{constructor(){super(...arguments),this.built=!1,this.handleInput=t=>{t.stopPropagation(),this.field&&(this.updateCharacterCount(),this.dispatchEvent(new InputEvent("input",{bubbles:!0,composed:!0})),this.dispatchEvent(new CustomEvent("db-input",{detail:{value:this.field.value,nativeEvent:t},bubbles:!0,composed:!0})))},this.handleChange=t=>{if(t.stopPropagation(),!this.field)return;const e=this.field.value;this.getAttribute("value")!==e&&this.setAttribute("value",e),this.updateCharacterCount(),this.dispatchEvent(new Event("change",{bubbles:!0})),this.dispatchEvent(new CustomEvent("db-change",{detail:{value:e,nativeEvent:t},bubbles:!0,composed:!0}))}}static get observedAttributes(){return["label","placeholder","value","default-value","name","size","rows","max-length","show-character-count","character-count-position","disabled","readonly","required","error","error-message","helper-text","full-width","resizable"]}get value(){return this.field?.value??this.getAttribute("value")??""}set value(t){this.setAttribute("value",t),this.field&&(this.field.value=t,this.updateCharacterCount())}get size(){return this.getAttribute("size")||"m"}set size(t){this.setAttribute("size",t)}connectedCallback(){this.built||this.build(),this.syncState()}attributeChangedCallback(t){if(this.built){if("value"===t&&this.field){const t=this.getAttribute("value")||"";return this.field.value!==t&&(this.field.value=t),void this.updateCharacterCount()}this.syncState()}}focus(){this.field?.focus()}get showCharacterCount(){return this.hasAttribute("show-character-count")}get characterCountPosition(){return this.getAttribute("character-count-position")||"bottom"}build(){const t=this.getAttribute("id")||`db-textarea-${Math.random().toString(36).slice(2)}`;this.hasAttribute("id")||this.setAttribute("id",t),this.labelEl=document.createElement("label"),this.labelEl.className="designbase-wc-textarea__label",this.labelEl.htmlFor=t,this.countTop=document.createElement("div"),this.countTop.className="designbase-wc-textarea__character-count designbase-wc-textarea__character-count--top",this.countTop.hidden=!0;const e=document.createElement("div");e.className="designbase-wc-textarea__wrapper",this.field=document.createElement("textarea"),this.field.id=t,this.field.className="designbase-wc-textarea__field",this.field.addEventListener("input",this.handleInput),this.field.addEventListener("change",this.handleChange),e.appendChild(this.field),this.footerEl=document.createElement("div"),this.footerEl.className="designbase-wc-textarea__footer",this.errorEl=document.createElement("div"),this.errorEl.className="designbase-wc-textarea__error-message",this.errorEl.setAttribute("role","alert"),this.helperEl=document.createElement("div"),this.helperEl.className="designbase-wc-textarea__helper-text",this.countBottom=document.createElement("div"),this.countBottom.className="designbase-wc-textarea__character-count designbase-wc-textarea__character-count--bottom",this.countBottom.hidden=!0,this.footerEl.append(this.errorEl,this.helperEl,this.countBottom),this.append(this.labelEl,this.countTop,e,this.footerEl),this.built=!0}syncState(){if(!this.field)return;const e=t.includes(this.size)?this.size:"m",i=this.getAttribute("label")||"",s=this.getAttribute("helper-text")||"",a=this.getAttribute("error-message")||"",r=this.hasAttribute("error"),h=this.getAttribute("value")??this.getAttribute("default-value")??"";if(this.className=["designbase-wc-textarea",`designbase-wc-textarea--${e}`,r&&"designbase-wc-textarea--error",this.hasAttribute("disabled")&&"designbase-wc-textarea--disabled",this.hasAttribute("readonly")&&"designbase-wc-textarea--readonly",this.hasAttribute("full-width")&&"designbase-wc-textarea--full-width",this.hasAttribute("resizable")?"":"designbase-wc-textarea--not-resizable"].filter(Boolean).join(" "),this.labelEl){const t=this.hasAttribute("required")?'<span aria-hidden="true"> *</span>':"";this.labelEl.innerHTML=i?`${this.escape(i)}${t}`:"",this.labelEl.hidden=!i}this.field.placeholder=this.getAttribute("placeholder")||"",this.field.name=this.getAttribute("name")||"",this.field.value!==h&&(this.field.value=h),this.field.rows=Number(this.getAttribute("rows")||4),this.field.disabled=this.hasAttribute("disabled"),this.field.readOnly=this.hasAttribute("readonly"),this.field.required=this.hasAttribute("required"),this.field.setAttribute("aria-invalid",String(r));const l=this.getAttribute("max-length");l?this.field.maxLength=Number(l):this.field.removeAttribute("maxLength");const n=`${this.getAttribute("id")}-helper`,d=`${this.getAttribute("id")}-error`;r&&a?(this.errorEl.id=d,this.errorEl.textContent=a,this.errorEl.hidden=!1,this.helperEl.hidden=!0,this.field.setAttribute("aria-describedby",d)):s?(this.helperEl.id=n,this.helperEl.textContent=s,this.helperEl.hidden=!1,this.errorEl.hidden=!0,this.field.setAttribute("aria-describedby",n)):(this.helperEl.hidden=!0,this.errorEl.hidden=!0,this.field.removeAttribute("aria-describedby")),this.updateCharacterCount()}updateCharacterCount(){if(!this.field||!this.countTop||!this.countBottom)return;const t=this.field.value.length,e=this.getAttribute("max-length"),i=Boolean(e&&t>Number(e)),s=`${t}${e?` / ${e}`:""}`,renderCount=t=>{t.innerHTML=`<span class="designbase-wc-textarea__character-count-text${i?" designbase-wc-textarea__character-count-text--error":""}">${s}</span>`};this.showCharacterCount&&"top"===this.characterCountPosition?(renderCount(this.countTop),this.countTop.hidden=!1,this.countBottom.hidden=!0):this.showCharacterCount?(renderCount(this.countBottom),this.countBottom.hidden=!1,this.countTop.hidden=!0):(this.countTop.hidden=!0,this.countBottom.hidden=!0)}escape(t){return t.replace(/[&<>"']/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[t]||t))}}customElements.get("db-textarea")||customElements.define("db-textarea",DbTextarea);export{DbTextarea};