@cloud-ru/ds-fields 1.0.0

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 (314) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +201 -0
  3. package/README.md +888 -0
  4. package/dist/cjs/components/FieldColor/FieldColor.d.ts +48 -0
  5. package/dist/cjs/components/FieldColor/FieldColor.js +147 -0
  6. package/dist/cjs/components/FieldColor/index.d.ts +1 -0
  7. package/dist/cjs/components/FieldColor/index.js +17 -0
  8. package/dist/cjs/components/FieldColor/styles.module.css +79 -0
  9. package/dist/cjs/components/FieldColor/utils.d.ts +7 -0
  10. package/dist/cjs/components/FieldColor/utils.js +19 -0
  11. package/dist/cjs/components/FieldCombo/FieldCombo.d.ts +91 -0
  12. package/dist/cjs/components/FieldCombo/FieldCombo.js +200 -0
  13. package/dist/cjs/components/FieldCombo/index.d.ts +1 -0
  14. package/dist/cjs/components/FieldCombo/index.js +17 -0
  15. package/dist/cjs/components/FieldDate/FieldDate.d.ts +2 -0
  16. package/dist/cjs/components/FieldDate/FieldDate.js +369 -0
  17. package/dist/cjs/components/FieldDate/constants.d.ts +10 -0
  18. package/dist/cjs/components/FieldDate/constants.js +13 -0
  19. package/dist/cjs/components/FieldDate/index.d.ts +3 -0
  20. package/dist/cjs/components/FieldDate/index.js +19 -0
  21. package/dist/cjs/components/FieldDate/mask.d.ts +20 -0
  22. package/dist/cjs/components/FieldDate/mask.js +117 -0
  23. package/dist/cjs/components/FieldDate/styles.module.css +43 -0
  24. package/dist/cjs/components/FieldDate/types.d.ts +100 -0
  25. package/dist/cjs/components/FieldDate/types.js +2 -0
  26. package/dist/cjs/components/FieldDate/utils.d.ts +3 -0
  27. package/dist/cjs/components/FieldDate/utils.js +8 -0
  28. package/dist/cjs/components/FieldSecure/FieldSecure.d.ts +64 -0
  29. package/dist/cjs/components/FieldSecure/FieldSecure.js +158 -0
  30. package/dist/cjs/components/FieldSecure/index.d.ts +1 -0
  31. package/dist/cjs/components/FieldSecure/index.js +17 -0
  32. package/dist/cjs/components/FieldSelect/FieldSelect.d.ts +2 -0
  33. package/dist/cjs/components/FieldSelect/FieldSelect.js +360 -0
  34. package/dist/cjs/components/FieldSelect/constants.d.ts +4 -0
  35. package/dist/cjs/components/FieldSelect/constants.js +7 -0
  36. package/dist/cjs/components/FieldSelect/index.d.ts +3 -0
  37. package/dist/cjs/components/FieldSelect/index.js +19 -0
  38. package/dist/cjs/components/FieldSelect/styles.module.css +92 -0
  39. package/dist/cjs/components/FieldSelect/types.d.ts +197 -0
  40. package/dist/cjs/components/FieldSelect/types.js +2 -0
  41. package/dist/cjs/components/FieldSelect/utils.d.ts +19 -0
  42. package/dist/cjs/components/FieldSelect/utils.js +104 -0
  43. package/dist/cjs/components/FieldSlider/FieldSlider.d.ts +92 -0
  44. package/dist/cjs/components/FieldSlider/FieldSlider.js +196 -0
  45. package/dist/cjs/components/FieldSlider/index.d.ts +2 -0
  46. package/dist/cjs/components/FieldSlider/index.js +18 -0
  47. package/dist/cjs/components/FieldSlider/styles.module.css +44 -0
  48. package/dist/cjs/components/FieldSlider/types.d.ts +4 -0
  49. package/dist/cjs/components/FieldSlider/types.js +2 -0
  50. package/dist/cjs/components/FieldSlider/utils/generateAllowedValues.d.ts +1 -0
  51. package/dist/cjs/components/FieldSlider/utils/generateAllowedValues.js +16 -0
  52. package/dist/cjs/components/FieldSlider/utils/getClosestMark.d.ts +4 -0
  53. package/dist/cjs/components/FieldSlider/utils/getClosestMark.js +16 -0
  54. package/dist/cjs/components/FieldSlider/utils/getMarkLabel.d.ts +2 -0
  55. package/dist/cjs/components/FieldSlider/utils/getMarkLabel.js +7 -0
  56. package/dist/cjs/components/FieldSlider/utils/getTextFieldValue.d.ts +2 -0
  57. package/dist/cjs/components/FieldSlider/utils/getTextFieldValue.js +9 -0
  58. package/dist/cjs/components/FieldSlider/utils/index.d.ts +5 -0
  59. package/dist/cjs/components/FieldSlider/utils/index.js +21 -0
  60. package/dist/cjs/components/FieldSlider/utils/isMarkObject.d.ts +6 -0
  61. package/dist/cjs/components/FieldSlider/utils/isMarkObject.js +6 -0
  62. package/dist/cjs/components/FieldStepper/FieldStepper.d.ts +81 -0
  63. package/dist/cjs/components/FieldStepper/FieldStepper.js +160 -0
  64. package/dist/cjs/components/FieldStepper/index.d.ts +1 -0
  65. package/dist/cjs/components/FieldStepper/index.js +17 -0
  66. package/dist/cjs/components/FieldStepper/styles.module.css +78 -0
  67. package/dist/cjs/components/FieldStepper/utils.d.ts +14 -0
  68. package/dist/cjs/components/FieldStepper/utils.js +45 -0
  69. package/dist/cjs/components/FieldText/FieldText.d.ts +11 -0
  70. package/dist/cjs/components/FieldText/FieldText.js +14 -0
  71. package/dist/cjs/components/FieldText/index.d.ts +1 -0
  72. package/dist/cjs/components/FieldText/index.js +17 -0
  73. package/dist/cjs/components/FieldTextArea/FieldTextArea.d.ts +95 -0
  74. package/dist/cjs/components/FieldTextArea/FieldTextArea.js +114 -0
  75. package/dist/cjs/components/FieldTextArea/index.d.ts +1 -0
  76. package/dist/cjs/components/FieldTextArea/index.js +17 -0
  77. package/dist/cjs/components/FieldTextArea/styles.module.css +123 -0
  78. package/dist/cjs/components/FieldTime/FieldTime.d.ts +74 -0
  79. package/dist/cjs/components/FieldTime/FieldTime.js +167 -0
  80. package/dist/cjs/components/FieldTime/index.d.ts +2 -0
  81. package/dist/cjs/components/FieldTime/index.js +17 -0
  82. package/dist/cjs/components/FieldTime/mask.d.ts +3 -0
  83. package/dist/cjs/components/FieldTime/mask.js +24 -0
  84. package/dist/cjs/components/FieldTime/styles.module.css +3 -0
  85. package/dist/cjs/components/index.d.ts +14 -0
  86. package/dist/cjs/components/index.js +32 -0
  87. package/dist/cjs/components/shared/helperComponents/FieldElementButton/FieldElementButton.d.ts +35 -0
  88. package/dist/cjs/components/shared/helperComponents/FieldElementButton/FieldElementButton.js +47 -0
  89. package/dist/cjs/components/shared/helperComponents/FieldElementButton/FieldElementButtonList.d.ts +26 -0
  90. package/dist/cjs/components/shared/helperComponents/FieldElementButton/FieldElementButtonList.js +24 -0
  91. package/dist/cjs/components/shared/helperComponents/FieldElementButton/constants.d.ts +9 -0
  92. package/dist/cjs/components/shared/helperComponents/FieldElementButton/constants.js +12 -0
  93. package/dist/cjs/components/shared/helperComponents/FieldElementButton/index.d.ts +4 -0
  94. package/dist/cjs/components/shared/helperComponents/FieldElementButton/index.js +20 -0
  95. package/dist/cjs/components/shared/helperComponents/FieldElementButton/styles.module.css +204 -0
  96. package/dist/cjs/components/shared/helperComponents/FieldElementButton/types.d.ts +4 -0
  97. package/dist/cjs/components/shared/helperComponents/FieldElementButton/types.js +2 -0
  98. package/dist/cjs/components/shared/helperComponents/FieldShell/FieldShell.d.ts +43 -0
  99. package/dist/cjs/components/shared/helperComponents/FieldShell/FieldShell.js +22 -0
  100. package/dist/cjs/components/shared/helperComponents/FieldShell/index.d.ts +1 -0
  101. package/dist/cjs/components/shared/helperComponents/FieldShell/index.js +17 -0
  102. package/dist/cjs/components/shared/helperComponents/FieldShell/styles.module.css +11 -0
  103. package/dist/cjs/components/shared/hooks/useCopyButton.d.ts +20 -0
  104. package/dist/cjs/components/shared/hooks/useCopyButton.js +58 -0
  105. package/dist/cjs/components/shared/index.d.ts +4 -0
  106. package/dist/cjs/components/shared/index.js +20 -0
  107. package/dist/cjs/components/shared/styles.module.css +673 -0
  108. package/dist/cjs/components/shared/utils.d.ts +69 -0
  109. package/dist/cjs/components/shared/utils.js +104 -0
  110. package/dist/cjs/constants.d.ts +61 -0
  111. package/dist/cjs/constants.js +76 -0
  112. package/dist/cjs/hooks/index.d.ts +1 -0
  113. package/dist/cjs/hooks/index.js +17 -0
  114. package/dist/cjs/hooks/useAdaptiveAutoFocus.d.ts +7 -0
  115. package/dist/cjs/hooks/useAdaptiveAutoFocus.js +10 -0
  116. package/dist/cjs/index.d.ts +3 -0
  117. package/dist/cjs/index.js +19 -0
  118. package/dist/cjs/package.json +3 -0
  119. package/dist/cjs/segments/index.d.ts +2 -0
  120. package/dist/cjs/segments/index.js +18 -0
  121. package/dist/cjs/segments/segments.d.ts +22 -0
  122. package/dist/cjs/segments/segments.js +46 -0
  123. package/dist/cjs/segments/useSegmentedMask.d.ts +43 -0
  124. package/dist/cjs/segments/useSegmentedMask.js +282 -0
  125. package/dist/cjs/style.css +1350 -0
  126. package/dist/esm/components/FieldColor/FieldColor.d.ts +48 -0
  127. package/dist/esm/components/FieldColor/FieldColor.js +141 -0
  128. package/dist/esm/components/FieldColor/index.d.ts +1 -0
  129. package/dist/esm/components/FieldColor/index.js +1 -0
  130. package/dist/esm/components/FieldColor/styles.module.css +79 -0
  131. package/dist/esm/components/FieldColor/utils.d.ts +7 -0
  132. package/dist/esm/components/FieldColor/utils.js +16 -0
  133. package/dist/esm/components/FieldCombo/FieldCombo.d.ts +91 -0
  134. package/dist/esm/components/FieldCombo/FieldCombo.js +194 -0
  135. package/dist/esm/components/FieldCombo/index.d.ts +1 -0
  136. package/dist/esm/components/FieldCombo/index.js +1 -0
  137. package/dist/esm/components/FieldDate/FieldDate.d.ts +2 -0
  138. package/dist/esm/components/FieldDate/FieldDate.js +363 -0
  139. package/dist/esm/components/FieldDate/constants.d.ts +10 -0
  140. package/dist/esm/components/FieldDate/constants.js +10 -0
  141. package/dist/esm/components/FieldDate/index.d.ts +3 -0
  142. package/dist/esm/components/FieldDate/index.js +3 -0
  143. package/dist/esm/components/FieldDate/mask.d.ts +20 -0
  144. package/dist/esm/components/FieldDate/mask.js +111 -0
  145. package/dist/esm/components/FieldDate/styles.module.css +43 -0
  146. package/dist/esm/components/FieldDate/types.d.ts +100 -0
  147. package/dist/esm/components/FieldDate/types.js +1 -0
  148. package/dist/esm/components/FieldDate/utils.d.ts +3 -0
  149. package/dist/esm/components/FieldDate/utils.js +5 -0
  150. package/dist/esm/components/FieldSecure/FieldSecure.d.ts +64 -0
  151. package/dist/esm/components/FieldSecure/FieldSecure.js +152 -0
  152. package/dist/esm/components/FieldSecure/index.d.ts +1 -0
  153. package/dist/esm/components/FieldSecure/index.js +1 -0
  154. package/dist/esm/components/FieldSelect/FieldSelect.d.ts +2 -0
  155. package/dist/esm/components/FieldSelect/FieldSelect.js +354 -0
  156. package/dist/esm/components/FieldSelect/constants.d.ts +4 -0
  157. package/dist/esm/components/FieldSelect/constants.js +4 -0
  158. package/dist/esm/components/FieldSelect/index.d.ts +3 -0
  159. package/dist/esm/components/FieldSelect/index.js +3 -0
  160. package/dist/esm/components/FieldSelect/styles.module.css +92 -0
  161. package/dist/esm/components/FieldSelect/types.d.ts +197 -0
  162. package/dist/esm/components/FieldSelect/types.js +1 -0
  163. package/dist/esm/components/FieldSelect/utils.d.ts +19 -0
  164. package/dist/esm/components/FieldSelect/utils.js +93 -0
  165. package/dist/esm/components/FieldSlider/FieldSlider.d.ts +92 -0
  166. package/dist/esm/components/FieldSlider/FieldSlider.js +190 -0
  167. package/dist/esm/components/FieldSlider/index.d.ts +2 -0
  168. package/dist/esm/components/FieldSlider/index.js +2 -0
  169. package/dist/esm/components/FieldSlider/styles.module.css +44 -0
  170. package/dist/esm/components/FieldSlider/types.d.ts +4 -0
  171. package/dist/esm/components/FieldSlider/types.js +1 -0
  172. package/dist/esm/components/FieldSlider/utils/generateAllowedValues.d.ts +1 -0
  173. package/dist/esm/components/FieldSlider/utils/generateAllowedValues.js +13 -0
  174. package/dist/esm/components/FieldSlider/utils/getClosestMark.d.ts +4 -0
  175. package/dist/esm/components/FieldSlider/utils/getClosestMark.js +13 -0
  176. package/dist/esm/components/FieldSlider/utils/getMarkLabel.d.ts +2 -0
  177. package/dist/esm/components/FieldSlider/utils/getMarkLabel.js +4 -0
  178. package/dist/esm/components/FieldSlider/utils/getTextFieldValue.d.ts +2 -0
  179. package/dist/esm/components/FieldSlider/utils/getTextFieldValue.js +6 -0
  180. package/dist/esm/components/FieldSlider/utils/index.d.ts +5 -0
  181. package/dist/esm/components/FieldSlider/utils/index.js +5 -0
  182. package/dist/esm/components/FieldSlider/utils/isMarkObject.d.ts +6 -0
  183. package/dist/esm/components/FieldSlider/utils/isMarkObject.js +3 -0
  184. package/dist/esm/components/FieldStepper/FieldStepper.d.ts +81 -0
  185. package/dist/esm/components/FieldStepper/FieldStepper.js +154 -0
  186. package/dist/esm/components/FieldStepper/index.d.ts +1 -0
  187. package/dist/esm/components/FieldStepper/index.js +1 -0
  188. package/dist/esm/components/FieldStepper/styles.module.css +78 -0
  189. package/dist/esm/components/FieldStepper/utils.d.ts +14 -0
  190. package/dist/esm/components/FieldStepper/utils.js +38 -0
  191. package/dist/esm/components/FieldText/FieldText.d.ts +11 -0
  192. package/dist/esm/components/FieldText/FieldText.js +11 -0
  193. package/dist/esm/components/FieldText/index.d.ts +1 -0
  194. package/dist/esm/components/FieldText/index.js +1 -0
  195. package/dist/esm/components/FieldTextArea/FieldTextArea.d.ts +95 -0
  196. package/dist/esm/components/FieldTextArea/FieldTextArea.js +108 -0
  197. package/dist/esm/components/FieldTextArea/index.d.ts +1 -0
  198. package/dist/esm/components/FieldTextArea/index.js +1 -0
  199. package/dist/esm/components/FieldTextArea/styles.module.css +123 -0
  200. package/dist/esm/components/FieldTime/FieldTime.d.ts +74 -0
  201. package/dist/esm/components/FieldTime/FieldTime.js +161 -0
  202. package/dist/esm/components/FieldTime/index.d.ts +2 -0
  203. package/dist/esm/components/FieldTime/index.js +1 -0
  204. package/dist/esm/components/FieldTime/mask.d.ts +3 -0
  205. package/dist/esm/components/FieldTime/mask.js +20 -0
  206. package/dist/esm/components/FieldTime/styles.module.css +3 -0
  207. package/dist/esm/components/index.d.ts +14 -0
  208. package/dist/esm/components/index.js +12 -0
  209. package/dist/esm/components/shared/helperComponents/FieldElementButton/FieldElementButton.d.ts +35 -0
  210. package/dist/esm/components/shared/helperComponents/FieldElementButton/FieldElementButton.js +41 -0
  211. package/dist/esm/components/shared/helperComponents/FieldElementButton/FieldElementButtonList.d.ts +26 -0
  212. package/dist/esm/components/shared/helperComponents/FieldElementButton/FieldElementButtonList.js +21 -0
  213. package/dist/esm/components/shared/helperComponents/FieldElementButton/constants.d.ts +9 -0
  214. package/dist/esm/components/shared/helperComponents/FieldElementButton/constants.js +9 -0
  215. package/dist/esm/components/shared/helperComponents/FieldElementButton/index.d.ts +4 -0
  216. package/dist/esm/components/shared/helperComponents/FieldElementButton/index.js +4 -0
  217. package/dist/esm/components/shared/helperComponents/FieldElementButton/styles.module.css +204 -0
  218. package/dist/esm/components/shared/helperComponents/FieldElementButton/types.d.ts +4 -0
  219. package/dist/esm/components/shared/helperComponents/FieldElementButton/types.js +1 -0
  220. package/dist/esm/components/shared/helperComponents/FieldShell/FieldShell.d.ts +43 -0
  221. package/dist/esm/components/shared/helperComponents/FieldShell/FieldShell.js +16 -0
  222. package/dist/esm/components/shared/helperComponents/FieldShell/index.d.ts +1 -0
  223. package/dist/esm/components/shared/helperComponents/FieldShell/index.js +1 -0
  224. package/dist/esm/components/shared/helperComponents/FieldShell/styles.module.css +11 -0
  225. package/dist/esm/components/shared/hooks/useCopyButton.d.ts +20 -0
  226. package/dist/esm/components/shared/hooks/useCopyButton.js +55 -0
  227. package/dist/esm/components/shared/index.d.ts +4 -0
  228. package/dist/esm/components/shared/index.js +4 -0
  229. package/dist/esm/components/shared/styles.module.css +673 -0
  230. package/dist/esm/components/shared/utils.d.ts +69 -0
  231. package/dist/esm/components/shared/utils.js +91 -0
  232. package/dist/esm/constants.d.ts +61 -0
  233. package/dist/esm/constants.js +73 -0
  234. package/dist/esm/hooks/index.d.ts +1 -0
  235. package/dist/esm/hooks/index.js +1 -0
  236. package/dist/esm/hooks/useAdaptiveAutoFocus.d.ts +7 -0
  237. package/dist/esm/hooks/useAdaptiveAutoFocus.js +7 -0
  238. package/dist/esm/index.d.ts +3 -0
  239. package/dist/esm/index.js +3 -0
  240. package/dist/esm/segments/index.d.ts +2 -0
  241. package/dist/esm/segments/index.js +2 -0
  242. package/dist/esm/segments/segments.d.ts +22 -0
  243. package/dist/esm/segments/segments.js +43 -0
  244. package/dist/esm/segments/useSegmentedMask.d.ts +43 -0
  245. package/dist/esm/segments/useSegmentedMask.js +279 -0
  246. package/dist/esm/style.css +1350 -0
  247. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  248. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  249. package/package.json +62 -0
  250. package/src/components/FieldColor/FieldColor.tsx +426 -0
  251. package/src/components/FieldColor/index.ts +1 -0
  252. package/src/components/FieldColor/styles.module.scss +120 -0
  253. package/src/components/FieldColor/utils.ts +17 -0
  254. package/src/components/FieldCombo/FieldCombo.tsx +495 -0
  255. package/src/components/FieldCombo/index.ts +1 -0
  256. package/src/components/FieldDate/FieldDate.tsx +658 -0
  257. package/src/components/FieldDate/constants.ts +11 -0
  258. package/src/components/FieldDate/index.ts +3 -0
  259. package/src/components/FieldDate/mask.ts +123 -0
  260. package/src/components/FieldDate/styles.module.scss +56 -0
  261. package/src/components/FieldDate/types.ts +124 -0
  262. package/src/components/FieldDate/utils.ts +7 -0
  263. package/src/components/FieldSecure/FieldSecure.tsx +398 -0
  264. package/src/components/FieldSecure/index.ts +1 -0
  265. package/src/components/FieldSelect/FieldSelect.tsx +689 -0
  266. package/src/components/FieldSelect/constants.ts +4 -0
  267. package/src/components/FieldSelect/index.ts +3 -0
  268. package/src/components/FieldSelect/styles.module.scss +104 -0
  269. package/src/components/FieldSelect/types.ts +212 -0
  270. package/src/components/FieldSelect/utils.ts +134 -0
  271. package/src/components/FieldSlider/FieldSlider.tsx +502 -0
  272. package/src/components/FieldSlider/index.ts +2 -0
  273. package/src/components/FieldSlider/styles.module.scss +47 -0
  274. package/src/components/FieldSlider/types.ts +5 -0
  275. package/src/components/FieldSlider/utils/generateAllowedValues.ts +13 -0
  276. package/src/components/FieldSlider/utils/getClosestMark.ts +21 -0
  277. package/src/components/FieldSlider/utils/getMarkLabel.ts +7 -0
  278. package/src/components/FieldSlider/utils/getTextFieldValue.ts +8 -0
  279. package/src/components/FieldSlider/utils/index.ts +5 -0
  280. package/src/components/FieldSlider/utils/isMarkObject.ts +7 -0
  281. package/src/components/FieldStepper/FieldStepper.tsx +457 -0
  282. package/src/components/FieldStepper/index.ts +1 -0
  283. package/src/components/FieldStepper/styles.module.scss +98 -0
  284. package/src/components/FieldStepper/utils.ts +44 -0
  285. package/src/components/FieldText/FieldText.tsx +27 -0
  286. package/src/components/FieldText/index.ts +1 -0
  287. package/src/components/FieldTextArea/FieldTextArea.tsx +374 -0
  288. package/src/components/FieldTextArea/index.ts +1 -0
  289. package/src/components/FieldTextArea/styles.module.scss +192 -0
  290. package/src/components/FieldTime/FieldTime.tsx +401 -0
  291. package/src/components/FieldTime/index.ts +2 -0
  292. package/src/components/FieldTime/mask.ts +22 -0
  293. package/src/components/FieldTime/styles.module.scss +3 -0
  294. package/src/components/index.ts +14 -0
  295. package/src/components/shared/helperComponents/FieldElementButton/FieldElementButton.tsx +127 -0
  296. package/src/components/shared/helperComponents/FieldElementButton/FieldElementButtonList.tsx +72 -0
  297. package/src/components/shared/helperComponents/FieldElementButton/constants.ts +10 -0
  298. package/src/components/shared/helperComponents/FieldElementButton/index.ts +4 -0
  299. package/src/components/shared/helperComponents/FieldElementButton/styles.module.scss +137 -0
  300. package/src/components/shared/helperComponents/FieldElementButton/types.ts +6 -0
  301. package/src/components/shared/helperComponents/FieldShell/FieldShell.tsx +100 -0
  302. package/src/components/shared/helperComponents/FieldShell/index.ts +1 -0
  303. package/src/components/shared/helperComponents/FieldShell/styles.module.scss +13 -0
  304. package/src/components/shared/hooks/useCopyButton.tsx +103 -0
  305. package/src/components/shared/index.ts +4 -0
  306. package/src/components/shared/styles.module.scss +409 -0
  307. package/src/components/shared/utils.ts +128 -0
  308. package/src/constants.ts +73 -0
  309. package/src/hooks/index.ts +1 -0
  310. package/src/hooks/useAdaptiveAutoFocus.ts +16 -0
  311. package/src/index.ts +3 -0
  312. package/src/segments/index.ts +2 -0
  313. package/src/segments/segments.ts +74 -0
  314. package/src/segments/useSegmentedMask.ts +361 -0
