@iyulab/components 1.3.4 → 1.5.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 (165) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/_virtual/_glob-assets_raw/alert-circle-fill.svg.1e438750.js +4 -0
  3. package/dist/_virtual/_glob-assets_raw/alert-triangle-fill.svg.1a8797c4.js +4 -0
  4. package/dist/_virtual/_glob-assets_raw/bell-fill.svg.d37c41d9.js +1 -1
  5. package/dist/_virtual/_glob-assets_raw/check.svg.4690b01e.js +4 -0
  6. package/dist/_virtual/_glob-assets_raw/chevron-down.svg.0ccd06ea.js +1 -1
  7. package/dist/_virtual/_glob-assets_raw/chevron-left.svg.b4601050.js +1 -1
  8. package/dist/_virtual/_glob-assets_raw/chevron-right.svg.0711bb67.js +1 -1
  9. package/dist/_virtual/_glob-assets_raw/chevron-up.svg.ed917211.js +1 -1
  10. package/dist/_virtual/_glob-assets_raw/circle-check-fill.svg.3f0fcb72.js +4 -0
  11. package/dist/_virtual/_glob-assets_raw/copy.svg.6192f853.js +4 -0
  12. package/dist/_virtual/_glob-assets_raw/dark.css.e8ac080d.js +1 -1
  13. package/dist/_virtual/_glob-assets_raw/eye-off.svg.7aa25df0.js +4 -0
  14. package/dist/_virtual/_glob-assets_raw/eye.svg.2e5e9c4c.js +1 -1
  15. package/dist/_virtual/_glob-assets_raw/info-circle-fill.svg.6580071d.js +1 -1
  16. package/dist/_virtual/_glob-assets_raw/minus.svg.4610de75.js +4 -0
  17. package/dist/_virtual/_glob-assets_raw/plus.svg.d83ead68.js +4 -0
  18. package/dist/_virtual/_glob-assets_raw/search.svg.0ba2012d.js +1 -1
  19. package/dist/_virtual/_glob-assets_raw/star-fill.svg.f24b5a2d.js +1 -1
  20. package/dist/_virtual/_glob-assets_raw/star.svg.4af61468.js +1 -1
  21. package/dist/_virtual/_glob-assets_raw/x.svg.5596f6bb.js +4 -0
  22. package/dist/assets/locales/ar.json.js +23 -0
  23. package/dist/assets/locales/de.json.js +23 -0
  24. package/dist/assets/locales/en.json.js +23 -0
  25. package/dist/assets/locales/es.json.js +23 -0
  26. package/dist/assets/locales/fr.json.js +23 -0
  27. package/dist/assets/locales/id.json.js +23 -0
  28. package/dist/assets/locales/ja.json.js +23 -0
  29. package/dist/assets/locales/ko.json.js +23 -0
  30. package/dist/assets/locales/pt-BR.json.js +23 -0
  31. package/dist/assets/locales/ru.json.js +23 -0
  32. package/dist/assets/locales/th.json.js +23 -0
  33. package/dist/assets/locales/vi.json.js +23 -0
  34. package/dist/assets/locales/zh-CN.json.js +23 -0
  35. package/dist/assets/locales/zh-TW.json.js +23 -0
  36. package/dist/components/UFloatingElement.js +13 -4
  37. package/dist/components/UFormControlElement.d.ts +38 -8
  38. package/dist/components/UFormControlElement.js +61 -6
  39. package/dist/components/UOverlayElement.d.ts +4 -0
  40. package/dist/components/UOverlayElement.js +14 -4
  41. package/dist/components/alert/UAlert.js +14 -8
  42. package/dist/components/alert/UAlert.styles.js +0 -6
  43. package/dist/components/avatar/UAvatar.js +1 -1
  44. package/dist/components/badge/UBadge.d.ts +1 -1
  45. package/dist/components/badge/UBadge.js +2 -2
  46. package/dist/components/badge/UBadge.styles.js +1 -1
  47. package/dist/components/breadcrumb/UBreadcrumb.js +1 -1
  48. package/dist/components/breadcrumb-item/UBreadcrumbItem.js +1 -1
  49. package/dist/components/button/UButton.d.ts +6 -11
  50. package/dist/components/button/UButton.js +1 -1
  51. package/dist/components/button/UButton.styles.js +50 -51
  52. package/dist/components/button-group/UButtonGroup.js +1 -1
  53. package/dist/components/card/UCard.js +1 -1
  54. package/dist/components/carousel/UCarousel.js +2 -2
  55. package/dist/components/checkbox/UCheckbox.d.ts +4 -1
  56. package/dist/components/checkbox/UCheckbox.js +12 -9
  57. package/dist/components/checkbox/UCheckbox.styles.js +12 -7
  58. package/dist/components/chip/UChip.js +8 -5
  59. package/dist/components/copy-button/UCopyButton.d.ts +47 -0
  60. package/dist/components/copy-button/UCopyButton.js +94 -0
  61. package/dist/components/copy-button/UCopyButton.styles.js +21 -0
  62. package/dist/components/dialog/UDialog.js +3 -3
  63. package/dist/components/divider/UDivider.js +1 -1
  64. package/dist/components/drawer/UDrawer.js +3 -3
  65. package/dist/components/drawer/UDrawer.styles.js +0 -6
  66. package/dist/components/field/UField.js +1 -1
  67. package/dist/components/form/UForm.js +1 -1
  68. package/dist/components/icon/UIcon.js +1 -1
  69. package/dist/components/icon-button/UIconButton.d.ts +0 -1
  70. package/dist/components/icon-button/UIconButton.js +2 -7
  71. package/dist/components/icon-button/UIconButton.styles.js +2 -2
  72. package/dist/components/input/UInput.d.ts +2 -3
  73. package/dist/components/input/UInput.js +39 -11
  74. package/dist/components/input/UInput.styles.js +1 -4
  75. package/dist/components/menu/UMenu.js +1 -1
  76. package/dist/components/menu-item/UMenuItem.js +2 -2
  77. package/dist/components/menu-item/UMenuItem.styles.js +4 -3
  78. package/dist/components/option/UOption.d.ts +4 -1
  79. package/dist/components/option/UOption.js +11 -5
  80. package/dist/components/option/UOption.styles.js +5 -4
  81. package/dist/components/panel/UPanel.js +1 -1
  82. package/dist/components/popover/UPopover.js +1 -1
  83. package/dist/components/progress-bar/UProgressBar.js +1 -1
  84. package/dist/components/progress-bar/UProgressBar.styles.js +2 -2
  85. package/dist/components/progress-ring/UProgressRing.js +1 -1
  86. package/dist/components/progress-ring/UProgressRing.styles.js +2 -2
  87. package/dist/components/radio/URadio.d.ts +1 -1
  88. package/dist/components/radio/URadio.js +5 -6
  89. package/dist/components/radio/URadio.styles.js +21 -16
  90. package/dist/components/rating/URating.d.ts +3 -2
  91. package/dist/components/rating/URating.js +30 -37
  92. package/dist/components/select/USelect.d.ts +8 -5
  93. package/dist/components/select/USelect.js +30 -42
  94. package/dist/components/select/USelect.styles.js +5 -5
  95. package/dist/components/skeleton/USkeleton.js +1 -1
  96. package/dist/components/slider/USlider.d.ts +3 -2
  97. package/dist/components/slider/USlider.js +20 -30
  98. package/dist/components/slider/USlider.styles.js +2 -2
  99. package/dist/components/spinner/USpinner.js +1 -1
  100. package/dist/components/spinner/USpinner.styles.js +1 -1
  101. package/dist/components/split-panel/USplitPanel.js +25 -13
  102. package/dist/components/switch/USwitch.d.ts +4 -1
  103. package/dist/components/switch/USwitch.js +11 -8
  104. package/dist/components/switch/USwitch.styles.js +5 -1
  105. package/dist/components/tab/UTab.js +7 -4
  106. package/dist/components/tab-panel/UTabPanel.d.ts +5 -0
  107. package/dist/components/tab-panel/UTabPanel.js +12 -4
  108. package/dist/components/tab-panel/UTabPanel.styles.js +7 -3
  109. package/dist/components/tag/UTag.js +1 -1
  110. package/dist/components/tag/UTag.styles.js +14 -13
  111. package/dist/components/textarea/UTextarea.d.ts +1 -1
  112. package/dist/components/textarea/UTextarea.js +17 -6
  113. package/dist/components/tooltip/UTooltip.js +1 -1
  114. package/dist/components/tree/UTree.js +1 -1
  115. package/dist/components/tree-item/UTreeItem.js +11 -5
  116. package/dist/components/tree-item/UTreeItem.styles.js +5 -4
  117. package/dist/index.d.ts +3 -4
  118. package/dist/index.js +7 -8
  119. package/dist/react/UCopyButton.d.ts +10 -0
  120. package/dist/react/UCopyButton.js +12 -0
  121. package/dist/react/UTabPanel.d.ts +1 -0
  122. package/dist/react/UTabPanel.js +3 -1
  123. package/dist/react/index.d.ts +1 -0
  124. package/dist/react/index.js +1 -0
  125. package/dist/styles/dark.css +99 -99
  126. package/dist/utilities/Locale.d.ts +38 -0
  127. package/dist/utilities/Locale.js +93 -0
  128. package/dist/utilities/Toast.d.ts +9 -0
  129. package/dist/utilities/Toast.js +15 -7
  130. package/dist/utilities/elements.d.ts +0 -23
  131. package/dist/utilities/elements.js +1 -34
  132. package/dist/utilities/icons.d.ts +1 -1
  133. package/dist/utilities/icons.js +22 -25
  134. package/package.json +2 -3
  135. package/skills/iyulab-components/SKILL.md +2 -3
  136. package/skills/iyulab-components/references/components/input.md +1 -2
  137. package/skills/iyulab-components/references/components/option.md +1 -0
  138. package/skills/iyulab-components/references/components/select.md +1 -2
  139. package/skills/iyulab-components/references/components/tab-panel.md +6 -0
  140. package/skills/iyulab-components/references/extensions/form-control.md +22 -6
  141. package/skills/iyulab-components/references/usage.md +11 -0
  142. package/skills/iyulab-components/references/utilities/elements.md +1 -17
  143. package/skills/iyulab-components/references/utilities/locale.md +36 -0
  144. package/skills/iyulab-components/references/utilities/theme.md +12 -0
  145. package/skills/iyulab-components/references/utilities/toast.md +6 -0
  146. package/dist/_virtual/_glob-assets_raw/check-circle-fill.svg.51c33a2a.js +0 -4
  147. package/dist/_virtual/_glob-assets_raw/check-lg.svg.371c5e78.js +0 -4
  148. package/dist/_virtual/_glob-assets_raw/dash-lg.svg.b40b8b3a.js +0 -4
  149. package/dist/_virtual/_glob-assets_raw/exclamation-circle-fill.svg.dc8c523e.js +0 -4
  150. package/dist/_virtual/_glob-assets_raw/exclamation-triangle-fill.svg.7949d2c7.js +0 -4
  151. package/dist/_virtual/_glob-assets_raw/eye-slash.svg.240afafa.js +0 -4
  152. package/dist/_virtual/_glob-assets_raw/plus-lg.svg.294e9073.js +0 -4
  153. package/dist/_virtual/_glob-assets_raw/three-dots-vertical.svg.9fee78c5.js +0 -4
  154. package/dist/_virtual/_glob-assets_raw/three-dots.svg.6a7a5b23.js +0 -4
  155. package/dist/_virtual/_glob-assets_raw/x-lg.svg.f34b882c.js +0 -4
  156. package/dist/components/UDataElement.d.ts +0 -44
  157. package/dist/components/UDataElement.js +0 -101
  158. package/dist/components/UDataElement.styles.js +0 -95
  159. package/dist/core/locale.d.ts +0 -69
  160. package/dist/core/locale.js +0 -85
  161. package/dist/utilities/sanitizers.d.ts +0 -35
  162. package/dist/utilities/sanitizers.js +0 -75
  163. package/skills/iyulab-components/references/extensions/data.md +0 -60
  164. package/skills/iyulab-components/references/utilities/sanitizers.md +0 -32
  165. /package/dist/components/{UDataElement.styles.d.ts → copy-button/UCopyButton.styles.d.ts} +0 -0
