@iyulab/components 1.33.1 → 1.34.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 (75) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/dist/_virtual/{_@oxc-project_runtime@0.146.0 → _@oxc-project_runtime@0.147.0}/helpers/esm/decorate.js +1 -1
  3. package/dist/_virtual/{_@oxc-project_runtime@0.146.0 → _@oxc-project_runtime@0.147.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 +11 -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.d.ts +4 -0
  19. package/dist/components/UFloatingElement.js +2 -2
  20. package/dist/components/UFormControlElement.js +2 -2
  21. package/dist/components/UOverlayElement.js +2 -2
  22. package/dist/components/alert/UAlert.js +2 -2
  23. package/dist/components/avatar/UAvatar.js +2 -2
  24. package/dist/components/badge/UBadge.js +2 -2
  25. package/dist/components/breadcrumb/UBreadcrumb.js +1 -1
  26. package/dist/components/breadcrumb-item/UBreadcrumbItem.js +2 -2
  27. package/dist/components/button/UButton.js +2 -2
  28. package/dist/components/button-group/UButtonGroup.js +2 -2
  29. package/dist/components/card/UCard.js +2 -2
  30. package/dist/components/carousel/UCarousel.js +7 -2
  31. package/dist/components/checkbox/UCheckbox.js +2 -2
  32. package/dist/components/chip/UChip.js +2 -2
  33. package/dist/components/copy-button/UCopyButton.js +2 -2
  34. package/dist/components/date-picker/UDatePicker.d.ts +43 -6
  35. package/dist/components/date-picker/UDatePicker.js +102 -12
  36. package/dist/components/date-picker/UDatePicker.styles.js +29 -0
  37. package/dist/components/dialog/UDialog.js +2 -2
  38. package/dist/components/divider/UDivider.js +2 -2
  39. package/dist/components/drawer/UDrawer.js +2 -2
  40. package/dist/components/expander/UExpander.js +2 -2
  41. package/dist/components/field/UField.js +2 -2
  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.js +2 -2
  46. package/dist/components/menu/UMenu.js +2 -2
  47. package/dist/components/menu-item/UMenuItem.js +2 -2
  48. package/dist/components/option/UOption.js +2 -2
  49. package/dist/components/panel/UPanel.js +2 -2
  50. package/dist/components/popover/UPopover.js +14 -5
  51. package/dist/components/progress-bar/UProgressBar.js +2 -2
  52. package/dist/components/progress-ring/UProgressRing.js +2 -2
  53. package/dist/components/radio/URadio.js +2 -2
  54. package/dist/components/rating/URating.js +2 -2
  55. package/dist/components/select/USelect.js +2 -2
  56. package/dist/components/skeleton/USkeleton.js +2 -2
  57. package/dist/components/slider/USlider.js +2 -2
  58. package/dist/components/spinner/USpinner.js +2 -2
  59. package/dist/components/split-panel/USplitPanel.js +2 -2
  60. package/dist/components/switch/USwitch.js +2 -2
  61. package/dist/components/tab/UTab.js +2 -2
  62. package/dist/components/tab-panel/UTabPanel.js +2 -2
  63. package/dist/components/tag/UTag.js +2 -2
  64. package/dist/components/text/UText.js +2 -2
  65. package/dist/components/textarea/UTextarea.js +2 -2
  66. package/dist/components/tooltip/UTooltip.js +2 -2
  67. package/dist/components/tree/UTree.js +2 -2
  68. package/dist/components/tree-item/UTreeItem.js +2 -2
  69. package/dist/index.js +3 -3
  70. package/dist/utilities/Locale.d.ts +1 -1
  71. package/dist/utilities/Locale.js +1 -1
  72. package/dist/utilities/elements.d.ts +6 -0
  73. package/dist/utilities/elements.js +9 -1
  74. package/package.json +1 -1
  75. package/skills/iyulab-components/references/components/date-picker.md +21 -5
@@ -1,8 +1,9 @@
1
1
  import { UElement } from "../UElement.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";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorate.js";
4
4
  import "../button/UButton.js";
5
5
  import "../icon/UIcon.js";
6
+ import { Locale } from "../../utilities/Locale.js";
6
7
  import { styles } from "./UCarousel.styles.js";
7
8
  import { html } from "lit";
8
9
  import { customElement, property, state } from "lit/decorators.js";
@@ -143,6 +144,7 @@ var UCarousel = class UCarousel extends UElement {
143
144
  ?hidden=${!this.navigation || !this.loop && this.index <= 0}
144
145
  variant="ghost"
145
146
  rounded
147
+ aria-label=${Locale.getValue("previousSlide")}
146
148
  @click=${this.prev}>
147
149
  <u-icon lib="internal" name="chevron-left"></u-icon>
148
150
  </u-button>
@@ -150,6 +152,7 @@ var UCarousel = class UCarousel extends UElement {
150
152
  ?hidden=${!this.navigation || !this.loop && this.index >= this.maxIndex}
151
153
  variant="ghost"
152
154
  rounded
155
+ aria-label=${Locale.getValue("nextSlide")}
153
156
  @click=${this.next}>
154
157
  <u-icon lib="internal" name="chevron-right"></u-icon>
155
158
  </u-button>
@@ -158,6 +161,8 @@ var UCarousel = class UCarousel extends UElement {
158
161
  ?hidden=${!this.pagination || this.pageCount <= 1}>
159
162
  ${Array.from({ length: this.pageCount }, (_, i) => html`
160
163
  <button part="dot" class="dot"
164
+ aria-label=${Locale.getValue("goToSlide", { n: i + 1 })}
165
+ aria-current=${i === this.currentPage ? "true" : "false"}
161
166
  ?active=${i === this.currentPage}
162
167
  @click=${() => this.goTo(Math.min(i * this.perMove, this.maxIndex))}>
163
168
  </button>
@@ -1,5 +1,5 @@
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";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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";
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.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";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorate.js";
4
4
  import "../button/UButton.js";
5
5
  import "../icon/UIcon.js";
6
6
  import "../tooltip/UTooltip.js";
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.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";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorate.js";
4
4
  import "../button/UButton.js";
5
5
  import "../icon/UIcon.js";
6
6
  import "../icon-button/UIconButton.js";
@@ -1,9 +1,14 @@
1
1
  import { PropertyValues } from 'lit';
2
2
  import { UFormControlElement } from '../UFormControlElement.js';
3
3
  import { UPopover } from '../popover/UPopover.js';
4
+ export type DatePickerMode = 'date' | 'datetime';
4
5
  /**
5
- * A single-date-selection form control. The value follows the same convention as the
6
- * native `input[type=date]`: an ISO `YYYY-MM-DD` string.
6
+ * A single-date(-time)-selection form control. In `mode="date"` (default) the value follows
7
+ * the same convention as the native `input[type=date]`: an ISO `YYYY-MM-DD` string. In
8
+ * `mode="datetime"` the value is a complete ISO-8601 `DateTimeOffset` string
9
+ * (`YYYY-MM-DDTHH:mm:ss±HH:mm`) — the component always fills in seconds and the browser's
10
+ * local UTC offset, so the value is unconditionally valid regardless of how coarse the time
11
+ * input was.
7
12
  *
8
13
  * The calendar week always starts on Sunday, regardless of locale — harmless for the
9
14
  * locales this library currently ships (en/ko), but not correct for locales where Monday
@@ -20,17 +25,25 @@ import { UPopover } from '../popover/UPopover.js';
20
25
  * @csspart calendar-weekdays - the weekday header row
21
26
  * @csspart calendar-grid - the date grid
22
27
  * @csspart day - a date cell button
28
+ * @csspart calendar-footer - the row holding the "today"/"clear" quick-action buttons
29
+ * @csspart calendar-time - the row holding the time-of-day input (datetime mode only)
23
30
  *
24
31
  * @cssprop --date-picker-popover-width - width of the calendar popover (default: 296px, independent of trigger width — a fixed-width calendar reads more naturally)
25
32
  *
26
- * @event change - fires when the user clicks a date cell, confirms via keyboard, or clicks the clear button.
27
- * Programmatic value assignment does not fire it (same contract as native form controls).
33
+ * @event change - fires when the user clicks a date cell, confirms via keyboard, changes the
34
+ * time input (datetime mode, once a date is set), or clicks the clear button. Programmatic
35
+ * value assignment does not fire it (same contract as native form controls).
28
36
  */
29
37
  export declare class UDatePicker extends UFormControlElement<string> {
30
38
  static styles: import('lit').CSSResultGroup[];
31
- /** Minimum value (ISO YYYY-MM-DD) dates before this cannot be selected. */
39
+ /** `date` (default) selects a calendar day only. `datetime` also captures a time-of-day and
40
+ * the value becomes a complete ISO-8601 `DateTimeOffset` string. */
41
+ mode: DatePickerMode;
42
+ /** Minimum value (ISO YYYY-MM-DD) — dates before this cannot be selected. Date-only even in
43
+ * `mode="datetime"`; time-of-day is never range-checked. */
32
44
  min?: string;
33
- /** Maximum value (ISO YYYY-MM-DD) — dates after this cannot be selected. */
45
+ /** Maximum value (ISO YYYY-MM-DD) — dates after this cannot be selected. Date-only even in
46
+ * `mode="datetime"`; time-of-day is never range-checked. */
34
47
  max?: string;
35
48
  /** Whether to show the clear button */
36
49
  clearable: boolean;
@@ -43,14 +56,28 @@ export declare class UDatePicker extends UFormControlElement<string> {
43
56
  private open;
44
57
  private viewDate;
45
58
  private focusedDate;
59
+ /** Time-of-day for the next selection while no `value` exists yet (`mode="datetime"` only) —
60
+ * once `value` is set, the time input reads/writes its time portion directly instead. */
61
+ private pendingTime;
46
62
  private grabFocusOnUpdate;
47
63
  protected updated(changed: PropertyValues): void;
48
64
  render(): import('lit-html').TemplateResult<1>;
49
65
  private renderCalendar;
66
+ private renderTimeRow;
67
+ private renderFooter;
50
68
  private renderDay;
51
69
  private isOutOfRange;
52
70
  private focusDayButton;
71
+ /** `timeOverride` lets a caller force the time-of-day (the "today" quick action wants
72
+ * "right now", overriding whatever time was previously set) — a plain day-cell click omits
73
+ * it, which preserves the existing time-of-day (or `pendingTime`) so switching the date
74
+ * alone doesn't clobber a time the user already picked. */
53
75
  private selectDay;
76
+ /** Time input change — only commits into `value` once a date already exists (matches native
77
+ * `datetime-local`: a time alone isn't a complete value). Before that, it just remembers
78
+ * `pendingTime` for whenever a day gets picked. Doesn't close the popover or refocus the
79
+ * trigger — unlike selecting a day, adjusting the time doesn't conclude the interaction. */
80
+ private handleTimeChange;
54
81
  private handlePrevMonth;
55
82
  private handleNextMonth;
56
83
  private navigateMonth;
@@ -59,6 +86,16 @@ export declare class UDatePicker extends UFormControlElement<string> {
59
86
  private handlePopoverShow;
60
87
  private handlePopoverHide;
61
88
  private handleClearClick;
89
+ /** "오늘" 퀵액션 — `today` 셀이 이미 렌더에서 계산해 표시 중인 값(`renderDay`의
90
+ * `isSameDay(date, new Date())`)을 실제로 선택하는 것뿐이라 `selectDay`를 그대로 탄다
91
+ * (범위 밖이면 `selectDay`가 조용히 no-op — 클릭 불가 상태인 day 셀과 동일 규약).
92
+ * datetime 모드에서는 "지금"을 통째로 채우는 것이 요청의 본질(§D-28 항목 2 docket 코멘트)
93
+ * 이라 시간까지 `now`로 덮어쓴다 — 평범한 day 셀 클릭과 달리 기존 시각을 보존하지 않는다. */
94
+ private handleTodayClick;
95
+ /** 캘린더 팝오버 안 "초기화" 퀵액션 — 트리거의 clear 아이콘(`handleClearClick`)과 값을
96
+ * 비우는 로직은 같지만, 팝오버가 열린 채로 눌렸으므로 선택 완료와 동일하게 닫아 준다. */
97
+ private handleFooterResetClick;
98
+ private resetValue;
62
99
  /** suffix `u-icon`은 순수 표시 요소(버튼 아님)라 네이티브 키보드 활성화가 없다 —
63
100
  * `role="button"`+`tabindex="0"`로 포커스 가능하게 한 뒤, Enter/Space를 같은 클릭
64
101
  * 핸들러로 릴레이한다(`UInput`/`USelect`의 동일 패턴과 일치). */
@@ -1,6 +1,7 @@
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";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorate.js";
3
3
  import { UFormControlElement } from "../UFormControlElement.js";
4
+ import "../button/UButton.js";
4
5
  import "../icon/UIcon.js";
5
6
  import "../icon-button/UIconButton.js";
6
7
  import { Locale } from "../../utilities/Locale.js";
@@ -34,6 +35,31 @@ function addDays(date, delta) {
34
35
  function daysInMonth(date) {
35
36
  return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
36
37
  }
38
+ /** `±HH:mm` for the browser's local timezone at `date` (DST-aware — recomputed per date,
39
+ * not cached — `getTimezoneOffset()`'s sign is the inverse of the ISO-8601 offset sign). */
40
+ function getLocalOffset(date) {
41
+ const minutes = -date.getTimezoneOffset();
42
+ const sign = minutes >= 0 ? "+" : "-";
43
+ const abs = Math.abs(minutes);
44
+ return `${sign}${String(Math.floor(abs / 60)).padStart(2, "0")}:${String(abs % 60).padStart(2, "0")}`;
45
+ }
46
+ /** Builds the `value` for the given mode — `datetime` always emits seconds + local offset so
47
+ * the result is unconditionally a valid, unambiguous ISO-8601 `DateTimeOffset` regardless of
48
+ * how coarse the UI input was (this is the guarantee the datetime mode request asked for). */
49
+ function buildValue(date, mode, time) {
50
+ return mode === "datetime" ? `${toISODate(date)}T${time}:00${getLocalOffset(date)}` : toISODate(date);
51
+ }
52
+ /** Splits a `value` into its date portion (as a `Date`, via the local `parseISODate` above —
53
+ * date-only, no timezone conversion) and its `HH:mm` time-of-day (`'00:00'` if absent —
54
+ * covers both plain date-mode values and a datetime value with no time captured yet). */
55
+ function splitValue(value) {
56
+ const [datePart, rest] = value.split("T");
57
+ const match = rest?.match(/^(\d{2}:\d{2})/);
58
+ return {
59
+ date: parseISODate(datePart),
60
+ time: match ? match[1] : "00:00"
61
+ };
62
+ }
37
63
  /** Cells to render for the calendar grid — leading `null`s pad the previous month's weekday offset. */
38
64
  function buildMonthGrid(viewDate) {
39
65
  const startOffset = startOfMonth(viewDate).getDay();
@@ -58,12 +84,23 @@ function getWeekdayLabels(locale) {
58
84
  var UDatePicker = class UDatePicker extends UFormControlElement {
59
85
  constructor(..._args) {
60
86
  super(..._args);
87
+ this.mode = "date";
61
88
  this.clearable = false;
62
89
  this.calendarId = `u-date-picker-calendar-${Math.random().toString(36).slice(2, 8)}`;
63
90
  this.open = false;
64
91
  this.viewDate = startOfMonth(/* @__PURE__ */ new Date());
65
92
  this.focusedDate = /* @__PURE__ */ new Date();
93
+ this.pendingTime = "00:00";
66
94
  this.grabFocusOnUpdate = false;
95
+ this.handleTimeChange = (e) => {
96
+ const time = e.target.value || "00:00";
97
+ this.pendingTime = time;
98
+ if (!this.value) return;
99
+ const iso = buildValue(splitValue(this.value).date, this.mode, time);
100
+ const changed = iso !== this.value;
101
+ this.value = iso;
102
+ if (changed) this.emitChange();
103
+ };
67
104
  this.handlePrevMonth = () => this.navigateMonth(-1);
68
105
  this.handleNextMonth = () => this.navigateMonth(1);
69
106
  this.handleDayKeydown = (e, date) => {
@@ -106,7 +143,7 @@ var UDatePicker = class UDatePicker extends UFormControlElement {
106
143
  this.handlePopoverShow = () => {
107
144
  this.open = true;
108
145
  this.grabFocusOnUpdate = true;
109
- const base = this.value ? parseISODate(this.value) : /* @__PURE__ */ new Date();
146
+ const base = this.value ? splitValue(this.value).date : /* @__PURE__ */ new Date();
110
147
  this.viewDate = startOfMonth(base);
111
148
  this.focusedDate = base;
112
149
  };
@@ -116,9 +153,17 @@ var UDatePicker = class UDatePicker extends UFormControlElement {
116
153
  this.handleClearClick = (e) => {
117
154
  e.preventDefault();
118
155
  e.stopPropagation();
119
- const hadValue = !!this.value;
120
- this.value = void 0;
121
- if (hadValue) this.emitChange();
156
+ this.resetValue();
157
+ this.containerEl?.focus();
158
+ };
159
+ this.handleTodayClick = () => {
160
+ const now = /* @__PURE__ */ new Date();
161
+ const time = this.mode === "datetime" ? `${String(now.getHours()).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}` : void 0;
162
+ this.selectDay(now, time);
163
+ };
164
+ this.handleFooterResetClick = () => {
165
+ this.resetValue();
166
+ this.popoverEl?.hide();
122
167
  this.containerEl?.focus();
123
168
  };
124
169
  this.handleClearKeydown = (e) => {
@@ -139,7 +184,10 @@ var UDatePicker = class UDatePicker extends UFormControlElement {
139
184
  }
140
185
  }
141
186
  render() {
142
- const displayText = this.value ? formatDate(this.value) : "";
187
+ const displayText = this.value ? formatDate(this.value, this.mode === "datetime" ? {
188
+ dateStyle: "medium",
189
+ timeStyle: "short"
190
+ } : void 0) : "";
143
191
  return html`
144
192
  <u-field part="field"
145
193
  ?required=${this.required}
@@ -216,11 +264,37 @@ var UDatePicker = class UDatePicker extends UFormControlElement {
216
264
  </div>
217
265
  `)}
218
266
  </div>
267
+ ${this.renderTimeRow()}
268
+ ${this.renderFooter()}
269
+ </div>
270
+ `;
271
+ }
272
+ renderTimeRow() {
273
+ if (this.mode !== "datetime") return "";
274
+ const time = this.value ? splitValue(this.value).time : this.pendingTime;
275
+ return html`
276
+ <div class="calendar-time" part="calendar-time">
277
+ <input type="time" class="time-input" part="time-input"
278
+ aria-label=${Locale.getValue("time")}
279
+ .value=${time}
280
+ @change=${this.handleTimeChange}
281
+ />
282
+ </div>
283
+ `;
284
+ }
285
+ renderFooter() {
286
+ const todayDisabled = this.isOutOfRange(/* @__PURE__ */ new Date());
287
+ return html`
288
+ <div class="calendar-footer" part="calendar-footer">
289
+ <u-button variant="ghost" size="sm" ?disabled=${todayDisabled} @click=${this.handleTodayClick}>${Locale.getValue("today")}</u-button>
290
+ ${this.clearable && this.value ? html`
291
+ <u-button variant="ghost" size="sm" @click=${this.handleFooterResetClick}>${Locale.getValue("clear")}</u-button>
292
+ ` : ""}
219
293
  </div>
220
294
  `;
221
295
  }
222
296
  renderDay(date) {
223
- const selected = this.value ? isSameDay(date, parseISODate(this.value)) : false;
297
+ const selected = this.value ? isSameDay(date, splitValue(this.value).date) : false;
224
298
  const focused = isSameDay(date, this.focusedDate);
225
299
  const today = isSameDay(date, /* @__PURE__ */ new Date());
226
300
  const outOfRange = this.isOutOfRange(date);
@@ -249,11 +323,17 @@ var UDatePicker = class UDatePicker extends UFormControlElement {
249
323
  const iso = toISODate(date);
250
324
  this.renderRoot.querySelector(`button.day[data-iso="${iso}"]`)?.focus();
251
325
  }
252
- selectDay(date) {
326
+ /** `timeOverride` lets a caller force the time-of-day (the "today" quick action wants
327
+ * "right now", overriding whatever time was previously set) — a plain day-cell click omits
328
+ * it, which preserves the existing time-of-day (or `pendingTime`) so switching the date
329
+ * alone doesn't clobber a time the user already picked. */
330
+ selectDay(date, timeOverride) {
253
331
  if (this.isOutOfRange(date)) return;
254
- const iso = toISODate(date);
332
+ const time = timeOverride ?? (this.value ? splitValue(this.value).time : this.pendingTime);
333
+ const iso = buildValue(date, this.mode, time);
255
334
  const changed = iso !== this.value;
256
335
  this.value = iso;
336
+ if (this.mode === "datetime") this.pendingTime = time;
257
337
  if (changed) this.emitChange();
258
338
  this.popoverEl?.hide();
259
339
  this.containerEl?.focus();
@@ -271,6 +351,11 @@ var UDatePicker = class UDatePicker extends UFormControlElement {
271
351
  if (next.getMonth() !== this.viewDate.getMonth() || next.getFullYear() !== this.viewDate.getFullYear()) this.viewDate = startOfMonth(next);
272
352
  this.focusedDate = next;
273
353
  }
354
+ resetValue() {
355
+ const hadValue = !!this.value;
356
+ this.value = void 0;
357
+ if (hadValue) this.emitChange();
358
+ }
274
359
  emitChange() {
275
360
  if (!this.novalidate) this.validate();
276
361
  this.dispatchEvent(new Event("change", {
@@ -284,10 +369,10 @@ var UDatePicker = class UDatePicker extends UFormControlElement {
284
369
  if (this.required && !this.value) {
285
370
  flags = { valueMissing: true };
286
371
  message = Locale.getValue("valueMissing");
287
- } else if (this.value && this.min && parseISODate(this.value).getTime() < parseISODate(this.min).getTime()) {
372
+ } else if (this.value && this.min && splitValue(this.value).date.getTime() < parseISODate(this.min).getTime()) {
288
373
  flags = { rangeUnderflow: true };
289
374
  message = Locale.getValue("rangeUnderflow", { min: this.min });
290
- } else if (this.value && this.max && parseISODate(this.value).getTime() > parseISODate(this.max).getTime()) {
375
+ } else if (this.value && this.max && splitValue(this.value).date.getTime() > parseISODate(this.max).getTime()) {
291
376
  flags = { rangeOverflow: true };
292
377
  message = Locale.getValue("rangeOverflow", { max: this.max });
293
378
  }
@@ -308,6 +393,10 @@ var UDatePicker = class UDatePicker extends UFormControlElement {
308
393
  this.containerEl?.blur();
309
394
  }
310
395
  };
396
+ __decorate([property({
397
+ type: String,
398
+ reflect: true
399
+ }), __decorateMetadata("design:type", Object)], UDatePicker.prototype, "mode", void 0);
311
400
  __decorate([property({ type: String }), __decorateMetadata("design:type", String)], UDatePicker.prototype, "min", void 0);
312
401
  __decorate([property({ type: String }), __decorateMetadata("design:type", String)], UDatePicker.prototype, "max", void 0);
313
402
  __decorate([property({
@@ -320,6 +409,7 @@ __decorate([query("u-popover", true), __decorateMetadata("design:type", typeof U
320
409
  __decorate([state(), __decorateMetadata("design:type", Boolean)], UDatePicker.prototype, "open", void 0);
321
410
  __decorate([state(), __decorateMetadata("design:type", typeof Date === "undefined" ? Object : Date)], UDatePicker.prototype, "viewDate", void 0);
322
411
  __decorate([state(), __decorateMetadata("design:type", typeof Date === "undefined" ? Object : Date)], UDatePicker.prototype, "focusedDate", void 0);
412
+ __decorate([state(), __decorateMetadata("design:type", String)], UDatePicker.prototype, "pendingTime", void 0);
323
413
  UDatePicker = __decorate([customElement("u-date-picker")], UDatePicker);
324
414
  //#endregion
325
415
  export { UDatePicker };
@@ -142,6 +142,35 @@ var styles = css`
142
142
  color: var(--u-txt-color-disabled, #BDBDBD);
143
143
  cursor: not-allowed;
144
144
  }
145
+
146
+ .calendar-time {
147
+ display: flex;
148
+ justify-content: flex-end;
149
+ padding: 4px 4px 0;
150
+ }
151
+ .time-input {
152
+ font-family: inherit;
153
+ font-size: 0.9em;
154
+ padding: 2px 6px;
155
+ border: 1px solid var(--u-input-border-color, #E0E0E0);
156
+ border-radius: 0.25em;
157
+ background-color: var(--u-input-bg-color, #FFFFFF);
158
+ color: var(--u-txt-color, #212121);
159
+ }
160
+ .time-input:focus-visible {
161
+ outline: none;
162
+ box-shadow: 0 0 0 1px var(--u-input-border-color-focus, #1565C0);
163
+ }
164
+
165
+ .calendar-footer {
166
+ display: flex;
167
+ justify-content: space-between;
168
+ align-items: center;
169
+ gap: 8px;
170
+ padding-top: 8px;
171
+ margin-top: 4px;
172
+ border-top: 1px solid var(--u-border-color-weak, #EEEEEE);
173
+ }
145
174
  `;
146
175
  //#endregion
147
176
  export { styles };
@@ -1,5 +1,5 @@
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";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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.146.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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.146.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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.146.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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";
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.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";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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";
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.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";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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.146.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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.146.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorate.js";
4
4
  import "../button/UButton.js";
5
5
  import "../icon/UIcon.js";
6
6
  import "../tooltip/UTooltip.js";
@@ -1,5 +1,5 @@
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";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorate.js";
3
3
  import { UFormControlElement } from "../UFormControlElement.js";
4
4
  import "../spinner/USpinner.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.146.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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.146.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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.146.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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.146.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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,6 @@
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";
1
+ import { isCoarsePointer } from "../../utilities/elements.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorate.js";
3
4
  import { UFloatingElement } from "../UFloatingElement.js";
4
5
  import { arrayAttrConverter } from "../../utilities/converters.js";
5
6
  import { styles } from "./UPopover.styles.js";
@@ -47,15 +48,23 @@ var UPopover = class UPopover extends UFloatingElement {
47
48
  };
48
49
  this.handleAnchorPointerEnter = (e) => {
49
50
  this.cancelSafeTimer();
51
+ if (isCoarsePointer(e)) {
52
+ if (this.open) this.hide();
53
+ else this.show(e.currentTarget);
54
+ return;
55
+ }
50
56
  this.show(e.currentTarget);
51
57
  };
52
- this.handleAnchorPointerLeave = () => {
58
+ this.handleAnchorPointerLeave = (e) => {
59
+ if (isCoarsePointer(e)) return;
53
60
  this.startSafeTimer();
54
61
  };
55
- this.handlePopoverPointerEnter = () => {
62
+ this.handlePopoverPointerEnter = (e) => {
63
+ if (isCoarsePointer(e)) return;
56
64
  this.cancelSafeTimer();
57
65
  };
58
- this.handlePopoverPointerLeave = () => {
66
+ this.handlePopoverPointerLeave = (e) => {
67
+ if (isCoarsePointer(e)) return;
59
68
  this.startSafeTimer();
60
69
  };
61
70
  this.handleAnchorFocusIn = (e) => {
@@ -1,6 +1,6 @@
1
1
  import { UElement } from "../UElement.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";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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.146.0/helpers/esm/decorateMetadata.js";
3
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
2
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
3
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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.146.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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.146.0/helpers/esm/decorateMetadata.js";
2
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.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";
@@ -1,5 +1,5 @@
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";
1
+ import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorateMetadata.js";
2
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorate.js";
3
3
  import { UFormControlElement } from "../UFormControlElement.js";
4
4
  import "../spinner/USpinner.js";
5
5
  import "../icon/UIcon.js";