@verbb/formie-browser 1.0.2 → 1.0.4

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 (94) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/chunks/{address-finder-CQW81kY0.js → address-finder-BU4roxT6.js} +2 -2
  3. package/dist/chunks/{bpoint-D8OjLmsn.js → bpoint-uNg5j6rt.js} +1 -1
  4. package/dist/chunks/{calculations-BqZsENCq.js → calculations-C9t6Zop9.js} +2 -2
  5. package/dist/chunks/{captcha-eu-DIa6aUWz.js → captcha-eu-BAPzHNts.js} +2 -2
  6. package/dist/chunks/{checkbox-radio-BI-UjgMF.js → checkbox-radio-CHeLNVIK.js} +39 -34
  7. package/dist/chunks/{conditions-BVl6jTYo.js → conditions-DKxVCsjD.js} +189 -163
  8. package/dist/chunks/{date-picker-69TgvErA.js → date-picker-B3iQ797Z.js} +2 -2
  9. package/dist/chunks/{eway-1GPxH6DU.js → eway-DCielIML.js} +2 -2
  10. package/dist/chunks/file-upload-DP2TOUYV.js +316 -0
  11. package/dist/chunks/{friendly-captcha-v1-DA2QPKA3.js → friendly-captcha-v1-DdlcGiFY.js} +1 -1
  12. package/dist/chunks/{friendly-captcha-v2-BorOWiz_.js → friendly-captcha-v2-76w-YnFm.js} +1 -1
  13. package/dist/chunks/{go-cardless-DwBgERcA.js → go-cardless-rwCkzbNK.js} +1 -1
  14. package/dist/chunks/{google-address-BcTBncyS.js → google-address-BD8IZ86V.js} +77 -58
  15. package/dist/chunks/{hcaptcha-BchdVCqq.js → hcaptcha-BNNTL6uf.js} +2 -2
  16. package/dist/chunks/{hidden-D8RqSPt7.js → hidden-CW6Rcf1N.js} +1 -1
  17. package/dist/chunks/{index-C1ZOKiAi.js → index-D6npYxvr.js} +1372 -1178
  18. package/dist/chunks/{loqate-nXuTX7In.js → loqate-B-ZNS65B.js} +2 -2
  19. package/dist/chunks/{mollie-qdCynQCd.js → mollie-BDAZ-1X4.js} +1 -1
  20. package/dist/chunks/{moneris-BNEA-laO.js → moneris-B1b0uEtY.js} +1 -1
  21. package/dist/chunks/{opayo-BJtXOkuK.js → opayo-CC5hraHo.js} +2 -2
  22. package/dist/chunks/{paddle-D72Pa8kr.js → paddle-B4GmrDsq.js} +2 -2
  23. package/dist/chunks/{paypal-Cqt2bned.js → paypal-BFS6XsIS.js} +2 -2
  24. package/dist/chunks/{payway-BjCqsc0H.js → payway-DekoJead.js} +2 -2
  25. package/dist/chunks/{phone-country-K9pYAlzM.js → phone-country-Cm5YUeXI.js} +2 -2
  26. package/dist/chunks/{place-kit-Dg6f_UoM.js → place-kit-DizZWV_e.js} +1 -1
  27. package/dist/chunks/{recaptcha-enterprise--VYAeeqz.js → recaptcha-enterprise-BbOvO7JZ.js} +2 -2
  28. package/dist/chunks/{recaptcha-shared-PSIEEEe1.js → recaptcha-shared-Dwg1eVFS.js} +2 -2
  29. package/dist/chunks/{recaptcha-v2-checkbox-atBNe5ml.js → recaptcha-v2-checkbox-SY3ti5iQ.js} +2 -2
  30. package/dist/chunks/{recaptcha-v2-invisible-DnBufNPT.js → recaptcha-v2-invisible-DSmQnn6c.js} +2 -2
  31. package/dist/chunks/{recaptcha-v3-CF6O8rDj.js → recaptcha-v3-DNh7YCnR.js} +2 -2
  32. package/dist/chunks/{repeater-CB7Yojvx.js → repeater-DM0vuFNQ.js} +2 -2
  33. package/dist/chunks/{rich-text-nAV_SQZo.js → rich-text-C8aGYp70.js} +1 -1
  34. package/dist/chunks/{scripts-BkAAux0i.js → scripts-CKTFtxPO.js} +1 -1
  35. package/dist/chunks/{shared-DGqeMvcJ.js → shared--BU5CFoL.js} +4 -4
  36. package/dist/chunks/{signature-BT6CsQ6n.js → signature-pFhZfH7d.js} +1 -1
  37. package/dist/chunks/{snaptcha-C7qQo02f.js → snaptcha-VuOUOaLj.js} +1 -1
  38. package/dist/chunks/{square-C5AH3trb.js → square-BR9pvToy.js} +4 -4
  39. package/dist/chunks/{stripe-EJK0RyUv.js → stripe-OHUwoV9g.js} +2 -2
  40. package/dist/chunks/{summary-DC_ipXCU.js → summary-Da7Ktg3N.js} +2 -2
  41. package/dist/chunks/{table-BEAI99qo.js → table-C0PmR9bI.js} +2 -2
  42. package/dist/chunks/text-limit-mLEwZDIa.js +144 -0
  43. package/dist/chunks/{turnstile-_uCRwnU-.js → turnstile-9tM7q_LK.js} +2 -2
  44. package/dist/css/theme/forms/_form.css +28 -0
  45. package/dist/index.js +9 -9
  46. package/dist/js/core/create-formie-client.d.ts.map +1 -1
  47. package/dist/js/core/field-error-container.d.ts +4 -0
  48. package/dist/js/core/field-error-container.d.ts.map +1 -0
  49. package/dist/js/core/submit-result-state.d.ts.map +1 -1
  50. package/dist/js/core/submit-result-ui.d.ts.map +1 -1
  51. package/dist/js/modules/address/google-address.d.ts +7 -0
  52. package/dist/js/modules/address/google-address.d.ts.map +1 -1
  53. package/dist/js/modules/fields/checkbox-radio.d.ts.map +1 -1
  54. package/dist/js/modules/fields/conditions/effects.d.ts +3 -1
  55. package/dist/js/modules/fields/conditions/effects.d.ts.map +1 -1
  56. package/dist/js/modules/fields/conditions.d.ts.map +1 -1
  57. package/dist/js/modules/fields/file-upload.d.ts.map +1 -1
  58. package/dist/js/modules/fields/text-limit.d.ts.map +1 -1
  59. package/dist/js/submit/pipeline.d.ts.map +1 -1
  60. package/dist/js/utils/i18n.d.ts.map +1 -1
  61. package/dist/js/validation/rules/email.d.ts.map +1 -1
  62. package/dist/js/validation/rules/number.d.ts.map +1 -1
  63. package/dist/js/validation/scope.d.ts +6 -0
  64. package/dist/js/validation/scope.d.ts.map +1 -0
  65. package/dist/js/validation/submit-readiness.d.ts +4 -0
  66. package/dist/js/validation/submit-readiness.d.ts.map +1 -0
  67. package/dist/js/validation/validator.d.ts +1 -0
  68. package/dist/js/validation/validator.d.ts.map +1 -1
  69. package/package.json +2 -2
  70. package/src/css/theme/forms/_form.css +28 -0
  71. package/src/js/core/create-formie-client.ts +6 -0
  72. package/src/js/core/field-error-container.ts +39 -0
  73. package/src/js/core/submit-result-state.ts +29 -2
  74. package/src/js/core/submit-result-ui.ts +3 -9
  75. package/src/js/modules/address/google-address.ts +33 -1
  76. package/src/js/modules/fields/checkbox-radio.ts +21 -15
  77. package/src/js/modules/fields/conditions/effects.ts +79 -2
  78. package/src/js/modules/fields/conditions.ts +53 -11
  79. package/src/js/modules/fields/file-upload.ts +200 -105
  80. package/src/js/modules/fields/text-limit.ts +87 -22
  81. package/src/js/submit/pipeline.ts +3 -28
  82. package/src/js/utils/i18n.ts +184 -5
  83. package/src/js/validation/rules/email.ts +3 -2
  84. package/src/js/validation/rules/match.ts +2 -2
  85. package/src/js/validation/rules/minmax.ts +4 -4
  86. package/src/js/validation/rules/number.ts +9 -5
  87. package/src/js/validation/rules/pattern.ts +4 -4
  88. package/src/js/validation/rules/required.ts +1 -1
  89. package/src/js/validation/rules/url.ts +1 -1
  90. package/src/js/validation/scope.ts +25 -0
  91. package/src/js/validation/submit-readiness.ts +157 -0
  92. package/src/js/validation/validator.ts +11 -7
  93. package/dist/chunks/file-upload-BDZZftgL.js +0 -281
  94. package/dist/chunks/text-limit-Blgq5G-G.js +0 -135
