@povio/ui 0.0.2 → 0.0.3

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 (485) hide show
  1. package/package.json +67 -10
  2. package/src/assets/icons/AlignCenter.tsx +16 -0
  3. package/src/assets/icons/AlignLeft.tsx +16 -0
  4. package/src/assets/icons/AlignLeftRight.tsx +16 -0
  5. package/src/assets/icons/AlignRight.tsx +16 -0
  6. package/src/assets/icons/ArrowDropDown.tsx +16 -0
  7. package/src/assets/icons/ArrowDropUp.tsx +16 -0
  8. package/src/assets/icons/ArrowLeft.tsx +16 -0
  9. package/src/assets/icons/ArrowRight.tsx +16 -0
  10. package/src/assets/icons/Bold.tsx +16 -0
  11. package/src/assets/icons/BulletedList.tsx +16 -0
  12. package/src/assets/icons/Calendar.tsx +18 -0
  13. package/src/assets/icons/Check.tsx +18 -0
  14. package/src/assets/icons/CheckCircle.tsx +16 -0
  15. package/src/assets/icons/CheckboxCheckmark.tsx +19 -0
  16. package/src/assets/icons/CheckboxIndeterminate.tsx +19 -0
  17. package/src/assets/icons/ChevronDown.tsx +18 -0
  18. package/src/assets/icons/ChevronLeft.tsx +18 -0
  19. package/src/assets/icons/ChevronRight.tsx +18 -0
  20. package/src/assets/icons/ChevronUp.tsx +18 -0
  21. package/src/assets/icons/ChevronsLeft.tsx +24 -0
  22. package/src/assets/icons/ChevronsRight.tsx +24 -0
  23. package/src/assets/icons/Clock.tsx +16 -0
  24. package/src/assets/icons/Close.tsx +16 -0
  25. package/src/assets/icons/DateTime.tsx +20 -0
  26. package/src/assets/icons/Drag.tsx +16 -0
  27. package/src/assets/icons/File.tsx +18 -0
  28. package/src/assets/icons/Highlight.tsx +16 -0
  29. package/src/assets/icons/HighlightOn.tsx +26 -0
  30. package/src/assets/icons/Info.tsx +24 -0
  31. package/src/assets/icons/Italic.tsx +16 -0
  32. package/src/assets/icons/Link.tsx +16 -0
  33. package/src/assets/icons/Menu.tsx +18 -0
  34. package/src/assets/icons/NumberedList.tsx +16 -0
  35. package/src/assets/icons/PointerHorizontal.tsx +16 -0
  36. package/src/assets/icons/PointerVertical.tsx +16 -0
  37. package/src/assets/icons/Send.tsx +18 -0
  38. package/src/assets/icons/Strikethrough.tsx +16 -0
  39. package/src/assets/icons/TextColor.tsx +24 -0
  40. package/src/assets/icons/Today.tsx +16 -0
  41. package/src/assets/icons/Underlined.tsx +18 -0
  42. package/src/assets/icons/Upload.tsx +20 -0
  43. package/src/assets/icons/View.tsx +16 -0
  44. package/src/assets/icons/ViewOff.tsx +16 -0
  45. package/src/assets/icons/Warningfilled.tsx +18 -0
  46. package/src/assets/locales/en/translation.json +156 -0
  47. package/src/assets/locales/sl/translation.json +152 -0
  48. package/src/components/Menu/Menu.tsx +29 -0
  49. package/src/components/Menu/MenuDesktop.tsx +68 -0
  50. package/src/components/Menu/MenuItem.tsx +33 -0
  51. package/src/components/Menu/MenuMobile.tsx +81 -0
  52. package/src/components/Menu/MenuPopover.tsx +45 -0
  53. package/src/components/buttons/Button/Button.tsx +108 -0
  54. package/src/components/buttons/Button/button.cva.ts +678 -0
  55. package/src/components/buttons/IconButton/IconButton.tsx +25 -0
  56. package/src/components/buttons/InlineIconButton/InlineIconButton.tsx +27 -0
  57. package/src/components/buttons/PillButton/PillButton.tsx +70 -0
  58. package/src/components/buttons/PillButton/pillButton.cva.ts +88 -0
  59. package/src/components/buttons/SplitButton/SplitButton.tsx +61 -0
  60. package/src/components/buttons/TextButton/TextButton.tsx +29 -0
  61. package/src/components/buttons/ToggleButton/ToggleButton.tsx +28 -0
  62. package/src/components/buttons/shared/ButtonContent.tsx +61 -0
  63. package/src/components/buttons/shared/buttonContent.cva.ts +18 -0
  64. package/src/components/inputs/Checkbox/Checkbox.tsx +101 -0
  65. package/src/components/inputs/Checkbox/CheckboxCheckmark.tsx +47 -0
  66. package/src/components/inputs/Checkbox/checkbox.cva.ts +51 -0
  67. package/src/components/inputs/DateTime/DatePicker/DatePicker.tsx +269 -0
  68. package/src/components/inputs/DateTime/DateRangePicker/DateRangePicker.tsx +808 -0
  69. package/src/components/inputs/DateTime/DateTimePicker/DateTimePicker.tsx +291 -0
  70. package/src/components/inputs/DateTime/TimePicker/TimePicker.tsx +255 -0
  71. package/src/components/inputs/DateTime/shared/Calendar.tsx +104 -0
  72. package/src/components/inputs/DateTime/shared/CalendarCell.tsx +247 -0
  73. package/src/components/inputs/DateTime/shared/CalendarGrid.tsx +102 -0
  74. package/src/components/inputs/DateTime/shared/CalendarHeader.tsx +110 -0
  75. package/src/components/inputs/DateTime/shared/CalendarSelectHeader.tsx +228 -0
  76. package/src/components/inputs/DateTime/shared/DateField.tsx +83 -0
  77. package/src/components/inputs/DateTime/shared/DatePickerInput.tsx +170 -0
  78. package/src/components/inputs/DateTime/shared/DateSegmentItem.tsx +65 -0
  79. package/src/components/inputs/DateTime/shared/DateTimeDialog.tsx +87 -0
  80. package/src/components/inputs/DateTime/shared/DateTimeDialogFooter.tsx +42 -0
  81. package/src/components/inputs/DateTime/shared/MonthPicker.tsx +91 -0
  82. package/src/components/inputs/DateTime/shared/RangeCalendar.tsx +160 -0
  83. package/src/components/inputs/DateTime/shared/TimeField.tsx +36 -0
  84. package/src/components/inputs/DateTime/shared/TimePickerForm.tsx +222 -0
  85. package/src/components/inputs/DateTime/shared/TimePickerInput.tsx +114 -0
  86. package/src/components/inputs/DateTime/shared/YearPicker.tsx +100 -0
  87. package/src/components/inputs/File/FileUpload.tsx +285 -0
  88. package/src/components/inputs/File/FileUploadContainer.tsx +16 -0
  89. package/src/components/inputs/File/InputUpload.tsx +196 -0
  90. package/src/components/inputs/File/fileUpload.types.ts +100 -0
  91. package/src/components/inputs/File/index.ts +15 -0
  92. package/src/components/inputs/File/inputUpload.types.ts +41 -0
  93. package/src/components/inputs/File/shared/FileCard.tsx +72 -0
  94. package/src/components/inputs/File/shared/FileCardList.tsx +30 -0
  95. package/src/components/inputs/File/shared/FileProgressBar.tsx +25 -0
  96. package/src/components/inputs/File/shared/FileUploadContent.tsx +99 -0
  97. package/src/components/inputs/File/shared/FileUploadContentEmpty.tsx +94 -0
  98. package/src/components/inputs/File/shared/FileUploadContentError.tsx +170 -0
  99. package/src/components/inputs/File/shared/FileUploadContentFilled.tsx +179 -0
  100. package/src/components/inputs/File/shared/FileUploadContentLoading.tsx +115 -0
  101. package/src/components/inputs/File/shared/InputUploadContent.tsx +68 -0
  102. package/src/components/inputs/File/shared/InputUploadFilled.tsx +32 -0
  103. package/src/components/inputs/File/shared/fileUpload.cva.ts +59 -0
  104. package/src/components/inputs/File/shared/inputUploadButton.cva.ts +48 -0
  105. package/src/components/inputs/FormField/FormField.tsx +69 -0
  106. package/src/components/inputs/FormField/FormFieldError.tsx +21 -0
  107. package/src/components/inputs/FormField/FormFieldHeader.tsx +75 -0
  108. package/src/components/inputs/FormField/FormFieldHeaderClose.tsx +23 -0
  109. package/src/components/inputs/FormField/FormFieldLabel.tsx +41 -0
  110. package/src/components/inputs/Input/NumberInput/NumberInput.tsx +180 -0
  111. package/src/components/inputs/Input/PasswordInput/PasswordInput.tsx +34 -0
  112. package/src/components/inputs/Input/TextArea/TextArea.tsx +166 -0
  113. package/src/components/inputs/Input/TextInput/TextInput.tsx +181 -0
  114. package/src/components/inputs/Input/shared/InputContent.tsx +154 -0
  115. package/src/components/inputs/Inputs/Form.tsx +129 -0
  116. package/src/components/inputs/Inputs/InputItem.tsx +127 -0
  117. package/src/components/inputs/Inputs/Inputs.tsx +43 -0
  118. package/src/components/inputs/RadioGroup/RadioGroup.tsx +139 -0
  119. package/src/components/inputs/RadioGroup/radio.cva.ts +51 -0
  120. package/src/components/inputs/Selection/Autocomplete/Autocomplete.tsx +61 -0
  121. package/src/components/inputs/Selection/Autocomplete/QueryAutocomplete.tsx +58 -0
  122. package/src/components/inputs/Selection/Select/Select.tsx +59 -0
  123. package/src/components/inputs/Selection/shared/SelectBase.tsx +69 -0
  124. package/src/components/inputs/Selection/shared/SelectDesktop.tsx +236 -0
  125. package/src/components/inputs/Selection/shared/SelectInput.tsx +278 -0
  126. package/src/components/inputs/Selection/shared/SelectListBox.tsx +121 -0
  127. package/src/components/inputs/Selection/shared/SelectListBoxItem.tsx +79 -0
  128. package/src/components/inputs/Selection/shared/SelectListBoxItemSelectAll.tsx +40 -0
  129. package/src/components/inputs/Selection/shared/SelectListBoxLoadingItem.tsx +52 -0
  130. package/src/components/inputs/Selection/shared/SelectListBoxSelectionBar.tsx +39 -0
  131. package/src/components/inputs/Selection/shared/SelectMobile.tsx +169 -0
  132. package/src/components/inputs/Selection/shared/select.context.tsx +316 -0
  133. package/src/components/inputs/Selection/shared/select.types.ts +75 -0
  134. package/src/components/inputs/Selection/shared/useSelectItems.tsx +127 -0
  135. package/src/components/inputs/Slider/Slider.tsx +174 -0
  136. package/src/components/inputs/TextEditor/TextEditor.tsx +239 -0
  137. package/src/components/inputs/TextEditor/Toolbar/ColorPicker.tsx +34 -0
  138. package/src/components/inputs/TextEditor/Toolbar/ColorPickerDropdown.tsx +74 -0
  139. package/src/components/inputs/TextEditor/Toolbar/HyperlinkAction.tsx +87 -0
  140. package/src/components/inputs/TextEditor/Toolbar/TextAlignSelect.tsx +64 -0
  141. package/src/components/inputs/TextEditor/Toolbar/TextColorSelect.tsx +30 -0
  142. package/src/components/inputs/TextEditor/Toolbar/TextEditorToolbar.tsx +40 -0
  143. package/src/components/inputs/TextEditor/Toolbar/TextHighlightSelect.tsx +39 -0
  144. package/src/components/inputs/TextEditor/Toolbar/TextListActions.tsx +57 -0
  145. package/src/components/inputs/TextEditor/Toolbar/TextMarksActions.tsx +79 -0
  146. package/src/components/inputs/TextEditor/Toolbar/TextStyleSelect.tsx +73 -0
  147. package/src/components/inputs/TextEditor/textEditor.types.ts +43 -0
  148. package/src/components/inputs/Toggle/Toggle.tsx +80 -0
  149. package/src/components/inputs/Toggle/toggle.cva.ts +48 -0
  150. package/src/components/inputs/shared/CheckContent.tsx +26 -0
  151. package/src/components/inputs/shared/InputClear.tsx +29 -0
  152. package/src/components/inputs/shared/form.types.ts +28 -0
  153. package/src/components/inputs/shared/input.cva.ts +182 -0
  154. package/src/components/inputs/shared/label.cva.ts +146 -0
  155. package/src/components/outline.clsx.ts +9 -0
  156. package/src/components/overlays/ActionModal/ActionModal.tsx +93 -0
  157. package/src/components/overlays/BottomSheet/BottomSheet.tsx +270 -0
  158. package/src/components/overlays/Drawer/Drawer.tsx +93 -0
  159. package/src/components/overlays/Modal/Modal.tsx +63 -0
  160. package/src/components/overlays/Modal/modal.cva.ts +55 -0
  161. package/src/components/overlays/ResponsivePopover/ResponsivePopover.tsx +77 -0
  162. package/src/components/overlays/Tooltip/Tooltip.tsx +47 -0
  163. package/src/components/overlays/Tooltip/TooltipEllipsis.tsx +35 -0
  164. package/src/components/segment/Segment.tsx +121 -0
  165. package/src/components/segment/SegmentItem.tsx +41 -0
  166. package/src/components/segment/segment.types.ts +44 -0
  167. package/src/components/shared/pagination/Pagination.tsx +75 -0
  168. package/src/components/shared/pagination/PaginationList.tsx +174 -0
  169. package/src/components/shared/pagination/minWidth.cva.ts +13 -0
  170. package/src/components/status/Alert/Alert.tsx +58 -0
  171. package/src/components/status/Alert/alert.cva.ts +66 -0
  172. package/src/components/status/Loader/Loader.tsx +32 -0
  173. package/src/components/status/Loader/loader.cva.ts +29 -0
  174. package/src/components/status/Toast/Toast.tsx +86 -0
  175. package/src/components/status/Toast/toast.cva.ts +154 -0
  176. package/src/components/status/Toast/useToast.tsx +77 -0
  177. package/src/components/status/shared/status.cva.ts +60 -0
  178. package/src/components/table/CellText.tsx +23 -0
  179. package/src/components/table/ColumnConfig.tsx +145 -0
  180. package/src/components/table/HeaderText.tsx +18 -0
  181. package/src/components/table/InfiniteTable.tsx +51 -0
  182. package/src/components/table/PaginatedTable.tsx +38 -0
  183. package/src/components/table/Table.tsx +456 -0
  184. package/src/components/table/table.cva.ts +47 -0
  185. package/src/components/text/Link/Link.tsx +21 -0
  186. package/src/components/text/Link/link.cva.ts +21 -0
  187. package/src/components/text/Tag/Tag.tsx +59 -0
  188. package/src/components/text/Tag/tag.cva.ts +62 -0
  189. package/src/components/text/Typography/Typography.tsx +33 -0
  190. package/src/components/text/Typography/typography.cva.ts +102 -0
  191. package/src/config/confirmation.context.tsx +133 -0
  192. package/src/config/i18n.ts +12 -0
  193. package/src/config/router.context.tsx +66 -0
  194. package/src/config/uiConfig.context.tsx +89 -0
  195. package/src/config/uiStyle.context.tsx +100 -0
  196. package/src/helpers/dynamicColumns.ts +567 -0
  197. package/src/helpers/dynamicInputs.ts +392 -0
  198. package/src/hooks/useAutosave.ts +109 -0
  199. package/src/hooks/useBreakpoint.ts +26 -0
  200. package/src/hooks/useDebounceCallback.ts +35 -0
  201. package/src/hooks/useDeepCompare.ts +27 -0
  202. package/src/hooks/useFilters.ts +154 -0
  203. package/src/hooks/useForm.ts +54 -0
  204. package/src/hooks/useFormAutosave.ts +100 -0
  205. package/src/hooks/useIntersectionObserver.ts +33 -0
  206. package/src/hooks/useLocalStorage.ts +81 -0
  207. package/src/hooks/useLongPressRepeat.ts +40 -0
  208. package/src/hooks/usePagination.ts +41 -0
  209. package/src/hooks/useScrollableListBox.ts +35 -0
  210. package/src/hooks/useSingletonMutation.ts +30 -0
  211. package/src/hooks/useSorting.ts +39 -0
  212. package/src/hooks/useStateAndRef.ts +20 -0
  213. package/src/hooks/useTableColumnConfig.ts +86 -0
  214. package/src/hooks/useTableNav.ts +615 -0
  215. package/src/hooks/useTranslationMemo.ts +17 -0
  216. package/src/index.ts +252 -0
  217. package/src/types/{common.d.ts → common.ts} +15 -4
  218. package/src/types/i18next.d.ts +11 -0
  219. package/src/types/react-query.ts +48 -0
  220. package/src/types/table.d.ts +17 -0
  221. package/src/utils/array.utils.spec.ts +16 -0
  222. package/src/utils/array.utils.ts +9 -0
  223. package/src/utils/compoundMapper.spec.ts +91 -0
  224. package/src/utils/compoundMapper.ts +42 -0
  225. package/src/utils/date-time.utils.spec.ts +48 -0
  226. package/src/utils/date-time.utils.ts +85 -0
  227. package/src/utils/date.utils.spec.ts +12 -0
  228. package/src/utils/date.utils.ts +9 -0
  229. package/src/utils/dom.utils.ts +16 -0
  230. package/src/utils/file.utils.ts +73 -0
  231. package/src/utils/isEqual.ts +153 -0
  232. package/src/utils/logger.ts +19 -0
  233. package/src/utils/object.utils.ts +62 -0
  234. package/src/utils/queries.utils.ts +10 -0
  235. package/src/utils/rest/interceptors/logging.interceptor.ts +16 -0
  236. package/src/utils/rest/interceptors/response.interceptor.ts +27 -0
  237. package/src/utils/rest/interceptors/rest-interceptor.ts +22 -0
  238. package/src/utils/rest/rest-client.ts +125 -0
  239. package/src/utils/rest/rest.utils.ts +65 -0
  240. package/src/utils/routing.utils.ts +12 -0
  241. package/src/utils/string.utils.ts +9 -0
  242. package/src/utils/vendor/error-handling.ts +170 -0
  243. package/src/utils/zod.utils.ts +95 -0
  244. package/index.js +0 -61206
  245. package/povio-ui-0.0.2.tgz +0 -0
  246. package/src/assets/icons/AlignCenter.d.ts +0 -2
  247. package/src/assets/icons/AlignLeft.d.ts +0 -2
  248. package/src/assets/icons/AlignLeftRight.d.ts +0 -2
  249. package/src/assets/icons/AlignRight.d.ts +0 -2
  250. package/src/assets/icons/ArrowDropDown.d.ts +0 -2
  251. package/src/assets/icons/ArrowDropUp.d.ts +0 -2
  252. package/src/assets/icons/ArrowLeft.d.ts +0 -2
  253. package/src/assets/icons/ArrowRight.d.ts +0 -2
  254. package/src/assets/icons/Bold.d.ts +0 -2
  255. package/src/assets/icons/BulletedList.d.ts +0 -2
  256. package/src/assets/icons/Calendar.d.ts +0 -2
  257. package/src/assets/icons/Check.d.ts +0 -2
  258. package/src/assets/icons/CheckCircle.d.ts +0 -2
  259. package/src/assets/icons/CheckboxCheckmark.d.ts +0 -2
  260. package/src/assets/icons/CheckboxIndeterminate.d.ts +0 -2
  261. package/src/assets/icons/ChevronDown.d.ts +0 -2
  262. package/src/assets/icons/ChevronLeft.d.ts +0 -2
  263. package/src/assets/icons/ChevronRight.d.ts +0 -2
  264. package/src/assets/icons/ChevronUp.d.ts +0 -2
  265. package/src/assets/icons/ChevronsLeft.d.ts +0 -2
  266. package/src/assets/icons/ChevronsRight.d.ts +0 -2
  267. package/src/assets/icons/Clock.d.ts +0 -2
  268. package/src/assets/icons/Close.d.ts +0 -2
  269. package/src/assets/icons/DateTime.d.ts +0 -2
  270. package/src/assets/icons/Drag.d.ts +0 -2
  271. package/src/assets/icons/File.d.ts +0 -2
  272. package/src/assets/icons/Highlight.d.ts +0 -2
  273. package/src/assets/icons/HighlightOn.d.ts +0 -6
  274. package/src/assets/icons/Info.d.ts +0 -2
  275. package/src/assets/icons/Italic.d.ts +0 -2
  276. package/src/assets/icons/Link.d.ts +0 -2
  277. package/src/assets/icons/Menu.d.ts +0 -2
  278. package/src/assets/icons/NumberedList.d.ts +0 -2
  279. package/src/assets/icons/PointerHorizontal.d.ts +0 -2
  280. package/src/assets/icons/PointerVertical.d.ts +0 -2
  281. package/src/assets/icons/Send.d.ts +0 -2
  282. package/src/assets/icons/Strikethrough.d.ts +0 -2
  283. package/src/assets/icons/TextColor.d.ts +0 -6
  284. package/src/assets/icons/Today.d.ts +0 -2
  285. package/src/assets/icons/Underlined.d.ts +0 -2
  286. package/src/assets/icons/Upload.d.ts +0 -2
  287. package/src/assets/icons/View.d.ts +0 -2
  288. package/src/assets/icons/ViewOff.d.ts +0 -2
  289. package/src/assets/icons/Warningfilled.d.ts +0 -2
  290. package/src/components/Menu/Menu.d.ts +0 -14
  291. package/src/components/Menu/MenuDesktop.d.ts +0 -2
  292. package/src/components/Menu/MenuItem.d.ts +0 -5
  293. package/src/components/Menu/MenuMobile.d.ts +0 -2
  294. package/src/components/Menu/MenuPopover.d.ts +0 -5
  295. package/src/components/buttons/Button/Button.d.ts +0 -27
  296. package/src/components/buttons/Button/button.cva.d.ts +0 -30
  297. package/src/components/buttons/IconButton/IconButton.d.ts +0 -10
  298. package/src/components/buttons/InlineIconButton/InlineIconButton.d.ts +0 -11
  299. package/src/components/buttons/PillButton/PillButton.d.ts +0 -11
  300. package/src/components/buttons/PillButton/pillButton.cva.d.ts +0 -14
  301. package/src/components/buttons/SplitButton/SplitButton.d.ts +0 -10
  302. package/src/components/buttons/TextButton/TextButton.d.ts +0 -11
  303. package/src/components/buttons/ToggleButton/ToggleButton.d.ts +0 -9
  304. package/src/components/buttons/shared/ButtonContent.d.ts +0 -16
  305. package/src/components/buttons/shared/buttonContent.cva.d.ts +0 -6
  306. package/src/components/inputs/Checkbox/Checkbox.d.ts +0 -17
  307. package/src/components/inputs/Checkbox/CheckboxCheckmark.d.ts +0 -9
  308. package/src/components/inputs/Checkbox/checkbox.cva.d.ts +0 -11
  309. package/src/components/inputs/DateTime/DatePicker/DatePicker.d.ts +0 -24
  310. package/src/components/inputs/DateTime/DateRangePicker/DateRangePicker.d.ts +0 -32
  311. package/src/components/inputs/DateTime/DateTimePicker/DateTimePicker.d.ts +0 -22
  312. package/src/components/inputs/DateTime/TimePicker/TimePicker.d.ts +0 -20
  313. package/src/components/inputs/DateTime/shared/Calendar.d.ts +0 -20
  314. package/src/components/inputs/DateTime/shared/CalendarCell.d.ts +0 -20
  315. package/src/components/inputs/DateTime/shared/CalendarGrid.d.ts +0 -25
  316. package/src/components/inputs/DateTime/shared/CalendarHeader.d.ts +0 -16
  317. package/src/components/inputs/DateTime/shared/CalendarSelectHeader.d.ts +0 -17
  318. package/src/components/inputs/DateTime/shared/DateField.d.ts +0 -12
  319. package/src/components/inputs/DateTime/shared/DatePickerInput.d.ts +0 -20
  320. package/src/components/inputs/DateTime/shared/DateSegmentItem.d.ts +0 -11
  321. package/src/components/inputs/DateTime/shared/DateTimeDialog.d.ts +0 -15
  322. package/src/components/inputs/DateTime/shared/DateTimeDialogFooter.d.ts +0 -7
  323. package/src/components/inputs/DateTime/shared/MonthPicker.d.ts +0 -7
  324. package/src/components/inputs/DateTime/shared/RangeCalendar.d.ts +0 -26
  325. package/src/components/inputs/DateTime/shared/TimeField.d.ts +0 -12
  326. package/src/components/inputs/DateTime/shared/TimePickerForm.d.ts +0 -10
  327. package/src/components/inputs/DateTime/shared/TimePickerInput.d.ts +0 -18
  328. package/src/components/inputs/DateTime/shared/YearPicker.d.ts +0 -8
  329. package/src/components/inputs/File/FileUpload.d.ts +0 -4
  330. package/src/components/inputs/File/FileUploadContainer.d.ts +0 -3
  331. package/src/components/inputs/File/InputUpload.d.ts +0 -4
  332. package/src/components/inputs/File/fileUpload.types.d.ts +0 -79
  333. package/src/components/inputs/File/index.d.ts +0 -9
  334. package/src/components/inputs/File/inputUpload.types.d.ts +0 -30
  335. package/src/components/inputs/File/shared/FileCard.d.ts +0 -9
  336. package/src/components/inputs/File/shared/FileCardList.d.ts +0 -9
  337. package/src/components/inputs/File/shared/FileProgressBar.d.ts +0 -3
  338. package/src/components/inputs/File/shared/FileUploadContent.d.ts +0 -10
  339. package/src/components/inputs/File/shared/FileUploadContentEmpty.d.ts +0 -9
  340. package/src/components/inputs/File/shared/FileUploadContentError.d.ts +0 -11
  341. package/src/components/inputs/File/shared/FileUploadContentFilled.d.ts +0 -11
  342. package/src/components/inputs/File/shared/FileUploadContentLoading.d.ts +0 -9
  343. package/src/components/inputs/File/shared/InputUploadContent.d.ts +0 -8
  344. package/src/components/inputs/File/shared/InputUploadFilled.d.ts +0 -7
  345. package/src/components/inputs/File/shared/fileUpload.cva.d.ts +0 -11
  346. package/src/components/inputs/File/shared/inputUploadButton.cva.d.ts +0 -10
  347. package/src/components/inputs/FormField/FormField.d.ts +0 -17
  348. package/src/components/inputs/FormField/FormFieldError.d.ts +0 -7
  349. package/src/components/inputs/FormField/FormFieldHeader.d.ts +0 -14
  350. package/src/components/inputs/FormField/FormFieldHeaderClose.d.ts +0 -5
  351. package/src/components/inputs/FormField/FormFieldLabel.d.ts +0 -11
  352. package/src/components/inputs/Input/NumberInput/NumberInput.d.ts +0 -18
  353. package/src/components/inputs/Input/PasswordInput/PasswordInput.d.ts +0 -7
  354. package/src/components/inputs/Input/TextArea/TextArea.d.ts +0 -17
  355. package/src/components/inputs/Input/TextInput/TextInput.d.ts +0 -19
  356. package/src/components/inputs/Input/shared/InputContent.d.ts +0 -27
  357. package/src/components/inputs/Inputs/Form.d.ts +0 -26
  358. package/src/components/inputs/Inputs/InputItem.d.ts +0 -73
  359. package/src/components/inputs/Inputs/Inputs.d.ts +0 -10
  360. package/src/components/inputs/RadioGroup/RadioGroup.d.ts +0 -18
  361. package/src/components/inputs/RadioGroup/radio.cva.d.ts +0 -11
  362. package/src/components/inputs/Selection/Autocomplete/Autocomplete.d.ts +0 -8
  363. package/src/components/inputs/Selection/Autocomplete/QueryAutocomplete.d.ts +0 -19
  364. package/src/components/inputs/Selection/Select/Select.d.ts +0 -8
  365. package/src/components/inputs/Selection/shared/SelectBase.d.ts +0 -24
  366. package/src/components/inputs/Selection/shared/SelectDesktop.d.ts +0 -5
  367. package/src/components/inputs/Selection/shared/SelectInput.d.ts +0 -15
  368. package/src/components/inputs/Selection/shared/SelectListBox.d.ts +0 -9
  369. package/src/components/inputs/Selection/shared/SelectListBoxItem.d.ts +0 -8
  370. package/src/components/inputs/Selection/shared/SelectListBoxItemSelectAll.d.ts +0 -4
  371. package/src/components/inputs/Selection/shared/SelectListBoxLoadingItem.d.ts +0 -6
  372. package/src/components/inputs/Selection/shared/SelectListBoxSelectionBar.d.ts +0 -5
  373. package/src/components/inputs/Selection/shared/SelectMobile.d.ts +0 -5
  374. package/src/components/inputs/Selection/shared/select.context.d.ts +0 -30
  375. package/src/components/inputs/Selection/shared/select.types.d.ts +0 -55
  376. package/src/components/inputs/Selection/shared/useSelectItems.d.ts +0 -23
  377. package/src/components/inputs/Slider/Slider.d.ts +0 -18
  378. package/src/components/inputs/TextEditor/TextEditor.d.ts +0 -20
  379. package/src/components/inputs/TextEditor/Toolbar/ColorPicker.d.ts +0 -7
  380. package/src/components/inputs/TextEditor/Toolbar/ColorPickerDropdown.d.ts +0 -10
  381. package/src/components/inputs/TextEditor/Toolbar/HyperlinkAction.d.ts +0 -2
  382. package/src/components/inputs/TextEditor/Toolbar/TextAlignSelect.d.ts +0 -2
  383. package/src/components/inputs/TextEditor/Toolbar/TextColorSelect.d.ts +0 -2
  384. package/src/components/inputs/TextEditor/Toolbar/TextEditorToolbar.d.ts +0 -6
  385. package/src/components/inputs/TextEditor/Toolbar/TextHighlightSelect.d.ts +0 -2
  386. package/src/components/inputs/TextEditor/Toolbar/TextListActions.d.ts +0 -2
  387. package/src/components/inputs/TextEditor/Toolbar/TextMarksActions.d.ts +0 -2
  388. package/src/components/inputs/TextEditor/Toolbar/TextStyleSelect.d.ts +0 -2
  389. package/src/components/inputs/TextEditor/textEditor.types.d.ts +0 -5
  390. package/src/components/inputs/Toggle/Toggle.d.ts +0 -14
  391. package/src/components/inputs/Toggle/toggle.cva.d.ts +0 -10
  392. package/src/components/inputs/shared/CheckContent.d.ts +0 -7
  393. package/src/components/inputs/shared/InputClear.d.ts +0 -6
  394. package/src/components/inputs/shared/form.types.d.ts +0 -12
  395. package/src/components/inputs/shared/input.cva.d.ts +0 -22
  396. package/src/components/inputs/shared/label.cva.d.ts +0 -10
  397. package/src/components/outline.clsx.d.ts +0 -2
  398. package/src/components/overlays/ActionModal/ActionModal.d.ts +0 -19
  399. package/src/components/overlays/BottomSheet/BottomSheet.d.ts +0 -21
  400. package/src/components/overlays/Drawer/Drawer.d.ts +0 -13
  401. package/src/components/overlays/Modal/Modal.d.ts +0 -11
  402. package/src/components/overlays/Modal/modal.cva.d.ts +0 -12
  403. package/src/components/overlays/ResponsivePopover/ResponsivePopover.d.ts +0 -10
  404. package/src/components/overlays/Tooltip/Tooltip.d.ts +0 -9
  405. package/src/components/overlays/Tooltip/TooltipEllipsis.d.ts +0 -7
  406. package/src/components/segment/Segment.d.ts +0 -4
  407. package/src/components/segment/SegmentItem.d.ts +0 -2
  408. package/src/components/segment/segment.types.d.ts +0 -34
  409. package/src/components/shared/pagination/Pagination.d.ts +0 -9
  410. package/src/components/shared/pagination/PaginationList.d.ts +0 -15
  411. package/src/components/shared/pagination/minWidth.cva.d.ts +0 -3
  412. package/src/components/status/Alert/Alert.d.ts +0 -11
  413. package/src/components/status/Alert/alert.cva.d.ts +0 -7
  414. package/src/components/status/Loader/Loader.d.ts +0 -5
  415. package/src/components/status/Loader/loader.cva.d.ts +0 -9
  416. package/src/components/status/Toast/Toast.d.ts +0 -14
  417. package/src/components/status/Toast/toast.cva.d.ts +0 -18
  418. package/src/components/status/Toast/useToast.d.ts +0 -12
  419. package/src/components/status/shared/status.cva.d.ts +0 -8
  420. package/src/components/table/CellText.d.ts +0 -7
  421. package/src/components/table/ColumnConfig.d.ts +0 -10
  422. package/src/components/table/HeaderText.d.ts +0 -5
  423. package/src/components/table/InfiniteTable.d.ts +0 -9
  424. package/src/components/table/PaginatedTable.d.ts +0 -11
  425. package/src/components/table/Table.d.ts +0 -37
  426. package/src/components/table/table.cva.d.ts +0 -15
  427. package/src/components/text/Link/Link.d.ts +0 -7
  428. package/src/components/text/Link/link.cva.d.ts +0 -6
  429. package/src/components/text/Tag/Tag.d.ts +0 -10
  430. package/src/components/text/Tag/tag.cva.d.ts +0 -6
  431. package/src/components/text/Typography/Typography.d.ts +0 -11
  432. package/src/components/text/Typography/typography.cva.d.ts +0 -8
  433. package/src/config/confirmation.context.d.ts +0 -20
  434. package/src/config/i18n.d.ts +0 -315
  435. package/src/config/router.context.d.ts +0 -20
  436. package/src/config/uiConfig.context.d.ts +0 -28
  437. package/src/config/uiStyle.context.d.ts +0 -84
  438. package/src/helpers/dynamicColumns.d.ts +0 -44
  439. package/src/helpers/dynamicInputs.d.ts +0 -83
  440. package/src/hooks/useAutosave.d.ts +0 -9
  441. package/src/hooks/useBreakpoint.d.ts +0 -3
  442. package/src/hooks/useDebounceCallback.d.ts +0 -6
  443. package/src/hooks/useDeepCompare.d.ts +0 -4
  444. package/src/hooks/useFilters.d.ts +0 -7
  445. package/src/hooks/useForm.d.ts +0 -18
  446. package/src/hooks/useFormAutosave.d.ts +0 -13
  447. package/src/hooks/useIntersectionObserver.d.ts +0 -7
  448. package/src/hooks/useLocalStorage.d.ts +0 -13
  449. package/src/hooks/useLongPressRepeat.d.ts +0 -9
  450. package/src/hooks/usePagination.d.ts +0 -7
  451. package/src/hooks/useScrollableListBox.d.ts +0 -3
  452. package/src/hooks/useSingletonMutation.d.ts +0 -2
  453. package/src/hooks/useSorting.d.ts +0 -6
  454. package/src/hooks/useStateAndRef.d.ts +0 -4
  455. package/src/hooks/useTableColumnConfig.d.ts +0 -16
  456. package/src/hooks/useTableNav.d.ts +0 -84
  457. package/src/hooks/useTranslationMemo.d.ts +0 -4
  458. package/src/index.d.ts +0 -205
  459. package/src/types/react-query.d.ts +0 -6
  460. package/src/utils/array.utils.d.ts +0 -3
  461. package/src/utils/array.utils.spec.d.ts +0 -1
  462. package/src/utils/compoundMapper.d.ts +0 -19
  463. package/src/utils/compoundMapper.spec.d.ts +0 -1
  464. package/src/utils/date-time.utils.d.ts +0 -14
  465. package/src/utils/date-time.utils.spec.d.ts +0 -1
  466. package/src/utils/date.utils.d.ts +0 -3
  467. package/src/utils/date.utils.spec.d.ts +0 -1
  468. package/src/utils/dom.utils.d.ts +0 -5
  469. package/src/utils/file.utils.d.ts +0 -9
  470. package/src/utils/isEqual.d.ts +0 -1
  471. package/src/utils/logger.d.ts +0 -7
  472. package/src/utils/object.utils.d.ts +0 -10
  473. package/src/utils/queries.utils.d.ts +0 -4
  474. package/src/utils/rest/interceptors/logging.interceptor.d.ts +0 -2
  475. package/src/utils/rest/interceptors/response.interceptor.d.ts +0 -2
  476. package/src/utils/rest/interceptors/rest-interceptor.d.ts +0 -8
  477. package/src/utils/rest/rest-client.d.ts +0 -29
  478. package/src/utils/rest/rest.utils.d.ts +0 -10
  479. package/src/utils/routing.utils.d.ts +0 -3
  480. package/src/utils/string.utils.d.ts +0 -4
  481. package/src/utils/vendor/error-handling.d.ts +0 -21
  482. package/src/utils/zod.utils.d.ts +0 -19
  483. package/vite.config.d.ts +0 -2
  484. /package/{styles → src/styles}/editor.css +0 -0
  485. /package/{styles → src/styles}/index.css +0 -0
