@neko-os/ui 0.2.2 → 0.3.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 (435) hide show
  1. package/README.md +0 -76
  2. package/dist/DynamicStyleTag.js +18 -2
  3. package/dist/DynamicStyleTag.native.js +3 -1
  4. package/dist/NekoUI.js +39 -1
  5. package/dist/abstractions/ActivityIndicator.js +19 -1
  6. package/dist/abstractions/ActivityIndicator.native.js +43 -1
  7. package/dist/abstractions/ActivityIndicator.web.js +43 -1
  8. package/dist/abstractions/AnimatedView.js +3 -1
  9. package/dist/abstractions/AnimatedView.native.js +5 -1
  10. package/dist/abstractions/AnimatedView.web.js +3 -1
  11. package/dist/abstractions/BlurView.js +43 -1
  12. package/dist/abstractions/BlurView.native.js +39 -1
  13. package/dist/abstractions/BlurView.web.js +39 -1
  14. package/dist/abstractions/DraggableSlideView.js +3 -1
  15. package/dist/abstractions/DraggableSlideView.native.js +62 -1
  16. package/dist/abstractions/FlatList.js +3 -1
  17. package/dist/abstractions/FlatList.native.js +37 -1
  18. package/dist/abstractions/FlatList.web.js +3 -1
  19. package/dist/abstractions/GradientView.js +5 -1
  20. package/dist/abstractions/GradientView.native.js +32 -1
  21. package/dist/abstractions/HiddenInput.js +3 -1
  22. package/dist/abstractions/HiddenInput.native.js +3 -1
  23. package/dist/abstractions/Icon.js +10 -1
  24. package/dist/abstractions/Icon.native.js +13 -1
  25. package/dist/abstractions/Icon.web.js +11 -1
  26. package/dist/abstractions/Image.js +12 -1
  27. package/dist/abstractions/Image.native.js +7 -1
  28. package/dist/abstractions/Image.web.js +7 -1
  29. package/dist/abstractions/ImageBackground.js +17 -1
  30. package/dist/abstractions/ImageBackground.native.js +27 -1
  31. package/dist/abstractions/ImageBackground.web.js +7 -1
  32. package/dist/abstractions/KeyboardAvoidingView.js +3 -1
  33. package/dist/abstractions/KeyboardAvoidingView.native.js +3 -1
  34. package/dist/abstractions/Platform.js +1 -1
  35. package/dist/abstractions/Platform.native.js +3 -1
  36. package/dist/abstractions/Platform.web.js +3 -1
  37. package/dist/abstractions/Pressable.js +4 -1
  38. package/dist/abstractions/Pressable.native.js +3 -1
  39. package/dist/abstractions/Pressable.web.js +3 -1
  40. package/dist/abstractions/SafeAreaView.js +3 -1
  41. package/dist/abstractions/SafeAreaView.native.js +3 -1
  42. package/dist/abstractions/ScrollView.js +3 -1
  43. package/dist/abstractions/ScrollView.native.js +5 -1
  44. package/dist/abstractions/ScrollView.web.js +3 -1
  45. package/dist/abstractions/StaticList.js +51 -1
  46. package/dist/abstractions/Switch.js +97 -1
  47. package/dist/abstractions/Switch.native.js +12 -1
  48. package/dist/abstractions/Table.js +29 -1
  49. package/dist/abstractions/Table.native.js +19 -1
  50. package/dist/abstractions/Text.js +14 -1
  51. package/dist/abstractions/Text.native.js +3 -1
  52. package/dist/abstractions/Text.web.js +18 -1
  53. package/dist/abstractions/TextInput.js +12 -1
  54. package/dist/abstractions/TextInput.native.js +5 -1
  55. package/dist/abstractions/TextInput.web.js +5 -1
  56. package/dist/abstractions/TouchableOpacity.js +4 -1
  57. package/dist/abstractions/TouchableOpacity.native.js +3 -1
  58. package/dist/abstractions/View.js +3 -1
  59. package/dist/abstractions/View.native.js +3 -1
  60. package/dist/abstractions/View.web.js +3 -1
  61. package/dist/abstractions/helpers/componentSize.js +13 -1
  62. package/dist/abstractions/helpers/componentSize.native.js +12 -1
  63. package/dist/abstractions/helpers/storage.js +32 -1
  64. package/dist/abstractions/helpers/storage.native.js +34 -1
  65. package/dist/abstractions/helpers/transformStyle.js +8 -1
  66. package/dist/abstractions/helpers/transformStyle.native.js +3 -1
  67. package/dist/abstractions/helpers/useSafeAreaInsets.js +3 -1
  68. package/dist/abstractions/helpers/useSafeAreaInsets.native.js +3 -1
  69. package/dist/abstractions/helpers/windowWidth.js +13 -1
  70. package/dist/abstractions/helpers/windowWidth.native.js +6 -1
  71. package/dist/abstractions/helpers/windowWidth.web.js +6 -1
  72. package/dist/components/actions/ActionsDrawer.js +81 -1
  73. package/dist/components/actions/Breadcrumb.js +47 -1
  74. package/dist/components/actions/Button.js +82 -1
  75. package/dist/components/actions/Dropdown.js +91 -1
  76. package/dist/components/actions/FloatingButton.js +87 -1
  77. package/dist/components/actions/FloatingMenu.js +39 -1
  78. package/dist/components/actions/Link.js +66 -1
  79. package/dist/components/actions/Pressable.js +38 -1
  80. package/dist/components/actions/index.js +9 -1
  81. package/dist/components/actions/menu/HorizontalMenu.js +98 -1
  82. package/dist/components/actions/menu/Menu.js +7 -1
  83. package/dist/components/actions/menu/SubmenuWrapper.js +16 -1
  84. package/dist/components/actions/menu/VerticalMenu.js +133 -1
  85. package/dist/components/animations/AnimatedTopBar.js +10 -1
  86. package/dist/components/animations/AnimatedTopBar.native.js +34 -1
  87. package/dist/components/animations/AnimatedTopBar.web.js +1 -1
  88. package/dist/components/animations/AnimatedView.js +45 -1
  89. package/dist/components/animations/DraggableSlideView.js +42 -1
  90. package/dist/components/animations/ParallaxHeader.js +9 -1
  91. package/dist/components/animations/ParallaxHeader.native.js +32 -1
  92. package/dist/components/animations/ParallaxHeader.web.js +32 -1
  93. package/dist/components/animations/ReanimatedScrollHandler.js +8 -1
  94. package/dist/components/animations/ReanimatedScrollHandler.native.js +24 -1
  95. package/dist/components/animations/ReanimatedScrollHandler.web.js +1 -1
  96. package/dist/components/animations/ReanimatedView.js +40 -1
  97. package/dist/components/animations/index.js +5 -1
  98. package/dist/components/calendar/CalendarNav.js +67 -1
  99. package/dist/components/calendar/WeekDaysBar.js +18 -1
  100. package/dist/components/calendar/_helpers/calendarDays.js +16 -1
  101. package/dist/components/calendar/_helpers/dateDisabled.js +24 -1
  102. package/dist/components/feedback/alerter.js +31 -1
  103. package/dist/components/feedback/confirmer.js +70 -1
  104. package/dist/components/feedback/index.js +3 -1
  105. package/dist/components/feedback/notifications/Notification.js +37 -1
  106. package/dist/components/feedback/notifications/NotificationsHandler.js +65 -1
  107. package/dist/components/filter/DateFilter.js +72 -0
  108. package/dist/components/filter/FilterGroup.js +17 -0
  109. package/dist/components/filter/FilterHandler.js +54 -0
  110. package/dist/components/filter/FilterItem.js +30 -0
  111. package/dist/components/filter/PopoverFilterItem.js +84 -0
  112. package/dist/components/filter/SearchInput.js +49 -0
  113. package/dist/components/filter/index.js +6 -0
  114. package/dist/components/form/Form.js +31 -1
  115. package/dist/components/form/FormGroup.js +21 -1
  116. package/dist/components/form/FormItem.js +118 -1
  117. package/dist/components/form/FormList.js +143 -1
  118. package/dist/components/form/FormWrapperComponent.js +52 -1
  119. package/dist/components/form/FormWrapperComponent.native.js +5 -1
  120. package/dist/components/form/SubmitButton.js +22 -1
  121. package/dist/components/form/index.js +9 -1
  122. package/dist/components/form/useNewForm.js +211 -1
  123. package/dist/components/form/useWatch.js +70 -1
  124. package/dist/components/form/validation/defaultMessages.js +20 -1
  125. package/dist/components/form/validation/index.js +5 -1
  126. package/dist/components/form/validation/normalizeRules.js +22 -1
  127. package/dist/components/form/validation/shouldValidateOn.js +21 -1
  128. package/dist/components/form/validation/validateRules.js +83 -1
  129. package/dist/components/form/validation/validators.js +82 -1
  130. package/dist/components/helpers/ConditionalLazyRender.js +6 -1
  131. package/dist/components/helpers/LazyAction.js +22 -1
  132. package/dist/components/helpers/LazyRender.js +55 -1
  133. package/dist/components/helpers/LazyRender.native.js +58 -1
  134. package/dist/components/helpers/Portal.js +21 -1
  135. package/dist/components/helpers/PortalHandler.js +32 -1
  136. package/dist/components/helpers/Responsive.js +18 -1
  137. package/dist/components/helpers/Separator.js +49 -1
  138. package/dist/components/helpers/VerticalView.js +34 -1
  139. package/dist/components/helpers/index.js +8 -1
  140. package/dist/components/index.js +20 -1
  141. package/dist/components/inputs/BooleanSelect.js +14 -0
  142. package/dist/components/inputs/Checkbox.js +56 -1
  143. package/dist/components/inputs/DateInput.js +123 -1
  144. package/dist/components/inputs/DateRangeInput.js +41 -0
  145. package/dist/components/inputs/Editable.js +129 -0
  146. package/dist/components/inputs/EnabledSelect.js +14 -0
  147. package/dist/components/inputs/InputWrapper.js +93 -1
  148. package/dist/components/inputs/LinkInput.js +17 -1
  149. package/dist/components/inputs/MaskInput.js +67 -1
  150. package/dist/components/inputs/NumberInput.js +111 -1
  151. package/dist/components/inputs/NumberRangeInput.js +41 -0
  152. package/dist/components/inputs/PasswordInput.js +24 -0
  153. package/dist/components/inputs/Picker.js +169 -1
  154. package/dist/components/inputs/Radio.js +55 -1
  155. package/dist/components/inputs/RateInput.js +62 -1
  156. package/dist/components/inputs/SegmentedPicker.js +62 -1
  157. package/dist/components/inputs/Select.js +219 -1
  158. package/dist/components/inputs/Switch.js +60 -1
  159. package/dist/components/inputs/TextArea.js +5 -0
  160. package/dist/components/inputs/TextInput.js +32 -1
  161. package/dist/components/inputs/UploadInput.js +140 -0
  162. package/dist/components/inputs/_DateInput.native.js +89 -1
  163. package/dist/components/inputs/datePicker/DatePicker.js +24 -1
  164. package/dist/components/inputs/datePicker/DayPicker.js +64 -1
  165. package/dist/components/inputs/datePicker/MonthPicker.js +62 -1
  166. package/dist/components/inputs/datePicker/QuarterPicker.js +65 -1
  167. package/dist/components/inputs/datePicker/WeekPicker.js +74 -1
  168. package/dist/components/inputs/datePicker/YearPicker.js +70 -1
  169. package/dist/components/inputs/index.js +23 -1
  170. package/dist/components/inputs/upload/Upload.js +99 -0
  171. package/dist/components/inputs/upload/Upload.native.js +154 -0
  172. package/dist/components/inputs/upload/useUploadState.js +143 -0
  173. package/dist/components/layout/Layout.js +40 -1
  174. package/dist/components/layout/LayoutContent.js +42 -1
  175. package/dist/components/layout/LayoutHeader.js +70 -1
  176. package/dist/components/layout/LayoutSider.js +64 -1
  177. package/dist/components/layout/index.js +4 -1
  178. package/dist/components/list/FlatList.js +91 -1
  179. package/dist/components/list/ScrollView.js +58 -1
  180. package/dist/components/list/index.js +2 -1
  181. package/dist/components/modals/bottomDrawer/index.js +3 -1
  182. package/dist/components/modals/bottomDrawer/index.native.js +5 -1
  183. package/dist/components/modals/bottomDrawer/index.web.js +5 -1
  184. package/dist/components/modals/bottomDrawer/native/BottomDrawer.js +239 -1
  185. package/dist/components/modals/bottomDrawer/native/DrawerContext.js +17 -1
  186. package/dist/components/modals/bottomDrawer/native/DrawerHandle.js +12 -1
  187. package/dist/components/modals/bottomDrawer/native/DrawerScrollView.js +5 -1
  188. package/dist/components/modals/bottomDrawer/native/createDrawerScrollComponent.js +139 -1
  189. package/dist/components/modals/bottomDrawer/native/utils.js +65 -1
  190. package/dist/components/modals/bottomDrawer/web/BottomDrawer.js +5 -1
  191. package/dist/components/modals/drawer/Drawer.js +5 -1
  192. package/dist/components/modals/drawer/Drawer.native.js +3 -1
  193. package/dist/components/modals/drawer/Drawer.web.js +3 -1
  194. package/dist/components/modals/drawer/index.js +1 -1
  195. package/dist/components/modals/index.js +4 -1
  196. package/dist/components/modals/modal/Modal.js +84 -1
  197. package/dist/components/modals/modal/Modal.native.js +83 -1
  198. package/dist/components/modals/modal/ModalBackdrop.js +58 -1
  199. package/dist/components/modals/modal/ModalContent.js +28 -1
  200. package/dist/components/modals/modal/ModalFooter.js +31 -1
  201. package/dist/components/modals/modal/ModalHeader.js +50 -1
  202. package/dist/components/modals/modal/handler/ModalsHandler.js +61 -1
  203. package/dist/components/modals/modal/index.js +6 -1
  204. package/dist/components/modals/router/ModalRoute.js +15 -1
  205. package/dist/components/modals/router/ModalsRouter.js +120 -1
  206. package/dist/components/modals/router/ModalsRouterContext.js +16 -1
  207. package/dist/components/modals/router/index.js +6 -1
  208. package/dist/components/modals/router/useAllModalsParams.js +6 -1
  209. package/dist/components/modals/router/useModalParams.js +6 -1
  210. package/dist/components/modals/router/useModalsNavigation.js +6 -1
  211. package/dist/components/modals/router/useUpdateModalContainer.js +6 -1
  212. package/dist/components/presentation/Avatar.js +79 -1
  213. package/dist/components/presentation/AvatarLabel.js +60 -1
  214. package/dist/components/presentation/AvatarsGroup.js +30 -0
  215. package/dist/components/presentation/Badge.js +91 -1
  216. package/dist/components/presentation/ContentLabel.js +43 -1
  217. package/dist/components/presentation/Icon.js +20 -1
  218. package/dist/components/presentation/IconLabel.js +40 -1
  219. package/dist/components/presentation/Image.js +33 -1
  220. package/dist/components/presentation/ImageBackground.js +38 -1
  221. package/dist/components/presentation/LabelValue.js +51 -1
  222. package/dist/components/presentation/Progress.js +20 -0
  223. package/dist/components/presentation/Rate.js +58 -1
  224. package/dist/components/presentation/RateTag.js +35 -1
  225. package/dist/components/presentation/Result.js +60 -1
  226. package/dist/components/presentation/ResultBar.js +56 -1
  227. package/dist/components/presentation/Tag.js +69 -1
  228. package/dist/components/presentation/Tooltip.js +44 -1
  229. package/dist/components/presentation/index.js +16 -1
  230. package/dist/components/sections/Section.js +50 -1
  231. package/dist/components/sections/SectionItem.js +24 -1
  232. package/dist/components/sections/SectionItemDropdown.js +68 -1
  233. package/dist/components/sections/SectionItemLink.js +35 -1
  234. package/dist/components/sections/index.js +4 -1
  235. package/dist/components/state/Loading.js +20 -1
  236. package/dist/components/state/LoadingView.js +37 -1
  237. package/dist/components/state/StatePresenter.js +41 -1
  238. package/dist/components/state/index.js +3 -1
  239. package/dist/components/steps/ActiveStepContent.js +16 -0
  240. package/dist/components/steps/StepsHandler.js +53 -0
  241. package/dist/components/steps/StepsMenu.js +14 -0
  242. package/dist/components/steps/StepsNavigation.js +37 -0
  243. package/dist/components/steps/index.js +4 -0
  244. package/dist/components/structure/Accordion.js +69 -1
  245. package/dist/components/structure/AccordionGroup.js +35 -1
  246. package/dist/components/structure/Affix.js +34 -0
  247. package/dist/components/structure/Affix.native.js +3 -0
  248. package/dist/components/structure/BlurView.js +59 -1
  249. package/dist/components/structure/Card.js +46 -1
  250. package/dist/components/structure/Col.js +22 -1
  251. package/dist/components/structure/GradientView.js +42 -1
  252. package/dist/components/structure/KeyboardAvoidingView.js +52 -1
  253. package/dist/components/structure/Row.js +50 -1
  254. package/dist/components/structure/SafeAreaView.js +42 -1
  255. package/dist/components/structure/Segment.js +51 -1
  256. package/dist/components/structure/TopBar.js +57 -1
  257. package/dist/components/structure/View.js +44 -1
  258. package/dist/components/structure/index.js +14 -1
  259. package/dist/components/structure/overlay/OverlayHandler.js +83 -1
  260. package/dist/components/structure/overlay/OverlayHandler.native.js +6 -1
  261. package/dist/components/structure/overlay/OverlayWrapper.js +52 -1
  262. package/dist/components/structure/overlay/calculatePosition.js +29 -1
  263. package/dist/components/structure/overlay/smartPlacement.js +32 -1
  264. package/dist/components/structure/popover/Popover.js +135 -1
  265. package/dist/components/structure/popover/Popover.native.js +105 -1
  266. package/dist/components/structure/popover/PopoverContent.js +18 -1
  267. package/dist/components/structure/popover/Popover_BU.js +157 -1
  268. package/dist/components/table/DataTable.js +62 -1
  269. package/dist/components/table/Pagination.js +128 -1
  270. package/dist/components/table/Table.js +66 -1
  271. package/dist/components/table/TableCol.js +67 -1
  272. package/dist/components/table/TableHeader.js +69 -1
  273. package/dist/components/table/TableHeaderRow.js +31 -1
  274. package/dist/components/table/TableRow.js +30 -1
  275. package/dist/components/table/index.js +7 -1
  276. package/dist/components/tabs/ActiveTabContent.js +38 -1
  277. package/dist/components/tabs/TabsHandler.js +16 -1
  278. package/dist/components/tabs/TabsMenu.js +15 -1
  279. package/dist/components/tabs/index.js +3 -1
  280. package/dist/components/text/DateText.js +24 -1
  281. package/dist/components/text/Text.js +32 -1
  282. package/dist/components/text/VerticalText.js +29 -1
  283. package/dist/components/text/index.js +3 -1
  284. package/dist/components/theme/ThemePicker.js +48 -1
  285. package/dist/components/theme/ThemePickerDrawer.js +12 -1
  286. package/dist/components/theme/ThemeStatusBar.js +3 -1
  287. package/dist/components/theme/ThemeStatusBar.native.js +9 -1
  288. package/dist/components/theme/ThemeThumb.js +98 -1
  289. package/dist/components/theme/index.js +3 -1
  290. package/dist/helpers/debounce.js +9 -1
  291. package/dist/helpers/index.js +5 -1
  292. package/dist/helpers/options.js +65 -1
  293. package/dist/helpers/random.js +5 -1
  294. package/dist/helpers/storage.js +76 -1
  295. package/dist/helpers/string.js +74 -1
  296. package/dist/i18n/I18n.js +96 -1
  297. package/dist/i18n/I18nProvider.js +40 -1
  298. package/dist/i18n/index.js +2 -1
  299. package/dist/index.js +8 -1
  300. package/dist/modifiers/_helpers.js +6 -1
  301. package/dist/modifiers/alignConverter.js +11 -1
  302. package/dist/modifiers/animation.js +18 -1
  303. package/dist/modifiers/animations/animatedEffects.js +64 -1
  304. package/dist/modifiers/animations/animatedEffects.native.js +55 -1
  305. package/dist/modifiers/animations/animatedEffects.web.js +55 -1
  306. package/dist/modifiers/animations/fadeEffect.js +46 -1
  307. package/dist/modifiers/animations/fadeEffect.native.js +33 -1
  308. package/dist/modifiers/animations/fadeEffect.web.js +3 -1
  309. package/dist/modifiers/animations/scaleEffect.js +46 -1
  310. package/dist/modifiers/animations/scaleEffect.native.js +33 -1
  311. package/dist/modifiers/animations/scrollEffect.web.js +3 -1
  312. package/dist/modifiers/animations/slideEffect.js +64 -1
  313. package/dist/modifiers/animations/slideEffect.native.js +53 -1
  314. package/dist/modifiers/animations/slideEffect.web.js +3 -1
  315. package/dist/modifiers/applyStyles.js +7 -1
  316. package/dist/modifiers/background.js +34 -1
  317. package/dist/modifiers/border.js +86 -1
  318. package/dist/modifiers/colorConverter.js +13 -1
  319. package/dist/modifiers/cursor.js +21 -1
  320. package/dist/modifiers/default.js +9 -1
  321. package/dist/modifiers/display.js +22 -1
  322. package/dist/modifiers/flex.js +20 -1
  323. package/dist/modifiers/flexWrapper.js +87 -1
  324. package/dist/modifiers/fullColor.js +32 -1
  325. package/dist/modifiers/grid.js +27 -1
  326. package/dist/modifiers/hover.js +28 -1
  327. package/dist/modifiers/logger.js +6 -1
  328. package/dist/modifiers/margin.js +25 -1
  329. package/dist/modifiers/overflow.js +28 -1
  330. package/dist/modifiers/padding.js +25 -1
  331. package/dist/modifiers/position.js +57 -1
  332. package/dist/modifiers/responsiveConverter.js +19 -1
  333. package/dist/modifiers/shadow.js +35 -1
  334. package/dist/modifiers/size.js +59 -1
  335. package/dist/modifiers/sizeConverter.js +12 -1
  336. package/dist/modifiers/state.js +33 -1
  337. package/dist/modifiers/text.js +62 -1
  338. package/dist/modifiers/textConverter.js +12 -1
  339. package/dist/modifiers/themeComponent.js +11 -1
  340. package/dist/responsive/ResponsiveHandler.js +28 -1
  341. package/dist/responsive/index.js +2 -1
  342. package/dist/responsive/responsiveHooks.js +67 -1
  343. package/dist/theme/ThemeHandler.js +81 -1
  344. package/dist/theme/default/base.js +95 -1
  345. package/dist/theme/default/blackTheme.js +47 -1
  346. package/dist/theme/default/cyberpunkTheme.js +36 -1
  347. package/dist/theme/default/darkTheme.js +35 -1
  348. package/dist/theme/default/hackerTheme.js +55 -1
  349. package/dist/theme/default/lightTheme.js +35 -1
  350. package/dist/theme/default/paperTheme.js +36 -1
  351. package/dist/theme/default/themes.js +15 -1
  352. package/dist/theme/format/colorsVariations.js +31 -1
  353. package/dist/theme/format/formatTheme.js +28 -1
  354. package/dist/theme/helpers/colorScale.js +12 -1
  355. package/dist/theme/helpers/contrastColor.js +18 -1
  356. package/dist/theme/helpers/dynamicColor.js +32 -1
  357. package/dist/theme/helpers/mergePreset.js +7 -1
  358. package/dist/theme/helpers/relatedScales.js +34 -1
  359. package/dist/theme/helpers/sizeScale.js +20 -1
  360. package/dist/theme/helpers/textScale.js +15 -1
  361. package/dist/theme/index.js +2 -1
  362. package/package.json +1 -3
  363. package/src/abstractions/Icon.js +1 -1
  364. package/src/abstractions/TextInput.js +10 -1
  365. package/src/components/actions/ActionsDrawer.js +17 -4
  366. package/src/components/actions/Button.js +5 -1
  367. package/src/components/actions/FloatingMenu.js +1 -1
  368. package/src/components/actions/menu/HorizontalMenu.js +2 -1
  369. package/src/components/actions/menu/VerticalMenu.js +2 -1
  370. package/src/components/filter/DateFilter.js +72 -0
  371. package/src/components/filter/FilterGroup.js +17 -0
  372. package/src/components/filter/FilterHandler.js +54 -0
  373. package/src/components/filter/FilterItem.js +30 -0
  374. package/src/components/filter/PopoverFilterItem.js +84 -0
  375. package/src/components/filter/SearchInput.js +49 -0
  376. package/src/components/filter/index.js +6 -0
  377. package/src/components/form/Form.js +9 -3
  378. package/src/components/form/FormItem.js +26 -1
  379. package/src/components/form/FormWrapperComponent.js +12 -3
  380. package/src/components/form/useNewForm.js +55 -4
  381. package/src/components/helpers/Separator.js +15 -11
  382. package/src/components/helpers/index.js +1 -0
  383. package/src/components/index.js +2 -0
  384. package/src/components/inputs/BooleanSelect.js +14 -0
  385. package/src/components/inputs/DateInput.js +3 -1
  386. package/src/components/inputs/DateRangeInput.js +41 -0
  387. package/src/components/inputs/Editable.js +129 -0
  388. package/src/components/inputs/EnabledSelect.js +14 -0
  389. package/src/components/inputs/InputWrapper.js +7 -4
  390. package/src/components/inputs/NumberInput.js +10 -5
  391. package/src/components/inputs/NumberRangeInput.js +41 -0
  392. package/src/components/inputs/PasswordInput.js +24 -0
  393. package/src/components/inputs/Picker.js +2 -2
  394. package/src/components/inputs/Select.js +61 -47
  395. package/src/components/inputs/TextArea.js +5 -0
  396. package/src/components/inputs/TextInput.js +14 -4
  397. package/src/components/inputs/UploadInput.js +140 -0
  398. package/src/components/inputs/index.js +9 -0
  399. package/src/components/inputs/upload/Upload.js +99 -0
  400. package/src/components/inputs/upload/Upload.native.js +154 -0
  401. package/src/components/inputs/upload/useUploadState.js +143 -0
  402. package/src/components/layout/LayoutHeader.js +1 -0
  403. package/src/components/presentation/AvatarLabel.js +1 -1
  404. package/src/components/presentation/AvatarsGroup.js +30 -0
  405. package/src/components/presentation/Badge.js +3 -2
  406. package/src/components/presentation/ContentLabel.js +1 -1
  407. package/src/components/presentation/IconLabel.js +1 -0
  408. package/src/components/presentation/Progress.js +20 -0
  409. package/src/components/presentation/index.js +2 -0
  410. package/src/components/sections/Section.js +1 -1
  411. package/src/components/sections/SectionItemLink.js +4 -2
  412. package/src/components/steps/ActiveStepContent.js +16 -0
  413. package/src/components/steps/StepsHandler.js +53 -0
  414. package/src/components/steps/StepsMenu.js +14 -0
  415. package/src/components/steps/StepsNavigation.js +37 -0
  416. package/src/components/steps/index.js +4 -0
  417. package/src/components/structure/Affix.js +34 -0
  418. package/src/components/structure/Affix.native.js +3 -0
  419. package/src/components/structure/Card.js +1 -0
  420. package/src/components/structure/TopBar.js +14 -2
  421. package/src/components/structure/index.js +1 -0
  422. package/src/components/structure/overlay/OverlayHandler.js +9 -1
  423. package/src/components/structure/popover/Popover.js +22 -5
  424. package/src/components/table/DataTable.js +7 -2
  425. package/src/components/table/Table.js +2 -1
  426. package/src/components/tabs/ActiveTabContent.js +4 -1
  427. package/src/components/text/DateText.js +15 -2
  428. package/src/modifiers/border.js +15 -9
  429. package/src/modifiers/fullColor.js +2 -2
  430. package/src/modifiers/size.js +8 -5
  431. package/src/theme/default/base.js +2 -0
  432. package/src/theme/default/hackerTheme.js +1 -10
  433. package/src/theme/default/paperTheme.js +1 -14
  434. package/src/theme/format/colorsVariations.js +1 -1
  435. package/src/theme/helpers/colorScale.js +2 -1
