@atscript/vue-form 0.1.58

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 (190) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -0
  3. package/dist/as-action-71f9E_bL.cjs +208 -0
  4. package/dist/as-action-DU17rykn.mjs +203 -0
  5. package/dist/as-action.cjs +2 -0
  6. package/dist/as-action.d.cts +2 -0
  7. package/dist/as-action.d.mts +2 -0
  8. package/dist/as-action.mjs +2 -0
  9. package/dist/as-action.vue-BdbAOZCL.d.cts +13 -0
  10. package/dist/as-action.vue-CmY3eil1.d.mts +13 -0
  11. package/dist/as-adornment-shell-9UmdNIPR.cjs +97 -0
  12. package/dist/as-adornment-shell-knFiB7Ct.mjs +92 -0
  13. package/dist/as-array-Bn27x9cq.cjs +466 -0
  14. package/dist/as-array-DwarTaKP.mjs +455 -0
  15. package/dist/as-array-clear-btn-DAGervXL.cjs +48 -0
  16. package/dist/as-array-clear-btn-DIhzCKC9.mjs +43 -0
  17. package/dist/as-array.cjs +11 -0
  18. package/dist/as-array.d.cts +2 -0
  19. package/dist/as-array.d.mts +2 -0
  20. package/dist/as-array.mjs +11 -0
  21. package/dist/as-array.vue-C5r_ycIa.d.mts +9 -0
  22. package/dist/as-array.vue-CeBZRVm7.d.cts +9 -0
  23. package/dist/as-checkbox-B_9mwla6.mjs +285 -0
  24. package/dist/as-checkbox-DXGTVHPE.cjs +296 -0
  25. package/dist/as-checkbox.cjs +6 -0
  26. package/dist/as-checkbox.d.cts +2 -0
  27. package/dist/as-checkbox.d.mts +2 -0
  28. package/dist/as-checkbox.mjs +6 -0
  29. package/dist/as-checkbox.vue-BL53Xjmi.d.mts +9 -0
  30. package/dist/as-checkbox.vue-Da1KVG5J.d.cts +9 -0
  31. package/dist/as-collapsible-CqxeJut7.cjs +148 -0
  32. package/dist/as-collapsible-DtNCofNT.mjs +143 -0
  33. package/dist/as-date-C7tFQDkh.mjs +253 -0
  34. package/dist/as-date-k3MW3dmA.cjs +258 -0
  35. package/dist/as-date.cjs +8 -0
  36. package/dist/as-date.d.cts +2 -0
  37. package/dist/as-date.d.mts +2 -0
  38. package/dist/as-date.mjs +8 -0
  39. package/dist/as-date.vue-C5JaS3Sd.d.mts +9 -0
  40. package/dist/as-date.vue-e2ewS_V4.d.cts +9 -0
  41. package/dist/as-datetime-C030mzI5.cjs +258 -0
  42. package/dist/as-datetime-elcOoDT5.mjs +253 -0
  43. package/dist/as-datetime.cjs +8 -0
  44. package/dist/as-datetime.d.cts +2 -0
  45. package/dist/as-datetime.d.mts +2 -0
  46. package/dist/as-datetime.mjs +8 -0
  47. package/dist/as-datetime.vue-ClsSnJSV.d.mts +9 -0
  48. package/dist/as-datetime.vue-vfHFsby6.d.cts +9 -0
  49. package/dist/as-decimal-BJIGgPXU.cjs +711 -0
  50. package/dist/as-decimal-DtXjFPhe.mjs +694 -0
  51. package/dist/as-decimal.cjs +7 -0
  52. package/dist/as-decimal.d.cts +2 -0
  53. package/dist/as-decimal.d.mts +2 -0
  54. package/dist/as-decimal.mjs +7 -0
  55. package/dist/as-decimal.vue-B1pEKdjM.d.cts +25 -0
  56. package/dist/as-decimal.vue-CSCtYRRa.d.mts +25 -0
  57. package/dist/as-field-CXVjrEPQ.mjs +481 -0
  58. package/dist/as-field-shell-B2iTn-iM.cjs +346 -0
  59. package/dist/as-field-shell-Pdy3sAvr.mjs +341 -0
  60. package/dist/as-field-shell.cjs +5 -0
  61. package/dist/as-field-shell.d.cts +2 -0
  62. package/dist/as-field-shell.d.mts +2 -0
  63. package/dist/as-field-shell.mjs +5 -0
  64. package/dist/as-field-shell.vue-Ddnp8KxY.d.mts +37 -0
  65. package/dist/as-field-shell.vue-Dmt05vGD.d.cts +37 -0
  66. package/dist/as-field-wLYoaZnT.cjs +498 -0
  67. package/dist/as-field.cjs +4 -0
  68. package/dist/as-field.d.cts +25 -0
  69. package/dist/as-field.d.mts +26 -0
  70. package/dist/as-field.mjs +4 -0
  71. package/dist/as-form-CWwgyvfw.mjs +425 -0
  72. package/dist/as-form-DAIkyt7H.cjs +448 -0
  73. package/dist/as-form.cjs +7 -0
  74. package/dist/as-form.d.cts +2 -0
  75. package/dist/as-form.d.mts +2 -0
  76. package/dist/as-form.mjs +7 -0
  77. package/dist/as-form.vue-B4Bn0pbC.d.cts +158 -0
  78. package/dist/as-form.vue-DRrb_yoj.d.mts +158 -0
  79. package/dist/as-input-CpbV2k3s.cjs +231 -0
  80. package/dist/as-input-DIa8BzLv.mjs +226 -0
  81. package/dist/as-input-control-BzELjheN.mjs +266 -0
  82. package/dist/as-input-control-C5-DelZT.cjs +271 -0
  83. package/dist/as-input.cjs +8 -0
  84. package/dist/as-input.d.cts +2 -0
  85. package/dist/as-input.d.mts +2 -0
  86. package/dist/as-input.mjs +8 -0
  87. package/dist/as-input.vue-11ldp9uT.d.cts +17 -0
  88. package/dist/as-input.vue-fUhcvfv2.d.mts +17 -0
  89. package/dist/as-iterator-BYMNe6UJ.cjs +61 -0
  90. package/dist/as-iterator-CT5y1jyn.mjs +56 -0
  91. package/dist/as-iterator.cjs +5 -0
  92. package/dist/as-iterator.d.cts +14 -0
  93. package/dist/as-iterator.d.mts +15 -0
  94. package/dist/as-iterator.mjs +5 -0
  95. package/dist/as-number-BA55JIq1.cjs +387 -0
  96. package/dist/as-number-JPEwPK8Q.mjs +376 -0
  97. package/dist/as-number.cjs +8 -0
  98. package/dist/as-number.d.cts +2 -0
  99. package/dist/as-number.d.mts +2 -0
  100. package/dist/as-number.mjs +8 -0
  101. package/dist/as-number.vue-Bk-W7Vwv.d.mts +26 -0
  102. package/dist/as-number.vue-C2Aih98s.d.cts +26 -0
  103. package/dist/as-object-CT6lNEqt.mjs +300 -0
  104. package/dist/as-object-qUL7l8V1.cjs +305 -0
  105. package/dist/as-object.cjs +11 -0
  106. package/dist/as-object.d.cts +2 -0
  107. package/dist/as-object.d.mts +2 -0
  108. package/dist/as-object.mjs +11 -0
  109. package/dist/as-object.vue-CKwMyM_F.d.cts +13 -0
  110. package/dist/as-object.vue-Cg52b61-.d.mts +13 -0
  111. package/dist/as-paragraph-BGO-j4US.cjs +203 -0
  112. package/dist/as-paragraph-jIG_dg7_.mjs +198 -0
  113. package/dist/as-paragraph.cjs +2 -0
  114. package/dist/as-paragraph.d.cts +2 -0
  115. package/dist/as-paragraph.d.mts +2 -0
  116. package/dist/as-paragraph.mjs +2 -0
  117. package/dist/as-paragraph.vue-BDt0pBG-.d.cts +9 -0
  118. package/dist/as-paragraph.vue-C3FgTEt5.d.mts +9 -0
  119. package/dist/as-radio-B1N-gmoI.mjs +242 -0
  120. package/dist/as-radio-U3OK7bTg.cjs +247 -0
  121. package/dist/as-radio.cjs +6 -0
  122. package/dist/as-radio.d.cts +2 -0
  123. package/dist/as-radio.d.mts +2 -0
  124. package/dist/as-radio.mjs +6 -0
  125. package/dist/as-radio.vue-D_fweoN1.d.mts +9 -0
  126. package/dist/as-radio.vue-ZC4kLBnT.d.cts +9 -0
  127. package/dist/as-ref-CIifSSCQ.mjs +337 -0
  128. package/dist/as-ref-SImaIrwK.cjs +342 -0
  129. package/dist/as-ref.cjs +7 -0
  130. package/dist/as-ref.d.cts +2 -0
  131. package/dist/as-ref.d.mts +2 -0
  132. package/dist/as-ref.mjs +7 -0
  133. package/dist/as-ref.vue-BNeQeQpO.d.cts +9 -0
  134. package/dist/as-ref.vue-Cr5jeNDn.d.mts +9 -0
  135. package/dist/as-select-BB3uxACS.cjs +246 -0
  136. package/dist/as-select-UBGCVhku.mjs +241 -0
  137. package/dist/as-select.cjs +6 -0
  138. package/dist/as-select.d.cts +2 -0
  139. package/dist/as-select.d.mts +2 -0
  140. package/dist/as-select.mjs +6 -0
  141. package/dist/as-select.vue-Dd7huPq2.d.cts +9 -0
  142. package/dist/as-select.vue-RYpbZbKt.d.mts +9 -0
  143. package/dist/as-time-C24rvslH.cjs +258 -0
  144. package/dist/as-time-CQsxUs8P.mjs +253 -0
  145. package/dist/as-time.cjs +8 -0
  146. package/dist/as-time.d.cts +2 -0
  147. package/dist/as-time.d.mts +2 -0
  148. package/dist/as-time.mjs +8 -0
  149. package/dist/as-time.vue-huLx2B4l.d.mts +9 -0
  150. package/dist/as-time.vue-nMEHLXke.d.cts +9 -0
  151. package/dist/as-tuple-BU--cuuI.cjs +351 -0
  152. package/dist/as-tuple-DkI9swlW.mjs +340 -0
  153. package/dist/as-tuple.cjs +11 -0
  154. package/dist/as-tuple.d.cts +2 -0
  155. package/dist/as-tuple.d.mts +2 -0
  156. package/dist/as-tuple.mjs +11 -0
  157. package/dist/as-tuple.vue-CQhzOJsn.d.mts +9 -0
  158. package/dist/as-tuple.vue-DyskCkf-.d.cts +9 -0
  159. package/dist/as-union-BGvdxr3G.mjs +351 -0
  160. package/dist/as-union-C0btoJn3.cjs +368 -0
  161. package/dist/as-union.cjs +6 -0
  162. package/dist/as-union.d.cts +2 -0
  163. package/dist/as-union.d.mts +2 -0
  164. package/dist/as-union.mjs +6 -0
  165. package/dist/as-union.vue-BjlDPZn0.d.mts +9 -0
  166. package/dist/as-union.vue-CqjU3O10.d.cts +9 -0
  167. package/dist/as-variant-picker-BVs0AvjK.mjs +96 -0
  168. package/dist/as-variant-picker-DObQZHmm.cjs +107 -0
  169. package/dist/index.cjs +173 -0
  170. package/dist/index.d.cts +966 -0
  171. package/dist/index.d.mts +966 -0
  172. package/dist/index.mjs +105 -0
  173. package/dist/types-C4HRSxgV.d.cts +233 -0
  174. package/dist/types-Czm-Gtud.d.mts +233 -0
  175. package/dist/use-as-date-B7CtcRQd.cjs +329 -0
  176. package/dist/use-as-date-C39i9mzE.mjs +318 -0
  177. package/dist/use-as-dropdown-BMnEm6jF.mjs +82 -0
  178. package/dist/use-as-dropdown-C-Qy7Vt0.cjs +105 -0
  179. package/dist/use-as-locale-BrFdAgnU.mjs +23 -0
  180. package/dist/use-as-locale-C4z5stwD.cjs +34 -0
  181. package/dist/use-as-nested-sections-store-jdMRxjBE.cjs +80 -0
  182. package/dist/use-as-nested-sections-store-lhi0z5z1.mjs +63 -0
  183. package/dist/use-as-optional-add-flow-CuXEir_i.mjs +43 -0
  184. package/dist/use-as-optional-add-flow-STOaQWo9.cjs +48 -0
  185. package/dist/use-as-value-help-CBykDEjZ.mjs +89 -0
  186. package/dist/use-as-value-help-uANI3zWa.cjs +100 -0
  187. package/dist/use-form-context-Dwr8Ai1v.cjs +207 -0
  188. package/dist/use-form-context-bAj7UoSe.mjs +106 -0
  189. package/package.json +180 -0
  190. package/styles.d.ts +2 -0