@@ -0,0 +1,174 @@
1
+ import { mergeRefs } from "@react-aria/utils";
2
+ import { clsx } from "clsx";
3
+ import type { CSSProperties, Ref } from "react";
4
+ import {
5
+ Slider as AriaSlider,
6
+ type SliderProps as AriaSliderProps,
7
+ SliderThumb as AriaSliderThumb,
8
+ SliderTrack as AriaSliderTrack,
9
+ } from "react-aria-components";
10
+ import { Controller, type FieldValues } from "react-hook-form";
11
+ import type { SliderState as AriaSLiderState } from "react-stately";
12
+
13
+ import { FormField, type FormFieldProps } from "#ui/components/inputs/FormField/FormField";
14
+ import type { ControlProps } from "#ui/components/inputs/shared/form.types";
15
+ import { uiOutlineClass } from "#ui/components/outline.clsx";
16
+ import { Typography } from "#ui/components/text/Typography/Typography";
17
+ import { UIConfig } from "#ui/config/uiConfig.context";
18
+
19
+ type SliderValue<IsRange extends boolean = false> = IsRange extends false ? number : number[];
20
+
21
+ interface SliderBaseProps<IsRange extends boolean = false>
22
+ extends FormFieldProps,
23
+ Omit<AriaSliderProps, "value" | "defaultValue" | "onChange" | "className"> {
24
+ ref?: Ref<HTMLDivElement>;
25
+ unit?: string;
26
+ isRange?: IsRange;
27
+ defaultValue?: SliderValue<IsRange>;
28
+ value?: SliderValue<IsRange>;
29
+ onChange?: (value: SliderValue<IsRange>) => void;
30
+ }
31
+
32
+ const SliderBase = <IsRange extends boolean = false>(props: SliderBaseProps<IsRange>) => {
33
+ const ui = UIConfig.useConfig();
34
+
35
+ const {
36
+ label,
37
+ tooltipText,
38
+ helperText,
39
+ isRequired,
40
+ rightContent,
41
+ isDisabled,
42
+ headerClassName,
43
+ errorClassName,
44
+ isHeaderHidden,
45
+ error,
46
+ unit,
47
+ hideLabel = ui.input.hideLabel,
48
+ minValue = ui.slider.minValue,
49
+ maxValue = ui.slider.maxValue,
50
+ ...rest
51
+ } = props;
52
+
53
+ const formFieldProps: FormFieldProps = {
54
+ error,
55
+ label,
56
+ tooltipText,
57
+ helperText,
58
+ isRequired,
59
+ rightContent,
60
+ isHeaderHidden,
61
+ hideLabel,
62
+ isDisabled,
63
+ headerClassName,
64
+ errorClassName,
65
+ };
66
+
67
+ const defaultValue =
68
+ props.defaultValue ?? ((props.isRange ? [minValue, minValue] : minValue) as SliderValue<IsRange>);
69
+
70
+ const getTrackFillStyle = (state: AriaSLiderState): CSSProperties => {
71
+ const p0 = state.getThumbPercent(0);
72
+ const p1 = state.getThumbPercent(1);
73
+
74
+ return {
75
+ left: props.isRange ? `${p0 * 100}%` : 0,
76
+ width: props.isRange ? `${(p1 - p0) * 100}%` : `${p0 * 100}%`,
77
+ };
78
+ };
79
+
80
+ return (
81
+ <AriaSlider<SliderValue<IsRange>>
82
+ {...rest}
83
+ defaultValue={defaultValue}
84
+ minValue={minValue}
85
+ maxValue={maxValue}
86
+ isDisabled={isDisabled}
87
+ >
88
+ <FormField {...formFieldProps}>
89
+ <div className="flex items-center justify-between">
90
+ <Typography
91
+ className="min-w-10 px-slider-side-leading-and-trailing py-slider-height-leading-and-trailing text-text-default-3"
92
+ size="label-2"
93
+ >
94
+ {minValue}
95
+ {unit}
96
+ </Typography>
97
+
98
+ <AriaSliderTrack className="relative mx-2 h-6 w-full">
99
+ {({ state }) => (
100
+ <>
101
+ <div className="-translate-y-1/2 absolute top-1/2 h-1 w-full overflow-hidden rounded-full bg-elevation-outline-default-1">
102
+ <div
103
+ className={clsx(
104
+ "absolute top-0 h-1 rounded-full",
105
+ props.isDisabled
106
+ ? "bg-interactive-contained-primary-disabled"
107
+ : "bg-interactive-contained-primary-idle",
108
+ )}
109
+ style={getTrackFillStyle(state)}
110
+ />
111
+ </div>
112
+
113
+ {state.values.map((_, i) => (
114
+ <AriaSliderThumb
115
+ key={i} // oxlint-disable-line react/no-array-index-key
116
+ index={i}
117
+ className={clsx(
118
+ "absolute top-1/2 size-4 cursor-pointer rounded-full bg-interactive-contained-primary-idle disabled:cursor-default",
119
+ "dragging:bg-interactive-contained-primary-pressed hover:bg-interactive-contained-primary-hover focus-visible:outline-interactive-contained-primary-focus disabled:bg-interactive-contained-primary-disabled",
120
+ uiOutlineClass,
121
+ )}
122
+ isDisabled={isDisabled}
123
+ />
124
+ ))}
125
+ </>
126
+ )}
127
+ </AriaSliderTrack>
128
+
129
+ <Typography
130
+ className="min-w-10 px-slider-side-leading-and-trailing py-slider-height-leading-and-trailing text-text-default-3"
131
+ size="label-2"
132
+ >
133
+ {maxValue}
134
+ {unit}
135
+ </Typography>
136
+ </div>
137
+ </FormField>
138
+ </AriaSlider>
139
+ );
140
+ };
141
+
142
+ export type SliderProps<IsRange extends boolean = false> = SliderBaseProps<IsRange>;
143
+
144
+ export type ControlledSliderProps<TFieldValues extends FieldValues, IsRange extends boolean = false> = ControlProps<
145
+ SliderProps<IsRange>,
146
+ TFieldValues
147
+ >;
148
+
149
+ export const Slider = <TFieldValues extends FieldValues, IsRange extends boolean = false>(
150
+ props: ControlledSliderProps<TFieldValues, IsRange>,
151
+ ) => {
152
+ if ("formControl" in props && props.formControl) {
153
+ const { formControl, ref, ...innerProps } = props;
154
+
155
+ return (
156
+ <Controller
157
+ control={formControl.control}
158
+ name={formControl.name}
159
+ render={({ field, fieldState: { error } }) => (
160
+ <SliderBase
161
+ {...innerProps}
162
+ ref={mergeRefs(ref, field.ref)}
163
+ value={field.value}
164
+ onChange={field.onChange}
165
+ isDisabled={field.disabled || props.isDisabled}
166
+ error={props.error ?? error?.message}
167
+ />
168
+ )}
169
+ />
170
+ );
171
+ }
172
+
173
+ return <SliderBase {...props} />;
174
+ };
@@ -0,0 +1,239 @@
1
+ import { mergeRefs } from "@react-aria/utils";
2
+ import { Color } from "@tiptap/extension-color";
3
+ import { Highlight } from "@tiptap/extension-highlight";
4
+ import { Link } from "@tiptap/extension-link";
5
+ import { Placeholder } from "@tiptap/extension-placeholder";
6
+ import { TextAlign } from "@tiptap/extension-text-align";
7
+ import { TextStyle } from "@tiptap/extension-text-style";
8
+ import { Underline } from "@tiptap/extension-underline";
9
+ import { EditorContent, type EditorEvents, type JSONContent, useEditor } from "@tiptap/react";
10
+ import { StarterKit } from "@tiptap/starter-kit";
11
+ import { clsx } from "clsx";
12
+ import { type Ref, useEffect, useRef, useState } from "react";
13
+ import { useFocusVisible, useFocusWithin, useHover, useLabel } from "react-aria";
14
+ import { Controller, type FieldValues } from "react-hook-form";
15
+
16
+ import { FormField, type FormFieldProps } from "#ui/components/inputs/FormField/FormField";
17
+ import type { FormFieldHeaderProps } from "#ui/components/inputs/FormField/FormFieldHeader";
18
+ import { FormFieldLabel } from "#ui/components/inputs/FormField/FormFieldLabel";
19
+ import type { ControlProps } from "#ui/components/inputs/shared/form.types";
20
+ import { uiOutlineClass } from "#ui/components/outline.clsx";
21
+ import { isEqual } from "#ui/utils/isEqual";
22
+
23
+ import { TextEditorToolbar } from "./Toolbar/TextEditorToolbar";
24
+
25
+ const extensions = [
26
+ StarterKit.configure({
27
+ heading: {
28
+ levels: [1, 2, 3],
29
+ },
30
+ }),
31
+ TextAlign.configure({
32
+ types: ["heading", "paragraph"],
33
+ }),
34
+ Underline,
35
+ TextStyle,
36
+ Color,
37
+ Highlight.configure({
38
+ multicolor: true,
39
+ }),
40
+ Link.configure({
41
+ openOnClick: false,
42
+ defaultProtocol: "https",
43
+ }),
44
+ ];
45
+
46
+ export interface TextEditorValue {
47
+ html?: string | null;
48
+ json?: JSONContent | null;
49
+ }
50
+
51
+ export interface TextEditorBaseProps extends FormFieldProps {
52
+ ref?: Ref<HTMLDivElement>;
53
+ placeholder?: string;
54
+ value?: TextEditorValue | null;
55
+ onChange?: (value: TextEditorValue | null) => void;
56
+ onBlur?: () => void;
57
+ as?: "default" | "filter" | "floating" | "inline" | null;
58
+ }
59
+
60
+ const TextEditorBase = ({
61
+ ref,
62
+ as = "default",
63
+ placeholder,
64
+ label,
65
+ hideLabel,
66
+ tooltipText,
67
+ helperText,
68
+ isRequired,
69
+ rightContent,
70
+ isDisabled,
71
+ headerClassName,
72
+ errorClassName,
73
+ isHeaderHidden,
74
+ error,
75
+ value,
76
+ className,
77
+ onChange,
78
+ onBlur,
79
+ }: TextEditorBaseProps) => {
80
+ const contentRef = useRef<JSONContent | null>(null);
81
+ const { hoverProps, isHovered } = useHover({ isDisabled });
82
+ const [isFocused, setIsFocused] = useState(false);
83
+ const { focusWithinProps } = useFocusWithin({
84
+ onFocusWithinChange: setIsFocused,
85
+ });
86
+ const { isFocusVisible } = useFocusVisible();
87
+
88
+ const formFieldProps: FormFieldProps = {
89
+ error,
90
+ label,
91
+ tooltipText,
92
+ helperText,
93
+ isRequired,
94
+ rightContent,
95
+ isHeaderHidden: isHeaderHidden || as === "filter" || as === "floating",
96
+ hideLabel,
97
+ isDisabled,
98
+ headerClassName,
99
+ errorClassName,
100
+ };
101
+
102
+ const { labelProps, fieldProps } = useLabel({ label });
103
+
104
+ const editor = useEditor(
105
+ {
106
+ extensions: [...extensions, Placeholder.configure({ placeholder: as === "floating" ? "" : placeholder })],
107
+ editorProps: {
108
+ attributes: {
109
+ class: "min-h-40 rounded-b-sm p-2 outline-none",
110
+ },
111
+ },
112
+ onUpdate: (event: EditorEvents["update"]) => {
113
+ onChange?.({
114
+ json: event.editor.getJSON(),
115
+ html: event.editor.getHTML(),
116
+ });
117
+ },
118
+ immediatelyRender: false,
119
+ editable: !isDisabled,
120
+ onBlur,
121
+ },
122
+ [isDisabled],
123
+ );
124
+
125
+ useEffect(() => {
126
+ const content = value?.json ?? null;
127
+ if (editor) {
128
+ const isSame = isEqual(content, editor.getJSON());
129
+ if (!isSame) {
130
+ editor.commands.setContent(content);
131
+ }
132
+ } else {
133
+ const isSame = isEqual(content, contentRef.current);
134
+ if (!isSame) {
135
+ contentRef.current = content ?? null;
136
+ }
137
+ }
138
+ }, [value]);
139
+
140
+ useEffect(() => {
141
+ if (editor && contentRef.current) {
142
+ editor.commands.setContent(contentRef.current);
143
+ contentRef.current = null;
144
+ }
145
+ }, [editor]);
146
+
147
+ const headerProps: FormFieldHeaderProps = {
148
+ label,
149
+ tooltipText,
150
+ helperText,
151
+ isRequired,
152
+ rightContent,
153
+ isHeaderHidden: hideLabel || isHeaderHidden,
154
+ isDisabled,
155
+ className: headerClassName,
156
+ labelProps,
157
+ };
158
+
159
+ return (
160
+ <FormField
161
+ {...formFieldProps}
162
+ ref={ref}
163
+ as={as}
164
+ labelProps={labelProps}
165
+ className={clsx("w-full", className)}
166
+ >
167
+ <div
168
+ className={clsx(
169
+ "group/text-editor relative",
170
+ "w-full rounded-sm border border-elevation-outline-default-2 border-solid bg-elevation-fill-default-1",
171
+ uiOutlineClass,
172
+ "focus-within:border focus-within:border-input-outlined-outline-active",
173
+ "focus-visible:outline-interactive-contained-primary-focus",
174
+ "hover:border hover:border-input-outlined-outline-hover",
175
+ )}
176
+ data-text-editor
177
+ data-rac=""
178
+ data-hovered={isHovered || undefined}
179
+ data-disabled={isDisabled || undefined}
180
+ data-focus-within={isFocused || undefined}
181
+ data-focus-visible={(isFocused && isFocusVisible) || undefined}
182
+ data-is-filled={!editor?.isEmpty}
183
+ {...hoverProps}
184
+ {...focusWithinProps}
185
+ {...fieldProps}
186
+ >
187
+ <TextEditorToolbar editor={editor} />
188
+ <div
189
+ className={clsx("relative", {
190
+ "pt-3": as === "floating",
191
+ })}
192
+ >
193
+ {as === "floating" && headerProps && (
194
+ <FormFieldLabel
195
+ as={as}
196
+ {...headerProps}
197
+ />
198
+ )}
199
+ <EditorContent
200
+ editor={editor}
201
+ placeholder={as === "floating" ? "" : placeholder}
202
+ className={clsx({
203
+ "[&_p:before]:opacity-0": as === "floating" && editor?.isEmpty,
204
+ })}
205
+ />
206
+ </div>
207
+ </div>
208
+ </FormField>
209
+ );
210
+ };
211
+
212
+ export type TextEditorProps = TextEditorBaseProps;
213
+
214
+ export type ControlledTextEditorProps<TFieldValues extends FieldValues> = ControlProps<TextEditorProps, TFieldValues>;
215
+
216
+ export const TextEditor = <TFieldValues extends FieldValues>(props: ControlledTextEditorProps<TFieldValues>) => {
217
+ if ("formControl" in props && props.formControl) {
218
+ const { formControl, ref, ...innerProps } = props;
219
+
220
+ return (
221
+ <Controller
222
+ control={formControl.control}
223
+ name={formControl.name}
224
+ render={({ field }) => (
225
+ <TextEditorBase
226
+ {...innerProps}
227
+ ref={mergeRefs(ref, field.ref)}
228
+ value={field.value}
229
+ onChange={field.onChange}
230
+ onBlur={field.onBlur}
231
+ isDisabled={field.disabled || props.isDisabled}
232
+ />
233
+ )}
234
+ />
235
+ );
236
+ }
237
+
238
+ return <TextEditorBase {...props} />;
239
+ };
@@ -0,0 +1,34 @@
1
+ import { clsx } from "clsx";
2
+ import { ColorSwatch, ColorSwatchPicker, ColorSwatchPickerItem } from "react-aria-components";
3
+
4
+ interface ColorPickerProps {
5
+ colors: string[];
6
+ value: string | undefined;
7
+ onChange: (value: string) => void;
8
+ }
9
+
10
+ export const ColorPicker = ({ colors, value, onChange }: ColorPickerProps) => {
11
+ return (
12
+ <ColorSwatchPicker
13
+ value={value}
14
+ onChange={(color) => onChange(color.toString("hex"))}
15
+ className="grid w-full grid-cols-[repeat(auto-fit,minmax(1rem,1fr))] gap-1"
16
+ >
17
+ {colors.map((color) => (
18
+ <ColorSwatchPickerItem
19
+ key={color}
20
+ color={color}
21
+ className="group"
22
+ >
23
+ <ColorSwatch
24
+ className={clsx(
25
+ "size-4 rounded-xs border border-interactive-outlined-secondary-outline-idle border-solid",
26
+ "group-selected:border-interactive-outlined-primary-outline-pressed group-selected:shadow-2",
27
+ "cursor-pointer",
28
+ )}
29
+ />
30
+ </ColorSwatchPickerItem>
31
+ ))}
32
+ </ColorSwatchPicker>
33
+ );
34
+ };
@@ -0,0 +1,74 @@
1
+ import { clsx } from "clsx";
2
+ import { type ReactElement, useState } from "react";
3
+ import { Button as AriaButton, Dialog, DialogTrigger, Popover } from "react-aria-components";
4
+
5
+ import { ArrowDropDownIcon } from "#ui/assets/icons/ArrowDropDown";
6
+ import { useInputCva } from "#ui/components/inputs/shared/input.cva";
7
+ import { ColorPicker } from "#ui/components/inputs/TextEditor/Toolbar/ColorPicker";
8
+ import { Typography } from "#ui/components/text/Typography/Typography";
9
+
10
+ interface ColorPickerDropdownProps {
11
+ colors: string[];
12
+ value: string | undefined;
13
+ onChange: (color: string) => void;
14
+ isDisabled?: boolean;
15
+ children: ReactElement;
16
+ }
17
+
18
+ export const ColorPickerDropdown = ({ colors, value, onChange, isDisabled, children }: ColorPickerDropdownProps) => {
19
+ const inputCva = useInputCva();
20
+ const [isOpen, setIsOpen] = useState(false);
21
+
22
+ const handleChange = (color: string) => {
23
+ onChange(color);
24
+ setIsOpen(false);
25
+ };
26
+
27
+ return (
28
+ <DialogTrigger
29
+ isOpen={isOpen}
30
+ onOpenChange={setIsOpen}
31
+ >
32
+ <AriaButton
33
+ className={inputCva({
34
+ as: "inline",
35
+ className: clsx("flex items-center justify-between gap-2"),
36
+ })}
37
+ isDisabled={isDisabled}
38
+ >
39
+ <Typography
40
+ size="label-1"
41
+ className="truncate"
42
+ >
43
+ {children}
44
+ </Typography>
45
+
46
+ <ArrowDropDownIcon
47
+ className={clsx("size-6 shrink-0", isOpen && "rotate-180")}
48
+ aria-hidden="true"
49
+ />
50
+ </AriaButton>
51
+
52
+ <Popover
53
+ className="my-4 w-40 outline-none"
54
+ offset={0}
55
+ placement="bottom start"
56
+ >
57
+ <Dialog className="outline-none">
58
+ <div
59
+ className={clsx(
60
+ "flex justify-center overflow-hidden p-2 shadow-5 outline-none",
61
+ "rounded-input-rounding-default border border-elevation-outline-default-1 bg-elevation-fill-default-1",
62
+ )}
63
+ >
64
+ <ColorPicker
65
+ colors={colors}
66
+ value={value}
67
+ onChange={handleChange}
68
+ />
69
+ </div>
70
+ </Dialog>
71
+ </Popover>
72
+ </DialogTrigger>
73
+ );
74
+ };
@@ -0,0 +1,87 @@
1
+ import { clsx } from "clsx";
2
+ import { useEffect, useState } from "react";
3
+ import { useTranslation } from "react-i18next";
4
+
5
+ import { LinkIcon } from "#ui/assets/icons/Link";
6
+ import { Button } from "#ui/components/buttons/Button/Button";
7
+ import { InlineIconButton } from "#ui/components/buttons/InlineIconButton/InlineIconButton";
8
+ import { TextInput } from "#ui/components/inputs/Input/TextInput/TextInput";
9
+ import type { TextEditorSharedProps } from "#ui/components/inputs/TextEditor/textEditor.types";
10
+ import { ResponsivePopover } from "#ui/components/overlays/ResponsivePopover/ResponsivePopover";
11
+ import { ns } from "#ui/config/i18n";
12
+
13
+ export const HyperlinkAction = ({ editor }: TextEditorSharedProps) => {
14
+ const { t } = useTranslation(ns);
15
+ const [isOpen, setIsOpen] = useState(false);
16
+ const [url, setUrl] = useState("");
17
+
18
+ const isLinkEnabled = !!editor.extensionManager.extensions.find((extension) => extension.name === "link");
19
+ const linkHref = editor.getAttributes("link")?.href as string | undefined;
20
+
21
+ useEffect(() => {
22
+ setUrl(linkHref || "");
23
+ }, [linkHref]);
24
+
25
+ if (!isLinkEnabled) {
26
+ return null;
27
+ }
28
+
29
+ const onRemove = () => {
30
+ editor.chain().focus().extendMarkRange("link").unsetLink().run();
31
+ setIsOpen(false);
32
+ };
33
+
34
+ const onApply = () => {
35
+ editor.chain().focus().extendMarkRange("link").setLink({ href: url }).run();
36
+ setIsOpen(false);
37
+ };
38
+
39
+ return (
40
+ <ResponsivePopover
41
+ isOpen={isOpen}
42
+ onOpenChange={setIsOpen}
43
+ sheetLabel={t(($) => $.ui.textEditor.link.label)}
44
+ trigger={
45
+ <InlineIconButton
46
+ color="secondary"
47
+ label={t(($) => $.ui.textEditor.link.label)}
48
+ icon={LinkIcon}
49
+ className={clsx(editor.isActive("link") && "!text-interactive-text-primary-idle")}
50
+ isDisabled={!editor.isEditable}
51
+ />
52
+ }
53
+ >
54
+ <TextInput
55
+ variant="outlined"
56
+ hideLabel
57
+ label={t(($) => $.ui.textEditor.link.urlLabel)}
58
+ placeholder={t(($) => $.ui.textEditor.link.urlPlaceholder)}
59
+ value={url}
60
+ onChange={setUrl}
61
+ className="mb-4"
62
+ />
63
+ <div className="flex justify-between">
64
+ <Button
65
+ variant="contained"
66
+ color="secondary"
67
+ size="xs"
68
+ width="hug"
69
+ onPress={onApply}
70
+ isDisabled={!url}
71
+ >
72
+ {t(($) => $.ui.textEditor.link.apply)}
73
+ </Button>
74
+ <Button
75
+ variant="outlined"
76
+ color="secondary"
77
+ size="xs"
78
+ width="hug"
79
+ onPress={onRemove}
80
+ isDisabled={!editor.isActive("link")}
81
+ >
82
+ {t(($) => $.ui.textEditor.link.remove)}
83
+ </Button>
84
+ </div>
85
+ </ResponsivePopover>
86
+ );
87
+ };
@@ -0,0 +1,64 @@
1
+ import type { FC, SVGProps } from "react";
2
+ import { useTranslation } from "react-i18next";
3
+
4
+ import { AlignCenterIcon } from "#ui/assets/icons/AlignCenter";
5
+ import { AlignLeftIcon } from "#ui/assets/icons/AlignLeft";
6
+ import { AlignLeftRightIcon } from "#ui/assets/icons/AlignLeftRight";
7
+ import { AlignRightIcon } from "#ui/assets/icons/AlignRight";
8
+ import { Select } from "#ui/components/inputs/Selection/Select/Select";
9
+ import type { TextEditorSharedProps } from "#ui/components/inputs/TextEditor/textEditor.types";
10
+ import { ns } from "#ui/config/i18n";
11
+
12
+ type TextAlign = "left" | "center" | "right" | "justify";
13
+
14
+ export const TextAlignSelect = ({ editor }: TextEditorSharedProps) => {
15
+ const { t } = useTranslation(ns);
16
+
17
+ const isAlignEnabled = !!editor.extensionManager.extensions.find((extension) => extension.name === "textAlign");
18
+
19
+ if (!isAlignEnabled) {
20
+ return null;
21
+ }
22
+
23
+ const onChange = (val: string | null) => {
24
+ if (val) {
25
+ editor.chain().focus().setTextAlign(val).run();
26
+ } else {
27
+ editor.chain().focus().unsetTextAlign().run();
28
+ }
29
+ };
30
+
31
+ const getItem = (id: TextAlign, Icon: FC<SVGProps<SVGSVGElement>>) => {
32
+ return {
33
+ id,
34
+ label: t(($) => $.ui.textEditor.textAlign[id]),
35
+ content: <Icon className="size-6" />,
36
+ isActive: editor.isActive({ textAlign: id }),
37
+ can: editor.can().setTextAlign(id),
38
+ };
39
+ };
40
+
41
+ const items = [
42
+ getItem("left", AlignLeftIcon),
43
+ getItem("center", AlignCenterIcon),
44
+ getItem("right", AlignRightIcon),
45
+ getItem("justify", AlignLeftRightIcon),
46
+ ];
47
+
48
+ const enabledItems = items.filter((item) => item.can);
49
+
50
+ return (
51
+ <Select
52
+ as="inline"
53
+ label={t(($) => $.ui.textEditor.textAlign.label)}
54
+ placeholder={t(($) => $.ui.textEditor.textAlign.label)}
55
+ hideLabel
56
+ ignoreTriggerWidth
57
+ showSelectionContent
58
+ onChange={onChange}
59
+ items={enabledItems}
60
+ value={enabledItems.find((item) => item.isActive)?.id || "left"}
61
+ isDisabled={!editor.isEditable}
62
+ />
63
+ );
64
+ };