@@ -1,14 +1,15 @@
1
1
  import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorateMetadata.js";
2
2
  import __decorate from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorate.js";
3
3
  import { UFormControlElement } from "../UFormControlElement.js";
4
- import "../icon/UIcon.js";
5
4
  import "../spinner/USpinner.js";
5
+ import "../icon/UIcon.js";
6
+ import { Locale } from "../../utilities/Locale.js";
6
7
  import "../field/UField.js";
7
8
  import { UOption } from "../option/UOption.js";
8
9
  import { UPopover } from "../popover/UPopover.js";
9
10
  import { styles } from "./UInput.styles.js";
10
- import { customElement, property, query, state } from "lit/decorators.js";
11
11
  import { html } from "lit";
12
+ import { customElement, property, query, state } from "lit/decorators.js";
12
13
  import { ifDefined } from "lit/directives/if-defined.js";
13
14
  import { live } from "lit/directives/live.js";
14
15
  //#region src/components/input/UInput.ts
@@ -53,7 +54,6 @@ var UInput = class UInput extends UFormControlElement {
53
54
  this.handleInputBlur = (_) => {
54
55
  this.value = this.inputEl?.value || "";
55
56
  this.internals?.setFormValue(this.value);
56
- this.internals?.setValidity(this.inputEl?.validity, this.validationMessage || this.inputEl?.validationMessage, this.containerEl);
57
57
  if (!this.novalidate) this.validate();
58
58
  this.dispatchEvent(new Event("change", {
59
59
  bubbles: true,
@@ -119,11 +119,9 @@ var UInput = class UInput extends UFormControlElement {
119
119
  }
120
120
  };
121
121
  this.handlePopoverShow = (e) => {
122
- e.stopPropagation();
123
122
  if (this.options.length === 0) e.preventDefault();
124
123
  };
125
124
  this.handlePopoverHide = (e) => {
126
- e.stopPropagation();
127
125
  if (this.options.length === 0) e.preventDefault();
128
126
  };
129
127
  }
@@ -184,13 +182,13 @@ var UInput = class UInput extends UFormControlElement {
184
182
  <u-icon class="suffix-item"
185
183
  ?hidden=${this.type !== "password" || this.disabled || this.readonly}
186
184
  lib="internal"
187
- name=${this.showPassword ? "eye-slash" : "eye"}
185
+ name=${this.showPassword ? "eye-off" : "eye"}
188
186
  @click=${this.handlePasswordTogglerClick}
189
187
  ></u-icon>
190
188
  <u-icon class="suffix-item"
191
189
  ?hidden=${!this.clearable || this.disabled || this.readonly || !this.value}
192
190
  lib="internal"
193
- name="x-lg"
191
+ name="x"
194
192
  @click=${this.handleClearButtonClick}
195
193
  ></u-icon>
196
194
  </div>
@@ -201,6 +199,7 @@ var UInput = class UInput extends UFormControlElement {
201
199
  scrollable
202
200
  for=".container"
203
201
  trigger="focus"
202
+ strategy="fixed"
204
203
  placement="bottom-start"
205
204
  offset="1"
206
205
  @show=${this.handlePopoverShow}
@@ -210,10 +209,39 @@ var UInput = class UInput extends UFormControlElement {
210
209
  </u-popover>
211
210
  `;
212
211
  }
213
- validate() {
214
- if (this.internals) this.invalid = !this.internals.checkValidity();
215
- else this.invalid = !this.inputEl?.checkValidity();
216
- return !this.invalid;
212
+ setValidity() {
213
+ const v = this.inputEl?.validity;
214
+ let flags = {};
215
+ let message = "";
216
+ if (v?.valueMissing) {
217
+ flags = { valueMissing: true };
218
+ message = Locale.getValue("valueMissing");
219
+ } else if (v?.badInput) {
220
+ flags = { badInput: true };
221
+ message = Locale.getValue("badInput");
222
+ } else if (v?.typeMismatch) {
223
+ flags = { typeMismatch: true };
224
+ message = Locale.getValue("typeMismatch");
225
+ } else if (v?.patternMismatch) {
226
+ flags = { patternMismatch: true };
227
+ message = Locale.getValue("patternMismatch", { pattern: this.pattern ?? "" });
228
+ } else if (v?.tooShort) {
229
+ flags = { tooShort: true };
230
+ message = Locale.getValue("tooShort", { min: this.minlength ?? 0 });
231
+ } else if (v?.tooLong) {
232
+ flags = { tooLong: true };
233
+ message = Locale.getValue("tooLong", { max: this.maxlength ?? 0 });
234
+ } else if (v?.rangeUnderflow) {
235
+ flags = { rangeUnderflow: true };
236
+ message = Locale.getValue("rangeUnderflow", { min: this.min ?? "" });
237
+ } else if (v?.rangeOverflow) {
238
+ flags = { rangeOverflow: true };
239
+ message = Locale.getValue("rangeOverflow", { max: this.max ?? "" });
240
+ } else if (v?.stepMismatch) {
241
+ flags = { stepMismatch: true };
242
+ message = Locale.getValue("stepMismatch", { step: this.step ?? 1 });
243
+ }
244
+ this.commit(flags, message, this.containerEl ?? void 0);
217
245
  }
218
246
  reset() {
219
247
  this.value = "";
@@ -2,8 +2,6 @@ import { css } from "lit";
2
2
  //#region src/components/input/UInput.styles.ts
3
3
  var styles = css`
4
4
  :host {
5
- --input-popover-min-width: 100%;
6
- --input-popover-max-width: 80vw;
7
5
  --input-popover-min-height: 0px;
8
6
  --input-popover-max-height: 50vh;
9
7
  }
@@ -167,8 +165,7 @@ var styles = css`
167
165
  }
168
166
 
169
167
  u-popover {
170
- min-width: var(--input-popover-min-width);
171
- max-width: var(--input-popover-max-width);
168
+ width: var(--input-popover-width, var(--anchor-width, 100%));
172
169
  min-height: var(--input-popover-min-height);
173
170
  max-height: var(--input-popover-max-height);
174
171
  padding: 4px;
@@ -3,8 +3,8 @@ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.138.0/hel
3
3
  import __decorate from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorate.js";
4
4
  import { UMenuItem } from "../menu-item/UMenuItem.js";
5
5
  import { styles } from "./UMenu.styles.js";
6
- import { customElement, property } from "lit/decorators.js";
7
6
  import { html } from "lit";
7
+ import { customElement, property } from "lit/decorators.js";
8
8
  //#region src/components/menu/UMenu.ts
9
9
  var UMenu = class UMenu extends UElement {
10
10
  constructor(..._args) {
@@ -5,8 +5,8 @@ import "../icon/UIcon.js";
5
5
  import { UDivider } from "../divider/UDivider.js";
6
6
  import "../popover/UPopover.js";
7
7
  import { styles } from "./UMenuItem.styles.js";
8
- import { customElement, property, state } from "lit/decorators.js";
9
8
  import { html } from "lit";
9
+ import { customElement, property, state } from "lit/decorators.js";
10
10
  import { live } from "lit/directives/live.js";
11
11
  //#region src/components/menu-item/UMenuItem.ts
12
12
  var _UMenuItem;
@@ -86,7 +86,7 @@ var UMenuItem = class UMenuItem extends UElement {
86
86
  <u-icon class="prefix-checker"
87
87
  ?hidden=${this.indicator !== "check" || !this.selected}
88
88
  lib="internal"
89
- name="check-lg"
89
+ name="check"
90
90
  ></u-icon>
91
91
 
92
92
  <slot name="prefix"></slot>
@@ -3,6 +3,7 @@ import { css } from "lit";
3
3
  var styles = css`
4
4
  :host {
5
5
  --menu-item-depth: 0;
6
+ --menu-item-color: var(--u-primary-color, var(--u-blue-600));
6
7
  }
7
8
 
8
9
  :host {
@@ -49,12 +50,12 @@ var styles = css`
49
50
  /* indicator: highlight */
50
51
  :host([selected][indicator="highlight"]) .header {
51
52
  font-weight: 600;
52
- color: var(--u-blue-700);
53
- background-color: var(--u-blue-100);
53
+ color: color-mix(in srgb, var(--menu-item-color) 85%, black);
54
+ background-color: color-mix(in srgb, var(--menu-item-color) 15%, var(--u-bg-color));
54
55
  }
55
56
  :host([selected][indicator="highlight"]) .header:hover,
56
57
  :host([selected][indicator="highlight"]:focus-visible) .header {
57
- background-color: var(--u-blue-200);
58
+ background-color: color-mix(in srgb, var(--menu-item-color) 25%, var(--u-bg-color));
58
59
  }
59
60
 
60
61
  .prefix-checker {
@@ -32,8 +32,11 @@ export declare class UOption extends UElement {
32
32
  value: string;
33
33
  connectedCallback(): void;
34
34
  render(): import('lit-html').TemplateResult<1>;
35
- getText(): string;
36
35
  private renderMarker;
36
+ /** 라벨(기본 slot)의 텍스트 노드만 추출한다 — 엘리먼트 자식(예: 설명용 `<p>`)은 제외. */
37
+ getText(): string;
38
+ /** 라벨(기본 slot) 노드를 clone해서 반환한다 — 원본은 옵션 목록에 계속 slot돼 있어야 하므로. */
39
+ getContent(): Node[];
37
40
  }
38
41
  declare global {
39
42
  interface HTMLElementTagNameMap {
@@ -3,8 +3,8 @@ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.138.0/hel
3
3
  import __decorate from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorate.js";
4
4
  import "../icon/UIcon.js";
5
5
  import { styles } from "./UOption.styles.js";
6
- import { customElement, property } from "lit/decorators.js";
7
6
  import { html, nothing } from "lit";
7
+ import { customElement, property } from "lit/decorators.js";
8
8
  //#region src/components/option/UOption.ts
9
9
  var UOption = class UOption extends UElement {
10
10
  constructor(..._args) {
@@ -31,20 +31,26 @@ var UOption = class UOption extends UElement {
31
31
  <slot name="suffix"></slot>
32
32
  `;
33
33
  }
34
- getText() {
35
- return this.renderRoot.querySelector("slot:not([name])")?.assignedNodes({ flatten: true }).map((n) => n.textContent?.trim()).filter(Boolean).join("") || this.value;
36
- }
37
34
  renderMarker() {
38
35
  if (this.marker === "radio") return html`<span class="radio-marker" part="radio-marker"></span>`;
39
36
  if (this.marker === "check") return html`
40
37
  <u-icon class="check-marker" part="check-marker"
41
38
  ?hidden=${!this.selected}
42
39
  lib="internal"
43
- name="check-lg"
40
+ name="check"
44
41
  ></u-icon>
45
42
  `;
46
43
  return nothing;
47
44
  }
45
+ /** 라벨(기본 slot)의 텍스트 노드만 추출한다 — 엘리먼트 자식(예: 설명용 `<p>`)은 제외. */
46
+ getText() {
47
+ return this.renderRoot.querySelector("slot:not([name])")?.assignedNodes({ flatten: true }).filter((n) => n.nodeType === Node.TEXT_NODE).map((n) => n.textContent ?? "").join("").replace(/\s+/g, " ").trim() || this.value;
48
+ }
49
+ /** 라벨(기본 slot) 노드를 clone해서 반환한다 — 원본은 옵션 목록에 계속 slot돼 있어야 하므로. */
50
+ getContent() {
51
+ const nodes = this.renderRoot.querySelector("slot:not([name])")?.assignedNodes({ flatten: true }).map((n) => n.cloneNode(true)) ?? [];
52
+ return nodes.length > 0 ? nodes : [document.createTextNode(this.value)];
53
+ }
48
54
  };
49
55
  __decorate([property({
50
56
  type: Boolean,
@@ -2,17 +2,18 @@ import { css } from "lit";
2
2
  //#region src/components/option/UOption.styles.ts
3
3
  var styles = css`
4
4
  :host {
5
+ --option-color: var(--u-primary-color, var(--u-blue-600));
5
6
  --option-color-interactive: inherit;
6
7
  --option-border-color-interactive: var(--u-border-color-hover);
7
8
  --option-background-color-interactive: var(--u-bg-color-hover);
8
9
 
9
10
  --option-color-active: inherit;
10
- --option-border-color-active: var(--u-blue-600);
11
- --option-background-color-active: var(--u-blue-100);
11
+ --option-border-color-active: var(--option-color);
12
+ --option-background-color-active: color-mix(in srgb, var(--option-color) 15%, var(--u-bg-color));
12
13
 
13
14
  --option-color-active-interactive: inherit;
14
- --option-border-color-active-interactive: var(--u-blue-600);
15
- --option-background-color-active-interactive: var(--u-blue-200);
15
+ --option-border-color-active-interactive: var(--option-color);
16
+ --option-background-color-active-interactive: color-mix(in srgb, var(--option-color) 25%, var(--u-bg-color));
16
17
  }
17
18
 
18
19
  :host {
@@ -2,8 +2,8 @@ import { UElement } from "../UElement.js";
2
2
  import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorateMetadata.js";
3
3
  import __decorate from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorate.js";
4
4
  import { styles } from "./UPanel.styles.js";
5
- import { customElement, property } from "lit/decorators.js";
6
5
  import { html } from "lit";
6
+ import { customElement, property } from "lit/decorators.js";
7
7
  //#region src/components/panel/UPanel.ts
8
8
  var UPanel = class UPanel extends UElement {
9
9
  constructor(..._args) {
@@ -3,8 +3,8 @@ import __decorate from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm
3
3
  import { UFloatingElement } from "../UFloatingElement.js";
4
4
  import { arrayAttrConverter } from "../../utilities/converters.js";
5
5
  import { styles } from "./UPopover.styles.js";
6
- import { customElement, property } from "lit/decorators.js";
7
6
  import { html } from "lit";
7
+ import { customElement, property } from "lit/decorators.js";
8
8
  //#region src/components/popover/UPopover.ts
9
9
  var _UPopover;
10
10
  var UPopover = class UPopover extends UFloatingElement {
@@ -2,8 +2,8 @@ import { UElement } from "../UElement.js";
2
2
  import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorateMetadata.js";
3
3
  import __decorate from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorate.js";
4
4
  import { styles } from "./UProgressBar.styles.js";
5
- import { customElement, property, state } from "lit/decorators.js";
6
5
  import { html } from "lit";
6
+ import { customElement, property, state } from "lit/decorators.js";
7
7
  //#region src/components/progress-bar/UProgressBar.ts
8
8
  var UProgressBar = class UProgressBar extends UElement {
9
9
  constructor(..._args) {
@@ -3,8 +3,8 @@ import { css } from "lit";
3
3
  var styles = css`
4
4
  :host {
5
5
  --progress-bar-height: 0.5em;
6
- --progress-bar-color: var(--u-blue-600);
7
- --progress-bar-buffer-color: var(--u-blue-200);
6
+ --progress-bar-color: var(--u-primary-color, var(--u-blue-600));
7
+ --progress-bar-buffer-color: color-mix(in srgb, var(--progress-bar-color) 35%, var(--u-bg-color));
8
8
  --progress-bar-track-color: var(--u-neutral-200);
9
9
  }
10
10
 
@@ -2,8 +2,8 @@ import { UElement } from "../UElement.js";
2
2
  import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorateMetadata.js";
3
3
  import __decorate from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorate.js";
4
4
  import { styles } from "./UProgressRing.styles.js";
5
- import { customElement, property, state } from "lit/decorators.js";
6
5
  import { html } from "lit";
6
+ import { customElement, property, state } from "lit/decorators.js";
7
7
  //#region src/components/progress-ring/UProgressRing.ts
8
8
  var PATH_LENGTH = 100;
9
9
  var RADIUS = 44;
@@ -3,10 +3,10 @@ import { css } from "lit";
3
3
  var styles = css`
4
4
  :host {
5
5
  --progress-ring-size: 6em;
6
- --progress-ring-color: var(--u-blue-600);
6
+ --progress-ring-color: var(--u-primary-color, var(--u-blue-600));
7
7
  --progress-ring-track-width: 6;
8
8
  --progress-ring-track-color: var(--u-neutral-200);
9
- --progress-ring-buffer-color: var(--u-blue-200);
9
+ --progress-ring-buffer-color: color-mix(in srgb, var(--progress-ring-color) 35%, var(--u-bg-color));
10
10
  }
11
11
 
12
12
  /* === Status Colors === */
@@ -25,7 +25,7 @@ export declare class URadio extends UFormControlElement<string> {
25
25
  disconnectedCallback(): void;
26
26
  protected updated(changedProperties: PropertyValues): void;
27
27
  render(): import('lit-html').TemplateResult<1>;
28
- validate(): boolean;
28
+ protected setValidity(): void;
29
29
  reset(): void;
30
30
  private setup;
31
31
  private cleanup;
@@ -1,11 +1,12 @@
1
1
  import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorateMetadata.js";
2
2
  import __decorate from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorate.js";
3
3
  import { UFormControlElement } from "../UFormControlElement.js";
4
+ import { Locale } from "../../utilities/Locale.js";
4
5
  import "../field/UField.js";
5
6
  import { UOption } from "../option/UOption.js";
6
7
  import { styles } from "./URadio.styles.js";
7
- import { customElement, property, state } from "lit/decorators.js";
8
8
  import { html } from "lit";
9
+ import { customElement, property, state } from "lit/decorators.js";
9
10
  //#region src/components/radio/URadio.ts
10
11
  var URadio = class URadio extends UFormControlElement {
11
12
  constructor(..._args) {
@@ -94,10 +95,9 @@ var URadio = class URadio extends UFormControlElement {
94
95
  </u-field>
95
96
  `;
96
97
  }
97
- validate() {
98
- if (this.internals) this.invalid = !this.internals.checkValidity();
99
- else this.invalid = this.required && !this.value;
100
- return !this.invalid;
98
+ setValidity() {
99
+ const missing = this.required && !this.value;
100
+ this.commit(missing ? { valueMissing: true } : {}, missing ? Locale.getValue("valueMissing") : "", this);
101
101
  }
102
102
  reset() {
103
103
  this.value = void 0;
@@ -125,7 +125,6 @@ var URadio = class URadio extends UFormControlElement {
125
125
  option.selected = option.value === this.value;
126
126
  });
127
127
  this.internals?.setFormValue(this.value || "");
128
- this.internals?.setValidity(this.required && !this.value ? { valueMissing: true } : {}, this.validationMessage || "", this);
129
128
  if (!this.novalidate) this.validate();
130
129
  this.dispatchEvent(new Event("change", {
131
130
  bubbles: true,
@@ -1,6 +1,11 @@
1
1
  import { css } from "lit";
2
2
  //#region src/components/radio/URadio.styles.ts
3
3
  var styles = css`
4
+ :host {
5
+ --radio-color: var(--u-primary-color, var(--u-blue-600));
6
+ --radio-color-active: color-mix(in srgb, var(--radio-color) 85%, black);
7
+ }
8
+
4
9
  :host {
5
10
  display: inline-flex;
6
11
  flex-direction: column;
@@ -44,40 +49,40 @@ var styles = css`
44
49
  /* Default + Filled */
45
50
  :host([type="default"][variant="filled"]) ::slotted(u-option) {
46
51
  --option-color-active: #fff;
47
- --option-border-color-active: var(--u-blue-600);
48
- --option-background-color-active: var(--u-blue-600);
52
+ --option-border-color-active: var(--radio-color);
53
+ --option-background-color-active: var(--radio-color);
49
54
  --option-color-active-interactive: #fff;
50
- --option-border-color-active-interactive: var(--u-blue-700);
51
- --option-background-color-active-interactive: var(--u-blue-700);
55
+ --option-border-color-active-interactive: var(--radio-color-active);
56
+ --option-background-color-active-interactive: var(--radio-color-active);
52
57
  }
53
58
 
54
59
  /* Default + Outlined */
55
60
  :host([type="default"][variant="outlined"]) ::slotted(u-option) {
56
- --option-color-active: var(--u-blue-700);
57
- --option-border-color-active: var(--u-blue-600);
61
+ --option-color-active: var(--radio-color-active);
62
+ --option-border-color-active: var(--radio-color);
58
63
  --option-background-color-active: transparent;
59
- --option-color-active-interactive: var(--u-blue-700);
60
- --option-border-color-active-interactive: var(--u-blue-700);
64
+ --option-color-active-interactive: var(--radio-color-active);
65
+ --option-border-color-active-interactive: var(--radio-color-active);
61
66
  --option-background-color-active-interactive: transparent;
62
67
  }
63
68
 
64
69
  /* Button + Filled */
65
70
  :host([type="button"][variant="filled"]) ::slotted(u-option) {
66
71
  --option-color-active: #fff;
67
- --option-border-color-active: var(--u-blue-600);
68
- --option-background-color-active: var(--u-blue-600);
72
+ --option-border-color-active: var(--radio-color);
73
+ --option-background-color-active: var(--radio-color);
69
74
  --option-color-active-interactive: #fff;
70
- --option-border-color-active-interactive: var(--u-blue-700);
71
- --option-background-color-active-interactive: var(--u-blue-700);
75
+ --option-border-color-active-interactive: var(--radio-color-active);
76
+ --option-background-color-active-interactive: var(--radio-color-active);
72
77
  }
73
78
 
74
79
  /* Button + Outlined */
75
80
  :host([type="button"][variant="outlined"]) ::slotted(u-option) {
76
- --option-color-active: var(--u-blue-700);
77
- --option-border-color-active: var(--u-blue-600);
81
+ --option-color-active: var(--radio-color-active);
82
+ --option-border-color-active: var(--radio-color);
78
83
  --option-background-color-active: transparent;
79
- --option-color-active-interactive: var(--u-blue-700);
80
- --option-border-color-active-interactive: var(--u-blue-700);
84
+ --option-color-active-interactive: var(--radio-color-active);
85
+ --option-border-color-active-interactive: var(--radio-color-active);
81
86
  --option-background-color-active-interactive: transparent;
82
87
  }
83
88
 
@@ -27,13 +27,14 @@ export declare class URating extends UFormControlElement<number> {
27
27
  private buffer;
28
28
  private symbol;
29
29
  private symbolOff;
30
+ protected shouldValidate(changed: PropertyValues): boolean;
30
31
  private get interactive();
31
32
  protected updated(changedProperties: PropertyValues): void;
32
33
  render(): import('lit-html').TemplateResult<1>;
33
- validate(): boolean;
34
+ protected setValidity(): void;
35
+ private isStepMismatch;
34
36
  reset(): void;
35
37
  private onChangeValue;
36
- private getValidity;
37
38
  private handleSlotChange;
38
39
  private handleSymbolPointerMove;
39
40
  private handleSymbolPointerLeave;
@@ -1,12 +1,12 @@
1
- import { formatTemplate, getLocaleStrings, resolveLocale } from "../../core/locale.js";
2
1
  import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorateMetadata.js";
3
2
  import __decorate from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorate.js";
4
3
  import { UFormControlElement } from "../UFormControlElement.js";
5
4
  import "../icon/UIcon.js";
5
+ import { Locale } from "../../utilities/Locale.js";
6
6
  import "../field/UField.js";
7
7
  import { styles } from "./URating.styles.js";
8
- import { customElement, property, state } from "lit/decorators.js";
9
8
  import { html } from "lit";
9
+ import { customElement, property, state } from "lit/decorators.js";
10
10
  //#region src/components/rating/URating.ts
11
11
  var URating = class URating extends UFormControlElement {
12
12
  constructor(..._args) {
@@ -78,6 +78,13 @@ var URating = class URating extends UFormControlElement {
78
78
  static {
79
79
  this.styles = [super.styles, styles];
80
80
  }
81
+ shouldValidate(changed) {
82
+ return super.shouldValidate(changed) || [
83
+ "min",
84
+ "max",
85
+ "precision"
86
+ ].some((k) => changed.has(k));
87
+ }
81
88
  get interactive() {
82
89
  return !this.disabled && !this.readonly;
83
90
  }
@@ -129,13 +136,28 @@ var URating = class URating extends UFormControlElement {
129
136
  </div>
130
137
  `;
131
138
  }
132
- validate() {
133
- if (this.internals) this.invalid = !this.internals.checkValidity();
134
- else {
135
- const { flags } = this.getValidity();
136
- this.invalid = Object.values(flags).some(Boolean);
139
+ setValidity() {
140
+ const v = this.value || 0;
141
+ let flags = {};
142
+ let message = "";
143
+ if (this.required && !v) {
144
+ flags = { valueMissing: true };
145
+ message = Locale.getValue("valueMissing");
146
+ } else if (v && v < this.min) {
147
+ flags = { rangeUnderflow: true };
148
+ message = Locale.getValue("rangeUnderflow", { min: this.min });
149
+ } else if (v && v > this.max) {
150
+ flags = { rangeOverflow: true };
151
+ message = Locale.getValue("rangeOverflow", { max: this.max });
152
+ } else if (v && this.precision < 1 && this.isStepMismatch(v)) {
153
+ flags = { stepMismatch: true };
154
+ message = Locale.getValue("stepMismatch", { step: this.precision });
137
155
  }
138
- return !this.invalid;
156
+ this.commit(flags, message, this.renderRoot.querySelector(".symbols") ?? void 0);
157
+ }
158
+ isStepMismatch(v) {
159
+ const remainder = Math.abs(v % this.precision);
160
+ return remainder > .001 && Math.abs(remainder - this.precision) > .001;
139
161
  }
140
162
  reset() {
141
163
  this.value = 0;
@@ -144,41 +166,12 @@ var URating = class URating extends UFormControlElement {
144
166
  onChangeValue() {
145
167
  this.buffer = -1;
146
168
  this.internals?.setFormValue(this.value?.toString() || "");
147
- const { flags, message } = this.getValidity();
148
- this.internals?.setValidity(flags, this.validationMessage || message, this.renderRoot.querySelector(".symbols") || void 0);
149
169
  if (!this.novalidate) this.validate();
150
170
  this.dispatchEvent(new Event("change", {
151
171
  bubbles: true,
152
172
  composed: true
153
173
  }));
154
174
  }
155
- getValidity() {
156
- const v = this.value || 0;
157
- const s = getLocaleStrings(resolveLocale(this.locale));
158
- if (this.required && !v) return {
159
- flags: { valueMissing: true },
160
- message: s.required
161
- };
162
- if (v && v < this.min) return {
163
- flags: { rangeUnderflow: true },
164
- message: formatTemplate(s.minValue, { min: this.min })
165
- };
166
- if (v && v > this.max) return {
167
- flags: { rangeOverflow: true },
168
- message: formatTemplate(s.maxValue, { max: this.max })
169
- };
170
- if (v && this.precision < 1) {
171
- const remainder = Math.abs(v % this.precision);
172
- if (remainder > .001 && Math.abs(remainder - this.precision) > .001) return {
173
- flags: { stepMismatch: true },
174
- message: formatTemplate(s.stepMismatch, { step: this.precision })
175
- };
176
- }
177
- return {
178
- flags: {},
179
- message: ""
180
- };
181
- }
182
175
  calibrate(e, score) {
183
176
  const rect = e.currentTarget.getBoundingClientRect();
184
177
  const ratio = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));
@@ -7,14 +7,18 @@ export type SelectVariant = 'outlined' | 'filled' | 'underlined' | 'borderless';
7
7
  * 단일 선택 및 다중 선택, 검색 기능을 지원합니다.
8
8
  *
9
9
  * @slot - u-option 아이템
10
+ * @slot display - 트리거에 표시할 콘텐츠를 직접 지정. 비워두면 선택값 텍스트를 자동 생성해 보여준다.
11
+ * (u-option을 그대로 옮겨 꽂을 수는 없다 — 하나의 노드는 slot에 동시에 두 곳 렌더링될 수 없어서
12
+ * 팝오버 목록에서 사라지기 때문. 리치 콘텐츠가 필요하면 이 slot에 별도 마크업을 할당하고
13
+ * `change` 이벤트에서 직접 갱신한다.)
10
14
  *
11
15
  * @csspart field - u-field 요소
12
16
  * @csspart container - 트리거 영역을 감싸는 요소
13
17
  * @csspart popover - 옵션 목록이 표시되는 팝오버 요소
14
18
  * @csspart search-input - 검색 입력 영역
15
19
  *
16
- * @cssprop --select-popover-min-width - 팝오버의 최소 너비 (기본값: 100%)
17
- * @cssprop --select-popover-max-width - 팝오버의 최대 너비 (기본값: 80vw)
20
+ * @cssprop --select-popover-width - 팝오버의 너비 (기본값: 앵커(트리거) 너비, strategy와 무관하게 동일).
21
+ * 옵션 텍스트가 길어도 값을 넘겨 넓어지지 않으며, 넘치는 텍스트는 UOption에서 ellipsis 처리된다.
18
22
  * @cssprop --select-popover-min-height - 팝오버의 최소 높이 (기본값: 0px)
19
23
  * @cssprop --select-popover-max-height - 팝오버의 최대 높이 (기본값: 50vh)
20
24
  *
@@ -41,6 +45,7 @@ export declare class USelect extends UFormControlElement<string | string[]> {
41
45
  containerEl?: HTMLElement;
42
46
  popoverEl?: UPopover;
43
47
  private options;
48
+ protected shouldValidate(changed: PropertyValues): boolean;
44
49
  private get valueAsString();
45
50
  private get valueAsArray();
46
51
  private get hasValue();
@@ -48,12 +53,11 @@ export declare class USelect extends UFormControlElement<string | string[]> {
48
53
  protected updated(changedProperties: PropertyValues): void;
49
54
  render(): import('lit-html').TemplateResult<1>;
50
55
  private renderContent;
51
- validate(): boolean;
56
+ protected setValidity(): void;
52
57
  reset(): void;
53
58
  private setup;
54
59
  private cleanup;
55
60
  private onChangeValue;
56
- private getValidity;
57
61
  private handleSlotChange;
58
62
  private handleOptionClick;
59
63
  private handleOptionKeydown;
@@ -61,7 +65,6 @@ export declare class USelect extends UFormControlElement<string | string[]> {
61
65
  private handleSearchKeydown;
62
66
  private handleClearClick;
63
67
  private handleChipRemove;
64
- private handlePopoverEvent;
65
68
  }
66
69
  declare global {
67
70
  interface HTMLElementTagNameMap {