mlform 0.1.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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -0
  3. package/dist/FieldStrategy-pPekBtH-.js +2318 -0
  4. package/dist/ModelTypes-B9_veCKB.js +5 -0
  5. package/dist/ReportStrategy-DY3GC_mJ.js +23 -0
  6. package/dist/boolean-field-Cd3uhIPj.js +104 -0
  7. package/dist/category-field-D_Ms1x9u.js +73 -0
  8. package/dist/classifier-prediction-C5QzorTo.js +193 -0
  9. package/dist/custom-element-ttkHUa8w.js +13 -0
  10. package/dist/date-field-Cg_ja679.js +162 -0
  11. package/dist/error-card-BwjPChwf.js +195 -0
  12. package/dist/field-wrapper-DqIQl76d.js +177 -0
  13. package/dist/ml-layout-Dx63KKf7.js +332 -0
  14. package/dist/mlform/extensions.mjs +38 -0
  15. package/dist/mlform/strategies.mjs +292 -0
  16. package/dist/mlform.mjs +709 -0
  17. package/dist/number-field-CC2DrVEb.js +165 -0
  18. package/dist/property-jKFNMQpR.js +561 -0
  19. package/dist/range-field-Cr7LEtsJ.js +98 -0
  20. package/dist/regressor-prediction-C18dHlfK.js +236 -0
  21. package/dist/src/core/app/DescriptorItem.d.ts +6 -0
  22. package/dist/src/core/app/DescriptorRegistry.d.ts +13 -0
  23. package/dist/src/core/app/DescriptorService.d.ts +22 -0
  24. package/dist/src/core/app/DescriptorStrategy.d.ts +11 -0
  25. package/dist/src/core/app/index.d.ts +4 -0
  26. package/dist/src/core/domain/index.d.ts +24 -0
  27. package/dist/src/core/index.d.ts +3 -0
  28. package/dist/src/core/ui/error-card.d.ts +38 -0
  29. package/dist/src/core/ui/field-wrapper.d.ts +23 -0
  30. package/dist/src/core/ui/index.d.ts +3 -0
  31. package/dist/src/core/ui/ml-layout.d.ts +23 -0
  32. package/dist/src/extensions/app/FieldStrategy.d.ts +10 -0
  33. package/dist/src/extensions/app/ReportStrategy.d.ts +9 -0
  34. package/dist/src/extensions/app/index.d.ts +2 -0
  35. package/dist/src/extensions/domain/BaseField.d.ts +7 -0
  36. package/dist/src/extensions/domain/BaseModel.d.ts +6 -0
  37. package/dist/src/extensions/domain/index.d.ts +2 -0
  38. package/dist/src/extensions/index.d.ts +3 -0
  39. package/dist/src/extensions/ui/field-element.d.ts +9 -0
  40. package/dist/src/extensions/ui/index.d.ts +1 -0
  41. package/dist/src/index.d.ts +1 -0
  42. package/dist/src/mlform/index.d.ts +1 -0
  43. package/dist/src/mlform/mlform.d.ts +27 -0
  44. package/dist/src/mlform/mlform.types.d.ts +11 -0
  45. package/dist/src/strategies/app/BooleanStrategy.d.ts +12 -0
  46. package/dist/src/strategies/app/CategoryStrategy.d.ts +13 -0
  47. package/dist/src/strategies/app/ClassifierStrategy.d.ts +15 -0
  48. package/dist/src/strategies/app/DateStrategy.d.ts +15 -0
  49. package/dist/src/strategies/app/NumberStrategy.d.ts +29 -0
  50. package/dist/src/strategies/app/RegressorStrategy.d.ts +15 -0
  51. package/dist/src/strategies/app/TextStrategy.d.ts +16 -0
  52. package/dist/src/strategies/app/index.d.ts +7 -0
  53. package/dist/src/strategies/domain/BooleanField.d.ts +10 -0
  54. package/dist/src/strategies/domain/CategoryField.d.ts +11 -0
  55. package/dist/src/strategies/domain/ClassifierModel.d.ts +11 -0
  56. package/dist/src/strategies/domain/DateField.d.ts +13 -0
  57. package/dist/src/strategies/domain/FieldTypes.d.ts +7 -0
  58. package/dist/src/strategies/domain/ModelTypes.d.ts +4 -0
  59. package/dist/src/strategies/domain/NumberField.d.ts +15 -0
  60. package/dist/src/strategies/domain/RegressorModel.d.ts +11 -0
  61. package/dist/src/strategies/domain/TextField.d.ts +14 -0
  62. package/dist/src/strategies/domain/index.d.ts +9 -0
  63. package/dist/src/strategies/index.d.ts +1 -0
  64. package/dist/src/strategies/ui/boolean-field.d.ts +13 -0
  65. package/dist/src/strategies/ui/category-field.d.ts +14 -0
  66. package/dist/src/strategies/ui/classifier-prediction.d.ts +39 -0
  67. package/dist/src/strategies/ui/date-field.d.ts +18 -0
  68. package/dist/src/strategies/ui/index.d.ts +8 -0
  69. package/dist/src/strategies/ui/number-field.d.ts +19 -0
  70. package/dist/src/strategies/ui/range-field.d.ts +17 -0
  71. package/dist/src/strategies/ui/regressor-prediction.d.ts +29 -0
  72. package/dist/src/strategies/ui/text-field.d.ts +17 -0
  73. package/dist/state-CLlTRyl1.js +12 -0
  74. package/dist/test/_fixtures/DummyField.d.ts +9 -0
  75. package/dist/test/setup.d.ts +1 -0
  76. package/dist/test/unit/DummyField.test.d.ts +1 -0
  77. package/dist/text-field-DwP-Fa1w.js +114 -0
  78. package/package.json +57 -0
