@elcrm/form 0.0.62 → 0.0.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/README.md +113 -0
  2. package/dist/Form.d.ts +20 -0
  3. package/dist/Form.js +11 -0
  4. package/dist/FormInitContext.d.ts +25 -0
  5. package/dist/FormInitContext.js +20 -0
  6. package/dist/assets/styles/Field.module.css +1 -0
  7. package/dist/assets/styles/Form.module.css +1 -0
  8. package/dist/assets/styles/Select.module.css +1 -0
  9. package/dist/core/Field.d.ts +18 -0
  10. package/dist/core/Field.js +33 -0
  11. package/dist/events/onEvent.d.ts +55 -0
  12. package/dist/events/onEvent.js +67 -0
  13. package/dist/{src/lib/fields → fields}/Date.d.ts +7 -3
  14. package/dist/fields/Date.js +345 -0
  15. package/dist/{src/lib/fields → fields}/Input.d.ts +2 -2
  16. package/dist/fields/Input.js +55 -0
  17. package/dist/fields/Mask.d.ts +9 -0
  18. package/dist/fields/Mask.js +95 -0
  19. package/dist/fields/Modal.d.ts +25 -0
  20. package/dist/fields/Modal.js +55 -0
  21. package/dist/fields/Money.d.ts +35 -0
  22. package/dist/fields/Money.js +93 -0
  23. package/dist/fields/Numeric.d.ts +9 -0
  24. package/dist/fields/Numeric.js +69 -0
  25. package/dist/fields/Options.d.ts +30 -0
  26. package/dist/fields/Options.js +63 -0
  27. package/dist/fields/Password.d.ts +6 -0
  28. package/dist/fields/Password.js +100 -0
  29. package/dist/{src/lib/fields → fields}/Phone.d.ts +5 -1
  30. package/dist/fields/Phone.js +109 -0
  31. package/dist/fields/Range.d.ts +16 -0
  32. package/dist/fields/Range.js +101 -0
  33. package/dist/fields/Select.d.ts +21 -0
  34. package/dist/fields/Select.js +143 -0
  35. package/dist/{src/lib/fields → fields}/Textarea.d.ts +5 -1
  36. package/dist/fields/Textarea.js +47 -0
  37. package/dist/fields/Time.d.ts +26 -0
  38. package/dist/fields/Time.js +252 -0
  39. package/dist/fields/type.d.ts +42 -0
  40. package/dist/hooks/use.d.ts +42 -0
  41. package/dist/hooks/use.js +57 -0
  42. package/dist/index.d.ts +26 -2
  43. package/dist/index.js +26 -0
  44. package/dist/index.umd.js +2 -89
  45. package/dist/mask/MaskPhone.d.ts +8 -0
  46. package/dist/mask/MaskPhone.js +1384 -0
  47. package/dist/package.js +96 -0
  48. package/dist/style.css +5 -0
  49. package/dist/styles/Field.module.js +22 -0
  50. package/dist/styles/Form.module.js +12 -0
  51. package/dist/styles/Select.module.js +8 -0
  52. package/package.json +72 -11
  53. package/src/lib/styles/Field.module.scss +315 -0
  54. package/src/lib/styles/Form.module.scss +313 -0
  55. package/src/lib/styles/Select.module.scss +90 -0
  56. package/src/lib/styles/dark.css +47 -0
  57. package/src/lib/styles/light.css +51 -0
  58. package/dist/index.css +0 -1
  59. package/dist/index.es.js +0 -5045
  60. package/dist/src/lib/Captcha.d.ts +0 -1
  61. package/dist/src/lib/Check.d.ts +0 -13
  62. package/dist/src/lib/Code.d.ts +0 -22
  63. package/dist/src/lib/Color.d.ts +0 -22
  64. package/dist/src/lib/Field.d.ts +0 -13
  65. package/dist/src/lib/Files.d.ts +0 -20
  66. package/dist/src/lib/Generator.d.ts +0 -1
  67. package/dist/src/lib/Group.d.ts +0 -21
  68. package/dist/src/lib/Image.d.ts +0 -22
  69. package/dist/src/lib/Init.d.ts +0 -1
  70. package/dist/src/lib/MaskPhone.d.ts +0 -2
  71. package/dist/src/lib/Message.d.ts +0 -15
  72. package/dist/src/lib/Money.d.ts +0 -22
  73. package/dist/src/lib/Month.d.ts +0 -18
  74. package/dist/src/lib/Palette.d.ts +0 -9
  75. package/dist/src/lib/Progress.d.ts +0 -9
  76. package/dist/src/lib/Toogle.d.ts +0 -8
  77. package/dist/src/lib/Users.d.ts +0 -1
  78. package/dist/src/lib/_Time.d.ts +0 -0
  79. package/dist/src/lib/fields/Mask.d.ts +0 -19
  80. package/dist/src/lib/fields/Modal.d.ts +0 -19
  81. package/dist/src/lib/fields/Numeric.d.ts +0 -6
  82. package/dist/src/lib/fields/Options.d.ts +0 -22
  83. package/dist/src/lib/fields/Password.d.ts +0 -23
  84. package/dist/src/lib/fields/Select copy.d.ts +0 -23
  85. package/dist/src/lib/fields/Select.d.ts +0 -28
  86. package/dist/src/lib/fields/type.d.ts +0 -30
  87. package/dist/src/lib/index.d.ts +0 -16
  88. package/dist/src/lib/onEvent.d.ts +0 -2
  89. package/dist/src/lib/use.d.ts +0 -10
