@iyulab/components 1.28.0 → 1.32.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 (84) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/dist/_virtual/{_@oxc-project_runtime@0.144.0 → _@oxc-project_runtime@0.146.0}/helpers/esm/decorate.js +1 -1
  3. package/dist/_virtual/{_@oxc-project_runtime@0.144.0 → _@oxc-project_runtime@0.146.0}/helpers/esm/decorateMetadata.js +1 -1
  4. package/dist/assets/locales/ar.json.js +12 -2
  5. package/dist/assets/locales/de.json.js +12 -2
  6. package/dist/assets/locales/en.json.js +12 -2
  7. package/dist/assets/locales/es.json.js +12 -2
  8. package/dist/assets/locales/fr.json.js +12 -2
  9. package/dist/assets/locales/id.json.js +12 -2
  10. package/dist/assets/locales/ja.json.js +12 -2
  11. package/dist/assets/locales/ko.json.js +12 -2
  12. package/dist/assets/locales/pt-BR.json.js +12 -2
  13. package/dist/assets/locales/ru.json.js +12 -2
  14. package/dist/assets/locales/th.json.js +12 -2
  15. package/dist/assets/locales/vi.json.js +12 -2
  16. package/dist/assets/locales/zh-CN.json.js +12 -2
  17. package/dist/assets/locales/zh-TW.json.js +12 -2
  18. package/dist/components/UFloatingElement.js +2 -2
  19. package/dist/components/UFormControlElement.js +2 -2
  20. package/dist/components/UOverlayElement.js +2 -2
  21. package/dist/components/alert/UAlert.js +2 -2
  22. package/dist/components/avatar/UAvatar.js +2 -2
  23. package/dist/components/badge/UBadge.js +2 -2
  24. package/dist/components/breadcrumb/UBreadcrumb.js +1 -1
  25. package/dist/components/breadcrumb-item/UBreadcrumbItem.js +2 -2
  26. package/dist/components/button/UButton.js +2 -2
  27. package/dist/components/button-group/UButtonGroup.js +2 -2
  28. package/dist/components/card/UCard.js +2 -2
  29. package/dist/components/carousel/UCarousel.js +2 -2
  30. package/dist/components/checkbox/UCheckbox.d.ts +2 -0
  31. package/dist/components/checkbox/UCheckbox.js +8 -2
  32. package/dist/components/chip/UChip.js +2 -3
  33. package/dist/components/copy-button/UCopyButton.js +2 -2
  34. package/dist/components/date-picker/UDatePicker.d.ts +9 -0
  35. package/dist/components/date-picker/UDatePicker.js +21 -2
  36. package/dist/components/dialog/UDialog.js +2 -2
  37. package/dist/components/divider/UDivider.js +2 -2
  38. package/dist/components/drawer/UDrawer.js +2 -2
  39. package/dist/components/expander/UExpander.js +2 -2
  40. package/dist/components/field/UField.d.ts +4 -0
  41. package/dist/components/field/UField.js +13 -7
  42. package/dist/components/form/UForm.js +2 -2
  43. package/dist/components/icon/UIcon.js +2 -2
  44. package/dist/components/icon-button/UIconButton.js +2 -2
  45. package/dist/components/input/UInput.d.ts +14 -0
  46. package/dist/components/input/UInput.js +66 -2
  47. package/dist/components/input/UInput.styles.js +7 -0
  48. package/dist/components/menu/UMenu.js +2 -2
  49. package/dist/components/menu-item/UMenuItem.js +2 -2
  50. package/dist/components/option/UOption.js +2 -2
  51. package/dist/components/panel/UPanel.js +2 -2
  52. package/dist/components/popover/UPopover.js +2 -2
  53. package/dist/components/progress-bar/UProgressBar.js +2 -2
  54. package/dist/components/progress-ring/UProgressRing.js +2 -2
  55. package/dist/components/radio/URadio.js +2 -2
  56. package/dist/components/rating/URating.js +2 -2
  57. package/dist/components/select/USelect.d.ts +9 -0
  58. package/dist/components/select/USelect.js +21 -2
  59. package/dist/components/skeleton/USkeleton.js +2 -2
  60. package/dist/components/slider/USlider.d.ts +8 -0
  61. package/dist/components/slider/USlider.js +13 -2
  62. package/dist/components/spinner/USpinner.js +2 -2
  63. package/dist/components/split-panel/USplitPanel.js +2 -2
  64. package/dist/components/switch/USwitch.d.ts +2 -0
  65. package/dist/components/switch/USwitch.js +8 -2
  66. package/dist/components/tab/UTab.js +2 -3
  67. package/dist/components/tab-panel/UTabPanel.js +2 -2
  68. package/dist/components/tag/UTag.js +2 -2
  69. package/dist/components/text/UText.js +2 -2
  70. package/dist/components/textarea/UTextarea.d.ts +2 -0
  71. package/dist/components/textarea/UTextarea.js +8 -2
  72. package/dist/components/tooltip/UTooltip.js +2 -2
  73. package/dist/components/tree/UTree.js +2 -2
  74. package/dist/components/tree-item/UTreeItem.js +2 -2
  75. package/dist/utilities/Locale.d.ts +1 -1
  76. package/package.json +1 -1
  77. package/skills/iyulab-components/references/components/checkbox.md +2 -0
  78. package/skills/iyulab-components/references/components/date-picker.md +2 -0
  79. package/skills/iyulab-components/references/components/field.md +6 -0
  80. package/skills/iyulab-components/references/components/input.md +9 -1
  81. package/skills/iyulab-components/references/components/select.md +2 -0
  82. package/skills/iyulab-components/references/components/slider.md +2 -0
  83. package/skills/iyulab-components/references/components/switch.md +2 -0
  84. package/skills/iyulab-components/references/components/textarea.md +2 -0
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import "../button/UButton.js";
5
5
  import "../icon/UIcon.js";
