@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,104 @@
1
+ @use '@cloud-ru/ds-figma-variables/build/scss/styles/styles.module' as base;
2
+ @use '@cloud-ru/ds-figma-variables/build/scss/components/tag.module' as tag;
3
+ @use '@cloud-ru/ds-figma-variables/build/scss/components/field.module' as field;
4
+
5
+ $sizes: 's', 'm', 'l';
6
+
7
+ // FieldSelect size → tag size (Figma fieldSelectMultiple chips): s→xs, m→xs, l→s.
8
+ $chip-sizes: (
9
+ 's': 'xs',
10
+ 'm': 'xs',
11
+ 'l': 's',
12
+ );
13
+
14
+ .chevron {
15
+ display: inline-flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+
19
+ color: base.$sn-theme-color-available-version-textTertiary;
20
+
21
+ transition: transform 0.15s ease-in-out;
22
+
23
+ &[data-open='true'] {
24
+ transform: rotate(180deg);
25
+ }
26
+ }
27
+
28
+ .trigger {
29
+ cursor: text;
30
+
31
+ &[data-disabled='true'] {
32
+ cursor: not-allowed;
33
+ }
34
+
35
+ &[data-readonly='true'] {
36
+ cursor: default;
37
+ }
38
+ }
39
+
40
+ .readonlyCursor {
41
+ cursor: pointer;
42
+ }
43
+
44
+ // Контейнер «чипы + поисковый input» (паритет с легаси FieldSelect .contentWrapper):
45
+ // занимает всю доступную ширину строки, чипы и input переносятся вместе одним потоком.
46
+ .chipsRow {
47
+ display: flex;
48
+ flex: 1 0 0;
49
+ flex-wrap: wrap;
50
+ align-content: center;
51
+ align-items: center;
52
+
53
+ min-width: 0;
54
+
55
+ @each $size, $tagSize in $chip-sizes {
56
+ [data-size='#{$size}'] & {
57
+ // gap = tag.tagRow.gap по mapped tag size (Figma fieldSelectMultiple chips: 2 для xs/s) —
58
+ // одновременно column- и row-gap при flex-wrap (отступ между чипами и между рядами).
59
+ gap: base.simple-var(tag.$tag, 'anatomy', 'size', $tagSize, 'tagRow', 'gap');
60
+ // Вертикальные отступы строк чипов (Figma fieldContainer.contentWrapper.verticalPadding) —
61
+ // shared-поле их не применяет (single-line центрируется), а мультиселекту они нужны, чтобы
62
+ // ряды чипов не липли к краям контейнера (пропавшие отступы по макету).
63
+ padding-top: base.simple-var(field.$field, 'anatomy', 'size', $size, 'fieldContainer', 'contentWrapper', 'padding-top');
64
+ padding-bottom: base.simple-var(field.$field, 'anatomy', 'size', $size, 'fieldContainer', 'contentWrapper', 'padding-bottom');
65
+ }
66
+ }
67
+ }
68
+
69
+ // Поисковый input внутри чип-контейнера: течёт за последним чипом (inline-flex), переносится
70
+ // на новую строку при длинном вводе. min-width задаётся инлайном из замера плага (см. FieldSelect.tsx);
71
+ // базовый — крошечный, чтобы пустой input прижимался к последнему чипу (флоу как в легаси).
72
+ .inputWrapper {
73
+ position: relative;
74
+ display: inline-flex;
75
+ // flex-basis: 0 — иначе content-based база (intrinsic-ширина <input>) уводит input на новую
76
+ // строку. Перенос управляется inline-minWidth (ширина введённого текста): пока текст влезает в
77
+ // остаток строки — input рядом с чипами, перерос — flex-wrap уносит его на новую строку.
78
+ flex: 1 1 0;
79
+ min-width: base.$sn-primitive-dimension-4;
80
+ }
81
+
82
+ // Скрытый замерочный плаг: рендерит введённый текст той же типографикой, что input, и отдаёт
83
+ // его натуральную ширину через clientWidth. Вне потока (absolute, height 0) — на layout не влияет.
84
+ .inputPlug {
85
+ pointer-events: none;
86
+
87
+ position: absolute;
88
+ top: 0;
89
+ left: 0;
90
+
91
+ overflow: hidden;
92
+
93
+ width: fit-content;
94
+ max-width: 100%;
95
+ height: 0;
96
+
97
+ white-space: pre;
98
+
99
+ @each $size in $sizes {
100
+ [data-size='#{$size}'] & {
101
+ @include base.composite-var(base.$sn-regular, 'body', $size);
102
+ }
103
+ }
104
+ }
@@ -0,0 +1,212 @@
1
+ import { FieldDecoratorProps, ValidationState } from '@cloud-ru/ds-field-decorator';
2
+ import { DroplistProps, ItemId, ItemProps } from '@cloud-ru/ds-list';
3
+ import { ValueOf } from '@cloud-ru/ds-utils';
4
+ import { FocusEvent, KeyboardEvent, ReactNode } from 'react';
5
+
6
+ import { FieldLayoutPresets } from '../../hooks';
7
+ import { SELECTION_MODE } from './constants';
8
+
9
+ /** Режим выбора FieldSelect: одно значение или несколько. */
10
+ export type Selection = ValueOf<typeof SELECTION_MODE>;
11
+
12
+ type FieldSelectDecoratorProps = Omit<FieldDecoratorProps, 'children' | 'validationState' | 'size'>;
13
+
14
+ type DroplistPassthrough = Pick<
15
+ DroplistProps,
16
+ | 'footer'
17
+ | 'footerActiveElementsRefs'
18
+ | 'loading'
19
+ | 'noDataState'
20
+ | 'noResultsState'
21
+ | 'errorDataState'
22
+ | 'virtualized'
23
+ | 'scrollToSelectedItem'
24
+ | 'limitedScrollHeight'
25
+ | 'untouchableScrollbars'
26
+ | 'closeOnPopstate'
27
+ > & {
28
+ /**
29
+ * Флаг «ошибка загрузки данных» — при `true` дроплист рендерит `errorDataState`
30
+ * вместо списка (для асинхронной подгрузки с провалившимся запросом).
31
+ */
32
+ dataError?: DroplistProps['dataError'];
33
+ /**
34
+ * Флаг «список отфильтрован» — при `true` и пустом результате дроплист рендерит
35
+ * `noResultsState`. По умолчанию выводится из строки поиска (`searchable` + ввод).
36
+ */
37
+ dataFiltered?: DroplistProps['dataFiltered'];
38
+ };
39
+
40
+ type CommonSelectProps = FieldSelectDecoratorProps &
41
+ DroplistPassthrough & {
42
+ /** Размер */
43
+ size?: FieldDecoratorProps['size'];
44
+ /** Состояние валидации */
45
+ validationState?: ValidationState;
46
+ /** CSS-класс корня `FieldDecorator` */
47
+ className?: string;
48
+ /** CSS-класс оболочки поля */
49
+ fieldClassName?: string;
50
+ /** Список айтемов дроплиста (формат `@cloud-ru/ds-list`) */
51
+ items: ItemProps[];
52
+ /** Пресет-айтемы сверху (формат `@cloud-ru/ds-list`) */
53
+ pinTop?: ItemProps[];
54
+ /** Пресет-айтемы снизу (формат `@cloud-ru/ds-list`) */
55
+ pinBottom?: ItemProps[];
56
+ /** Placeholder в триггере, когда нет выбранного значения */
57
+ placeholder?: string;
58
+ /** Иконка перед текстом */
59
+ iconBefore?: ReactNode;
60
+ /** Префикс — текст или нода перед значением (Figma `prefix`) */
61
+ prefix?: ReactNode;
62
+ /** Постфикс — текст или нода после значения (Figma `postfix`) */
63
+ postfix?: ReactNode;
64
+ /** Деактивировано */
65
+ disabled?: boolean;
66
+ /** Read-only режим */
67
+ readonly?: boolean;
68
+ /**
69
+ * Фон поля (acrylic)
70
+ * @default true
71
+ */
72
+ background?: boolean;
73
+ /** Управляемое открытие дроплиста */
74
+ open?: DroplistProps['open'];
75
+ /** Колбек смены открытия */
76
+ onOpenChange?: DroplistProps['onOpenChange'];
77
+ /** Placement дроплиста */
78
+ placement?: DroplistProps['placement'];
79
+ /**
80
+ * Стратегия ширины дроплиста.
81
+ * @default 'eq' — равна ширине триггера
82
+ */
83
+ widthStrategy?: DroplistProps['widthStrategy'];
84
+ /**
85
+ * Включить поиск/ввод в поле — пользователь печатает, список фильтруется по подстроке лейбла.
86
+ * @default true
87
+ */
88
+ searchable?: boolean;
89
+ /**
90
+ * Управляемое/неуправляемое состояние строки поиска (текста в поле). Позволяет потребителю
91
+ * читать и задавать запрос (например, для серверного поиска вместе с `autocomplete`).
92
+ */
93
+ search?: {
94
+ /** Управляемое значение строки поиска */
95
+ value?: string;
96
+ /** Начальное значение строки поиска (uncontrolled) */
97
+ defaultValue?: string;
98
+ /** Колбек смены строки поиска */
99
+ onChange?(value: string): void;
100
+ };
101
+ /**
102
+ * Не фильтровать список на клиенте — фильтрацию обеспечивает потребитель (серверный поиск).
103
+ * Введённый текст уходит в `search.onChange`, список берётся из `items` как есть.
104
+ * @default false
105
+ */
106
+ autocomplete?: boolean;
107
+ /**
108
+ * Зафиксировать введённый текст как новый выбор по `Enter` (создание опции «на лету»).
109
+ * @default false
110
+ */
111
+ addOptionByEnter?: boolean;
112
+ /**
113
+ * Сбрасывать строку поиска к выбранному значению после выбора. `false` нужен при асинхронной
114
+ * подгрузке (оставить введённый запрос как значение, пока данные не пришли).
115
+ * @default true
116
+ */
117
+ resetSearchOnOptionSelection?: boolean;
118
+ /**
119
+ * Показывать кнопку очистки значения (✕). Активна, когда есть выбранное значение
120
+ * и поле не disabled/readonly.
121
+ * @default true
122
+ */
123
+ showClearButton?: boolean;
124
+ /**
125
+ * Показывать кнопку копирования значения (только при `readonly` и непустом значении).
126
+ * @default true
127
+ */
128
+ showCopyButton?: boolean;
129
+ /** Колбек после копирования значения в буфер */
130
+ onCopyButtonClick?(): void;
131
+ /** HTML-атрибут `id` для input (и `for` у label) */
132
+ id?: string;
133
+ /** HTML-атрибут `name` для input */
134
+ name?: string;
135
+ /** Автофокус input при монтировании. На mobile выключается адаптивно (см. `layoutPresets`) */
136
+ autoFocus?: boolean;
137
+ /**
138
+ * Переопределение адаптивных дефолтов по раскладке. Участвует `autoFocus`: на mobile он выключен
139
+ * (открывает клавиатуру без действия). Вернуть на mobile — `layoutPresets={{ mobile: { autoFocus: true } }}`.
140
+ */
141
+ layoutPresets?: FieldLayoutPresets;
142
+ /** Колбек фокуса input */
143
+ onFocus?(event: FocusEvent<HTMLInputElement>): void;
144
+ /** Колбек блюра input */
145
+ onBlur?(event: FocusEvent<HTMLInputElement>): void;
146
+ /** Колбек нажатия клавиши на input (вызывается после внутренней обработки навигации) */
147
+ onKeyDown?(event: KeyboardEvent<HTMLInputElement>): void;
148
+ /**
149
+ * Включить нечёткий поиск: символы запроса должны встречаться в лейбле в том же порядке
150
+ * (например, `lge` найдёт `Large`). Если `false` — простой substring-match.
151
+ * @default true
152
+ */
153
+ enableFuzzySearch?: boolean;
154
+ /**
155
+ * Кастомный форматтер лейбла выбранного значения. Применяется к каждому выбранному
156
+ * элементу (single — значение в поле, multiple — лейбл чипа или элемент в comma-joined).
157
+ */
158
+ selectedOptionFormatter?(selected: { id: ItemId; label: string }): string;
159
+ /** Тестовый id корня */
160
+ 'data-test-id'?: string;
161
+ };
162
+
163
+ export type FieldSelectSingleProps = CommonSelectProps & {
164
+ /** Режим выбора. По умолчанию `'single'`. */
165
+ selection?: typeof SELECTION_MODE.Single;
166
+ /** Управляемое значение */
167
+ value?: ItemId;
168
+ /** Неуправляемое значение по умолчанию */
169
+ defaultValue?: ItemId;
170
+ /** Колбек смены значения */
171
+ onChange?(value: ItemId | undefined): void;
172
+ /**
173
+ * Закрывать дроплист после клика на айтем.
174
+ * @default true
175
+ */
176
+ closeDroplistOnItemClick?: boolean;
177
+ };
178
+
179
+ export type FieldSelectMultipleProps = CommonSelectProps & {
180
+ /** Режим выбора */
181
+ selection: typeof SELECTION_MODE.Multiple;
182
+ /** Управляемые значения */
183
+ value?: ItemId[];
184
+ /** Неуправляемые значения по умолчанию */
185
+ defaultValue?: ItemId[];
186
+ /** Колбек смены значений */
187
+ onChange?(value: ItemId[]): void;
188
+ /**
189
+ * Форматтер строки выбранных значений (используется, если `chips=false`).
190
+ * @default — список лейблов через `, `
191
+ */
192
+ formatSelected?(selected: { id: ItemId; label: string }[]): string;
193
+ /**
194
+ * Отображать выбранные значения как чипы (`@cloud-ru/ds-tag`) внутри поля. Если `false`,
195
+ * показывает строку из `formatSelected` либо comma-joined.
196
+ * @default true
197
+ */
198
+ chips?: boolean;
199
+ /**
200
+ * Удалять последний чип по `Backspace`, когда строка ввода пустая.
201
+ * Работает только при `chips=true` и `searchable=true`.
202
+ * @default true
203
+ */
204
+ removeByBackspace?: boolean;
205
+ /**
206
+ * Закрывать дроплист после клика на айтем.
207
+ * @default false
208
+ */
209
+ closeDroplistOnItemClick?: boolean;
210
+ };
211
+
212
+ export type FieldSelectProps = FieldSelectSingleProps | FieldSelectMultipleProps;
@@ -0,0 +1,134 @@
1
+ import { Size } from '@cloud-ru/ds-field-decorator';
2
+ import { ItemId, ItemProps } from '@cloud-ru/ds-list';
3
+ import { Appearance as TagAppearance, Size as TagSize } from '@cloud-ru/ds-tag';
4
+
5
+ import { SELECTION_MODE } from './constants';
6
+ import { FieldSelectMultipleProps, FieldSelectProps } from './types';
7
+
8
+ export const TAG_SIZE_MAP: Record<Size, TagSize> = { s: 'xs', m: 'xs', l: 's' };
9
+
10
+ export type WithIdContent = { id?: ItemId; content?: unknown; disabled?: boolean; appearance?: unknown };
11
+
12
+ export function extractLabel(item: WithIdContent): string {
13
+ const { content, id } = item;
14
+
15
+ if (!content) {
16
+ return String(id ?? '');
17
+ }
18
+
19
+ if (typeof content === 'string' || typeof content === 'number') {
20
+ return String(content);
21
+ }
22
+
23
+ if (typeof content === 'object' && content !== null && 'label' in content) {
24
+ return String((content as { label: unknown }).label);
25
+ }
26
+
27
+ return String(id ?? '');
28
+ }
29
+
30
+ // Текст для поиска: лейбл (option) + caption + description — паритет с легаси `useSearch`,
31
+ // который матчил запрос по всем трём полям контента, а не только по лейблу.
32
+ export function extractSearchText(item: WithIdContent): string {
33
+ const parts = [extractLabel(item)];
34
+ const { content } = item;
35
+
36
+ if (content && typeof content === 'object') {
37
+ const c = content as { caption?: unknown; description?: unknown };
38
+
39
+ if (typeof c.caption === 'string') {
40
+ parts.push(c.caption);
41
+ }
42
+
43
+ if (typeof c.description === 'string') {
44
+ parts.push(c.description);
45
+ }
46
+ }
47
+
48
+ return parts.join(' ');
49
+ }
50
+
51
+ // Цвет чипа выбранного значения (multiple) — паритет с легаси `option.appearance`.
52
+ // Берётся с самого item'а (additive: потребитель задаёт `appearance` на элементе items).
53
+ export function extractAppearance(item?: WithIdContent): TagAppearance | undefined {
54
+ const a = item?.appearance;
55
+
56
+ return typeof a === 'string' ? (a as TagAppearance) : undefined;
57
+ }
58
+
59
+ export function flatten(items: ItemProps[]): WithIdContent[] {
60
+ const out: WithIdContent[] = [];
61
+
62
+ for (const item of items) {
63
+ out.push(item as WithIdContent);
64
+
65
+ if ('items' in item && Array.isArray(item.items)) {
66
+ out.push(...flatten(item.items as ItemProps[]));
67
+ }
68
+ }
69
+
70
+ return out;
71
+ }
72
+
73
+ export function findItem(items: ItemProps[], id: ItemId): WithIdContent | undefined {
74
+ for (const item of flatten(items)) {
75
+ if (item.id === id) {
76
+ return item;
77
+ }
78
+ }
79
+
80
+ return undefined;
81
+ }
82
+
83
+ // Subsequence-fuzzy: символы запроса должны встречаться в строке в исходном порядке.
84
+ // Пример: query=`lge` matches `Large` (L → r → arg → e).
85
+ export function isFuzzyMatch(haystack: string, needle: string): boolean {
86
+ if (!needle) {
87
+ return true;
88
+ }
89
+
90
+ let i = 0;
91
+
92
+ for (const ch of haystack) {
93
+ if (ch === needle[i]) {
94
+ i += 1;
95
+
96
+ if (i === needle.length) {
97
+ return true;
98
+ }
99
+ }
100
+ }
101
+
102
+ return false;
103
+ }
104
+
105
+ export function filterItems(items: ItemProps[], query: string, fuzzy: boolean): ItemProps[] {
106
+ if (!query) {
107
+ return items;
108
+ }
109
+
110
+ const q = query.toLowerCase();
111
+
112
+ const matches = (item: ItemProps): boolean => {
113
+ const text = extractSearchText(item as WithIdContent).toLowerCase();
114
+
115
+ return fuzzy ? isFuzzyMatch(text, q) : text.includes(q);
116
+ };
117
+
118
+ const walk = (list: ItemProps[]): ItemProps[] =>
119
+ list.flatMap(item => {
120
+ if ('items' in item && Array.isArray(item.items)) {
121
+ const filteredChildren = walk(item.items as ItemProps[]);
122
+
123
+ return filteredChildren.length > 0 ? [{ ...item, items: filteredChildren } as ItemProps] : [];
124
+ }
125
+
126
+ return matches(item) ? [item] : [];
127
+ });
128
+
129
+ return walk(items);
130
+ }
131
+
132
+ export function isMultiple(props: FieldSelectProps): props is FieldSelectMultipleProps {
133
+ return props.selection === SELECTION_MODE.Multiple;
134
+ }