@@ -0,0 +1,5 @@
1
+ var a = /* @__PURE__ */ ((r) => (r.TEXT = "text", r.NUMBER = "number", r.BOOLEAN = "boolean", r.CATEGORY = "category", r.DATE = "date", r))(a || {}), E = /* @__PURE__ */ ((r) => (r.REGRESSOR = "regressor", r.CLASSIFIER = "classifier", r))(E || {});
2
+ export {
3
+ a as F,
4
+ E as M
5
+ };
@@ -0,0 +1,23 @@
1
+ import { s as a, b as r, o as e, a as t, n as i, D as o } from "./FieldStrategy-pPekBtH-.js";
2
+ const l = a({
3
+ title: t().min(1).max(100).regex(/^\S.*\S$/),
4
+ description: e(t().min(1).max(500)),
5
+ required: r().default(!0)
6
+ }), c = a({
7
+ title: e(t().min(1).max(100)),
8
+ execution_time: e(i().min(0))
9
+ });
10
+ class d extends o {
11
+ // @ts-ignore
12
+ buildDescriptor(s) {
13
+ return {
14
+ ...this.buildControl(s),
15
+ slot: "report"
16
+ };
17
+ }
18
+ }
19
+ export {
20
+ l as B,
21
+ d as R,
22
+ c as a
23
+ };
@@ -0,0 +1,104 @@
1
+ import { FieldElement as n } from "./mlform/extensions.mjs";
2
+ import { x as u, a as d, n as f } from "./property-jKFNMQpR.js";
3
+ import { t as h } from "./custom-element-ttkHUa8w.js";
4
+ var c = Object.defineProperty, m = Object.getOwnPropertyDescriptor, v = (r, e, t) => e in r ? c(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t, p = (r, e, t, o) => {
5
+ for (var a = o > 1 ? void 0 : o ? m(e, t) : e, s = r.length - 1, i; s >= 0; s--)
6
+ (i = r[s]) && (a = (o ? i(e, t, a) : i(a)) || a);
7
+ return o && a && c(e, t, a), a;
8
+ }, g = (r, e, t) => v(r, e + "", t);
9
+ let l = class extends n {
10
+ firstUpdated() {
11
+ this.defaultValue && (this.value = this.defaultValue === "true", this.dispatchState("success", `Status set to: ${this.value}.`));
12
+ }
13
+ onChange(r) {
14
+ const e = r.target;
15
+ this.value = e.value === "true", e.checked && this.dispatchState("success", `Status set to: ${this.value}.`);
16
+ }
17
+ render() {
18
+ return u`
19
+ <fieldset role="radiogroup">
20
+ <input
21
+ type="radio"
22
+ id="opt_yes"
23
+ name="bool"
24
+ @change=${this.onChange}
25
+ .value=${!0}
26
+ .checked=${this.value === !0}
27
+ />
28
+ <label class="opt" for="opt_yes"><span>True</span></label>
29
+
30
+ <input
31
+ type="radio"
32
+ id="opt_no"
33
+ name="bool"
34
+ @change=${this.onChange}
35
+ .value=${!1}
36
+ .checked=${this.value === !1}
37
+ />
38
+ <label class="opt" for="opt_no"><span>False</span></label>
39
+ </fieldset>
40
+ `;
41
+ }
42
+ };
43
+ g(l, "styles", [
44
+ n.baseStyles,
45
+ d`
46
+ fieldset {
47
+ display: flex;
48
+ width: 100%;
49
+ margin: 0;
50
+ padding: 0;
51
+ border: none;
52
+ }
53
+
54
+ input[type="radio"] {
55
+ display: none;
56
+ }
57
+
58
+ .opt {
59
+ flex: 1 1 50%;
60
+ display: flex;
61
+ justify-content: center;
62
+ align-items: center;
63
+ padding: 0.65rem 0.25rem;
64
+ font-size: 0.9rem;
65
+ font-weight: 500;
66
+ color: var(--ml-color-primary);
67
+ background: var(--ml-color-accent-bg);
68
+ border: 1px solid var(--ml-color-border);
69
+ cursor: pointer;
70
+ user-select: none;
71
+ transition:
72
+ background 0.2s ease,
73
+ color 0.2s ease,
74
+ border-color 0.2s;
75
+ transform: skewX(var(--skew));
76
+ margin-right: -1px;
77
+ }
78
+ .opt:last-of-type {
79
+ margin-right: 0;
80
+ }
81
+ .opt span {
82
+ transform: skewX(calc(-1 * var(--skew)));
83
+ }
84
+
85
+ .opt:hover {
86
+ background: var(--ml-color-hv-light);
87
+ }
88
+
89
+ input[type="radio"]:checked + label.opt {
90
+ background: var(--ml-color-success);
91
+ border-color: var(--ml-color-success);
92
+ color: var(--ml-color-surface);
93
+ }
94
+ `
95
+ ]);
96
+ p([
97
+ f({ type: String })
98
+ ], l.prototype, "defaultValue", 2);
99
+ l = p([
100
+ h("boolean-field")
101
+ ], l);
102
+ export {
103
+ l as BooleanField
104
+ };
@@ -0,0 +1,73 @@
1
+ import { FieldElement as p } from "./mlform/extensions.mjs";
2
+ import { x as d, a as h, n as c } from "./property-jKFNMQpR.js";
3
+ import { t as v } from "./custom-element-ttkHUa8w.js";
4
+ var u = Object.defineProperty, m = Object.getOwnPropertyDescriptor, f = (e, t, r) => t in e ? u(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r, n = (e, t, r, l) => {
5
+ for (var a = l > 1 ? void 0 : l ? m(t, r) : t, s = e.length - 1, o; s >= 0; s--)
6
+ (o = e[s]) && (a = (l ? o(t, r, a) : o(a)) || a);
7
+ return l && a && u(t, r, a), a;
8
+ }, g = (e, t, r) => f(e, t + "", r);
9
+ let i = class extends p {
10
+ firstUpdated() {
11
+ this.value = this.defaultValue, this.value ? this.dispatchState("success", `Category Selected: ${this.value}.`) : this.dispatchState("empty");
12
+ }
13
+ render() {
14
+ return d`
15
+ <select @change=${this.handleChange} .value=${this.value}>
16
+ <option value=${void 0} disabled ?hidden=${!!this.value}>
17
+ — Select —
18
+ </option>
19
+ ${this.optionList.map(
20
+ (e) => d`
21
+ <option value=${e} ?selected=${e === this.value}>${e}</option>
22
+ `
23
+ )}
24
+ </select>
25
+ `;
26
+ }
27
+ handleChange(e) {
28
+ const t = e.target;
29
+ this.value = this.optionList.find((r) => r === t.value) ?? "", this.dispatchState("success", `Category Selected: ${this.value}.`);
30
+ }
31
+ };
32
+ g(i, "styles", [
33
+ p.baseStyles,
34
+ h`
35
+ select {
36
+ width: 100%;
37
+ padding: 0.75rem 1rem;
38
+ font-size: 1rem;
39
+ border: 1px solid var(--ml-color-border);
40
+ border-radius: var(--radius);
41
+ background: var(--ml-color-surface)
42
+ url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 20 20" fill="%23475569"><path d="M5.516 7.548a.75.75 0 0 1 1.06-.032L10 10.79l3.424-3.274a.75.75 0 0 1 1.029 1.09l-3.955 3.787a.75.75 0 0 1-1.029 0L5.548 8.606a.75.75 0 0 1-.032-1.058z"/></svg>')
43
+ no-repeat right 0.75rem center;
44
+ background-size: 14px 14px;
45
+ appearance: none;
46
+ outline: none;
47
+ transition: border-color 0.2s ease;
48
+ }
49
+
50
+ select:focus {
51
+ border-color: var(--ml-color-accent);
52
+ }
53
+ `
54
+ ]);
55
+ n([
56
+ c({
57
+ type: Array,
58
+ converter: {
59
+ fromAttribute(e) {
60
+ return e.split(",").map((t) => t.trim()).filter(Boolean);
61
+ }
62
+ }
63
+ })
64
+ ], i.prototype, "optionList", 2);
65
+ n([
66
+ c({ type: String })
67
+ ], i.prototype, "defaultValue", 2);
68
+ i = n([
69
+ v("category-field")
70
+ ], i);
71
+ export {
72
+ i as CategoryField
73
+ };
@@ -0,0 +1,193 @@
1
+ import { i as d, x as p, a as b, n as c } from "./property-jKFNMQpR.js";
2
+ import { t as h } from "./custom-element-ttkHUa8w.js";
3
+ var m = Object.defineProperty, v = Object.getOwnPropertyDescriptor, u = (r, t, e) => t in r ? m(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e, n = (r, t, e, i) => {
4
+ for (var o = i > 1 ? void 0 : i ? v(t, e) : t, a = r.length - 1, s; a >= 0; a--)
5
+ (s = r[a]) && (o = (i ? s(t, e, o) : s(o)) || o);
6
+ return i && o && m(t, e, o), o;
7
+ }, g = (r, t, e) => u(r, t + "", e);
8
+ let l = class extends d {
9
+ _resolveMapping(r) {
10
+ return this.mapping?.length ? this.mapping : Array.from({ length: r }, (t, e) => `${e}`);
11
+ }
12
+ _flatToMatrix(r) {
13
+ const t = this.mapping?.length || Math.sqrt(r.length), e = [];
14
+ for (let i = 0; i < r.length; i += t)
15
+ e.push(r.slice(i, i + t));
16
+ return e;
17
+ }
18
+ get _probMatrix() {
19
+ return !Array.isArray(this.probabilities) || !this.probabilities.length ? [] : Array.isArray(this.probabilities[0]) ? this.probabilities : this._flatToMatrix(this.probabilities);
20
+ }
21
+ get _predictions() {
22
+ const r = this._probMatrix;
23
+ if (!r.length) return [];
24
+ const t = this._resolveMapping(r[0].length);
25
+ return r.map((e) => {
26
+ const i = t.map((a, s) => ({
27
+ label: a,
28
+ prob: e[s] || 0
29
+ })), o = i.reduce(
30
+ (a, s) => s.prob > a.prob ? s : a
31
+ );
32
+ return { items: i, main: o };
33
+ });
34
+ }
35
+ render() {
36
+ return p`
37
+ <div class="card">
38
+ <div class="title">${this.title}</div>
39
+ ${this._predictions.map(
40
+ (r) => p`
41
+ ${this.details ? r.items.map(
42
+ (t) => p`
43
+ <div class="item">
44
+ <div class="label">${t.label}</div>
45
+ <div
46
+ class="bar"
47
+ style="--w: ${(t.prob * 100).toFixed(2)}%"
48
+ ></div>
49
+ <div class="pct">${t.prob.toFixed(2)}</div>
50
+ </div>
51
+ `
52
+ ) : p` <div class="prea">${r.main.label}</div>`}
53
+ ${this.details ? p`<br />` : ""}
54
+ `
55
+ )}
56
+ </div>
57
+ `;
58
+ }
59
+ };
60
+ g(l, "styles", b`
61
+ :host {
62
+ --bar-color: var(--ml-color-accent);
63
+ display: block;
64
+ margin: 10px;
65
+ font-family: "Inter", system-ui, sans-serif;
66
+ }
67
+
68
+ .card {
69
+ padding: 1.5rem 2rem;
70
+ border-radius: var(--radius);
71
+ background: var(--ml-color-surface);
72
+ box-shadow:
73
+ 0 2px 4px var(--ml-color-shadow),
74
+ 0 8px 16px var(--ml-color-shadow);
75
+ border: 1px solid var(--ml-color-border);
76
+ }
77
+
78
+ .prea {
79
+ padding: 1rem;
80
+ border-radius: var(--radius);
81
+ box-shadow:
82
+ 0 2px 4px var(--ml-color-shadow),
83
+ 0 8px 16px var(--ml-color-shadow);
84
+ border: 1px solid var(--ml-color-border);
85
+ margin: 10px;
86
+ background: var(--ml-color-surface);
87
+ color: var(--ml-color-primary);
88
+ }
89
+
90
+ .title {
91
+ font-size: 0.875rem; /* text-sm */
92
+ font-weight: 600;
93
+ text-transform: uppercase;
94
+ color: var(--ml-color-secondary);
95
+ letter-spacing: 0.06em;
96
+ margin-bottom: 1rem;
97
+ }
98
+
99
+ .item {
100
+ display: grid;
101
+ grid-template-columns: 120px 1fr 56px;
102
+ gap: 0.75rem;
103
+ align-items: center;
104
+ margin-bottom: 0.5rem;
105
+ }
106
+
107
+ .label {
108
+ font-size: 0.9rem;
109
+ font-weight: 500;
110
+ color: var(--ml-color-primary);
111
+ text-transform: capitalize;
112
+ text-align: right;
113
+ }
114
+
115
+ .bar {
116
+ position: relative;
117
+ width: 100%;
118
+ height: 10px;
119
+ background: var(--ml-color-border);
120
+ border-radius: 5px;
121
+ overflow: hidden;
122
+ }
123
+
124
+ .bar::after {
125
+ content: "";
126
+ position: absolute;
127
+ inset: 0;
128
+ width: var(--w);
129
+ background: linear-gradient(
130
+ 90deg,
131
+ var(--bar-color) 0%,
132
+ var(--ml-color-accent-h) 100%
133
+ );
134
+ border-radius: 5px;
135
+ transition: width 0.3s ease;
136
+ }
137
+
138
+ .pct {
139
+ font-variant-numeric: tabular-nums;
140
+ font-size: 0.9rem;
141
+ color: var(--ml-color-primary);
142
+ text-align: right;
143
+ }
144
+ `);
145
+ n([
146
+ c({ type: String })
147
+ ], l.prototype, "title", 2);
148
+ n([
149
+ c({
150
+ attribute: "mapping",
151
+ converter: {
152
+ fromAttribute(r) {
153
+ if (!r) return [];
154
+ try {
155
+ return JSON.parse(r);
156
+ } catch {
157
+ return r.split(",").map((t) => t.trim());
158
+ }
159
+ }
160
+ }
161
+ })
162
+ ], l.prototype, "mapping", 2);
163
+ n([
164
+ c({
165
+ attribute: "probabilities",
166
+ converter: {
167
+ fromAttribute(r) {
168
+ if (!r) return [];
169
+ try {
170
+ return JSON.parse(r);
171
+ } catch {
172
+ return r.split(",").map((t) => parseFloat(t));
173
+ }
174
+ }
175
+ }
176
+ })
177
+ ], l.prototype, "probabilities", 2);
178
+ n([
179
+ c({
180
+ type: Boolean,
181
+ converter: {
182
+ fromAttribute(r) {
183
+ return r.toLowerCase() !== "false";
184
+ }
185
+ }
186
+ })
187
+ ], l.prototype, "details", 2);
188
+ l = n([
189
+ h("classifier-prediction")
190
+ ], l);
191
+ export {
192
+ l as ClassifierPrediction
193
+ };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2017 Google LLC
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ */
6
+ const n = (e) => (t, i) => {
7
+ i !== void 0 ? i.addInitializer(() => {
8
+ customElements.define(e, t);
9
+ }) : customElements.define(e, t);
10
+ };
11
+ export {
12
+ n as t
13
+ };
@@ -0,0 +1,162 @@
1
+ import { FieldElement as p } from "./mlform/extensions.mjs";
2
+ import { x as d, a as D, n as m } from "./property-jKFNMQpR.js";
3
+ import { t as c } from "./custom-element-ttkHUa8w.js";
4
+ var f = Object.defineProperty, v = Object.getOwnPropertyDescriptor, T = (t, e, a) => e in t ? f(t, e, { enumerable: !0, configurable: !0, writable: !0, value: a }) : t[e] = a, u = (t, e, a, i) => {
5
+ for (var r = i > 1 ? void 0 : i ? v(e, a) : e, o = t.length - 1, s; o >= 0; o--)
6
+ (s = t[o]) && (r = (i ? s(e, a, r) : s(r)) || r);
7
+ return i && r && f(e, a, r), r;
8
+ }, b = (t, e, a) => T(t, e + "", a);
9
+ let n = class extends p {
10
+ step = "1";
11
+ firstUpdated() {
12
+ if (this.defaultValue) {
13
+ this.value = this.defaultValue;
14
+ const t = new InputEvent("input", {
15
+ bubbles: !0,
16
+ composed: !0
17
+ });
18
+ Object.defineProperty(t, "target", {
19
+ value: { value: this.formatDateUTC(this.defaultValue) },
20
+ writable: !1
21
+ }), this.onInput(t);
22
+ }
23
+ }
24
+ render() {
25
+ return d`
26
+ <div class="input-wrapper">
27
+ <input
28
+ type="date"
29
+ @input=${this.onInput}
30
+ .step=${this.step}
31
+ .value=${this.value ? this.formatDateUTC(this.value) : void 0}
32
+ .min=${this.min ? this.formatDateUTC(this.min) : void 0}
33
+ .max=${this.max ? this.formatDateUTC(this.max) : void 0}
34
+ />
35
+ </div>
36
+ `;
37
+ }
38
+ onInput(t) {
39
+ if (this.value = new Date(t.target.value), !this.value) {
40
+ this.dispatchState("empty");
41
+ return;
42
+ }
43
+ if (this.max && this.min && (this.value < this.min || this.value > this.max)) {
44
+ this.dispatchState(
45
+ "error",
46
+ `Date must be between ${this.formatDateUTC(
47
+ this.min
48
+ )} and ${this.formatDateUTC(this.max)}.`
49
+ );
50
+ return;
51
+ }
52
+ if (this.max && this.value > this.max) {
53
+ this.dispatchState(
54
+ "error",
55
+ `Date must not be after ${this.formatDateUTC(this.max)}.`
56
+ );
57
+ return;
58
+ }
59
+ if (this.min && this.value < this.min) {
60
+ this.dispatchState(
61
+ "error",
62
+ `Date must not be before ${this.formatDateUTC(this.min)}.`
63
+ );
64
+ return;
65
+ }
66
+ const e = Math.max(1, Number(this.step) || 1), a = this.min ? this.startOfDayUTC(this.min) : new Date(Date.UTC(1970, 0, 1)), i = Math.round(
67
+ (this.value.getTime() - a.getTime()) / 864e5
68
+ );
69
+ if (!(i % e === 0)) {
70
+ const o = Math.floor(i / e), s = new Date(
71
+ a.getTime() + o * e * 864e5
72
+ ), l = new Date(s.getTime() + e * 864e5), h = [];
73
+ (!this.min || s >= this.startOfDayUTC(this.min)) && h.push(`Last valid date: ${this.formatDateUTC(s)}`), (!this.max || l <= this.startOfDayUTC(this.max)) && h.push(`Next valid date: ${this.formatDateUTC(l)}`), this.dispatchState(
74
+ "error",
75
+ `The Date must advance or retrocede in steps of ${e} day(s) starting from ${this.formatDateUTC(
76
+ a
77
+ )}
78
+ ${h[0]}.
79
+ ${h[1]}.`
80
+ );
81
+ return;
82
+ }
83
+ this.dispatchState(
84
+ "success",
85
+ `Selected Date: ${this.formatDateUTC(this.value)}`
86
+ );
87
+ }
88
+ startOfDayUTC(t) {
89
+ return new Date(
90
+ Date.UTC(t.getUTCFullYear(), t.getUTCMonth(), t.getUTCDate())
91
+ );
92
+ }
93
+ formatDateUTC(t) {
94
+ return t.toISOString().split("T")[0];
95
+ }
96
+ };
97
+ b(n, "styles", [
98
+ p.baseStyles,
99
+ D`
100
+ input[type="date"] {
101
+ display: inline-block;
102
+ width: 100%;
103
+ padding: 0.75rem 0.75rem;
104
+ font-size: 1rem;
105
+ border: 1px solid var(--ml-color-border);
106
+ border-radius: var(--radius);
107
+ outline: none;
108
+ transition: border-color 0.2s ease;
109
+ }
110
+ input[type="date"]:focus {
111
+ border-color: var(--ml-color-accent);
112
+ }
113
+ `
114
+ ]);
115
+ u([
116
+ m({ type: String })
117
+ ], n.prototype, "step", 2);
118
+ u([
119
+ m({
120
+ type: Date,
121
+ converter: {
122
+ fromAttribute(t) {
123
+ return new Date(t);
124
+ },
125
+ toAttribute(t) {
126
+ return t.toISOString().split("T")[0];
127
+ }
128
+ }
129
+ })
130
+ ], n.prototype, "min", 2);
131
+ u([
132
+ m({
133
+ type: Date,
134
+ converter: {
135
+ fromAttribute(t) {
136
+ return new Date(t);
137
+ },
138
+ toAttribute(t) {
139
+ return t.toISOString().split("T")[0];
140
+ }
141
+ }
142
+ })
143
+ ], n.prototype, "max", 2);
144
+ u([
145
+ m({
146
+ type: Date,
147
+ converter: {
148
+ fromAttribute(t) {
149
+ return new Date(t);
150
+ },
151
+ toAttribute(t) {
152
+ return t.toISOString().split("T")[0];
153
+ }
154
+ }
155
+ })
156
+ ], n.prototype, "defaultValue", 2);
157
+ n = u([
158
+ c("date-field")
159
+ ], n);
160
+ export {
161
+ n as DateField
162
+ };