6
6
  import "../icon-button/UIconButton.js";
@@ -59,9 +59,18 @@ export declare class UDatePicker extends UFormControlElement<string> {
59
59
  private handlePopoverShow;
60
60
  private handlePopoverHide;
61
61
  private handleClearClick;
62
+ /** suffix `u-icon`은 순수 표시 요소(버튼 아님)라 네이티브 키보드 활성화가 없다 —
63
+ * `role="button"`+`tabindex="0"`로 포커스 가능하게 한 뒤, Enter/Space를 같은 클릭
64
+ * 핸들러로 릴레이한다(`UInput`/`USelect`의 동일 패턴과 일치). */
65
+ private handleClearKeydown;
62
66
  private emitChange;
63
67
  protected setValidity(): void;
64
68
  reset(): void;
69
+ /** `.container`는 div라 네이티브 `disabled`가 없다 — disabled일 때 `tabindex="-1"`로만
70
+ * Tab 순서에서 빠지고 프로그램적 `.focus()`는 여전히 통과하므로, `UInput.focus()`가
71
+ * 네이티브 `disabled` `<input>`에서 얻는 것과 같은 no-op을 여기서 직접 재현한다. */
72
+ focus(options?: FocusOptions): void;
73
+ blur(): void;
65
74
  }
66
75
  declare global {
67
76
  interface HTMLElementTagNameMap {
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
3
3
  import { UFormControlElement } from "../UFormControlElement.js";
4
4
  import "../icon/UIcon.js";
5
5
  import "../icon-button/UIconButton.js";
@@ -121,6 +121,11 @@ var UDatePicker = class UDatePicker extends UFormControlElement {
121
121
  if (hadValue) this.emitChange();
122
122
  this.containerEl?.focus();
123
123
  };
124
+ this.handleClearKeydown = (e) => {
125
+ if (e.key !== "Enter" && e.key !== " ") return;
126
+ e.preventDefault();
127
+ this.handleClearClick(e);
128
+ };
124
129
  }
125
130
  static {
126
131
  this.styles = [super.styles, styles];
@@ -156,9 +161,13 @@ var UDatePicker = class UDatePicker extends UFormControlElement {
156
161
  <span class="text-content ${!displayText ? "placeholder" : ""}">${displayText || this.placeholder || ""}</span>
157
162
  <u-icon class="suffix-item"
158
163
  ?hidden=${!this.clearable || !this.value || this.disabled || this.readonly}
164
+ role="button"
165
+ tabindex="0"
166
+ aria-label=${Locale.getValue("clear")}
159
167
  lib="internal"
160
168
  name="x"
161
169
  @click=${this.handleClearClick}
170
+ @keydown=${this.handleClearKeydown}
162
171
  ></u-icon>
163
172
  <u-icon class="suffix-item"
164
173
  lib="internal"
@@ -288,6 +297,16 @@ var UDatePicker = class UDatePicker extends UFormControlElement {
288
297
  this.value = void 0;
289
298
  this.invalid = false;
290
299
  }
300
+ /** `.container`는 div라 네이티브 `disabled`가 없다 — disabled일 때 `tabindex="-1"`로만
301
+ * Tab 순서에서 빠지고 프로그램적 `.focus()`는 여전히 통과하므로, `UInput.focus()`가
302
+ * 네이티브 `disabled` `<input>`에서 얻는 것과 같은 no-op을 여기서 직접 재현한다. */
303
+ focus(options) {
304
+ if (this.disabled) return;
305
+ this.containerEl?.focus(options);
306
+ }
307
+ blur() {
308
+ this.containerEl?.blur();
309
+ }
291
310
  };
292
311
  __decorate([property({ type: String }), __decorateMetadata("design:type", String)], UDatePicker.prototype, "min", void 0);
293
312
  __decorate([property({ type: String }), __decorateMetadata("design:type", String)], UDatePicker.prototype, "max", void 0);
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
3
3
  import { UOverlayElement } from "../UOverlayElement.js";
4
4
  import "../button/UButton.js";
5
5
  import "../icon/UIcon.js";
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import { styles } from "./UDivider.styles.js";
5
5
  import { html } from "lit";
6
6
  import { customElement, property } from "lit/decorators.js";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
3
3
  import { UOverlayElement } from "../UOverlayElement.js";
4
4
  import "../button/UButton.js";
5
5
  import "../icon/UIcon.js";
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import "../icon/UIcon.js";
5
5
  import { styles } from "./UExpander.styles.js";
6
6
  import { html } from "lit";
@@ -29,6 +29,10 @@ export declare class UField extends UElement {
29
29
  validationMessage?: string;
30
30
  render(): import('lit-html').TemplateResult<1>;
31
31
  private renderFooter;
32
+ /** 슬롯에 꽂힌 첫 포커스 가능 자식으로 위임한다 — 라벨 클릭과 같은 대상 탐색 로직을
33
+ * 공개 API로도 노출해, 소비자가 임의의 폼 컨트롤(자체 웹 컴포넌트가 아닌 것 포함)을
34
+ * 슬롯에 꽂아도 host의 `.focus()`가 `UInput.focus()`와 같은 계약으로 동작하게 한다. */
35
+ focus(options?: FocusOptions): void;
32
36
  private handleLabelClick;
33
37
  }
34
38
  declare global {
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import { styles } from "./UField.styles.js";
5
5
  import { html, nothing } from "lit";
6
6
  import { customElement, property } from "lit/decorators.js";
@@ -13,11 +13,7 @@ var UField = class UField extends UElement {
13
13
  this.required = false;
14
14
  this.invalid = false;
15
15
  this.handleLabelClick = () => {
16
- const nodes = (this.shadowRoot?.querySelector("slot:not([name])"))?.assignedElements({ flatten: true }) || [];
17
- for (const node of nodes) if (isFocusable(node)) {
18
- node.focus();
19
- return;
20
- }
16
+ this.focus();
21
17
  };
22
18
  }
23
19
  static {
@@ -43,6 +39,16 @@ var UField = class UField extends UElement {
43
39
  if (!message) return nothing;
44
40
  return html`<div class="footer">${message}</div>`;
45
41
  }
42
+ /** 슬롯에 꽂힌 첫 포커스 가능 자식으로 위임한다 — 라벨 클릭과 같은 대상 탐색 로직을
43
+ * 공개 API로도 노출해, 소비자가 임의의 폼 컨트롤(자체 웹 컴포넌트가 아닌 것 포함)을
44
+ * 슬롯에 꽂아도 host의 `.focus()`가 `UInput.focus()`와 같은 계약으로 동작하게 한다. */
45
+ focus(options) {
46
+ const nodes = (this.shadowRoot?.querySelector("slot:not([name])"))?.assignedElements({ flatten: true }) || [];
47
+ for (const node of nodes) if (isFocusable(node)) {
48
+ node.focus(options);
49
+ return;
50
+ }
51
+ }
46
52
  };
47
53
  __decorate([property({
48
54
  type: Boolean,
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import { UFormControlElement } from "../UFormControlElement.js";
5
5
  import { arrayAttrConverter } from "../../utilities/converters.js";
6
6
  import { styles } from "./UForm.styles.js";
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import { IconRegistry, getDefaultBaseUrl } from "../../utilities/icons.js";
5
5
  import { styles } from "./UIcon.styles.js";
6
6
  import { nothing } from "lit";
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import "../button/UButton.js";
5
5
  import "../icon/UIcon.js";
6
6
  import "../tooltip/UTooltip.js";
@@ -102,8 +102,22 @@ export declare class UInput extends UFormControlElement<string> {
102
102
  private handleInputChange;
103
103
  private handleInputBlur;
104
104
  private handleInputKeydown;
105
+ /** suffix `u-icon`은 순수 표시 요소(버튼 아님)라 네이티브 키보드 활성화가 없다 —
106
+ * `role="button"`+`tabindex="0"`로 포커스 가능하게 한 뒤, Enter/Space를 같은 클릭
107
+ * 핸들러로 릴레이한다. `e.preventDefault()`는 Space가 페이지를 스크롤시키는 것을 막는다. */
108
+ private handleSuffixIconKeydown;
105
109
  private handlePasswordTogglerClick;
106
110
  private handleClearButtonClick;
111
+ /** 경계(min/max)에 걸리면 시각적으로 흐리고 마우스 클릭을 막는다(CSS `pointer-events:
112
+ * none`) — 네이티브 stepUp/stepDown 자체가 경계에서 조용히 no-op이라 값이 튀지는
113
+ * 않지만, 헛클릭 피드백을 준다. 키보드 Enter/Space는 `pointer-events`의 영향을 받지
114
+ * 않아 그대로 stepUp/stepDown까지 가지만 결과는 동일하게 no-op이다. */
115
+ private get canIncrement();
116
+ private get canDecrement();
117
+ /** 네이티브 `<input type="number">`의 stepUp/stepDown에 위임한다 — min/max/step 클램핑을
118
+ * 다시 구현하지 않는다. 클릭이 곧 "값을 확정"하는 동작이라 change도 함께 낸다(네이티브
119
+ * 스핀 버튼과 동일하게, 타이핑 중 blur 대기가 아니다). */
120
+ private handleStepperClick;
107
121
  private handleOptionClick;
108
122
  private handleOptionKeydown;
109
123
  private handlePopoverShow;
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
3
3
  import { UFormControlElement } from "../UFormControlElement.js";
4
4
  import "../spinner/USpinner.js";
5
5
  import "../icon/UIcon.js";
@@ -72,6 +72,11 @@ var UInput = class UInput extends UFormControlElement {
72
72
  this.popoverEl?.hide();
73
73
  }
74
74
  };
75
+ this.handleSuffixIconKeydown = (action) => (e) => {
76
+ if (e.key !== "Enter" && e.key !== " ") return;
77
+ e.preventDefault();
78
+ action(e);
79
+ };
75
80
  this.handlePasswordTogglerClick = (e) => {
76
81
  e.stopImmediatePropagation();
77
82
  this.showPassword = !this.showPassword;
@@ -86,6 +91,23 @@ var UInput = class UInput extends UFormControlElement {
86
91
  }));
87
92
  this.focus();
88
93
  };
94
+ this.handleStepperClick = (delta) => (e) => {
95
+ e.stopImmediatePropagation();
96
+ const input = this.inputEl;
97
+ if (!input) return;
98
+ try {
99
+ if (delta === 1) input.stepUp();
100
+ else input.stepDown();
101
+ } catch {
102
+ return;
103
+ }
104
+ input.dispatchEvent(new InputEvent("input", { bubbles: true }));
105
+ this.dispatchEvent(new Event("change", {
106
+ bubbles: true,
107
+ composed: true
108
+ }));
109
+ this.focus();
110
+ };
89
111
  this.handleOptionClick = (e) => {
90
112
  const option = e.currentTarget;
91
113
  if (option.disabled) return;
@@ -184,15 +206,45 @@ var UInput = class UInput extends UFormControlElement {
184
206
 
185
207
  <u-icon class="suffix-item"
186
208
  ?hidden=${this.type !== "password" || this.disabled || this.readonly}
209
+ role="button"
210
+ tabindex="0"
211
+ aria-label=${Locale.getValue(this.showPassword ? "hidePassword" : "showPassword")}
187
212
  lib="internal"
188
213
  name=${this.showPassword ? "eye-off" : "eye"}
189
214
  @click=${this.handlePasswordTogglerClick}
215
+ @keydown=${this.handleSuffixIconKeydown(this.handlePasswordTogglerClick)}
190
216
  ></u-icon>
191
217
  <u-icon class="suffix-item"
192
218
  ?hidden=${!this.clearable || this.disabled || this.readonly || !this.value}
219
+ role="button"
220
+ tabindex="0"
221
+ aria-label=${Locale.getValue("clear")}
193
222
  lib="internal"
194
223
  name="x"
195
224
  @click=${this.handleClearButtonClick}
225
+ @keydown=${this.handleSuffixIconKeydown(this.handleClearButtonClick)}
226
+ ></u-icon>
227
+ <u-icon class="suffix-item stepper-btn"
228
+ ?hidden=${this.type !== "number" || this.disabled || this.readonly}
229
+ role="button"
230
+ tabindex="0"
231
+ aria-disabled=${!this.canDecrement}
232
+ aria-label=${Locale.getValue("decrement")}
233
+ lib="internal"
234
+ name="minus"
235
+ @click=${this.handleStepperClick(-1)}
236
+ @keydown=${this.handleSuffixIconKeydown(this.handleStepperClick(-1))}
237
+ ></u-icon>
238
+ <u-icon class="suffix-item stepper-btn"
239
+ ?hidden=${this.type !== "number" || this.disabled || this.readonly}
240
+ role="button"
241
+ tabindex="0"
242
+ aria-disabled=${!this.canIncrement}
243
+ aria-label=${Locale.getValue("increment")}
244
+ lib="internal"
245
+ name="plus"
246
+ @click=${this.handleStepperClick(1)}
247
+ @keydown=${this.handleSuffixIconKeydown(this.handleStepperClick(1))}
196
248
  ></u-icon>
197
249
  </div>
198
250
  </u-field>
@@ -279,6 +331,18 @@ var UInput = class UInput extends UFormControlElement {
279
331
  option.removeEventListener("keydown", this.handleOptionKeydown);
280
332
  }
281
333
  }
334
+ /** 경계(min/max)에 걸리면 시각적으로 흐리고 마우스 클릭을 막는다(CSS `pointer-events:
335
+ * none`) — 네이티브 stepUp/stepDown 자체가 경계에서 조용히 no-op이라 값이 튀지는
336
+ * 않지만, 헛클릭 피드백을 준다. 키보드 Enter/Space는 `pointer-events`의 영향을 받지
337
+ * 않아 그대로 stepUp/stepDown까지 가지만 결과는 동일하게 no-op이다. */
338
+ get canIncrement() {
339
+ if (this.max === void 0 || this.max === "" || !this.value) return true;
340
+ return Number(this.value) < Number(this.max);
341
+ }
342
+ get canDecrement() {
343
+ if (this.min === void 0 || this.min === "" || !this.value) return true;
344
+ return Number(this.value) > Number(this.min);
345
+ }
282
346
  };
283
347
  __decorate([property({
284
348
  type: String,
@@ -166,6 +166,13 @@ var styles = css`
166
166
  .suffix-item:active {
167
167
  color: var(--u-icon-color-active, #1565C0);
168
168
  }
169
+ .stepper-btn {
170
+ font-size: 0.85em;
171
+ }
172
+ .stepper-btn[aria-disabled="true"] {
173
+ opacity: 0.35;
174
+ pointer-events: none;
175
+ }
169
176
 
170
177
  u-popover {
171
178
  width: var(--input-popover-width, var(--anchor-width, 100%));
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import { UMenuItem } from "../menu-item/UMenuItem.js";
5
5
  import { styles } from "./UMenu.styles.js";
6
6
  import { html } from "lit";
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import "../icon/UIcon.js";
5
5
  import "../popover/UPopover.js";
6
6
  import { UDivider } from "../divider/UDivider.js";
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import "../icon/UIcon.js";
5
5
  import { styles } from "./UOption.styles.js";
6
6
  import { html, nothing } from "lit";
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import { styles } from "./UPanel.styles.js";
5
5
  import { html } from "lit";
6
6
  import { customElement, property } from "lit/decorators.js";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
3
3
  import { UFloatingElement } from "../UFloatingElement.js";
4
4
  import { arrayAttrConverter } from "../../utilities/converters.js";
5
5
  import { styles } from "./UPopover.styles.js";
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import { styles } from "./UProgressBar.styles.js";
5
5
  import { html } from "lit";
6
6
  import { customElement, property, state } from "lit/decorators.js";
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import { styles } from "./UProgressRing.styles.js";
5
5
  import { html } from "lit";
6
6
  import { customElement, property, state } from "lit/decorators.js";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
3
3
  import { UFormControlElement } from "../UFormControlElement.js";
4
4
  import { Locale } from "../../utilities/Locale.js";
5
5
  import "../field/UField.js";
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
3
3
  import { UFormControlElement } from "../UFormControlElement.js";
4
4
  import "../icon/UIcon.js";
5
5
  import { Locale } from "../../utilities/Locale.js";
@@ -62,6 +62,11 @@ export declare class USelect extends UFormControlElement<string | string[]> {
62
62
  private renderContent;
63
63
  protected setValidity(): void;
64
64
  reset(): void;
65
+ /** `.container`는 div라 네이티브 `disabled`가 없다 — disabled일 때 `tabindex="-1"`로만
66
+ * Tab 순서에서 빠지고 프로그램적 `.focus()`는 여전히 통과하므로, `UInput.focus()`가
67
+ * 네이티브 `disabled` `<input>`에서 얻는 것과 같은 no-op을 여기서 직접 재현한다. */
68
+ focus(options?: FocusOptions): void;
69
+ blur(): void;
65
70
  private setup;
66
71
  private cleanup;
67
72
  private onChangeValue;
@@ -76,6 +81,10 @@ export declare class USelect extends UFormControlElement<string | string[]> {
76
81
  private handleSearchInput;
77
82
  private handleSearchKeydown;
78
83
  private handleClearClick;
84
+ /** suffix `u-icon`은 순수 표시 요소(버튼 아님)라 네이티브 키보드 활성화가 없다 —
85
+ * `role="button"`+`tabindex="0"`로 포커스 가능하게 한 뒤, Enter/Space를 같은 클릭
86
+ * 핸들러로 릴레이한다(`UInput`의 동일 패턴과 일치). */
87
+ private handleClearKeydown;
79
88
  private handleChipRemove;
80
89
  }
81
90
  declare global {
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
3
3
  import { UFormControlElement } from "../UFormControlElement.js";
4
4
  import "../spinner/USpinner.js";
5
5
  import "../icon/UIcon.js";
@@ -111,6 +111,11 @@ var USelect = class USelect extends UFormControlElement {
111
111
  this.emitChange();
112
112
  this.containerEl?.click();
113
113
  };
114
+ this.handleClearKeydown = (e) => {
115
+ if (e.key !== "Enter" && e.key !== " ") return;
116
+ e.preventDefault();
117
+ this.handleClearClick(e);
118
+ };
114
119
  this.handleChipRemove = (e) => {
115
120
  const value = e.currentTarget.dataset.value;
116
121
  if (!value) return;
@@ -172,9 +177,13 @@ var USelect = class USelect extends UFormControlElement {
172
177
 
173
178
  <u-icon class="suffix-item"
174
179
  ?hidden=${!this.clearable || !this.hasValue || this.disabled || this.readonly}
180
+ role="button"
181
+ tabindex="0"
182
+ aria-label=${Locale.getValue("clear")}
175
183
  lib="internal"
176
184
  name="x"
177
185
  @click=${this.handleClearClick}
186
+ @keydown=${this.handleClearKeydown}
178
187
  ></u-icon>
179
188
  <u-icon class="suffix-item"
180
189
  ?hidden=${this.loading}
@@ -256,6 +265,16 @@ var USelect = class USelect extends UFormControlElement {
256
265
  this.value = this.multiple ? [] : "";
257
266
  this.invalid = false;
258
267
  }
268
+ /** `.container`는 div라 네이티브 `disabled`가 없다 — disabled일 때 `tabindex="-1"`로만
269
+ * Tab 순서에서 빠지고 프로그램적 `.focus()`는 여전히 통과하므로, `UInput.focus()`가
270
+ * 네이티브 `disabled` `<input>`에서 얻는 것과 같은 no-op을 여기서 직접 재현한다. */
271
+ focus(options) {
272
+ if (this.disabled) return;
273
+ this.containerEl?.focus(options);
274
+ }
275
+ blur() {
276
+ this.containerEl?.blur();
277
+ }
259
278
  setup(options) {
260
279
  for (const option of options) {
261
280
  option.removeEventListener("click", this.handleOptionClick);
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import { styles } from "./USkeleton.styles.js";
5
5
  import { html } from "lit";
6
6
  import { customElement, property } from "lit/decorators.js";
@@ -60,6 +60,9 @@ export declare class USlider extends UFormControlElement<number | number[]> {
60
60
  private dragging;
61
61
  private trackEl;
62
62
  private containerEl?;
63
+ /** `.container`는 포인터 이벤트 좌표 계산용 래퍼일 뿐 tabindex가 없다 — 실제
64
+ * 포커스 가능한 대상은 min thumb(단일 모드의 유일한 thumb, range 모드의 시작값)다. */
65
+ private minThumbEl?;
63
66
  protected shouldValidate(changed: PropertyValues): boolean;
64
67
  get valueAsNumber(): number;
65
68
  get valueAsArray(): number[];
@@ -74,6 +77,11 @@ export declare class USlider extends UFormControlElement<number | number[]> {
74
77
  render(): TemplateResult<1>;
75
78
  protected setValidity(): void;
76
79
  reset(): void;
80
+ /** thumb는 div라 네이티브 `disabled`가 없다 — disabled일 때 `tabindex="-1"`로만 Tab
81
+ * 순서에서 빠지고 프로그램적 `.focus()`는 여전히 통과하므로, `UInput.focus()`가
82
+ * 네이티브 `disabled` `<input>`에서 얻는 것과 같은 no-op을 여기서 직접 재현한다. */
83
+ focus(options?: FocusOptions): void;
84
+ blur(): void;
77
85
  private onChangeValue;
78
86
  /** 사용자 상호작용으로 값이 확정된 경로에서만 호출한다 — 프로그램적 value 세팅은
79
87
  * 네이티브 폼 컨트롤과 동일하게 change를 발화하지 않는다. */
@@ -1,5 +1,5 @@
1
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
3
3
  import { UFormControlElement } from "../UFormControlElement.js";
4
4
  import "../tooltip/UTooltip.js";
5
5
  import { Locale } from "../../utilities/Locale.js";
@@ -200,6 +200,16 @@ var USlider = class USlider extends UFormControlElement {
200
200
  else this.value = this.offset ?? this.min;
201
201
  this.invalid = false;
202
202
  }
203
+ /** thumb는 div라 네이티브 `disabled`가 없다 — disabled일 때 `tabindex="-1"`로만 Tab
204
+ * 순서에서 빠지고 프로그램적 `.focus()`는 여전히 통과하므로, `UInput.focus()`가
205
+ * 네이티브 `disabled` `<input>`에서 얻는 것과 같은 no-op을 여기서 직접 재현한다. */
206
+ focus(options) {
207
+ if (this.disabled) return;
208
+ this.minThumbEl?.focus(options);
209
+ }
210
+ blur() {
211
+ this.minThumbEl?.blur();
212
+ }
203
213
  onChangeValue() {
204
214
  if (Array.isArray(this.value)) this.value = [this.snap(this.value[0]), this.snap(this.value[1])];
205
215
  else if (typeof this.value === "number") this.value = this.snap(this.value);
@@ -300,6 +310,7 @@ __decorate([property({ converter: { fromAttribute: (value) => {
300
310
  __decorate([state(), __decorateMetadata("design:type", Object)], USlider.prototype, "dragging", void 0);
301
311
  __decorate([query(".track"), __decorateMetadata("design:type", typeof HTMLElement === "undefined" ? Object : HTMLElement)], USlider.prototype, "trackEl", void 0);
302
312
  __decorate([query(".container"), __decorateMetadata("design:type", typeof HTMLElement === "undefined" ? Object : HTMLElement)], USlider.prototype, "containerEl", void 0);
313
+ __decorate([query(".thumb[data-thumb=\"min\"]"), __decorateMetadata("design:type", typeof HTMLElement === "undefined" ? Object : HTMLElement)], USlider.prototype, "minThumbEl", void 0);
303
314
  USlider = __decorate([customElement("u-slider")], USlider);
304
315
  //#endregion
305
316
  export { USlider };
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import { styles } from "./USpinner.styles.js";
5
5
  import { html } from "lit";
6
6
  import { customElement, property, state } from "lit/decorators.js";
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.js";
2
- import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.144.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
4
4
  import { arrayAttrConverter } from "../../utilities/converters.js";
5
5
  import { styles } from "./USplitPanel.styles.js";
6
6
  import { html } from "lit";
@@ -41,6 +41,8 @@ export declare class USwitch extends UFormControlElement<string> {
41
41
  render(): import('lit-html').TemplateResult<1>;
42
42
  protected setValidity(): void;
43
43
  reset(): void;
44
+ focus(options?: FocusOptions): void;
45
+ blur(): void;
44
46
  private handleInputChange;
45
47
  }
46
48
  declare global {