@@ -0,0 +1,96 @@
1
+ var e = {
2
+ name: "@elcrm/form",
3
+ version: "0.0.64",
4
+ description: "React-компоненты полей формы и хук useForm для elCRM: текст, даты, маски, деньги, селект, связка с формой по имени поля (tree-shakeable ESM).",
5
+ type: "module",
6
+ author: "MaSkal <dev@elcrm.online>",
7
+ license: "MIT",
8
+ files: ["dist", "src/lib/styles"],
9
+ keywords: [
10
+ "elcrm",
11
+ "form",
12
+ "react"
13
+ ],
14
+ main: "./dist/index.umd.js",
15
+ module: "./dist/index.js",
16
+ types: "./dist/index.d.ts",
17
+ exports: {
18
+ ".": {
19
+ types: "./dist/index.d.ts",
20
+ import: "./dist/index.js",
21
+ require: "./dist/index.umd.js"
22
+ },
23
+ "./fields/*": {
24
+ types: "./dist/fields/*.d.ts",
25
+ import: "./dist/fields/*.js"
26
+ },
27
+ "./hooks/*": {
28
+ types: "./dist/hooks/*.d.ts",
29
+ import: "./dist/hooks/*.js"
30
+ },
31
+ "./events/*": {
32
+ types: "./dist/events/*.d.ts",
33
+ import: "./dist/events/*.js"
34
+ },
35
+ "./core/*": {
36
+ types: "./dist/core/*.d.ts",
37
+ import: "./dist/core/*.js"
38
+ },
39
+ "./mask/*": {
40
+ types: "./dist/mask/*.d.ts",
41
+ import: "./dist/mask/*.js"
42
+ },
43
+ "./Form": {
44
+ types: "./dist/Form.d.ts",
45
+ import: "./dist/Form.js"
46
+ },
47
+ "./FormInitContext": {
48
+ types: "./dist/FormInitContext.d.ts",
49
+ import: "./dist/FormInitContext.js"
50
+ },
51
+ "./style.css": {
52
+ import: "./dist/style.css",
53
+ require: "./dist/style.css"
54
+ },
55
+ "./light.css": {
56
+ import: "./src/lib/styles/light.css",
57
+ require: "./src/lib/styles/light.css"
58
+ },
59
+ "./dark.css": {
60
+ import: "./src/lib/styles/dark.css",
61
+ require: "./src/lib/styles/dark.css"
62
+ },
63
+ "./dist/style.css": {
64
+ import: "./dist/style.css",
65
+ require: "./dist/style.css"
66
+ }
67
+ },
68
+ scripts: {
69
+ dev: "vite --config test/vite.config.ts",
70
+ build: "vite build && node scripts/merge-dist-css.mjs && vite build --config vite.umd.config.ts",
71
+ test: "vitest run",
72
+ "test:watch": "vitest",
73
+ "test:build": "vite build --config test/vite.config.ts",
74
+ "test:preview": "vite preview --config test/vite.config.ts"
75
+ },
76
+ peerDependencies: {
77
+ react: ">=18",
78
+ "react-dom": ">=18"
79
+ },
80
+ devDependencies: {
81
+ "@elcrm/storybook": "^0.0.3",
82
+ "@testing-library/dom": "^10.4.1",
83
+ "@testing-library/react": "^16.3.2",
84
+ "@types/react": "^19.2.14",
85
+ "@types/react-dom": "^19.2.3",
86
+ "@vitejs/plugin-react": "^6.0.1",
87
+ jsdom: "^29.0.1",
88
+ react: "^19.2.4",
89
+ "react-dom": "^19.2.4",
90
+ "sass-embedded": "^1.98.0",
91
+ vite: "^8.0.1",
92
+ vitest: "^4.1.0"
93
+ }
94
+ };
95
+ //#endregion
96
+ export { e as default };
package/dist/style.css ADDED
@@ -0,0 +1,5 @@
1
+ ._l_zzcgd_2{min-width:var(--field-width);gap:var(--field-block-gap,0);flex-direction:column;margin:0;padding:0;display:flex;position:relative}._l_zzcgd_2>dt,._l_zzcgd_2>dd{margin:0;padding:0}._l_zzcgd_2[data-field=group] div{cursor:pointer;border-bottom:var(--field-border);padding:var(--field-padding);margin:0}._l_zzcgd_2[data-field=group] div:last-child{border-bottom:0}._l_zzcgd_2 [placeholder]:empty:before{content:attr(placeholder);color:var(--field-placeholder);display:block}._l_zzcgd_2 [placeholder]:focus:before{display:none}._f_zzcgd_33{box-sizing:border-box;align-items:center;gap:var(--field-icon-gap,10px);border:var(--field-border);border-radius:var(--field-radius);background:var(--field-background);color:var(--field-color);padding:0 var(--field-side-padding,14px);transition:border-color .16s,box-shadow .16s,background-color .16s,opacity .16s;display:flex;overflow:hidden}._f_zzcgd_33:hover{border-color:var(--field-border-hover,var(--field-border))}._f_zzcgd_33:focus-within{border-color:var(--field-border-focus,var(--field-border));box-shadow:0 0 0 3px var(--field-focus-ring,#0000);background:var(--field-background-focus,var(--field-background))}._f_zzcgd_33._e_zzcgd_57:focus-within{background:var(--field-error-background);color:var(--field-error-color)}._f_zzcgd_33[data-disabled=true]{background:var(--field-background-disabled,var(--field-background));border-color:var(--field-border-disabled,var(--field-border));color:var(--field-color-disabled,var(--field-placeholder));cursor:not-allowed;opacity:.85}._f_zzcgd_33[data-disabled=true]>*{cursor:not-allowed}._f_zzcgd_33>div{min-height:var(--field-height);line-height:calc(var(--field-height) - 2px);padding:var(--field-inner-padding,0 2px);font-size:var(--control-font-size,14px);text-wrap:pretty;outline:0;flex:1;margin:0}._f_zzcgd_33>div::selection{background:var(--field-selection-bg,#b3d4fc);color:var(--field-selection-color,inherit)}._f_zzcgd_33>:not(div){color:var(--field-icon-color,var(--field-placeholder));flex:none;justify-content:center;align-items:center;display:inline-flex}._f_zzcgd_33>:not(div) svg{width:20px;height:20px}._n_zzcgd_97 div{min-height:var(--field-note-height);line-height:var(--field-note-line-height);padding-top:var(--field-note-padding,var(--field-note-padding-top,8px));padding-bottom:var(--field-note-padding,var(--field-note-padding-top,8px))}._w_zzcgd_104>div{text-wrap:nowrap;overflow:scroll hidden}._w_zzcgd_104>div::-webkit-scrollbar{width:0;height:0}._time_zzcgd_114>div{text-wrap:nowrap;align-items:center;min-width:0;display:flex;overflow:visible}._time_zzcgd_114 ._timeInner_zzcgd_121{justify-content:flex-start;align-items:center;gap:4px;width:100%;min-width:0;display:flex}._time_zzcgd_114._timeAlignCenter_zzcgd_132 ._timeInner_zzcgd_121{justify-content:center}._time_zzcgd_114 ._timeSep_zzcgd_135{opacity:.65;-webkit-user-select:none;user-select:none;flex:none;padding:0 2px;font-weight:500;transform:translateY(-1px)}._time_zzcgd_114 ._timePart_zzcgd_146{box-sizing:border-box;width:1em;min-width:0;color:inherit;font:inherit;line-height:inherit;text-align:left;min-height:var(--field-height);cursor:text;background:0 0;border:0;border-radius:6px;outline:none;flex:none;margin:0;padding:0}._time_zzcgd_114 ._timePart_zzcgd_146[contenteditable=false]{cursor:not-allowed;opacity:.7}._time_zzcgd_114 ._timePart_zzcgd_146:empty:before{content:attr(placeholder);color:var(--field-placeholder);opacity:.6}._time_zzcgd_114 ._timePart_zzcgd_146:focus:empty:before{content:none}._time_zzcgd_114 ._timePart_zzcgd_146:focus-visible{background:0 0}._time_zzcgd_114._timeAlignCenter_zzcgd_132 ._timePart_zzcgd_146{text-align:center}._t_zzcgd_114{color:var(--field-label-color);font-size:var(--field-label-size);padding-bottom:10px}._g_zzcgd_192{flex-direction:column}._range_zzcgd_196>div{box-sizing:border-box;min-width:0;min-height:var(--field-height);flex:1;align-items:center;line-height:normal;display:flex}._range_zzcgd_196 ._rangeTrack_zzcgd_205{box-sizing:border-box;width:100%;height:var(--field-range-bar-height,14px);background:var(--field-range-track,#e0e0e0);cursor:pointer;touch-action:none;border-radius:999px;outline:none;flex-shrink:0;position:relative;overflow:hidden}._range_zzcgd_196 ._rangeTrack_zzcgd_205:focus-visible{box-shadow:0 0 0 3px var(--field-focus-ring,#0000)}._range_zzcgd_196 ._rangeTrack_zzcgd_205[data-disabled=true]{cursor:not-allowed;opacity:.55;pointer-events:none}._range_zzcgd_196 ._rangeFill_zzcgd_226{background:var(--field-range-fill,#00b5ad);pointer-events:none;border-radius:999px 0 0 999px;width:0;min-width:0;height:100%}._range_zzcgd_196 ._rangeFillFull_zzcgd_237{border-radius:999px}._h_zzcgd_241{--field-border:0}._h_zzcgd_241 div{border:var(--field-check-box-border,--field-border);width:var(--field-height);height:var(--field-height);border-radius:var(--field-radius);background:var(--field-background);cursor:pointer;flex:none;gap:10px;margin:0;position:relative}._h_zzcgd_241 div[aria-checked=true]{background:var(--field-background-active)}._h_zzcgd_241 div:after{content:"";background:0 0;border-top:none;border-bottom:3px solid #fcfff4;border-left:3px solid #fcfff4;border-right:none;width:9px;height:5px;margin:4px;position:absolute;top:5px;left:4px;transform:rotate(-45deg)}._e_zzcgd_57{border-color:var(--field-error-border);background:var(--field-error-background);color:var(--field-error-color)}._m_zzcgd_280{color:var(--field-error-color);margin-top:6px;font-size:12px;font-style:normal}
2
+
3
+ ._o_j48yg_2{z-index:98;background:0 0;position:fixed;inset:0}._c_j48yg_13{background:var(--select-background);z-index:99;color:#fff;box-sizing:border-box;border-radius:10px;min-width:259px;max-height:min(92vh,480px);margin:0;padding:10px 12px 12px;display:block;position:absolute;overflow:hidden auto;box-shadow:5px 7px 18px #000000a8}._c_j48yg_13 [grid-calendar]{grid-template-columns:repeat(7,1fr);grid-auto-rows:34px;gap:2px;display:grid}._c_j48yg_13 [grid-calendar]>p{color:var(--color-placeholder);box-sizing:border-box;justify-content:center;align-items:center;margin:0;padding:0;font-size:.75rem;font-weight:500;line-height:1;display:flex}._c_j48yg_13 [grid-month]{grid-template-columns:1fr 1fr 1fr 1fr;width:250px;display:grid}._c_j48yg_13 b{cursor:pointer;text-align:center;border-radius:5px;padding:8px 5px;font-weight:400;display:block}._c_j48yg_13 b.__active_j48yg_64{background:var(--bg-select-active)}._c_j48yg_13 b:hover{background:var(--bg-select-hover)}._c_j48yg_13 p{color:var(--color-placeholder);text-align:center;cursor:default;pointer-events:none;padding:0}._c_j48yg_13 i{text-align:center;cursor:pointer;border-radius:5px;flex:0 30px;padding:9px}._c_j48yg_13 i:hover{background:var(--bg-select-hover)}._c_j48yg_13 i:before{cursor:pointer;display:block}._c_j48yg_13 s{align-items:center;gap:4px;padding-bottom:6px;font-style:normal;text-decoration:none;display:flex}._c_j48yg_13 s h2{text-align:center;color:#fff;cursor:default;flex-wrap:nowrap;flex:auto;justify-content:center;align-items:center;gap:8px;min-width:0;margin:0;padding:0;font-size:16px;font-weight:400;line-height:1.25;display:flex}._c_j48yg_13 ._dateHeaderMonth_j48yg_119,._c_j48yg_13 ._dateHeaderYear_j48yg_119{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;border-radius:6px;padding:2px 8px}._c_j48yg_13 ._dateHeaderMonth_j48yg_119:hover,._c_j48yg_13 ._dateHeaderYear_j48yg_119:hover{background:var(--bg-select-hover)}._c_j48yg_13 ._dateHeaderDisabled_j48yg_129{cursor:not-allowed;opacity:.45;pointer-events:none}._c_j48yg_13 ._dateHeaderDisabled_j48yg_129[data-active=true],._c_j48yg_13 ._dateHeaderDisabled_j48yg_129[data-current=true]{opacity:.45}._c_j48yg_13 [grid-calendar] b[data-current=true],._c_j48yg_13 [grid-month] b[data-current=true]{background:color-mix(in srgb, var(--field-background-active) 52%, transparent);font-weight:600}._c_j48yg_13 [grid-calendar] b[data-active=true]:not([data-current=true]),._c_j48yg_13 [grid-month] b[data-active=true]:not([data-current=true]){outline:2px solid var(--field-background-active);outline-offset:-2px}._c_j48yg_13 [grid-calendar] b[data-active=true][data-current=true],._c_j48yg_13 [grid-month] b[data-active=true][data-current=true]{box-shadow:inset 0 0 0 2px var(--field-background-active)}._c_j48yg_13 [grid-calendar] p[data-current=true]{background:color-mix(in srgb, var(--field-background-active) 52%, transparent);color:inherit;border-radius:5px;font-weight:600}._c_j48yg_13 [grid-calendar] p[data-active=true]:not([data-current=true]){outline:2px solid var(--field-background-active);outline-offset:-2px;opacity:.85}._c_j48yg_13 [grid-calendar] p[data-active=true][data-current=true]{box-shadow:inset 0 0 0 2px var(--field-background-active)}._c_j48yg_13 span{text-align:center;padding:2px}._c_j48yg_13 span p{color:var(--color-placeholder);padding:8px 5px}._c_j48yg_13 [grid-calendar]>span{box-sizing:border-box;justify-content:stretch;align-items:stretch;min-height:0;padding:0;display:flex}._c_j48yg_13 [grid-calendar]>span>b,._c_j48yg_13 [grid-calendar]>span>p{box-sizing:border-box;border-radius:5px;flex:auto;justify-content:center;align-items:center;width:100%;min-height:0;margin:0;padding:0;display:flex}._c_j48yg_13 ._as_j48yg_196{cursor:ns-resize}._c_j48yg_13 ._ap_j48yg_199{cursor:pointer}[field=password] dd{white-space:nowrap;font-style:unset;-webkit-text-security:disc;-webkit-user-select:text;user-select:text}[field=password][show] dd,[field=password] dd:before{-webkit-text-security:none}[field=code] div{gap:8px;display:flex}[field=select] dd{cursor:pointer}[field] dd:before{pointer-events:none}[field=check] dd{cursor:pointer;max-width:35px;padding:0}[field=check] [active]:after{content:"";background:#394264;border-radius:5px;width:15px;height:15px;display:block}[field=file] input{display:none}[field=file] dd{aspect-ratio:16/9;cursor:pointer;position:relative}[field=file] img{aspect-ratio:16/9;object-fit:contain;cursor:pointer;width:-webkit-fill-available;display:block}[field=file] label{aspect-ratio:16/9;object-fit:contain;cursor:pointer;width:-webkit-fill-available;display:block;position:absolute}[field=color] dd{border:0;gap:3px;padding:0;display:flex}[field=color] dd s{cursor:pointer;opacity:.6;border:1px solid #dde2e4;border-radius:6px;flex:1}[field=color] dd s:hover{opacity:.9}[field=color] dd s[active=true]{opacity:1}
4
+
5
+ :root{--select-overlay:#0000;--select-height:52px;--select-separator:1px solid #40434c;--select-color:#e8e8eb;--select-background:#26282e;--select-icon:calc(--select-height / 1.5);--select-icon-padding:calc((--select-height - --select-icon) / 2);--select-font-size:13px}._o_1q26w_12{z-index:98;background:var(--select-overlay);position:fixed;inset:0}._l_1q26w_22{background:var(--select-background);z-index:99;border-radius:20px;max-height:300px;margin:0;padding:0;display:block;position:fixed;overflow:scroll}._l_1q26w_22::-webkit-scrollbar{width:0;height:0}._l_1q26w_22 ul{width:100%;max-height:300px;margin:0;padding:0;list-style:none;display:block;overflow:hidden auto}._l_1q26w_22 li{border-bottom:var(--select-separator);cursor:pointer;color:var(--select-color);height:var(--select-height);line-height:var(--select-height);font-size:var(--select-font-size);white-space:nowrap;text-overflow:ellipsis;opacity:1;margin:0;padding:0 14px;display:block;overflow:hidden;text-align:left!important;border-left:0!important}._l_1q26w_22 li:hover,._l_1q26w_22 li[data-focus=true]{background:#2f323a}._l_1q26w_22 li:last-child{border-bottom:0}._i_1q26w_80{width:var(--select-icon);height:var(--select-icon);color:var(--field-color);right:var(--select-icon-padding);top:var(--select-icon-padding);position:absolute}._f_1q26w_89{cursor:pointer}._f_1q26w_89[aria-disabled=true]{cursor:not-allowed}
@@ -0,0 +1,22 @@
1
+ import '../assets/styles/Field.module.css';var e = {
2
+ l: "_l_zzcgd_2",
3
+ f: "_f_zzcgd_33",
4
+ e: "_e_zzcgd_57",
5
+ n: "_n_zzcgd_97",
6
+ w: "_w_zzcgd_104",
7
+ time: "_time_zzcgd_114",
8
+ timeInner: "_timeInner_zzcgd_121",
9
+ timeAlignCenter: "_timeAlignCenter_zzcgd_132",
10
+ timeSep: "_timeSep_zzcgd_135",
11
+ timePart: "_timePart_zzcgd_146",
12
+ t: "_t_zzcgd_114",
13
+ g: "_g_zzcgd_192",
14
+ range: "_range_zzcgd_196",
15
+ rangeTrack: "_rangeTrack_zzcgd_205",
16
+ rangeFill: "_rangeFill_zzcgd_226",
17
+ rangeFillFull: "_rangeFillFull_zzcgd_237",
18
+ h: "_h_zzcgd_241",
19
+ m: "_m_zzcgd_280"
20
+ };
21
+ //#endregion
22
+ export { e as default };
@@ -0,0 +1,12 @@
1
+ import '../assets/styles/Form.module.css';var e = {
2
+ o: "_o_j48yg_2",
3
+ c: "_c_j48yg_13",
4
+ _active: "__active_j48yg_64",
5
+ dateHeaderMonth: "_dateHeaderMonth_j48yg_119",
6
+ dateHeaderYear: "_dateHeaderYear_j48yg_119",
7
+ dateHeaderDisabled: "_dateHeaderDisabled_j48yg_129",
8
+ as: "_as_j48yg_196",
9
+ ap: "_ap_j48yg_199"
10
+ };
11
+ //#endregion
12
+ export { e as default };
@@ -0,0 +1,8 @@
1
+ import '../assets/styles/Select.module.css';var e = {
2
+ o: "_o_1q26w_12",
3
+ l: "_l_1q26w_22",
4
+ i: "_i_1q26w_80",
5
+ f: "_f_1q26w_89"
6
+ };
7
+ //#endregion
8
+ export { e as default };
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@elcrm/form",
3
- "version": "0.0.62",
4
- "description": "plugin for elCRM",
3
+ "version": "0.0.64",
4
+ "description": "React-компоненты полей формы и хук useForm для elCRM: текст, даты, маски, деньги, селект, связка с формой по имени поля (tree-shakeable ESM).",
5
5
  "type": "module",
6
6
  "author": "MaSkal <dev@elcrm.online>",
7
7
  "license": "MIT",
8
8
  "files": [
9
- "dist"
9
+ "dist",
10
+ "src/lib/styles"
10
11
  ],
11
12
  "keywords": [
12
13
  "elcrm",
@@ -14,23 +15,83 @@
14
15
  "react"
15
16
  ],
16
17
  "main": "./dist/index.umd.js",
17
- "module": "./dist/index.es.js",
18
+ "module": "./dist/index.js",
18
19
  "types": "./dist/index.d.ts",
19
20
  "exports": {
20
21
  ".": {
21
22
  "types": "./dist/index.d.ts",
22
- "import": "./dist/index.es.js",
23
+ "import": "./dist/index.js",
23
24
  "require": "./dist/index.umd.js"
24
25
  },
26
+ "./fields/*": {
27
+ "types": "./dist/fields/*.d.ts",
28
+ "import": "./dist/fields/*.js"
29
+ },
30
+ "./hooks/*": {
31
+ "types": "./dist/hooks/*.d.ts",
32
+ "import": "./dist/hooks/*.js"
33
+ },
34
+ "./events/*": {
35
+ "types": "./dist/events/*.d.ts",
36
+ "import": "./dist/events/*.js"
37
+ },
38
+ "./core/*": {
39
+ "types": "./dist/core/*.d.ts",
40
+ "import": "./dist/core/*.js"
41
+ },
42
+ "./mask/*": {
43
+ "types": "./dist/mask/*.d.ts",
44
+ "import": "./dist/mask/*.js"
45
+ },
46
+ "./Form": {
47
+ "types": "./dist/Form.d.ts",
48
+ "import": "./dist/Form.js"
49
+ },
50
+ "./FormInitContext": {
51
+ "types": "./dist/FormInitContext.d.ts",
52
+ "import": "./dist/FormInitContext.js"
53
+ },
54
+ "./style.css": {
55
+ "import": "./dist/style.css",
56
+ "require": "./dist/style.css"
57
+ },
58
+ "./light.css": {
59
+ "import": "./src/lib/styles/light.css",
60
+ "require": "./src/lib/styles/light.css"
61
+ },
62
+ "./dark.css": {
63
+ "import": "./src/lib/styles/dark.css",
64
+ "require": "./src/lib/styles/dark.css"
65
+ },
25
66
  "./dist/style.css": {
26
- "import": "./dist/index.css",
27
- "require": "./dist/index.css"
67
+ "import": "./dist/style.css",
68
+ "require": "./dist/style.css"
28
69
  }
29
70
  },
71
+ "scripts": {
72
+ "dev": "vite --config test/vite.config.ts",
73
+ "build": "vite build && node scripts/merge-dist-css.mjs && vite build --config vite.umd.config.ts",
74
+ "test": "vitest run",
75
+ "test:watch": "vitest",
76
+ "test:build": "vite build --config test/vite.config.ts",
77
+ "test:preview": "vite preview --config test/vite.config.ts"
78
+ },
30
79
  "peerDependencies": {
31
- "@elcrm/router": "^0.0.42",
32
- "@elcrm/event": "^0.0.1",
33
- "@elcrm/setting": "^0.0.6",
34
- "@elcrm/notice": "^0.0.1"
80
+ "react": ">=18",
81
+ "react-dom": ">=18"
82
+ },
83
+ "devDependencies": {
84
+ "@elcrm/storybook": "^0.0.3",
85
+ "@testing-library/dom": "^10.4.1",
86
+ "@testing-library/react": "^16.3.2",
87
+ "@types/react": "^19.2.14",
88
+ "@types/react-dom": "^19.2.3",
89
+ "@vitejs/plugin-react": "^6.0.1",
90
+ "jsdom": "^29.0.1",
91
+ "react": "^19.2.4",
92
+ "react-dom": "^19.2.4",
93
+ "sass-embedded": "^1.98.0",
94
+ "vite": "^8.0.1",
95
+ "vitest": "^4.1.0"
35
96
  }
36
97
  }
@@ -0,0 +1,315 @@
1
+ .l {
2
+ display: flex;
3
+ flex-direction: column;
4
+ position: relative;
5
+ min-width: var(--field-width);
6
+ gap: var(--field-block-gap, 0);
7
+ margin: 0;
8
+ padding: 0;
9
+ & > dt,
10
+ & > dd {
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+ &[data-field="group"] {
15
+ & div {
16
+ cursor: pointer;
17
+ border-bottom: var(--field-border);
18
+ margin: 0;
19
+ padding: var(--field-padding);
20
+ }
21
+ & div:last-child {
22
+ border-bottom: 0;
23
+ }
24
+ }
25
+ & [placeholder]:empty:before {
26
+ content: attr(placeholder);
27
+ display: block;
28
+ color: var(--field-placeholder);
29
+ }
30
+ & [placeholder]:focus:before {
31
+ display: none;
32
+ }
33
+ }
34
+
35
+ .f {
36
+ box-sizing: border-box;
37
+ display: flex;
38
+ align-items: center;
39
+ gap: var(--field-icon-gap, 10px);
40
+ border: var(--field-border);
41
+ border-radius: var(--field-radius);
42
+ overflow: hidden;
43
+ background: var(--field-background);
44
+ color: var(--field-color);
45
+ padding: 0 var(--field-side-padding, 14px);
46
+ transition:
47
+ border-color 0.16s ease,
48
+ box-shadow 0.16s ease,
49
+ background-color 0.16s ease,
50
+ opacity 0.16s ease;
51
+ &:hover {
52
+ border-color: var(--field-border-hover, var(--field-border));
53
+ }
54
+ &:focus-within {
55
+ border-color: var(--field-border-focus, var(--field-border));
56
+ box-shadow: 0 0 0 3px var(--field-focus-ring, #0000);
57
+ background: var(--field-background-focus, var(--field-background));
58
+ }
59
+ /* при ошибке оставляем фон ошибки, не подсветку обычного фокуса */
60
+ &.e:focus-within {
61
+ background: var(--field-error-background);
62
+ color: var(--field-error-color);
63
+ }
64
+ &[data-disabled="true"] {
65
+ background: var(--field-background-disabled, var(--field-background));
66
+ border-color: var(--field-border-disabled, var(--field-border));
67
+ color: var(--field-color-disabled, var(--field-placeholder));
68
+ cursor: not-allowed;
69
+ opacity: 0.85;
70
+ }
71
+ &[data-disabled="true"] > * {
72
+ cursor: not-allowed;
73
+ }
74
+ & > div {
75
+ outline: 0;
76
+
77
+ flex: 1;
78
+ margin: 0;
79
+ min-height: var(--field-height);
80
+ line-height: calc(var(--field-height) - 2px);
81
+ padding: var(--field-inner-padding, 0 2px);
82
+ font-size: var(--control-font-size, 14px);
83
+ text-wrap: pretty;
84
+
85
+ &::selection {
86
+ background: var(--field-selection-bg, #b3d4fc);
87
+ color: var(--field-selection-color, inherit);
88
+ }
89
+ }
90
+ & > :not(div) {
91
+ display: inline-flex;
92
+ align-items: center;
93
+ justify-content: center;
94
+ flex: 0 0 auto;
95
+ color: var(--field-icon-color, var(--field-placeholder));
96
+ & svg {
97
+ width: 20px;
98
+ height: 20px;
99
+ }
100
+ }
101
+ }
102
+
103
+ // textarea
104
+ .n {
105
+ & div {
106
+ min-height: var(--field-note-height);
107
+ line-height: var(--field-note-line-height);
108
+ padding-top: var(
109
+ --field-note-padding,
110
+ var(--field-note-padding-top, 8px)
111
+ );
112
+ padding-bottom: var(
113
+ --field-note-padding,
114
+ var(--field-note-padding-top, 8px)
115
+ );
116
+ }
117
+ }
118
+
119
+ .w {
120
+ & > div {
121
+ text-wrap: nowrap;
122
+ overflow: hidden;
123
+ overflow-x: scroll;
124
+ &::-webkit-scrollbar {
125
+ width: 0;
126
+ height: 0;
127
+ }
128
+ }
129
+ }
130
+
131
+ // время: два поля часы / минуты
132
+ .time {
133
+ & > div {
134
+ display: flex;
135
+ align-items: center;
136
+ min-width: 0;
137
+ overflow: visible;
138
+ text-wrap: nowrap;
139
+ }
140
+
141
+ .timeInner {
142
+ display: flex;
143
+ align-items: center;
144
+ justify-content: flex-start;
145
+ gap: 4px;
146
+ width: 100%;
147
+ min-width: 0;
148
+ }
149
+
150
+ /* центрирование — опционально через проп align="center" у Time */
151
+ &.timeAlignCenter .timeInner {
152
+ justify-content: center;
153
+ }
154
+
155
+ .timeSep {
156
+ flex: none;
157
+ font-weight: 500;
158
+ opacity: 0.65;
159
+ user-select: none;
160
+ padding: 0 2px;
161
+ transform: translateY(-1px);
162
+ }
163
+
164
+ /* contentEditable, как у текстового поля */
165
+ .timePart {
166
+ box-sizing: border-box;
167
+ width: 1em;
168
+ min-width: 0;
169
+ margin: 0;
170
+ padding: 0;
171
+ border: 0;
172
+ background: transparent;
173
+ color: inherit;
174
+ font: inherit;
175
+ line-height: inherit;
176
+ text-align: left;
177
+ min-height: var(--field-height);
178
+ outline: none;
179
+ border-radius: 6px;
180
+ cursor: text;
181
+ flex: 0 0 auto;
182
+
183
+ &[contenteditable="false"] {
184
+ cursor: not-allowed;
185
+ opacity: 0.7;
186
+ }
187
+
188
+ &:empty:before {
189
+ content: attr(placeholder);
190
+ color: var(--field-placeholder);
191
+ opacity: 0.6;
192
+ }
193
+
194
+ &:focus:empty:before {
195
+ content: none;
196
+ }
197
+
198
+ /* фон капсулы .f уже через :focus-within; здесь не перекрываем */
199
+ &:focus-visible {
200
+ background: transparent;
201
+ }
202
+ }
203
+
204
+ &.timeAlignCenter .timePart {
205
+ text-align: center;
206
+ }
207
+ }
208
+
209
+ .t {
210
+ color: var(--field-label-color);
211
+ font-size: var(--field-label-size);
212
+ padding-bottom: 10px;
213
+ }
214
+
215
+ .g {
216
+ flex-direction: column;
217
+ }
218
+
219
+ // range — капсула .f + .w как у Input; внутри «таблетка» трек (div): серый фон + бирюзовая заливка слева
220
+ .range {
221
+ & > div {
222
+ box-sizing: border-box;
223
+ flex: 1;
224
+ min-width: 0;
225
+ min-height: var(--field-height);
226
+ display: flex;
227
+ align-items: center;
228
+ line-height: normal;
229
+ }
230
+
231
+ .rangeTrack {
232
+ box-sizing: border-box;
233
+ position: relative;
234
+ width: 100%;
235
+ height: var(--field-range-bar-height, 14px);
236
+ flex-shrink: 0;
237
+ border-radius: 999px;
238
+ background: var(--field-range-track, #e0e0e0);
239
+ overflow: hidden;
240
+ cursor: pointer;
241
+ outline: none;
242
+ touch-action: none;
243
+
244
+ &:focus-visible {
245
+ box-shadow: 0 0 0 3px var(--field-focus-ring, #0000);
246
+ }
247
+
248
+ &[data-disabled="true"] {
249
+ cursor: not-allowed;
250
+ opacity: 0.55;
251
+ pointer-events: none;
252
+ }
253
+ }
254
+
255
+ .rangeFill {
256
+ height: 100%;
257
+ width: 0;
258
+ min-width: 0;
259
+ background: var(--field-range-fill, #00b5ad);
260
+ border-radius: 999px 0 0 999px;
261
+ pointer-events: none;
262
+ }
263
+
264
+ /* при 100% — полностью скруглённая «капсула» заливки */
265
+ .rangeFillFull {
266
+ border-radius: 999px;
267
+ }
268
+ }
269
+
270
+ // checkBox
271
+ .h {
272
+ --field-border: 0;
273
+ & div {
274
+ border: var(--field-check-box-border, --field-border);
275
+ width: var(--field-height);
276
+ height: var(--field-height);
277
+ border-radius: var(--field-radius);
278
+ background: var(--field-background);
279
+ margin: 0;
280
+ flex: none;
281
+ cursor: pointer;
282
+ position: relative;
283
+ gap: 10px;
284
+ &[aria-checked="true"] {
285
+ background: var(--field-background-active);
286
+ }
287
+ &:after {
288
+ content: "";
289
+ width: 9px;
290
+ height: 5px;
291
+ position: absolute;
292
+ top: 5px;
293
+ left: 4px;
294
+ border: 3px solid #fcfff4;
295
+ border-top: none;
296
+ border-right: none;
297
+ background: transparent;
298
+ transform: rotate(-45deg);
299
+ margin: 4px;
300
+ }
301
+ }
302
+ }
303
+
304
+ .e {
305
+ border-color: var(--field-error-border);
306
+ background: var(--field-error-background);
307
+ color: var(--field-error-color);
308
+ }
309
+
310
+ .m {
311
+ color: var(--field-error-color);
312
+ font-size: 12px;
313
+ font-style: normal;
314
+ margin-top: 6px;
315
+ }