@scbt-ecom/ui 0.4.1 → 0.4.2

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 (299) hide show
  1. package/.env +3 -0
  2. package/.github/workflows/publish.yml +61 -0
  3. package/.github/workflows/setup-node/action.yml +22 -0
  4. package/.husky/pre-commit +1 -0
  5. package/.prettierignore +1 -0
  6. package/.prettierrc +20 -0
  7. package/.releaserc +18 -0
  8. package/.storybook/main.ts +44 -0
  9. package/.storybook/preview.tsx +37 -0
  10. package/chromatic.config.json +5 -0
  11. package/eslint.config.mjs +193 -0
  12. package/index.html +13 -0
  13. package/lib/client.ts +12 -0
  14. package/lib/configs/index.ts +2 -0
  15. package/lib/configs/tailwindConfigBase.ts +110 -0
  16. package/lib/configs/tailwindPresets/extendsPreset.ts +43 -0
  17. package/lib/configs/tailwindPresets/index.ts +2 -0
  18. package/lib/configs/tailwindPresets/resetPreset.ts +71 -0
  19. package/lib/hybrid.ts +25 -0
  20. package/lib/shared/constants/api.ts +2 -0
  21. package/lib/shared/constants/designSystem/colors.ts +121 -0
  22. package/lib/shared/constants/designSystem/index.ts +3 -0
  23. package/lib/shared/constants/designSystem/others.ts +30 -0
  24. package/lib/shared/constants/designSystem/typography.ts +88 -0
  25. package/lib/shared/constants/index.ts +2 -0
  26. package/lib/shared/hooks/index.ts +5 -0
  27. package/lib/shared/hooks/useBoolean.ts +12 -0
  28. package/lib/shared/hooks/useClickOutside.ts +22 -0
  29. package/lib/shared/hooks/useCombineRef.ts +23 -0
  30. package/lib/shared/hooks/useControlledForm.ts +16 -0
  31. package/lib/shared/hooks/useDebounce.ts +38 -0
  32. package/lib/shared/hooks/useMediaQuery.tsx +42 -0
  33. package/lib/shared/style.css +118 -0
  34. package/lib/shared/ui/Badge.tsx +20 -0
  35. package/lib/shared/ui/Breadcrumbs.tsx +57 -0
  36. package/lib/shared/ui/ButtonIcon.tsx +50 -0
  37. package/lib/shared/ui/CustomLink.tsx +76 -0
  38. package/lib/shared/ui/Document.tsx +51 -0
  39. package/lib/shared/ui/Heading.tsx +33 -0
  40. package/lib/shared/ui/Hint.tsx +72 -0
  41. package/lib/shared/ui/Loader.tsx +58 -0
  42. package/lib/shared/ui/PhoneView.tsx +23 -0
  43. package/lib/shared/ui/ProgressBar.tsx +43 -0
  44. package/lib/shared/ui/ResponsiveContainer.tsx +15 -0
  45. package/lib/shared/ui/Section.tsx +15 -0
  46. package/lib/shared/ui/Skeleton.tsx +9 -0
  47. package/lib/shared/ui/TabsSwitcher.tsx +87 -0
  48. package/lib/shared/ui/accordion/Accordion.tsx +36 -0
  49. package/lib/shared/ui/accordion/index.ts +1 -0
  50. package/lib/shared/ui/accordion/model/types.ts +20 -0
  51. package/lib/shared/ui/accordion/ui/AccordionHeader.tsx +35 -0
  52. package/lib/shared/ui/brandLogos.tsx +14 -0
  53. package/lib/shared/ui/button/Button.tsx +117 -0
  54. package/lib/shared/ui/button/index.ts +1 -0
  55. package/lib/shared/ui/button/model/helpers.ts +16 -0
  56. package/lib/shared/ui/formControlElements/CheckboxControl.tsx +92 -0
  57. package/lib/shared/ui/formControlElements/FormControl.tsx +5 -0
  58. package/lib/shared/ui/formControlElements/InputControlMask.tsx +90 -0
  59. package/lib/shared/ui/formControlElements/RadioControl.tsx +130 -0
  60. package/lib/shared/ui/formControlElements/SwitchControl.tsx +79 -0
  61. package/lib/shared/ui/formControlElements/TextareaControl.tsx +96 -0
  62. package/lib/shared/ui/formControlElements/calendarControl/CalendarControl.tsx +178 -0
  63. package/lib/shared/ui/formControlElements/calendarControl/hooks/index.ts +2 -0
  64. package/lib/shared/ui/formControlElements/calendarControl/hooks/useCalendar.tsx +86 -0
  65. package/lib/shared/ui/formControlElements/calendarControl/hooks/useCalendarDropdowns.ts +38 -0
  66. package/lib/shared/ui/formControlElements/calendarControl/index.ts +1 -0
  67. package/lib/shared/ui/formControlElements/calendarControl/model/helpers.ts +60 -0
  68. package/lib/shared/ui/formControlElements/calendarControl/model/types.ts +44 -0
  69. package/lib/shared/ui/formControlElements/calendarControl/ui/DaysOfMonth.tsx +53 -0
  70. package/lib/shared/ui/formControlElements/calendarControl/ui/DaysOfWeek.tsx +28 -0
  71. package/lib/shared/ui/formControlElements/calendarControl/ui/Dropdown.tsx +62 -0
  72. package/lib/shared/ui/formControlElements/calendarControl/ui/Header.tsx +51 -0
  73. package/lib/shared/ui/formControlElements/calendarControl/ui/Navigation.tsx +32 -0
  74. package/lib/shared/ui/formControlElements/calendarControl/ui/OptionsList.tsx +44 -0
  75. package/lib/shared/ui/formControlElements/calendarControl/ui/index.ts +4 -0
  76. package/lib/shared/ui/formControlElements/comboboxControl/ComboboxControl.tsx +134 -0
  77. package/lib/shared/ui/formControlElements/comboboxControl/index.ts +1 -0
  78. package/lib/shared/ui/formControlElements/comboboxControl/model/selectClassnames.ts +51 -0
  79. package/lib/shared/ui/formControlElements/comboboxControl/model/types.ts +42 -0
  80. package/lib/shared/ui/formControlElements/comboboxControl/ui/ComboboxOption.tsx +38 -0
  81. package/lib/shared/ui/formControlElements/comboboxControl/ui/DropdownIndicator.tsx +23 -0
  82. package/lib/shared/ui/formControlElements/comboboxControl/ui/MultiValueRemove.tsx +16 -0
  83. package/lib/shared/ui/formControlElements/comboboxControl/ui/index.ts +3 -0
  84. package/lib/shared/ui/formControlElements/dadata/DadataInputControl.tsx +137 -0
  85. package/lib/shared/ui/formControlElements/dadata/index.ts +1 -0
  86. package/lib/shared/ui/formControlElements/dadata/model/api.ts +25 -0
  87. package/lib/shared/ui/formControlElements/dadata/model/helpers.ts +76 -0
  88. package/lib/shared/ui/formControlElements/dadata/model/types.ts +52 -0
  89. package/lib/shared/ui/formControlElements/dadata/model/useDadata.ts +25 -0
  90. package/lib/shared/ui/formControlElements/editorControl/EditorControl.tsx +82 -0
  91. package/lib/shared/ui/formControlElements/editorControl/components/conrols.tsx +136 -0
  92. package/lib/shared/ui/formControlElements/editorControl/components/menu.tsx +107 -0
  93. package/lib/shared/ui/formControlElements/editorControl/index.ts +60 -0
  94. package/lib/shared/ui/formControlElements/editorControl/ui/RemoveBlockButton.tsx +23 -0
  95. package/lib/shared/ui/formControlElements/editorControl/ui/ResetBlockType.tsx +17 -0
  96. package/lib/shared/ui/formControlElements/index.ts +14 -0
  97. package/lib/shared/ui/formControlElements/inputControl/InputControl.tsx +87 -0
  98. package/lib/shared/ui/formControlElements/inputControl/index.ts +1 -0
  99. package/lib/shared/ui/formControlElements/inputControl/model/hooks.tsx +26 -0
  100. package/lib/shared/ui/formControlElements/inputControlUploader/InputControlUploader.tsx +47 -0
  101. package/lib/shared/ui/formControlElements/inputControlUploader/index.ts +1 -0
  102. package/lib/shared/ui/formControlElements/inputControlUploader/model/helpers.ts +18 -0
  103. package/lib/shared/ui/formControlElements/inputControlUploader/model/hooks/useUploader.tsx +66 -0
  104. package/lib/shared/ui/formControlElements/inputControlUploader/model/index.ts +1 -0
  105. package/lib/shared/ui/formControlElements/inputControlUploader/model/types.ts +22 -0
  106. package/lib/shared/ui/formControlElements/inputControlUploader/ui/File.tsx +35 -0
  107. package/lib/shared/ui/formControlElements/inputControlUploader/ui/Filename.tsx +40 -0
  108. package/lib/shared/ui/formControlElements/inputControlUploader/ui/Files.tsx +30 -0
  109. package/lib/shared/ui/formControlElements/inputControlUploader/ui/Input.tsx +48 -0
  110. package/lib/shared/ui/formControlElements/inputControlUploader/ui/Uploader.tsx +58 -0
  111. package/lib/shared/ui/formControlElements/inputControlUploader/ui/index.ts +3 -0
  112. package/lib/shared/ui/formControlElements/inputCurrencyControl/InputCurrencyControl.tsx +88 -0
  113. package/lib/shared/ui/formControlElements/inputCurrencyControl/index.ts +1 -0
  114. package/lib/shared/ui/formControlElements/inputCurrencyControl/model/helpers.ts +46 -0
  115. package/lib/shared/ui/formControlElements/inputCurrencyControl/model/useInputCurrency.tsx +33 -0
  116. package/lib/shared/ui/formControlElements/inputCurrencyControl/ui/MenuTrigger.tsx +20 -0
  117. package/lib/shared/ui/formControlElements/inputCurrencyControl/ui/OptionList.tsx +29 -0
  118. package/lib/shared/ui/formControlElements/inputCurrencyControl/ui/index.ts +2 -0
  119. package/lib/shared/ui/formControlElements/inputSliderControl/InputSliderControl.tsx +144 -0
  120. package/lib/shared/ui/formControlElements/inputSliderControl/index.ts +1 -0
  121. package/lib/shared/ui/formControlElements/inputSliderControl/model/helpers/dates/getEndWordMonth.ts +14 -0
  122. package/lib/shared/ui/formControlElements/inputSliderControl/model/helpers/dates/getYearEnding.ts +13 -0
  123. package/lib/shared/ui/formControlElements/inputSliderControl/model/helpers/dates/index.ts +2 -0
  124. package/lib/shared/ui/formControlElements/inputSliderControl/model/helpers/formatNumber.ts +6 -0
  125. package/lib/shared/ui/formControlElements/inputSliderControl/model/helpers/getInputSliderSuffix.ts +20 -0
  126. package/lib/shared/ui/formControlElements/inputSliderControl/model/helpers/getStepByVariant.ts +29 -0
  127. package/lib/shared/ui/formControlElements/inputSliderControl/model/helpers/index.ts +4 -0
  128. package/lib/shared/ui/formControlElements/inputSliderControl/model/types.ts +1 -0
  129. package/lib/shared/ui/formControlElements/inputSliderControl/model/useSlider.ts +26 -0
  130. package/lib/shared/ui/formControlElements/inputSliderControl/ui/SliderControl.tsx +47 -0
  131. package/lib/shared/ui/formControlElements/inputSliderControl/ui/index.ts +1 -0
  132. package/lib/shared/ui/formControlElements/model/classes-types.ts +22 -0
  133. package/lib/shared/ui/formControlElements/model/index.ts +2 -0
  134. package/lib/shared/ui/formControlElements/model/message-view-animation.ts +6 -0
  135. package/lib/shared/ui/formControlElements/model/props-types.ts +31 -0
  136. package/lib/shared/ui/formControlElements/ui/FieldAttachment.tsx +76 -0
  137. package/lib/shared/ui/formControlElements/ui/FieldContainer.tsx +37 -0
  138. package/lib/shared/ui/formControlElements/ui/FieldWrapper.tsx +33 -0
  139. package/lib/shared/ui/formControlElements/ui/Label.tsx +32 -0
  140. package/lib/shared/ui/formControlElements/ui/MessageView.tsx +41 -0
  141. package/lib/shared/ui/formControlElements/ui/index.ts +4 -0
  142. package/lib/shared/ui/icon/Icon.tsx +41 -0
  143. package/lib/shared/ui/icon/index.ts +2 -0
  144. package/lib/shared/ui/icon/sprite.gen.ts +177 -0
  145. package/lib/shared/ui/index.ts +68 -0
  146. package/lib/shared/ui/modal/Modal.tsx +68 -0
  147. package/lib/shared/ui/modal/index.ts +1 -0
  148. package/lib/shared/ui/modal/model/helpers.ts +13 -0
  149. package/lib/shared/ui/modal/ui/ModalHeader.tsx +33 -0
  150. package/lib/shared/ui/notification/Notification.tsx +31 -0
  151. package/lib/shared/ui/notification/index.ts +1 -0
  152. package/lib/shared/ui/notification/ui/CustomToast.tsx +42 -0
  153. package/lib/shared/ui/popover/Popover.tsx +74 -0
  154. package/lib/shared/ui/popover/index.ts +1 -0
  155. package/lib/shared/ui/providers/NotificationProvider.tsx +29 -0
  156. package/lib/shared/ui/providers/index.ts +1 -0
  157. package/lib/shared/ui/table/Table.tsx +144 -0
  158. package/lib/shared/ui/table/index.ts +1 -0
  159. package/lib/shared/ui/table/type.ts +30 -0
  160. package/lib/shared/utils/capitalize.ts +6 -0
  161. package/lib/shared/utils/cn.ts +6 -0
  162. package/lib/shared/utils/deepCompare.ts +1 -0
  163. package/lib/shared/utils/formatToDate.ts +5 -0
  164. package/lib/shared/utils/index.ts +5 -0
  165. package/lib/shared/utils/isClient.ts +1 -0
  166. package/lib/shared/validation/index.ts +3 -0
  167. package/lib/shared/validation/messages.ts +12 -0
  168. package/lib/shared/validation/regExp.ts +5 -0
  169. package/lib/shared/validation/zodValidation/calendar.ts +32 -0
  170. package/lib/shared/validation/zodValidation/dadataFio.ts +67 -0
  171. package/lib/shared/validation/zodValidation/index.ts +2 -0
  172. package/lib/vite-env.d.ts +2 -0
  173. package/lib/widgets/Advantages.tsx +45 -0
  174. package/lib/widgets/banner/Banner.tsx +74 -0
  175. package/lib/widgets/banner/index.ts +1 -0
  176. package/lib/widgets/banner/model/helpers.ts +159 -0
  177. package/lib/widgets/banner/money.png +0 -0
  178. package/lib/widgets/banner/saif.jpg +0 -0
  179. package/lib/widgets/banner/saifMob.jpg +0 -0
  180. package/lib/widgets/banner/seif.jpg +0 -0
  181. package/lib/widgets/banner/shield.jpg +0 -0
  182. package/lib/widgets/banner/shield.png +0 -0
  183. package/lib/widgets/banner/ui/BannerButtonsGroup.tsx +44 -0
  184. package/lib/widgets/banner/ui/banners/BannerImageFull.tsx +82 -0
  185. package/lib/widgets/banner/ui/banners/BannerWithSeparateImg.tsx +60 -0
  186. package/lib/widgets/banner/ui/banners/index.ts +1 -0
  187. package/lib/widgets/footer/Footer.tsx +95 -0
  188. package/lib/widgets/footer/index.ts +1 -0
  189. package/lib/widgets/footer/model/defaultValues.tsx +105 -0
  190. package/lib/widgets/footer/model/types.ts +19 -0
  191. package/lib/widgets/footer/ui/Copyright.tsx +15 -0
  192. package/lib/widgets/footer/ui/Ligal.tsx +50 -0
  193. package/lib/widgets/footer/ui/NavLinks.tsx +41 -0
  194. package/lib/widgets/footer/ui/PhonesBlock.tsx +34 -0
  195. package/lib/widgets/footer/ui/SocialLinks.tsx +30 -0
  196. package/lib/widgets/footer/ui/index.ts +5 -0
  197. package/lib/widgets/index.ts +5 -0
  198. package/lib/widgets/pageHeader/PageHeader.tsx +54 -0
  199. package/lib/widgets/pageHeader/index.ts +1 -0
  200. package/lib/widgets/stepper/Stepper.tsx +43 -0
  201. package/lib/widgets/stepper/index.ts +1 -0
  202. package/lib/widgets/stepper/ui/SingleStep.tsx +42 -0
  203. package/package.json +1 -4
  204. package/postcss.config.mjs +8 -0
  205. package/public/sprites/arrows.svg +1 -0
  206. package/public/sprites/brandLogos.svg +1 -0
  207. package/public/sprites/files.svg +1 -0
  208. package/public/sprites/general.svg +1 -0
  209. package/public/sprites/info.svg +1 -0
  210. package/public/sprites/social.svg +1 -0
  211. package/src/App.tsx +9 -0
  212. package/src/app/providers/RootProvider.tsx +11 -0
  213. package/src/app/providers/index.ts +1 -0
  214. package/src/app/providers/model/types.ts +5 -0
  215. package/src/configs/setup.ts +9 -0
  216. package/src/configs/storybook.config.ts +23 -0
  217. package/src/main.tsx +10 -0
  218. package/src/stories/primitives/Accordion.stories.tsx +66 -0
  219. package/src/stories/primitives/Badge.stories.tsx +28 -0
  220. package/src/stories/primitives/Breadcrumbs.stories.tsx +29 -0
  221. package/src/stories/primitives/Button/Button.stories.tsx +149 -0
  222. package/src/stories/primitives/Button/Button.test.tsx +150 -0
  223. package/src/stories/primitives/ButtonIcon.stories.tsx +75 -0
  224. package/src/stories/primitives/CustomLink.stories.tsx +64 -0
  225. package/src/stories/primitives/Document.stories.tsx +36 -0
  226. package/src/stories/primitives/Heading.stories.tsx +29 -0
  227. package/src/stories/primitives/Hint.stories.tsx +82 -0
  228. package/src/stories/primitives/Icon.stories.tsx +36 -0
  229. package/src/stories/primitives/Loader.stories.tsx +39 -0
  230. package/src/stories/primitives/Modal.stories.tsx +106 -0
  231. package/src/stories/primitives/Notification.stories.tsx +102 -0
  232. package/src/stories/primitives/PhoneView.stories.tsx +22 -0
  233. package/src/stories/primitives/Popover.stories.tsx +41 -0
  234. package/src/stories/primitives/ProgressBar.stories.tsx +68 -0
  235. package/src/stories/primitives/Skeleton.stories.tsx +21 -0
  236. package/src/stories/primitives/Table.stories.tsx +44 -0
  237. package/src/stories/primitives/TabsSwitcher.stories.tsx +45 -0
  238. package/src/stories/primitives/formControl/CalendarControl.stories.tsx +45 -0
  239. package/src/stories/primitives/formControl/CheckboxControl.stories.tsx +64 -0
  240. package/src/stories/primitives/formControl/ComboboxControl.stories.tsx +67 -0
  241. package/src/stories/primitives/formControl/DadataInputControl.stories.tsx +79 -0
  242. package/src/stories/primitives/formControl/EditorControl.stories.tsx +31 -0
  243. package/src/stories/primitives/formControl/FormControlAllFields.stories.tsx +25 -0
  244. package/src/stories/primitives/formControl/InputControl.stories.tsx +84 -0
  245. package/src/stories/primitives/formControl/InputControlPassword.stories.tsx +38 -0
  246. package/src/stories/primitives/formControl/InputControlUploader.stories.tsx +44 -0
  247. package/src/stories/primitives/formControl/InputCurrencyControl.stories.tsx +73 -0
  248. package/src/stories/primitives/formControl/InputSliderControl.stories.tsx +62 -0
  249. package/src/stories/primitives/formControl/RadioContol.stories.tsx +61 -0
  250. package/src/stories/primitives/formControl/SwitchControl.stories.tsx +51 -0
  251. package/src/stories/primitives/formControl/TextareaControl.stories.tsx +55 -0
  252. package/src/stories/primitives/formControl/inputControlMask.stories.tsx +67 -0
  253. package/src/stories/widgets/Advantages.stories.tsx +42 -0
  254. package/src/stories/widgets/Banner.stories.tsx +94 -0
  255. package/src/stories/widgets/Footer.stories.tsx +36 -0
  256. package/src/stories/widgets/PageHeader.stories.tsx +33 -0
  257. package/src/stories/widgets/Stepper.stories.tsx +24 -0
  258. package/src/storybookHelpers/actions.tsx +5 -0
  259. package/src/storybookHelpers/index.ts +2 -0
  260. package/src/storybookHelpers/reactHookForm/index.ts +3 -0
  261. package/src/storybookHelpers/reactHookForm/model/mockData.ts +19 -0
  262. package/src/storybookHelpers/reactHookForm/model/mocks.tsx +105 -0
  263. package/src/storybookHelpers/reactHookForm/model/renderFields.tsx +58 -0
  264. package/src/storybookHelpers/reactHookForm/model/types.ts +86 -0
  265. package/src/storybookHelpers/reactHookForm/ui/StorybookFieldsMapper.tsx +32 -0
  266. package/src/storybookHelpers/reactHookForm/ui/StorybookFormProvider.tsx +43 -0
  267. package/src/storybookHelpers/reactHookForm/ui/index.ts +2 -0
  268. package/src/storybookHelpers/table/utils/defaultValue.ts +51 -0
  269. package/static/arrows/arrowCircle.svg +18 -0
  270. package/static/arrows/arrowLink.svg +3 -0
  271. package/static/arrows/arrowRight.svg +3 -0
  272. package/static/brandLogos/logoBlack.svg +14 -0
  273. package/static/brandLogos/logoBusiness.svg +80 -0
  274. package/static/brandLogos/logoGray.svg +56 -0
  275. package/static/brandLogos/logoInsurance.svg +124 -0
  276. package/static/brandLogos/logoMain.svg +14 -0
  277. package/static/brandLogos/logoWhite.svg +56 -0
  278. package/static/files/border.svg +6 -0
  279. package/static/files/borderError.svg +6 -0
  280. package/static/files/documentFilled.svg +4 -0
  281. package/static/files/documentOutline.svg +4 -0
  282. package/static/files/upload.svg +3 -0
  283. package/static/general/calendar.svg +3 -0
  284. package/static/general/check.svg +6 -0
  285. package/static/general/close.svg +12 -0
  286. package/static/general/edit.svg +4 -0
  287. package/static/general/hiddenEye.svg +4 -0
  288. package/static/general/plus.svg +3 -0
  289. package/static/general/showEye.svg +4 -0
  290. package/static/info/warningCircle.svg +5 -0
  291. package/static/social/classmates.svg +3 -0
  292. package/static/social/telegram.svg +3 -0
  293. package/static/social/vk.svg +3 -0
  294. package/tailwind.config.ts +10 -0
  295. package/tsconfig.json +33 -0
  296. package/tsconfig.node.json +11 -0
  297. package/vite.config.ts +68 -0
  298. package/vitest.config.mjs +12 -0
  299. package/dist/scbt-ecom-ui-0.4.1.tgz +0 -0
