@xwadex/fesd 0.0.19 → 0.0.21

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,19 +1,19 @@
1
- var U = (r, e, t) => {
1
+ var M = (r, e, t) => {
2
2
  if (!e.has(r))
3
3
  throw TypeError("Cannot " + t);
4
4
  };
5
- var V = (r, e, t) => {
5
+ var D = (r, e, t) => {
6
6
  if (e.has(r))
7
7
  throw TypeError("Cannot add the same private member more than once");
8
8
  e instanceof WeakSet ? e.add(r) : e.set(r, t);
9
9
  };
10
- var _ = (r, e, t) => (U(r, e, "access private method"), t);
11
- import { n as z, o as C } from "./image-preview-bundle.js";
12
- import { x as ue, B as de, z as fe, G as pe, F as me, J as ye, K as he, E as ve, L as ge, O as be, P as xe, Q as Se, X as ke, Y as Ae, w as Ee, U as we, W as qe, u as Ce, t as Le, V as Oe, q as Te, r as Fe, p as Ge, S as $e, y as Ie, H as Ne, N as Ve } from "./image-preview-bundle.js";
13
- import { o as H, z as P } from "./vendor-bundle.js";
14
- import b from "jquery";
10
+ var V = (r, e, t) => (M(r, e, "access private method"), t);
11
+ import { n as U, o as q } from "./image-preview-bundle.js";
12
+ import { x as ue, B as de, z as fe, G as pe, F as me, J as ye, K as he, E as ve, L as ge, O as be, P as ke, Q as xe, X as Se, Y as Ae, w as Ee, U as we, W as Ce, u as qe, t as Le, V as Oe, q as Te, r as Fe, p as Ge, S as $e, y as Ie, H as Ne, N as De } from "./image-preview-bundle.js";
13
+ import { o as z, z as H } from "./vendor-bundle.js";
14
+ import v from "jquery";
15
15
  import w from "validator";
16
- import D from "flatpickr";
16
+ import _ from "flatpickr";
17
17
  function se() {
18
18
  if (!document.body.classList.contains("error") || document.querySelector(".back-home") == null)
19
19
  return;
@@ -25,55 +25,55 @@ function se() {
25
25
  }
26
26
  function Q(r, e = r) {
27
27
  if (r.complete) {
28
- const o = new H().getColor(r), i = o[0] * 0.299 + o[1] * 0.587 + o[2] * 0.114;
29
- G(i, e), e.classList.add("detected");
28
+ const o = new z().getColor(r), s = o[0] * 0.299 + o[1] * 0.587 + o[2] * 0.114;
29
+ G(s, e), e.classList.add("detected");
30
30
  }
31
31
  }
32
32
  function G(r, e) {
33
33
  const t = e.getAttribute("addClassEl");
34
34
  r >= 192 ? t && t !== "" ? t.split(",").forEach((o) => {
35
- var i;
36
- e.closest(o) || console.error(`closest "${o}" not found`), (i = e.closest(o)) == null || i.classList.add("is-light");
35
+ var s;
36
+ e.closest(o) || console.error(`closest "${o}" not found`), (s = e.closest(o)) == null || s.classList.add("is-light");
37
37
  }) : e.classList.add("is-light") : t && t !== "" ? t.split(",").forEach((o) => {
38
- var i;
39
- e.closest(o) || console.error(`closest "${o}" not found`), (i = e.closest(o)) == null || i.classList.add("is-dark");
38
+ var s;
39
+ e.closest(o) || console.error(`closest "${o}" not found`), (s = e.closest(o)) == null || s.classList.add("is-dark");
40
40
  }) : e.classList.add("is-dark");
41
41
  }
42
42
  function W(r, e, t) {
43
- const o = document.createElement("canvas"), i = o.getContext("2d");
43
+ const o = document.createElement("canvas"), s = o.getContext("2d");
44
44
  if (o.width = 50, o.height = 50, r !== "" && e === "")
45
- i.fillStyle = r;
45
+ s.fillStyle = r;
46
46
  else if (r !== "" && e !== "") {
47
- const f = i.createLinearGradient(0, 0, o.width, o.height);
48
- f.addColorStop(0, r), f.addColorStop(1, e), i.fillStyle = f;
47
+ const p = s.createLinearGradient(0, 0, o.width, o.height);
48
+ p.addColorStop(0, r), p.addColorStop(1, e), s.fillStyle = p;
49
49
  }
50
- i.fillRect(0, 0, o.width, o.height);
51
- const p = new Image();
52
- return p.src = o.toDataURL(), p.crossOrigin = "Anonymous", p.addEventListener("load", function() {
50
+ s.fillRect(0, 0, o.width, o.height);
51
+ const d = new Image();
52
+ return d.src = o.toDataURL(), d.crossOrigin = "Anonymous", d.addEventListener("load", function() {
53
53
  Q(this, t);
54
- }), p;
54
+ }), d;
55
55
  }
56
56
  function ie() {
57
57
  [...document.querySelectorAll(".detect-shade:not(.detected)")].forEach((e) => {
58
58
  if (e.tagName === "IMG")
59
59
  return;
60
- const t = ["#FFF", "#FFFFFF", "#fff", "#ffffff"], o = ["#000", "#000000"], i = getComputedStyle(e).getPropertyValue("--start-color"), p = getComputedStyle(e).getPropertyValue("--end-color");
61
- if (i === "" && p === "") {
60
+ const t = ["#FFF", "#FFFFFF", "#fff", "#ffffff"], o = ["#000", "#000000"], s = getComputedStyle(e).getPropertyValue("--start-color"), d = getComputedStyle(e).getPropertyValue("--end-color");
61
+ if (s === "" && d === "") {
62
62
  console.error(e, "=> No color set!");
63
63
  return;
64
- } else if (t.indexOf(i) > 0) {
64
+ } else if (t.indexOf(s) > 0) {
65
65
  console.warn(e, "=> TypeError!! ( #FFF ) "), G(255, e);
66
66
  return;
67
- } else if (o.indexOf(i) > 0) {
67
+ } else if (o.indexOf(s) > 0) {
68
68
  console.warn(e, "=> TypeError!! ( #000 ) "), G(0, e);
69
69
  return;
70
70
  }
71
- W(i, p, e);
71
+ W(s, d, e);
72
72
  });
73
73
  }
74
74
  const O = {
75
75
  CG_A: function(r) {
76
- b("html,body").delay(100).animate(
76
+ v("html,body").delay(100).animate(
77
77
  { opacity: "0" },
78
78
  {
79
79
  queue: !0,
@@ -86,7 +86,7 @@ const O = {
86
86
  );
87
87
  },
88
88
  CG_B: function(r) {
89
- b("main").append("<div id='CG_Abg'><div class='CG_Abg1'></div><div class='CG_Abg2'></div></div>"), b("body").delay(1200).animate(
89
+ v("main").append("<div id='CG_Abg'><div class='CG_Abg1'></div><div class='CG_Abg2'></div></div>"), v("body").delay(1200).animate(
90
90
  { opacity: "0" },
91
91
  {
92
92
  queue: !0,
@@ -101,7 +101,7 @@ const O = {
101
101
  );
102
102
  },
103
103
  CG_C: function(r) {
104
- b("main").append("<div id='CG_Bbg'></div>"), b("body").delay(1200).animate(
104
+ v("main").append("<div id='CG_Bbg'></div>"), v("body").delay(1200).animate(
105
105
  { opacity: "0" },
106
106
  {
107
107
  queue: !0,
@@ -116,7 +116,7 @@ const O = {
116
116
  );
117
117
  },
118
118
  CG_D: function(r) {
119
- b("main").append("<div id='CG_Cbg'><div class='CG_Cbg1'></div><div class='CG_Cbg2'></div></div>"), b("body").delay(1200).animate(
119
+ v("main").append("<div id='CG_Cbg'><div class='CG_Cbg1'></div><div class='CG_Cbg2'></div></div>"), v("body").delay(1200).animate(
120
120
  { opacity: "0" },
121
121
  {
122
122
  queue: !0,
@@ -145,38 +145,52 @@ const O = {
145
145
  O.CG_D(r);
146
146
  break;
147
147
  }
148
- }, K = (r) => {
148
+ }, K = (r, e) => {
149
149
  r.preventDefault();
150
- const e = b(r.currentTarget), t = e.attr("target"), o = e.attr("href");
151
- let i;
152
- e.hasClass("href-link") ? i = e.closest("[data-href]").attr("data-href") : i = o;
150
+ const t = v(r.currentTarget), o = t.attr("target"), s = t.attr("href");
151
+ let d;
152
+ if (e) {
153
+ if (t.is("[data-nolink]")) {
154
+ r.stopPropagation(), r.preventDefault();
155
+ return;
156
+ }
157
+ t.hasClass("click-block") ? d = t.closest("[data-href]").attr("data-href") : d = s;
158
+ } else {
159
+ if (t.is("[data-nolink]")) {
160
+ r.stopPropagation(), r.preventDefault();
161
+ return;
162
+ }
163
+ t.hasClass("href-link") ? d = t.closest("[data-href]").attr("data-href") : d = s;
164
+ }
153
165
  let f = window.location.pathname.replace("http://", "").split("/");
154
- f = a(f);
155
- const d = i.replace("http://", "");
156
- let n = d.split("/");
157
- n = a(n);
158
- function a(s) {
159
- const c = s.pop();
160
- return c.indexOf("#") > -1 || c.indexOf("html") > 0 ? s.push(c) : (c == "" || s.push(c), s.push("index.html")), s;
166
+ f = i(f);
167
+ const c = d.replace("http://", "");
168
+ let a = c.split("/");
169
+ a = i(a);
170
+ function i(u) {
171
+ const l = u.pop();
172
+ return l.indexOf("#") > -1 || l.indexOf("html") > 0 ? u.push(l) : (l == "" || u.push(l), u.push("index.html")), u;
161
173
  }
162
- t == "_blank" || r.ctrlKey || r.metaKey ? window.open(i) : d.indexOf("jpg") > -1 || d.indexOf("javascript") > -1 || R(i);
174
+ o == "_blank" || r.ctrlKey || r.metaKey ? window.open(d) : c.indexOf("jpg") > -1 || c.indexOf("javascript") > -1 || R(d);
163
175
  }, X = (r) => {
164
- const t = b(r.currentTarget).closest("[data-href]");
176
+ const t = v(r.currentTarget).closest("[data-href]");
165
177
  t.hasClass("isHover") || t.addClass("isHover");
166
178
  }, Y = (r) => {
167
- const t = b(r.currentTarget).closest("[data-href]");
179
+ const t = v(r.currentTarget).closest("[data-href]");
168
180
  t.hasClass("isHover") && t.removeClass("isHover");
169
- }, ae = () => {
170
- b.easing.jswing = b.easing.swing, b.extend(b.easing, {
181
+ }, ae = (r = !0) => {
182
+ v.easing.jswing = v.easing.swing, v.extend(v.easing, {
171
183
  def: "easeOutQuad",
172
- easeOutQuad: function(r, e, t, o, i) {
173
- return -o * (e /= i) * (e - 2) + t;
184
+ easeOutQuad: function(e, t, o, s, d) {
185
+ return -s * (t /= d) * (t - 2) + o;
174
186
  },
175
- easeInOutCirc: function(r, e, t, o, i) {
176
- return (e /= i / 2) < 1 ? -o / 2 * (Math.sqrt(1 - e * e) - 1) + t : o / 2 * (Math.sqrt(1 - (e -= 2) * e) + 1) + t;
187
+ easeInOutCirc: function(e, t, o, s, d) {
188
+ return (t /= d / 2) < 1 ? -s / 2 * (Math.sqrt(1 - t * t) - 1) + o : s / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + o;
177
189
  }
178
- }), b("body").on("click", "a:not(.nocg), .href-link", (r) => K(r)), b("body").on("mouseenter", "[data-href] a", (r) => X(r)), b("body").on("mouseleave", "[data-href] a", (r) => Y(r));
179
- }, q = {
190
+ }), v("body").on("click", "a:not(.nocg), .href-link, .click-block, [data-nolink]", (e) => K(e, r)), v("body").on("click", "a:not(.nocg)", function(e) {
191
+ e.stopPropagation();
192
+ }), v("body").on("mouseenter", "[data-href] a", (e) => X(e)), v("body").on("mouseleave", "[data-href] a", (e) => Y(e));
193
+ }, C = {
180
194
  "zh-TW": {
181
195
  format: "格式錯誤",
182
196
  input: "尚未填寫",
@@ -214,7 +228,7 @@ class le {
214
228
  /**
215
229
  * 綁事件
216
230
  */
217
- V(this, T);
231
+ D(this, T);
218
232
  this.element = document.querySelector(e), this.allField = this.element.querySelectorAll(`${e} [form-field]`), this.allInput = this.element.querySelectorAll(`${e} input`), this.allTextarea = this.element.querySelectorAll(`${e} textarea`), this.allCheckbox = this.element.querySelectorAll(`${e} input[type="checkbox"]`), this.allRadio = this.element.querySelectorAll(`${e} input[type="radio"]`), this.allFileUpload = this.element.querySelectorAll(`${e} fake-file-upload`), this.allDropdown = this.element.querySelectorAll(`${e} dropdown-el`), this.submitEvent = new Event("submit");
219
233
  const o = {
220
234
  locale: "zh-TW",
@@ -222,7 +236,7 @@ class le {
222
236
  {
223
237
  el: ".datepicker-input",
224
238
  options: {
225
- locale: P.Mandarin
239
+ locale: H.Mandarin
226
240
  }
227
241
  }
228
242
  ],
@@ -244,18 +258,18 @@ class le {
244
258
  underField: !1,
245
259
  detailOutput: !1
246
260
  }
247
- }, i = (p, f) => {
248
- const d = { ...p };
249
- for (let n of Object.keys(f))
250
- typeof f[n] == "object" && n in p ? d[n] = Array.isArray(d[n]) ? [...f[n]] : i(p[n], f[n]) : d[n] = f[n];
251
- return d;
261
+ }, s = (d, p) => {
262
+ const f = { ...d };
263
+ for (let c of Object.keys(p))
264
+ typeof p[c] == "object" && c in d ? f[c] = Array.isArray(f[c]) ? [...p[c]] : s(d[c], p[c]) : f[c] = p[c];
265
+ return f;
252
266
  };
253
- this.options = t ? i(o, t) : o, this.init();
267
+ this.options = t ? s(o, t) : o, this.init();
254
268
  }
255
269
  init() {
256
270
  var t;
257
271
  const e = this;
258
- e.element.value = e.getValue(), e.detailOutputEl = e.options.errorText.detailOutput ? document.querySelector(e.options.errorText.detailOutput) : null, _(t = e, T, j).call(t);
272
+ e.element.value = e.getValue(), e.detailOutputEl = e.options.errorText.detailOutput ? document.querySelector(e.options.errorText.detailOutput) : null, V(t = e, T, j).call(t);
259
273
  }
260
274
  /**
261
275
  * 取得表單所有的值
@@ -265,47 +279,47 @@ class le {
265
279
  const e = this;
266
280
  let t = {};
267
281
  return [...e.allField].forEach((o) => {
268
- const i = o.getAttribute("form-field");
282
+ const s = o.getAttribute("form-field");
269
283
  switch (o.getAttribute("field-type")) {
270
284
  case "isRadio":
271
- const f = o.querySelector("input:checked"), d = f.querySelector('input[type="text"]');
272
- t[i] = {
273
- id: parseInt(f.closest(".option-item").querySelector(".text").getAttribute("data-id")),
274
- value: d ? d.value : f.closest(".option-item").querySelector(".text").textContent
285
+ const p = o.querySelector("input:checked"), f = p.querySelector('input[type="text"]');
286
+ t[s] = {
287
+ id: parseInt(p.closest(".option-item").querySelector(".text").getAttribute("data-id")),
288
+ value: f ? f.value : p.closest(".option-item").querySelector(".text").textContent
275
289
  };
276
290
  break;
277
291
  case "isCheckBox":
278
- const n = o.querySelectorAll("input:checked");
279
- t[i] = [...n].map((c) => {
280
- const u = c.querySelector('input[type="text"]');
292
+ const c = o.querySelectorAll("input:checked");
293
+ t[s] = [...c].map((u) => {
294
+ const l = u.querySelector('input[type="text"]');
281
295
  return {
282
- id: parseInt(c.closest(".option-item").querySelector(".text").getAttribute("data-id")),
283
- value: u ? u.value : c.closest(".option-item").querySelector(".text").textContent
296
+ id: parseInt(u.closest(".option-item").querySelector(".text").getAttribute("data-id")),
297
+ value: l ? l.value : u.closest(".option-item").querySelector(".text").textContent
284
298
  };
285
299
  });
286
300
  break;
287
301
  case "isSelect":
288
302
  switch (o.hasAttribute("multiple") ? "multiple" : "single") {
289
303
  case "single":
290
- t[i] = {
304
+ t[s] = {
291
305
  value: o.s.value.id ? o.s.value.id : "",
292
306
  display: o.s.value.el ? o.s.value.el.textContent : ""
293
307
  };
294
308
  break;
295
309
  case "multiple":
296
- t[i] = {
297
- value: o.s.value.map((c) => c.id),
298
- display: o.s.value.map((c) => c.el.textContent)
310
+ t[s] = {
311
+ value: o.s.value.map((u) => u.id),
312
+ display: o.s.value.map((u) => u.el.textContent)
299
313
  };
300
314
  break;
301
315
  }
302
316
  break;
303
317
  case "isFile":
304
- const s = o.closest(".file-wrap").querySelector(".fake-file-upload input");
305
- t[i] = s ? s.files : void 0;
318
+ const i = o.closest(".file-wrap").querySelector(".fake-file-upload input");
319
+ t[s] = i ? i.files : void 0;
306
320
  break;
307
321
  default:
308
- t[i] = o.value;
322
+ t[s] = o.value;
309
323
  break;
310
324
  }
311
325
  }), t;
@@ -316,107 +330,107 @@ class le {
316
330
  * @returns
317
331
  */
318
332
  verify(e) {
319
- var d;
320
- const t = this, { options: o } = t, i = t.element.value, p = e || i;
321
- function f(n) {
322
- var s, c, u, l;
333
+ var f;
334
+ const t = this, { options: o } = t, s = t.element.value, d = e || s;
335
+ function p(c) {
336
+ var i, u, l, n;
323
337
  const a = '<div class="validation-icon"></div>';
324
- for (const v in n) {
325
- const S = t.element.querySelector(`[form-field="${v}"]`), L = S.getAttribute("data-verify"), m = S.closest(".form-group");
338
+ for (const g in c) {
339
+ const x = t.element.querySelector(`[form-field="${g}"]`), L = x.getAttribute("data-verify"), m = x.closest(".form-group");
326
340
  switch (L) {
327
341
  case "select":
328
- const E = S.querySelector(".select-wrapper"), y = E.querySelector(".dropdown-icon");
329
- (s = E.querySelector(".validation-icon")) == null || s.remove(), E.insertBefore(C(a), y);
342
+ const E = x.querySelector(".select-wrapper"), y = E.querySelector(".dropdown-icon");
343
+ (i = E.querySelector(".validation-icon")) == null || i.remove(), E.insertBefore(q(a), y);
330
344
  break;
331
345
  case "radio":
332
346
  case "checkbox":
333
- (c = m.querySelector(".validation-icon")) == null || c.remove(), m.append(C(a));
347
+ (u = m.querySelector(".validation-icon")) == null || u.remove(), m.append(q(a));
334
348
  break;
335
349
  case "file":
336
- const h = S.closest(".file-wrap").querySelector(".fake-file-upload"), x = S.closest(".file-wrap").querySelector(".upload-icon");
337
- (u = h.querySelector(".validation-icon")) == null || u.remove(), x ? h.insertBefore(C(a), x) : h.append(C(a));
350
+ const h = x.closest(".file-wrap").querySelector(".fake-file-upload"), k = x.closest(".file-wrap").querySelector(".upload-icon");
351
+ (l = h.querySelector(".validation-icon")) == null || l.remove(), k ? h.insertBefore(q(a), k) : h.append(q(a));
338
352
  break;
339
353
  case "date":
340
354
  case "textarea":
341
355
  default:
342
- (l = S.closest(".input-wrap").querySelector(".validation-icon")) == null || l.remove(), S.closest(".input-wrap").append(C(a));
356
+ (n = x.closest(".input-wrap").querySelector(".validation-icon")) == null || n.remove(), x.closest(".input-wrap").append(q(a));
343
357
  break;
344
358
  }
345
359
  }
346
360
  }
347
- if (f(p), e) {
348
- const n = Object.keys(p)[0];
349
- t.element.querySelectorAll(`.error-text[name="${n}"]`).forEach((a) => a.remove());
361
+ if (p(d), e) {
362
+ const c = Object.keys(d)[0];
363
+ t.element.querySelectorAll(`.error-text[name="${c}"]`).forEach((a) => a.remove());
350
364
  } else
351
- t.element.querySelectorAll(".error-text").forEach((n) => n.remove());
352
- for (const n in p) {
353
- let m = function(h, x, k) {
354
- const g = t.element.querySelector(`[form-field="${n}"]`), $ = [...t.element.querySelectorAll("[form-field]")].indexOf(g), A = (F) => `<p class="error-text" name="${n}" index="${$}">${c} - ${q[o.locale][F]}</p>`;
355
- switch (x) {
365
+ t.element.querySelectorAll(".error-text").forEach((c) => c.remove());
366
+ for (const c in d) {
367
+ let m = function(h, k, S) {
368
+ const b = t.element.querySelector(`[form-field="${c}"]`), $ = [...t.element.querySelectorAll("[form-field]")].indexOf(b), A = (F) => `<p class="error-text" name="${c}" index="${$}">${u} - ${C[o.locale][F]}</p>`;
369
+ switch (k) {
356
370
  case "underField":
357
371
  if (!o.errorText.underField)
358
372
  return;
359
- k.append(C(A(h)));
373
+ S.append(q(A(h)));
360
374
  break;
361
375
  case "detail":
362
- if (!k)
376
+ if (!S)
363
377
  return;
364
- k.append(C(A(h)));
378
+ S.append(q(A(h)));
365
379
  break;
366
380
  }
367
381
  }, E = function() {
368
382
  const h = t.detailOutputEl.querySelectorAll(".error-text");
369
383
  [...h].length > 0 ? t.element.classList.add("something-wrong") : t.element.classList.remove("something-wrong");
370
- const x = [...h].sort((k, g) => k.getAttribute("index") - g.getAttribute("index"));
371
- t.detailOutputEl && (t.detailOutputEl.textContent = ""), x.forEach((k) => {
372
- var g;
373
- return (g = t.detailOutputEl) == null ? void 0 : g.appendChild(k);
384
+ const k = [...h].sort((S, b) => S.getAttribute("index") - b.getAttribute("index"));
385
+ t.detailOutputEl && (t.detailOutputEl.textContent = ""), k.forEach((S) => {
386
+ var b;
387
+ return (b = t.detailOutputEl) == null ? void 0 : b.appendChild(S);
374
388
  });
375
389
  };
376
- const a = t.element.querySelector(`[form-field="${n}"]`), s = a.closest(".form-group"), c = (d = s.querySelector(".subject")) == null ? void 0 : d.textContent, u = a.getAttribute("data-verify"), l = () => typeof i[n] == "object" && !Array.isArray(i[n]) ? u === "file" ? i[n] : i[n].value : i[n], v = () => u === "file" ? l() === void 0 ? !0 : l() && l().length === 0 : Array.isArray(l()) && l().length === 0 || !Array.isArray(l()) && w.isEmpty(l()), S = () => u === "file" ? l() === void 0 ? !1 : l() && l().length > 0 : Array.isArray(l()) && l().length > 0 || !Array.isArray(l()) && !w.isEmpty(l()), L = s.classList.contains("required");
390
+ const a = t.element.querySelector(`[form-field="${c}"]`), i = a.closest(".form-group"), u = (f = i.querySelector(".subject")) == null ? void 0 : f.textContent, l = a.getAttribute("data-verify"), n = () => typeof s[c] == "object" && !Array.isArray(s[c]) ? l === "file" ? s[c] : s[c].value : s[c], g = () => l === "file" ? n() === void 0 ? !0 : n() && n().length === 0 : Array.isArray(n()) && n().length === 0 || !Array.isArray(n()) && w.isEmpty(n()), x = () => l === "file" ? n() === void 0 ? !1 : n() && n().length > 0 : Array.isArray(n()) && n().length > 0 || !Array.isArray(n()) && !w.isEmpty(n()), L = i.classList.contains("required");
377
391
  let y;
378
- if (L && v())
379
- switch (a.classList.remove("success"), a.classList.add("error"), s.classList.add("error"), u) {
392
+ if (L && g())
393
+ switch (a.classList.remove("success"), a.classList.add("error"), i.classList.add("error"), l) {
380
394
  case "select":
381
- y = a.querySelector(".validation-icon"), y.setAttribute("error-text", q[o.locale].select), m("select", "underField", s.parentNode), m("select", "detail", t.detailOutputEl);
395
+ y = a.querySelector(".validation-icon"), y.setAttribute("error-text", C[o.locale].select), m("select", "underField", i.parentNode), m("select", "detail", t.detailOutputEl);
382
396
  break;
383
397
  case "radio":
384
398
  case "checkbox":
385
- y = s.querySelector(".validation-icon"), y.setAttribute("error-text", q[o.locale].select), m("select", "underField", s.parentNode), m("select", "detail", t.detailOutputEl);
399
+ y = i.querySelector(".validation-icon"), y.setAttribute("error-text", C[o.locale].select), m("select", "underField", i.parentNode), m("select", "detail", t.detailOutputEl);
386
400
  break;
387
401
  case "file":
388
- y = a.closest(".file-wrap").querySelector(".validation-icon"), y.setAttribute("error-text", q[o.locale].file), m("file", "underField", s.parentNode), m("file", "detail", t.detailOutputEl);
402
+ y = a.closest(".file-wrap").querySelector(".validation-icon"), y.setAttribute("error-text", C[o.locale].file), m("file", "underField", i.parentNode), m("file", "detail", t.detailOutputEl);
389
403
  break;
390
404
  default:
391
- y = a.closest(".input-wrap").querySelector(".validation-icon"), y.setAttribute("error-text", q[o.locale].input), m("input", "underField", s.parentNode), m("input", "detail", t.detailOutputEl);
405
+ y = a.closest(".input-wrap").querySelector(".validation-icon"), y.setAttribute("error-text", C[o.locale].input), m("input", "underField", i.parentNode), m("input", "detail", t.detailOutputEl);
392
406
  break;
393
407
  }
394
- if (S()) {
395
- let h = function(x, k) {
396
- const g = x.closest(".form-group");
397
- x.classList.toggle("error", !k), x.classList.toggle("success", k);
398
- const A = x.getAttribute("data-verify") === "phone" ? g.querySelector("*:not(input)[form-field]") : g.querySelector("*:not(dropdown-el)[form-field]"), F = !!A, I = x.classList.contains("success"), B = x.classList.contains("error"), M = A == null ? void 0 : A.classList.contains("success"), N = A == null ? void 0 : A.classList.contains("error");
399
- F ? M && !N && I ? (g.classList.remove("error"), g.classList.add("success")) : (N || B) && (g.classList.remove("success"), g.classList.add("error")) : I ? (g.classList.remove("error"), g.classList.add("success")) : (g.classList.add("error"), g.classList.remove("success"));
408
+ if (x()) {
409
+ let h = function(k, S) {
410
+ const b = k.closest(".form-group");
411
+ k.classList.toggle("error", !S), k.classList.toggle("success", S);
412
+ const A = k.getAttribute("data-verify") === "phone" ? b.querySelector("*:not(input)[form-field]") : b.querySelector("*:not(dropdown-el)[form-field]"), F = !!A, I = k.classList.contains("success"), P = k.classList.contains("error"), B = A == null ? void 0 : A.classList.contains("success"), N = A == null ? void 0 : A.classList.contains("error");
413
+ F ? B && !N && I ? (b.classList.remove("error"), b.classList.add("success")) : (N || P) && (b.classList.remove("success"), b.classList.add("error")) : I ? (b.classList.remove("error"), b.classList.add("success")) : (b.classList.add("error"), b.classList.remove("success"));
400
414
  };
401
- switch (u) {
415
+ switch (l) {
402
416
  case "phone":
403
- const x = s.querySelector("dropdown-el");
404
- w.isMobilePhone(l()) ? (h(a, !0), x && x.classList.contains("success") && (s.classList.remove("error"), s.classList.add("success"))) : (h(a, !1), y = a.closest(".input-wrap").querySelector(".validation-icon"), y.setAttribute("error-text", q[o.locale].format), m("format", "underField", s.parentNode), m("format", "detail", t.detailOutputEl));
417
+ const k = i.querySelector("dropdown-el");
418
+ w.isMobilePhone(n()) ? (h(a, !0), k && k.classList.contains("success") && (i.classList.remove("error"), i.classList.add("success"))) : (h(a, !1), y = a.closest(".input-wrap").querySelector(".validation-icon"), y.setAttribute("error-text", C[o.locale].format), m("format", "underField", i.parentNode), m("format", "detail", t.detailOutputEl));
405
419
  break;
406
420
  case "password":
407
- w.isStrongPassword(l(), {
421
+ w.isStrongPassword(n(), {
408
422
  minLength: 8,
409
423
  minLowercase: 1,
410
424
  minUppercase: 0,
411
425
  minNumbers: 1,
412
426
  minSymbols: 0
413
- }) ? h(a, !0) : (h(a, !1), y = a.closest(".input-wrap").querySelector(".validation-icon"), y.setAttribute("error-text", q[o.locale].format), m("format", "underField", s.parentNode), m("format", "detail", t.detailOutputEl));
427
+ }) ? h(a, !0) : (h(a, !1), y = a.closest(".input-wrap").querySelector(".validation-icon"), y.setAttribute("error-text", C[o.locale].format), m("format", "underField", i.parentNode), m("format", "detail", t.detailOutputEl));
414
428
  break;
415
429
  case "email":
416
- w.isEmail(l()) ? h(a, !0) : (h(a, !1), y = a.closest(".input-wrap").querySelector(".validation-icon"), y.setAttribute("error-text", q[o.locale].format), m("format", "underField", s.parentNode), m("format", "detail", t.detailOutputEl));
430
+ w.isEmail(n()) ? h(a, !0) : (h(a, !1), y = a.closest(".input-wrap").querySelector(".validation-icon"), y.setAttribute("error-text", C[o.locale].format), m("format", "underField", i.parentNode), m("format", "detail", t.detailOutputEl));
417
431
  break;
418
432
  case "verifyCode":
419
- w.isNumeric(l(), { no_symbols: !0 }) && w.isLength(l(), { min: 4, max: 4 }) ? h(a, !0) : (h(a, !1), y = a.closest(".input-wrap").querySelector(".validation-icon"), y.setAttribute("error-text", q[o.locale].format), m("format", "underField", s.parentNode), m("format", "detail", t.detailOutputEl));
433
+ w.isNumeric(n(), { no_symbols: !0 }) && w.isLength(n(), { min: 4, max: 4 }) ? h(a, !0) : (h(a, !1), y = a.closest(".input-wrap").querySelector(".validation-icon"), y.setAttribute("error-text", C[o.locale].format), m("format", "underField", i.parentNode), m("format", "detail", t.detailOutputEl));
420
434
  break;
421
435
  case "select":
422
436
  default:
@@ -438,96 +452,96 @@ class le {
438
452
  * 清除表單所有欄位
439
453
  */
440
454
  clear() {
441
- const e = this, { allInput: t, allTextarea: o, allCheckbox: i, allFileUpload: p, allDropdown: f } = e;
442
- [...e.allField].forEach((d) => {
455
+ const e = this, { allInput: t, allTextarea: o, allCheckbox: s, allFileUpload: d, allDropdown: p } = e;
456
+ [...e.allField].forEach((f) => {
443
457
  var a;
444
- const n = d.closest(".form-group");
445
- n.classList.remove("success"), n.classList.remove("error"), d.classList.remove("success"), d.classList.remove("error"), (a = d.closest(".form-grid").querySelector(".error-text")) == null || a.remove(), e.detailOutputEl && (e.detailOutputEl.textContent = "");
446
- }), [...t].forEach((d) => {
447
- d.value = "";
448
- }), [...o].forEach((d) => {
449
- d.value = "";
450
- }), [...i].forEach((d) => {
451
- d.checked = !1;
452
- }), [...p].forEach((d) => {
453
- let n = d.getAttribute("data-default");
454
- const a = n.querySelector(".file-name");
455
- a.classList.remove("is-upload"), a.textContent = n;
456
- }), [...f].forEach((d) => {
457
- d.setAttribute("d4-value", ""), d.hasAttribute("control-elements") && [...d.getAttribute("control-elements").split(",")].forEach((a) => {
458
+ const c = f.closest(".form-group");
459
+ c.classList.remove("success"), c.classList.remove("error"), f.classList.remove("success"), f.classList.remove("error"), (a = f.closest(".form-grid").querySelector(".error-text")) == null || a.remove(), e.detailOutputEl && (e.detailOutputEl.textContent = "");
460
+ }), [...t].forEach((f) => {
461
+ f.value = "";
462
+ }), [...o].forEach((f) => {
463
+ f.value = "";
464
+ }), [...s].forEach((f) => {
465
+ f.checked = !1;
466
+ }), [...d].forEach((f) => {
467
+ let c = f.getAttribute("data-default");
468
+ const a = c.querySelector(".file-name");
469
+ a.classList.remove("is-upload"), a.textContent = c;
470
+ }), [...p].forEach((f) => {
471
+ f.setAttribute("d4-value", ""), f.hasAttribute("control-elements") && [...f.getAttribute("control-elements").split(",")].forEach((a) => {
458
472
  document.querySelector(a).classList.remove("disabled");
459
473
  });
460
474
  }), e.element.value = e.getValue();
461
475
  }
462
476
  }
463
477
  T = new WeakSet(), j = function() {
464
- const e = this, { datepicker: t, timepicker: o, clearEl: i, submitEl: p } = e.options;
465
- function f() {
466
- t.forEach((s) => {
467
- D(s.el, s.options);
468
- }), o.forEach((s) => {
469
- D(s.el, s.options);
478
+ const e = this, { datepicker: t, timepicker: o, clearEl: s, submitEl: d } = e.options;
479
+ function p() {
480
+ t.forEach((i) => {
481
+ _(i.el, i.options);
482
+ }), o.forEach((i) => {
483
+ _(i.el, i.options);
470
484
  });
471
485
  }
472
- function d() {
473
- const s = document.querySelector(i), c = document.querySelector(p);
474
- s == null || s.addEventListener("click", function() {
486
+ function f() {
487
+ const i = document.querySelector(s), u = document.querySelector(d);
488
+ i == null || i.addEventListener("click", function() {
475
489
  e.clear();
476
- }), c == null || c.addEventListener("click", function() {
490
+ }), u == null || u.addEventListener("click", function() {
477
491
  e.submit();
478
492
  });
479
493
  }
480
- function n(s) {
494
+ function c(i) {
481
495
  var y;
482
- const c = s.closest(".form-group");
483
- if (s.files.length <= 0)
496
+ const u = i.closest(".form-group");
497
+ if (i.files.length <= 0)
484
498
  return;
485
- const u = s.closest(".file-wrap").querySelector(".fake-file-upload");
486
- u.getAttribute("data-default");
487
- const l = u.querySelector(".file-name"), v = Number(s.getAttribute("data-limit")), S = s.files[0], L = S.size / 1024 / 1024, m = S.name, E = s.cloneNode(!0);
488
- L > v ? (c.classList.add("error"), c.classList.remove("success"), E.value = "") : (c.classList.remove("error"), c.classList.add("success")), l.textContent = m, E.removeAttribute("form-field field-type data-limit"), (y = u.querySelector('input[type="file"]')) == null || y.remove(), u.append(E);
499
+ const l = i.closest(".file-wrap").querySelector(".fake-file-upload");
500
+ l.getAttribute("data-default");
501
+ const n = l.querySelector(".file-name"), g = Number(i.getAttribute("data-limit")), x = i.files[0], L = x.size / 1024 / 1024, m = x.name, E = i.cloneNode(!0);
502
+ L > g ? (u.classList.add("error"), u.classList.remove("success"), E.value = "") : (u.classList.remove("error"), u.classList.add("success")), n.textContent = m, E.removeAttribute("form-field field-type data-limit"), (y = l.querySelector('input[type="file"]')) == null || y.remove(), l.append(E);
489
503
  }
490
504
  function a() {
491
- function s(c) {
492
- const { target: u } = c;
493
- let l, v;
494
- u.matches('[type="radio"], [type="checkbox"]') && (e.element.value = e.getValue(), l = u.closest(".form-check").getAttribute("form-field"), v = {
495
- [l]: e.element.value[l]
496
- }, e.options.verify && e.verify(v)), u.matches('[type="file"]') && (n(u), e.element.value = e.getValue(), l = u.getAttribute("form-field"), v = {
497
- [l]: e.element.value[l]
498
- }, e.options.verify && e.verify(v));
505
+ function i(u) {
506
+ const { target: l } = u;
507
+ let n, g;
508
+ l.matches('[type="radio"], [type="checkbox"]') && (e.element.value = e.getValue(), n = l.closest(".form-check").getAttribute("form-field"), g = {
509
+ [n]: e.element.value[n]
510
+ }, e.options.verify && e.verify(g)), l.matches('[type="file"]') && (c(l), e.element.value = e.getValue(), n = l.getAttribute("form-field"), g = {
511
+ [n]: e.element.value[n]
512
+ }, e.options.verify && e.verify(g));
499
513
  }
500
514
  e.element.addEventListener(
501
515
  "input",
502
- z(function(c) {
503
- const { target: u } = c;
504
- if (u.matches('[type="text"],[type="number"],[type="email"],[type="password"], textarea')) {
505
- if (e.element.value = e.getValue(), !u.closest(".form-group").classList.contains("required") && u.hasAttribute("data-verify")) {
506
- w.isEmpty(u.value) && (u.classList.remove("error"), u.classList.remove("success"), u.closest(".form-group").classList.remove("error"));
516
+ U(function(u) {
517
+ const { target: l } = u;
518
+ if (l.matches('[type="text"],[type="number"],[type="email"],[type="password"], textarea')) {
519
+ if (e.element.value = e.getValue(), !l.closest(".form-group").classList.contains("required") && l.hasAttribute("data-verify")) {
520
+ w.isEmpty(l.value) && (l.classList.remove("error"), l.classList.remove("success"), l.closest(".form-group").classList.remove("error"));
507
521
  return;
508
522
  }
509
- const l = u.getAttribute("form-field"), v = {
510
- [l]: e.element.value[l]
523
+ const n = l.getAttribute("form-field"), g = {
524
+ [n]: e.element.value[n]
511
525
  };
512
- e.options.verify && e.verify(v);
526
+ e.options.verify && e.verify(g);
513
527
  }
514
528
  })
515
- ), e.allCheckbox.forEach((c) => {
516
- c.addEventListener("change", s);
517
- }), e.allRadio.forEach((c) => {
518
- c.addEventListener("change", s);
519
- }), e.allDropdown.forEach((c) => {
520
- c.on("change", function() {
521
- const u = this.getAttribute("form-field");
529
+ ), e.allCheckbox.forEach((u) => {
530
+ u.addEventListener("change", i);
531
+ }), e.allRadio.forEach((u) => {
532
+ u.addEventListener("change", i);
533
+ }), e.allDropdown.forEach((u) => {
534
+ u.on("change", function() {
535
+ const l = this.getAttribute("form-field");
522
536
  e.element.value = e.getValue();
523
- const l = e.element.value[u], v = typeof l == "object" && !Array.isArray(l) ? l.value : l, S = {
524
- [u]: l
537
+ const n = e.element.value[l], g = typeof n == "object" && !Array.isArray(n) ? n.value : n, x = {
538
+ [l]: n
525
539
  };
526
- (Array.isArray(v) && v.length > 0 || !Array.isArray(v) && !w.isEmpty(v)) && e.options.verify && e.verify(S);
540
+ (Array.isArray(g) && g.length > 0 || !Array.isArray(g) && !w.isEmpty(g)) && e.options.verify && e.verify(x);
527
541
  });
528
542
  });
529
543
  }
530
- f(), d(), a();
544
+ p(), f(), a();
531
545
  };
532
546
  export {
533
547
  le as CustomForm,
@@ -540,24 +554,24 @@ export {
540
554
  G as colorPick,
541
555
  ye as countDown,
542
556
  W as createColorCube,
543
- z as debounce,
557
+ U as debounce,
544
558
  he as delay,
545
559
  ve as detectMacOSVersion,
546
560
  Q as detectShade,
547
561
  se as errorPage,
548
- q as errorText,
562
+ C as errorText,
549
563
  ge as fixMobile100vh,
550
564
  be as formatFloat,
551
- xe as getSlideDataIndex,
552
- Se as getSlidesCount,
553
- ke as getTransformX,
565
+ ke as getSlideDataIndex,
566
+ xe as getSlidesCount,
567
+ Se as getTransformX,
554
568
  Ae as getTransformY,
555
- C as htmlStringToDOM,
569
+ q as htmlStringToDOM,
556
570
  Ee as imagePreview,
557
571
  ie as init,
558
572
  we as isVideo,
559
- qe as letterGrow,
560
- Ce as loaded,
573
+ Ce as letterGrow,
574
+ qe as loaded,
561
575
  Le as loading,
562
576
  Oe as numberGrow,
563
577
  Te as scrollLock,
@@ -566,6 +580,6 @@ export {
566
580
  $e as slideImgDetect,
567
581
  Ie as tabChange,
568
582
  Ne as throttle,
569
- Ve as wordAnimation
583
+ De as wordAnimation
570
584
  };
571
585
  //# sourceMappingURL=tools-bundle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools-bundle.js","sources":["../src/tools/errorPage.js","../src/tools/detectColorShade.js","../src/tools/cgpagechange.js","../src/tools/customForm/errorText.js","../src/tools/customForm/customForm.js"],"sourcesContent":["\nexport function errorPage() {\n if (!document.body.classList.contains('error') || document.querySelector('.back-home') == null) return;\n let countdownInterval;\n let second = 5;\n const homepage = document.querySelector('.back-home').getAttribute('href');\n const countdown = document.querySelector('.back-home .countdown');\n countdownInterval = setInterval(() => {\n second--;\n countdown.textContent = second;\n if (second === 0) {\n clearInterval(countdownInterval);\n window.location.href = homepage;\n }\n }, 1000);\n}","//第三方顏色提取套件\n//要使用請先跑 npm install colorthief\nimport ColorThief from 'colorthief/dist/color-thief.mjs'\n\n/**\n * 偵測深淺色\n * @param {*} imgEl 圖片\n * @param {*} el 綁定事件的 El(.detect-shade 那層)\n * @param {*} addClassEl 欲加上深淺色 Class 的 El\n */\nexport function detectShade(imgEl, el = imgEl) {\n if (imgEl.complete) {\n //把圖片給colorThief獲取色碼\n const colorThief = new ColorThief();\n const dominantColor = colorThief.getColor(imgEl);\n const grayLevel = dominantColor[0] * 0.299 + dominantColor[1] * 0.587 + dominantColor[2] * 0.114;\n // 顏色深淺判斷\n colorPick(grayLevel, el);\n el.classList.add('detected');\n }\n}\n/**\n * 顏色深淺判斷\n * @param {*} grayLevel 0-191 黑色 192-255白色\n * @param {*} el 綁定事件的 El(.detect-shade 那層)\n */\nexport function colorPick(grayLevel, el) {\n const addClassEl = el.getAttribute('addClassEl');\n if (grayLevel >= 192) {\n //淺色\n if (addClassEl && addClassEl !== '') {\n addClassEl.split(',').forEach(element => {\n if (!el.closest(element)) {\n console.error(`closest \"${element}\" not found`);\n }\n el.closest(element)?.classList.add('is-light');\n });\n } else {\n el.classList.add('is-light');\n }\n } else {\n //深色\n if (addClassEl && addClassEl !== '') {\n addClassEl.split(',').forEach(element => {\n if (!el.closest(element)) {\n console.error(`closest \"${element}\" not found`);\n }\n el.closest(element)?.classList.add('is-dark');\n });\n } else {\n el.classList.add('is-dark');\n }\n }\n}\n/**\n * 產生一個顏色方塊\n * @param {string} startColor 開始顏色\n * @param {string} endColor 結束顏色\n * @returns 輸出一個圖片\n */\nexport function createColorCube(startColor, endColor, el) {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n canvas.width = 50;\n canvas.height = 50;\n if (startColor !== '' && endColor === '') {\n //純色\n context.fillStyle = startColor;\n } else if (startColor !== '' && endColor !== '') {\n //漸層\n const gradient = context.createLinearGradient(0, 0, canvas.width, canvas.height);\n gradient.addColorStop(0, startColor);\n gradient.addColorStop(1, endColor);\n context.fillStyle = gradient;\n }\n context.fillRect(0, 0, canvas.width, canvas.height);\n\n //轉成圖片\n const img = new Image();\n img.src = canvas.toDataURL();\n img.crossOrigin = 'Anonymous';\n img.addEventListener('load', function () {\n const imgEl = this;\n detectShade(imgEl, el);\n });\n return img;\n}\n\nexport function init() {\n const detectEl = document.querySelectorAll('.detect-shade:not(.detected)');\n [...detectEl].forEach(el => {\n if (el.tagName === 'IMG') {\n return;\n }\n const errorWColor = ['#FFF', '#FFFFFF', '#fff', '#ffffff'];\n const errorBColor = ['#000', '#000000'];\n //背景色需先用 canvas 轉圖片再偵測\n const startColor = getComputedStyle(el).getPropertyValue('--start-color');\n const endColor = getComputedStyle(el).getPropertyValue('--end-color');\n if (startColor === '' && endColor === '') {\n console.error(el, '=> No color set!');\n return;\n } else if (errorWColor.indexOf(startColor) > 0) {\n console.warn(el, '=> TypeError!! ( #FFF ) ');\n //淺色\n colorPick(255, el);\n return;\n } else if (errorBColor.indexOf(startColor) > 0) {\n console.warn(el, '=> TypeError!! ( #000 ) ');\n //淺色\n colorPick(0, el);\n return;\n }\n createColorCube(startColor, endColor, el);\n });\n}\n","const pageChange = {\n CG_A: function (href) {\n $('html,body')\n .delay(100)\n .animate(\n { opacity: '0' },\n {\n queue: true,\n duration: 800,\n easing: 'easeOutQuad',\n complete: function () {\n window.location.assign(href);\n },\n },\n );\n },\n CG_B: function (href) {\n $('main').append(\"<div id='CG_Abg'><div class='CG_Abg1'></div><div class='CG_Abg2'></div></div>\");\n\n $('body')\n .delay(1200)\n .animate(\n { opacity: '0' },\n {\n queue: true,\n duration: 200,\n easing: 'easeOutQuad',\n complete: function () {\n setTimeout(function () {\n window.location.assign(href);\n }, 100);\n },\n },\n );\n },\n CG_C: function (href) {\n $('main').append(\"<div id='CG_Bbg'></div>\");\n $('body')\n .delay(1200)\n .animate(\n { opacity: '0' },\n {\n queue: true,\n duration: 200,\n easing: 'easeOutQuad',\n complete: function () {\n setTimeout(function () {\n window.location.assign(href);\n }, 100);\n },\n },\n );\n },\n CG_D: function (href) {\n $('main').append(\"<div id='CG_Cbg'><div class='CG_Cbg1'></div><div class='CG_Cbg2'></div></div>\");\n $('body')\n .delay(1200)\n .animate(\n { opacity: '0' },\n {\n queue: true,\n duration: 200,\n easing: 'easeOutQuad',\n complete: function () {\n setTimeout(function () {\n window.location.assign(href);\n }, 100);\n },\n },\n );\n },\n};\n\nconst randomAnimate = href => {\n const i = Math.floor(Math.random() * Math.floor(4)) + 1;\n switch (1) {\n case 1:\n pageChange.CG_A(href);\n break;\n case 2:\n pageChange.CG_B(href);\n break;\n case 3:\n pageChange.CG_C(href);\n break;\n case 4:\n pageChange.CG_D(href);\n break;\n default:\n break;\n }\n};\n\nconst clickEvent = e => {\n e.preventDefault();\n const $this = $(e.currentTarget);\n const thisTarget = $this.attr('target');\n const aHref = $this.attr('href');\n let href;\n if ($this.hasClass('href-link')) {\n href = $this.closest('[data-href]').attr('data-href');\n } else {\n href = aHref;\n }\n\n // 本地\n const x = window.location.pathname.replace('http://', '');\n let xArr = x.split('/');\n xArr = lastArr(xArr);\n // 連結\n const y = href.replace('http://', '');\n let yArr = y.split('/');\n yArr = lastArr(yArr);\n function lastArr(arr) {\n const last = arr.pop();\n if (last.indexOf('#') > -1) {\n arr.push(last);\n } else if (last.indexOf('html') > 0) {\n arr.push(last);\n } else if (last == '') {\n arr.push('index.html');\n } else {\n arr.push(last);\n arr.push('index.html');\n }\n return arr;\n }\n if (thisTarget == '_blank' || e.ctrlKey || e.metaKey) {\n window.open(href);\n } else if (y.indexOf('jpg') > -1 || y.indexOf('javascript') > -1) {\n //啥事都不幹\n } else {\n randomAnimate(href);\n }\n};\n\nconst mouseenterEvent = e => {\n const $this = $(e.currentTarget);\n const $hrefEl = $this.closest('[data-href]');\n if ($hrefEl.hasClass('isHover')) return;\n $hrefEl.addClass('isHover');\n};\n\nconst mouseleaveEvent = e => {\n const $this = $(e.currentTarget);\n const $hrefEl = $this.closest('[data-href]');\n if (!$hrefEl.hasClass('isHover')) return;\n $hrefEl.removeClass('isHover');\n};\n\nexport const cgpagechange = () => {\n // 動畫曲線\n $.easing['jswing'] = $.easing['swing'];\n $.extend($.easing, {\n def: 'easeOutQuad',\n easeOutQuad: function (x, t, b, c, d) {\n return -c * (t /= d) * (t - 2) + b;\n },\n easeInOutCirc: function (x, t, b, c, d) {\n if ((t /= d / 2) < 1) return (-c / 2) * (Math.sqrt(1 - t * t) - 1) + b;\n return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n },\n });\n\n $('body').on('click', 'a:not(.nocg), .href-link', e => clickEvent(e));\n $('body').on('mouseenter', '[data-href] a', e => mouseenterEvent(e));\n $('body').on('mouseleave', '[data-href] a', e => mouseleaveEvent(e));\n}\n\n\n//\n\n\n// const pageChange = {\n// CG_A: function (href) {\n// $('html,body').delay(100).animate({ opacity: '0' }, {\n// queue: true,\n// duration: 800,\n// easing: 'easeOutQuad',\n// complete: function () {\n// window.location.assign(href);\n// },\n// });\n// },\n// CG_B: function (href) {\n// $('main').append(\"<div id='CG_Abg'><div class='CG_Abg1'></div><div class='CG_Abg2'></div></div>\");\n\n// $('body')\n// .delay(1200)\n// .animate(\n// { opacity: '0' },\n// {\n// queue: true,\n// duration: 200,\n// easing: 'easeOutQuad',\n// complete: function () {\n// setTimeout(function () {\n// window.location.assign(href);\n// }, 100);\n// },\n// },\n// );\n// },\n// CG_C: function (href) {\n// $('main').append(\"<div id='CG_Bbg'></div>\");\n// $('body')\n// .delay(1200)\n// .animate(\n// { opacity: '0' },\n// {\n// queue: true,\n// duration: 200,\n// easing: 'easeOutQuad',\n// complete: function () {\n// setTimeout(function () {\n// window.location.assign(href);\n// }, 100);\n// },\n// },\n// );\n// },\n// CG_D: function (href) {\n// $('main').append(\"<div id='CG_Cbg'><div class='CG_Cbg1'></div><div class='CG_Cbg2'></div></div>\");\n// $('body')\n// .delay(1200)\n// .animate(\n// { opacity: '0' },\n// {\n// queue: true,\n// duration: 200,\n// easing: 'easeOutQuad',\n// complete: function () {\n// setTimeout(function () {\n// window.location.assign(href);\n// }, 100);\n// },\n// },\n// );\n// },\n// };\n\n// const randomAnimate = href => {\n// const i = Math.floor(Math.random() * Math.floor(4)) + 1;\n// switch (1) {\n// case 1: pageChange.CG_A(href); break;\n// case 2: pageChange.CG_B(href); break;\n// case 3: pageChange.CG_C(href); break;\n// case 4: pageChange.CG_D(href); break;\n// default: break;\n// }\n// };\n\n// const clickEvent = e => {\n// e.preventDefault();\n// const $this = $(e.currentTarget);\n// const thisTarget = $this.attr('target');\n// const href = $this.hasClass('href-link')\n// ? $this.closest('[data-href]').attr('data-href')\n// : $this.attr('href');\n\n// const lastArr = (arr) => {\n// const last = arr.pop();\n// if (last.indexOf('#') > -1) {\n// arr.push(last);\n// } else if (last.indexOf('html') > 0) {\n// arr.push(last);\n// } else if (last == '') {\n// arr.push('index.html');\n// } else {\n// arr.push(last);\n// arr.push('index.html');\n// }\n// return arr;\n// }\n\n// if (thisTarget == '_blank' || e.ctrlKey || e.metaKey) {\n// window.open(href);\n// } else if (y.indexOf('jpg') > -1 || y.indexOf('javascript') > -1) {\n// //啥事都不幹\n// } else {\n// randomAnimate(href);\n// }\n\n// // 本地\n// const x = window.location.pathname.replace('http://', '');\n// let xArr = x.split('/');\n// xArr = lastArr(xArr);\n// // 連結\n// const y = href.replace('http://', '');\n// let yArr = y.split('/');\n// yArr = lastArr(yArr);\n\n\n// };\n\n// const mouseenterEvent = e => {\n// const $this = $(e.currentTarget);\n// const $hrefEl = $this.closest('[data-href]');\n// if ($hrefEl.hasClass('isHover')) return;\n// $hrefEl.addClass('isHover');\n// };\n\n// const mouseleaveEvent = e => {\n// const $this = $(e.currentTarget);\n// const $hrefEl = $this.closest('[data-href]');\n// if (!$hrefEl.hasClass('isHover')) return;\n// $hrefEl.removeClass('isHover');\n// };\n\n// export const cgpagechange = () => {\n// // 動畫曲線\n// $.easing['jswing'] = $.easing['swing'];\n// $.extend($.easing, {\n// def: 'easeOutQuad',\n// easeOutQuad: function (x, t, b, c, d) {\n// return -c * (t /= d) * (t - 2) + b;\n// },\n// easeInOutCirc: function (x, t, b, c, d) {\n// if ((t /= d / 2) < 1) return (-c / 2) * (Math.sqrt(1 - t * t) - 1) + b;\n// return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n// },\n// });\n\n// $('body').on('click', 'a:not(.nocg), .href-link', e => clickEvent(e));\n// $('body').on('mouseenter', '[data-href] a', e => mouseenterEvent(e));\n// $('body').on('mouseleave', '[data-href] a', e => mouseleaveEvent(e));\n// }\n\n\n\n","export const errorText = {\n 'zh-TW': {\n format: '格式錯誤',\n input: '尚未填寫',\n select: '尚未選擇',\n file: '檔案大小超過限制',\n },\n 'zh-CN': {\n phone: '',\n email: '',\n password: '',\n verifyCode: '',\n input: '',\n select: '',\n },\n en: {\n phone: '',\n email: '',\n password: '',\n verifyCode: '',\n input: '',\n select: '',\n },\n jp: {\n phone: '',\n email: '',\n password: '',\n verifyCode: '',\n input: '',\n select: '',\n },\n};\n","// validator(欄位驗證套件)\nimport { debounce, htmlStringToDOM } from '../utils'\nimport { errorText } from './errorText'\nimport validator from 'validator'\nimport flatpickr from 'flatpickr'\nimport { Mandarin } from \"flatpickr/dist/l10n/zh.js\"\n\nexport class CustomForm {\n constructor(element, params) {\n this.element = document.querySelector(element);\n this.allField = this.element.querySelectorAll(`${element} [form-field]`);\n this.allInput = this.element.querySelectorAll(`${element} input`);\n this.allTextarea = this.element.querySelectorAll(`${element} textarea`);\n this.allCheckbox = this.element.querySelectorAll(`${element} input[type=\"checkbox\"]`);\n this.allRadio = this.element.querySelectorAll(`${element} input[type=\"radio\"]`);\n this.allFileUpload = this.element.querySelectorAll(`${element} fake-file-upload`);\n this.allDropdown = this.element.querySelectorAll(`${element} dropdown-el`);\n this.submitEvent = new Event('submit');\n // default params\n const defaultOptions = {\n locale: 'zh-TW',\n datepicker: [\n {\n el: '.datepicker-input',\n options: {\n locale: Mandarin,\n },\n },\n ],\n timepicker: [\n {\n el: '.timepicker-input',\n options: {\n enableTime: true,\n noCalendar: true,\n dateFormat: 'H:i',\n time_24hr: true,\n },\n },\n ],\n clearEl: null,\n submitEl: null,\n verify: false,\n errorText: {\n underField: false,\n detailOutput: false,\n },\n };\n const mergeOptions = (target, source) => {\n const merged = { ...target };\n for (let key of Object.keys(source)) {\n if (typeof source[key] === 'object' && key in target) {\n // 2024/10/21 wade demo edit\n merged[key] = Array.isArray(merged[key])\n ? [...source[key]]\n : mergeOptions(target[key], source[key]);\n\n } else {\n merged[key] = source[key];\n\n }\n }\n return merged;\n };\n this.options = params ? mergeOptions(defaultOptions, params) : defaultOptions;\n this.init();\n }\n init() {\n const cf = this;\n cf.element.value = cf.getValue();\n cf.detailOutputEl = cf.options.errorText.detailOutput ? document.querySelector(cf.options.errorText.detailOutput) : null;\n cf.#events();\n }\n /**\n * 綁事件\n */\n #events() {\n const cf = this;\n const { datepicker, timepicker, clearEl, submitEl } = cf.options;\n\n /**\n * 綁定日曆/時間\n */\n function bindingDatepicker() {\n // 日曆\n datepicker.forEach(item => {\n flatpickr(item.el, item.options);\n });\n // 時間\n timepicker.forEach(item => {\n flatpickr(item.el, item.options);\n });\n }\n\n /**\n * 綁定按鈕點擊事件\n */\n function bindingButton() {\n const clearBtn = document.querySelector(clearEl);\n const submitBtn = document.querySelector(submitEl);\n clearBtn?.addEventListener('click', function () {\n cf.clear();\n });\n submitBtn?.addEventListener('click', function () {\n cf.submit();\n });\n }\n\n function fileUpload(target) {\n const formGroup = target.closest('.form-group');\n if (target.files.length <= 0) return;\n const fakeUploadWrap = target.closest('.file-wrap').querySelector('.fake-file-upload');\n const defaultText = fakeUploadWrap.getAttribute('data-default');\n const fileName = fakeUploadWrap.querySelector('.file-name');\n const fileLimit = Number(target.getAttribute('data-limit'));\n const file = target.files[0];\n const fileSize = file.size / 1024 / 1024;\n const originalName = file.name;\n const fileInputTemp = target.cloneNode(true);\n if (fileSize > fileLimit) {\n //超過檔案大小限制\n formGroup.classList.add('error');\n formGroup.classList.remove('success');\n fileInputTemp.value = '';\n } else {\n //符合檔案大小限制\n formGroup.classList.remove('error');\n formGroup.classList.add('success');\n }\n fileName.textContent = originalName;\n fileInputTemp.removeAttribute('form-field field-type data-limit');\n fakeUploadWrap.querySelector('input[type=\"file\"]')?.remove();\n fakeUploadWrap.append(fileInputTemp);\n }\n\n /**\n * 表單內欄位異動監聽\n */\n function changeListener() {\n function changeHandler(event) {\n const { target } = event;\n let fieldName, fieldObj;\n if (target.matches('[type=\"radio\"], [type=\"checkbox\"]')) {\n cf.element.value = cf.getValue();\n fieldName = target.closest('.form-check').getAttribute('form-field');\n fieldObj = {\n [fieldName]: cf.element.value[fieldName],\n };\n if (cf.options.verify) cf.verify(fieldObj);\n }\n if (target.matches('[type=\"file\"]')) {\n fileUpload(target);\n cf.element.value = cf.getValue();\n fieldName = target.getAttribute('form-field');\n fieldObj = {\n [fieldName]: cf.element.value[fieldName],\n };\n if (cf.options.verify) cf.verify(fieldObj);\n }\n }\n\n cf.element.addEventListener(\n 'input',\n debounce(function (e) {\n const { target } = e;\n if (target.matches('[type=\"text\"],[type=\"number\"],[type=\"email\"],[type=\"password\"], textarea')) {\n cf.element.value = cf.getValue();\n // 如果該欄位非必填則不做即時驗證\n if (!target.closest('.form-group').classList.contains('required') && target.hasAttribute('data-verify')) {\n if (validator.isEmpty(target.value)) {\n target.classList.remove('error');\n target.classList.remove('success');\n target.closest('.form-group').classList.remove('error');\n }\n return;\n }\n const fieldName = target.getAttribute('form-field');\n const fieldObj = {\n [fieldName]: cf.element.value[fieldName],\n };\n if (cf.options.verify) cf.verify(fieldObj);\n }\n }),\n );\n cf.allCheckbox.forEach(checkbox => {\n checkbox.addEventListener('change', changeHandler);\n });\n cf.allRadio.forEach(radio => {\n radio.addEventListener('change', changeHandler);\n });\n cf.allDropdown.forEach(dropdown => {\n dropdown.on('change', function () {\n const fieldName = this.getAttribute('form-field');\n cf.element.value = cf.getValue();\n const val = cf.element.value[fieldName];\n const value = typeof val === 'object' && !Array.isArray(val) ? val.value : val;\n const fieldObj = {\n [fieldName]: val,\n };\n if ((Array.isArray(value) && value.length > 0) || (!Array.isArray(value) && !validator.isEmpty(value))) {\n if (cf.options.verify) cf.verify(fieldObj);\n }\n });\n });\n }\n bindingDatepicker();\n bindingButton();\n changeListener();\n }\n /**\n * 取得表單所有的值\n * @returns\n */\n getValue() {\n const cf = this;\n // 參數 -\n // 在對應的地方 加上 [form-field] --> 欄位名稱 [field-type] --> 欄位格式\n // isFile(取檔案數值物件)\n // isRadio(要放在對應父層)\n // isCheckBox(要放在對應父層)\n // isSelect(要放在對應父層)\n let data = {};\n [...cf.allField].forEach(el => {\n const field = el.getAttribute('form-field');\n const type = el.getAttribute('field-type');\n switch (type) {\n // 單選Radio\n case 'isRadio':\n const radioChecked = el.querySelector('input:checked');\n const textInput = radioChecked.querySelector('input[type=\"text\"]');\n data[field] = {\n id: parseInt(radioChecked.closest('.option-item').querySelector('.text').getAttribute('data-id')),\n value: textInput ? textInput.value : radioChecked.closest('.option-item').querySelector('.text').textContent,\n };\n break;\n // 複選Checkbox\n case 'isCheckBox':\n const checkBoxChecked = el.querySelectorAll('input:checked');\n data[field] = [...checkBoxChecked].map(item => {\n const textInput = item.querySelector('input[type=\"text\"]');\n return {\n id: parseInt(item.closest('.option-item').querySelector('.text').getAttribute('data-id')),\n value: textInput ? textInput.value : item.closest('.option-item').querySelector('.text').textContent,\n };\n });\n break;\n // 下拉選單\n case 'isSelect':\n const selectType = el.hasAttribute('multiple') ? 'multiple' : 'single';\n switch (selectType) {\n case 'single':\n data[field] = {\n value: el.s.value.id ? el.s.value.id : '',\n display: el.s.value.el ? el.s.value.el.textContent : '',\n };\n break;\n case 'multiple':\n data[field] = {\n value: el.s.value.map(option => option.id),\n display: el.s.value.map(option => option.el.textContent),\n };\n break;\n }\n break;\n // 檔案上傳\n case 'isFile':\n const fileTemp = el.closest('.file-wrap').querySelector('.fake-file-upload input');\n data[field] = fileTemp ? fileTemp.files : undefined;\n break;\n // 其他\n default:\n data[field] = el.value;\n break;\n }\n });\n return data;\n }\n /**\n * 表單驗證\n * @param {object} verifyField 針對單一欄位驗證,沒傳值表示全部欄位\n * @returns\n */\n verify(verifyField) {\n const cf = this;\n const { options } = cf;\n const allValue = cf.element.value;\n const field = verifyField ? verifyField : allValue;\n /**\n * 產生表單驗證 icon(✅/❌)\n * @param {object} field 欄位物件\n */\n function appendVerifyIcon(field) {\n const validationIcon = '<div class=\"validation-icon\"></div>';\n for (const key in field) {\n const fieldEl = cf.element.querySelector(`[form-field=\"${key}\"]`);\n const verifyType = fieldEl.getAttribute('data-verify');\n const formGroup = fieldEl.closest('.form-group');\n switch (verifyType) {\n case 'select':\n const selectWrapper = fieldEl.querySelector('.select-wrapper');\n const dropdownIcon = selectWrapper.querySelector('.dropdown-icon');\n selectWrapper.querySelector('.validation-icon')?.remove();\n selectWrapper.insertBefore(htmlStringToDOM(validationIcon), dropdownIcon);\n break;\n case 'radio':\n case 'checkbox':\n formGroup.querySelector('.validation-icon')?.remove();\n formGroup.append(htmlStringToDOM(validationIcon));\n break;\n case 'file':\n const fileWrapper = fieldEl.closest('.file-wrap').querySelector('.fake-file-upload');\n const uploadIcon = fieldEl.closest('.file-wrap').querySelector('.upload-icon');\n fileWrapper.querySelector('.validation-icon')?.remove();\n if (uploadIcon) {\n fileWrapper.insertBefore(htmlStringToDOM(validationIcon), uploadIcon);\n } else {\n fileWrapper.append(htmlStringToDOM(validationIcon));\n }\n break;\n case 'date':\n case 'textarea':\n default:\n fieldEl.closest('.input-wrap').querySelector('.validation-icon')?.remove();\n fieldEl.closest('.input-wrap').append(htmlStringToDOM(validationIcon));\n break;\n }\n }\n }\n appendVerifyIcon(field);\n if (verifyField) {\n const key = Object.keys(field)[0];\n cf.element.querySelectorAll(`.error-text[name=\"${key}\"]`).forEach(element => element.remove());\n } else {\n cf.element.querySelectorAll('.error-text').forEach(element => element.remove());\n }\n for (const key in field) {\n const fieldEl = cf.element.querySelector(`[form-field=\"${key}\"]`);\n const formGroup = fieldEl.closest('.form-group');\n const subject = formGroup.querySelector('.subject')?.textContent;\n const verifyType = fieldEl.getAttribute('data-verify');\n /**\n * 回傳欄位的 value\n * @returns\n */\n const value = () => {\n if (typeof allValue[key] === 'object' && !Array.isArray(allValue[key])) {\n if (verifyType === 'file') {\n return allValue[key];\n }\n return allValue[key].value;\n }\n return allValue[key];\n };\n /**\n * 空值\n * @returns\n */\n const noValue = () => {\n if (verifyType === 'file') {\n return value() === undefined ? true : value() && value().length === 0;\n }\n return (Array.isArray(value()) && value().length === 0) || (!Array.isArray(value()) && validator.isEmpty(value()));\n };\n /**\n * 有值\n * @returns\n */\n const hasValue = () => {\n if (verifyType === 'file') {\n return value() === undefined ? false : value() && value().length > 0;\n }\n return (Array.isArray(value()) && value().length > 0) || (!Array.isArray(value()) && !validator.isEmpty(value()));\n };\n // 必填\n const required = formGroup.classList.contains('required');\n /**\n * 塞入詳細錯誤訊息\n * @param {string} type 錯誤訊息類別\n * @returns\n */\n function appendError(type, position, insertEl) {\n const fieldEl = cf.element.querySelector(`[form-field=\"${key}\"]`);\n const fieldElIndex = [...cf.element.querySelectorAll(`[form-field]`)].indexOf(fieldEl);\n const errorTextDOM = type => `<p class=\"error-text\" name=\"${key}\" index=\"${fieldElIndex}\">${subject} - ${errorText[options.locale][type]}</p>`;\n switch (position) {\n case 'underField':\n if (!options.errorText.underField) return;\n insertEl.append(htmlStringToDOM(errorTextDOM(type)));\n break;\n case 'detail':\n if (!insertEl) return;\n insertEl.append(htmlStringToDOM(errorTextDOM(type)));\n break;\n }\n }\n function sortErrorDetail() {\n const allError = cf.detailOutputEl.querySelectorAll('.error-text');\n if ([...allError].length > 0) {\n cf.element.classList.add('something-wrong');\n } else {\n cf.element.classList.remove('something-wrong');\n }\n const sortErrorDetail = [...allError].sort((a, b) => a.getAttribute('index') - b.getAttribute('index'));\n if (cf.detailOutputEl) {\n cf.detailOutputEl.textContent = '';\n }\n sortErrorDetail.forEach(item => cf.detailOutputEl?.appendChild(item));\n }\n let validationIcon;\n // 驗證必填/必選欄位是否為空\n if (required && noValue()) {\n fieldEl.classList.remove('success');\n fieldEl.classList.add('error');\n formGroup.classList.add('error');\n switch (verifyType) {\n case 'select':\n validationIcon = fieldEl.querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].select);\n appendError('select', 'underField', formGroup.parentNode);\n appendError('select', 'detail', cf.detailOutputEl);\n break;\n case 'radio':\n case 'checkbox':\n validationIcon = formGroup.querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].select);\n appendError('select', 'underField', formGroup.parentNode);\n appendError('select', 'detail', cf.detailOutputEl);\n break;\n case 'file':\n validationIcon = fieldEl.closest('.file-wrap').querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].file);\n appendError('file', 'underField', formGroup.parentNode);\n appendError('file', 'detail', cf.detailOutputEl);\n break;\n default:\n validationIcon = fieldEl.closest('.input-wrap').querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].input);\n appendError('input', 'underField', formGroup.parentNode);\n appendError('input', 'detail', cf.detailOutputEl);\n break;\n }\n }\n if (hasValue()) {\n /**\n * 更新欄位狀態\n * @param {object} fieldEl [form-field] element\n * @param {boolean} success 是否通過驗證\n */\n function updateFieldStatus(fieldEl, success) {\n const formGroup = fieldEl.closest('.form-group');\n fieldEl.classList.toggle('error', !success);\n fieldEl.classList.toggle('success', success);\n const verifyType = fieldEl.getAttribute('data-verify');\n const otherField = verifyType === 'phone' ? formGroup.querySelector('*:not(input)[form-field]') : formGroup.querySelector('*:not(dropdown-el)[form-field]');\n const hasOtherField = Boolean(otherField);\n const fieldSuccess = fieldEl.classList.contains('success');\n const fieldError = fieldEl.classList.contains('error');\n const otherFieldSuccess = otherField?.classList.contains('success');\n const otherFieldError = otherField?.classList.contains('error');\n if (hasOtherField) {\n if (otherFieldSuccess && !otherFieldError && fieldSuccess) {\n formGroup.classList.remove('error');\n formGroup.classList.add('success');\n } else if (otherFieldError || fieldError) {\n formGroup.classList.remove('success');\n formGroup.classList.add('error');\n }\n } else {\n if (fieldSuccess) {\n formGroup.classList.remove('error');\n formGroup.classList.add('success');\n } else {\n formGroup.classList.add('error');\n formGroup.classList.remove('success');\n }\n }\n }\n switch (verifyType) {\n case 'phone':\n const dropdownEl = formGroup.querySelector('dropdown-el');\n if (validator.isMobilePhone(value())) {\n updateFieldStatus(fieldEl, true);\n if (dropdownEl && dropdownEl.classList.contains('success')) {\n formGroup.classList.remove('error');\n formGroup.classList.add('success');\n }\n } else {\n updateFieldStatus(fieldEl, false);\n validationIcon = fieldEl.closest('.input-wrap').querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].format);\n appendError('format', 'underField', formGroup.parentNode);\n appendError('format', 'detail', cf.detailOutputEl);\n }\n break;\n case 'password':\n if (\n validator.isStrongPassword(value(), {\n minLength: 8,\n minLowercase: 1,\n minUppercase: 0,\n minNumbers: 1,\n minSymbols: 0,\n })\n ) {\n updateFieldStatus(fieldEl, true);\n } else {\n updateFieldStatus(fieldEl, false);\n validationIcon = fieldEl.closest('.input-wrap').querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].format);\n appendError('format', 'underField', formGroup.parentNode);\n appendError('format', 'detail', cf.detailOutputEl);\n }\n break;\n case 'email':\n if (validator.isEmail(value())) {\n updateFieldStatus(fieldEl, true);\n } else {\n updateFieldStatus(fieldEl, false);\n validationIcon = fieldEl.closest('.input-wrap').querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].format);\n appendError('format', 'underField', formGroup.parentNode);\n appendError('format', 'detail', cf.detailOutputEl);\n }\n break;\n case 'verifyCode':\n const isValidCode = validator.isNumeric(value(), { no_symbols: true }) && validator.isLength(value(), { min: 4, max: 4 });\n if (isValidCode) {\n updateFieldStatus(fieldEl, true);\n } else {\n updateFieldStatus(fieldEl, false);\n validationIcon = fieldEl.closest('.input-wrap').querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].format);\n appendError('format', 'underField', formGroup.parentNode);\n appendError('format', 'detail', cf.detailOutputEl);\n }\n break;\n case 'select':\n default:\n updateFieldStatus(fieldEl, true);\n break;\n }\n }\n // 重新排序\n if (cf.detailOutputEl) {\n sortErrorDetail();\n }\n }\n }\n /**\n * 送出表單\n */\n submit() {\n const cf = this;\n if (cf.options.verify) {\n cf.verify();\n }\n cf.element.dispatchEvent(cf.submitEvent);\n }\n /**\n * 清除表單所有欄位\n */\n clear() {\n const cf = this;\n const { allInput, allTextarea, allCheckbox, allFileUpload, allDropdown } = cf;\n [...cf.allField].forEach(el => {\n const formGroup = el.closest('.form-group');\n formGroup.classList.remove('success');\n formGroup.classList.remove('error');\n el.classList.remove('success');\n el.classList.remove('error');\n el.closest('.form-grid').querySelector('.error-text')?.remove();\n if (cf.detailOutputEl) {\n cf.detailOutputEl.textContent = '';\n }\n });\n [...allInput].forEach(input => {\n input.value = '';\n });\n [...allTextarea].forEach(textarea => {\n textarea.value = '';\n });\n [...allCheckbox].forEach(checkbox => {\n checkbox.checked = false;\n });\n [...allFileUpload].forEach(input => {\n let defaultText = input.getAttribute('data-default');\n const fileName = defaultText.querySelector('.file-name');\n fileName.classList.remove('is-upload');\n fileName.textContent = defaultText;\n });\n [...allDropdown].forEach(dropdown => {\n dropdown.setAttribute('d4-value', '');\n if (dropdown.hasAttribute('control-elements')) {\n const disabledEl = [...dropdown.getAttribute('control-elements').split(',')];\n disabledEl.forEach(selector => {\n document.querySelector(selector).classList.remove('disabled');\n });\n }\n });\n cf.element.value = cf.getValue();\n }\n}\n"],"names":["errorPage","countdownInterval","second","homepage","countdown","detectShade","imgEl","el","dominantColor","ColorThief","grayLevel","colorPick","addClassEl","element","_a","createColorCube","startColor","endColor","canvas","context","gradient","img","init","errorWColor","errorBColor","pageChange","href","$","randomAnimate","clickEvent","e","$this","thisTarget","aHref","xArr","lastArr","y","yArr","arr","last","mouseenterEvent","$hrefEl","mouseleaveEvent","cgpagechange","x","t","b","c","d","errorText","CustomForm","params","__privateAdd","_events","defaultOptions","Mandarin","mergeOptions","target","source","merged","key","cf","__privateMethod","events_fn","data","field","radioChecked","textInput","checkBoxChecked","item","option","fileTemp","verifyField","options","allValue","appendVerifyIcon","validationIcon","fieldEl","verifyType","formGroup","selectWrapper","dropdownIcon","htmlStringToDOM","_b","fileWrapper","uploadIcon","_c","_d","appendError","type","position","insertEl","fieldElIndex","errorTextDOM","subject","sortErrorDetail","allError","a","value","noValue","validator","hasValue","required","updateFieldStatus","success","otherField","hasOtherField","fieldSuccess","fieldError","otherFieldSuccess","otherFieldError","dropdownEl","allInput","allTextarea","allCheckbox","allFileUpload","allDropdown","input","textarea","checkbox","defaultText","fileName","dropdown","selector","datepicker","timepicker","clearEl","submitEl","bindingDatepicker","flatpickr","bindingButton","clearBtn","submitBtn","fileUpload","fakeUploadWrap","fileLimit","file","fileSize","originalName","fileInputTemp","changeListener","changeHandler","event","fieldName","fieldObj","debounce","radio","val"],"mappings":"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"}
1
+ {"version":3,"file":"tools-bundle.js","sources":["../src/tools/errorPage.js","../src/tools/detectColorShade.js","../src/tools/cgpagechange.js","../src/tools/customForm/errorText.js","../src/tools/customForm/customForm.js"],"sourcesContent":["\nexport function errorPage() {\n if (!document.body.classList.contains('error') || document.querySelector('.back-home') == null) return;\n let countdownInterval;\n let second = 5;\n const homepage = document.querySelector('.back-home').getAttribute('href');\n const countdown = document.querySelector('.back-home .countdown');\n countdownInterval = setInterval(() => {\n second--;\n countdown.textContent = second;\n if (second === 0) {\n clearInterval(countdownInterval);\n window.location.href = homepage;\n }\n }, 1000);\n}","//第三方顏色提取套件\n//要使用請先跑 npm install colorthief\nimport ColorThief from 'colorthief/dist/color-thief.mjs'\n\n/**\n * 偵測深淺色\n * @param {*} imgEl 圖片\n * @param {*} el 綁定事件的 El(.detect-shade 那層)\n * @param {*} addClassEl 欲加上深淺色 Class 的 El\n */\nexport function detectShade(imgEl, el = imgEl) {\n if (imgEl.complete) {\n //把圖片給colorThief獲取色碼\n const colorThief = new ColorThief();\n const dominantColor = colorThief.getColor(imgEl);\n const grayLevel = dominantColor[0] * 0.299 + dominantColor[1] * 0.587 + dominantColor[2] * 0.114;\n // 顏色深淺判斷\n colorPick(grayLevel, el);\n el.classList.add('detected');\n }\n}\n/**\n * 顏色深淺判斷\n * @param {*} grayLevel 0-191 黑色 192-255白色\n * @param {*} el 綁定事件的 El(.detect-shade 那層)\n */\nexport function colorPick(grayLevel, el) {\n const addClassEl = el.getAttribute('addClassEl');\n if (grayLevel >= 192) {\n //淺色\n if (addClassEl && addClassEl !== '') {\n addClassEl.split(',').forEach(element => {\n if (!el.closest(element)) {\n console.error(`closest \"${element}\" not found`);\n }\n el.closest(element)?.classList.add('is-light');\n });\n } else {\n el.classList.add('is-light');\n }\n } else {\n //深色\n if (addClassEl && addClassEl !== '') {\n addClassEl.split(',').forEach(element => {\n if (!el.closest(element)) {\n console.error(`closest \"${element}\" not found`);\n }\n el.closest(element)?.classList.add('is-dark');\n });\n } else {\n el.classList.add('is-dark');\n }\n }\n}\n/**\n * 產生一個顏色方塊\n * @param {string} startColor 開始顏色\n * @param {string} endColor 結束顏色\n * @returns 輸出一個圖片\n */\nexport function createColorCube(startColor, endColor, el) {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n canvas.width = 50;\n canvas.height = 50;\n if (startColor !== '' && endColor === '') {\n //純色\n context.fillStyle = startColor;\n } else if (startColor !== '' && endColor !== '') {\n //漸層\n const gradient = context.createLinearGradient(0, 0, canvas.width, canvas.height);\n gradient.addColorStop(0, startColor);\n gradient.addColorStop(1, endColor);\n context.fillStyle = gradient;\n }\n context.fillRect(0, 0, canvas.width, canvas.height);\n\n //轉成圖片\n const img = new Image();\n img.src = canvas.toDataURL();\n img.crossOrigin = 'Anonymous';\n img.addEventListener('load', function () {\n const imgEl = this;\n detectShade(imgEl, el);\n });\n return img;\n}\n\nexport function init() {\n const detectEl = document.querySelectorAll('.detect-shade:not(.detected)');\n [...detectEl].forEach(el => {\n if (el.tagName === 'IMG') {\n return;\n }\n const errorWColor = ['#FFF', '#FFFFFF', '#fff', '#ffffff'];\n const errorBColor = ['#000', '#000000'];\n //背景色需先用 canvas 轉圖片再偵測\n const startColor = getComputedStyle(el).getPropertyValue('--start-color');\n const endColor = getComputedStyle(el).getPropertyValue('--end-color');\n if (startColor === '' && endColor === '') {\n console.error(el, '=> No color set!');\n return;\n } else if (errorWColor.indexOf(startColor) > 0) {\n console.warn(el, '=> TypeError!! ( #FFF ) ');\n //淺色\n colorPick(255, el);\n return;\n } else if (errorBColor.indexOf(startColor) > 0) {\n console.warn(el, '=> TypeError!! ( #000 ) ');\n //淺色\n colorPick(0, el);\n return;\n }\n createColorCube(startColor, endColor, el);\n });\n}\n","const pageChange = {\n CG_A: function (href) {\n $('html,body')\n .delay(100)\n .animate(\n { opacity: '0' },\n {\n queue: true,\n duration: 800,\n easing: 'easeOutQuad',\n complete: function () {\n window.location.assign(href);\n },\n },\n );\n },\n CG_B: function (href) {\n $('main').append(\"<div id='CG_Abg'><div class='CG_Abg1'></div><div class='CG_Abg2'></div></div>\");\n\n $('body')\n .delay(1200)\n .animate(\n { opacity: '0' },\n {\n queue: true,\n duration: 200,\n easing: 'easeOutQuad',\n complete: function () {\n setTimeout(function () {\n window.location.assign(href);\n }, 100);\n },\n },\n );\n },\n CG_C: function (href) {\n $('main').append(\"<div id='CG_Bbg'></div>\");\n $('body')\n .delay(1200)\n .animate(\n { opacity: '0' },\n {\n queue: true,\n duration: 200,\n easing: 'easeOutQuad',\n complete: function () {\n setTimeout(function () {\n window.location.assign(href);\n }, 100);\n },\n },\n );\n },\n CG_D: function (href) {\n $('main').append(\"<div id='CG_Cbg'><div class='CG_Cbg1'></div><div class='CG_Cbg2'></div></div>\");\n $('body')\n .delay(1200)\n .animate(\n { opacity: '0' },\n {\n queue: true,\n duration: 200,\n easing: 'easeOutQuad',\n complete: function () {\n setTimeout(function () {\n window.location.assign(href);\n }, 100);\n },\n },\n );\n },\n};\n\nconst randomAnimate = href => {\n const i = Math.floor(Math.random() * Math.floor(4)) + 1;\n switch (1) {\n case 1:\n pageChange.CG_A(href);\n break;\n case 2:\n pageChange.CG_B(href);\n break;\n case 3:\n pageChange.CG_C(href);\n break;\n case 4:\n pageChange.CG_D(href);\n break;\n default:\n break;\n }\n};\n\nconst clickEvent = (e,hrefLink) => {\n e.preventDefault();\n const $this = $(e.currentTarget);\n const thisTarget = $this.attr('target');\n const aHref = $this.attr('href');\n let href;\n \n if (hrefLink) {\n // 如果有屬性 data-nolink 就阻止轉址\n if ($this.is('[data-nolink]')) {\n e.stopPropagation(); \n e.preventDefault();\n return\n }\n if ($this.hasClass('click-block')) {\n href = $this.closest('[data-href]').attr('data-href');\n } else {\n href = aHref;\n }\n } else {\n // 如果有屬性 data-nolink 就阻止轉址\n if ($this.is('[data-nolink]')) {\n e.stopPropagation(); \n e.preventDefault();\n return\n }\n if ($this.hasClass('href-link')) {\n href = $this.closest('[data-href]').attr('data-href');\n } else {\n href = aHref;\n }\n }\n\n // 本地\n const x = window.location.pathname.replace('http://', '');\n let xArr = x.split('/');\n xArr = lastArr(xArr);\n // 連結\n const y = href.replace('http://', '');\n let yArr = y.split('/');\n yArr = lastArr(yArr);\n function lastArr(arr) {\n const last = arr.pop();\n if (last.indexOf('#') > -1) {\n arr.push(last);\n } else if (last.indexOf('html') > 0) {\n arr.push(last);\n } else if (last == '') {\n arr.push('index.html');\n } else {\n arr.push(last);\n arr.push('index.html');\n }\n return arr;\n }\n if (thisTarget == '_blank' || e.ctrlKey || e.metaKey) {\n window.open(href);\n } else if (y.indexOf('jpg') > -1 || y.indexOf('javascript') > -1) {\n //啥事都不幹\n } else {\n randomAnimate(href);\n }\n};\n\nconst mouseenterEvent = e => {\n const $this = $(e.currentTarget);\n const $hrefEl = $this.closest('[data-href]');\n if ($hrefEl.hasClass('isHover')) return;\n $hrefEl.addClass('isHover');\n};\n\nconst mouseleaveEvent = e => {\n const $this = $(e.currentTarget);\n const $hrefEl = $this.closest('[data-href]');\n if (!$hrefEl.hasClass('isHover')) return;\n $hrefEl.removeClass('isHover');\n};\n\nexport const cgpagechange = (hrefLink = true) => {\n // 動畫曲線\n $.easing['jswing'] = $.easing['swing'];\n $.extend($.easing, {\n def: 'easeOutQuad',\n easeOutQuad: function (x, t, b, c, d) {\n return -c * (t /= d) * (t - 2) + b;\n },\n easeInOutCirc: function (x, t, b, c, d) {\n if ((t /= d / 2) < 1) return (-c / 2) * (Math.sqrt(1 - t * t) - 1) + b;\n return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n },\n });\n $('body').on('click', 'a:not(.nocg), .href-link, .click-block, [data-nolink]', e => clickEvent(e,hrefLink));\n $('body').on('click', 'a:not(.nocg)', function(e) {\n e.stopPropagation();\n });\n $('body').on('mouseenter', '[data-href] a', e => mouseenterEvent(e));\n $('body').on('mouseleave', '[data-href] a', e => mouseleaveEvent(e));\n}\n\n\n//\n\n\n// const pageChange = {\n// CG_A: function (href) {\n// $('html,body').delay(100).animate({ opacity: '0' }, {\n// queue: true,\n// duration: 800,\n// easing: 'easeOutQuad',\n// complete: function () {\n// window.location.assign(href);\n// },\n// });\n// },\n// CG_B: function (href) {\n// $('main').append(\"<div id='CG_Abg'><div class='CG_Abg1'></div><div class='CG_Abg2'></div></div>\");\n\n// $('body')\n// .delay(1200)\n// .animate(\n// { opacity: '0' },\n// {\n// queue: true,\n// duration: 200,\n// easing: 'easeOutQuad',\n// complete: function () {\n// setTimeout(function () {\n// window.location.assign(href);\n// }, 100);\n// },\n// },\n// );\n// },\n// CG_C: function (href) {\n// $('main').append(\"<div id='CG_Bbg'></div>\");\n// $('body')\n// .delay(1200)\n// .animate(\n// { opacity: '0' },\n// {\n// queue: true,\n// duration: 200,\n// easing: 'easeOutQuad',\n// complete: function () {\n// setTimeout(function () {\n// window.location.assign(href);\n// }, 100);\n// },\n// },\n// );\n// },\n// CG_D: function (href) {\n// $('main').append(\"<div id='CG_Cbg'><div class='CG_Cbg1'></div><div class='CG_Cbg2'></div></div>\");\n// $('body')\n// .delay(1200)\n// .animate(\n// { opacity: '0' },\n// {\n// queue: true,\n// duration: 200,\n// easing: 'easeOutQuad',\n// complete: function () {\n// setTimeout(function () {\n// window.location.assign(href);\n// }, 100);\n// },\n// },\n// );\n// },\n// };\n\n// const randomAnimate = href => {\n// const i = Math.floor(Math.random() * Math.floor(4)) + 1;\n// switch (1) {\n// case 1: pageChange.CG_A(href); break;\n// case 2: pageChange.CG_B(href); break;\n// case 3: pageChange.CG_C(href); break;\n// case 4: pageChange.CG_D(href); break;\n// default: break;\n// }\n// };\n\n// const clickEvent = e => {\n// e.preventDefault();\n// const $this = $(e.currentTarget);\n// const thisTarget = $this.attr('target');\n// const href = $this.hasClass('href-link')\n// ? $this.closest('[data-href]').attr('data-href')\n// : $this.attr('href');\n\n// const lastArr = (arr) => {\n// const last = arr.pop();\n// if (last.indexOf('#') > -1) {\n// arr.push(last);\n// } else if (last.indexOf('html') > 0) {\n// arr.push(last);\n// } else if (last == '') {\n// arr.push('index.html');\n// } else {\n// arr.push(last);\n// arr.push('index.html');\n// }\n// return arr;\n// }\n\n// if (thisTarget == '_blank' || e.ctrlKey || e.metaKey) {\n// window.open(href);\n// } else if (y.indexOf('jpg') > -1 || y.indexOf('javascript') > -1) {\n// //啥事都不幹\n// } else {\n// randomAnimate(href);\n// }\n\n// // 本地\n// const x = window.location.pathname.replace('http://', '');\n// let xArr = x.split('/');\n// xArr = lastArr(xArr);\n// // 連結\n// const y = href.replace('http://', '');\n// let yArr = y.split('/');\n// yArr = lastArr(yArr);\n\n\n// };\n\n// const mouseenterEvent = e => {\n// const $this = $(e.currentTarget);\n// const $hrefEl = $this.closest('[data-href]');\n// if ($hrefEl.hasClass('isHover')) return;\n// $hrefEl.addClass('isHover');\n// };\n\n// const mouseleaveEvent = e => {\n// const $this = $(e.currentTarget);\n// const $hrefEl = $this.closest('[data-href]');\n// if (!$hrefEl.hasClass('isHover')) return;\n// $hrefEl.removeClass('isHover');\n// };\n\n// export const cgpagechange = () => {\n// // 動畫曲線\n// $.easing['jswing'] = $.easing['swing'];\n// $.extend($.easing, {\n// def: 'easeOutQuad',\n// easeOutQuad: function (x, t, b, c, d) {\n// return -c * (t /= d) * (t - 2) + b;\n// },\n// easeInOutCirc: function (x, t, b, c, d) {\n// if ((t /= d / 2) < 1) return (-c / 2) * (Math.sqrt(1 - t * t) - 1) + b;\n// return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n// },\n// });\n\n// $('body').on('click', 'a:not(.nocg), .href-link', e => clickEvent(e));\n// $('body').on('mouseenter', '[data-href] a', e => mouseenterEvent(e));\n// $('body').on('mouseleave', '[data-href] a', e => mouseleaveEvent(e));\n// }\n\n\n\n","export const errorText = {\n 'zh-TW': {\n format: '格式錯誤',\n input: '尚未填寫',\n select: '尚未選擇',\n file: '檔案大小超過限制',\n },\n 'zh-CN': {\n phone: '',\n email: '',\n password: '',\n verifyCode: '',\n input: '',\n select: '',\n },\n en: {\n phone: '',\n email: '',\n password: '',\n verifyCode: '',\n input: '',\n select: '',\n },\n jp: {\n phone: '',\n email: '',\n password: '',\n verifyCode: '',\n input: '',\n select: '',\n },\n};\n","// validator(欄位驗證套件)\nimport { debounce, htmlStringToDOM } from '../utils'\nimport { errorText } from './errorText'\nimport validator from 'validator'\nimport flatpickr from 'flatpickr'\nimport { Mandarin } from \"flatpickr/dist/l10n/zh.js\"\n\nexport class CustomForm {\n constructor(element, params) {\n this.element = document.querySelector(element);\n this.allField = this.element.querySelectorAll(`${element} [form-field]`);\n this.allInput = this.element.querySelectorAll(`${element} input`);\n this.allTextarea = this.element.querySelectorAll(`${element} textarea`);\n this.allCheckbox = this.element.querySelectorAll(`${element} input[type=\"checkbox\"]`);\n this.allRadio = this.element.querySelectorAll(`${element} input[type=\"radio\"]`);\n this.allFileUpload = this.element.querySelectorAll(`${element} fake-file-upload`);\n this.allDropdown = this.element.querySelectorAll(`${element} dropdown-el`);\n this.submitEvent = new Event('submit');\n // default params\n const defaultOptions = {\n locale: 'zh-TW',\n datepicker: [\n {\n el: '.datepicker-input',\n options: {\n locale: Mandarin,\n },\n },\n ],\n timepicker: [\n {\n el: '.timepicker-input',\n options: {\n enableTime: true,\n noCalendar: true,\n dateFormat: 'H:i',\n time_24hr: true,\n },\n },\n ],\n clearEl: null,\n submitEl: null,\n verify: false,\n errorText: {\n underField: false,\n detailOutput: false,\n },\n };\n const mergeOptions = (target, source) => {\n const merged = { ...target };\n for (let key of Object.keys(source)) {\n if (typeof source[key] === 'object' && key in target) {\n // 2024/10/21 wade demo edit\n merged[key] = Array.isArray(merged[key])\n ? [...source[key]]\n : mergeOptions(target[key], source[key]);\n\n } else {\n merged[key] = source[key];\n\n }\n }\n return merged;\n };\n this.options = params ? mergeOptions(defaultOptions, params) : defaultOptions;\n this.init();\n }\n init() {\n const cf = this;\n cf.element.value = cf.getValue();\n cf.detailOutputEl = cf.options.errorText.detailOutput ? document.querySelector(cf.options.errorText.detailOutput) : null;\n cf.#events();\n }\n /**\n * 綁事件\n */\n #events() {\n const cf = this;\n const { datepicker, timepicker, clearEl, submitEl } = cf.options;\n\n /**\n * 綁定日曆/時間\n */\n function bindingDatepicker() {\n // 日曆\n datepicker.forEach(item => {\n flatpickr(item.el, item.options);\n });\n // 時間\n timepicker.forEach(item => {\n flatpickr(item.el, item.options);\n });\n }\n\n /**\n * 綁定按鈕點擊事件\n */\n function bindingButton() {\n const clearBtn = document.querySelector(clearEl);\n const submitBtn = document.querySelector(submitEl);\n clearBtn?.addEventListener('click', function () {\n cf.clear();\n });\n submitBtn?.addEventListener('click', function () {\n cf.submit();\n });\n }\n\n function fileUpload(target) {\n const formGroup = target.closest('.form-group');\n if (target.files.length <= 0) return;\n const fakeUploadWrap = target.closest('.file-wrap').querySelector('.fake-file-upload');\n const defaultText = fakeUploadWrap.getAttribute('data-default');\n const fileName = fakeUploadWrap.querySelector('.file-name');\n const fileLimit = Number(target.getAttribute('data-limit'));\n const file = target.files[0];\n const fileSize = file.size / 1024 / 1024;\n const originalName = file.name;\n const fileInputTemp = target.cloneNode(true);\n if (fileSize > fileLimit) {\n //超過檔案大小限制\n formGroup.classList.add('error');\n formGroup.classList.remove('success');\n fileInputTemp.value = '';\n } else {\n //符合檔案大小限制\n formGroup.classList.remove('error');\n formGroup.classList.add('success');\n }\n fileName.textContent = originalName;\n fileInputTemp.removeAttribute('form-field field-type data-limit');\n fakeUploadWrap.querySelector('input[type=\"file\"]')?.remove();\n fakeUploadWrap.append(fileInputTemp);\n }\n\n /**\n * 表單內欄位異動監聽\n */\n function changeListener() {\n function changeHandler(event) {\n const { target } = event;\n let fieldName, fieldObj;\n if (target.matches('[type=\"radio\"], [type=\"checkbox\"]')) {\n cf.element.value = cf.getValue();\n fieldName = target.closest('.form-check').getAttribute('form-field');\n fieldObj = {\n [fieldName]: cf.element.value[fieldName],\n };\n if (cf.options.verify) cf.verify(fieldObj);\n }\n if (target.matches('[type=\"file\"]')) {\n fileUpload(target);\n cf.element.value = cf.getValue();\n fieldName = target.getAttribute('form-field');\n fieldObj = {\n [fieldName]: cf.element.value[fieldName],\n };\n if (cf.options.verify) cf.verify(fieldObj);\n }\n }\n\n cf.element.addEventListener(\n 'input',\n debounce(function (e) {\n const { target } = e;\n if (target.matches('[type=\"text\"],[type=\"number\"],[type=\"email\"],[type=\"password\"], textarea')) {\n cf.element.value = cf.getValue();\n // 如果該欄位非必填則不做即時驗證\n if (!target.closest('.form-group').classList.contains('required') && target.hasAttribute('data-verify')) {\n if (validator.isEmpty(target.value)) {\n target.classList.remove('error');\n target.classList.remove('success');\n target.closest('.form-group').classList.remove('error');\n }\n return;\n }\n const fieldName = target.getAttribute('form-field');\n const fieldObj = {\n [fieldName]: cf.element.value[fieldName],\n };\n if (cf.options.verify) cf.verify(fieldObj);\n }\n }),\n );\n cf.allCheckbox.forEach(checkbox => {\n checkbox.addEventListener('change', changeHandler);\n });\n cf.allRadio.forEach(radio => {\n radio.addEventListener('change', changeHandler);\n });\n cf.allDropdown.forEach(dropdown => {\n dropdown.on('change', function () {\n const fieldName = this.getAttribute('form-field');\n cf.element.value = cf.getValue();\n const val = cf.element.value[fieldName];\n const value = typeof val === 'object' && !Array.isArray(val) ? val.value : val;\n const fieldObj = {\n [fieldName]: val,\n };\n if ((Array.isArray(value) && value.length > 0) || (!Array.isArray(value) && !validator.isEmpty(value))) {\n if (cf.options.verify) cf.verify(fieldObj);\n }\n });\n });\n }\n bindingDatepicker();\n bindingButton();\n changeListener();\n }\n /**\n * 取得表單所有的值\n * @returns\n */\n getValue() {\n const cf = this;\n // 參數 -\n // 在對應的地方 加上 [form-field] --> 欄位名稱 [field-type] --> 欄位格式\n // isFile(取檔案數值物件)\n // isRadio(要放在對應父層)\n // isCheckBox(要放在對應父層)\n // isSelect(要放在對應父層)\n let data = {};\n [...cf.allField].forEach(el => {\n const field = el.getAttribute('form-field');\n const type = el.getAttribute('field-type');\n switch (type) {\n // 單選Radio\n case 'isRadio':\n const radioChecked = el.querySelector('input:checked');\n const textInput = radioChecked.querySelector('input[type=\"text\"]');\n data[field] = {\n id: parseInt(radioChecked.closest('.option-item').querySelector('.text').getAttribute('data-id')),\n value: textInput ? textInput.value : radioChecked.closest('.option-item').querySelector('.text').textContent,\n };\n break;\n // 複選Checkbox\n case 'isCheckBox':\n const checkBoxChecked = el.querySelectorAll('input:checked');\n data[field] = [...checkBoxChecked].map(item => {\n const textInput = item.querySelector('input[type=\"text\"]');\n return {\n id: parseInt(item.closest('.option-item').querySelector('.text').getAttribute('data-id')),\n value: textInput ? textInput.value : item.closest('.option-item').querySelector('.text').textContent,\n };\n });\n break;\n // 下拉選單\n case 'isSelect':\n const selectType = el.hasAttribute('multiple') ? 'multiple' : 'single';\n switch (selectType) {\n case 'single':\n data[field] = {\n value: el.s.value.id ? el.s.value.id : '',\n display: el.s.value.el ? el.s.value.el.textContent : '',\n };\n break;\n case 'multiple':\n data[field] = {\n value: el.s.value.map(option => option.id),\n display: el.s.value.map(option => option.el.textContent),\n };\n break;\n }\n break;\n // 檔案上傳\n case 'isFile':\n const fileTemp = el.closest('.file-wrap').querySelector('.fake-file-upload input');\n data[field] = fileTemp ? fileTemp.files : undefined;\n break;\n // 其他\n default:\n data[field] = el.value;\n break;\n }\n });\n return data;\n }\n /**\n * 表單驗證\n * @param {object} verifyField 針對單一欄位驗證,沒傳值表示全部欄位\n * @returns\n */\n verify(verifyField) {\n const cf = this;\n const { options } = cf;\n const allValue = cf.element.value;\n const field = verifyField ? verifyField : allValue;\n /**\n * 產生表單驗證 icon(✅/❌)\n * @param {object} field 欄位物件\n */\n function appendVerifyIcon(field) {\n const validationIcon = '<div class=\"validation-icon\"></div>';\n for (const key in field) {\n const fieldEl = cf.element.querySelector(`[form-field=\"${key}\"]`);\n const verifyType = fieldEl.getAttribute('data-verify');\n const formGroup = fieldEl.closest('.form-group');\n switch (verifyType) {\n case 'select':\n const selectWrapper = fieldEl.querySelector('.select-wrapper');\n const dropdownIcon = selectWrapper.querySelector('.dropdown-icon');\n selectWrapper.querySelector('.validation-icon')?.remove();\n selectWrapper.insertBefore(htmlStringToDOM(validationIcon), dropdownIcon);\n break;\n case 'radio':\n case 'checkbox':\n formGroup.querySelector('.validation-icon')?.remove();\n formGroup.append(htmlStringToDOM(validationIcon));\n break;\n case 'file':\n const fileWrapper = fieldEl.closest('.file-wrap').querySelector('.fake-file-upload');\n const uploadIcon = fieldEl.closest('.file-wrap').querySelector('.upload-icon');\n fileWrapper.querySelector('.validation-icon')?.remove();\n if (uploadIcon) {\n fileWrapper.insertBefore(htmlStringToDOM(validationIcon), uploadIcon);\n } else {\n fileWrapper.append(htmlStringToDOM(validationIcon));\n }\n break;\n case 'date':\n case 'textarea':\n default:\n fieldEl.closest('.input-wrap').querySelector('.validation-icon')?.remove();\n fieldEl.closest('.input-wrap').append(htmlStringToDOM(validationIcon));\n break;\n }\n }\n }\n appendVerifyIcon(field);\n if (verifyField) {\n const key = Object.keys(field)[0];\n cf.element.querySelectorAll(`.error-text[name=\"${key}\"]`).forEach(element => element.remove());\n } else {\n cf.element.querySelectorAll('.error-text').forEach(element => element.remove());\n }\n for (const key in field) {\n const fieldEl = cf.element.querySelector(`[form-field=\"${key}\"]`);\n const formGroup = fieldEl.closest('.form-group');\n const subject = formGroup.querySelector('.subject')?.textContent;\n const verifyType = fieldEl.getAttribute('data-verify');\n /**\n * 回傳欄位的 value\n * @returns\n */\n const value = () => {\n if (typeof allValue[key] === 'object' && !Array.isArray(allValue[key])) {\n if (verifyType === 'file') {\n return allValue[key];\n }\n return allValue[key].value;\n }\n return allValue[key];\n };\n /**\n * 空值\n * @returns\n */\n const noValue = () => {\n if (verifyType === 'file') {\n return value() === undefined ? true : value() && value().length === 0;\n }\n return (Array.isArray(value()) && value().length === 0) || (!Array.isArray(value()) && validator.isEmpty(value()));\n };\n /**\n * 有值\n * @returns\n */\n const hasValue = () => {\n if (verifyType === 'file') {\n return value() === undefined ? false : value() && value().length > 0;\n }\n return (Array.isArray(value()) && value().length > 0) || (!Array.isArray(value()) && !validator.isEmpty(value()));\n };\n // 必填\n const required = formGroup.classList.contains('required');\n /**\n * 塞入詳細錯誤訊息\n * @param {string} type 錯誤訊息類別\n * @returns\n */\n function appendError(type, position, insertEl) {\n const fieldEl = cf.element.querySelector(`[form-field=\"${key}\"]`);\n const fieldElIndex = [...cf.element.querySelectorAll(`[form-field]`)].indexOf(fieldEl);\n const errorTextDOM = type => `<p class=\"error-text\" name=\"${key}\" index=\"${fieldElIndex}\">${subject} - ${errorText[options.locale][type]}</p>`;\n switch (position) {\n case 'underField':\n if (!options.errorText.underField) return;\n insertEl.append(htmlStringToDOM(errorTextDOM(type)));\n break;\n case 'detail':\n if (!insertEl) return;\n insertEl.append(htmlStringToDOM(errorTextDOM(type)));\n break;\n }\n }\n function sortErrorDetail() {\n const allError = cf.detailOutputEl.querySelectorAll('.error-text');\n if ([...allError].length > 0) {\n cf.element.classList.add('something-wrong');\n } else {\n cf.element.classList.remove('something-wrong');\n }\n const sortErrorDetail = [...allError].sort((a, b) => a.getAttribute('index') - b.getAttribute('index'));\n if (cf.detailOutputEl) {\n cf.detailOutputEl.textContent = '';\n }\n sortErrorDetail.forEach(item => cf.detailOutputEl?.appendChild(item));\n }\n let validationIcon;\n // 驗證必填/必選欄位是否為空\n if (required && noValue()) {\n fieldEl.classList.remove('success');\n fieldEl.classList.add('error');\n formGroup.classList.add('error');\n switch (verifyType) {\n case 'select':\n validationIcon = fieldEl.querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].select);\n appendError('select', 'underField', formGroup.parentNode);\n appendError('select', 'detail', cf.detailOutputEl);\n break;\n case 'radio':\n case 'checkbox':\n validationIcon = formGroup.querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].select);\n appendError('select', 'underField', formGroup.parentNode);\n appendError('select', 'detail', cf.detailOutputEl);\n break;\n case 'file':\n validationIcon = fieldEl.closest('.file-wrap').querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].file);\n appendError('file', 'underField', formGroup.parentNode);\n appendError('file', 'detail', cf.detailOutputEl);\n break;\n default:\n validationIcon = fieldEl.closest('.input-wrap').querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].input);\n appendError('input', 'underField', formGroup.parentNode);\n appendError('input', 'detail', cf.detailOutputEl);\n break;\n }\n }\n if (hasValue()) {\n /**\n * 更新欄位狀態\n * @param {object} fieldEl [form-field] element\n * @param {boolean} success 是否通過驗證\n */\n function updateFieldStatus(fieldEl, success) {\n const formGroup = fieldEl.closest('.form-group');\n fieldEl.classList.toggle('error', !success);\n fieldEl.classList.toggle('success', success);\n const verifyType = fieldEl.getAttribute('data-verify');\n const otherField = verifyType === 'phone' ? formGroup.querySelector('*:not(input)[form-field]') : formGroup.querySelector('*:not(dropdown-el)[form-field]');\n const hasOtherField = Boolean(otherField);\n const fieldSuccess = fieldEl.classList.contains('success');\n const fieldError = fieldEl.classList.contains('error');\n const otherFieldSuccess = otherField?.classList.contains('success');\n const otherFieldError = otherField?.classList.contains('error');\n if (hasOtherField) {\n if (otherFieldSuccess && !otherFieldError && fieldSuccess) {\n formGroup.classList.remove('error');\n formGroup.classList.add('success');\n } else if (otherFieldError || fieldError) {\n formGroup.classList.remove('success');\n formGroup.classList.add('error');\n }\n } else {\n if (fieldSuccess) {\n formGroup.classList.remove('error');\n formGroup.classList.add('success');\n } else {\n formGroup.classList.add('error');\n formGroup.classList.remove('success');\n }\n }\n }\n switch (verifyType) {\n case 'phone':\n const dropdownEl = formGroup.querySelector('dropdown-el');\n if (validator.isMobilePhone(value())) {\n updateFieldStatus(fieldEl, true);\n if (dropdownEl && dropdownEl.classList.contains('success')) {\n formGroup.classList.remove('error');\n formGroup.classList.add('success');\n }\n } else {\n updateFieldStatus(fieldEl, false);\n validationIcon = fieldEl.closest('.input-wrap').querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].format);\n appendError('format', 'underField', formGroup.parentNode);\n appendError('format', 'detail', cf.detailOutputEl);\n }\n break;\n case 'password':\n if (\n validator.isStrongPassword(value(), {\n minLength: 8,\n minLowercase: 1,\n minUppercase: 0,\n minNumbers: 1,\n minSymbols: 0,\n })\n ) {\n updateFieldStatus(fieldEl, true);\n } else {\n updateFieldStatus(fieldEl, false);\n validationIcon = fieldEl.closest('.input-wrap').querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].format);\n appendError('format', 'underField', formGroup.parentNode);\n appendError('format', 'detail', cf.detailOutputEl);\n }\n break;\n case 'email':\n if (validator.isEmail(value())) {\n updateFieldStatus(fieldEl, true);\n } else {\n updateFieldStatus(fieldEl, false);\n validationIcon = fieldEl.closest('.input-wrap').querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].format);\n appendError('format', 'underField', formGroup.parentNode);\n appendError('format', 'detail', cf.detailOutputEl);\n }\n break;\n case 'verifyCode':\n const isValidCode = validator.isNumeric(value(), { no_symbols: true }) && validator.isLength(value(), { min: 4, max: 4 });\n if (isValidCode) {\n updateFieldStatus(fieldEl, true);\n } else {\n updateFieldStatus(fieldEl, false);\n validationIcon = fieldEl.closest('.input-wrap').querySelector('.validation-icon');\n validationIcon.setAttribute('error-text', errorText[options.locale].format);\n appendError('format', 'underField', formGroup.parentNode);\n appendError('format', 'detail', cf.detailOutputEl);\n }\n break;\n case 'select':\n default:\n updateFieldStatus(fieldEl, true);\n break;\n }\n }\n // 重新排序\n if (cf.detailOutputEl) {\n sortErrorDetail();\n }\n }\n }\n /**\n * 送出表單\n */\n submit() {\n const cf = this;\n if (cf.options.verify) {\n cf.verify();\n }\n cf.element.dispatchEvent(cf.submitEvent);\n }\n /**\n * 清除表單所有欄位\n */\n clear() {\n const cf = this;\n const { allInput, allTextarea, allCheckbox, allFileUpload, allDropdown } = cf;\n [...cf.allField].forEach(el => {\n const formGroup = el.closest('.form-group');\n formGroup.classList.remove('success');\n formGroup.classList.remove('error');\n el.classList.remove('success');\n el.classList.remove('error');\n el.closest('.form-grid').querySelector('.error-text')?.remove();\n if (cf.detailOutputEl) {\n cf.detailOutputEl.textContent = '';\n }\n });\n [...allInput].forEach(input => {\n input.value = '';\n });\n [...allTextarea].forEach(textarea => {\n textarea.value = '';\n });\n [...allCheckbox].forEach(checkbox => {\n checkbox.checked = false;\n });\n [...allFileUpload].forEach(input => {\n let defaultText = input.getAttribute('data-default');\n const fileName = defaultText.querySelector('.file-name');\n fileName.classList.remove('is-upload');\n fileName.textContent = defaultText;\n });\n [...allDropdown].forEach(dropdown => {\n dropdown.setAttribute('d4-value', '');\n if (dropdown.hasAttribute('control-elements')) {\n const disabledEl = [...dropdown.getAttribute('control-elements').split(',')];\n disabledEl.forEach(selector => {\n document.querySelector(selector).classList.remove('disabled');\n });\n }\n });\n cf.element.value = cf.getValue();\n }\n}\n"],"names":["errorPage","countdownInterval","second","homepage","countdown","detectShade","imgEl","el","dominantColor","ColorThief","grayLevel","colorPick","addClassEl","element","_a","createColorCube","startColor","endColor","canvas","context","gradient","img","init","errorWColor","errorBColor","pageChange","href","$","randomAnimate","clickEvent","e","hrefLink","$this","thisTarget","aHref","xArr","lastArr","y","yArr","arr","last","mouseenterEvent","$hrefEl","mouseleaveEvent","cgpagechange","x","b","c","errorText","CustomForm","params","__privateAdd","_events","defaultOptions","Mandarin","mergeOptions","target","source","merged","key","cf","__privateMethod","events_fn","data","field","radioChecked","textInput","checkBoxChecked","item","option","fileTemp","verifyField","options","allValue","appendVerifyIcon","validationIcon","fieldEl","verifyType","formGroup","selectWrapper","dropdownIcon","htmlStringToDOM","_b","fileWrapper","uploadIcon","_c","_d","appendError","type","position","insertEl","fieldElIndex","errorTextDOM","subject","sortErrorDetail","allError","a","value","noValue","validator","hasValue","required","updateFieldStatus","success","otherField","hasOtherField","fieldSuccess","fieldError","otherFieldSuccess","otherFieldError","dropdownEl","allInput","allTextarea","allCheckbox","allFileUpload","allDropdown","input","textarea","checkbox","defaultText","fileName","dropdown","selector","datepicker","timepicker","clearEl","submitEl","bindingDatepicker","flatpickr","bindingButton","clearBtn","submitBtn","fileUpload","fakeUploadWrap","fileLimit","file","fileSize","originalName","fileInputTemp","changeListener","changeHandler","event","fieldName","fieldObj","debounce","radio","val"],"mappings":";;;;;;;;;;;;;;;;AACO,SAASA,KAAY;AAC1B,MAAI,CAAC,SAAS,KAAK,UAAU,SAAS,OAAO,KAAK,SAAS,cAAc,YAAY,KAAK;AAAM;AAChG,MAAIC,GACAC,IAAS;AACb,QAAMC,IAAW,SAAS,cAAc,YAAY,EAAE,aAAa,MAAM,GACnEC,IAAY,SAAS,cAAc,uBAAuB;AAChE,EAAAH,IAAoB,YAAY,MAAM;AACpC,IAAAC,KACAE,EAAU,cAAcF,GACpBA,MAAW,MACb,cAAcD,CAAiB,GAC/B,OAAO,SAAS,OAAOE;AAAA,EAE1B,GAAE,GAAI;AACT;ACLO,SAASE,EAAYC,GAAOC,IAAKD,GAAO;AAC7C,MAAIA,EAAM,UAAU;AAGlB,UAAME,IADa,IAAIC,IACU,SAASH,CAAK,GACzCI,IAAYF,EAAc,CAAC,IAAI,QAAQA,EAAc,CAAC,IAAI,QAAQA,EAAc,CAAC,IAAI;AAE3F,IAAAG,EAAUD,GAAWH,CAAE,GACvBA,EAAG,UAAU,IAAI,UAAU;AAAA,EAC5B;AACH;AAMO,SAASI,EAAUD,GAAWH,GAAI;AACvC,QAAMK,IAAaL,EAAG,aAAa,YAAY;AAC/C,EAAIG,KAAa,MAEXE,KAAcA,MAAe,KAC/BA,EAAW,MAAM,GAAG,EAAE,QAAQ,CAAAC,MAAW;;AACvC,IAAKN,EAAG,QAAQM,CAAO,KACrB,QAAQ,MAAM,YAAYA,CAAO,aAAa,IAEhDC,IAAAP,EAAG,QAAQM,CAAO,MAAlB,QAAAC,EAAqB,UAAU,IAAI;AAAA,EAC3C,CAAO,IAEDP,EAAG,UAAU,IAAI,UAAU,IAIzBK,KAAcA,MAAe,KAC/BA,EAAW,MAAM,GAAG,EAAE,QAAQ,CAAAC,MAAW;;AACvC,IAAKN,EAAG,QAAQM,CAAO,KACrB,QAAQ,MAAM,YAAYA,CAAO,aAAa,IAEhDC,IAAAP,EAAG,QAAQM,CAAO,MAAlB,QAAAC,EAAqB,UAAU,IAAI;AAAA,EAC3C,CAAO,IAEDP,EAAG,UAAU,IAAI,SAAS;AAGhC;AAOO,SAASQ,EAAgBC,GAAYC,GAAUV,GAAI;AACxD,QAAMW,IAAS,SAAS,cAAc,QAAQ,GACxCC,IAAUD,EAAO,WAAW,IAAI;AAGtC,MAFAA,EAAO,QAAQ,IACfA,EAAO,SAAS,IACZF,MAAe,MAAMC,MAAa;AAEpC,IAAAE,EAAQ,YAAYH;AAAA,WACXA,MAAe,MAAMC,MAAa,IAAI;AAE/C,UAAMG,IAAWD,EAAQ,qBAAqB,GAAG,GAAGD,EAAO,OAAOA,EAAO,MAAM;AAC/E,IAAAE,EAAS,aAAa,GAAGJ,CAAU,GACnCI,EAAS,aAAa,GAAGH,CAAQ,GACjCE,EAAQ,YAAYC;AAAA,EACrB;AACD,EAAAD,EAAQ,SAAS,GAAG,GAAGD,EAAO,OAAOA,EAAO,MAAM;AAGlD,QAAMG,IAAM,IAAI;AAChB,SAAAA,EAAI,MAAMH,EAAO,aACjBG,EAAI,cAAc,aAClBA,EAAI,iBAAiB,QAAQ,WAAY;AAEvC,IAAAhB,EADc,MACKE,CAAE;AAAA,EACzB,CAAG,GACMc;AACT;AAEO,SAASC,KAAO;AAErB,GAAC,GADgB,SAAS,iBAAiB,8BAA8B,CAC7D,EAAE,QAAQ,CAAAf,MAAM;AAC1B,QAAIA,EAAG,YAAY;AACjB;AAEF,UAAMgB,IAAc,CAAC,QAAQ,WAAW,QAAQ,SAAS,GACnDC,IAAc,CAAC,QAAQ,SAAS,GAEhCR,IAAa,iBAAiBT,CAAE,EAAE,iBAAiB,eAAe,GAClEU,IAAW,iBAAiBV,CAAE,EAAE,iBAAiB,aAAa;AACpE,QAAIS,MAAe,MAAMC,MAAa,IAAI;AACxC,cAAQ,MAAMV,GAAI,kBAAkB;AACpC;AAAA,IACD,WAAUgB,EAAY,QAAQP,CAAU,IAAI,GAAG;AAC9C,cAAQ,KAAKT,GAAI,0BAA0B,GAE3CI,EAAU,KAAKJ,CAAE;AACjB;AAAA,IACD,WAAUiB,EAAY,QAAQR,CAAU,IAAI,GAAG;AAC9C,cAAQ,KAAKT,GAAI,0BAA0B,GAE3CI,EAAU,GAAGJ,CAAE;AACf;AAAA,IACD;AACD,IAAAQ,EAAgBC,GAAYC,GAAUV,CAAE;AAAA,EAC5C,CAAG;AACH;ACnHA,MAAMkB,IAAa;AAAA,EACjB,MAAM,SAAUC,GAAM;AACpB,IAAAC,EAAE,WAAW,EACV,MAAM,GAAG,EACT;AAAA,MACC,EAAE,SAAS,IAAK;AAAA,MAChB;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,UAAU,WAAY;AACpB,iBAAO,SAAS,OAAOD,CAAI;AAAA,QAC5B;AAAA,MACF;AAAA,IACT;AAAA,EACG;AAAA,EACD,MAAM,SAAUA,GAAM;AACpB,IAAAC,EAAE,MAAM,EAAE,OAAO,+EAA+E,GAEhGA,EAAE,MAAM,EACL,MAAM,IAAI,EACV;AAAA,MACC,EAAE,SAAS,IAAK;AAAA,MAChB;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,UAAU,WAAY;AACpB,qBAAW,WAAY;AACrB,mBAAO,SAAS,OAAOD,CAAI;AAAA,UAC5B,GAAE,GAAG;AAAA,QACP;AAAA,MACF;AAAA,IACT;AAAA,EACG;AAAA,EACD,MAAM,SAAUA,GAAM;AACpB,IAAAC,EAAE,MAAM,EAAE,OAAO,yBAAyB,GAC1CA,EAAE,MAAM,EACL,MAAM,IAAI,EACV;AAAA,MACC,EAAE,SAAS,IAAK;AAAA,MAChB;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,UAAU,WAAY;AACpB,qBAAW,WAAY;AACrB,mBAAO,SAAS,OAAOD,CAAI;AAAA,UAC5B,GAAE,GAAG;AAAA,QACP;AAAA,MACF;AAAA,IACT;AAAA,EACG;AAAA,EACD,MAAM,SAAUA,GAAM;AACpB,IAAAC,EAAE,MAAM,EAAE,OAAO,+EAA+E,GAChGA,EAAE,MAAM,EACL,MAAM,IAAI,EACV;AAAA,MACC,EAAE,SAAS,IAAK;AAAA,MAChB;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,UAAU,WAAY;AACpB,qBAAW,WAAY;AACrB,mBAAO,SAAS,OAAOD,CAAI;AAAA,UAC5B,GAAE,GAAG;AAAA,QACP;AAAA,MACF;AAAA,IACT;AAAA,EACG;AACH,GAEME,IAAgB,CAAAF,MAAQ;AAE5B,UAAQ,GAAC;AAAA,IACP,KAAK;AACH,MAAAD,EAAW,KAAKC,CAAI;AACpB;AAAA,IACF,KAAK;AACH,MAAAD,EAAW,KAAKC,CAAI;AACpB;AAAA,IACF,KAAK;AACH,MAAAD,EAAW,KAAKC,CAAI;AACpB;AAAA,IACF,KAAK;AACH,MAAAD,EAAW,KAAKC,CAAI;AACpB;AAAA,EAGH;AACH,GAEMG,IAAa,CAACC,GAAEC,MAAa;AACjC,EAAAD,EAAE,eAAc;AAChB,QAAME,IAAQL,EAAEG,EAAE,aAAa,GACzBG,IAAaD,EAAM,KAAK,QAAQ,GAChCE,IAAQF,EAAM,KAAK,MAAM;AAC/B,MAAIN;AAEJ,MAAIK,GAAU;AAEZ,QAAIC,EAAM,GAAG,eAAe,GAAG;AAC7B,MAAAF,EAAE,gBAAe,GACjBA,EAAE,eAAc;AAChB;AAAA,IACD;AACD,IAAIE,EAAM,SAAS,aAAa,IAC9BN,IAAOM,EAAM,QAAQ,aAAa,EAAE,KAAK,WAAW,IAEpDN,IAAOQ;AAAA,EAEb,OAAS;AAEL,QAAIF,EAAM,GAAG,eAAe,GAAG;AAC7B,MAAAF,EAAE,gBAAe,GACjBA,EAAE,eAAc;AAChB;AAAA,IACD;AACD,IAAIE,EAAM,SAAS,WAAW,IAC5BN,IAAOM,EAAM,QAAQ,aAAa,EAAE,KAAK,WAAW,IAEpDN,IAAOQ;AAAA,EAEV;AAID,MAAIC,IADM,OAAO,SAAS,SAAS,QAAQ,WAAW,EAAE,EAC3C,MAAM,GAAG;AACtB,EAAAA,IAAOC,EAAQD,CAAI;AAEnB,QAAME,IAAIX,EAAK,QAAQ,WAAW,EAAE;AACpC,MAAIY,IAAOD,EAAE,MAAM,GAAG;AACtB,EAAAC,IAAOF,EAAQE,CAAI;AACnB,WAASF,EAAQG,GAAK;AACpB,UAAMC,IAAOD,EAAI;AACjB,WAAIC,EAAK,QAAQ,GAAG,IAAI,MAEbA,EAAK,QAAQ,MAAM,IAAI,IADhCD,EAAI,KAAKC,CAAI,KAGJA,KAAQ,MAGjBD,EAAI,KAAKC,CAAI,GACbD,EAAI,KAAK,YAAY,IAEhBA;AAAA,EACR;AACD,EAAIN,KAAc,YAAYH,EAAE,WAAWA,EAAE,UAC3C,OAAO,KAAKJ,CAAI,IACPW,EAAE,QAAQ,KAAK,IAAI,MAAMA,EAAE,QAAQ,YAAY,IAAI,MAG5DT,EAAcF,CAAI;AAEtB,GAEMe,IAAkB,CAAAX,MAAK;AAE3B,QAAMY,IADQf,EAAEG,EAAE,aAAa,EACT,QAAQ,aAAa;AAC3C,EAAIY,EAAQ,SAAS,SAAS,KAC9BA,EAAQ,SAAS,SAAS;AAC5B,GAEMC,IAAkB,CAAAb,MAAK;AAE3B,QAAMY,IADQf,EAAEG,EAAE,aAAa,EACT,QAAQ,aAAa;AAC3C,EAAKY,EAAQ,SAAS,SAAS,KAC/BA,EAAQ,YAAY,SAAS;AAC/B,GAEaE,KAAe,CAACb,IAAW,OAAS;AAE/C,EAAAJ,EAAE,OAAO,SAAYA,EAAE,OAAO,OAC9BA,EAAE,OAAOA,EAAE,QAAQ;AAAA,IACjB,KAAK;AAAA,IACL,aAAa,SAAUkB,GAAG,GAAGC,GAAGC,GAAG,GAAG;AACpC,aAAO,CAACA,KAAK,KAAK,MAAM,IAAI,KAAKD;AAAA,IAClC;AAAA,IACD,eAAe,SAAUD,GAAG,GAAGC,GAAGC,GAAG,GAAG;AACtC,cAAK,KAAK,IAAI,KAAK,IAAW,CAACA,IAAI,KAAM,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAKD,IAC7DC,IAAI,KAAM,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC,IAAI,KAAKD;AAAA,IACtD;AAAA,EACL,CAAG,GACDnB,EAAE,MAAM,EAAE,GAAG,SAAS,yDAAyD,OAAKE,EAAW,GAAEE,CAAQ,CAAC,GAC1GJ,EAAE,MAAM,EAAE,GAAG,SAAS,gBAAgB,SAAS,GAAG;AAChD,MAAE,gBAAe;AAAA,EACrB,CAAG,GACDA,EAAE,MAAM,EAAE,GAAG,cAAc,iBAAiB,OAAKc,EAAgB,CAAC,CAAC,GACnEd,EAAE,MAAM,EAAE,GAAG,cAAc,iBAAiB,OAAKgB,EAAgB,CAAC,CAAC;AACrE,GC9LaK,IAAY;AAAA,EACvB,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,EACP;AAAA,EACD,SAAS;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,EACT;AAAA,EACD,IAAI;AAAA,IACF,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,EACT;AAAA,EACD,IAAI;AAAA,IACF,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,EACT;AACH;;ACxBO,MAAMC,GAAW;AAAA,EACtB,YAAYpC,GAASqC,GAAQ;AAoE7B;AAAA;AAAA;AAAA,IAAAC,EAAA,MAAAC;AAnEE,SAAK,UAAU,SAAS,cAAcvC,CAAO,GAC7C,KAAK,WAAW,KAAK,QAAQ,iBAAiB,GAAGA,CAAO,eAAe,GACvE,KAAK,WAAW,KAAK,QAAQ,iBAAiB,GAAGA,CAAO,QAAQ,GAChE,KAAK,cAAc,KAAK,QAAQ,iBAAiB,GAAGA,CAAO,WAAW,GACtE,KAAK,cAAc,KAAK,QAAQ,iBAAiB,GAAGA,CAAO,yBAAyB,GACpF,KAAK,WAAW,KAAK,QAAQ,iBAAiB,GAAGA,CAAO,sBAAsB,GAC9E,KAAK,gBAAgB,KAAK,QAAQ,iBAAiB,GAAGA,CAAO,mBAAmB,GAChF,KAAK,cAAc,KAAK,QAAQ,iBAAiB,GAAGA,CAAO,cAAc,GACzE,KAAK,cAAc,IAAI,MAAM,QAAQ;AAErC,UAAMwC,IAAiB;AAAA,MACrB,QAAQ;AAAA,MACR,YAAY;AAAA,QACV;AAAA,UACE,IAAI;AAAA,UACJ,SAAS;AAAA,YACP,QAAQC,EAAQ;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,MACD,YAAY;AAAA,QACV;AAAA,UACE,IAAI;AAAA,UACJ,SAAS;AAAA,YACP,YAAY;AAAA,YACZ,YAAY;AAAA,YACZ,YAAY;AAAA,YACZ,WAAW;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,MACD,SAAS;AAAA,MACT,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW;AAAA,QACT,YAAY;AAAA,QACZ,cAAc;AAAA,MACf;AAAA,IACP,GACUC,IAAe,CAACC,GAAQC,MAAW;AACvC,YAAMC,IAAS,EAAE,GAAGF;AACpB,eAASG,KAAO,OAAO,KAAKF,CAAM;AAChC,QAAI,OAAOA,EAAOE,CAAG,KAAM,YAAYA,KAAOH,IAE5CE,EAAOC,CAAG,IAAI,MAAM,QAAQD,EAAOC,CAAG,CAAC,IACnC,CAAC,GAAGF,EAAOE,CAAG,CAAC,IACfJ,EAAaC,EAAOG,CAAG,GAAGF,EAAOE,CAAG,CAAC,IAGzCD,EAAOC,CAAG,IAAIF,EAAOE,CAAG;AAI5B,aAAOD;AAAA,IACb;AACI,SAAK,UAAUR,IAASK,EAAaF,GAAgBH,CAAM,IAAIG,GAC/D,KAAK,KAAI;AAAA,EACV;AAAA,EACD,OAAO;;AACL,UAAMO,IAAK;AACX,IAAAA,EAAG,QAAQ,QAAQA,EAAG,SAAQ,GAC9BA,EAAG,iBAAiBA,EAAG,QAAQ,UAAU,eAAe,SAAS,cAAcA,EAAG,QAAQ,UAAU,YAAY,IAAI,MACpHC,EAAA/C,IAAA8C,GAAGR,GAAAU,GAAH,KAAAhD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EA6ID,WAAW;AACT,UAAM8C,IAAK;AAOX,QAAIG,IAAO,CAAA;AACX,YAAC,GAAGH,EAAG,QAAQ,EAAE,QAAQ,CAAArD,MAAM;AAC7B,YAAMyD,IAAQzD,EAAG,aAAa,YAAY;AAE1C,cADaA,EAAG,aAAa,YAAY,GAC7B;AAAA,QAEV,KAAK;AACH,gBAAM0D,IAAe1D,EAAG,cAAc,eAAe,GAC/C2D,IAAYD,EAAa,cAAc,oBAAoB;AACjE,UAAAF,EAAKC,CAAK,IAAI;AAAA,YACZ,IAAI,SAASC,EAAa,QAAQ,cAAc,EAAE,cAAc,OAAO,EAAE,aAAa,SAAS,CAAC;AAAA,YAChG,OAAOC,IAAYA,EAAU,QAAQD,EAAa,QAAQ,cAAc,EAAE,cAAc,OAAO,EAAE;AAAA,UAC7G;AACU;AAAA,QAEF,KAAK;AACH,gBAAME,IAAkB5D,EAAG,iBAAiB,eAAe;AAC3D,UAAAwD,EAAKC,CAAK,IAAI,CAAC,GAAGG,CAAe,EAAE,IAAI,CAAAC,MAAQ;AAC7C,kBAAMF,IAAYE,EAAK,cAAc,oBAAoB;AACzD,mBAAO;AAAA,cACL,IAAI,SAASA,EAAK,QAAQ,cAAc,EAAE,cAAc,OAAO,EAAE,aAAa,SAAS,CAAC;AAAA,cACxF,OAAOF,IAAYA,EAAU,QAAQE,EAAK,QAAQ,cAAc,EAAE,cAAc,OAAO,EAAE;AAAA,YACvG;AAAA,UACA,CAAW;AACD;AAAA,QAEF,KAAK;AAEH,kBADmB7D,EAAG,aAAa,UAAU,IAAI,aAAa,UAC5C;AAAA,YAChB,KAAK;AACH,cAAAwD,EAAKC,CAAK,IAAI;AAAA,gBACZ,OAAOzD,EAAG,EAAE,MAAM,KAAKA,EAAG,EAAE,MAAM,KAAK;AAAA,gBACvC,SAASA,EAAG,EAAE,MAAM,KAAKA,EAAG,EAAE,MAAM,GAAG,cAAc;AAAA,cACrE;AACc;AAAA,YACF,KAAK;AACH,cAAAwD,EAAKC,CAAK,IAAI;AAAA,gBACZ,OAAOzD,EAAG,EAAE,MAAM,IAAI,CAAA8D,MAAUA,EAAO,EAAE;AAAA,gBACzC,SAAS9D,EAAG,EAAE,MAAM,IAAI,CAAA8D,MAAUA,EAAO,GAAG,WAAW;AAAA,cACvE;AACc;AAAA,UACH;AACD;AAAA,QAEF,KAAK;AACH,gBAAMC,IAAW/D,EAAG,QAAQ,YAAY,EAAE,cAAc,yBAAyB;AACjF,UAAAwD,EAAKC,CAAK,IAAIM,IAAWA,EAAS,QAAQ;AAC1C;AAAA,QAEF;AACE,UAAAP,EAAKC,CAAK,IAAIzD,EAAG;AACjB;AAAA,MACH;AAAA,IACP,CAAK,GACMwD;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMD,OAAOQ,GAAa;;AAClB,UAAMX,IAAK,MACL,EAAE,SAAAY,EAAS,IAAGZ,GACda,IAAWb,EAAG,QAAQ,OACtBI,IAAQO,KAA4BE;AAK1C,aAASC,EAAiBV,GAAO;;AAC/B,YAAMW,IAAiB;AACvB,iBAAWhB,KAAOK,GAAO;AACvB,cAAMY,IAAUhB,EAAG,QAAQ,cAAc,gBAAgBD,CAAG,IAAI,GAC1DkB,IAAaD,EAAQ,aAAa,aAAa,GAC/CE,IAAYF,EAAQ,QAAQ,aAAa;AAC/C,gBAAQC,GAAU;AAAA,UAChB,KAAK;AACH,kBAAME,IAAgBH,EAAQ,cAAc,iBAAiB,GACvDI,IAAeD,EAAc,cAAc,gBAAgB;AACjE,aAAAjE,IAAAiE,EAAc,cAAc,kBAAkB,MAA9C,QAAAjE,EAAiD,UACjDiE,EAAc,aAAaE,EAAgBN,CAAc,GAAGK,CAAY;AACxE;AAAA,UACF,KAAK;AAAA,UACL,KAAK;AACH,aAAAE,IAAAJ,EAAU,cAAc,kBAAkB,MAA1C,QAAAI,EAA6C,UAC7CJ,EAAU,OAAOG,EAAgBN,CAAc,CAAC;AAChD;AAAA,UACF,KAAK;AACH,kBAAMQ,IAAcP,EAAQ,QAAQ,YAAY,EAAE,cAAc,mBAAmB,GAC7EQ,IAAaR,EAAQ,QAAQ,YAAY,EAAE,cAAc,cAAc;AAC7E,aAAAS,IAAAF,EAAY,cAAc,kBAAkB,MAA5C,QAAAE,EAA+C,UAC3CD,IACFD,EAAY,aAAaF,EAAgBN,CAAc,GAAGS,CAAU,IAEpED,EAAY,OAAOF,EAAgBN,CAAc,CAAC;AAEpD;AAAA,UACF,KAAK;AAAA,UACL,KAAK;AAAA,UACL;AACE,aAAAW,IAAAV,EAAQ,QAAQ,aAAa,EAAE,cAAc,kBAAkB,MAA/D,QAAAU,EAAkE,UAClEV,EAAQ,QAAQ,aAAa,EAAE,OAAOK,EAAgBN,CAAc,CAAC;AACrE;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAED,QADAD,EAAiBV,CAAK,GAClBO,GAAa;AACf,YAAMZ,IAAM,OAAO,KAAKK,CAAK,EAAE,CAAC;AAChC,MAAAJ,EAAG,QAAQ,iBAAiB,qBAAqBD,CAAG,IAAI,EAAE,QAAQ,CAAA9C,MAAWA,EAAQ,OAAQ,CAAA;AAAA,IACnG;AACM,MAAA+C,EAAG,QAAQ,iBAAiB,aAAa,EAAE,QAAQ,CAAA/C,MAAWA,EAAQ,OAAM,CAAE;AAEhF,eAAW8C,KAAOK,GAAO;AA6CvB,UAASuB,IAAT,SAAqBC,GAAMC,GAAUC,GAAU;AAC7C,cAAMd,IAAUhB,EAAG,QAAQ,cAAc,gBAAgBD,CAAG,IAAI,GAC1DgC,IAAe,CAAC,GAAG/B,EAAG,QAAQ,iBAAiB,cAAc,CAAC,EAAE,QAAQgB,CAAO,GAC/EgB,IAAe,CAAAJ,MAAQ,+BAA+B7B,CAAG,YAAYgC,CAAY,KAAKE,CAAO,MAAM7C,EAAUwB,EAAQ,MAAM,EAAEgB,CAAI,CAAC;AACxI,gBAAQC,GAAQ;AAAA,UACd,KAAK;AACH,gBAAI,CAACjB,EAAQ,UAAU;AAAY;AACnC,YAAAkB,EAAS,OAAOT,EAAgBW,EAAaJ,CAAI,CAAC,CAAC;AACnD;AAAA,UACF,KAAK;AACH,gBAAI,CAACE;AAAU;AACf,YAAAA,EAAS,OAAOT,EAAgBW,EAAaJ,CAAI,CAAC,CAAC;AACnD;AAAA,QACH;AAAA,MACF,GACQM,IAAT,WAA2B;AACzB,cAAMC,IAAWnC,EAAG,eAAe,iBAAiB,aAAa;AACjE,QAAI,CAAC,GAAGmC,CAAQ,EAAE,SAAS,IACzBnC,EAAG,QAAQ,UAAU,IAAI,iBAAiB,IAE1CA,EAAG,QAAQ,UAAU,OAAO,iBAAiB;AAE/C,cAAMkC,IAAkB,CAAC,GAAGC,CAAQ,EAAE,KAAK,CAACC,GAAG,MAAMA,EAAE,aAAa,OAAO,IAAI,EAAE,aAAa,OAAO,CAAC;AACtG,QAAIpC,EAAG,mBACLA,EAAG,eAAe,cAAc,KAElCkC,EAAgB,QAAQ,CAAA1B,MAAQ;;AAAA,kBAAAtD,IAAA8C,EAAG,mBAAH,gBAAA9C,EAAmB,YAAYsD;AAAA,SAAK;AAAA,MACrE;AAvED,YAAMQ,IAAUhB,EAAG,QAAQ,cAAc,gBAAgBD,CAAG,IAAI,GAC1DmB,IAAYF,EAAQ,QAAQ,aAAa,GACzCiB,KAAU/E,IAAAgE,EAAU,cAAc,UAAU,MAAlC,gBAAAhE,EAAqC,aAC/C+D,IAAaD,EAAQ,aAAa,aAAa,GAK/CqB,IAAQ,MACR,OAAOxB,EAASd,CAAG,KAAM,YAAY,CAAC,MAAM,QAAQc,EAASd,CAAG,CAAC,IAC/DkB,MAAe,SACVJ,EAASd,CAAG,IAEdc,EAASd,CAAG,EAAE,QAEhBc,EAASd,CAAG,GAMfuC,IAAU,MACVrB,MAAe,SACVoB,EAAK,MAAO,SAAY,KAAOA,EAAK,KAAMA,EAAK,EAAG,WAAW,IAE9D,MAAM,QAAQA,EAAO,CAAA,KAAKA,EAAK,EAAG,WAAW,KAAO,CAAC,MAAM,QAAQA,GAAO,KAAKE,EAAU,QAAQF,EAAO,CAAA,GAM5GG,IAAW,MACXvB,MAAe,SACVoB,EAAK,MAAO,SAAY,KAAQA,EAAK,KAAMA,EAAK,EAAG,SAAS,IAE7D,MAAM,QAAQA,EAAO,CAAA,KAAKA,EAAK,EAAG,SAAS,KAAO,CAAC,MAAM,QAAQA,EAAK,CAAE,KAAK,CAACE,EAAU,QAAQF,EAAO,CAAA,GAG3GI,IAAWvB,EAAU,UAAU,SAAS,UAAU;AAkCxD,UAAIH;AAEJ,UAAI0B,KAAYH;AAId,gBAHAtB,EAAQ,UAAU,OAAO,SAAS,GAClCA,EAAQ,UAAU,IAAI,OAAO,GAC7BE,EAAU,UAAU,IAAI,OAAO,GACvBD,GAAU;AAAA,UAChB,KAAK;AACH,YAAAF,IAAiBC,EAAQ,cAAc,kBAAkB,GACzDD,EAAe,aAAa,cAAc3B,EAAUwB,EAAQ,MAAM,EAAE,MAAM,GAC1Ee,EAAY,UAAU,cAAcT,EAAU,UAAU,GACxDS,EAAY,UAAU,UAAU3B,EAAG,cAAc;AACjD;AAAA,UACF,KAAK;AAAA,UACL,KAAK;AACH,YAAAe,IAAiBG,EAAU,cAAc,kBAAkB,GAC3DH,EAAe,aAAa,cAAc3B,EAAUwB,EAAQ,MAAM,EAAE,MAAM,GAC1Ee,EAAY,UAAU,cAAcT,EAAU,UAAU,GACxDS,EAAY,UAAU,UAAU3B,EAAG,cAAc;AACjD;AAAA,UACF,KAAK;AACH,YAAAe,IAAiBC,EAAQ,QAAQ,YAAY,EAAE,cAAc,kBAAkB,GAC/ED,EAAe,aAAa,cAAc3B,EAAUwB,EAAQ,MAAM,EAAE,IAAI,GACxEe,EAAY,QAAQ,cAAcT,EAAU,UAAU,GACtDS,EAAY,QAAQ,UAAU3B,EAAG,cAAc;AAC/C;AAAA,UACF;AACE,YAAAe,IAAiBC,EAAQ,QAAQ,aAAa,EAAE,cAAc,kBAAkB,GAChFD,EAAe,aAAa,cAAc3B,EAAUwB,EAAQ,MAAM,EAAE,KAAK,GACzEe,EAAY,SAAS,cAAcT,EAAU,UAAU,GACvDS,EAAY,SAAS,UAAU3B,EAAG,cAAc;AAChD;AAAA,QACH;AAEH,UAAIwC,EAAQ,GAAI;AAMd,YAASE,IAAT,SAA2B1B,GAAS2B,GAAS;AAC3C,gBAAMzB,IAAYF,EAAQ,QAAQ,aAAa;AAC/C,UAAAA,EAAQ,UAAU,OAAO,SAAS,CAAC2B,CAAO,GAC1C3B,EAAQ,UAAU,OAAO,WAAW2B,CAAO;AAE3C,gBAAMC,IADa5B,EAAQ,aAAa,aAAa,MACnB,UAAUE,EAAU,cAAc,0BAA0B,IAAIA,EAAU,cAAc,gCAAgC,GACpJ2B,IAAgB,EAAQD,GACxBE,IAAe9B,EAAQ,UAAU,SAAS,SAAS,GACnD+B,IAAa/B,EAAQ,UAAU,SAAS,OAAO,GAC/CgC,IAAoBJ,KAAA,gBAAAA,EAAY,UAAU,SAAS,YACnDK,IAAkBL,KAAA,gBAAAA,EAAY,UAAU,SAAS;AACvD,UAAIC,IACEG,KAAqB,CAACC,KAAmBH,KAC3C5B,EAAU,UAAU,OAAO,OAAO,GAClCA,EAAU,UAAU,IAAI,SAAS,MACxB+B,KAAmBF,OAC5B7B,EAAU,UAAU,OAAO,SAAS,GACpCA,EAAU,UAAU,IAAI,OAAO,KAG7B4B,KACF5B,EAAU,UAAU,OAAO,OAAO,GAClCA,EAAU,UAAU,IAAI,SAAS,MAEjCA,EAAU,UAAU,IAAI,OAAO,GAC/BA,EAAU,UAAU,OAAO,SAAS;AAAA,QAGzC;AACD,gBAAQD,GAAU;AAAA,UAChB,KAAK;AACH,kBAAMiC,IAAahC,EAAU,cAAc,aAAa;AACxD,YAAIqB,EAAU,cAAcF,EAAK,CAAE,KACjCK,EAAkB1B,GAAS,EAAI,GAC3BkC,KAAcA,EAAW,UAAU,SAAS,SAAS,MACvDhC,EAAU,UAAU,OAAO,OAAO,GAClCA,EAAU,UAAU,IAAI,SAAS,OAGnCwB,EAAkB1B,GAAS,EAAK,GAChCD,IAAiBC,EAAQ,QAAQ,aAAa,EAAE,cAAc,kBAAkB,GAChFD,EAAe,aAAa,cAAc3B,EAAUwB,EAAQ,MAAM,EAAE,MAAM,GAC1Ee,EAAY,UAAU,cAAcT,EAAU,UAAU,GACxDS,EAAY,UAAU,UAAU3B,EAAG,cAAc;AAEnD;AAAA,UACF,KAAK;AACH,YACEuC,EAAU,iBAAiBF,KAAS;AAAA,cAClC,WAAW;AAAA,cACX,cAAc;AAAA,cACd,cAAc;AAAA,cACd,YAAY;AAAA,cACZ,YAAY;AAAA,YAC5B,CAAe,IAEDK,EAAkB1B,GAAS,EAAI,KAE/B0B,EAAkB1B,GAAS,EAAK,GAChCD,IAAiBC,EAAQ,QAAQ,aAAa,EAAE,cAAc,kBAAkB,GAChFD,EAAe,aAAa,cAAc3B,EAAUwB,EAAQ,MAAM,EAAE,MAAM,GAC1Ee,EAAY,UAAU,cAAcT,EAAU,UAAU,GACxDS,EAAY,UAAU,UAAU3B,EAAG,cAAc;AAEnD;AAAA,UACF,KAAK;AACH,YAAIuC,EAAU,QAAQF,EAAK,CAAE,IAC3BK,EAAkB1B,GAAS,EAAI,KAE/B0B,EAAkB1B,GAAS,EAAK,GAChCD,IAAiBC,EAAQ,QAAQ,aAAa,EAAE,cAAc,kBAAkB,GAChFD,EAAe,aAAa,cAAc3B,EAAUwB,EAAQ,MAAM,EAAE,MAAM,GAC1Ee,EAAY,UAAU,cAAcT,EAAU,UAAU,GACxDS,EAAY,UAAU,UAAU3B,EAAG,cAAc;AAEnD;AAAA,UACF,KAAK;AAEH,YADoBuC,EAAU,UAAUF,EAAK,GAAI,EAAE,YAAY,IAAM,KAAKE,EAAU,SAASF,EAAK,GAAI,EAAE,KAAK,GAAG,KAAK,EAAC,CAAE,IAEtHK,EAAkB1B,GAAS,EAAI,KAE/B0B,EAAkB1B,GAAS,EAAK,GAChCD,IAAiBC,EAAQ,QAAQ,aAAa,EAAE,cAAc,kBAAkB,GAChFD,EAAe,aAAa,cAAc3B,EAAUwB,EAAQ,MAAM,EAAE,MAAM,GAC1Ee,EAAY,UAAU,cAAcT,EAAU,UAAU,GACxDS,EAAY,UAAU,UAAU3B,EAAG,cAAc;AAEnD;AAAA,UACF,KAAK;AAAA,UACL;AACE,YAAA0C,EAAkB1B,GAAS,EAAI;AAC/B;AAAA,QACH;AAAA,MACF;AAED,MAAIhB,EAAG,kBACLkC;IAEH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAID,SAAS;AACP,UAAMlC,IAAK;AACX,IAAIA,EAAG,QAAQ,UACbA,EAAG,OAAM,GAEXA,EAAG,QAAQ,cAAcA,EAAG,WAAW;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAID,QAAQ;AACN,UAAMA,IAAK,MACL,EAAE,UAAAmD,GAAU,aAAAC,GAAa,aAAAC,GAAa,eAAAC,GAAe,aAAAC,EAAa,IAAGvD;AAC3E,KAAC,GAAGA,EAAG,QAAQ,EAAE,QAAQ,CAAArD,MAAM;;AAC7B,YAAMuE,IAAYvE,EAAG,QAAQ,aAAa;AAC1C,MAAAuE,EAAU,UAAU,OAAO,SAAS,GACpCA,EAAU,UAAU,OAAO,OAAO,GAClCvE,EAAG,UAAU,OAAO,SAAS,GAC7BA,EAAG,UAAU,OAAO,OAAO,IAC3BO,IAAAP,EAAG,QAAQ,YAAY,EAAE,cAAc,aAAa,MAApD,QAAAO,EAAuD,UACnD8C,EAAG,mBACLA,EAAG,eAAe,cAAc;AAAA,IAExC,CAAK,GACD,CAAC,GAAGmD,CAAQ,EAAE,QAAQ,CAAAK,MAAS;AAC7B,MAAAA,EAAM,QAAQ;AAAA,IACpB,CAAK,GACD,CAAC,GAAGJ,CAAW,EAAE,QAAQ,CAAAK,MAAY;AACnC,MAAAA,EAAS,QAAQ;AAAA,IACvB,CAAK,GACD,CAAC,GAAGJ,CAAW,EAAE,QAAQ,CAAAK,MAAY;AACnC,MAAAA,EAAS,UAAU;AAAA,IACzB,CAAK,GACD,CAAC,GAAGJ,CAAa,EAAE,QAAQ,CAAAE,MAAS;AAClC,UAAIG,IAAcH,EAAM,aAAa,cAAc;AACnD,YAAMI,IAAWD,EAAY,cAAc,YAAY;AACvD,MAAAC,EAAS,UAAU,OAAO,WAAW,GACrCA,EAAS,cAAcD;AAAA,IAC7B,CAAK,GACD,CAAC,GAAGJ,CAAW,EAAE,QAAQ,CAAAM,MAAY;AACnC,MAAAA,EAAS,aAAa,YAAY,EAAE,GAChCA,EAAS,aAAa,kBAAkB,KACvB,CAAC,GAAGA,EAAS,aAAa,kBAAkB,EAAE,MAAM,GAAG,CAAC,EAChE,QAAQ,CAAAC,MAAY;AAC7B,iBAAS,cAAcA,CAAQ,EAAE,UAAU,OAAO,UAAU;AAAA,MACtE,CAAS;AAAA,IAET,CAAK,GACD9D,EAAG,QAAQ,QAAQA,EAAG,SAAQ;AAAA,EAC/B;AACH;AA7gBER,IAAA,eAAAU,IAAO,WAAG;AACR,QAAMF,IAAK,MACL,EAAE,YAAA+D,GAAY,YAAAC,GAAY,SAAAC,GAAS,UAAAC,EAAU,IAAGlE,EAAG;AAKzD,WAASmE,IAAoB;AAE3B,IAAAJ,EAAW,QAAQ,CAAAvD,MAAQ;AACzB,MAAA4D,EAAU5D,EAAK,IAAIA,EAAK,OAAO;AAAA,IACvC,CAAO,GAEDwD,EAAW,QAAQ,CAAAxD,MAAQ;AACzB,MAAA4D,EAAU5D,EAAK,IAAIA,EAAK,OAAO;AAAA,IACvC,CAAO;AAAA,EACF;AAKD,WAAS6D,IAAgB;AACvB,UAAMC,IAAW,SAAS,cAAcL,CAAO,GACzCM,IAAY,SAAS,cAAcL,CAAQ;AACjD,IAAAI,KAAA,QAAAA,EAAU,iBAAiB,SAAS,WAAY;AAC9C,MAAAtE,EAAG,MAAK;AAAA,IAChB,IACMuE,KAAA,QAAAA,EAAW,iBAAiB,SAAS,WAAY;AAC/C,MAAAvE,EAAG,OAAM;AAAA,IACjB;AAAA,EACK;AAED,WAASwE,EAAW5E,GAAQ;;AAC1B,UAAMsB,IAAYtB,EAAO,QAAQ,aAAa;AAC9C,QAAIA,EAAO,MAAM,UAAU;AAAG;AAC9B,UAAM6E,IAAiB7E,EAAO,QAAQ,YAAY,EAAE,cAAc,mBAAmB;AACjE,IAAA6E,EAAe,aAAa,cAAc;AAC9D,UAAMb,IAAWa,EAAe,cAAc,YAAY,GACpDC,IAAY,OAAO9E,EAAO,aAAa,YAAY,CAAC,GACpD+E,IAAO/E,EAAO,MAAM,CAAC,GACrBgF,IAAWD,EAAK,OAAO,OAAO,MAC9BE,IAAeF,EAAK,MACpBG,IAAgBlF,EAAO,UAAU,EAAI;AAC3C,IAAIgF,IAAWF,KAEbxD,EAAU,UAAU,IAAI,OAAO,GAC/BA,EAAU,UAAU,OAAO,SAAS,GACpC4D,EAAc,QAAQ,OAGtB5D,EAAU,UAAU,OAAO,OAAO,GAClCA,EAAU,UAAU,IAAI,SAAS,IAEnC0C,EAAS,cAAciB,GACvBC,EAAc,gBAAgB,kCAAkC,IAChE5H,IAAAuH,EAAe,cAAc,oBAAoB,MAAjD,QAAAvH,EAAoD,UACpDuH,EAAe,OAAOK,CAAa;AAAA,EACpC;AAKD,WAASC,IAAiB;AACxB,aAASC,EAAcC,GAAO;AAC5B,YAAM,EAAE,QAAArF,EAAQ,IAAGqF;AACnB,UAAIC,GAAWC;AACf,MAAIvF,EAAO,QAAQ,mCAAmC,MACpDI,EAAG,QAAQ,QAAQA,EAAG,SAAQ,GAC9BkF,IAAYtF,EAAO,QAAQ,aAAa,EAAE,aAAa,YAAY,GACnEuF,IAAW;AAAA,QACT,CAACD,CAAS,GAAGlF,EAAG,QAAQ,MAAMkF,CAAS;AAAA,MACnD,GACclF,EAAG,QAAQ,UAAQA,EAAG,OAAOmF,CAAQ,IAEvCvF,EAAO,QAAQ,eAAe,MAChC4E,EAAW5E,CAAM,GACjBI,EAAG,QAAQ,QAAQA,EAAG,SAAQ,GAC9BkF,IAAYtF,EAAO,aAAa,YAAY,GAC5CuF,IAAW;AAAA,QACT,CAACD,CAAS,GAAGlF,EAAG,QAAQ,MAAMkF,CAAS;AAAA,MACnD,GACclF,EAAG,QAAQ,UAAQA,EAAG,OAAOmF,CAAQ;AAAA,IAE5C;AAED,IAAAnF,EAAG,QAAQ;AAAA,MACT;AAAA,MACAoF,EAAS,SAAUlH,GAAG;AACpB,cAAM,EAAE,QAAA0B,EAAQ,IAAG1B;AACnB,YAAI0B,EAAO,QAAQ,0EAA0E,GAAG;AAG9F,cAFAI,EAAG,QAAQ,QAAQA,EAAG,SAAQ,GAE1B,CAACJ,EAAO,QAAQ,aAAa,EAAE,UAAU,SAAS,UAAU,KAAKA,EAAO,aAAa,aAAa,GAAG;AACvG,YAAI2C,EAAU,QAAQ3C,EAAO,KAAK,MAChCA,EAAO,UAAU,OAAO,OAAO,GAC/BA,EAAO,UAAU,OAAO,SAAS,GACjCA,EAAO,QAAQ,aAAa,EAAE,UAAU,OAAO,OAAO;AAExD;AAAA,UACD;AACD,gBAAMsF,IAAYtF,EAAO,aAAa,YAAY,GAC5CuF,IAAW;AAAA,YACf,CAACD,CAAS,GAAGlF,EAAG,QAAQ,MAAMkF,CAAS;AAAA,UACrD;AACY,UAAIlF,EAAG,QAAQ,UAAQA,EAAG,OAAOmF,CAAQ;AAAA,QAC1C;AAAA,MACX,CAAS;AAAA,IACT,GACMnF,EAAG,YAAY,QAAQ,CAAA0D,MAAY;AACjC,MAAAA,EAAS,iBAAiB,UAAUsB,CAAa;AAAA,IACzD,CAAO,GACDhF,EAAG,SAAS,QAAQ,CAAAqF,MAAS;AAC3B,MAAAA,EAAM,iBAAiB,UAAUL,CAAa;AAAA,IACtD,CAAO,GACDhF,EAAG,YAAY,QAAQ,CAAA6D,MAAY;AACjC,MAAAA,EAAS,GAAG,UAAU,WAAY;AAChC,cAAMqB,IAAY,KAAK,aAAa,YAAY;AAChD,QAAAlF,EAAG,QAAQ,QAAQA,EAAG,SAAQ;AAC9B,cAAMsF,IAAMtF,EAAG,QAAQ,MAAMkF,CAAS,GAChC7C,IAAQ,OAAOiD,KAAQ,YAAY,CAAC,MAAM,QAAQA,CAAG,IAAIA,EAAI,QAAQA,GACrEH,IAAW;AAAA,UACf,CAACD,CAAS,GAAGI;AAAA,QACzB;AACU,SAAK,MAAM,QAAQjD,CAAK,KAAKA,EAAM,SAAS,KAAO,CAAC,MAAM,QAAQA,CAAK,KAAK,CAACE,EAAU,QAAQF,CAAK,MAC9FrC,EAAG,QAAQ,UAAQA,EAAG,OAAOmF,CAAQ;AAAA,MAErD,CAAS;AAAA,IACT,CAAO;AAAA,EACF;AACD,EAAAhB,KACAE,KACAU;AACD;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@xwadex/fesd",
3
3
  "private": false,
4
- "version": "0.0.19",
4
+ "version": "0.0.21",
5
5
  "main": "./dist/fesd-bundle.js",
6
6
  "type": "module",
7
7
  "scripts": {