@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,409 @@
1
+ @use '@cloud-ru/ds-figma-variables/build/scss/styles/styles.module' as base;
2
+ @use '@cloud-ru/ds-figma-variables/build/scss/components/field.module' as field;
3
+ @use '@cloud-ru/ds-materials' as m;
4
+
5
+ $sizes: 's', 'm', 'l';
6
+
7
+ .materialLayer {
8
+ @include m.with-material('acrylic', #{acrylicBg});
9
+
10
+ width: 100%;
11
+ height: 100%;
12
+ }
13
+
14
+ .acrylicBg {
15
+ pointer-events: none;
16
+ position: absolute;
17
+ inset: 0;
18
+ border-radius: inherit;
19
+ }
20
+
21
+ .borderStateLayer {
22
+ width: 100%;
23
+ height: 100%;
24
+ }
25
+
26
+ .lineWrapper {
27
+ display: flex;
28
+ align-items: center;
29
+ align-self: stretch;
30
+ }
31
+
32
+ .backgroundWrapper {
33
+ position: absolute;
34
+ display: none;
35
+ width: 100%;
36
+ height: 100%;
37
+ }
38
+
39
+ @mixin borderRadius($size) {
40
+ $borderTopLeftRadius: base.simple-var(
41
+ field.$field,
42
+ 'anatomy',
43
+ 'size',
44
+ $size,
45
+ 'fieldContainer',
46
+ 'border-top-left-radius'
47
+ );
48
+ $borderTopRightRadius: base.simple-var(
49
+ field.$field,
50
+ 'anatomy',
51
+ 'size',
52
+ $size,
53
+ 'fieldContainer',
54
+ 'border-top-right-radius'
55
+ );
56
+ $borderBottomRightRadius: base.simple-var(
57
+ field.$field,
58
+ 'anatomy',
59
+ 'size',
60
+ $size,
61
+ 'fieldContainer',
62
+ 'border-bottom-right-radius'
63
+ );
64
+ $borderBottomLeftRadius: base.simple-var(
65
+ field.$field,
66
+ 'anatomy',
67
+ 'size',
68
+ $size,
69
+ 'fieldContainer',
70
+ 'border-bottom-left-radius'
71
+ );
72
+
73
+ border-radius: $borderTopLeftRadius $borderTopRightRadius $borderBottomRightRadius $borderBottomLeftRadius;
74
+ }
75
+
76
+ .focusLayer {
77
+ position: absolute;
78
+ inset: 0;
79
+
80
+ display: none;
81
+
82
+ width: 100%;
83
+ height: 100%;
84
+
85
+ opacity: field.$sn-field-effect-focusedFrame-opacity;
86
+ outline: base.$sn-brand-anatomy-focusLine-field-strokeWeight solid base.$sn-theme-color-primary-accent;
87
+ outline-offset: 0;
88
+ }
89
+
90
+ .fieldWrapper[data-validation-state='error'] .focusLayer {
91
+ outline-color: base.$sn-theme-color-red-accent;
92
+ }
93
+
94
+ .fieldWrapper[data-validation-state='warning'] .focusLayer {
95
+ outline-color: base.$sn-theme-color-yellow-accent;
96
+ }
97
+
98
+ .fieldWrapper[data-validation-state='warning'] {
99
+ background-color: base.$sn-theme-color-yellow-background;
100
+ }
101
+
102
+ .fieldWrapper[data-validation-state='success'] .focusLayer {
103
+ outline-color: base.$sn-theme-color-green-accent;
104
+ }
105
+
106
+ .fieldInput {
107
+ flex: 1 1 0;
108
+ align-self: stretch;
109
+ min-width: 0;
110
+ color: base.$sn-theme-color-available-version-textMain;
111
+
112
+ &::placeholder {
113
+ color: base.$sn-theme-color-available-version-textDisabled;
114
+ opacity: 1;
115
+ }
116
+
117
+ // Figma-паритет: у disabled-вариантов полей слой placeholder отсутствует (disabled+empty
118
+ // не рендерит текст-подсказку). Прячем placeholder целиком, как в @cloud-ru/ds-search — единый паттерн
119
+ // disabled в DS. Иначе на `.fieldWrapper` с opacity 0.4 поверх textDisabled (α 0.4) он остаётся
120
+ // бледным «призраком».
121
+ &:disabled::placeholder {
122
+ visibility: hidden;
123
+ }
124
+ }
125
+
126
+ .clearButtonSlot,
127
+ .postfixButtonsSlot {
128
+ display: flex;
129
+ gap: base.$sn-primitive-dimension-2;
130
+ align-items: center;
131
+ justify-content: center;
132
+ }
133
+
134
+ .inputLine {
135
+ display: flex;
136
+ flex: 1 0 0;
137
+ align-items: center;
138
+ min-width: 0;
139
+ }
140
+
141
+ .prefix,
142
+ .postfix {
143
+ flex-shrink: 0;
144
+ color: base.$sn-theme-color-available-version-textTertiary;
145
+ }
146
+
147
+ .postfix {
148
+ text-align: right;
149
+ }
150
+
151
+ .inputArea {
152
+ display: flex;
153
+ flex: 1 0 0;
154
+ align-items: center;
155
+ min-width: 0;
156
+ }
157
+
158
+ .iconSlot {
159
+ display: flex;
160
+ flex-shrink: 0;
161
+ align-items: center;
162
+ justify-content: center;
163
+
164
+ color: base.$sn-theme-color-available-version-textTertiary;
165
+ }
166
+
167
+ .contentWrapper {
168
+ display: flex;
169
+ align-items: center;
170
+ align-self: stretch;
171
+ width: 100%;
172
+ }
173
+
174
+ .elementWrapperBefore,
175
+ .elementWrapperAfter {
176
+ position: relative;
177
+ display: flex;
178
+ align-items: stretch;
179
+ align-self: stretch;
180
+
181
+ // Droplist оборачивает кнопку-слот в trigger-span (block, естественная высота) —
182
+ // растягиваем обёртку и кнопку на всю высоту сегмента, чтобы statelayer
183
+ // заливал buttonField до рамки поля (Figma: fill flush к border).
184
+ > * {
185
+ display: flex;
186
+ align-items: stretch;
187
+ }
188
+ }
189
+
190
+ .fieldWrapper {
191
+ position: relative;
192
+ display: flex;
193
+ flex-direction: column;
194
+ width: 100%;
195
+
196
+ // Сегментные слоты `elementBefore` / `elementAfter` — это вертикальные сегменты слева/справа
197
+ // от поля (между сегментом и инпутом стоит вертикальный `<Divider>`), поэтому при их наличии
198
+ // раскладка обёртки — строка, а не колонка. Без сегментов column безвреден: in-flow ребёнок
199
+ // только `fieldContainer` (backgroundWrapper — absolute), и направление оси не влияет.
200
+ &:has(> .elementWrapperBefore),
201
+ &:has(> .elementWrapperAfter) {
202
+ flex-direction: row;
203
+ align-items: stretch;
204
+ }
205
+
206
+ @include m.has-state-layer-as-child(#{borderStateLayer});
207
+
208
+ @each $size in $sizes {
209
+ &[data-size='#{$size}'] {
210
+ .lineWrapper {
211
+ display: none;
212
+ width: 0;
213
+ padding: base.simple-var(field.$field, 'anatomy', 'size', $size, 'elementWrapper', 'lineWrapper', 'padding')
214
+ 0;
215
+ }
216
+
217
+ .focusLayer {
218
+ @include borderRadius($size);
219
+ }
220
+
221
+ .borderStateLayer,
222
+ .materialLayer {
223
+ @include borderRadius($size);
224
+ }
225
+
226
+ .fieldContainer {
227
+ $paddingTop: base.simple-var(field.$field, 'anatomy', 'size', $size, 'fieldContainer', 'padding-top');
228
+ $paddingRight: base.simple-var(field.$field, 'anatomy', 'size', $size, 'fieldContainer', 'padding-right');
229
+ $paddingBottom: base.simple-var(field.$field, 'anatomy', 'size', $size, 'fieldContainer', 'padding-bottom');
230
+ $paddingLeft: base.simple-var(field.$field, 'anatomy', 'size', $size, 'fieldContainer', 'padding-left');
231
+
232
+ min-height: base.simple-var(field.$field, 'anatomy', 'size', $size, 'fieldContainer', 'min-height');
233
+ padding: $paddingTop $paddingRight $paddingBottom $paddingLeft;
234
+ }
235
+
236
+ .inputLine {
237
+ @include base.composite-var(
238
+ field.$field,
239
+ 'anatomy',
240
+ 'size',
241
+ $size,
242
+ 'fieldContainer',
243
+ 'contentWrapper',
244
+ 'inputLine'
245
+ );
246
+ }
247
+
248
+ .prefix,
249
+ .postfix,
250
+ .fieldInput {
251
+ @include base.composite-var(base.$sn-regular, 'body', $size);
252
+ }
253
+
254
+ .iconSlot {
255
+ max-height: base.simple-var(
256
+ field.$field,
257
+ 'anatomy',
258
+ 'size',
259
+ $size,
260
+ 'fieldContainer',
261
+ 'centeredWrapper',
262
+ 'max-height'
263
+ );
264
+
265
+ // Иконки полей (iconBefore/iconAfter + декоративные chevron/calendar/watch) масштабируются
266
+ // по размеру поля: s → icon-xs (16), m/l → icon-s (24). max-* (а не width/height) — тот же
267
+ // приём, что в @cloud-ru/ds-button: @cloud-ru/ds-icons задают инлайн `style="width:24"`, который перебивает
268
+ // обычный width, но не max-width, поэтому svg клампится к нужному размеру без JS-пропа.
269
+ svg {
270
+ $iconSlotSize: base.$sn-density-size-icon-s;
271
+
272
+ @if $size == 's' {
273
+ $iconSlotSize: base.$sn-density-size-icon-xs;
274
+ }
275
+
276
+ max-width: $iconSlotSize;
277
+ max-height: $iconSlotSize;
278
+ }
279
+ }
280
+
281
+ .clearButtonSlot,
282
+ .postfixButtonsSlot {
283
+ // Кнопки clear/copy — иконный квадрат (паритет с легаси ButtonClearValue: 16px при s,
284
+ // 24px при m/l), а не полноразмерная function-кнопка 32px. Те же icon-токены, что у .iconSlot.
285
+ // @cloud-ru/ds-button читает min-height и iconOnly-minWidth через var() (figma-variables
286
+ // button.module.scss) — локальный override сжимает кнопку до иконного квадрата без
287
+ // правки @cloud-ru/ds-button. BUTTON_SIZE_MAP (@cloud-ru/ds-input-private): field s → button s, m/l → m.
288
+ $iconSquare: base.$sn-density-size-icon-s;
289
+ $btnSize: 'm';
290
+
291
+ @if $size == 's' {
292
+ $iconSquare: base.$sn-density-size-icon-xs;
293
+ $btnSize: 's';
294
+ }
295
+
296
+ --sn-button-anatomy-size-#{$btnSize}-container-minHeight: #{$iconSquare};
297
+ --sn-button-anatomy-size-#{$btnSize}-container-iconOnly-minWidth: #{$iconSquare};
298
+
299
+ max-width: $iconSquare;
300
+ max-height: $iconSquare;
301
+
302
+ // Иконки @cloud-ru/ds-icons инлайнят style width:24 — без max-* кнопка при field s не сожмётся до 16.
303
+ svg {
304
+ max-width: $iconSquare;
305
+ max-height: $iconSquare;
306
+ }
307
+ }
308
+
309
+ &[data-withbackground='true'] {
310
+ .backgroundWrapper {
311
+ @include borderRadius($size);
312
+
313
+ display: initial;
314
+ }
315
+
316
+ .lineWrapper {
317
+ &[data-outline='true'] {
318
+ display: initial;
319
+ }
320
+ }
321
+
322
+ [data-acrylic-background] {
323
+ @include borderRadius($size);
324
+ }
325
+
326
+ &:not([data-disabled='true'])[data-focusvisible='true'] {
327
+ .focusLayer {
328
+ display: initial;
329
+ }
330
+
331
+ // Внутренний бордер поля по фокусу — accent (Figma: fieldWrapper stroke, 1px, full opacity).
332
+ // Дефолт → primary-accent; error/warning/success → цвет accent'а валидации
333
+ // (перекрытия — сразу после size-цикла, на равной специфичности по порядку источника).
334
+ & > .backgroundWrapper > .borderStateLayer[data-state='borderOnBackground'] {
335
+ border-color: base.$sn-theme-color-primary-accent;
336
+ border-width: base.simple-var(field.$field, 'anatomy', 'size', $size, 'fieldContainer', 'width');
337
+ }
338
+ }
339
+ }
340
+ }
341
+ }
342
+
343
+ // Состояния валидации сигнализируются тонировкой acrylic-фона (см. getAcrylicProps) + цветом
344
+ // подсказки/иконки в FieldDecorator. В ПОКОЕ бордер нейтральный (паритет с Figma). По ФОКУСУ
345
+ // внутренний бордер перекрашивается в accent валидации — правила ниже, после readonly-блока
346
+ // (порядок источника + no-descending-specificity).
347
+
348
+ &[data-disabled='true'] {
349
+ cursor: not-allowed;
350
+ opacity: base.$sn-theme-effect-opacity-disabled;
351
+ }
352
+
353
+ &[data-readonly='true']:not([data-disabled='true']) {
354
+ cursor: default;
355
+
356
+ .fieldInput {
357
+ color: base.$sn-theme-color-available-version-textTertiary;
358
+ }
359
+
360
+ &:active {
361
+ .borderStateLayer[data-state='borderOnBackground'] {
362
+ border-color: base.$sn-theme-color-material-stateLayer-neutral-border-default-borderColor;
363
+ }
364
+ }
365
+
366
+ @media (hover: hover) {
367
+ &:hover {
368
+ .borderStateLayer[data-state='borderOnBackground'] {
369
+ border-color: base.$sn-theme-color-material-stateLayer-neutral-border-default-borderColor;
370
+ }
371
+ }
372
+ }
373
+ }
374
+
375
+ // Внутренний бордер по фокусу в состояниях валидации — accent валидации (Figma: focused-вариант,
376
+ // fieldWrapper stroke = red/yellow/green-accent, 1px, full opacity). Идёт последним среди правил
377
+ // `.borderStateLayer[data-state='borderOnBackground']` — перекрывает primary-accent из size-цикла по
378
+ // порядку источника и не нарушает no-descending-specificity. `:not([data-disabled])` держит
379
+ // специфичность вровень с in-loop-правилом фокуса.
380
+ &[data-withbackground='true'][data-focusvisible='true'][data-validation-state='error']:not([data-disabled='true'])
381
+ > .backgroundWrapper
382
+ > .borderStateLayer[data-state='borderOnBackground'] {
383
+ border-color: base.$sn-theme-color-red-accent;
384
+ }
385
+
386
+ &[data-withbackground='true'][data-focusvisible='true'][data-validation-state='warning']:not([data-disabled='true'])
387
+ > .backgroundWrapper
388
+ > .borderStateLayer[data-state='borderOnBackground'] {
389
+ border-color: base.$sn-theme-color-yellow-accent;
390
+ }
391
+
392
+ &[data-withbackground='true'][data-focusvisible='true'][data-validation-state='success']:not([data-disabled='true'])
393
+ > .backgroundWrapper
394
+ > .borderStateLayer[data-state='borderOnBackground'] {
395
+ border-color: base.$sn-theme-color-green-accent;
396
+ }
397
+ }
398
+
399
+ .fieldContainer {
400
+ position: relative;
401
+
402
+ display: flex;
403
+ flex: 1 1 auto;
404
+ flex-direction: column;
405
+ align-items: flex-start;
406
+ justify-content: center;
407
+
408
+ min-width: 0;
409
+ }
@@ -0,0 +1,128 @@
1
+ import { SIZE, Size, VALIDATION_STATE, ValidationState } from '@cloud-ru/ds-field-decorator';
2
+ import { BUTTON_SIZE_MAP, ButtonSize, Size as InputPrivateSize } from '@cloud-ru/ds-input-private';
3
+ import { copyToClipboard, isBrowser } from '@cloud-ru/ds-utils';
4
+ import { MouseEvent } from 'react';
5
+
6
+ /**
7
+ * Копирует текст в буфер обмена (через `copyToClipboard` из `@cloud-ru/ds-utils`). Резолвится в `true`
8
+ * при успехе — поля используют это, чтобы показать индикатор «скопировано».
9
+ */
10
+ export function copyTextToClipboard(text: string): Promise<boolean> {
11
+ if (!isBrowser() || text.length === 0) {
12
+ return Promise.resolve(false);
13
+ }
14
+
15
+ return copyToClipboard(text);
16
+ }
17
+
18
+ /**
19
+ * Курсор в начале строки ввода (нет выделения, обе границы на позиции 0). Используется
20
+ * полями (`FieldCombo`, `FieldSecure`) для перевода ArrowLeft в левый слот, когда дальше
21
+ * влево по тексту двигаться некуда.
22
+ */
23
+ export const isCursorAtStart = (el: HTMLInputElement | null): boolean =>
24
+ Boolean(el && el.selectionStart === 0 && el.selectionEnd === 0);
25
+
26
+ /**
27
+ * Курсор в конце строки ввода (нет выделения, обе границы на длине значения). Используется
28
+ * полями для перевода ArrowRight в правый слот, когда дальше вправо по тексту двигаться некуда.
29
+ */
30
+ export const isCursorAtEnd = (el: HTMLInputElement | null): boolean =>
31
+ Boolean(el && el.selectionStart === el.value.length && el.selectionEnd === el.value.length);
32
+
33
+ type AcrylicLevel = 'default' | '1Level' | '2Level';
34
+
35
+ type AcrylicAppearance = 'neutral' | 'red' | 'yellow' | 'green';
36
+
37
+ type AcrylicParams = {
38
+ validationState?: ValidationState;
39
+ disabled?: boolean;
40
+ readonly?: boolean;
41
+ hover?: boolean;
42
+ focusVisible?: boolean;
43
+ };
44
+
45
+ const VALIDATION_ACRYLIC_APPEARANCE: Partial<Record<ValidationState, AcrylicAppearance>> = {
46
+ [VALIDATION_STATE.Error]: 'red',
47
+ [VALIDATION_STATE.Warning]: 'yellow',
48
+ [VALIDATION_STATE.Success]: 'green',
49
+ };
50
+
51
+ function isColoredValidation(validationState?: ValidationState): boolean {
52
+ return Boolean(validationState && VALIDATION_ACRYLIC_APPEARANCE[validationState]);
53
+ }
54
+
55
+ /**
56
+ * Appearance acrylic-фона поля. Тонируется по состоянию валидации (Figma: error→red,
57
+ * warning→yellow, success→green; valid/default — нейтральный фон). На неактивном поле
58
+ * (disabled/readonly) тонировка снимается — фон нейтральный.
59
+ */
60
+ export function getAcrylicAppearance({ validationState, disabled, readonly }: AcrylicParams): AcrylicAppearance {
61
+ if (disabled || readonly) {
62
+ return 'neutral';
63
+ }
64
+
65
+ return (validationState && VALIDATION_ACRYLIC_APPEARANCE[validationState]) || 'neutral';
66
+ }
67
+
68
+ /**
69
+ * Уровень acrylic-фона поля. `default` для disabled/readonly и для покоя тонированных
70
+ * (error/warning/success) состояний (red/green/yellow background по Figma); `2Level` на
71
+ * hover/focus; `1Level` для нейтрального поля в покое.
72
+ */
73
+ export function getAcrylicLevel({
74
+ validationState,
75
+ disabled,
76
+ readonly,
77
+ hover,
78
+ focusVisible,
79
+ }: AcrylicParams): AcrylicLevel {
80
+ if (disabled || readonly) {
81
+ return 'default';
82
+ }
83
+
84
+ if (hover || focusVisible) {
85
+ return '2Level';
86
+ }
87
+
88
+ return isColoredValidation(validationState) ? 'default' : '1Level';
89
+ }
90
+
91
+ /**
92
+ * data-* атрибуты acrylic-материала поля (appearance + level) одним объектом для spread
93
+ * на materialLayer — единый источник тонировки фона по валидации для всех полей shell.
94
+ */
95
+ export function getAcrylicProps(params: AcrylicParams) {
96
+ return {
97
+ 'data-acrylic-appearance': getAcrylicAppearance(params),
98
+ 'data-acrylic-level': getAcrylicLevel(params),
99
+ };
100
+ }
101
+
102
+ /**
103
+ * Гасит mousedown на слот-обёртке функциональной кнопки (clear/copy): фокус остаётся в input.
104
+ * Статический обработчик, общий для полей со слотами (`FieldDate`, `FieldSelect`).
105
+ */
106
+ export const preventSlotMouseDown = (event: MouseEvent<HTMLSpanElement>): void => event.preventDefault();
107
+
108
+ /**
109
+ * Гасит click на слот-обёртке: не доходит до триггера, чтобы клик по кнопке не
110
+ * тогглил dropdown/calendar. Общий статический обработчик для полей со слотами.
111
+ */
112
+ export const stopSlotClickPropagation = (event: MouseEvent<HTMLSpanElement>): void => event.stopPropagation();
113
+
114
+ /**
115
+ * Размер поля → размер `InputPrivate`. Оси `'s' | 'm' | 'l'` совпадают, маппинг тождественный —
116
+ * хелпер убирает инлайн-касты `size as InputPrivateSize` из реализаций полей.
117
+ */
118
+ export function toInputSize(size: Size = SIZE.M): InputPrivateSize {
119
+ return size;
120
+ }
121
+
122
+ /**
123
+ * Размер поля → размер кнопки-слота. У кнопок нет `l`, поэтому `l` сводится к `m`
124
+ * через `BUTTON_SIZE_MAP` (паритет с input-private), а не приводится небезопасным кастом.
125
+ */
126
+ export function toButtonSize(size: Size = SIZE.M): ButtonSize {
127
+ return BUTTON_SIZE_MAP[size];
128
+ }
@@ -0,0 +1,73 @@
1
+ export const TEST_IDS = {
2
+ fieldDecorator: 'field-decorator',
3
+ fieldDecoratorLabel: 'field-decorator__label',
4
+ fieldDecoratorRequired: 'field-decorator__required-sign',
5
+ fieldDecoratorLabelTooltip: 'field-decorator__label-tooltip',
6
+ fieldDecoratorCaption: 'field-decorator__caption',
7
+ fieldDecoratorHint: 'field-decorator__hint',
8
+ fieldDecoratorCounter: 'field-decorator__counter',
9
+ fieldCombo: 'field-combo',
10
+ fieldComboInput: 'field-combo__input',
11
+ fieldComboElementButton: 'field-combo__element-button',
12
+ // Внутренняя оболочка (`fieldWrapper`): несёт effectiveValidationState (error форсит 'error'),
13
+ // тогда как корень с публичным data-test-id хранит RAW `validationState`.
14
+ fieldComboShell: 'field-combo__shell',
15
+ fieldText: 'field-text',
16
+ fieldTextInput: 'field-text__input',
17
+ fieldTextShell: 'field-text__shell',
18
+ // Кнопка копирования общая для всех полей (дефолт `useCopyButton`).
19
+ fieldTextCopyButton: 'button-copy-value',
20
+ fieldSecure: 'field-secure',
21
+ fieldSecureInput: 'field-secure__input',
22
+ fieldSecureHideButton: 'button-toggle-hidden',
23
+ fieldSecureShell: 'field-secure__shell',
24
+ // Skeleton, заменяющий input во время async-загрузки значения (asyncValueGetter).
25
+ fieldSecureSkeleton: 'field-secure__skeleton',
26
+ fieldTextArea: 'field-textarea',
27
+ fieldTextAreaInput: 'field-textarea__input',
28
+ fieldTextAreaScrollArea: 'field-textarea__scroll-area',
29
+ fieldTextAreaShell: 'field-textarea__shell',
30
+ fieldStepper: 'field-stepper',
31
+ fieldStepperInput: 'field-stepper__input',
32
+ fieldStepperMinus: 'field-stepper__minus-button',
33
+ fieldStepperPlus: 'field-stepper__plus-button',
34
+ fieldStepperCopyButton: 'field-stepper__copy-button',
35
+ fieldStepperLimitTooltip: 'field-stepper__limit-tooltip',
36
+ fieldSlider: 'field-slider',
37
+ fieldSliderInput: 'field-slider__input',
38
+ fieldSliderCopyButton: 'field-slider__copy-button',
39
+ fieldSliderHandle: 'field-slider__slider',
40
+ // Внутренняя оболочка слайдера: на ней живут data-validation-state / disabled / readonly /
41
+ // withbackground / focusvisible (корень с data-test-id их не несёт).
42
+ fieldSliderField: 'field-slider__field',
43
+ fieldSelect: 'field-select',
44
+ fieldSelectChips: 'field-select__chips',
45
+ fieldSelectInput: 'field-select__input',
46
+ fieldSelectClear: 'field-select__clear',
47
+ fieldSelectCopy: 'field-select__copy',
48
+ fieldDate: 'field-date',
49
+ fieldDateInput: 'field-date__input',
50
+ fieldDateInputFrom: 'field-date__input-from',
51
+ fieldDateInputTo: 'field-date__input-to',
52
+ fieldDateClear: 'field-date__clear',
53
+ fieldDateCopy: 'field-date__copy',
54
+ fieldDateCalendar: 'field-date__calendar',
55
+ // CalendarDropdown (@cloud-ru/ds-calendar) тегирует контент открытого календаря только когда ему передан
56
+ // `data-test-id` (его билдер строит контент-узел как `content-<id>`). FieldDate проставляет этот id,
57
+ // чтобы портальный календарь был адресуем в e2e/visual; реальный узел контента — `content-field-date__calendar-dropdown`.
58
+ fieldDateCalendarDropdown: 'field-date__calendar-dropdown',
59
+ fieldColor: 'field-color',
60
+ fieldColorInput: 'field-color__input',
61
+ fieldColorSwatch: 'field-color__swatch',
62
+ fieldColorChevron: 'field-color__chevron',
63
+ // ColorPicker (@cloud-ru/ds-color-picker) тегирует свой корень только переданным data-test-id
64
+ // (root рендерит `{...extractSupportProps(rest)}`). FieldColor проставляет этот id, чтобы
65
+ // открытая палитра была адресуема в play/e2e.
66
+ fieldColorPicker: 'field-color__picker',
67
+ fieldColorSheetTitle: 'field-color__sheet-title',
68
+ fieldColorCancel: 'field-color__cancel',
69
+ fieldColorApply: 'field-color__apply',
70
+ fieldTime: 'field-time',
71
+ fieldTimeInput: 'field-time__input',
72
+ fieldTimeIcon: 'field-time__icon',
73
+ } as const;
@@ -0,0 +1 @@
1
+ export * from './useAdaptiveAutoFocus';
@@ -0,0 +1,16 @@
1
+ import { LayoutPresets, mergePresets, useLayoutDefaults } from '@cloud-ru/ds-adaptive';
2
+
3
+ /** Пресеты адаптивных дефолтов поля по раскладке (сейчас — только `autoFocus`). */
4
+ export type FieldLayoutPresets = LayoutPresets<{ autoFocus: boolean }>;
5
+
6
+ // На mobile autoFocus выключен — иначе открывает экранную клавиатуру без действия пользователя.
7
+ const DS_AUTOFOCUS_PRESET: FieldLayoutPresets = { mobile: { autoFocus: false } };
8
+
9
+ /** Резолвит `autoFocus` по раскладке: desktop — проп, mobile — выключен; переопределяемо через `layoutPresets`. */
10
+ export function useAdaptiveAutoFocus(autoFocus = false, layoutPresets?: FieldLayoutPresets): boolean {
11
+ return useLayoutDefaults<{ autoFocus: boolean }>(
12
+ { autoFocus: false },
13
+ mergePresets(DS_AUTOFOCUS_PRESET, layoutPresets),
14
+ { autoFocus },
15
+ ).autoFocus;
16
+ }
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './components';
2
+ export * from './constants';
3
+ export * from './hooks';
@@ -0,0 +1,2 @@
1
+ export * from './segments';
2
+ export * from './useSegmentedMask';