@@ -0,0 +1,54 @@
1
+ import { assocPath, curry } from 'ramda'
2
+ import React from 'react'
3
+
4
+ const FilterContext = React.createContext()
5
+ export const useFilter = () => React.useContext(FilterContext) || {}
6
+
7
+ export function FilterHandler({
8
+ children,
9
+ initialFilters = {},
10
+ initialSearch,
11
+ initialSort,
12
+ onChange,
13
+ }) {
14
+ const [filters, setFilters] = React.useState(initialFilters)
15
+ const [search, setSearch] = React.useState(initialSearch)
16
+ const [sort, setSort] = React.useState(initialSort)
17
+
18
+ React.useEffect(() => {
19
+ onChange?.({ filters, search, sort })
20
+ }, [filters, search, sort])
21
+
22
+ const onChangeFilter = curry((name, value) => {
23
+ const listPath = Array.isArray(name) ? name : [name]
24
+ setFilters((prev) => assocPath(listPath, value, prev))
25
+ })
26
+ const onChangeSearch = setSearch
27
+ const onChangeSort = setSort
28
+
29
+ const onReset = () => {
30
+ setFilters(initialFilters)
31
+ setSearch(initialSearch)
32
+ setSort(initialSort)
33
+ }
34
+
35
+ const onClear = () => {
36
+ setFilters({})
37
+ setSearch(undefined)
38
+ setSort(undefined)
39
+ }
40
+
41
+ const value = {
42
+ filters,
43
+ setFilters,
44
+ onChangeFilter,
45
+ search,
46
+ onChangeSearch,
47
+ sort,
48
+ onChangeSort,
49
+ onReset,
50
+ onClear,
51
+ }
52
+
53
+ return <FilterContext.Provider value={value}>{children}</FilterContext.Provider>
54
+ }
@@ -0,0 +1,30 @@
1
+ import React from 'react'
2
+ import { path } from 'ramda'
3
+
4
+ import { clearProps } from '../../modifiers/_helpers'
5
+ import { useFilter } from './FilterHandler'
6
+ import { useFilterPath } from './FilterGroup'
7
+
8
+ export function FilterItem({ name, children }) {
9
+ const { filters, onChangeFilter } = useFilter()
10
+ const listPath = useFilterPath(name)
11
+
12
+ const value = path(listPath, filters)
13
+
14
+ const handleChange = (e) => {
15
+ const val = e?.target?.value ?? e
16
+ onChangeFilter(listPath, val)
17
+ }
18
+
19
+ const childProps = clearProps({
20
+ value: value === undefined ? '' : value,
21
+ onChange: handleChange,
22
+ })
23
+
24
+ if (typeof children === 'function') {
25
+ return children(childProps)
26
+ }
27
+
28
+ const child = React.Children.only(children)
29
+ return React.cloneElement(child, { ...child.props, ...childProps })
30
+ }
@@ -0,0 +1,84 @@
1
+ import React from 'react'
2
+ import { path } from 'ramda'
3
+
4
+ import { Button } from '../actions/Button'
5
+ import { LinkInput } from '../inputs/LinkInput'
6
+ import { Popover } from '../structure/popover/Popover'
7
+ import { View } from '../structure/View'
8
+ import { useFilter } from './FilterHandler'
9
+ import { useFilterPath } from './FilterGroup'
10
+
11
+ function autoFormat(value) {
12
+ if (value == null) return undefined
13
+
14
+ if ('min' in value || 'max' in value) {
15
+ const { min, max } = value
16
+ if (min != null && max != null) return `${min} – ${max}`
17
+ if (min != null) return `≥ ${min}`
18
+ if (max != null) return `≤ ${max}`
19
+ return undefined
20
+ }
21
+
22
+ if ('start' in value || 'end' in value) {
23
+ const fmt = 'YYYY-MM-DD'
24
+ const s = value.start?.format?.(fmt) || value.start
25
+ const e = value.end?.format?.(fmt) || value.end
26
+ if (s && e) return `${s} – ${e}`
27
+ if (s) return `${s} →`
28
+ if (e) return `→ ${e}`
29
+ return undefined
30
+ }
31
+
32
+ return String(value)
33
+ }
34
+
35
+ function PopoverFilterContent({ value, onApply, submitOnClose, children, onClose }) {
36
+ const [local, setLocal] = React.useState(value)
37
+ const localRef = React.useRef(local)
38
+ localRef.current = local
39
+
40
+ React.useEffect(() => {
41
+ if (!submitOnClose) return
42
+ return () => onApply(localRef.current)
43
+ }, [])
44
+
45
+ const handleApply = () => {
46
+ onApply(local)
47
+ onClose()
48
+ }
49
+
50
+ return (
51
+ <View gap="sm">
52
+ {typeof children === 'function'
53
+ ? children({ value: local, onChange: setLocal })
54
+ : React.cloneElement(React.Children.only(children), { value: local, onChange: setLocal })}
55
+ <View row toRight>
56
+ <Button label="Apply" onPress={handleApply} xs />
57
+ </View>
58
+ </View>
59
+ )
60
+ }
61
+
62
+ export function PopoverFilterItem({ name, label, placeholder, children, submitOnClose, popoverProps, formatValue, ...props }) {
63
+ const { filters, onChangeFilter } = useFilter()
64
+ const listPath = useFilterPath(name)
65
+ const value = path(listPath, filters)
66
+
67
+ const displayText = value != null ? (formatValue?.(value) ?? autoFormat(value)) : undefined
68
+
69
+ return (
70
+ <Popover
71
+ trigger="click"
72
+ placement="bottomLeft"
73
+ unmountOnClose
74
+ {...popoverProps}
75
+ renderContent={({ onClose }) => (
76
+ <PopoverFilterContent value={value} onApply={(val) => onChangeFilter(listPath, val)} submitOnClose={submitOnClose} onClose={onClose}>
77
+ {children}
78
+ </PopoverFilterContent>
79
+ )}
80
+ >
81
+ <LinkInput value={displayText} placeholder={placeholder || label} suffixIcon="arrow-down-s-fill" suffixIconColor="text4" {...props} />
82
+ </Popover>
83
+ )
84
+ }
@@ -0,0 +1,49 @@
1
+ import React from 'react'
2
+
3
+ import { Icon } from '../presentation'
4
+ import { Link } from '../actions'
5
+ import { TextInput } from '../inputs'
6
+ import { useFilter } from './FilterHandler'
7
+
8
+ export function SearchInput({ value: valueProp, onChange: onChangeProp, placeholder = 'Search...', ...rest }) {
9
+ const filter = useFilter()
10
+
11
+ const value = valueProp ?? filter.search
12
+ const onChange = onChangeProp ?? filter.onChangeSearch
13
+
14
+ const [local, setLocal] = React.useState(value || '')
15
+
16
+ React.useEffect(() => {
17
+ setLocal(value || '')
18
+ }, [value])
19
+
20
+ const push = () => {
21
+ onChange?.(local)
22
+ }
23
+
24
+ const clear = () => {
25
+ setLocal('')
26
+ onChange?.('')
27
+ }
28
+
29
+ const suffix = !!local && (
30
+ <Link onPress={clear}>
31
+ <Icon name="close-line" />
32
+ </Link>
33
+ )
34
+
35
+ return (
36
+ <TextInput
37
+ prefixIcon="search-line"
38
+ prefixIconColor="text4"
39
+ placeholder={placeholder}
40
+ value={local}
41
+ onChange={setLocal}
42
+ onBlur={push}
43
+ onKeyDown={(e) => e.key === 'Enter' && push()}
44
+ onSubmitEditing={push}
45
+ suffix={suffix}
46
+ {...rest}
47
+ />
48
+ )
49
+ }
@@ -0,0 +1,6 @@
1
+ export * from './FilterHandler'
2
+ export * from './FilterGroup'
3
+ export * from './FilterItem'
4
+ export * from './PopoverFilterItem'
5
+ export * from './SearchInput'
6
+ export * from './DateFilter'
@@ -9,14 +9,20 @@ export const useFormState = () => React.useContext(FormContext)
9
9
  export const useFormInstance = () => useFormState()?.form