@@ -0,0 +1,329 @@
1
+ let vue = require("vue");
2
+ //#region src/components/internal/as-date-control.vue?vue&type=script&setup=true&lang.ts
3
+ const _hoisted_1 = [
4
+ "id",
5
+ "type",
6
+ "value",
7
+ "placeholder",
8
+ "name",
9
+ "disabled",
10
+ "readonly",
11
+ "aria-required",
12
+ "aria-invalid",
13
+ "aria-describedby",
14
+ "aria-label"
15
+ ];
16
+ //#endregion
17
+ //#region src/components/internal/as-date-control.vue
18
+ var as_date_control_default = /* @__PURE__ */ (0, vue.defineComponent)({
19
+ __name: "as-date-control",
20
+ props: {
21
+ onBlur: {
22
+ type: Function,
23
+ required: true
24
+ },
25
+ error: {
26
+ type: String,
27
+ required: false
28
+ },
29
+ model: {
30
+ type: Object,
31
+ required: true
32
+ },
33
+ value: {
34
+ type: null,
35
+ required: false
36
+ },
37
+ label: {
38
+ type: String,
39
+ required: false
40
+ },
41
+ description: {
42
+ type: String,
43
+ required: false
44
+ },
45
+ hint: {
46
+ type: String,
47
+ required: false
48
+ },
49
+ placeholder: {
50
+ type: String,
51
+ required: false
52
+ },
53
+ prefixIcon: {
54
+ type: String,
55
+ required: false
56
+ },
57
+ suffixIcon: {
58
+ type: String,
59
+ required: false
60
+ },
61
+ class: {
62
+ type: [Object, String],
63
+ required: false
64
+ },
65
+ style: {
66
+ type: [Object, String],
67
+ required: false
68
+ },
69
+ optional: {
70
+ type: Boolean,
71
+ required: false,
72
+ skipCheck: true
73
+ },
74
+ onToggleOptional: {
75
+ type: Function,
76
+ required: false
77
+ },
78
+ required: {
79
+ type: Boolean,
80
+ required: false,
81
+ skipCheck: true
82
+ },
83
+ readonly: {
84
+ type: Boolean,
85
+ required: false,
86
+ skipCheck: true
87
+ },
88
+ type: {
89
+ type: String,
90
+ required: true
91
+ },
92
+ formAction: {
93
+ type: Object,
94
+ required: false
95
+ },
96
+ name: {
97
+ type: String,
98
+ required: false
99
+ },
100
+ field: {
101
+ type: Object,
102
+ required: false
103
+ },
104
+ options: {
105
+ type: Array,
106
+ required: false
107
+ },
108
+ maxLength: {
109
+ type: Number,
110
+ required: false
111
+ },
112
+ autocomplete: {
113
+ type: String,
114
+ required: false
115
+ },
116
+ title: {
117
+ type: String,
118
+ required: false
119
+ },
120
+ level: {
121
+ type: Number,
122
+ required: false
123
+ },
124
+ onRemove: {
125
+ type: Function,
126
+ required: false
127
+ },
128
+ canRemove: {
129
+ type: Boolean,
130
+ required: false
131
+ },
132
+ removeLabel: {
133
+ type: String,
134
+ required: false
135
+ },
136
+ arrayIndex: {
137
+ type: Number,
138
+ required: false
139
+ },
140
+ path: {
141
+ type: String,
142
+ required: true
143
+ },
144
+ valueHelp: {
145
+ type: Object,
146
+ required: false
147
+ },
148
+ singularLabel: {
149
+ type: String,
150
+ required: false
151
+ },
152
+ inputId: {
153
+ type: String,
154
+ required: true
155
+ },
156
+ errorId: {
157
+ type: String,
158
+ required: true
159
+ },
160
+ descId: {
161
+ type: String,
162
+ required: true
163
+ },
164
+ ariaDescribedBy: {
165
+ type: String,
166
+ required: false
167
+ },
168
+ currencyCode: {
169
+ type: String,
170
+ required: false
171
+ },
172
+ unitCode: {
173
+ type: String,
174
+ required: false
175
+ },
176
+ precisionScale: {
177
+ type: Number,
178
+ required: false
179
+ },
180
+ prefix: {
181
+ type: String,
182
+ required: false
183
+ },
184
+ suffix: {
185
+ type: String,
186
+ required: false
187
+ },
188
+ scale: {
189
+ type: Number,
190
+ required: false
191
+ },
192
+ hasAdornment: {
193
+ type: Boolean,
194
+ required: false
195
+ },
196
+ disabled: {
197
+ type: Boolean,
198
+ required: false
199
+ },
200
+ hidden: {
201
+ type: Boolean,
202
+ required: false
203
+ },
204
+ inputType: {
205
+ type: String,
206
+ required: true
207
+ },
208
+ displayValue: {
209
+ type: String,
210
+ required: true
211
+ },
212
+ setFromInput: {
213
+ type: Function,
214
+ required: true
215
+ }
216
+ },
217
+ setup(__props) {
218
+ return (_ctx, _cache) => {
219
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("input", {
220
+ id: __props.inputId,
221
+ type: __props.inputType,
222
+ value: __props.displayValue,
223
+ onChange: _cache[0] || (_cache[0] = (e) => __props.setFromInput(e.target.value)),
224
+ onBlur: _cache[1] || (_cache[1] = (...args) => __props.onBlur && __props.onBlur(...args)),
225
+ placeholder: __props.placeholder,
226
+ name: __props.name,
227
+ disabled: __props.disabled,
228
+ readonly: __props.readonly,
229
+ "aria-required": __props.required || void 0,
230
+ "aria-invalid": !!__props.error || void 0,
231
+ "aria-describedby": __props.ariaDescribedBy,
232
+ "aria-label": !__props.label ? __props.name : void 0
233
+ }, null, 40, _hoisted_1);
234
+ };
235
+ }
236
+ });
237
+ //#endregion
238
+ //#region src/composables/use-as-date.ts
239
+ function pad2(n) {
240
+ return n < 10 ? `0${n}` : String(n);
241
+ }
242
+ function toDate(v) {
243
+ if (v === null || v === void 0 || v === "") return void 0;
244
+ if (v instanceof Date) return Number.isFinite(v.getTime()) ? v : void 0;
245
+ if (typeof v === "number" || typeof v === "string") {
246
+ const d = new Date(v);
247
+ return Number.isFinite(d.getTime()) ? d : void 0;
248
+ }
249
+ }
250
+ /**
251
+ * Format a Date for `<input type="date|datetime-local">`. Renders in the
252
+ * user's local timezone — matching browser-native behaviour for the
253
+ * underlying input element. Storage epoch-ms remains UTC.
254
+ */
255
+ function formatLocal(d, kind) {
256
+ const y = d.getFullYear();
257
+ const m = pad2(d.getMonth() + 1);
258
+ const day = pad2(d.getDate());
259
+ if (kind === "date") return `${y}-${m}-${day}`;
260
+ return `${y}-${m}-${day}T${pad2(d.getHours())}:${pad2(d.getMinutes())}`;
261
+ }
262
+ /** Extract HH:mm from an epoch-ms number / Date / ISO string. */
263
+ function formatTime(v) {
264
+ if (v === null || v === void 0 || v === "") return "";
265
+ if (typeof v === "string" && /^\d{1,2}:\d{2}(:\d{2})?$/.test(v)) {
266
+ const [hh, mm] = v.split(":");
267
+ return `${pad2(Number(hh))}:${mm}`;
268
+ }
269
+ const d = toDate(v);
270
+ if (!d) return "";
271
+ return `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;
272
+ }
273
+ /**
274
+ * Composable backing `AsDate` / `AsDatetime` / `AsTime`. Pick the variant
275
+ * via `kind`. Conversion direction:
276
+ *
277
+ * - `'date'`: epoch-ms ↔ `YYYY-MM-DD` (local TZ).
278
+ * Empty input commits `null`. If previous value was a `string`,
279
+ * commits a string (`YYYY-MM-DD`); otherwise commits epoch-ms (UTC
280
+ * midnight on the picked date in local TZ — same as `new Date(str)`).
281
+ * - `'datetime'`: epoch-ms ↔ `YYYY-MM-DDTHH:mm` (local TZ).
282
+ * - `'time'`: prev-string ↔ `HH:mm`. Numeric storage isn't meaningful
283
+ * for naked time-of-day, so we commit a string.
284
+ */
285
+ function useAsDate(opts) {
286
+ const inputType = opts.kind === "datetime" ? "datetime-local" : opts.kind === "time" ? "time" : "date";
287
+ const displayValue = (0, vue.computed)(() => {
288
+ const v = opts.modelValue();
289
+ if (opts.kind === "time") return formatTime(v);
290
+ const d = toDate(v);
291
+ if (!d) return "";
292
+ return formatLocal(d, opts.kind === "datetime" ? "datetime" : "date");
293
+ });
294
+ function setFromInput(raw) {
295
+ if (raw === "") {
296
+ opts.onCommit(null);
297
+ return;
298
+ }
299
+ if (opts.kind === "time") {
300
+ opts.onCommit(raw);
301
+ return;
302
+ }
303
+ if (typeof opts.modelValue() === "string") {
304
+ opts.onCommit(raw);
305
+ return;
306
+ }
307
+ const d = new Date(raw);
308
+ if (!Number.isFinite(d.getTime())) return;
309
+ opts.onCommit(d.getTime());
310
+ }
311
+ return {
312
+ inputType,
313
+ displayValue,
314
+ setFromInput
315
+ };
316
+ }
317
+ //#endregion
318
+ Object.defineProperty(exports, "as_date_control_default", {
319
+ enumerable: true,
320
+ get: function() {
321
+ return as_date_control_default;
322
+ }
323
+ });
324
+ Object.defineProperty(exports, "useAsDate", {
325
+ enumerable: true,
326
+ get: function() {
327
+ return useAsDate;
328
+ }
329
+ });
@@ -0,0 +1,318 @@
1
+ import { computed, createElementBlock, defineComponent, openBlock } from "vue";
2
+ //#region src/components/internal/as-date-control.vue?vue&type=script&setup=true&lang.ts
3
+ const _hoisted_1 = [
4
+ "id",
5
+ "type",
6
+ "value",
7
+ "placeholder",
8
+ "name",
9
+ "disabled",
10
+ "readonly",
11
+ "aria-required",
12
+ "aria-invalid",
13
+ "aria-describedby",
14
+ "aria-label"
15
+ ];
16
+ //#endregion
17
+ //#region src/components/internal/as-date-control.vue
18
+ var as_date_control_default = /* @__PURE__ */ defineComponent({
19
+ __name: "as-date-control",
20
+ props: {
21
+ onBlur: {
22
+ type: Function,
23
+ required: true
24
+ },
25
+ error: {
26
+ type: String,
27
+ required: false
28
+ },
29
+ model: {
30
+ type: Object,
31
+ required: true
32
+ },
33
+ value: {
34
+ type: null,
35
+ required: false
36
+ },
37
+ label: {
38
+ type: String,
39
+ required: false
40
+ },
41
+ description: {
42
+ type: String,
43
+ required: false
44
+ },
45
+ hint: {
46
+ type: String,
47
+ required: false
48
+ },
49
+ placeholder: {
50
+ type: String,
51
+ required: false
52
+ },
53
+ prefixIcon: {
54
+ type: String,
55
+ required: false
56
+ },
57
+ suffixIcon: {
58
+ type: String,
59
+ required: false
60
+ },
61
+ class: {
62
+ type: [Object, String],
63
+ required: false
64
+ },
65
+ style: {
66
+ type: [Object, String],
67
+ required: false
68
+ },
69
+ optional: {
70
+ type: Boolean,
71
+ required: false,
72
+ skipCheck: true
73
+ },
74
+ onToggleOptional: {
75
+ type: Function,
76
+ required: false
77
+ },
78
+ required: {
79
+ type: Boolean,
80
+ required: false,
81
+ skipCheck: true
82
+ },
83
+ readonly: {
84
+ type: Boolean,
85
+ required: false,
86
+ skipCheck: true
87
+ },
88
+ type: {
89
+ type: String,
90
+ required: true
91
+ },
92
+ formAction: {
93
+ type: Object,
94
+ required: false
95
+ },
96
+ name: {
97
+ type: String,
98
+ required: false
99
+ },
100
+ field: {
101
+ type: Object,
102
+ required: false
103
+ },
104
+ options: {
105
+ type: Array,
106
+ required: false
107
+ },
108
+ maxLength: {
109
+ type: Number,
110
+ required: false
111
+ },
112
+ autocomplete: {
113
+ type: String,
114
+ required: false
115
+ },
116
+ title: {
117
+ type: String,
118
+ required: false
119
+ },
120
+ level: {
121
+ type: Number,
122
+ required: false
123
+ },
124
+ onRemove: {
125
+ type: Function,
126
+ required: false
127
+ },
128
+ canRemove: {
129
+ type: Boolean,
130
+ required: false
131
+ },
132
+ removeLabel: {
133
+ type: String,
134
+ required: false
135
+ },
136
+ arrayIndex: {
137
+ type: Number,
138
+ required: false
139
+ },
140
+ path: {
141
+ type: String,
142
+ required: true
143
+ },
144
+ valueHelp: {
145
+ type: Object,
146
+ required: false
147
+ },
148
+ singularLabel: {
149
+ type: String,
150
+ required: false
151
+ },
152
+ inputId: {
153
+ type: String,
154
+ required: true
155
+ },
156
+ errorId: {
157
+ type: String,
158
+ required: true
159
+ },
160
+ descId: {
161
+ type: String,
162
+ required: true
163
+ },
164
+ ariaDescribedBy: {
165
+ type: String,
166
+ required: false
167
+ },
168
+ currencyCode: {
169
+ type: String,
170
+ required: false
171
+ },
172
+ unitCode: {
173
+ type: String,
174
+ required: false
175
+ },
176
+ precisionScale: {
177
+ type: Number,
178
+ required: false
179
+ },
180
+ prefix: {
181
+ type: String,
182
+ required: false
183
+ },
184
+ suffix: {
185
+ type: String,
186
+ required: false
187
+ },
188
+ scale: {
189
+ type: Number,
190
+ required: false
191
+ },
192
+ hasAdornment: {
193
+ type: Boolean,
194
+ required: false
195
+ },
196
+ disabled: {
197
+ type: Boolean,
198
+ required: false
199
+ },
200
+ hidden: {
201
+ type: Boolean,
202
+ required: false
203
+ },
204
+ inputType: {
205
+ type: String,
206
+ required: true
207
+ },
208
+ displayValue: {
209
+ type: String,
210
+ required: true
211
+ },
212
+ setFromInput: {
213
+ type: Function,
214
+ required: true
215
+ }
216
+ },
217
+ setup(__props) {
218
+ return (_ctx, _cache) => {
219
+ return openBlock(), createElementBlock("input", {
220
+ id: __props.inputId,
221
+ type: __props.inputType,
222
+ value: __props.displayValue,
223
+ onChange: _cache[0] || (_cache[0] = (e) => __props.setFromInput(e.target.value)),
224
+ onBlur: _cache[1] || (_cache[1] = (...args) => __props.onBlur && __props.onBlur(...args)),
225
+ placeholder: __props.placeholder,
226
+ name: __props.name,
227
+ disabled: __props.disabled,
228
+ readonly: __props.readonly,
229
+ "aria-required": __props.required || void 0,
230
+ "aria-invalid": !!__props.error || void 0,
231
+ "aria-describedby": __props.ariaDescribedBy,
232
+ "aria-label": !__props.label ? __props.name : void 0
233
+ }, null, 40, _hoisted_1);
234
+ };
235
+ }
236
+ });
237
+ //#endregion
238
+ //#region src/composables/use-as-date.ts
239
+ function pad2(n) {
240
+ return n < 10 ? `0${n}` : String(n);
241
+ }
242
+ function toDate(v) {
243
+ if (v === null || v === void 0 || v === "") return void 0;
244
+ if (v instanceof Date) return Number.isFinite(v.getTime()) ? v : void 0;
245
+ if (typeof v === "number" || typeof v === "string") {
246
+ const d = new Date(v);
247
+ return Number.isFinite(d.getTime()) ? d : void 0;
248
+ }
249
+ }
250
+ /**
251
+ * Format a Date for `<input type="date|datetime-local">`. Renders in the
252
+ * user's local timezone — matching browser-native behaviour for the
253
+ * underlying input element. Storage epoch-ms remains UTC.
254
+ */
255
+ function formatLocal(d, kind) {
256
+ const y = d.getFullYear();
257
+ const m = pad2(d.getMonth() + 1);
258
+ const day = pad2(d.getDate());
259
+ if (kind === "date") return `${y}-${m}-${day}`;
260
+ return `${y}-${m}-${day}T${pad2(d.getHours())}:${pad2(d.getMinutes())}`;
261
+ }
262
+ /** Extract HH:mm from an epoch-ms number / Date / ISO string. */
263
+ function formatTime(v) {
264
+ if (v === null || v === void 0 || v === "") return "";
265
+ if (typeof v === "string" && /^\d{1,2}:\d{2}(:\d{2})?$/.test(v)) {
266
+ const [hh, mm] = v.split(":");
267
+ return `${pad2(Number(hh))}:${mm}`;
268
+ }
269
+ const d = toDate(v);
270
+ if (!d) return "";
271
+ return `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;
272
+ }
273
+ /**
274
+ * Composable backing `AsDate` / `AsDatetime` / `AsTime`. Pick the variant
275
+ * via `kind`. Conversion direction:
276
+ *
277
+ * - `'date'`: epoch-ms ↔ `YYYY-MM-DD` (local TZ).
278
+ * Empty input commits `null`. If previous value was a `string`,
279
+ * commits a string (`YYYY-MM-DD`); otherwise commits epoch-ms (UTC
280
+ * midnight on the picked date in local TZ — same as `new Date(str)`).
281
+ * - `'datetime'`: epoch-ms ↔ `YYYY-MM-DDTHH:mm` (local TZ).
282
+ * - `'time'`: prev-string ↔ `HH:mm`. Numeric storage isn't meaningful
283
+ * for naked time-of-day, so we commit a string.
284
+ */
285
+ function useAsDate(opts) {
286
+ const inputType = opts.kind === "datetime" ? "datetime-local" : opts.kind === "time" ? "time" : "date";
287
+ const displayValue = computed(() => {
288
+ const v = opts.modelValue();
289
+ if (opts.kind === "time") return formatTime(v);
290
+ const d = toDate(v);
291
+ if (!d) return "";
292
+ return formatLocal(d, opts.kind === "datetime" ? "datetime" : "date");
293
+ });
294
+ function setFromInput(raw) {
295
+ if (raw === "") {
296
+ opts.onCommit(null);
297
+ return;
298
+ }
299
+ if (opts.kind === "time") {
300
+ opts.onCommit(raw);
301
+ return;
302
+ }
303
+ if (typeof opts.modelValue() === "string") {
304
+ opts.onCommit(raw);
305
+ return;
306
+ }
307
+ const d = new Date(raw);
308
+ if (!Number.isFinite(d.getTime())) return;
309
+ opts.onCommit(d.getTime());
310
+ }
311
+ return {
312
+ inputType,
313
+ displayValue,
314
+ setFromInput
315
+ };
316
+ }
317
+ //#endregion
318
+ export { as_date_control_default as n, useAsDate as t };
@@ -0,0 +1,82 @@
1
+ import { nextTick, onBeforeUnmount, ref, watch } from "vue";
2
+ //#region src/composables/focus-after-toggle.ts
3
+ const FOCUSABLE_SELECTOR = [
4
+ "input:not([type=hidden]):not([type=checkbox]):not([type=radio]):not([disabled])",
5
+ "select:not([disabled])",
6
+ "textarea:not([disabled])"
7
+ ].join(",");
8
+ /** Run an action, then focus the first focusable input descendant of `scope`. */
9
+ async function focusFirstAfter(action, scope, ticks = 1) {
10
+ action();
11
+ for (let i = 0; i < ticks; i++) await nextTick();
12
+ const root = scope();
13
+ if (!root) return;
14
+ root.querySelector(FOCUSABLE_SELECTOR)?.focus();
15
+ }
16
+ /**
17
+ * Run an action, then focus the first focusable input that wasn't present
18
+ * before the action. Used by array Add buttons so the user lands on the
19
+ * just-added row's first input regardless of how many items already exist.
20
+ * Falls back to first focusable when nothing existed before (the typical
21
+ * "enable optional + add first item" flow).
22
+ */
23
+ async function focusNewFocusableAfter(action, scope, ticks = 1) {
24
+ const before = scope();
25
+ const known = before ? new Set(before.querySelectorAll(FOCUSABLE_SELECTOR)) : null;
26
+ action();
27
+ for (let i = 0; i < ticks; i++) await nextTick();
28
+ const after = scope();
29
+ if (!after) return;
30
+ const all = after.querySelectorAll(FOCUSABLE_SELECTOR);
31
+ for (const el of all) if (!known || !known.has(el)) {
32
+ el.focus();
33
+ return;
34
+ }
35
+ }
36
+ /** Sugar over `focusFirstAfter` scoped to a template ref. */
37
+ function useAsFocusFirstAfter(onToggleOptional) {
38
+ const rootRef = ref(null);
39
+ const runAndFocus = (action, ticks = 1) => {
40
+ focusFirstAfter(action, () => rootRef.value, ticks);
41
+ };
42
+ const runAndFocusNew = (action, ticks = 1) => {
43
+ focusNewFocusableAfter(action, () => rootRef.value, ticks);
44
+ };
45
+ return {
46
+ rootRef,
47
+ runAndFocus,
48
+ runAndFocusNew,
49
+ enableOptional: () => runAndFocus(() => onToggleOptional?.(true))
50
+ };
51
+ }
52
+ //#endregion
53
+ //#region src/composables/use-as-dropdown.ts
54
+ function useAsDropdown(containerRef) {
55
+ const isOpen = ref(false);
56
+ function toggle() {
57
+ isOpen.value = !isOpen.value;
58
+ }
59
+ function close() {
60
+ isOpen.value = false;
61
+ }
62
+ function select(callback) {
63
+ callback();
64
+ close();
65
+ }
66
+ function onClickOutside(event) {
67
+ if (containerRef.value && !containerRef.value.contains(event.target)) close();
68
+ }
69
+ watch(isOpen, (open) => {
70
+ if (open) document.addEventListener("click", onClickOutside, true);
71
+ else document.removeEventListener("click", onClickOutside, true);
72
+ });
73
+ onBeforeUnmount(() => document.removeEventListener("click", onClickOutside, true));
74
+ return {
75
+ isOpen,
76
+ toggle,
77
+ close,
78
+ select
79
+ };
80
+ }
81
+ //#endregion
82
+ export { useAsFocusFirstAfter as i, focusFirstAfter as n, focusNewFocusableAfter as r, useAsDropdown as t };