@elcrm/form 0.0.85 → 0.0.87

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.
@@ -6,16 +6,16 @@ import { isEmptyTextLike as a } from "./visibility.js";
6
6
  import o from "react";
7
7
  import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
8
8
  //#region src/lib/fields/Numeric.tsx
9
- function u({ value: u, form: d, onValue: f, name: p = "", placeholder: m = "", label: h = "", hidden: g = !1, disabled: _ = !1, onBlur: v, className: y = "", after: b = "", before: x = "", error: S = "", inputmode: C = "numeric", maxLength: w, max: T, view: E }) {
10
- let D = !_, { value: O, version: k } = n(d, p, u);
11
- m = m === void 0 ? "" : m, T = T === void 0 ? 99 : T;
12
- let A = O != null && O !== "" ? String(O) : "", j = o.useRef(null), M = o.useRef(!1);
9
+ function u({ value: u, form: d, onValue: f, name: p = "", placeholder: m = "", label: h = "", hidden: g = !1, disabled: _ = !1, onBlur: v, className: y = "", after: b = "", before: x = "", error: S = "", size: C = "md", inputmode: w = "numeric", maxLength: T, max: E, view: D }) {
10
+ let O = !_, { value: k, version: A } = n(d, p, u);
11
+ m = m === void 0 ? "" : m, E = E === void 0 ? 99 : E;
12
+ let j = k != null && k !== "" ? String(k) : "", M = o.useRef(null), N = o.useRef(!1);
13
13
  o.useLayoutEffect(() => {
14
- if (M.current) return;
15
- let e = j.current;
16
- e && e.textContent !== A && (e.textContent = A);
17
- }, [A, k]);
18
- let N = w ?? T, P = !1, F = (e, t) => {
14
+ if (N.current) return;
15
+ let e = M.current;
16
+ e && e.textContent !== j && (e.textContent = j);
17
+ }, [j, A]);
18
+ let P = T ?? E, F = !1, I = (e, t) => {
19
19
  e.textContent !== t && (e.textContent = t, queueMicrotask(() => {
20
20
  let n = e.firstChild;
21
21
  if (n && n.nodeType === Node.TEXT_NODE) {
@@ -23,50 +23,51 @@ function u({ value: u, form: d, onValue: f, name: p = "", placeholder: m = "", l
23
23
  i.setStart(n, e), i.collapse(!0), r?.removeAllRanges(), r?.addRange(i);
24
24
  } else t || (e.innerHTML = "<br>");
25
25
  }));
26
- }, I = (e) => {
26
+ }, L = (e) => {
27
27
  let t = e.currentTarget, n = (t.textContent || "").replace(/\D/g, "");
28
- N > 0 && n.length > N && (n = n.slice(0, N)), F(t, n);
28
+ P > 0 && n.length > P && (n = n.slice(0, P)), I(t, n);
29
29
  let r = {
30
30
  value: n,
31
31
  name: p
32
32
  };
33
33
  d && p && d.onValue(r), f && f !== d?.onValue && f(r);
34
- }, L = (e) => {
35
- M.current = !0;
34
+ }, R = (e) => {
35
+ N.current = !0;
36
36
  let t = e.currentTarget;
37
37
  t.textContent = (t.textContent || "").replace(/\D/g, ""), r.Focus({ target: e.currentTarget });
38
- }, R = (e) => {
39
- if (P && e.which === 86) return;
40
- if (e.which === 17 || e.which === 91) return P = !0;
38
+ }, z = (e) => {
39
+ if (F && e.which === 86) return;
40
+ if (e.which === 17 || e.which === 91) return F = !0;
41
41
  if (e.key === "Backspace") return;
42
42
  let t = (e.currentTarget.textContent ?? "").replace(/\D/g, "").length;
43
- N > 0 && t >= N && e.key.length === 1 && /\d/.test(e.key) && e.preventDefault(), e.key === "Enter" && e.preventDefault(), e.key.length === 1 && !/\d/.test(e.key) && !e.metaKey && !e.ctrlKey && e.preventDefault();
44
- }, z = (e) => {
45
- if (e.which === 17 || e.which === 91) return P = !1;
43
+ P > 0 && t >= P && e.key.length === 1 && /\d/.test(e.key) && e.preventDefault(), e.key === "Enter" && e.preventDefault(), e.key.length === 1 && !/\d/.test(e.key) && !e.metaKey && !e.ctrlKey && e.preventDefault();
46
44
  }, B = (e) => {
47
- r.PasteDigits(N, i(e)), queueMicrotask(() => {
48
- let e = j.current;
45
+ if (e.which === 17 || e.which === 91) return F = !1;
46
+ }, V = (e) => {
47
+ r.PasteDigits(P, i(e)), queueMicrotask(() => {
48
+ let e = M.current;
49
49
  if (!e) return;
50
50
  let t = (e.textContent || "").replace(/\D/g, "");
51
- N > 0 && t.length > N && (t = t.slice(0, N)), F(e, t), d && p && d.onValue({
51
+ P > 0 && t.length > P && (t = t.slice(0, P)), I(e, t), d && p && d.onValue({
52
52
  value: t,
53
53
  name: p
54
54
  });
55
55
  });
56
- }, V = (e) => {
57
- e.preventDefault();
58
56
  }, H = (e) => {
57
+ e.preventDefault();
58
+ }, U = (e) => {
59
59
  r.Blur(e);
60
60
  let t = (e.currentTarget.textContent || "").replace(/\D/g, "");
61
61
  e.currentTarget.textContent !== t && (e.currentTarget.textContent = t), v?.({
62
62
  value: t,
63
63
  name: p
64
- }), M.current = !1;
65
- }, U = {};
66
- return D && (U.edit = ""), U.inputMode = C ?? "numeric", m && (U.placeholder = m), g && a(O) ? /* @__PURE__ */ c(s, {}) : /* @__PURE__ */ l(t, {
64
+ }), N.current = !1;
65
+ }, W = {};
66
+ return O && (W.edit = ""), W.inputMode = w ?? "numeric", m && (W.placeholder = m), g && a(k) ? /* @__PURE__ */ c(s, {}) : /* @__PURE__ */ l(t, {
67
67
  type: "numeric",
68
68
  label: h,
69
69
  error: S,
70
+ size: C,
70
71
  element_blok: { className: [y || ""] },
71
72
  element_input: { className: [e.w] },
72
73
  children: [
@@ -75,22 +76,22 @@ function u({ value: u, form: d, onValue: f, name: p = "", placeholder: m = "", l
75
76
  children: x
76
77
  }) : null,
77
78
  /* @__PURE__ */ c("div", {
78
- ref: j,
79
- onPaste: B,
80
- onDrop: V,
79
+ ref: M,
80
+ onPaste: V,
81
+ onDrop: H,
81
82
  onDragOver: (e) => e.preventDefault(),
82
- onInput: I,
83
- onFocus: L,
84
- onBlur: H,
85
- onKeyDown: R,
86
- onKeyUp: z,
83
+ onInput: L,
84
+ onFocus: R,
85
+ onBlur: U,
86
+ onKeyDown: z,
87
+ onKeyUp: B,
87
88
  spellCheck: !1,
88
89
  role: "textbox",
89
- tabIndex: D ? 0 : -1,
90
+ tabIndex: O ? 0 : -1,
90
91
  "aria-label": h || m || "Число",
91
- contentEditable: D ? "plaintext-only" : !1,
92
+ contentEditable: O ? "plaintext-only" : !1,
92
93
  suppressContentEditableWarning: !0,
93
- ...U
94
+ ...W
94
95
  }),
95
96
  b ? /* @__PURE__ */ c("span", {
96
97
  className: e.affix,
@@ -14,7 +14,7 @@ export type TSelect = TInput & {
14
14
  options?: SelectOptions;
15
15
  order?: number[];
16
16
  };
17
- declare function SelectField({ value, form, onValue, name, placeholder, label, error, hidden, disabled, className, after, before, options, order, }: TSelect): import("react/jsx-runtime").JSX.Element | "";
17
+ declare function SelectField({ value, form, onValue, name, placeholder, label, error, hidden, disabled, className, after, before, options, order, size, }: TSelect): import("react/jsx-runtime").JSX.Element | "";
18
18
  declare namespace SelectField {
19
19
  var displayName: string;
20
20
  }
@@ -7,9 +7,9 @@ import o, { useEffect as s, useState as c } from "react";
7
7
  import { Fragment as l, jsx as u, jsxs as d } from "react/jsx-runtime";
8
8
  import { createPortal as f } from "react-dom";
9
9
  //#region src/lib/fields/Select.tsx
10
- function p({ value: r = 0, form: i, onValue: s, name: c = "", placeholder: p = "", label: h, error: g, hidden: _ = !1, disabled: v = !1, className: y, after: b = "", before: x = "", options: S, order: C }) {
11
- let [w, T] = o.useState(!1), [E, D] = o.useState(0), [O, k] = o.useState(null), A = o.useId(), { value: j } = n(i, c, r ?? 0), M = Number(j), N = [];
12
- S && (N = Array.isArray(S) ? S.map((e) => ({
10
+ function p({ value: r = 0, form: i, onValue: s, name: c = "", placeholder: p = "", label: h, error: g, hidden: _ = !1, disabled: v = !1, className: y, after: b = "", before: x = "", options: S, order: C, size: w = "md" }) {
11
+ let [T, E] = o.useState(!1), [D, O] = o.useState(0), [k, A] = o.useState(null), j = o.useId(), { value: M } = n(i, c, r ?? 0), N = Number(M), P = [];
12
+ S && (P = Array.isArray(S) ? S.map((e) => ({
13
13
  id: e.id ?? e.i ?? 0,
14
14
  label: e.n || "",
15
15
  hidden: e.s === 0
@@ -21,67 +21,68 @@ function p({ value: r = 0, form: i, onValue: s, name: c = "", placeholder: p = "
21
21
  hidden: n?.s === 0
22
22
  };
23
23
  }).filter((e) => e.label.length > 0));
24
- let P = (() => {
25
- if (!C || C.length === 0) return N;
26
- let e = new Map(N.map((e) => [e.id, e]));
24
+ let F = (() => {
25
+ if (!C || C.length === 0) return P;
26
+ let e = new Map(P.map((e) => [e.id, e]));
27
27
  return C.map((t) => e.get(t)).filter((e) => !!e);
28
- })().filter((e) => !e.hidden), F = (e) => P.find((t) => t.id === e)?.label, I = w && P.length > 0 ? `${A}-opt-${E}` : void 0, L = (e) => {
28
+ })().filter((e) => !e.hidden), I = (e) => F.find((t) => t.id === e)?.label, L = T && F.length > 0 ? `${j}-opt-${D}` : void 0, R = (e) => {
29
29
  let t = {
30
30
  value: e,
31
31
  name: c
32
32
  };
33
33
  i && c && i.onValue(t), s && s !== i?.onValue && s(t);
34
- }, R = (e) => {
35
- if (P.length === 0 || v) return;
36
- let t = P.findIndex((e) => e.id === M);
37
- k(e.getBoundingClientRect()), D(t >= 0 ? t : 0), T(!0);
38
34
  }, z = (e) => {
39
- R(e.currentTarget);
35
+ if (F.length === 0 || v) return;
36
+ let t = F.findIndex((e) => e.id === N);
37
+ A(e.getBoundingClientRect()), O(t >= 0 ? t : 0), E(!0);
40
38
  }, B = (e) => {
41
- if (!v && P.length !== 0) {
42
- if (!w && (e.key === "ArrowDown" || e.key === "Enter" || e.key === " ")) {
43
- e.preventDefault(), R(e.currentTarget);
39
+ z(e.currentTarget);
40
+ }, V = (e) => {
41
+ if (!v && F.length !== 0) {
42
+ if (!T && (e.key === "ArrowDown" || e.key === "Enter" || e.key === " ")) {
43
+ e.preventDefault(), z(e.currentTarget);
44
44
  return;
45
45
  }
46
- if (w) {
46
+ if (T) {
47
47
  if (e.key === "Escape") {
48
- e.preventDefault(), T(!1);
48
+ e.preventDefault(), E(!1);
49
49
  return;
50
50
  }
51
51
  if (e.key === "ArrowDown") {
52
- e.preventDefault(), D((e) => (e + 1) % P.length);
52
+ e.preventDefault(), O((e) => (e + 1) % F.length);
53
53
  return;
54
54
  }
55
55
  if (e.key === "ArrowUp") {
56
- e.preventDefault(), D((e) => e - 1 < 0 ? P.length - 1 : e - 1);
56
+ e.preventDefault(), O((e) => e - 1 < 0 ? F.length - 1 : e - 1);
57
57
  return;
58
58
  }
59
59
  if (e.key === "Enter") {
60
60
  e.preventDefault();
61
- let t = P[E];
62
- t && L(t.id), T(!1);
61
+ let t = F[D];
62
+ t && R(t.id), E(!1);
63
63
  }
64
64
  }
65
65
  }
66
- }, V = {};
67
- p && (V.placeholder = p);
68
- let H = F(M), U = (H === void 0 || H === "") && !!p, W = M === 0 || F(M) === void 0;
69
- return _ && W ? "" : /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ d(t, {
66
+ }, H = {};
67
+ p && (H.placeholder = p);
68
+ let U = I(N), W = (U === void 0 || U === "") && !!p, G = N === 0 || I(N) === void 0;
69
+ return _ && G ? "" : /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ d(t, {
70
70
  type: "select",
71
71
  label: h,
72
72
  element_blok: { className: [y || ""] },
73
73
  error: g,
74
+ size: w,
74
75
  element_input: {
75
76
  className: [a.f],
76
77
  props: {
77
- onClick: z,
78
- onKeyDown: B,
78
+ onClick: B,
79
+ onKeyDown: V,
79
80
  tabIndex: v ? -1 : 0,
80
81
  role: "combobox",
81
- "aria-expanded": w,
82
+ "aria-expanded": T,
82
83
  "aria-haspopup": "listbox",
83
- "aria-controls": A,
84
- ...I ? { "aria-activedescendant": I } : {},
84
+ "aria-controls": j,
85
+ ...L ? { "aria-activedescendant": L } : {},
85
86
  "aria-disabled": v,
86
87
  "data-disabled": v
87
88
  }
@@ -92,24 +93,24 @@ function p({ value: r = 0, form: i, onValue: s, name: c = "", placeholder: p = "
92
93
  children: x
93
94
  }) : null,
94
95
  /* @__PURE__ */ u("div", {
95
- ...V,
96
- className: U ? a.placeholderValue : void 0,
97
- children: H ?? p ?? ""
96
+ ...H,
97
+ className: W ? a.placeholderValue : void 0,
98
+ children: U ?? p ?? ""
98
99
  }),
99
100
  b ? /* @__PURE__ */ u("span", {
100
101
  className: e.affix,
101
102
  children: b
102
103
  }) : null
103
104
  ]
104
- }), w && f(/* @__PURE__ */ u(m, {
105
- parent: O || void 0,
106
- onValue: L,
105
+ }), T && f(/* @__PURE__ */ u(m, {
106
+ parent: k || void 0,
107
+ onValue: R,
107
108
  className: y,
108
- items: P,
109
- setOpen: T,
110
- listId: A,
111
- activeIndex: E,
112
- currentValue: M
109
+ items: F,
110
+ setOpen: E,
111
+ listId: j,
112
+ activeIndex: D,
113
+ currentValue: N
113
114
  }), document.body)] });
114
115
  }
115
116
  p.displayName = "SelectField";
@@ -1,6 +1,6 @@
1
1
  import { TInput } from './type';
2
2
  /** TextareaField — многострочное поле (contentEditable). */
3
- declare function TextareaField({ value, form, onValue, name, placeholder, label, hidden, disabled, onBlur: onBlurField, className, after, before, error, inputmode, maxLength, spellCheck, }: TInput): import("react/jsx-runtime").JSX.Element;
3
+ declare function TextareaField({ value, form, onValue, name, placeholder, label, hidden, disabled, onBlur: onBlurField, className, after, before, error, size, inputmode, maxLength, spellCheck, }: TInput): import("react/jsx-runtime").JSX.Element;
4
4
  declare namespace TextareaField {
5
5
  var displayName: string;
6
6
  }
@@ -6,29 +6,30 @@ import { isEmptyTextLike as a } from "./visibility.js";
6
6
  import o from "react";
7
7
  import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
8
8
  //#region src/lib/fields/Textarea.tsx
9
- function u({ value: u, form: d, onValue: f, name: p = "", placeholder: m = "", label: h = "", hidden: g = !1, disabled: _ = !1, onBlur: v, className: y = "", after: b = "", before: x = "", error: S = "", inputmode: C = "text", maxLength: w, spellCheck: T = !0 }) {
10
- let { value: E, version: D } = n(d, p || "", u), O = !_, k = String(E ?? ""), A = o.useRef(null), j = o.useRef(!1);
9
+ function u({ value: u, form: d, onValue: f, name: p = "", placeholder: m = "", label: h = "", hidden: g = !1, disabled: _ = !1, onBlur: v, className: y = "", after: b = "", before: x = "", error: S = "", size: C = "md", inputmode: w = "text", maxLength: T, spellCheck: E = !0 }) {
10
+ let { value: D, version: O } = n(d, p || "", u), k = !_, A = String(D ?? ""), j = o.useRef(null), M = o.useRef(!1);
11
11
  o.useLayoutEffect(() => {
12
- if (j.current) return;
13
- let e = A.current;
14
- e && e.innerText !== k && (e.innerText = k);
15
- }, [k, D]);
16
- let M = (e) => {
12
+ if (M.current) return;
13
+ let e = j.current;
14
+ e && e.innerText !== A && (e.innerText = A);
15
+ }, [A, O]);
16
+ let N = (e) => {
17
17
  let t = {
18
18
  value: e.currentTarget.innerText,
19
19
  name: p || ""
20
20
  };
21
21
  d && p && d.onValue(t), f && f !== d?.onValue && f(t);
22
- }, N = (e) => {
22
+ }, P = (e) => {
23
23
  let t = (e.currentTarget.textContent ?? "").trim();
24
- w && t.length >= w && e.key !== "Backspace" && e.preventDefault(), e.key === "Enter" && !e.shiftKey && e.preventDefault();
25
- }, P = (e) => r.Paste(w || 0, i(e));
26
- if (g && a(E)) return /* @__PURE__ */ c(s, {});
27
- let F = {};
28
- return m && (F.placeholder = m), O && (F.edit = ""), F.inputMode = C || "text", /* @__PURE__ */ l(t, {
24
+ T && t.length >= T && e.key !== "Backspace" && e.preventDefault(), e.key === "Enter" && !e.shiftKey && e.preventDefault();
25
+ }, F = (e) => r.Paste(T || 0, i(e));
26
+ if (g && a(D)) return /* @__PURE__ */ c(s, {});
27
+ let I = {};
28
+ return m && (I.placeholder = m), k && (I.edit = ""), I.inputMode = w || "text", /* @__PURE__ */ l(t, {
29
29
  type: "note",
30
30
  label: h,
31
31
  error: S,
32
+ size: C,
32
33
  element_blok: { className: [y || ""] },
33
34
  element_input: { className: [e.n] },
34
35
  children: [
@@ -37,23 +38,23 @@ function u({ value: u, form: d, onValue: f, name: p = "", placeholder: m = "", l
37
38
  children: x
38
39
  }) : null,
39
40
  /* @__PURE__ */ c("div", {
40
- ref: A,
41
- onPaste: P,
42
- onInput: M,
41
+ ref: j,
42
+ onPaste: F,
43
+ onInput: N,
43
44
  onFocus: () => {
44
- j.current = !0;
45
+ M.current = !0;
45
46
  },
46
47
  onBlur: (e) => {
47
48
  r.Blur(e), v?.({
48
49
  value: (e.currentTarget.textContent ?? "").trim(),
49
50
  name: p || ""
50
- }), j.current = !1;
51
+ }), M.current = !1;
51
52
  },
52
- onKeyDown: N,
53
- spellCheck: T,
54
- contentEditable: O ? "plaintext-only" : !1,
53
+ onKeyDown: P,
54
+ spellCheck: E,
55
+ contentEditable: k ? "plaintext-only" : !1,
55
56
  suppressContentEditableWarning: !0,
56
- ...F
57
+ ...I
57
58
  }),
58
59
  b ? /* @__PURE__ */ c("span", {
59
60
  className: e.affix,
@@ -27,6 +27,11 @@ export type TFieldPresentation = {
27
27
  view?: string;
28
28
  id?: string;
29
29
  className?: string;
30
+ /**
31
+ * Плотность поля: `md` — формы/модалки (по умолчанию),
32
+ * `sm` — тулбары и плотные модалки.
33
+ */
34
+ size?: "sm" | "md";
30
35
  isCopy?: boolean;
31
36
  maxLength?: number;
32
37
  /**
package/dist/index.d.ts CHANGED
@@ -32,6 +32,7 @@ export { default as HiddenField } from './fields/Hidden';
32
32
  export { default as DisplayField } from './fields/Display';
33
33
  export { ReadonlyField } from './fields/Display';
34
34
  export { useForm, useFormField, useFormFieldState } from './hooks/use';
35
+ export type TFieldSize = "sm" | "md";
35
36
  export type { TInput, TValue, TPasswordField, TFieldFormBindings, TFieldPresentation, } from './fields/type';
36
37
  export type { TRange, TProgress } from './fields/Range';
37
38
  export type { TTime } from './fields/Time';
@@ -56,3 +57,6 @@ export { Form } from './Form';
56
57
  export type { FormInitProps, TModalOpenPayload } from './Form';
57
58
  export { useFormInit } from './FormInitContext';
58
59
  export type { FormInitContextValue } from './FormInitContext';
60
+ /** Общий стек z-index оверлеев (globalThis.elcrm.overlayZ) */
61
+ export { acquireOverlayZIndex, releaseOverlayZIndex, peekOverlayZIndex, } from './overlayZ';
62
+ export type { TCheckSize, TCheckVariant } from './fields/Check';