@sbb-esta/lyne-elements-dev 4.13.0-dev.1780293313 → 4.13.0-dev.1780308350

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.
@@ -1 +1 @@
1
- {"version":3,"file":"time-input.component.d.ts","sourceRoot":"","sources":["../../../../src/elements/time-input/time-input.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAuB,MAAM,KAAK,CAAC;AAI/D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;;AAsBtD;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,wBAAuC;IAC9E,gBAAgC,WAAW,EAAE,MAAM,CAAoB;IACvE,OAAuB,MAAM,EAAE,cAAc,CAAoB;IAEjE;;;OAGG;IACH,IAAoB,KAAK,CAAC,KAAK,EAAE,MAAM,EAYtC;IACD,IAAoB,KAAK,IAAI,MAAM,CAElC;IAED,iDAAiD;IACjD,IACW,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAcvC;IACD,IAAW,WAAW,IAAI,IAAI,GAAG,IAAI,CASpC;IACD,OAAO,CAAC,YAAY,CAAC,CAAc;IAEnC;;;OAGG;IACH,OAAO,CAAC,WAAW,CAAC,CAAwB;IAE5C,OAAO,CAAC,SAAS,CAAmC;;IAWpC,iBAAiB,IAAI,IAAI;IAMzB,oBAAoB,IAAI,IAAI;cAIzB,eAAe,IAAI,IAAI;IAM1C,OAAO,CAAC,cAAc;IAOtB,kDAAkD;IAClD,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,WAAW;cAUA,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;cAMvC,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO;cAOtD,QAAQ,IAAI,IAAI;IAanC,OAAO,CAAC,qBAAqB;IAI7B,uFAAuF;IACvF,OAAO,CAAC,YAAY;IAIpB,qDAAqD;IACrD,OAAO,CAAC,kBAAkB;IAgC1B,OAAO,CAAC,aAAa;CAItB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAE7B,gBAAgB,EAAE,mBAAmB,CAAC;KACvC;CACF"}
1
+ {"version":3,"file":"time-input.component.d.ts","sourceRoot":"","sources":["../../../../src/elements/time-input/time-input.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAuB,MAAM,KAAK,CAAC;AAI/D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;;AAsBtD;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,wBAAuC;IAC9E,gBAAgC,WAAW,EAAE,MAAM,CAAoB;IACvE,OAAuB,MAAM,EAAE,cAAc,CAAoB;IAEjE;;;OAGG;IACH,IAAoB,KAAK,CAAC,KAAK,EAAE,MAAM,EAYtC;IACD,IAAoB,KAAK,IAAI,MAAM,CAElC;IAED,iDAAiD;IACjD,IACW,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,EAoBxC;IACD,IAAW,WAAW,IAAI,IAAI,GAAG,IAAI,CASpC;IACD,OAAO,CAAC,YAAY,CAAC,CAAc;IAEnC;;;OAGG;IACH,OAAO,CAAC,WAAW,CAAC,CAAwB;IAE5C,OAAO,CAAC,SAAS,CAAmC;;IAWpC,iBAAiB,IAAI,IAAI;IAMzB,oBAAoB,IAAI,IAAI;cAIzB,eAAe,IAAI,IAAI;IAM1C,OAAO,CAAC,cAAc;IAOtB,kDAAkD;IAClD,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,WAAW;cAUA,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;cAMvC,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO;cAOtD,QAAQ,IAAI,IAAI;IAanC,OAAO,CAAC,qBAAqB;IAI7B,uFAAuF;IACvF,OAAO,CAAC,YAAY;IAIpB,qDAAqD;IACrD,OAAO,CAAC,kBAAkB;IAgC1B,OAAO,CAAC,aAAa;CAItB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAE7B,gBAAgB,EAAE,mBAAmB,CAAC;KACvC;CACF"}
@@ -1,2 +1,2 @@
1
- import { t as SbbTimeInputElement } from "../time-input.component-BZ-9meEb.js";
1
+ import { t as SbbTimeInputElement } from "../time-input.component-BgsJfVZ1.js";
2
2
  export { SbbTimeInputElement };
@@ -0,0 +1,198 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { isServer, unsafeCSS } from "lit";
3
+ import { property } from "lit/decorators.js";
4
+ import { SbbElement } from "./core/base-elements.js";
5
+ import { SbbFormAssociatedInputMixin } from "./core/mixins.js";
6
+ import { SbbLanguageController } from "./core/controllers.js";
7
+ import { i18nTimeInputChange, i18nTimeInvalid, i18nTimeMax, i18nTimeMaxLength } from "./core/i18n.js";
8
+ import { sbbLiveAnnouncer } from "./core/a11y.js";
9
+ //#region src/elements/time-input/time-input.scss?inline
10
+ var time_input_default = ":host {\n display: inline-flex;\n min-width: var(--sbb-time-input-max-width);\n max-width: var(--sbb-time-input-max-width);\n cursor: text;\n align-items: center;\n font-weight: normal;\n}\n@media (forced-colors: active) {\n :host {\n color: FieldText;\n }\n}\n\n:host(:disabled) {\n cursor: var(--sbb-cursor-default);\n}\n\n:host(:focus) {\n text-overflow: initial !important;\n}\n\n:host(:empty)::after {\n content: attr(placeholder);\n color: var(--sbb-color-5);\n -webkit-text-fill-color: var(--sbb-color-5);\n opacity: 1;\n}\n@media (forced-colors: active) {\n :host(:empty)::after {\n color: GrayText;\n }\n}";
11
+ //#endregion
12
+ //#region src/elements/time-input/time-input.component.ts
13
+ var REGEX_ALLOWED_CHARACTERS = /[0-9.:,\-;_hH]/;
14
+ var REGEX_DISALLOWED_CHARACTERS = /[^0-9.:,\-;_hH]/g;
15
+ var REGEX_GROUPS_WITHOUT_COLON = /^([0-9]{1,2})([0-9]{2})$/;
16
+ var REGEX_GROUPS_WITH_COLON = /^([0-9]{1,2})?[.:,\-;_hH]?([0-9]{1,2})?$/;
17
+ /**
18
+ * Custom input for a time.
19
+ */
20
+ var SbbTimeInputElement = (() => {
21
+ let _classSuper = SbbFormAssociatedInputMixin(SbbElement);
22
+ let _instanceExtraInitializers = [];
23
+ let _set_valueAsDate_decorators;
24
+ return class SbbTimeInputElement extends _classSuper {
25
+ static {
26
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
27
+ _set_valueAsDate_decorators = [property({ attribute: false })];
28
+ __esDecorate(this, null, _set_valueAsDate_decorators, {
29
+ kind: "setter",
30
+ name: "valueAsDate",
31
+ static: false,
32
+ private: false,
33
+ access: {
34
+ has: (obj) => "valueAsDate" in obj,
35
+ set: (obj, value) => {
36
+ obj.valueAsDate = value;
37
+ }
38
+ },
39
+ metadata: _metadata
40
+ }, null, _instanceExtraInitializers);
41
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, {
42
+ enumerable: true,
43
+ configurable: true,
44
+ writable: true,
45
+ value: _metadata
46
+ });
47
+ }
48
+ static {
49
+ this.elementName = "sbb-time-input";
50
+ }
51
+ static {
52
+ this.styles = unsafeCSS(time_input_default);
53
+ }
54
+ /**
55
+ * The value of the time input. Reflects the current text value
56
+ * of this input.
57
+ */
58
+ set value(value) {
59
+ value = typeof value === "string" ? value.replace(REGEX_DISALLOWED_CHARACTERS, "").substring(0, 5) : "";
60
+ this._tryParseValue(value);
61
+ if (!isServer && !this.isSelected() && this.valueAsDate !== null) value = this._formatTime();
62
+ super.value = value;
63
+ }
64
+ get value() {
65
+ return super.value ?? "";
66
+ }
67
+ /** Formats the current input's value as date. */
68
+ set valueAsDate(value) {
69
+ const time = this._toTime(value);
70
+ if (this.isSelected() && (time === null || this._isSameTime(time, this._parseValue(this.value)))) {} else if (time) {
71
+ this._valueAsTime = time;
72
+ const formattedValue = this._formatTime();
73
+ if (this.value !== formattedValue) this.value = formattedValue;
74
+ } else {
75
+ this._valueAsTime = null;
76
+ this.value = "";
77
+ }
78
+ }
79
+ get valueAsDate() {
80
+ if (this._valueAsTime && this._isTimeValid(this._valueAsTime)) {
81
+ const date = /* @__PURE__ */ new Date(0);
82
+ date.setHours(this._valueAsTime.hours);
83
+ date.setMinutes(this._valueAsTime.minutes);
84
+ return date;
85
+ } else return null;
86
+ }
87
+ constructor() {
88
+ super();
89
+ this._valueAsTime = __runInitializers(this, _instanceExtraInitializers);
90
+ this._language = new SbbLanguageController(this);
91
+ this.addEventListener?.("change", () => this._updateValueDateFormat(), { capture: true });
92
+ this.addEventListener?.("change", () => sbbLiveAnnouncer.announce(i18nTimeInputChange(this.value)[this._language.current]));
93
+ this.addEventListener?.("keydown", (event) => this._preventCharInsert(event));
94
+ }
95
+ connectedCallback() {
96
+ super.connectedCallback();
97
+ this.inputMode ||= "numeric";
98
+ this.placeholder ||= "HH:MM";
99
+ }
100
+ disconnectedCallback() {
101
+ super.disconnectedCallback();
102
+ }
103
+ updateFormValue() {
104
+ this._tryParseValue();
105
+ const formValue = this.valueAsDate !== null ? this._formatTime() : null;
106
+ this.internals.setFormValue(formValue, this.value);
107
+ }
108
+ _tryParseValue(value = this.value) {
109
+ if (this._valueCache?.[0] !== value) {
110
+ this._valueAsTime = this._parseValue(value);
111
+ this._valueCache = [value, this._valueAsTime ?? null];
112
+ }
113
+ }
114
+ /** Validate input against the defined RegExps. */
115
+ _parseValue(value) {
116
+ const trimmedValue = value?.trim();
117
+ if (!trimmedValue) return null;
118
+ const match = trimmedValue.match(REGEX_GROUPS_WITHOUT_COLON) ?? trimmedValue.match(REGEX_GROUPS_WITH_COLON);
119
+ if (match) return {
120
+ hours: +match[1] || 0,
121
+ minutes: +match[2] || 0
122
+ };
123
+ return null;
124
+ }
125
+ _toTime(value) {
126
+ return value instanceof Date && !isNaN(value.valueOf()) ? {
127
+ hours: value.getHours(),
128
+ minutes: value.getMinutes()
129
+ } : null;
130
+ }
131
+ _isSameTime(time1, time2) {
132
+ return !!(time1 == time2 || time1 && time2 && time1.hours === time2.hours && time1.minutes === time2.minutes);
133
+ }
134
+ _updateValueDateFormat() {
135
+ if (this.valueAsDate) {
136
+ const formattedDate = this._formatTime();
137
+ if (this.value !== formattedDate) super.value = formattedDate;
138
+ }
139
+ }
140
+ _formatTime() {
141
+ const value = this.valueAsDate;
142
+ if (!value) return "";
143
+ return `${String(value.getHours()).padStart(2, "0")}:${String(value.getMinutes()).padStart(2, "0")}`;
144
+ }
145
+ preparePastedText(text) {
146
+ return text.replace(REGEX_DISALLOWED_CHARACTERS, "").substring(0, 5 - (this.textContent?.length ?? 0));
147
+ }
148
+ shouldValidate(name) {
149
+ return super.shouldValidate(name) || [
150
+ "valueAsDate",
151
+ "min",
152
+ "max",
153
+ "dateFilter"
154
+ ].includes(name);
155
+ }
156
+ validate() {
157
+ super.validate();
158
+ if (!this.value) this._removeValidityErrors();
159
+ else if (!this._valueAsTime) this.setValidityFlag("badInput", i18nTimeInvalid[this.language.current]);
160
+ else if (!this._isTimeValid(this._valueAsTime)) this.setValidityFlag("rangeOverflow", i18nTimeMax[this.language.current]);
161
+ else this._removeValidityErrors();
162
+ }
163
+ _removeValidityErrors() {
164
+ ["badInput", "rangeOverflow"].forEach((f) => this.removeValidityFlag(f));
165
+ }
166
+ /** Checks if values of hours and minutes are possible, to avoid non-existent times. */
167
+ _isTimeValid(time) {
168
+ return time.hours < 24 && time.minutes < 60;
169
+ }
170
+ /** Only allow typing numbers and separator keys. */
171
+ _preventCharInsert(event) {
172
+ if (event.ctrlKey || event.altKey || event.metaKey || [
173
+ "Backspace",
174
+ "Tab",
175
+ "Enter",
176
+ "ArrowUp",
177
+ "ArrowDown",
178
+ "ArrowLeft",
179
+ "ArrowRight",
180
+ "Home",
181
+ "End",
182
+ "PageUp",
183
+ "PageDown",
184
+ "Delete"
185
+ ].includes(event.key) || REGEX_ALLOWED_CHARACTERS.test(event.key) && (this.value.length < 5 || this._hasSelection())) return;
186
+ event.preventDefault();
187
+ if (this.value.length >= 5) sbbLiveAnnouncer.announce(i18nTimeMaxLength[this._language.current]);
188
+ }
189
+ _hasSelection() {
190
+ const range = window.getSelection()?.getRangeAt(0);
191
+ return !!range && range.startOffset !== range.endOffset;
192
+ }
193
+ };
194
+ })();
195
+ //#endregion
196
+ export { SbbTimeInputElement as t };
197
+
198
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1pbnB1dC5jb21wb25lbnQtQmdzSmZWWjEuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3RpbWUtaW5wdXQvdGltZS1pbnB1dC5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy90aW1lLWlucHV0L3RpbWUtaW5wdXQuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJy4uL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5cbjpob3N0IHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG5cbiAgLy8gV2l0aCBzYmItZm9ybS1maWVsZFt3aWR0aD1cImNvbGxhcHNlZFwiXSwgdGhlIGRlZmF1bHQgbWluIHdpZHRoIG9mIGFcbiAgLy8gYW4gaW5saW5lIGVsZW1lbnQgaXMgYmFzaWNhbGx5IG5vdGhpbmcgKGV4Y2VwdCBwb3RlbnRpYWxseSB0aGUgcGxhY2Vob2xkZXIpLlxuICAvLyBEdWUgdG8gdGhpcywgd2Ugc2V0IGEgbWluaW11bSB3aWR0aCBmb3IgdGhlIHRpbWUgaW5wdXQgZWxlbWVudC5cbiAgLy8gV2UgYWxzbyBjYW5ub3QgdXNlIHdpZHRoLCBhcyB0aGUgZm9ybSBmaWVsZCBvdmVyd3JpdGVzIHRoYXQgcHJvcGVydHkuXG4gIG1pbi13aWR0aDogdmFyKC0tc2JiLXRpbWUtaW5wdXQtbWF4LXdpZHRoKTtcblxuICAvLyBUaGUgdGltZSBpbnB1dCBhbHNvIGhhcyBhIHZlcnkgc3BlY2lmaWMgZGltZW5zaW9uLCBzbyB3ZSBhbHNvIHNldCB0aGUgbWF4aW11bSB3aWR0aC5cbiAgbWF4LXdpZHRoOiB2YXIoLS1zYmItdGltZS1pbnB1dC1tYXgtd2lkdGgpO1xuICBjdXJzb3I6IHRleHQ7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG5cbiAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgIGNvbG9yOiBGaWVsZFRleHQ7XG4gIH1cbn1cblxuOmhvc3QoOmRpc2FibGVkKSB7XG4gIGN1cnNvcjogdmFyKC0tc2JiLWN1cnNvci1kZWZhdWx0KTtcbn1cblxuOmhvc3QoOmZvY3VzKSB7XG4gIHRleHQtb3ZlcmZsb3c6IGluaXRpYWwgIWltcG9ydGFudDtcbn1cblxuOmhvc3QoOmVtcHR5KTo6YWZ0ZXIge1xuICBjb250ZW50OiBhdHRyKHBsYWNlaG9sZGVyKTtcbiAgQGluY2x1ZGUgc2JiLnBsYWNlaG9sZGVyO1xuICBAaW5jbHVkZSBzYmIuaWYtZm9yY2VkLWNvbG9ycyB7XG4gICAgY29sb3I6IEdyYXlUZXh0O1xuICB9XG59XG4iLCJpbXBvcnQgeyB0eXBlIENTU1Jlc3VsdEdyb3VwLCBpc1NlcnZlciwgdW5zYWZlQ1NTIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBzYmJMaXZlQW5ub3VuY2VyIH0gZnJvbSAnLi4vY29yZS9hMTF5LnRzJztcbmltcG9ydCB7IFNiYkVsZW1lbnQgfSBmcm9tICcuLi9jb3JlL2Jhc2UtZWxlbWVudHMudHMnO1xuaW1wb3J0IHsgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnLi4vY29yZS9jb250cm9sbGVycy50cyc7XG5pbXBvcnQge1xuICBpMThuVGltZUlucHV0Q2hhbmdlLFxuICBpMThuVGltZUludmFsaWQsXG4gIGkxOG5UaW1lTWF4LFxuICBpMThuVGltZU1heExlbmd0aCxcbn0gZnJvbSAnLi4vY29yZS9pMThuLnRzJztcbmltcG9ydCB7IFNiYkZvcm1Bc3NvY2lhdGVkSW5wdXRNaXhpbiB9IGZyb20gJy4uL2NvcmUvbWl4aW5zLnRzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vdGltZS1pbnB1dC5zY3NzP2lubGluZSc7XG5cbmNvbnN0IFJFR0VYX0FMTE9XRURfQ0hBUkFDVEVSUyA9IC9bMC05LjosXFwtO19oSF0vO1xuY29uc3QgUkVHRVhfRElTQUxMT1dFRF9DSEFSQUNURVJTID0gL1teMC05LjosXFwtO19oSF0vZztcbmNvbnN0IFJFR0VYX0dST1VQU19XSVRIT1VUX0NPTE9OID0gL14oWzAtOV17MSwyfSkoWzAtOV17Mn0pJC87XG5jb25zdCBSRUdFWF9HUk9VUFNfV0lUSF9DT0xPTiA9IC9eKFswLTldezEsMn0pP1suOixcXC07X2hIXT8oWzAtOV17MSwyfSk/JC87XG5cbmludGVyZmFjZSBUaW1lIHtcbiAgaG91cnM6IG51bWJlcjtcbiAgbWludXRlczogbnVtYmVyO1xufVxuXG4vKipcbiAqIEN1c3RvbSBpbnB1dCBmb3IgYSB0aW1lLlxuICovXG5leHBvcnQgY2xhc3MgU2JiVGltZUlucHV0RWxlbWVudCBleHRlbmRzIFNiYkZvcm1Bc3NvY2lhdGVkSW5wdXRNaXhpbihTYmJFbGVtZW50KSB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgZWxlbWVudE5hbWU6IHN0cmluZyA9ICdzYmItdGltZS1pbnB1dCc7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHVuc2FmZUNTUyhzdHlsZSk7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgdGltZSBpbnB1dC4gUmVmbGVjdHMgdGhlIGN1cnJlbnQgdGV4dCB2YWx1ZVxuICAgKiBvZiB0aGlzIGlucHV0LlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdmFsdWUgPVxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICA/IHZhbHVlLnJlcGxhY2UoUkVHRVhfRElTQUxMT1dFRF9DSEFSQUNURVJTLCAnJykuc3Vic3RyaW5nKDAsIDUpXG4gICAgICAgIDogJyc7XG4gICAgdGhpcy5fdHJ5UGFyc2VWYWx1ZSh2YWx1ZSk7XG4gICAgLy8gQXMgbG9uZyBhcyB0aGlzIGVsZW1lbnQgaGFzIGZvY3VzIHdlIGRlbGF5IGF1dG9tYXRpY2FsbHkgdXBkYXRpbmdcbiAgICAvLyB0aGUgdmFsdWUgd2l0aCB0aGUgZm9ybWF0dGVkIHN0cmluZyBvZiB0aGUgcGFyc2VkIGRhdGUuXG4gICAgaWYgKCFpc1NlcnZlciAmJiAhdGhpcy5pc1NlbGVjdGVkKCkgJiYgdGhpcy52YWx1ZUFzRGF0ZSAhPT0gbnVsbCkge1xuICAgICAgdmFsdWUgPSB0aGlzLl9mb3JtYXRUaW1lKCk7XG4gICAgfVxuICAgIHN1cGVyLnZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci52YWx1ZSA/PyAnJztcbiAgfVxuXG4gIC8qKiBGb3JtYXRzIHRoZSBjdXJyZW50IGlucHV0J3MgdmFsdWUgYXMgZGF0ZS4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiBmYWxzZSB9KVxuICBwdWJsaWMgc2V0IHZhbHVlQXNEYXRlKHZhbHVlOiBEYXRlIHwgbnVsbCkge1xuICAgIGNvbnN0IHRpbWUgPSB0aGlzLl90b1RpbWUodmFsdWUpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNTZWxlY3RlZCgpICYmXG4gICAgICAodGltZSA9PT0gbnVsbCB8fCB0aGlzLl9pc1NhbWVUaW1lKHRpbWUsIHRoaXMuX3BhcnNlVmFsdWUodGhpcy52YWx1ZSkpKVxuICAgICkge1xuICAgICAgLy8gRG8gbm90aGluZywgYXMgdGhlIHVzZXIgaXMgY3VycmVudGx5IGVkaXRpbmcgdGhlIHZhbHVlIGFuZCB0aGUgcGFyc2VkXG4gICAgICAvLyB0aW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgLy8gVGhpcyBjYW4gYWxzbyBoYXBwZW4gd2l0aCBBbmd1bGFyIEZvcm1zIFNpZ25hbHMsIGFzIGl0IGN1cnJlbnRseVxuICAgICAgLy8gY29udGludW91c2x5IGludm9rZXMgd3JpdGVWYWx1ZSwgd2hpY2ggYXNzaWducyB0byB0aGlzIHNldHRlci5cbiAgICB9IGVsc2UgaWYgKHRpbWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlQXNUaW1lID0gdGltZTtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5fZm9ybWF0VGltZSgpO1xuICAgICAgaWYgKHRoaXMudmFsdWUgIT09IGZvcm1hdHRlZFZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVBc1RpbWUgPSBudWxsO1xuICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlQXNEYXRlKCk6IERhdGUgfCBudWxsIHtcbiAgICBpZiAodGhpcy5fdmFsdWVBc1RpbWUgJiYgdGhpcy5faXNUaW1lVmFsaWQodGhpcy5fdmFsdWVBc1RpbWUpKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgICBkYXRlLnNldEhvdXJzKHRoaXMuX3ZhbHVlQXNUaW1lLmhvdXJzKTtcbiAgICAgIGRhdGUuc2V0TWludXRlcyh0aGlzLl92YWx1ZUFzVGltZS5taW51dGVzKTtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfdmFsdWVBc1RpbWU/OiBUaW1lIHwgbnVsbDtcblxuICAvKipcbiAgICogU3RvcmVzIHRoZSBsYXN0IHN0cmluZyBhbmQgcGFyc2VkIGRhdGUgb2JqZWN0IHZhbHVlIHRvIHByZXZlbnQgcmVwZWF0ZWRcbiAgICogcGFyc2luZyBvZiB0aGUgc3RyaW5nIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsdWVDYWNoZT86IFtzdHJpbmcsIFRpbWUgfCBudWxsXTtcblxuICBwcml2YXRlIF9sYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcyk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2NoYW5nZScsICgpID0+IHRoaXMuX3VwZGF0ZVZhbHVlRGF0ZUZvcm1hdCgpLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2NoYW5nZScsICgpID0+XG4gICAgICBzYmJMaXZlQW5ub3VuY2VyLmFubm91bmNlKGkxOG5UaW1lSW5wdXRDaGFuZ2UodGhpcy52YWx1ZSlbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0pLFxuICAgICk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2tleWRvd24nLCAoZXZlbnQpID0+IHRoaXMuX3ByZXZlbnRDaGFySW5zZXJ0KGV2ZW50KSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmlucHV0TW9kZSB8fD0gJ251bWVyaWMnO1xuICAgIHRoaXMucGxhY2Vob2xkZXIgfHw9ICdISDpNTSc7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5fdHJ5UGFyc2VWYWx1ZSgpO1xuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMudmFsdWVBc0RhdGUgIT09IG51bGwgPyB0aGlzLl9mb3JtYXRUaW1lKCkgOiBudWxsO1xuICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtVmFsdWUsIHRoaXMudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJ5UGFyc2VWYWx1ZSh2YWx1ZSA9IHRoaXMudmFsdWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdmFsdWVDYWNoZT8uWzBdICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWVBc1RpbWUgPSB0aGlzLl9wYXJzZVZhbHVlKHZhbHVlKTtcbiAgICAgIHRoaXMuX3ZhbHVlQ2FjaGUgPSBbdmFsdWUsIHRoaXMuX3ZhbHVlQXNUaW1lID8/IG51bGxdO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSBpbnB1dCBhZ2FpbnN0IHRoZSBkZWZpbmVkIFJlZ0V4cHMuICovXG4gIHByaXZhdGUgX3BhcnNlVmFsdWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRpbWUgfCBudWxsIHtcbiAgICBjb25zdCB0cmltbWVkVmFsdWUgPSB2YWx1ZT8udHJpbSgpO1xuICAgIGlmICghdHJpbW1lZFZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IHRoZSBpbnB1dCBpcyAzIG9yIDQgZGlnaXRzOyBzcGxpdCBsaWtlOiBBQj86Q0RcbiAgICBjb25zdCBtYXRjaCA9XG4gICAgICB0cmltbWVkVmFsdWUubWF0Y2goUkVHRVhfR1JPVVBTX1dJVEhPVVRfQ09MT04pID8/IHRyaW1tZWRWYWx1ZS5tYXRjaChSRUdFWF9HUk9VUFNfV0lUSF9DT0xPTik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4geyBob3VyczogK21hdGNoWzFdIHx8IDAsIG1pbnV0ZXM6ICttYXRjaFsyXSB8fCAwIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF90b1RpbWUodmFsdWU6IERhdGUgfCBudWxsKTogVGltZSB8IG51bGwge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHZhbHVlLnZhbHVlT2YoKSlcbiAgICAgID8geyBob3VyczogdmFsdWUuZ2V0SG91cnMoKSwgbWludXRlczogdmFsdWUuZ2V0TWludXRlcygpIH1cbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2lzU2FtZVRpbWUodGltZTE6IFRpbWUgfCBudWxsLCB0aW1lMjogVGltZSB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aW1lMSA9PSB0aW1lMiB8fFxuICAgICAgKHRpbWUxICYmIHRpbWUyICYmIHRpbWUxLmhvdXJzID09PSB0aW1lMi5ob3VycyAmJiB0aW1lMS5taW51dGVzID09PSB0aW1lMi5taW51dGVzKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVWYWx1ZURhdGVGb3JtYXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmFsdWVBc0RhdGUpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSB0aGlzLl9mb3JtYXRUaW1lKCk7XG4gICAgICBpZiAodGhpcy52YWx1ZSAhPT0gZm9ybWF0dGVkRGF0ZSkge1xuICAgICAgICBzdXBlci52YWx1ZSA9IGZvcm1hdHRlZERhdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZm9ybWF0VGltZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZUFzRGF0ZTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IGhvdXJzID0gU3RyaW5nKHZhbHVlLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgbWludXRlcyA9IFN0cmluZyh2YWx1ZS5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgcmV0dXJuIGAke2hvdXJzfToke21pbnV0ZXN9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVwYXJlUGFzdGVkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0ZXh0XG4gICAgICAucmVwbGFjZShSRUdFWF9ESVNBTExPV0VEX0NIQVJBQ1RFUlMsICcnKVxuICAgICAgLnN1YnN0cmluZygwLCA1IC0gKHRoaXMudGV4dENvbnRlbnQ/Lmxlbmd0aCA/PyAwKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2hvdWxkVmFsaWRhdGUobmFtZTogUHJvcGVydHlLZXkgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3VwZXIuc2hvdWxkVmFsaWRhdGUobmFtZSkgfHxcbiAgICAgIFsndmFsdWVBc0RhdGUnLCAnbWluJywgJ21heCcsICdkYXRlRmlsdGVyJ10uaW5jbHVkZXMobmFtZSBhcyBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB2YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICBzdXBlci52YWxpZGF0ZSgpO1xuICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy5fcmVtb3ZlVmFsaWRpdHlFcnJvcnMoKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLl92YWx1ZUFzVGltZSkge1xuICAgICAgdGhpcy5zZXRWYWxpZGl0eUZsYWcoJ2JhZElucHV0JywgaTE4blRpbWVJbnZhbGlkW3RoaXMubGFuZ3VhZ2UuY3VycmVudF0pO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzVGltZVZhbGlkKHRoaXMuX3ZhbHVlQXNUaW1lKSkge1xuICAgICAgdGhpcy5zZXRWYWxpZGl0eUZsYWcoJ3JhbmdlT3ZlcmZsb3cnLCBpMThuVGltZU1heFt0aGlzLmxhbmd1YWdlLmN1cnJlbnRdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVtb3ZlVmFsaWRpdHlFcnJvcnMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVWYWxpZGl0eUVycm9ycygpOiB2b2lkIHtcbiAgICAoWydiYWRJbnB1dCcsICdyYW5nZU92ZXJmbG93J10gYXMgY29uc3QpLmZvckVhY2goKGYpID0+IHRoaXMucmVtb3ZlVmFsaWRpdHlGbGFnKGYpKTtcbiAgfVxuXG4gIC8qKiBDaGVja3MgaWYgdmFsdWVzIG9mIGhvdXJzIGFuZCBtaW51dGVzIGFyZSBwb3NzaWJsZSwgdG8gYXZvaWQgbm9uLWV4aXN0ZW50IHRpbWVzLiAqL1xuICBwcml2YXRlIF9pc1RpbWVWYWxpZCh0aW1lOiBUaW1lKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRpbWUuaG91cnMgPCAyNCAmJiB0aW1lLm1pbnV0ZXMgPCA2MDtcbiAgfVxuXG4gIC8qKiAgT25seSBhbGxvdyB0eXBpbmcgbnVtYmVycyBhbmQgc2VwYXJhdG9yIGtleXMuICovXG4gIHByaXZhdGUgX3ByZXZlbnRDaGFySW5zZXJ0KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgYWx3YXlzQWxsb3dlZCA9IFtcbiAgICAgICdCYWNrc3BhY2UnLFxuICAgICAgJ1RhYicsXG4gICAgICAnRW50ZXInLFxuICAgICAgJ0Fycm93VXAnLFxuICAgICAgJ0Fycm93RG93bicsXG4gICAgICAnQXJyb3dMZWZ0JyxcbiAgICAgICdBcnJvd1JpZ2h0JyxcbiAgICAgICdIb21lJyxcbiAgICAgICdFbmQnLFxuICAgICAgJ1BhZ2VVcCcsXG4gICAgICAnUGFnZURvd24nLFxuICAgICAgJ0RlbGV0ZScsXG4gICAgXTtcblxuICAgIGlmIChcbiAgICAgIGV2ZW50LmN0cmxLZXkgfHxcbiAgICAgIGV2ZW50LmFsdEtleSB8fFxuICAgICAgZXZlbnQubWV0YUtleSB8fFxuICAgICAgYWx3YXlzQWxsb3dlZC5pbmNsdWRlcyhldmVudC5rZXkpIHx8XG4gICAgICAoUkVHRVhfQUxMT1dFRF9DSEFSQUNURVJTLnRlc3QoZXZlbnQua2V5KSAmJiAodGhpcy52YWx1ZS5sZW5ndGggPCA1IHx8IHRoaXMuX2hhc1NlbGVjdGlvbigpKSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0aGlzLnZhbHVlLmxlbmd0aCA+PSA1KSB7XG4gICAgICBzYmJMaXZlQW5ub3VuY2VyLmFubm91bmNlKGkxOG5UaW1lTWF4TGVuZ3RoW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYXNTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmFuZ2UgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk/LmdldFJhbmdlQXQoMCk7XG4gICAgcmV0dXJuICEhcmFuZ2UgJiYgcmFuZ2Uuc3RhcnRPZmZzZXQgIT09IHJhbmdlLmVuZE9mZnNldDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXRpbWUtaW5wdXQnOiBTYmJUaW1lSW5wdXRFbGVtZW50O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQ2dCQSxJQUFNLDJCQUEyQjtBQUNqQyxJQUFNLDhCQUE4QjtBQUNwQyxJQUFNLDZCQUE2QjtBQUNuQyxJQUFNLDBCQUEwQjs7OztJQVVuQiw2QkFBbUI7bUJBQVMsNEJBQTRCLFVBQVU7OztjQUFsRSw0QkFBNEIsWUFBdUM7OztrQ0EwQjdFLFNBQVMsRUFBRSxXQUFXLE1BQUssQ0FBRSxDQUFDO0dBQy9CLGFBQUEsTUFBQSxNQUFBLDZCQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEsaUJBQUE7S0FBQSxNQUFBLEtBQUEsVUFBQTtNQUFBLElBQVcsY0FBVztLQUFBO0lBQUE7SUFBQSxVQUFBO0dBQUEsR0FBQSxNQUFBLDBCQUFBOzs7Ozs7Ozs7R0ExQlUsS0FBQSxjQUFzQjtFQUFpQjs7R0FDaEQsS0FBQSxTQUF5QixVQUFVLGtCQUFLO0VBQUU7Ozs7O0VBTWpFLElBQW9CLE1BQU0sT0FBYTtHQUNyQyxRQUNFLE9BQU8sVUFBVSxXQUNiLE1BQU0sUUFBUSw2QkFBNkIsRUFBRSxFQUFFLFVBQVUsR0FBRyxDQUFDLElBQzdEO0dBQ04sS0FBSyxlQUFlLEtBQUs7R0FHekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLFdBQVUsS0FBTSxLQUFLLGdCQUFnQixNQUMxRCxRQUFRLEtBQUssWUFBVztHQUUxQixNQUFN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
@@ -1,4 +1,4 @@
1
- import { t as SbbTimeInputElement } from "./time-input.component-BZ-9meEb.js";
1
+ import { t as SbbTimeInputElement } from "./time-input.component-BgsJfVZ1.js";
2
2
  import "./time-input.pure.js";
3
3
  //#region src/elements/time-input.ts
4
4
  /** @entrypoint */
@@ -1,2 +1,2 @@
1
- import { t as SbbTimeInputElement } from "./time-input.component-BZ-9meEb.js";
1
+ import { t as SbbTimeInputElement } from "./time-input.component-BgsJfVZ1.js";
2
2
  export { SbbTimeInputElement };
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@sbb-esta/lyne-elements-dev",
3
- "version": "4.13.0-dev.1780293313",
3
+ "version": "4.13.0-dev.1780308350",
4
4
  "description": "Lyne Design System",
5
5
  "keywords": [
6
6
  "design system",
7
7
  "web components",
8
8
  "lit",
9
- "https://github.com/sbb-design-systems/lyne-components/commit/8a91f9a0d59fb29432a114e1e2c67a27ffe3c37d"
9
+ "https://github.com/sbb-design-systems/lyne-components/commit/d00e13eb999bcaa5f1191a96cb6562270237d9d2"
10
10
  ],
11
11
  "type": "module",
12
12
  "exports": {
@@ -1,2 +1,2 @@
1
- import { t as e } from "../time-input.component-I1it887_.js";
1
+ import { t as e } from "../time-input.component-DBXdyVPm.js";
2
2
  export { e as SbbTimeInputElement };
@@ -38,19 +38,17 @@ var p = ":host{display:inline-flex;min-width:var(--sbb-time-input-max-width);max
38
38
  this.styles = r(p);
39
39
  }
40
40
  set value(e) {
41
- e = typeof e == "string" ? e.replace(h, "").substring(0, 5) : "", this._tryParseValue(e), !n && !this.matches(":focus") && this.valueAsDate !== null && (e = this._formatTime()), super.value = e;
41
+ e = typeof e == "string" ? e.replace(h, "").substring(0, 5) : "", this._tryParseValue(e), !n && !this.isSelected() && this.valueAsDate !== null && (e = this._formatTime()), super.value = e;
42
42
  }
43
43
  get value() {
44
44
  return super.value ?? "";
45
45
  }
46
46
  set valueAsDate(e) {
47
- if (e instanceof Date && !isNaN(e.valueOf())) {
48
- this._valueAsTime = {
49
- hours: e.getHours(),
50
- minutes: e.getMinutes()
51
- };
52
- let t = this._formatTime();
53
- this.value !== t && (this.value = t);
47
+ let t = this._toTime(e);
48
+ if (!(this.isSelected() && (t === null || this._isSameTime(t, this._parseValue(this.value))))) if (t) {
49
+ this._valueAsTime = t;
50
+ let e = this._formatTime();
51
+ this.value !== e && (this.value = e);
54
52
  } else this._valueAsTime = null, this.value = "";
55
53
  }
56
54
  get valueAsDate() {
@@ -85,6 +83,15 @@ var p = ":host{display:inline-flex;min-width:var(--sbb-time-input-max-width);max
85
83
  minutes: +n[2] || 0
86
84
  } : null;
87
85
  }
86
+ _toTime(e) {
87
+ return e instanceof Date && !isNaN(e.valueOf()) ? {
88
+ hours: e.getHours(),
89
+ minutes: e.getMinutes()
90
+ } : null;
91
+ }
92
+ _isSameTime(e, t) {
93
+ return !!(e == t || e && t && e.hours === t.hours && e.minutes === t.minutes);
94
+ }
88
95
  _updateValueDateFormat() {
89
96
  if (this.valueAsDate) {
90
97
  let e = this._formatTime();
package/time-input.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as e } from "./time-input.component-I1it887_.js";
1
+ import { t as e } from "./time-input.component-DBXdyVPm.js";
2
2
  import "./time-input.pure.js";
3
3
  //#region src/elements/time-input.ts
4
4
  e.define();
@@ -1,2 +1,2 @@
1
- import { t as e } from "./time-input.component-I1it887_.js";
1
+ import { t as e } from "./time-input.component-DBXdyVPm.js";
2
2
  export { e as SbbTimeInputElement };