@@ -0,0 +1,117 @@
1
+ import { type ComponentProps, forwardRef, type ReactElement } from 'react'
2
+ import { cva, type VariantProps } from 'class-variance-authority'
3
+ import { Loader } from '../Loader'
4
+ import { setButtonLoaderIntent } from './model/helpers'
5
+ import { cn } from '$/shared/utils'
6
+
7
+ const buttonConfig = cva(
8
+ 'relative flex items-center justify-center gap-4 cursor-pointer rounded-sm w-max px-4 outline-offset-4 outline-transparent outline-2 desk-body-regular-l transition duration-12 active:scale-[0.97] disabled:pointer-events-none',
9
+ {
10
+ variants: {
11
+ intent: {
12
+ primary:
13
+ 'bg-color-primary-default text-color-white outline-offset-[3px] hover:bg-color-primary-hover active:bg-color-primary-hover focus:bg-color-primary-default focus:outline-primary-focus disabled:bg-color-primary-disabled',
14
+ secondary:
15
+ 'bg-transparent text-color-primary-default border border-solid border-primary-default hover:bg-color-primary-tr-hover active:bg-color-primary-tr-pressed active:border-primary-hover focus:outline-primary-focus focus:bg-color-primary-tr-focus disabled:bg-color-blue-grey-200 disabled:text-color-primary-disabled disabled:border-transparent',
16
+ ghost:
17
+ 'bg-transparent text-color-primary-default hover:bg-color-primary-tr-hover hover:text-color-primary-hover focus:bg-color-primary-tr-focus focus:outline-primary-focus active:bg-color-primary-tr-pressed active:text-color-primary-hover disabled:text-color-primary-disabled disabled:bg-transparent',
18
+ negative:
19
+ 'bg-color-secondary-default text-color-white outline-offset-[3px] hover:bg-color-secondary-hover disabled:bg-color-secondary-disabled active:bg-color-secondary-hover focus:bg-color-secondary-default focus:outline-primary-focus'
20
+ },
21
+ size: {
22
+ sm: 'h-10',
23
+ md: 'h-12',
24
+ lg: 'h-14'
25
+ },
26
+ textFormat: {
27
+ capitalize: 'capitalize',
28
+ uppercase: 'uppercase',
29
+ lowercase: 'lowercase',
30
+ initial: 'initial'
31
+ },
32
+ isFull: {
33
+ true: 'w-full px-4'
34
+ },
35
+ isLoading: {
36
+ true: '',
37
+ false: ''
38
+ }
39
+ },
40
+ compoundVariants: [
41
+ {
42
+ intent: 'primary',
43
+ isLoading: true,
44
+ class: '!bg-color-primary-default'
45
+ },
46
+ {
47
+ intent: 'secondary',
48
+ isLoading: true,
49
+ class: '!bg-color-transparent !border-primary-hover'
50
+ },
51
+ {
52
+ intent: 'ghost',
53
+ isLoading: true,
54
+ class: '!bg-color-blue-grey-200'
55
+ },
56
+ {
57
+ intent: 'negative',
58
+ isLoading: true,
59
+ class: '!bg-color-secondary-default'
60
+ }
61
+ ],
62
+ defaultVariants: {
63
+ intent: 'primary',
64
+ size: 'md',
65
+ textFormat: 'initial',
66
+ isFull: false
67
+ }
68
+ }
69
+ )
70
+
71
+ type TButtonConfig = VariantProps<typeof buttonConfig>
72
+ export type TButtonIntents = 'primary' | 'secondary' | 'ghost' | 'negative'
73
+ export interface IButtonProps extends ComponentProps<'button'>, TButtonConfig {
74
+ iconLeft?: ReactElement
75
+ iconRight?: ReactElement
76
+ isLoading?: boolean
77
+ }
78
+
79
+ export const Button = forwardRef<HTMLButtonElement, IButtonProps>(
80
+ (
81
+ {
82
+ intent,
83
+ size,
84
+ className,
85
+ children,
86
+ type = 'button',
87
+ iconLeft,
88
+ iconRight,
89
+ disabled = false,
90
+ isLoading = false,
91
+ isFull = false,
92
+ textFormat,
93
+ ...props
94
+ },
95
+ ref
96
+ ) => {
97
+ return (
98
+ <button
99
+ ref={ref}
100
+ type={type}
101
+ disabled={disabled || isLoading}
102
+ className={cn(buttonConfig({ intent, size, textFormat, isLoading, isFull }), className)}
103
+ {...props}
104
+ >
105
+ {isLoading ? (
106
+ <Loader size='sm' intent={setButtonLoaderIntent(intent!)} />
107
+ ) : (
108
+ <>
109
+ {iconLeft && <span className='flex size-5 items-center justify-center'>{iconLeft}</span>}
110
+ {children}
111
+ {iconRight && <span className='flex size-5 items-center justify-center'>{iconRight}</span>}
112
+ </>
113
+ )}
114
+ </button>
115
+ )
116
+ }
117
+ )
@@ -0,0 +1 @@
1
+ export { Button, type IButtonProps } from './Button'
@@ -0,0 +1,16 @@
1
+ import type { TButtonIntents } from '../Button'
2
+
3
+ export const setButtonLoaderIntent = (intent: TButtonIntents) => {
4
+ switch (intent) {
5
+ case 'ghost':
6
+ case 'secondary':
7
+ return 'secondary'
8
+
9
+ case 'primary':
10
+ case 'negative':
11
+ return 'primary'
12
+
13
+ default:
14
+ return intent
15
+ }
16
+ }
@@ -0,0 +1,92 @@
1
+ 'use client'
2
+
3
+ import * as React from 'react'
4
+ import { Controller, type FieldValues } from 'react-hook-form'
5
+ import { Indicator, Root } from '@radix-ui/react-checkbox'
6
+ import { Icon } from '../icon/Icon'
7
+ import type { TAdditionalInputPrimitiveClasses, TControlledInputPrimitiveProps } from './model'
8
+ import { MessageView } from './ui'
9
+ import { cn } from '$/shared/utils'
10
+
11
+ type TCheckboxClasses = Partial<TAdditionalInputPrimitiveClasses> & {
12
+ wrapper?: string
13
+ indicator?: string
14
+ }
15
+
16
+ export interface ICheckboxControlProps<T extends FieldValues> extends Omit<TControlledInputPrimitiveProps<T>, 'label'> {
17
+ classes?: TCheckboxClasses
18
+ label: React.ReactElement | string
19
+ }
20
+
21
+ export const CheckboxControl = <T extends FieldValues>({
22
+ control,
23
+ helperText,
24
+ label,
25
+ disabled,
26
+ classes,
27
+ ...props
28
+ }: ICheckboxControlProps<T>) => {
29
+ const checkboxId = React.useId()
30
+ return (
31
+ <Controller
32
+ name={props.name}
33
+ control={control}
34
+ render={({ field: { onChange, value, ref, name }, fieldState: { error } }) => {
35
+ return (
36
+ <div className={cn('flex max-w-[450px] flex-col', classes?.container)}>
37
+ <div className={cn('flex items-center gap-2', classes?.wrapper)}>
38
+ <div
39
+ className={cn(
40
+ 'flex size-10 items-center justify-center rounded-full transition-all focus-within:bg-color-primary-tr-focus hover:bg-color-primary-tr-hover',
41
+ classes?.field,
42
+ { '!bg-color-transparent': disabled }
43
+ )}
44
+ >
45
+ <Root
46
+ name={name}
47
+ value={value}
48
+ ref={ref}
49
+ onCheckedChange={(e) => {
50
+ onChange(e)
51
+ }}
52
+ className={cn(
53
+ 'flex size-6 cursor-pointer items-center justify-center rounded-sm border border-solid border-blue-grey-700 outline-none active:bg-color-primary-tr-pressed disabled:border-transparent data-[state=checked]:bg-color-primary-default data-[state=checked]:disabled:bg-color-primary-disabled data-[state=unchecked]:disabled:bg-color-blue-grey-300',
54
+ { '!border-negative': !!error?.message },
55
+ classes?.input
56
+ )}
57
+ disabled={disabled}
58
+ id={checkboxId}
59
+ defaultChecked={value}
60
+ checked={value}
61
+ >
62
+ <Indicator
63
+ className={cn('flex items-center justify-center data-[state=checked]:text-icon-white', classes?.indicator)}
64
+ >
65
+ <Icon name='general/check' className='size-5' />
66
+ </Indicator>
67
+ </Root>
68
+ </div>
69
+
70
+ <label
71
+ className={cn(
72
+ 'desk-body-regular-m flex-1 cursor-pointer text-color-dark',
73
+ { 'text-color-disabled': disabled },
74
+ classes?.label
75
+ )}
76
+ htmlFor={checkboxId}
77
+ >
78
+ {label}
79
+ </label>
80
+ </div>
81
+ <MessageView
82
+ className={cn(classes?.message)}
83
+ intent={error?.message ? 'error' : 'simple'}
84
+ text={error?.message || helperText}
85
+ disabled={disabled}
86
+ />
87
+ </div>
88
+ )
89
+ }}
90
+ />
91
+ )
92
+ }
@@ -0,0 +1,5 @@
1
+ export interface IFormControlProps {}
2
+
3
+ export const FormControl = () => {
4
+ return <div className=''>Form example</div>
5
+ }
@@ -0,0 +1,90 @@
1
+ 'use client'
2
+
3
+ import * as React from 'react'
4
+ import { Controller, type FieldValues } from 'react-hook-form'
5
+ import { PatternFormat } from 'react-number-format'
6
+ import type { TAdditionalInputClassesWithAttachment, TControlledInputProps, TInputCommonProps } from './model'
7
+ import { FieldAttachment, FieldWrapper, MessageView } from './ui'
8
+ import { FieldContainer } from './ui/FieldContainer'
9
+ import { cn } from '$/shared/utils'
10
+
11
+ export interface InputControlMaskProps<T extends FieldValues> extends TControlledInputProps<T>, TInputCommonProps {
12
+ format: string
13
+ mask?: string | string[]
14
+ allowEmptyFormatting?: boolean
15
+ onInputChange?: (arg?: string) => void
16
+ classes?: Partial<TAdditionalInputClassesWithAttachment>
17
+ }
18
+
19
+ export const InputControlMask = <T extends FieldValues>({
20
+ format,
21
+ allowEmptyFormatting = false,
22
+ mask = '',
23
+ control,
24
+ onInputChange,
25
+ size = 'full',
26
+ helperText,
27
+ label,
28
+ classes,
29
+ disabled,
30
+ badge,
31
+ icon,
32
+ swapPosition,
33
+ onClickIcon,
34
+ onKeyDownIcon,
35
+ ...props
36
+ }: InputControlMaskProps<T>) => {
37
+ const inputId = React.useId()
38
+ return (
39
+ <Controller
40
+ control={control}
41
+ name={props.name}
42
+ render={({ field: { onChange, value }, fieldState: { error } }) => (
43
+ <FieldContainer size={size} classes={classes}>
44
+ <FieldWrapper
45
+ fieldId={inputId}
46
+ label={label}
47
+ classes={classes}
48
+ disabled={disabled}
49
+ value={value}
50
+ error={!!error?.message}
51
+ >
52
+ <>
53
+ <PatternFormat
54
+ value={value?.toString()}
55
+ className={cn(
56
+ 'desk-body-regular-l h-[56px] w-full rounded-md bg-color-transparent px-4 pt-5 text-color-dark outline-none transition-all',
57
+ classes?.input
58
+ )}
59
+ format={format}
60
+ allowEmptyFormatting={allowEmptyFormatting}
61
+ mask={mask}
62
+ onChange={(e) => {
63
+ onChange(e)
64
+ if (onInputChange) {
65
+ onInputChange(e.target.value)
66
+ }
67
+ }}
68
+ {...props}
69
+ />
70
+ <FieldAttachment
71
+ onClickIcon={onClickIcon}
72
+ onKeyDownIcon={onKeyDownIcon}
73
+ badge={badge}
74
+ icon={icon}
75
+ error={!!error?.message}
76
+ classes={classes}
77
+ swapPosition={swapPosition}
78
+ />
79
+ </>
80
+ </FieldWrapper>
81
+ <MessageView
82
+ className={cn(classes?.message)}
83
+ intent={error?.message ? 'error' : 'simple'}
84
+ text={error?.message || helperText}
85
+ />
86
+ </FieldContainer>
87
+ )}
88
+ />
89
+ )
90
+ }
@@ -0,0 +1,130 @@
1
+ 'use client'
2
+
3
+ import { Controller, type FieldValues } from 'react-hook-form'
4
+ import { Indicator, Item, Root } from '@radix-ui/react-radio-group'
5
+ import { cva, type VariantProps } from 'class-variance-authority'
6
+ import type { TAdditionalInputPrimitiveClasses, TControlledInputPrimitiveProps } from './model'
7
+ import { MessageView } from './ui'
8
+ import { cn } from '$/shared/utils'
9
+
10
+ const radioOptionsConfig = cva('flex gap-2', {
11
+ variants: {
12
+ orientation: {
13
+ horizontal: '',
14
+ vertical: 'flex-col'
15
+ }
16
+ },
17
+ defaultVariants: {
18
+ orientation: 'vertical'
19
+ }
20
+ })
21
+
22
+ type TRadioClasses = Partial<TAdditionalInputPrimitiveClasses> & {
23
+ groupName?: string
24
+ radioGroup?: string
25
+ radioOption?: string
26
+ indicator?: string
27
+ }
28
+
29
+ export interface IRadioGroupOption {
30
+ label: string
31
+ value: string
32
+ isDisabled?: boolean
33
+ }
34
+
35
+ type TRadioOptionsConfig = VariantProps<typeof radioOptionsConfig>
36
+
37
+ export interface IRadioControlProps<T extends FieldValues>
38
+ extends TRadioOptionsConfig,
39
+ Omit<TControlledInputPrimitiveProps<T>, 'label'> {
40
+ radioItemsGroup: IRadioGroupOption[]
41
+ groupName?: string
42
+ classes?: TRadioClasses
43
+ label?: never
44
+ }
45
+
46
+ export const RadioControl = <T extends FieldValues>({
47
+ radioItemsGroup,
48
+ control,
49
+ groupName,
50
+ helperText,
51
+ disabled,
52
+ classes,
53
+ orientation,
54
+ ...props
55
+ }: IRadioControlProps<T>) => {
56
+ return (
57
+ <Controller
58
+ name={props.name}
59
+ control={control}
60
+ render={({ field: { onChange, value: controlledValue, ref, name }, fieldState: { error } }) => {
61
+ return (
62
+ <div className={cn('flex max-w-max flex-col gap-4', classes?.container)}>
63
+ {groupName && <span className={cn('desk-body-regular-l text-color-dark', classes?.groupName)}>{groupName}</span>}
64
+ <div className={cn('flex flex-col', classes?.field)}>
65
+ <Root
66
+ onValueChange={onChange}
67
+ name={name}
68
+ value={controlledValue}
69
+ ref={ref}
70
+ className={cn(radioOptionsConfig({ orientation }), classes?.radioGroup)}
71
+ defaultValue={controlledValue}
72
+ >
73
+ {radioItemsGroup.map(({ label, value, isDisabled }) => (
74
+ <div key={value} className={cn('flex items-center gap-2', classes?.radioOption)}>
75
+ <div
76
+ className={cn(
77
+ 'flex size-10 items-center justify-center rounded-full transition-all focus-within:bg-color-primary-tr-focus hover:bg-color-primary-tr-hover',
78
+ classes?.field,
79
+ { '!bg-color-transparent': isDisabled }
80
+ )}
81
+ >
82
+ <Item
83
+ disabled={isDisabled}
84
+ className={cn(
85
+ 'relative size-6 cursor-pointer rounded-full border-2 border-solid bg-color-transparent outline-none transition-all data-[state=checked]:border-primary-default data-[state=unchecked]:border-blue-grey-700',
86
+ {
87
+ 'data-[state=checked]:!border-primary-disabled data-[state=unchecked]:border-transparent data-[state=unchecked]:bg-color-blue-grey-300':
88
+ isDisabled
89
+ },
90
+ { '!border-negative': !!error?.message },
91
+ classes?.input
92
+ )}
93
+ value={value}
94
+ id={value}
95
+ >
96
+ <Indicator
97
+ className={cn(
98
+ 'after:content-[" "] relative flex h-full w-full items-center justify-center after:block after:size-3 after:rounded-full after:bg-color-primary-default',
99
+ { 'after:bg-color-primary-disabled': isDisabled },
100
+ classes?.indicator
101
+ )}
102
+ />
103
+ </Item>
104
+ </div>
105
+ <label
106
+ className={cn(
107
+ 'desk-body-regular-l cursor-pointer text-color-dark',
108
+ { 'text-color-disabled': isDisabled },
109
+ classes?.label
110
+ )}
111
+ htmlFor={value}
112
+ >
113
+ {label}
114
+ </label>
115
+ </div>
116
+ ))}
117
+ </Root>
118
+ <MessageView
119
+ className={cn(classes?.message)}
120
+ intent={error?.message ? 'error' : 'simple'}
121
+ text={error?.message || helperText}
122
+ disabled={disabled}
123
+ />
124
+ </div>
125
+ </div>
126
+ )
127
+ }}
128
+ />
129
+ )
130
+ }
@@ -0,0 +1,79 @@
1
+ 'use client'
2
+
3
+ import * as React from 'react'
4
+ import { Controller, type FieldValues } from 'react-hook-form'
5
+ import * as SwitchPrimitive from '@radix-ui/react-switch'
6
+ import { type TControlledInputPrimitiveProps } from './model'
7
+ import { MessageView } from './ui'
8
+ import { cn } from '$/shared/utils'
9
+
10
+ interface ISwitchClasses {
11
+ wrapper: string
12
+ input: string
13
+ thumb: string
14
+ textBlock: string
15
+ label: string
16
+ message: string
17
+ }
18
+
19
+ export interface ISwitchControlProps<T extends FieldValues> extends TControlledInputPrimitiveProps<T> {
20
+ disabled?: boolean
21
+ classes?: Partial<ISwitchClasses>
22
+ }
23
+
24
+ export const SwitchControl = <T extends FieldValues>({
25
+ disabled,
26
+ classes,
27
+ control,
28
+ helperText,
29
+ label,
30
+ ...props
31
+ }: ISwitchControlProps<T>) => {
32
+ const inputId = React.useId()
33
+ return (
34
+ <Controller
35
+ name={props.name}
36
+ control={control}
37
+ render={({ field: { onChange, value: controlledValue, ref, name }, fieldState: { error } }) => (
38
+ <div className={cn('flex items-center gap-2', classes?.wrapper)}>
39
+ <SwitchPrimitive.Root
40
+ ref={ref}
41
+ id={inputId}
42
+ disabled={disabled}
43
+ onCheckedChange={onChange}
44
+ value={controlledValue}
45
+ checked={controlledValue}
46
+ name={name}
47
+ className={cn(
48
+ 'h-6 w-10 rounded-full bg-color-blue-grey-300 p-[2px] outline-2 outline-offset-4 outline-transparent focus:outline-primary-focus data-[state=checked]:bg-color-primary-default hover:data-[state=checked]:bg-color-primary-hover',
49
+ { 'data-[state=checked]:!bg-color-primary-disabled data-[state=unchecked]:!bg-color-blue-grey-200': disabled },
50
+ classes?.input
51
+ )}
52
+ >
53
+ <SwitchPrimitive.Thumb
54
+ id={inputId}
55
+ className={cn(
56
+ 'block size-5 rounded-full bg-color-white transition-all duration-200 will-change-transform data-[state=checked]:translate-x-4',
57
+ classes?.thumb
58
+ )}
59
+ />
60
+ </SwitchPrimitive.Root>
61
+ <div className={cn('flex flex-col', classes?.textBlock)}>
62
+ <label
63
+ className={cn('desk-body-regular-l text-color-dark', { 'text-color-disabled': disabled }, classes?.label)}
64
+ htmlFor={inputId}
65
+ >
66
+ {label}
67
+ </label>
68
+ <MessageView
69
+ className={cn('mt-0', classes?.message)}
70
+ intent={error?.message ? 'error' : 'simple'}
71
+ text={error?.message || helperText}
72
+ disabled={disabled}
73
+ />
74
+ </div>
75
+ </div>
76
+ )}
77
+ />
78
+ )
79
+ }
@@ -0,0 +1,96 @@
1
+ 'use client'
2
+
3
+ import * as React from 'react'
4
+ import { Controller, type FieldValues } from 'react-hook-form'
5
+ import type { TAdditionalInputClassesWithAttachment, TControlledInputProps, TTextareaCommonProps } from './model'
6
+ import { FieldAttachment, FieldContainer, MessageView } from './ui'
7
+ import { cn } from '$/shared/utils'
8
+
9
+ type TTextareaClasses = Partial<TAdditionalInputClassesWithAttachment> & {
10
+ head: string
11
+ scrollArea: string
12
+ }
13
+
14
+ export interface ITextareaControlProps<T extends FieldValues> extends TControlledInputProps<T>, TTextareaCommonProps {
15
+ classes?: Partial<TTextareaClasses>
16
+ }
17
+
18
+ export const TextareaControl = <T extends FieldValues>({
19
+ label,
20
+ size = 'full',
21
+ helperText,
22
+ control,
23
+ classes,
24
+ badge,
25
+ icon,
26
+ swapPosition,
27
+ disabled,
28
+ placeholder,
29
+ onClickIcon,
30
+ onKeyDownIcon,
31
+ ...props
32
+ }: ITextareaControlProps<T>) => {
33
+ const inputId = React.useId()
34
+ return (
35
+ <Controller
36
+ control={control}
37
+ name={props.name}
38
+ render={({ field: { onChange, ref, value }, fieldState: { error } }) => (
39
+ <FieldContainer size={size} classes={classes}>
40
+ <div
41
+ className={cn(
42
+ 'relative flex h-[120px] flex-col rounded-sm border border-solid border-transparent bg-color-blue-grey-100 transition-colors hover:bg-color-blue-grey-200 focus:outline-blue-grey-800 active:bg-color-blue-grey-100 group-focus-within:border-blue-grey-800',
43
+ { '!border-negative': error },
44
+ { '!bg-color-blue-grey-100': disabled },
45
+ classes?.field
46
+ )}
47
+ >
48
+ <div className={cn('flex items-center justify-between px-4 pt-2', classes?.head)}>
49
+ <label
50
+ className={cn('desk-body-regular-s text-color-tetriary', { 'text-color-disabled': disabled }, classes?.label)}
51
+ htmlFor={inputId}
52
+ >
53
+ {label}
54
+ </label>
55
+ <FieldAttachment
56
+ onClickIcon={onClickIcon}
57
+ onKeyDownIcon={onKeyDownIcon}
58
+ badge={badge}
59
+ icon={icon}
60
+ error={!!error?.message}
61
+ classes={classes}
62
+ isTextarea
63
+ swapPosition={swapPosition}
64
+ />
65
+ </div>
66
+
67
+ <div className={cn('flex w-full items-start px-4 py-2', classes?.scrollArea)}>
68
+ <textarea
69
+ aria-invalid={error?.message ? 'true' : 'false'}
70
+ ref={ref}
71
+ className={cn(
72
+ 'customScrollbar-y desk-body-regular-l h-[78px] w-full flex-1 resize-none rounded-md bg-color-transparent text-color-dark outline-none transition-all placeholder:text-color-blue-grey-600',
73
+ { 'placeholder:text-color-disabled': disabled },
74
+ classes?.input
75
+ )}
76
+ id={inputId}
77
+ value={value}
78
+ onChange={onChange}
79
+ disabled={disabled}
80
+ placeholder={placeholder}
81
+ {...props}
82
+ />
83
+ </div>
84
+ </div>
85
+
86
+ <MessageView
87
+ className={cn(classes?.message)}
88
+ intent={error?.message ? 'error' : 'simple'}
89
+ text={error?.message || helperText}
90
+ disabled={disabled}
91
+ />
92
+ </FieldContainer>
93
+ )}
94
+ />
95
+ )
96
+ }