10
10
  export const useForm = useFormInstance
11
11
 
12
- export function Form({ form, onSubmit, initialValues, children, loading, disabled, ...props }) {
13
- const defaultForm = useNewForm({ onSubmit, initialValues })
12
+ export function Form({ form, onSubmit, onValuesChange, initialValues, children, loading, disabled, ...props }) {
13
+ const defaultForm = useNewForm({ onSubmit, onValuesChange, initialValues })
14
14
  form = form || defaultForm
15
15
 
16
+ // Keep external form's callbacks in sync with Form props
17
+ if (form._callbacksRef) {
18
+ if (onSubmit) form._callbacksRef.current.onSubmit = onSubmit
19
+ if (onValuesChange) form._callbacksRef.current.onValuesChange = onValuesChange
20
+ }
21
+
16
22
  return (
17
23
  <FormContext.Provider value={{ loading, disabled, form }}>
18
24
  <LoadingView active={loading} noWrapper>
19
- <FormWrapperComponent form={form} gap="md" {...props}>
25
+ <FormWrapperComponent form={form} onSubmit={onSubmit} gap="md" {...props}>
20
26
  {children}
21
27
  </FormWrapperComponent>
22
28
  </LoadingView>
@@ -15,6 +15,11 @@ export function FormItem({
15
15
  useDefaultValue,
16
16
  rules,
17
17
  validateTrigger = 'onSubmit',
18
+ hidden,
19
+ valuePropName,
20
+ initialValue,
21
+ extra,
22
+ noStyle,
18
23
  ...props
19
24
  }) {
20
25
  const form = useFormInstance()
@@ -24,6 +29,13 @@ export function FormItem({
24
29
  const [value, setValue] = React.useState(form.getFieldValue(listPath))
25
30
  const [error, setError] = React.useState(form.getError(listPath))
26
31
 
32
+ // Set initial value on mount if provided and field has no value
33
+ React.useEffect(() => {
34
+ if (initialValue !== undefined && form.getFieldValue(listPath) === undefined) {
35
+ form.setFieldValue(listPath, initialValue)
36
+ }
37
+ }, [listPathStr])
38
+
27
39
  // Register rules with the form
28
40
  React.useEffect(() => {
29
41
  return form.registerRules(listPath, rules, validateTrigger)
@@ -56,7 +68,7 @@ export function FormItem({
56
68
  }
57
69
  }
58
70
 
59
- let valueKey = 'value'
71
+ let valueKey = valuePropName || 'value'
60
72
  if (!!useDefaultValue) valueKey = 'defaultValue'
61
73
 
62
74
  const child = typeof children === 'function' ? null : React.Children.only(children)
@@ -77,6 +89,18 @@ export function FormItem({
77
89
  content = React.cloneElement(child, { ...child.props, ...childProps })
78
90
  }
79
91
 
92
+ if (hidden) {
93
+ return (
94
+ <FormGroup name={listPath}>
95
+ <View hidden>{content}</View>
96
+ </FormGroup>
97
+ )
98
+ }
99
+
100
+ if (noStyle) {
101
+ return <FormGroup name={listPath}>{content}</FormGroup>
102
+ }
103
+
80
104
  return (
81
105
  <FormGroup name={listPath}>
82
106
  <View {...props}>
@@ -87,6 +111,7 @@ export function FormItem({
87
111
  )}
88
112
  {content}
89
113
  {error && <Text color="red">{error}</Text>}
114
+ {extra && <View marginT="xxs">{extra}</View>}
90
115
  </View>
91
116
  </FormGroup>
92
117
  )
@@ -12,7 +12,7 @@ import { usePositionModifier } from '../../modifiers/position'
12
12
  import { useShadowModifier } from '../../modifiers/shadow'
13
13
  import { useSizeModifier } from '../../modifiers/size'
14
14
 
15
- export function FormWrapperComponent({ children, form, ...rootProps }) {
15
+ export function FormWrapperComponent({ children, form, onSubmit, ...rootProps }) {
16
16
  const formState = useFormState()
17
17
  const [_, props] = pipe(
18
18
  useDisplayModifier, //
@@ -28,10 +28,19 @@ export function FormWrapperComponent({ children, form, ...rootProps }) {
28
28
  useShadowModifier
29
29
  )([{}, rootProps])
30
30
 
31
- const handleSubmit = (e) => {
31
+ const handleSubmit = async (e) => {
32
32
  e.preventDefault()
33
33
  if (formState?.loading || formState?.disabled) return
34
- form.handleSubmit()
34
+ if (onSubmit) {
35
+ try {
36
+ const values = await form.validateFields()
37
+ onSubmit(values)
38
+ } catch (e) {
39
+ // Validation failed, errors already set on fields
40
+ }
41
+ } else {
42
+ form.handleSubmit()
43
+ }
35
44
  }
36
45
 
37
46
  return (
@@ -2,12 +2,16 @@ import { assocPath, path } from 'ramda'
2
2
  import React from 'react'
3
3
  import { validateRules, validateAllFields, normalizeRules } from './validation'
4
4
 
5
- export function useNewForm({ initialValues = {}, validate, onSubmit } = {}) {
5
+ export function useNewForm({ initialValues = {}, validate, onSubmit, onValuesChange } = {}) {
6
6
  const valuesRef = React.useRef({ ...initialValues })
7
+ const initialValuesRef = React.useRef({ ...initialValues })
7
8
  const errorsRef = React.useRef({}) // Flat structure: { 'users': 'error', 'users.0.name': 'error' }
8
9
  const listenersRef = React.useRef({})
9
10
  const errorListenersRef = React.useRef({})
10
11
  const rulesRegistryRef = React.useRef(new Map())
12
+ const callbacksRef = React.useRef({ onSubmit, validate, onValuesChange })
13
+
14
+ callbacksRef.current = { onSubmit, validate, onValuesChange }
11
15
 
12
16
  const formApi = React.useMemo(() => {
13
17
  const toKey = (name) => (Array.isArray(name) ? name.join('.') : name)
@@ -20,6 +24,14 @@ export function useNewForm({ initialValues = {}, validate, onSubmit } = {}) {
20
24
  }
21
25
  }
22
26
 
27
+ const notifyAll = () => {
28
+ Object.keys(listenersRef.current).forEach((key) => {
29
+ const keyPath = key.split('.')
30
+ const value = path(keyPath, valuesRef.current)
31
+ listenersRef.current[key]?.forEach((cb) => cb(value))
32
+ })
33
+ }
34
+
23
35
  const notifyError = (name) => {
24
36
  const key = toKey(name)
25
37
  if (errorListenersRef.current[key]) {
@@ -27,13 +39,40 @@ export function useNewForm({ initialValues = {}, validate, onSubmit } = {}) {
27
39
  }
28
40
  }
29
41
 
42
+ const notifyAllErrors = () => {
43
+ Object.keys(errorListenersRef.current).forEach((key) => {
44
+ errorListenersRef.current[key]?.forEach((cb) => cb(errorsRef.current[key]))
45
+ })
46
+ }
47
+
30
48
  const setFieldValue = (name, value) => {
31
49
  valuesRef.current = assocPath(toPath(name), value, valuesRef.current)
32
50
  notify(name)
51
+ const fn = callbacksRef.current.onValuesChange
52
+ if (fn) fn(name, valuesRef.current)
33
53
  }
34
54
 
35
55
  const getFieldValue = (name) => path(toPath(name), valuesRef.current)
36
56
 
57
+ const getFieldsValue = () => ({ ...valuesRef.current })
58
+
59
+ const setFieldsValue = (obj) => {
60
+ if (!obj) return
61
+ Object.entries(obj).forEach(([key, value]) => {
62
+ valuesRef.current = assocPath(toPath(key), value, valuesRef.current)
63
+ })
64
+ notifyAll()
65
+ const fn = callbacksRef.current.onValuesChange
66
+ if (fn) fn(null, valuesRef.current)
67
+ }
68
+
69
+ const resetFields = () => {
70
+ valuesRef.current = { ...initialValuesRef.current }
71
+ errorsRef.current = {}
72
+ notifyAll()
73
+ notifyAllErrors()
74
+ }
75
+
37
76
  // Flat error lookup by key
38
77
  const getError = (name) => {
39
78
  const key = toKey(name)
@@ -112,6 +151,7 @@ export function useNewForm({ initialValues = {}, validate, onSubmit } = {}) {
112
151
  const rulesErrors = await validateAllFields(valuesRef.current, rulesRegistryRef.current)
113
152
 
114
153
  // Run legacy validate function if provided
154
+ const { validate } = callbacksRef.current
115
155
  const legacyErrors = validate ? validate(valuesRef.current) || {} : {}
116
156
 
117
157
  // Store errors in flat structure
@@ -134,16 +174,25 @@ export function useNewForm({ initialValues = {}, validate, onSubmit } = {}) {
134
174
  return Object.keys(errorsRef.current).length === 0
135
175
  }
136
176
 
177
+ const validateFields = async () => {
178
+ const isValid = await validateForm()
179
+ if (!isValid) return Promise.reject(errorsRef.current)
180
+ return { ...valuesRef.current }
181
+ }
182
+
137
183
  const handleSubmit = async () => {
138
184
  const isValid = await validateForm()
139
185
  if (!isValid) return
140
- console.log('SUBMIT')
141
- onSubmit(valuesRef.current)
186
+ const { onSubmit } = callbacksRef.current
187
+ if (onSubmit) onSubmit({ ...valuesRef.current })
142
188
  }
143
189
 
144
190
  return {
145
191
  setFieldValue,
146
192
  getFieldValue,
193
+ getFieldsValue,
194
+ setFieldsValue,
195
+ resetFields,
147
196
  getError,
148
197
  setError,
149
198
  clearErrors,
@@ -151,10 +200,12 @@ export function useNewForm({ initialValues = {}, validate, onSubmit } = {}) {
151
200
  registerErrorListener,
152
201
  registerRules,
153
202
  validateField,
203
+ validateFields,
154
204
  handleSubmit,
155
205
  valuesRef,
206
+ _callbacksRef: callbacksRef,
156
207
  }
157
- }, [validate, onSubmit])
208
+ }, [])
158
209
 
159
210
  return formApi
160
211
  }
@@ -11,12 +11,19 @@ import { useSizeConverter } from '../../modifiers/sizeConverter'
11
11
  import { useSizeModifier } from '../../modifiers/size'
12
12
  import { useThemeComponentModifier } from '../../modifiers/themeComponent'
13
13
 
14
- const DEFAULT_PROPS = ([{ size, sizeCode }, { line }]) => ({
15
- height: !!line ? 2 * size : size,
16
- br: sizeCode,
17
- center: true,
18
- fullW: true,
19
- })
14
+ const DEFAULT_PROPS = ([{ size, sizeCode }, { line, vertical }]) => {
15
+ const lineSize = is(Number, line) ? line : 1
16
+ return {
17
+ ...(vertical
18
+ ? { width: !!line ? 2 * size : size, fullH: true, row: true }
19
+ : { height: !!line ? 2 * size : size, fullW: true }),
20
+ br: sizeCode,
21
+ center: true,
22
+ lineProps: vertical
23
+ ? { width: lineSize, fullH: true, br: lineSize }
24
+ : { height: lineSize, fullW: true, br: lineSize },
25
+ }
26
+ }
20
27
 
21
28
  export function Separator(rootProps) {
22
29
  const [{ color }, formattedProps] = pipe(
@@ -30,14 +37,11 @@ export function Separator(rootProps) {
30
37
  useFlexWrapperModifier
31
38
  )([{}, rootProps])
32
39
 
33
- const { line, lineProps, ...props } = formattedProps
34
- const lineHeight = is(Number, line) ? line : 1
40
+ const { line, vertical, lineProps, ...props } = formattedProps
35
41
 
36
42
  return (
37
43
  <AbsView className="neko-separator" {...props}>
38
- {!!line && (
39
- <View bg={color} br={lineHeight} height={lineHeight} fullW className="neko-separator-line" {...lineProps} />
40
- )}
44
+ {!!line && <View bg={color} className="neko-separator-line" {...lineProps} />}
41
45
  </AbsView>
42
46
  )
43
47
  }
@@ -3,5 +3,6 @@ export * from './Responsive'
3
3
  export * from './VerticalView'
4
4
  export * from './PortalHandler'
5
5
  export * from './Portal'
6
+ export * from './LazyAction'
6
7
  export * from './LazyRender'
7
8
  export * from './ConditionalLazyRender'
@@ -16,3 +16,5 @@ export * from './list'
16
16
  export * from './tabs'
17
17
  export * from './theme'
18
18
  export * from './sections'
19
+ export * from './filter'
20
+ export * from './steps'
@@ -0,0 +1,14 @@
1
+ import { Select } from './Select'
2
+
3
+ export function BooleanSelect({ trueLabel = 'True', falseLabel = 'False', placeholder, ...props }) {
4
+ return (
5
+ <Select
6
+ placeholder={placeholder}
7
+ options={[
8
+ { label: trueLabel, value: true },
9
+ { label: falseLabel, value: false },
10
+ ]}
11
+ {...props}
12
+ />
13
+ )
14
+ }
@@ -47,6 +47,7 @@ export function DateInput({
47
47
  placement,
48
48
  type = 'day',
49
49
  format,
50
+ startsOpen,
50
51
  useBottomDrawer = { native: true, sm: true, md: true },
51
52
  ...props
52
53
  }) {
@@ -88,13 +89,14 @@ export function DateInput({
88
89
  return (
89
90
  <Popover
90
91
  trigger="click"
92
+ startsOpen={startsOpen}
91
93
  placement={placement || 'bottomLeft'}
92
94
  snapPoints={[350]}
93
95
  useBottomDrawer={useBottomDrawer}
94
96
  bottomDrawerProps={{ contentProps: { padding: 'md' } }}
95
97
  watch={[value?.format?.('YYYYMMDD')]}
96
98
  renderContent={({ onClose }) => (
97
- <View flex centerH>
99
+ <View flex centerH onMouseDown={(e) => e.preventDefault()}>
98
100
  <DatePicker
99
101
  value={value}
100
102
  onChange={(v) => {
@@ -0,0 +1,41 @@
1
+ import { DateInput } from './DateInput'
2
+ import { Text } from '../text/Text'
3
+ import { View } from '../structure/View'
4
+
5
+ export function DateRangeInput({
6
+ value,
7
+ onChange,
8
+ startProps,
9
+ endProps,
10
+ placeholderStart = 'Start',
11
+ placeholderEnd = 'End',
12
+ separator = '–',
13
+ ...props
14
+ }) {
15
+ const handleChangeStart = (start) => onChange?.({ ...value, start })
16
+ const handleChangeEnd = (end) => onChange?.({ ...value, end })
17
+
18
+ return (
19
+ <View row centerV gap="sm">
20
+ <DateInput
21
+ placeholder={placeholderStart}
22
+ value={value?.start}
23
+ onChange={handleChangeStart}
24
+ max={value?.end}
25
+ flex
26
+ {...props}
27
+ {...startProps}
28
+ />
29
+ <Text text4>{separator}</Text>
30
+ <DateInput
31
+ placeholder={placeholderEnd}
32
+ value={value?.end}
33
+ onChange={handleChangeEnd}
34
+ min={value?.start}
35
+ flex
36
+ {...props}
37
+ {...endProps}
38
+ />
39
+ </View>
40
+ )
41
+ }