@@ -1,281 +0,0 @@
1
- import { b as R, r as D, d as K, a as P } from "./shared-DGqeMvcJ.js";
2
- import { e as V } from "./styles-C3aqgtek.js";
3
- import { k as C, l as x, m as O } from "./index-C1ZOKiAi.js";
4
- const B = "@layer formie-theme{.formie-file-input{padding:var(--formie-space-1);line-height:var(--formie-line-height-base);cursor:pointer}.formie-file-input::file-selector-button,.formie-file-input::-webkit-file-upload-button{appearance:none;-webkit-appearance:none;margin-inline-end:var(--formie-space-2);padding:calc(var(--formie-control-padding-y) - 1px) var(--formie-space-2);min-height:calc(var(--formie-control-height) - (var(--formie-space-1) * 2));border:var(--formie-border-width) solid var(--formie-color-border);border-radius:calc(var(--formie-radius-sm) - 1px);background:var(--formie-color-surface-subtle);color:var(--formie-color-heading);font-weight:var(--formie-font-weight-normal);font-size:var(--formie-font-size-xs);line-height:1.1;white-space:nowrap;cursor:pointer;transition:border-color .15s ease,background-color .15s ease,color .15s ease,box-shadow .15s ease}.formie-file-input:hover::file-selector-button,.formie-file-input:hover::-webkit-file-upload-button{border-color:color-mix(in srgb,var(--formie-color-border) 70%,var(--formie-color-heading) 30%);background:var(--formie-color-surface-muted)}.formie-file-input:focus{outline:0}.formie-file-input:focus-visible::file-selector-button,.formie-file-input:focus-visible::-webkit-file-upload-button{border-color:var(--formie-color-focus-ring)}.formie-field-has-error .formie-file-input::file-selector-button,.formie-field-has-error .formie-file-input::-webkit-file-upload-button{border-color:var(--formie-color-danger)}.formie-file-summary{padding:var(--formie-file-summary-padding);gap:var(--formie-gap-file-summary);border:var(--formie-border-width) solid var(--formie-color-border);border-radius:var(--formie-radius-sm)}.formie-file-summary-container{margin:0;padding-left:var(--formie-list-indent)}}", F = 'input[type="file"][data-formie-file-input]', N = C("uploaded"), L = x("reset"), q = "data-formie-file-upload-key", j = "data-formie-file-upload-hydrate-endpoint", b = "data-formie-file-upload-anchor", Y = "data-formie-file-upload-asset-id", $ = [
5
- "fileLimit",
6
- "fileSizeMinLimit",
7
- "fileSizeMaxLimit"
8
- ], U = "file-upload", I = "file-upload";
9
- V(I, [B]);
10
- function A(e) {
11
- return !!e && typeof e == "object" && !Array.isArray(e);
12
- }
13
- function v(e) {
14
- const r = Number(e);
15
- return Number.isInteger(r) && r > 0 ? r : null;
16
- }
17
- function p(e) {
18
- return typeof e == "string" ? e.trim() : "";
19
- }
20
- function J(e) {
21
- return e.getAttribute("data-formie-field-handle")?.trim() || "";
22
- }
23
- function H(e) {
24
- return e.name.endsWith("[]") ? e.name.slice(0, -2) : e.name;
25
- }
26
- function _(e) {
27
- return `${H(e)}[]`;
28
- }
29
- function W(e) {
30
- return e.getAttribute(q)?.trim() || e.getAttribute("data-formie-input-id")?.trim() || "";
31
- }
32
- function w(e) {
33
- return Array.from(e.querySelectorAll('input[type="hidden"]')).filter((r) => r instanceof HTMLInputElement);
34
- }
35
- function k(e, r) {
36
- const t = _(r);
37
- return w(e).filter((i) => i.name === t && i.value.trim() !== "");
38
- }
39
- function G(e, r) {
40
- const t = H(r), i = w(e).find((a) => a.hasAttribute(b) || a.name === t && a.value === "");
41
- if (i)
42
- return i.setAttribute(b, "true"), i.name = t, i.value = "", i;
43
- const n = document.createElement("input");
44
- return n.type = "hidden", n.name = t, n.value = "", n.setAttribute(b, "true"), r.insertAdjacentElement("afterend", n), n;
45
- }
46
- function T(e) {
47
- if (Array.isArray(e))
48
- return null;
49
- const r = v(e);
50
- if (r)
51
- return {
52
- assetId: r,
53
- filename: ""
54
- };
55
- if (!A(e))
56
- return null;
57
- const t = v(e.assetId ?? e.id ?? e.value), i = p(e.filename ?? e.title ?? e.label ?? e.name), n = p(e.url) || null;
58
- return !t && !i ? null : {
59
- assetId: t,
60
- filename: i,
61
- url: n
62
- };
63
- }
64
- function E(e) {
65
- if (!Array.isArray(e)) {
66
- const r = T(e);
67
- return r ? [r] : [];
68
- }
69
- return e.flatMap((r) => {
70
- if (Array.isArray(r))
71
- return E(r);
72
- const t = T(r);
73
- return t ? [t] : [];
74
- });
75
- }
76
- function Q(e) {
77
- return e ? Array.from(e.querySelectorAll("[data-formie-file-summary-item]")).map((r) => ({
78
- assetId: null,
79
- filename: r.textContent?.trim() || ""
80
- })).filter((r) => r.filename !== "") : [];
81
- }
82
- function X(e, r) {
83
- return k(e, r).map((t) => ({
84
- assetId: v(t.value),
85
- filename: ""
86
- })).filter((t) => t.assetId !== null);
87
- }
88
- function Z(e, r) {
89
- return e.length ? e.map((t, i) => ({
90
- assetId: t.assetId,
91
- filename: r[i]?.filename || ""
92
- })) : r;
93
- }
94
- function z(e) {
95
- return e.map((r) => r.trim().toLowerCase()).filter(Boolean);
96
- }
97
- function ee(e, r) {
98
- const t = z(e.map((n) => n.filename)), i = z(r);
99
- return !t.length || !i.length ? !1 : t.every((n) => i.includes(n));
100
- }
101
- function te(e) {
102
- D(e, U, (r) => {
103
- r.addValidator("fileLimit", ({ input: t }) => {
104
- const i = parseInt(t.getAttribute("data-formie-file-limit") || "", 10);
105
- return t.type !== "file" || !i || !("files" in t) || !t.files?.length ? !0 : t.files.length <= i;
106
- }, ({ input: t, t: i }) => i("Choose up to {files} files.", {
107
- files: t.getAttribute("data-formie-file-limit") || ""
108
- })), r.addValidator("fileSizeMinLimit", ({ input: t }) => {
109
- const n = parseFloat(t.getAttribute("data-formie-size-min-limit") || "") * 1e3 * 1e3;
110
- return t.type !== "file" || !n || !("files" in t) || !t.files?.length ? !0 : Array.from(t.files).every((a) => a.size >= n);
111
- }, ({ input: t, t: i }) => i("File must be larger than {filesize} MB.", {
112
- filesize: t.getAttribute("data-formie-size-min-limit") || ""
113
- })), r.addValidator("fileSizeMaxLimit", ({ input: t }) => {
114
- const n = parseFloat(t.getAttribute("data-formie-size-max-limit") || "") * 1e3 * 1e3;
115
- return t.type !== "file" || !n || !("files" in t) || !t.files?.length ? !0 : Array.from(t.files).every((a) => a.size <= n);
116
- }, ({ input: t, t: i }) => i("File must be smaller than {filesize} MB.", {
117
- filesize: t.getAttribute("data-formie-size-max-limit") || ""
118
- }));
119
- });
120
- }
121
- function re(e) {
122
- P(e, U, $);
123
- }
124
- function M(e, r) {
125
- const t = e.querySelector("[data-formie-file-summary]");
126
- if (t)
127
- return t;
128
- const i = document.createElement("div");
129
- return i.className = "formie-file-summary", i.setAttribute("data-formie-file-summary", "true"), r.insertAdjacentElement("afterend", i), i;
130
- }
131
- function h(e) {
132
- const r = e.pendingFiles.length ? e.pendingFiles : e.uploadedAssets.map((a) => a.filename || (a.assetId ? `Asset #${a.assetId}` : "")).filter(Boolean), t = e.summaryRoot || e.field.querySelector("[data-formie-file-summary]");
133
- if (!r.length) {
134
- t && (t.replaceChildren(), t.hidden = !0), e.summaryRoot = t;
135
- return;
136
- }
137
- const i = t || M(e.field, e.input);
138
- if (!i)
139
- return;
140
- i.hidden = !1, e.summaryRoot = i;
141
- const n = document.createElement("ul");
142
- n.className = "formie-file-summary-container", n.setAttribute("data-formie-file-summary-container", "true"), r.forEach((a) => {
143
- const o = document.createElement("li");
144
- o.className = "formie-file-summary-item", o.setAttribute("data-formie-file-summary-item", "true"), o.textContent = a, n.appendChild(o);
145
- }), i.replaceChildren(n);
146
- }
147
- function S(e, r, t) {
148
- let n = G(e, r);
149
- const a = _(r);
150
- k(e, r).forEach((o) => {
151
- o.remove();
152
- }), t.forEach((o) => {
153
- if (!o.assetId)
154
- return;
155
- const s = document.createElement("input");
156
- s.type = "hidden", s.name = a, s.value = String(o.assetId), s.setAttribute(Y, "true"), n.insertAdjacentElement("afterend", s), n = s;
157
- }), r.value = "";
158
- }
159
- async function ie(e, r, t) {
160
- const i = t.map((l) => l.assetId).filter((l) => l !== null);
161
- if (!i.length)
162
- return t;
163
- const n = r.getAttribute(j)?.trim() || "/actions/formie/file-upload/hydrate", a = new FormData();
164
- i.forEach((l) => {
165
- a.append("assetIds[]", String(l));
166
- });
167
- const o = await O(n, {
168
- method: "POST",
169
- body: a
170
- }), s = E(o.assets);
171
- if (!s.length)
172
- return t;
173
- const c = new Map(s.map((l) => [l.assetId, l]));
174
- return t.map((l) => {
175
- if (!l.assetId || !c.has(l.assetId))
176
- return l;
177
- const f = c.get(l.assetId);
178
- return {
179
- assetId: l.assetId,
180
- filename: f.filename || l.filename,
181
- url: f.url ?? l.url
182
- };
183
- });
184
- }
185
- function ne(e, r) {
186
- const t = e.detail;
187
- if (!A(t))
188
- return [];
189
- const i = p(t.fieldHandle), n = p(t.inputKey), a = p(t.inputName ?? t.name), o = A(t.data) ? t.data : null, s = p(o?.fieldHandle), c = p(o?.inputKey), l = p(o?.inputName ?? o?.name), f = [];
190
- let y = !1, g = !1, u = !1;
191
- if (n !== "" && n === r.inputKey && (y = !0, f.push(t.assets, t.assetIds, t.data)), a !== "" && a === r.inputName && (g = !0, f.push(t.assets, t.assetIds, t.data)), i === r.fieldHandle && (u = !0, f.push(t.assets, t.assetIds, t.data)), o) {
192
- const d = [
193
- o.assets,
194
- o.assetIds,
195
- o.uploadedAssets,
196
- o.data
197
- ];
198
- c !== "" && c === r.inputKey && (y = !0, f.push(...d)), l !== "" && l === r.inputName && (g = !0, f.push(...d)), s === r.fieldHandle && (u = !0, f.push(...d));
199
- }
200
- [t.assets, t.assetIds, t.data].forEach((d) => {
201
- A(d) && (r.inputKey && r.inputKey in d && (y = !0, f.push(d[r.inputKey])), r.inputName in d && (g = !0, f.push(d[r.inputName])), r.fieldHandle in d && f.push(d[r.fieldHandle]));
202
- });
203
- for (const d of f) {
204
- const m = E(d);
205
- if (m.length && (y || g || u || ee(m, r.pendingFiles)))
206
- return m;
207
- }
208
- return [];
209
- }
210
- const le = {
211
- id: I,
212
- kind: "field",
213
- match: (e) => !!e.target.querySelector(F),
214
- setup: async (e) => {
215
- const r = R(e), t = r || e.target, i = Array.from(t.querySelectorAll(F)).filter((o) => o instanceof HTMLInputElement), n = e.form;
216
- te(n);
217
- const a = i.map((o) => {
218
- if (!(r instanceof HTMLElement))
219
- return () => {
220
- };
221
- const s = {
222
- field: r,
223
- input: o,
224
- summaryRoot: M(r, o),
225
- uploadedAssets: Z(
226
- X(r, o),
227
- Q(r.querySelector("[data-formie-file-summary]"))
228
- ),
229
- pendingFiles: [],
230
- hydrationToken: 0
231
- }, c = () => {
232
- s.pendingFiles = Array.from(o.files || []).map((u) => u.name), h(s);
233
- }, l = async (u) => {
234
- s.hydrationToken += 1;
235
- const d = s.hydrationToken;
236
- s.pendingFiles = [], s.uploadedAssets = u, S(r, o, u), h(s);
237
- try {
238
- const m = await ie(r, o, u);
239
- if (d !== s.hydrationToken)
240
- return;
241
- s.uploadedAssets = m, h(s), K(r, I, "uploaded-assets-sync", {
242
- fileUpload: r,
243
- assets: m
244
- });
245
- } catch (m) {
246
- console.error("[formie] Failed to hydrate uploaded file details.", m);
247
- }
248
- }, f = () => {
249
- s.hydrationToken += 1, s.pendingFiles = [], s.uploadedAssets = [], S(r, o, []), h(s);
250
- }, y = (u) => {
251
- const d = J(r);
252
- if (!d)
253
- return;
254
- const m = ne(u, {
255
- fieldHandle: d,
256
- inputKey: W(o),
257
- inputName: o.name,
258
- pendingFiles: s.pendingFiles
259
- });
260
- m.length && l(m);
261
- }, g = () => {
262
- f();
263
- };
264
- return o.addEventListener("change", c), n?.addEventListener(N, y), n?.addEventListener(L, g), h(s), () => {
265
- o.removeEventListener("change", c), n?.removeEventListener(N, y), n?.removeEventListener(L, g);
266
- };
267
- });
268
- return await e.emit("formie:module:file-upload:init", {
269
- count: i.length
270
- }), {
271
- destroy: () => {
272
- a.forEach((o) => {
273
- o();
274
- }), re(n), e.emit("formie:module:file-upload:destroy", {});
275
- }
276
- };
277
- }
278
- };
279
- export {
280
- le as fileUploadModule
281
- };
@@ -1,135 +0,0 @@
1
- import { z as u } from "./index-BEsfee-D.js";
2
- import { b as L, r as w, a as T } from "./shared-DGqeMvcJ.js";
3
- import { e as v } from "./styles-C3aqgtek.js";
4
- const C = "@layer formie-theme{.formie-limit-number{font-weight:var(--formie-font-weight-semibold);color:var(--formie-color-text)}.formie-limit-number-error{color:var(--formie-color-danger)}}", c = "input[data-formie-single-line-text-input], textarea[data-formie-multi-line-text-input]", E = [
5
- "textMinCharacterLimit",
6
- "textMaxCharacterLimit",
7
- "textMinWordLimit",
8
- "textMaxWordLimit"
9
- ], A = "text-limit", f = "data-formie-text-limit-allow-overtype", n = /* @__PURE__ */ new WeakMap();
10
- v("text-limit", [C]);
11
- function d(t) {
12
- return t instanceof HTMLInputElement || t instanceof HTMLTextAreaElement;
13
- }
14
- function m(t, i) {
15
- return parseInt(t.getAttribute(i) || "", 10) || 0;
16
- }
17
- function M(t) {
18
- return t.hasAttribute("data-formie-min-chars") || t.hasAttribute("data-formie-max-chars") || t.hasAttribute("data-formie-min-words") || t.hasAttribute("data-formie-max-words");
19
- }
20
- function y(t) {
21
- return t.hasAttribute("data-formie-max-chars") || t.hasAttribute("data-formie-max-words");
22
- }
23
- function h(t) {
24
- return t.hasAttribute(f);
25
- }
26
- function x(t) {
27
- return t.value === "";
28
- }
29
- function V(t) {
30
- w(t, A, (i) => {
31
- i.addValidator("textMinCharacterLimit", ({ input: e }) => {
32
- if (!d(e))
33
- return !0;
34
- const r = m(e, "data-formie-min-chars");
35
- return !r || x(e) ? !0 : u(e.value).graphemeCount >= r;
36
- }, ({ label: e, input: r, t: a }) => a("{attribute} must be no less than {min} characters.", {
37
- attribute: e,
38
- min: r.getAttribute("data-formie-min-chars") || ""
39
- })), i.addValidator("textMaxCharacterLimit", ({ input: e }) => {
40
- if (!d(e) || h(e))
41
- return !0;
42
- const r = m(e, "data-formie-max-chars");
43
- return !r || x(e) ? !0 : u(e.value).graphemeCount <= r;
44
- }, ({ label: e, input: r, t: a }) => a("{attribute} must be no greater than {max} characters.", {
45
- attribute: e,
46
- max: r.getAttribute("data-formie-max-chars") || ""
47
- })), i.addValidator("textMinWordLimit", ({ input: e }) => {
48
- if (!d(e))
49
- return !0;
50
- const r = m(e, "data-formie-min-words");
51
- return !r || e.value.trim() === "" ? !0 : u(e.value).wordCount >= r;
52
- }, ({ label: e, input: r, t: a }) => a("{attribute} must be no less than {min} words.", {
53
- attribute: e,
54
- min: r.getAttribute("data-formie-min-words") || ""
55
- })), i.addValidator("textMaxWordLimit", ({ input: e }) => {
56
- if (!d(e) || h(e))
57
- return !0;
58
- const r = m(e, "data-formie-max-words");
59
- return !r || e.value.trim() === "" ? !0 : u(e.value).wordCount <= r;
60
- }, ({ label: e, input: r, t: a }) => a("{attribute} must be no greater than {max} words.", {
61
- attribute: e,
62
- max: r.getAttribute("data-formie-max-words") || ""
63
- }));
64
- });
65
- }
66
- function I(t) {
67
- T(t, A, E);
68
- }
69
- function O(t) {
70
- if (n.has(t))
71
- return n.get(t) || null;
72
- const i = t.closest("[data-formie-field-handle]");
73
- if (!i)
74
- return n.set(t, null), null;
75
- const e = i.querySelector("[data-formie-limit-text]");
76
- if (e)
77
- return n.set(t, e), e;
78
- const r = i.querySelector("[data-formie-field-control]"), a = document.createElement("div");
79
- return a.className = "formie-field-limit formie-limit-text", a.setAttribute("data-formie-field-limit", "true"), a.setAttribute("data-formie-limit-text", "true"), r?.parentElement ? (r.insertAdjacentElement("afterend", a), n.set(t, a), a) : (i.appendChild(a), n.set(t, a), a);
80
- }
81
- function b(t, i, e) {
82
- const r = document.createElement("span");
83
- r.className = i < 0 ? "formie-limit-number formie-limit-number-error" : "formie-limit-number", r.textContent = String(i), t.replaceChildren(
84
- r,
85
- document.createTextNode(` ${Math.abs(i) === 1 ? e : `${e}s`} left`)
86
- );
87
- }
88
- function g(t) {
89
- const i = m(t, "data-formie-max-chars"), e = m(t, "data-formie-max-words"), r = O(t);
90
- if (!r)
91
- return;
92
- const a = u(t.value);
93
- if (i > 0) {
94
- const s = i - a.graphemeCount;
95
- b(r, s, "character");
96
- return;
97
- }
98
- if (e > 0) {
99
- const s = e - a.wordCount;
100
- b(r, s, "word");
101
- }
102
- }
103
- const _ = {
104
- id: "text-limit",
105
- kind: "field",
106
- match: (t) => !!t.target.querySelector(c),
107
- setup: async (t) => {
108
- const i = t.options || {}, e = L(t), r = Array.from((e || t.target).querySelectorAll(c)).filter((o) => (o instanceof HTMLInputElement || o instanceof HTMLTextAreaElement) && M(o)), a = r.filter((o) => y(o));
109
- i.allowOvertype && r.forEach((o) => {
110
- o.setAttribute(f, "true");
111
- }), V(t.form);
112
- const s = a.map((o) => {
113
- const l = () => {
114
- g(o);
115
- };
116
- return o.addEventListener("input", l), o.addEventListener("change", l), g(o), () => {
117
- o.removeEventListener("input", l), o.removeEventListener("change", l);
118
- };
119
- });
120
- return await t.emit("formie:module:text-limit:init", {
121
- count: r.length
122
- }), {
123
- destroy: () => {
124
- s.forEach((o) => {
125
- o();
126
- }), i.allowOvertype && r.forEach((o) => {
127
- o.removeAttribute(f);
128
- }), I(t.form), t.emit("formie:module:text-limit:destroy", {});
129
- }
130
- };
131
- }
132
- };
133
- export {
134
- _ as textLimitModule
135
- };