@@ -0,0 +1,13 @@
1
+ export function generateAllowedValues(min, max, step) {
2
+ // step <= 0 (или null) дал бы бесконечный цикл — снэп к шкале невозможен, возвращаем только min.
3
+ if (step === null || step <= 0) {
4
+ return [min];
5
+ }
6
+ const values = [];
7
+ let current = min;
8
+ while (current <= max) {
9
+ values.push(parseFloat(current.toFixed(10)));
10
+ current += step;
11
+ }
12
+ return values;
13
+ }
@@ -0,0 +1,4 @@
1
+ export declare function getClosestMark<T>(value: number, marks: T[], getMarkValue: (value: T) => number): {
2
+ lowestDiff: number;
3
+ mark: T;
4
+ } | undefined;
@@ -0,0 +1,13 @@
1
+ function getDiff(value, mark) {
2
+ return Math.abs(mark - value);
3
+ }
4
+ export function getClosestMark(value, marks, getMarkValue) {
5
+ if (marks.length === 0) {
6
+ return undefined;
7
+ }
8
+ const [first, ...others] = marks;
9
+ return others.reduce((acc, mark) => {
10
+ const diff = getDiff(value, getMarkValue(mark));
11
+ return diff < acc.lowestDiff ? { lowestDiff: diff, mark } : acc;
12
+ }, { lowestDiff: getDiff(value, getMarkValue(first)), mark: first });
13
+ }
@@ -0,0 +1,2 @@
1
+ import { ReactNode } from 'react';
2
+ export declare function getMarkLabel(mark: unknown): ReactNode;
@@ -0,0 +1,4 @@
1
+ import { isMarkObject } from './isMarkObject.js';
2
+ export function getMarkLabel(mark) {
3
+ return isMarkObject(mark) ? mark.label : mark;
4
+ }
@@ -0,0 +1,2 @@
1
+ import { SliderValue, TextInputFormatter } from '../types.js';
2
+ export declare function getTextFieldValue(value: SliderValue, textInputFormatter?: TextInputFormatter): string;
@@ -0,0 +1,6 @@
1
+ export function getTextFieldValue(value, textInputFormatter) {
2
+ if (Array.isArray(value)) {
3
+ return value.map(v => (textInputFormatter ? textInputFormatter(v) : String(v))).join(' – ');
4
+ }
5
+ return textInputFormatter ? textInputFormatter(value) : String(value);
6
+ }
@@ -0,0 +1,5 @@
1
+ export * from './generateAllowedValues.js';
2
+ export * from './getClosestMark.js';
3
+ export * from './getMarkLabel.js';
4
+ export * from './getTextFieldValue.js';
5
+ export * from './isMarkObject.js';
@@ -0,0 +1,5 @@
1
+ export * from './generateAllowedValues.js';
2
+ export * from './getClosestMark.js';
3
+ export * from './getMarkLabel.js';
4
+ export * from './getTextFieldValue.js';
5
+ export * from './isMarkObject.js';
@@ -0,0 +1,6 @@
1
+ import { ReactNode } from 'react';
2
+ type MarkObject = {
3
+ label: ReactNode;
4
+ };
5
+ export declare function isMarkObject(mark: unknown): mark is MarkObject;
6
+ export {};
@@ -0,0 +1,3 @@
1
+ export function isMarkObject(mark) {
2
+ return Boolean(mark && typeof mark === 'object' && 'label' in mark);
3
+ }
@@ -0,0 +1,81 @@
1
+ import { FieldDecoratorProps } from '@cloud-ru/ds-field-decorator';
2
+ import { TooltipProps } from '@cloud-ru/ds-tooltip';
3
+ import { ChangeEvent, FocusEvent, ReactNode } from 'react';
4
+ import { FieldLayoutPresets } from '../../hooks/index.js';
5
+ type FieldStepperDecoratorProps = Omit<FieldDecoratorProps, 'children'>;
6
+ type FieldStepperOwnProps = {
7
+ /** CSS-класс корня `FieldDecorator` */
8
+ className?: string;
9
+ /** CSS-класс оболочки поля */
10
+ fieldClassName?: string;
11
+ /** Значение (controlled-режим) */
12
+ value?: number;
13
+ /** Начальное значение (uncontrolled-режим). По умолчанию выводится из `min`/`max`. */
14
+ defaultValue?: number;
15
+ /** Колбек смены значения. Второй аргумент — событие, если изменение пришло из ручного ввода. */
16
+ onChange?(value: number, event?: ChangeEvent<HTMLInputElement>): void;
17
+ /** Минимум */
18
+ min?: number;
19
+ /** Максимум */
20
+ max?: number;
21
+ /**
22
+ * Шаг приращения
23
+ * @default 1
24
+ */
25
+ step?: number;
26
+ /**
27
+ * Разрешить ввод значений вне `min`/`max`. Если `false`, на blur значение клампится.
28
+ * @default true
29
+ */
30
+ allowMoreThanLimits?: boolean;
31
+ /** Поле выключено */
32
+ disabled?: boolean;
33
+ /** Только для чтения */
34
+ readonly?: boolean;
35
+ /** HTML id */
36
+ id?: string;
37
+ /** HTML name */
38
+ name?: string;
39
+ /** Автофокус. На mobile выключается адаптивно (см. `layoutPresets`) */
40
+ autoFocus?: boolean;
41
+ /**
42
+ * Переопределение адаптивных дефолтов по раскладке. Участвует `autoFocus`: на mobile он выключен
43
+ * (открывает клавиатуру без действия). Вернуть на mobile — `layoutPresets={{ mobile: { autoFocus: true } }}`.
44
+ */
45
+ layoutPresets?: FieldLayoutPresets;
46
+ /**
47
+ * Фон поля (acrylic)
48
+ * @default true
49
+ */
50
+ background?: boolean;
51
+ /**
52
+ * Показывать кнопку копирования значения (видна в readonly, при `!disabled`).
53
+ * @default true
54
+ */
55
+ showCopyButton?: boolean;
56
+ /** Колбек после успешного копирования значения. */
57
+ onCopyButtonClick?(): void;
58
+ /** Префикс — текст или иконка слева от значения */
59
+ prefix?: ReactNode;
60
+ /** Постфикс — текст или иконка справа от значения (например, единица измерения) */
61
+ postfix?: ReactNode;
62
+ /** Тултип над кнопкой `+` */
63
+ plusButtonTooltip?: TooltipProps;
64
+ /** Тултип над кнопкой `−` */
65
+ minusButtonTooltip?: TooltipProps;
66
+ /**
67
+ * Тексты тултипа клампа (показывается на 2с после blur с выходом за `min`/`max`).
68
+ * @default { min: 'Значение должно быть больше либо равно {value}', max: 'Значение должно быть меньше либо равно {value}' }
69
+ */
70
+ clampTooltipText?: {
71
+ min?: (value: number) => string;
72
+ max?: (value: number) => string;
73
+ };
74
+ /** Колбек фокуса */
75
+ onFocus?(event: FocusEvent<HTMLInputElement>): void;
76
+ /** Колбек блюра */
77
+ onBlur?(event: FocusEvent<HTMLInputElement>): void;
78
+ };
79
+ export type FieldStepperProps = FieldStepperDecoratorProps & FieldStepperOwnProps;
80
+ export declare const FieldStepper: import("react").ForwardRefExoticComponent<FieldStepperDecoratorProps & FieldStepperOwnProps & import("react").RefAttributes<HTMLInputElement>>;
81
+ export {};
@@ -0,0 +1,154 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from '@cloud-ru/ds-button';
3
+ import { Divider } from '@cloud-ru/ds-divider';
4
+ import { FieldDecorator, SIZE, VALIDATION_STATE } from '@cloud-ru/ds-field-decorator';
5
+ import { CheckSVG, CopySVG, MinusSVG, PlusSVG } from '@cloud-ru/ds-icons/interface/system';
6
+ import { BUTTON_SIZE_MAP, InputPrivate, TYPE } from '@cloud-ru/ds-input-private';
7
+ import { Tooltip } from '@cloud-ru/ds-tooltip';
8
+ import { extractSupportProps, useValueControl } from '@cloud-ru/ds-utils';
9
+ import cn from 'classnames';
10
+ import mergeRefs from 'merge-refs';
11
+ import { forwardRef, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
12
+ import { TEST_IDS } from '../../constants.js';
13
+ import { useAdaptiveAutoFocus } from '../../hooks/index.js';
14
+ import { copyTextToClipboard, FieldElementButton, getAcrylicProps, VARIANT } from '../shared/index.js';
15
+ import fieldStyles from '../shared/styles.module.css';
16
+ import styles from './styles.module.css';
17
+ import { applyStep, clamp, defaultClampMaxText, defaultClampMinText, getDefaultValue } from './utils.js';
18
+ export const FieldStepper = forwardRef(function FieldStepper({ label = '', labelTooltip, caption, hint, error, validationState = VALIDATION_STATE.Default, showHintIcon, length, required, size = SIZE.M, className, fieldClassName, background = true, showCopyButton = true, onCopyButtonClick, value: valueProp, defaultValue, onChange, min, max, step = 1, allowMoreThanLimits = true, disabled, readonly: readOnly, id, name, autoFocus, layoutPresets, prefix, postfix, plusButtonTooltip, minusButtonTooltip, clampTooltipText, onFocus, onBlur, 'data-test-id': dataTestId, ...rest }, ref) {
19
+ const localRef = useRef(null);
20
+ const copyButtonRef = useRef(null);
21
+ const [focusVisible, setFocusVisible] = useState(false);
22
+ const [hover, setHover] = useState(false);
23
+ const [clampTooltip, setClampTooltip] = useState(null);
24
+ const [copied, setCopied] = useState(false);
25
+ const clampTimerRef = useRef(undefined);
26
+ const copiedTimerRef = useRef(undefined);
27
+ const resolvedAutoFocus = useAdaptiveAutoFocus(autoFocus, layoutPresets);
28
+ useEffect(() => () => {
29
+ if (clampTimerRef.current) {
30
+ clearTimeout(clampTimerRef.current);
31
+ }
32
+ if (copiedTimerRef.current) {
33
+ clearTimeout(copiedTimerRef.current);
34
+ }
35
+ }, []);
36
+ // controlled/uncontrolled: внутреннее состояние при отсутствии `value`; событие в `onChange`
37
+ // (ручной ввод) пробрасываем сами, useValueControl передаёт только значение.
38
+ const [value = getDefaultValue(min, max), setValue] = useValueControl({ value: valueProp, defaultValue });
39
+ const effectiveValidationState = useMemo(() => (error ? VALIDATION_STATE.Error : validationState), [error, validationState]);
40
+ const isMinusDisabled = (typeof min === 'number' && value <= min) || disabled || readOnly;
41
+ const isPlusDisabled = (typeof max === 'number' && value >= max) || disabled || readOnly;
42
+ // Кнопки −/+ и ручной ввод приводятся к единой модели относительно `allowMoreThanLimits`:
43
+ // при `false` значение клампится сразу, при `true` остаётся как есть (кламп откладывается до blur).
44
+ const emitValue = useCallback((next, event) => {
45
+ const resolved = allowMoreThanLimits ? next : clamp(next, min, max);
46
+ setValue(resolved);
47
+ onChange?.(resolved, event);
48
+ }, [allowMoreThanLimits, max, min, onChange, setValue]);
49
+ const handleMinus = useCallback(() => {
50
+ emitValue(applyStep(value, -step));
51
+ }, [emitValue, step, value]);
52
+ const handlePlus = useCallback(() => {
53
+ emitValue(applyStep(value, step));
54
+ }, [emitValue, step, value]);
55
+ const handleInputChange = useCallback((raw, event) => {
56
+ if (raw === '' || raw === '-') {
57
+ return;
58
+ }
59
+ const parsed = Number(raw);
60
+ if (Number.isNaN(parsed)) {
61
+ return;
62
+ }
63
+ // Во время набора значение не клампим даже при allowMoreThanLimits=false —
64
+ // кламп откладывается до blur (паритет с легаси), там же показывается clampTooltip.
65
+ setValue(parsed);
66
+ onChange?.(parsed, event);
67
+ }, [onChange, setValue]);
68
+ const showClampTooltip = useCallback((message) => {
69
+ setClampTooltip(message);
70
+ if (clampTimerRef.current) {
71
+ clearTimeout(clampTimerRef.current);
72
+ }
73
+ clampTimerRef.current = setTimeout(() => setClampTooltip(null), 2000);
74
+ }, []);
75
+ const handleBlur = useCallback((event) => {
76
+ if (!allowMoreThanLimits) {
77
+ if (typeof max === 'number' && value > max) {
78
+ setValue(max);
79
+ onChange?.(max);
80
+ showClampTooltip((clampTooltipText?.max ?? defaultClampMaxText)(max));
81
+ }
82
+ else if (typeof min === 'number' && value < min) {
83
+ setValue(min);
84
+ onChange?.(min);
85
+ showClampTooltip((clampTooltipText?.min ?? defaultClampMinText)(min));
86
+ }
87
+ }
88
+ onBlur?.(event);
89
+ }, [allowMoreThanLimits, clampTooltipText, max, min, onBlur, onChange, setValue, showClampTooltip, value]);
90
+ const handleFocus = useCallback((event) => {
91
+ setFocusVisible(event.target.matches(':focus-visible'));
92
+ if (clampTimerRef.current) {
93
+ clearTimeout(clampTimerRef.current);
94
+ }
95
+ setClampTooltip(null);
96
+ onFocus?.(event);
97
+ }, [onFocus]);
98
+ // Ширина инпута по числу символов значения (минимум 2ch), задаётся через `ch`-юниты в CSS-переменной —
99
+ // без px-хардкода и подгонки под ширину глифа.
100
+ const inputWidthCh = Math.max(2, String(value).length);
101
+ const handleMouseEnter = useCallback(() => {
102
+ if (!readOnly) {
103
+ setHover(true);
104
+ }
105
+ }, [readOnly]);
106
+ const handleMouseLeave = useCallback(() => {
107
+ setHover(false);
108
+ }, []);
109
+ const showCopyUi = Boolean(showCopyButton && readOnly && !disabled);
110
+ const handleCopy = useCallback((event) => {
111
+ event.preventDefault();
112
+ event.stopPropagation();
113
+ copyTextToClipboard(String(value)).then(copied => {
114
+ if (!copied) {
115
+ return;
116
+ }
117
+ onCopyButtonClick?.();
118
+ setCopied(true);
119
+ if (copiedTimerRef.current) {
120
+ clearTimeout(copiedTimerRef.current);
121
+ }
122
+ copiedTimerRef.current = setTimeout(() => setCopied(false), 2000);
123
+ });
124
+ }, [onCopyButtonClick, value]);
125
+ // Клавиатурный путь к copy в readonly (кнопка с tabIndex −1 недостижима по Tab): ArrowRight из
126
+ // инпута → copy, ArrowLeft с copy → назад. input type=number не даёт selection API — гейт только
127
+ // по readonly. Кнопки −/+ остаются вне пути (tabIndex −1, паритет с легаси ButtonFunction).
128
+ const handleInputKeyDown = useCallback((event) => {
129
+ if (event.key === 'ArrowRight' && readOnly && showCopyUi && copyButtonRef.current) {
130
+ event.preventDefault();
131
+ copyButtonRef.current.focus();
132
+ }
133
+ }, [readOnly, showCopyUi]);
134
+ const handleCopyButtonKeyDown = useCallback((event) => {
135
+ if (event.key === 'ArrowLeft') {
136
+ event.preventDefault();
137
+ localRef.current?.focus();
138
+ }
139
+ }, []);
140
+ const renderStepButton = (variant) => {
141
+ const isMinus = variant === 'minus';
142
+ const tooltip = isMinus ? minusButtonTooltip : plusButtonTooltip;
143
+ const button = (_jsx(FieldElementButton, { variant: isMinus ? VARIANT.Before : VARIANT.After, size: size, action: isMinus ? _jsx(MinusSVG, {}) : _jsx(PlusSVG, {}), onClick: isMinus ? handleMinus : handlePlus, disabled: isMinus ? isMinusDisabled : isPlusDisabled, tabIndex: -1, "data-test-id": isMinus ? TEST_IDS.fieldStepperMinus : TEST_IDS.fieldStepperPlus }));
144
+ return tooltip ? (_jsx(Tooltip, { ...tooltip, triggerClassName: styles.stepButtonTrigger, children: button })) : (button);
145
+ };
146
+ const shell = (_jsxs("div", { className: cn(fieldStyles.fieldWrapper, fieldClassName), "data-size": size, "data-validation-state": effectiveValidationState, "data-disabled": disabled || undefined, "data-readonly": readOnly || undefined, "data-withbackground": background || undefined, "data-focusvisible": focusVisible || undefined, "data-hover": !readOnly && hover ? true : undefined, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, children: [_jsxs("div", { className: fieldStyles.backgroundWrapper, children: [_jsx("div", { className: fieldStyles.materialLayer, ...getAcrylicProps({
147
+ validationState: effectiveValidationState,
148
+ disabled,
149
+ readonly: readOnly,
150
+ hover,
151
+ focusVisible,
152
+ }), children: _jsx("div", { className: fieldStyles.acrylicBg, "aria-hidden": true }) }), _jsx("div", { className: fieldStyles.borderStateLayer, "data-state": 'borderOnBackground' }), _jsx("div", { className: fieldStyles.focusLayer })] }), _jsxs("div", { className: fieldStyles.elementWrapperBefore, children: [renderStepButton('minus'), _jsx("div", { className: fieldStyles.lineWrapper, "data-outline": background || undefined, children: _jsx(Divider, { orientation: 'vertical', variant: 'regular' }) })] }), _jsx("div", { className: fieldStyles.fieldContainer, children: _jsx("div", { className: fieldStyles.contentWrapper, children: _jsxs("div", { className: styles.valueArea, children: [prefix && _jsx("span", { className: styles.affix, children: prefix }), _jsx("div", { className: styles.inputWrapper, style: { '--field-stepper-input-ch': inputWidthCh }, children: _jsx(InputPrivate, { ref: mergeRefs(ref, localRef), className: cn(fieldStyles.fieldInput, styles.input), value: String(value), type: TYPE.Number, disabled: disabled, readonly: readOnly, onChange: handleInputChange, onFocus: handleFocus, onBlur: handleBlur, onKeyDown: handleInputKeyDown, id: id, name: name, min: min, max: max, step: step, autoFocus: resolvedAutoFocus, "data-test-id": TEST_IDS.fieldStepperInput, ...extractSupportProps(rest) }) }), postfix && _jsx("span", { className: styles.affix, children: postfix })] }) }) }), _jsxs("div", { className: fieldStyles.elementWrapperAfter, children: [showCopyUi && (_jsx("span", { className: styles.copyButton, children: _jsx(Button, { innerRef: copyButtonRef, type: 'button', view: 'function', appearance: 'neutral', size: BUTTON_SIZE_MAP[size], icon: copied ? _jsx(CheckSVG, {}) : _jsx(CopySVG, {}), onClick: handleCopy, onKeyDown: handleCopyButtonKeyDown, tabIndex: -1, "data-test-id": TEST_IDS.fieldStepperCopyButton }) })), _jsx("div", { className: fieldStyles.lineWrapper, "data-outline": background || undefined, children: _jsx(Divider, { orientation: 'vertical', variant: 'regular' }) }), renderStepButton('plus')] })] }));
153
+ return (_jsx(FieldDecorator, { className: className, label: label, labelTooltip: labelTooltip, caption: caption, hint: hint, error: error, validationState: effectiveValidationState, showHintIcon: showHintIcon, length: length, required: required, labelFor: id, disabled: disabled, readonly: readOnly, size: size, "data-test-id": dataTestId, children: clampTooltip ? (_jsx(Tooltip, { tip: clampTooltip, open: true, "data-test-id": TEST_IDS.fieldStepperLimitTooltip, children: shell })) : (shell) }));
154
+ });
@@ -0,0 +1 @@
1
+ export * from './FieldStepper.js';
@@ -0,0 +1 @@
1
+ export * from './FieldStepper.js';
@@ -0,0 +1,78 @@
1
+ .stepButtonTrigger{
2
+ display:flex;
3
+ align-items:stretch;
4
+ height:100%;
5
+ }
6
+
7
+ .copyButton{
8
+ display:flex;
9
+ align-items:center;
10
+ height:100%;
11
+ }
12
+
13
+ .valueArea{
14
+ display:flex;
15
+ flex:1 1 auto;
16
+ align-items:baseline;
17
+ justify-content:center;
18
+ min-width:0;
19
+ color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
20
+ text-align:center;
21
+ }
22
+ [data-size=s] .valueArea{
23
+ gap:var(--sn-field-anatomy-size-s-fieldContainer-contentWrapper-inputLine-gap, var(--sn-density-spacing-control-wrapper-horizontal-s, var(--sn-primitive-dimension-8, 8px)));
24
+ }
25
+ [data-size=m] .valueArea{
26
+ gap:var(--sn-field-anatomy-size-s-fieldContainer-contentWrapper-inputLine-gap, var(--sn-density-spacing-control-wrapper-horizontal-s, var(--sn-primitive-dimension-8, 8px)));
27
+ }
28
+ [data-size=l] .valueArea{
29
+ gap:var(--sn-field-anatomy-size-l-fieldContainer-contentWrapper-inputLine-gap, var(--sn-density-spacing-control-wrapper-horizontal-l, var(--sn-primitive-dimension-12, 12px)));
30
+ }
31
+
32
+ .inputWrapper{
33
+ display:flex;
34
+ flex:0 0 auto;
35
+ width:calc((var(--field-stepper-input-ch, 2) + 1) * 1ch);
36
+ max-width:100%;
37
+ }
38
+
39
+ .input{
40
+ flex:0 0 auto;
41
+ width:100%;
42
+ min-width:1ch;
43
+ text-align:center;
44
+ -moz-appearance:textfield;
45
+ }
46
+ .input::-webkit-outer-spin-button, .input::-webkit-inner-spin-button{
47
+ margin:0;
48
+ -webkit-appearance:none;
49
+ }
50
+
51
+ .affix{
52
+ flex-shrink:0;
53
+ color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(65, 66, 78, 0.5490196078)));
54
+ }
55
+ [data-size=s] .affix{
56
+ font-family:var(--sn-regular-body-s-fontFamily, var(--sn-brand-font-fontFamily-regular-body, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
57
+ font-weight:var(--sn-regular-body-s-fontWeight, var(--sn-theme-typography-fontWeight-regular-body-s, var(--sn-brand-font-fontWeight-light-regular-body-s, var(--sn-primitive-font-fontWeightValue-400, 400))));
58
+ line-height:var(--sn-regular-body-s-lineHeight, var(--sn-density-typography-roleBody-lineHeightS, var(--sn-primitive-font-lineHeight-by14, 20px)));
59
+ font-size:var(--sn-regular-body-s-fontSize, var(--sn-density-typography-roleBody-fontSizeS, var(--sn-primitive-font-fontSize-14, 14px)));
60
+ letter-spacing:var(--sn-regular-body-s-letterSpacing, var(--sn-primitive-font-letterSpacing-m, 0.1px));
61
+ paragraph-spacing:var(--sn-regular-body-s-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize12, 6px));
62
+ }
63
+ [data-size=m] .affix{
64
+ font-family:var(--sn-regular-body-m-fontFamily, var(--sn-brand-font-fontFamily-regular-body, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
65
+ font-weight:var(--sn-regular-body-m-fontWeight, var(--sn-theme-typography-fontWeight-regular-body-m, var(--sn-brand-font-fontWeight-light-regular-body-m, var(--sn-primitive-font-fontWeightValue-400, 400))));
66
+ line-height:var(--sn-regular-body-m-lineHeight, var(--sn-density-typography-roleBody-lineHeightM, var(--sn-primitive-font-lineHeight-by16, 24px)));
67
+ font-size:var(--sn-regular-body-m-fontSize, var(--sn-density-typography-roleBody-fontSizeM, var(--sn-primitive-font-fontSize-16, 16px)));
68
+ letter-spacing:var(--sn-regular-body-m-letterSpacing, var(--sn-primitive-font-letterSpacing-m, 0.1px));
69
+ paragraph-spacing:var(--sn-regular-body-m-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize14, 7px));
70
+ }
71
+ [data-size=l] .affix{
72
+ font-family:var(--sn-regular-body-l-fontFamily, var(--sn-brand-font-fontFamily-regular-body, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
73
+ font-weight:var(--sn-regular-body-l-fontWeight, var(--sn-theme-typography-fontWeight-regular-body-l, var(--sn-brand-font-fontWeight-light-regular-body-l, var(--sn-primitive-font-fontWeightValue-400, 400))));
74
+ line-height:var(--sn-regular-body-l-lineHeight, var(--sn-density-typography-roleBody-lineHeightL, var(--sn-primitive-font-lineHeight-by20, 28px)));
75
+ font-size:var(--sn-regular-body-l-fontSize, var(--sn-density-typography-roleBody-fontSizeL, var(--sn-primitive-font-fontSize-20, 20px)));
76
+ letter-spacing:var(--sn-regular-body-l-letterSpacing, var(--sn-primitive-font-letterSpacing-m, 0.1px));
77
+ paragraph-spacing:var(--sn-regular-body-l-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize16, 8px));
78
+ }
@@ -0,0 +1,14 @@
1
+ /** Начальное значение для uncontrolled-режима: выводится из `min`/`max`, иначе `0`. */
2
+ export declare function getDefaultValue(min?: number, max?: number): number;
3
+ /** Зажимает значение в диапазон `[min, max]` (границы опциональны). */
4
+ export declare function clamp(value: number, min?: number, max?: number): number;
5
+ /** Приращение значения на `step` с компенсацией погрешности float (округление до 10 знаков). */
6
+ export declare function applyStep(value: number, step: number): number;
7
+ /**
8
+ * Дефолтный текст тултипа клампа для нижней границы.
9
+ */
10
+ export declare function defaultClampMinText(value: number): string;
11
+ /**
12
+ * Дефолтный текст тултипа клампа для верхней границы.
13
+ */
14
+ export declare function defaultClampMaxText(value: number): string;
@@ -0,0 +1,38 @@
1
+ /** Начальное значение для uncontrolled-режима: выводится из `min`/`max`, иначе `0`. */
2
+ export function getDefaultValue(min, max) {
3
+ if (typeof min === 'number' && min > 0) {
4
+ return min;
5
+ }
6
+ if (typeof max === 'number' && max < 0) {
7
+ return max;
8
+ }
9
+ return 0;
10
+ }
11
+ /** Зажимает значение в диапазон `[min, max]` (границы опциональны). */
12
+ export function clamp(value, min, max) {
13
+ let next = value;
14
+ if (typeof min === 'number') {
15
+ next = Math.max(next, min);
16
+ }
17
+ if (typeof max === 'number') {
18
+ next = Math.min(next, max);
19
+ }
20
+ return next;
21
+ }
22
+ /** Приращение значения на `step` с компенсацией погрешности float (округление до 10 знаков). */
23
+ export function applyStep(value, step) {
24
+ const sum = value + step;
25
+ return Number(sum.toFixed(10));
26
+ }
27
+ /**
28
+ * Дефолтный текст тултипа клампа для нижней границы.
29
+ */
30
+ export function defaultClampMinText(value) {
31
+ return `Значение должно быть больше либо равно ${value}`;
32
+ }
33
+ /**
34
+ * Дефолтный текст тултипа клампа для верхней границы.
35
+ */
36
+ export function defaultClampMaxText(value) {
37
+ return `Значение должно быть меньше либо равно ${value}`;
38
+ }
@@ -0,0 +1,11 @@
1
+ import { FieldComboProps } from '../FieldCombo/index.js';
2
+ /**
3
+ * Пропсы простого текстового поля. От `FieldCombo` отличается отсутствием слотов:
4
+ * префикса, постфикса, иконок и кнопок-сегментов. Нужен слот — берите `FieldCombo`.
5
+ */
6
+ export type FieldTextProps = Omit<FieldComboProps, 'prefix' | 'postfix' | 'iconBefore' | 'iconAfter' | 'prefixIcon' | 'elementBefore' | 'elementAfter' | 'innerTestIds'>;
7
+ /**
8
+ * Текстовое поле: заголовок, подсказка, плейсхолдер, значение и кнопки очистки и копирования.
9
+ * Слоты вокруг строки ввода не поддерживает — для них есть `FieldCombo`.
10
+ */
11
+ export declare const FieldText: import("react").ForwardRefExoticComponent<Omit<FieldTextProps, "ref"> & import("react").RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from 'react';
3
+ import { TEST_IDS } from '../../constants.js';
4
+ import { FieldCombo } from '../FieldCombo/index.js';
5
+ /**
6
+ * Текстовое поле: заголовок, подсказка, плейсхолдер, значение и кнопки очистки и копирования.
7
+ * Слоты вокруг строки ввода не поддерживает — для них есть `FieldCombo`.
8
+ */
9
+ export const FieldText = forwardRef(function FieldText(props, ref) {
10
+ return (_jsx(FieldCombo, { ...props, ref: ref, innerTestIds: { shell: TEST_IDS.fieldTextShell, input: TEST_IDS.fieldTextInput } }));
11
+ });
@@ -0,0 +1 @@
1
+ export * from './FieldText.js';
@@ -0,0 +1 @@
1
+ export * from './FieldText.js';
@@ -0,0 +1,95 @@
1
+ import { FieldDecoratorProps } from '@cloud-ru/ds-field-decorator';
2
+ import { ChangeEvent, FocusEvent, HTMLAttributes, KeyboardEvent, ReactNode } from 'react';
3
+ import { FieldLayoutPresets } from '../../hooks/index.js';
4
+ type FieldTextAreaDecoratorProps = Omit<FieldDecoratorProps, 'children'>;
5
+ type FieldTextAreaOwnProps = {
6
+ /** CSS-класс корня `FieldDecorator` */
7
+ className?: string;
8
+ /** CSS-класс оболочки поля */
9
+ fieldClassName?: string;
10
+ /** Значение (controlled-режим) */
11
+ value?: string;
12
+ /** Начальное значение (uncontrolled-режим) */
13
+ defaultValue?: string;
14
+ /** Колбек смены значения */
15
+ onChange?(value: string, event?: ChangeEvent<HTMLTextAreaElement>): void;
16
+ /** Плейсхолдер */
17
+ placeholder?: string;
18
+ /** HTML id */
19
+ id?: string;
20
+ /** HTML name */
21
+ name?: string;
22
+ /** Максимальное количество символов */
23
+ maxLength?: number;
24
+ /** Поле выключено */
25
+ disabled?: boolean;
26
+ /** Только для чтения */
27
+ readonly?: boolean;
28
+ /** Автофокус. На mobile выключается адаптивно (см. `layoutPresets`) */
29
+ autoFocus?: boolean;
30
+ /**
31
+ * Переопределение адаптивных дефолтов по раскладке. Участвует `autoFocus`: на mobile он выключен
32
+ * (открывает клавиатуру без действия). Вернуть на mobile — `layoutPresets={{ mobile: { autoFocus: true } }}`.
33
+ */
34
+ layoutPresets?: FieldLayoutPresets;
35
+ /** Режим виртуальной клавиатуры (`inputmode` нативного `<textarea>`) */
36
+ inputMode?: HTMLAttributes<HTMLTextAreaElement>['inputMode'];
37
+ /** Проверка орфографии */
38
+ spellCheck?: boolean;
39
+ /**
40
+ * Минимальное количество строк
41
+ * @default 3
42
+ */
43
+ minRows?: number;
44
+ /**
45
+ * Максимальное количество строк (после — появляется скролл)
46
+ * @default 1000
47
+ */
48
+ maxRows?: number;
49
+ /**
50
+ * Разрешить ввод свыше `maxLength` символов (счётчик продолжит расти).
51
+ * @default true
52
+ */
53
+ allowMoreThanMaxLength?: boolean;
54
+ /**
55
+ * Нода над textarea — ряд элементов до контента (Figma `elementWrapperBefore` /
56
+ * `slotBeforeContent`): тулбар с кнопками, чипами и т.п.
57
+ */
58
+ header?: ReactNode;
59
+ /**
60
+ * Нода под textarea — ряд элементов после контента (Figma `elementWrapperAfter` /
61
+ * `slotAfterContent`): действия, счётчик-плагин и т.п.
62
+ */
63
+ footer?: ReactNode;
64
+ /**
65
+ * Можно ли менять высоту мышкой за нижний угол. Игнорируется при `disabled` или `readonly`.
66
+ * @default false
67
+ */
68
+ resizable?: boolean;
69
+ /**
70
+ * Фон поля (acrylic)
71
+ * @default true
72
+ */
73
+ background?: boolean;
74
+ /**
75
+ * Кнопка очистки (видна при value && !readonly)
76
+ * @default true
77
+ */
78
+ showClearButton?: boolean;
79
+ /**
80
+ * Кнопка копирования (видна при value && !disabled, независимо от readonly)
81
+ * @default true
82
+ */
83
+ showCopyButton?: boolean;
84
+ /** Колбек после копирования */
85
+ onCopyButtonClick?(): void;
86
+ /** Колбек фокуса */
87
+ onFocus?(event: FocusEvent<HTMLTextAreaElement>): void;
88
+ /** Колбек блюра */
89
+ onBlur?(event: FocusEvent<HTMLTextAreaElement>): void;
90
+ /** Колбек нажатия клавиши */
91
+ onKeyDown?(event: KeyboardEvent<HTMLTextAreaElement>): void;
92
+ };
93
+ export type FieldTextAreaProps = FieldTextAreaDecoratorProps & FieldTextAreaOwnProps;
94
+ export declare const FieldTextArea: import("react").ForwardRefExoticComponent<FieldTextAreaDecoratorProps & FieldTextAreaOwnProps & import("react").RefAttributes<HTMLTextAreaElement>>;
95
+ export {};