@neko-os/ui 0.2.3 → 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 (431) hide show
  1. package/dist/DynamicStyleTag.js +18 -2
  2. package/dist/DynamicStyleTag.native.js +3 -1
  3. package/dist/NekoUI.js +39 -1
  4. package/dist/abstractions/ActivityIndicator.js +19 -1
  5. package/dist/abstractions/ActivityIndicator.native.js +43 -1
  6. package/dist/abstractions/ActivityIndicator.web.js +43 -1
  7. package/dist/abstractions/AnimatedView.js +3 -1
  8. package/dist/abstractions/AnimatedView.native.js +5 -1
  9. package/dist/abstractions/AnimatedView.web.js +3 -1
  10. package/dist/abstractions/BlurView.js +43 -1
  11. package/dist/abstractions/BlurView.native.js +39 -1
  12. package/dist/abstractions/BlurView.web.js +39 -1
  13. package/dist/abstractions/DraggableSlideView.js +3 -1
  14. package/dist/abstractions/DraggableSlideView.native.js +62 -1
  15. package/dist/abstractions/FlatList.js +3 -1
  16. package/dist/abstractions/FlatList.native.js +37 -1
  17. package/dist/abstractions/FlatList.web.js +3 -1
  18. package/dist/abstractions/GradientView.js +5 -1
  19. package/dist/abstractions/GradientView.native.js +32 -1
  20. package/dist/abstractions/HiddenInput.js +3 -1
  21. package/dist/abstractions/HiddenInput.native.js +3 -1
  22. package/dist/abstractions/Icon.js +10 -1
  23. package/dist/abstractions/Icon.native.js +13 -1
  24. package/dist/abstractions/Icon.web.js +11 -1
  25. package/dist/abstractions/Image.js +12 -1
  26. package/dist/abstractions/Image.native.js +7 -1
  27. package/dist/abstractions/Image.web.js +7 -1
  28. package/dist/abstractions/ImageBackground.js +17 -1
  29. package/dist/abstractions/ImageBackground.native.js +27 -1
  30. package/dist/abstractions/ImageBackground.web.js +7 -1
  31. package/dist/abstractions/KeyboardAvoidingView.js +3 -1
  32. package/dist/abstractions/KeyboardAvoidingView.native.js +3 -1
  33. package/dist/abstractions/Platform.js +1 -1
  34. package/dist/abstractions/Platform.native.js +3 -1
  35. package/dist/abstractions/Platform.web.js +3 -1
  36. package/dist/abstractions/Pressable.js +4 -1
  37. package/dist/abstractions/Pressable.native.js +3 -1
  38. package/dist/abstractions/Pressable.web.js +3 -1
  39. package/dist/abstractions/SafeAreaView.js +3 -1
  40. package/dist/abstractions/SafeAreaView.native.js +3 -1
  41. package/dist/abstractions/ScrollView.js +3 -1
  42. package/dist/abstractions/ScrollView.native.js +5 -1
  43. package/dist/abstractions/ScrollView.web.js +3 -1
  44. package/dist/abstractions/StaticList.js +51 -1
  45. package/dist/abstractions/Switch.js +97 -1
  46. package/dist/abstractions/Switch.native.js +12 -1
  47. package/dist/abstractions/Table.js +29 -1
  48. package/dist/abstractions/Table.native.js +19 -1
  49. package/dist/abstractions/Text.js +14 -1
  50. package/dist/abstractions/Text.native.js +3 -1
  51. package/dist/abstractions/Text.web.js +18 -1
  52. package/dist/abstractions/TextInput.js +12 -1
  53. package/dist/abstractions/TextInput.native.js +5 -1
  54. package/dist/abstractions/TextInput.web.js +5 -1
  55. package/dist/abstractions/TouchableOpacity.js +4 -1
  56. package/dist/abstractions/TouchableOpacity.native.js +3 -1
  57. package/dist/abstractions/View.js +3 -1
  58. package/dist/abstractions/View.native.js +3 -1
  59. package/dist/abstractions/View.web.js +3 -1
  60. package/dist/abstractions/helpers/componentSize.js +13 -1
  61. package/dist/abstractions/helpers/componentSize.native.js +12 -1
  62. package/dist/abstractions/helpers/storage.js +32 -1
  63. package/dist/abstractions/helpers/storage.native.js +34 -1
  64. package/dist/abstractions/helpers/transformStyle.js +8 -1
  65. package/dist/abstractions/helpers/transformStyle.native.js +3 -1
  66. package/dist/abstractions/helpers/useSafeAreaInsets.js +3 -1
  67. package/dist/abstractions/helpers/useSafeAreaInsets.native.js +3 -1
  68. package/dist/abstractions/helpers/windowWidth.js +13 -1
  69. package/dist/abstractions/helpers/windowWidth.native.js +6 -1
  70. package/dist/abstractions/helpers/windowWidth.web.js +6 -1
  71. package/dist/components/actions/ActionsDrawer.js +81 -1
  72. package/dist/components/actions/Breadcrumb.js +47 -1
  73. package/dist/components/actions/Button.js +82 -1
  74. package/dist/components/actions/Dropdown.js +91 -1
  75. package/dist/components/actions/FloatingButton.js +87 -1
  76. package/dist/components/actions/FloatingMenu.js +39 -1
  77. package/dist/components/actions/Link.js +66 -1
  78. package/dist/components/actions/Pressable.js +38 -1
  79. package/dist/components/actions/index.js +9 -1
  80. package/dist/components/actions/menu/HorizontalMenu.js +98 -1
  81. package/dist/components/actions/menu/Menu.js +7 -1
  82. package/dist/components/actions/menu/SubmenuWrapper.js +16 -1
  83. package/dist/components/actions/menu/VerticalMenu.js +133 -1
  84. package/dist/components/animations/AnimatedTopBar.js +10 -1
  85. package/dist/components/animations/AnimatedTopBar.native.js +34 -1
  86. package/dist/components/animations/AnimatedTopBar.web.js +1 -1
  87. package/dist/components/animations/AnimatedView.js +45 -1
  88. package/dist/components/animations/DraggableSlideView.js +42 -1
  89. package/dist/components/animations/ParallaxHeader.js +9 -1
  90. package/dist/components/animations/ParallaxHeader.native.js +32 -1
  91. package/dist/components/animations/ParallaxHeader.web.js +32 -1
  92. package/dist/components/animations/ReanimatedScrollHandler.js +8 -1
  93. package/dist/components/animations/ReanimatedScrollHandler.native.js +24 -1
  94. package/dist/components/animations/ReanimatedScrollHandler.web.js +1 -1
  95. package/dist/components/animations/ReanimatedView.js +40 -1
  96. package/dist/components/animations/index.js +5 -1
  97. package/dist/components/calendar/CalendarNav.js +67 -1
  98. package/dist/components/calendar/WeekDaysBar.js +18 -1
  99. package/dist/components/calendar/_helpers/calendarDays.js +16 -1
  100. package/dist/components/calendar/_helpers/dateDisabled.js +24 -1
  101. package/dist/components/feedback/alerter.js +31 -1
  102. package/dist/components/feedback/confirmer.js +70 -1
  103. package/dist/components/feedback/index.js +3 -1
  104. package/dist/components/feedback/notifications/Notification.js +37 -1
  105. package/dist/components/feedback/notifications/NotificationsHandler.js +65 -1
  106. package/dist/components/filter/DateFilter.js +72 -0
  107. package/dist/components/filter/FilterGroup.js +17 -0
  108. package/dist/components/filter/FilterHandler.js +54 -0
  109. package/dist/components/filter/FilterItem.js +30 -0
  110. package/dist/components/filter/PopoverFilterItem.js +84 -0
  111. package/dist/components/filter/SearchInput.js +49 -0
  112. package/dist/components/filter/index.js +6 -0
  113. package/dist/components/form/Form.js +31 -1
  114. package/dist/components/form/FormGroup.js +21 -1
  115. package/dist/components/form/FormItem.js +118 -1
  116. package/dist/components/form/FormList.js +143 -1
  117. package/dist/components/form/FormWrapperComponent.js +52 -1
  118. package/dist/components/form/FormWrapperComponent.native.js +5 -1
  119. package/dist/components/form/SubmitButton.js +22 -1
  120. package/dist/components/form/index.js +9 -1
  121. package/dist/components/form/useNewForm.js +211 -1
  122. package/dist/components/form/useWatch.js +70 -1
  123. package/dist/components/form/validation/defaultMessages.js +20 -1
  124. package/dist/components/form/validation/index.js +5 -1
  125. package/dist/components/form/validation/normalizeRules.js +22 -1
  126. package/dist/components/form/validation/shouldValidateOn.js +21 -1
  127. package/dist/components/form/validation/validateRules.js +83 -1
  128. package/dist/components/form/validation/validators.js +82 -1
  129. package/dist/components/helpers/ConditionalLazyRender.js +6 -1
  130. package/dist/components/helpers/LazyAction.js +22 -1
  131. package/dist/components/helpers/LazyRender.js +55 -1
  132. package/dist/components/helpers/LazyRender.native.js +58 -1
  133. package/dist/components/helpers/Portal.js +21 -1
  134. package/dist/components/helpers/PortalHandler.js +32 -1
  135. package/dist/components/helpers/Responsive.js +18 -1
  136. package/dist/components/helpers/Separator.js +49 -1
  137. package/dist/components/helpers/VerticalView.js +34 -1
  138. package/dist/components/helpers/index.js +8 -1
  139. package/dist/components/index.js +20 -1
  140. package/dist/components/inputs/BooleanSelect.js +14 -0
  141. package/dist/components/inputs/Checkbox.js +56 -1
  142. package/dist/components/inputs/DateInput.js +123 -1
  143. package/dist/components/inputs/DateRangeInput.js +41 -0
  144. package/dist/components/inputs/Editable.js +129 -0
  145. package/dist/components/inputs/EnabledSelect.js +14 -0
  146. package/dist/components/inputs/InputWrapper.js +93 -1
  147. package/dist/components/inputs/LinkInput.js +17 -1
  148. package/dist/components/inputs/MaskInput.js +67 -1
  149. package/dist/components/inputs/NumberInput.js +111 -1
  150. package/dist/components/inputs/NumberRangeInput.js +41 -0
  151. package/dist/components/inputs/PasswordInput.js +24 -0
  152. package/dist/components/inputs/Picker.js +169 -1
  153. package/dist/components/inputs/Radio.js +55 -1
  154. package/dist/components/inputs/RateInput.js +62 -1
  155. package/dist/components/inputs/SegmentedPicker.js +62 -1
  156. package/dist/components/inputs/Select.js +219 -1
  157. package/dist/components/inputs/Switch.js +60 -1
  158. package/dist/components/inputs/TextArea.js +5 -0
  159. package/dist/components/inputs/TextInput.js +32 -1
  160. package/dist/components/inputs/UploadInput.js +140 -0
  161. package/dist/components/inputs/_DateInput.native.js +89 -1
  162. package/dist/components/inputs/datePicker/DatePicker.js +24 -1
  163. package/dist/components/inputs/datePicker/DayPicker.js +64 -1
  164. package/dist/components/inputs/datePicker/MonthPicker.js +62 -1
  165. package/dist/components/inputs/datePicker/QuarterPicker.js +65 -1
  166. package/dist/components/inputs/datePicker/WeekPicker.js +74 -1
  167. package/dist/components/inputs/datePicker/YearPicker.js +70 -1
  168. package/dist/components/inputs/index.js +23 -1
  169. package/dist/components/inputs/upload/Upload.js +99 -0
  170. package/dist/components/inputs/upload/Upload.native.js +154 -0
  171. package/dist/components/inputs/upload/useUploadState.js +143 -0
  172. package/dist/components/layout/Layout.js +40 -1
  173. package/dist/components/layout/LayoutContent.js +42 -1
  174. package/dist/components/layout/LayoutHeader.js +70 -1
  175. package/dist/components/layout/LayoutSider.js +64 -1
  176. package/dist/components/layout/index.js +4 -1
  177. package/dist/components/list/FlatList.js +91 -1
  178. package/dist/components/list/ScrollView.js +58 -1
  179. package/dist/components/list/index.js +2 -1
  180. package/dist/components/modals/bottomDrawer/index.js +3 -1
  181. package/dist/components/modals/bottomDrawer/index.native.js +5 -1
  182. package/dist/components/modals/bottomDrawer/index.web.js +5 -1
  183. package/dist/components/modals/bottomDrawer/native/BottomDrawer.js +239 -1
  184. package/dist/components/modals/bottomDrawer/native/DrawerContext.js +17 -1
  185. package/dist/components/modals/bottomDrawer/native/DrawerHandle.js +12 -1
  186. package/dist/components/modals/bottomDrawer/native/DrawerScrollView.js +5 -1
  187. package/dist/components/modals/bottomDrawer/native/createDrawerScrollComponent.js +139 -1
  188. package/dist/components/modals/bottomDrawer/native/utils.js +65 -1
  189. package/dist/components/modals/bottomDrawer/web/BottomDrawer.js +5 -1
  190. package/dist/components/modals/drawer/Drawer.js +5 -1
  191. package/dist/components/modals/drawer/Drawer.native.js +3 -1
  192. package/dist/components/modals/drawer/Drawer.web.js +3 -1
  193. package/dist/components/modals/drawer/index.js +1 -1
  194. package/dist/components/modals/index.js +4 -1
  195. package/dist/components/modals/modal/Modal.js +84 -1
  196. package/dist/components/modals/modal/Modal.native.js +83 -1
  197. package/dist/components/modals/modal/ModalBackdrop.js +58 -1
  198. package/dist/components/modals/modal/ModalContent.js +28 -1
  199. package/dist/components/modals/modal/ModalFooter.js +31 -1
  200. package/dist/components/modals/modal/ModalHeader.js +50 -1
  201. package/dist/components/modals/modal/handler/ModalsHandler.js +61 -1
  202. package/dist/components/modals/modal/index.js +6 -1
  203. package/dist/components/modals/router/ModalRoute.js +15 -1
  204. package/dist/components/modals/router/ModalsRouter.js +120 -1
  205. package/dist/components/modals/router/ModalsRouterContext.js +16 -1
  206. package/dist/components/modals/router/index.js +6 -1
  207. package/dist/components/modals/router/useAllModalsParams.js +6 -1
  208. package/dist/components/modals/router/useModalParams.js +6 -1
  209. package/dist/components/modals/router/useModalsNavigation.js +6 -1
  210. package/dist/components/modals/router/useUpdateModalContainer.js +6 -1
  211. package/dist/components/presentation/Avatar.js +79 -1
  212. package/dist/components/presentation/AvatarLabel.js +60 -1
  213. package/dist/components/presentation/AvatarsGroup.js +30 -0
  214. package/dist/components/presentation/Badge.js +91 -1
  215. package/dist/components/presentation/ContentLabel.js +43 -1
  216. package/dist/components/presentation/Icon.js +20 -1
  217. package/dist/components/presentation/IconLabel.js +40 -1
  218. package/dist/components/presentation/Image.js +33 -1
  219. package/dist/components/presentation/ImageBackground.js +38 -1
  220. package/dist/components/presentation/LabelValue.js +51 -1
  221. package/dist/components/presentation/Progress.js +20 -0
  222. package/dist/components/presentation/Rate.js +58 -1
  223. package/dist/components/presentation/RateTag.js +35 -1
  224. package/dist/components/presentation/Result.js +60 -1
  225. package/dist/components/presentation/ResultBar.js +56 -1
  226. package/dist/components/presentation/Tag.js +69 -1
  227. package/dist/components/presentation/Tooltip.js +44 -1
  228. package/dist/components/presentation/index.js +16 -1
  229. package/dist/components/sections/Section.js +50 -1
  230. package/dist/components/sections/SectionItem.js +24 -1
  231. package/dist/components/sections/SectionItemDropdown.js +68 -1
  232. package/dist/components/sections/SectionItemLink.js +35 -1
  233. package/dist/components/sections/index.js +4 -1
  234. package/dist/components/state/Loading.js +20 -1
  235. package/dist/components/state/LoadingView.js +37 -1
  236. package/dist/components/state/StatePresenter.js +41 -1
  237. package/dist/components/state/index.js +3 -1
  238. package/dist/components/steps/ActiveStepContent.js +16 -0
  239. package/dist/components/steps/StepsHandler.js +53 -0
  240. package/dist/components/steps/StepsMenu.js +14 -0
  241. package/dist/components/steps/StepsNavigation.js +37 -0
  242. package/dist/components/steps/index.js +4 -0
  243. package/dist/components/structure/Accordion.js +69 -1
  244. package/dist/components/structure/AccordionGroup.js +35 -1
  245. package/dist/components/structure/Affix.js +34 -0
  246. package/dist/components/structure/Affix.native.js +3 -0
  247. package/dist/components/structure/BlurView.js +59 -1
  248. package/dist/components/structure/Card.js +46 -1
  249. package/dist/components/structure/Col.js +22 -1
  250. package/dist/components/structure/GradientView.js +42 -1
  251. package/dist/components/structure/KeyboardAvoidingView.js +52 -1
  252. package/dist/components/structure/Row.js +50 -1
  253. package/dist/components/structure/SafeAreaView.js +42 -1
  254. package/dist/components/structure/Segment.js +51 -1
  255. package/dist/components/structure/TopBar.js +57 -1
  256. package/dist/components/structure/View.js +44 -1
  257. package/dist/components/structure/index.js +14 -1
  258. package/dist/components/structure/overlay/OverlayHandler.js +83 -1
  259. package/dist/components/structure/overlay/OverlayHandler.native.js +6 -1
  260. package/dist/components/structure/overlay/OverlayWrapper.js +52 -1
  261. package/dist/components/structure/overlay/calculatePosition.js +29 -1
  262. package/dist/components/structure/overlay/smartPlacement.js +32 -1
  263. package/dist/components/structure/popover/Popover.js +135 -1
  264. package/dist/components/structure/popover/Popover.native.js +105 -1
  265. package/dist/components/structure/popover/PopoverContent.js +18 -1
  266. package/dist/components/structure/popover/Popover_BU.js +157 -1
  267. package/dist/components/table/DataTable.js +62 -1
  268. package/dist/components/table/Pagination.js +128 -1
  269. package/dist/components/table/Table.js +66 -1
  270. package/dist/components/table/TableCol.js +67 -1
  271. package/dist/components/table/TableHeader.js +69 -1
  272. package/dist/components/table/TableHeaderRow.js +31 -1
  273. package/dist/components/table/TableRow.js +30 -1
  274. package/dist/components/table/index.js +7 -1
  275. package/dist/components/tabs/ActiveTabContent.js +38 -1
  276. package/dist/components/tabs/TabsHandler.js +16 -1
  277. package/dist/components/tabs/TabsMenu.js +15 -1
  278. package/dist/components/tabs/index.js +3 -1
  279. package/dist/components/text/DateText.js +24 -1
  280. package/dist/components/text/Text.js +32 -1
  281. package/dist/components/text/VerticalText.js +29 -1
  282. package/dist/components/text/index.js +3 -1
  283. package/dist/components/theme/ThemePicker.js +48 -1
  284. package/dist/components/theme/ThemePickerDrawer.js +12 -1
  285. package/dist/components/theme/ThemeStatusBar.js +3 -1
  286. package/dist/components/theme/ThemeStatusBar.native.js +9 -1
  287. package/dist/components/theme/ThemeThumb.js +98 -1
  288. package/dist/components/theme/index.js +3 -1
  289. package/dist/helpers/debounce.js +9 -1
  290. package/dist/helpers/index.js +5 -1
  291. package/dist/helpers/options.js +65 -1
  292. package/dist/helpers/random.js +5 -1
  293. package/dist/helpers/storage.js +76 -1
  294. package/dist/helpers/string.js +74 -1
  295. package/dist/i18n/I18n.js +96 -1
  296. package/dist/i18n/I18nProvider.js +40 -1
  297. package/dist/i18n/index.js +2 -1
  298. package/dist/index.js +8 -1
  299. package/dist/modifiers/_helpers.js +6 -1
  300. package/dist/modifiers/alignConverter.js +11 -1
  301. package/dist/modifiers/animation.js +18 -1
  302. package/dist/modifiers/animations/animatedEffects.js +64 -1
  303. package/dist/modifiers/animations/animatedEffects.native.js +55 -1
  304. package/dist/modifiers/animations/animatedEffects.web.js +55 -1
  305. package/dist/modifiers/animations/fadeEffect.js +46 -1
  306. package/dist/modifiers/animations/fadeEffect.native.js +33 -1
  307. package/dist/modifiers/animations/fadeEffect.web.js +3 -1
  308. package/dist/modifiers/animations/scaleEffect.js +46 -1
  309. package/dist/modifiers/animations/scaleEffect.native.js +33 -1
  310. package/dist/modifiers/animations/scrollEffect.web.js +3 -1
  311. package/dist/modifiers/animations/slideEffect.js +64 -1
  312. package/dist/modifiers/animations/slideEffect.native.js +53 -1
  313. package/dist/modifiers/animations/slideEffect.web.js +3 -1
  314. package/dist/modifiers/applyStyles.js +7 -1
  315. package/dist/modifiers/background.js +34 -1
  316. package/dist/modifiers/border.js +86 -1
  317. package/dist/modifiers/colorConverter.js +13 -1
  318. package/dist/modifiers/cursor.js +21 -1
  319. package/dist/modifiers/default.js +9 -1
  320. package/dist/modifiers/display.js +22 -1
  321. package/dist/modifiers/flex.js +20 -1
  322. package/dist/modifiers/flexWrapper.js +87 -1
  323. package/dist/modifiers/fullColor.js +32 -1
  324. package/dist/modifiers/grid.js +27 -1
  325. package/dist/modifiers/hover.js +28 -1
  326. package/dist/modifiers/logger.js +6 -1
  327. package/dist/modifiers/margin.js +25 -1
  328. package/dist/modifiers/overflow.js +28 -1
  329. package/dist/modifiers/padding.js +25 -1
  330. package/dist/modifiers/position.js +57 -1
  331. package/dist/modifiers/responsiveConverter.js +19 -1
  332. package/dist/modifiers/shadow.js +35 -1
  333. package/dist/modifiers/size.js +59 -1
  334. package/dist/modifiers/sizeConverter.js +12 -1
  335. package/dist/modifiers/state.js +33 -1
  336. package/dist/modifiers/text.js +62 -1
  337. package/dist/modifiers/textConverter.js +12 -1
  338. package/dist/modifiers/themeComponent.js +11 -1
  339. package/dist/responsive/ResponsiveHandler.js +28 -1
  340. package/dist/responsive/index.js +2 -1
  341. package/dist/responsive/responsiveHooks.js +67 -1
  342. package/dist/theme/ThemeHandler.js +81 -1
  343. package/dist/theme/default/base.js +95 -1
  344. package/dist/theme/default/blackTheme.js +47 -1
  345. package/dist/theme/default/cyberpunkTheme.js +36 -1
  346. package/dist/theme/default/darkTheme.js +35 -1
  347. package/dist/theme/default/hackerTheme.js +55 -1
  348. package/dist/theme/default/lightTheme.js +35 -1
  349. package/dist/theme/default/paperTheme.js +36 -1
  350. package/dist/theme/default/themes.js +15 -1
  351. package/dist/theme/format/colorsVariations.js +31 -1
  352. package/dist/theme/format/formatTheme.js +28 -1
  353. package/dist/theme/helpers/colorScale.js +12 -1
  354. package/dist/theme/helpers/contrastColor.js +18 -1
  355. package/dist/theme/helpers/dynamicColor.js +32 -1
  356. package/dist/theme/helpers/mergePreset.js +7 -1
  357. package/dist/theme/helpers/relatedScales.js +34 -1
  358. package/dist/theme/helpers/sizeScale.js +20 -1
  359. package/dist/theme/helpers/textScale.js +15 -1
  360. package/dist/theme/index.js +2 -1
  361. package/package.json +1 -3
  362. package/src/abstractions/Icon.js +1 -1
  363. package/src/abstractions/TextInput.js +10 -1
  364. package/src/components/actions/ActionsDrawer.js +1 -1
  365. package/src/components/actions/Button.js +3 -1
  366. package/src/components/actions/FloatingMenu.js +1 -1
  367. package/src/components/actions/menu/HorizontalMenu.js +2 -1
  368. package/src/components/actions/menu/VerticalMenu.js +2 -1
  369. package/src/components/filter/DateFilter.js +72 -0
  370. package/src/components/filter/FilterGroup.js +17 -0
  371. package/src/components/filter/FilterHandler.js +54 -0
  372. package/src/components/filter/FilterItem.js +30 -0
  373. package/src/components/filter/PopoverFilterItem.js +84 -0
  374. package/src/components/filter/SearchInput.js +49 -0
  375. package/src/components/filter/index.js +6 -0
  376. package/src/components/form/Form.js +9 -3
  377. package/src/components/form/FormItem.js +26 -1
  378. package/src/components/form/FormWrapperComponent.js +12 -3
  379. package/src/components/form/useNewForm.js +55 -4
  380. package/src/components/helpers/Separator.js +15 -11
  381. package/src/components/helpers/index.js +1 -0
  382. package/src/components/index.js +2 -0
  383. package/src/components/inputs/BooleanSelect.js +14 -0
  384. package/src/components/inputs/DateInput.js +3 -1
  385. package/src/components/inputs/DateRangeInput.js +41 -0
  386. package/src/components/inputs/Editable.js +129 -0
  387. package/src/components/inputs/EnabledSelect.js +14 -0
  388. package/src/components/inputs/InputWrapper.js +7 -4
  389. package/src/components/inputs/NumberInput.js +10 -5
  390. package/src/components/inputs/NumberRangeInput.js +41 -0
  391. package/src/components/inputs/PasswordInput.js +24 -0
  392. package/src/components/inputs/Picker.js +2 -2
  393. package/src/components/inputs/Select.js +61 -47
  394. package/src/components/inputs/TextArea.js +5 -0
  395. package/src/components/inputs/TextInput.js +14 -4
  396. package/src/components/inputs/UploadInput.js +140 -0
  397. package/src/components/inputs/index.js +9 -0
  398. package/src/components/inputs/upload/Upload.js +99 -0
  399. package/src/components/inputs/upload/Upload.native.js +154 -0
  400. package/src/components/inputs/upload/useUploadState.js +143 -0
  401. package/src/components/layout/LayoutHeader.js +1 -0
  402. package/src/components/presentation/AvatarLabel.js +1 -1
  403. package/src/components/presentation/AvatarsGroup.js +30 -0
  404. package/src/components/presentation/Badge.js +3 -2
  405. package/src/components/presentation/ContentLabel.js +1 -1
  406. package/src/components/presentation/IconLabel.js +1 -0
  407. package/src/components/presentation/Progress.js +20 -0
  408. package/src/components/presentation/index.js +2 -0
  409. package/src/components/sections/Section.js +1 -1
  410. package/src/components/sections/SectionItemLink.js +4 -2
  411. package/src/components/steps/ActiveStepContent.js +16 -0
  412. package/src/components/steps/StepsHandler.js +53 -0
  413. package/src/components/steps/StepsMenu.js +14 -0
  414. package/src/components/steps/StepsNavigation.js +37 -0
  415. package/src/components/steps/index.js +4 -0
  416. package/src/components/structure/Affix.js +34 -0
  417. package/src/components/structure/Affix.native.js +3 -0
  418. package/src/components/structure/Card.js +1 -0
  419. package/src/components/structure/TopBar.js +13 -1
  420. package/src/components/structure/index.js +1 -0
  421. package/src/components/structure/overlay/OverlayHandler.js +9 -1
  422. package/src/components/structure/popover/Popover.js +22 -5
  423. package/src/components/table/DataTable.js +7 -2
  424. package/src/components/table/Table.js +2 -1
  425. package/src/components/tabs/ActiveTabContent.js +4 -1
  426. package/src/components/text/DateText.js +15 -2
  427. package/src/modifiers/border.js +15 -9
  428. package/src/modifiers/size.js +8 -5
  429. package/src/theme/default/base.js +2 -0
  430. package/src/theme/default/hackerTheme.js +1 -10
  431. package/src/theme/default/paperTheme.js +1 -14
@@ -0,0 +1,154 @@
1
+ import React, { useState, useCallback } from 'react'
2
+
3
+ import { BottomDrawer } from '../../modals/bottomDrawer'
4
+ import { Icon } from '../../presentation/Icon'
5
+ import { Link } from '../../actions/Link'
6
+ import { Text } from '../../text/Text'
7
+ import { View } from '../../structure/View'
8
+ import { useUploadState } from './useUploadState'
9
+
10
+ let ImagePicker
11
+ try {
12
+ ImagePicker = require('expo-image-picker')
13
+ } catch {}
14
+
15
+ let DocumentPicker
16
+ try {
17
+ DocumentPicker = require('expo-document-picker')
18
+ } catch {}
19
+
20
+ function acceptsImages(accept) {
21
+ if (!accept) return true
22
+ return accept.includes('image/') || accept.includes('image/*')
23
+ }
24
+
25
+ function needsFilePicker(accept) {
26
+ if (!accept) return true
27
+ const parts = accept.split(',').map((s) => s.trim())
28
+ return parts.some((p) => !p.startsWith('image/'))
29
+ }
30
+
31
+ function normalizeImageResult(asset) {
32
+ return {
33
+ uri: asset.uri,
34
+ name: asset.fileName || asset.uri.split('/').pop(),
35
+ type: asset.mimeType || asset.type || 'image/jpeg',
36
+ size: asset.fileSize || asset.filesize,
37
+ width: asset.width,
38
+ height: asset.height,
39
+ }
40
+ }
41
+
42
+ function normalizeDocumentResult(doc) {
43
+ return {
44
+ uri: doc.uri,
45
+ name: doc.name,
46
+ type: doc.mimeType || doc.type,
47
+ size: doc.size,
48
+ }
49
+ }
50
+
51
+ function getMediaTypes(accept) {
52
+ if (!accept) return undefined
53
+ if (accept.includes('video/') && !accept.includes('image/')) return ['videos']
54
+ if (accept.includes('image/') && !accept.includes('video/')) return ['images']
55
+ if (accept.includes('video/') && accept.includes('image/')) return ['images', 'videos']
56
+ return undefined
57
+ }
58
+
59
+ export function Upload({ children, onChange, onUpload, value: valueProp, accept, multiple = false, maxCount, disabled = false, ...props }) {
60
+ const { value, addFiles, remove } = useUploadState({ onUpload, onChange, multiple, maxCount, value: valueProp })
61
+ const [open, setOpen] = useState(false)
62
+
63
+ const handlePress = useCallback(() => {
64
+ if (disabled) return
65
+ setOpen(true)
66
+ }, [disabled])
67
+
68
+ const handleCamera = useCallback(async () => {
69
+ setOpen(false)
70
+ if (!ImagePicker) return
71
+ const permission = await ImagePicker.requestCameraPermissionsAsync()
72
+ if (!permission.granted) return
73
+ const result = await ImagePicker.launchCameraAsync({
74
+ allowsMultipleSelection: multiple,
75
+ selectionLimit: maxCount || 0,
76
+ mediaTypes: getMediaTypes(accept),
77
+ })
78
+ if (result.canceled) return
79
+ addFiles(result.assets.map(normalizeImageResult))
80
+ }, [multiple, maxCount, accept, addFiles])
81
+
82
+ const handleLibrary = useCallback(async () => {
83
+ setOpen(false)
84
+ if (!ImagePicker) return
85
+ const permission = await ImagePicker.requestMediaLibraryPermissionsAsync()
86
+ if (!permission.granted) return
87
+ const result = await ImagePicker.launchImageLibraryAsync({
88
+ allowsMultipleSelection: multiple,
89
+ selectionLimit: maxCount || 0,
90
+ mediaTypes: getMediaTypes(accept),
91
+ })
92
+ if (result.canceled) return
93
+ addFiles(result.assets.map(normalizeImageResult))
94
+ }, [multiple, maxCount, accept, addFiles])
95
+
96
+ const handleFiles = useCallback(async () => {
97
+ setOpen(false)
98
+ if (!DocumentPicker) return
99
+ const result = await DocumentPicker.getDocumentAsync({
100
+ multiple,
101
+ type: accept || '*/*',
102
+ })
103
+ if (result.canceled) return
104
+ addFiles(result.assets.map(normalizeDocumentResult))
105
+ }, [multiple, accept, addFiles])
106
+
107
+ const showCamera = acceptsImages(accept)
108
+ const showLibrary = acceptsImages(accept)
109
+ const showFiles = needsFilePicker(accept)
110
+
111
+ const isRenderFn = typeof children === 'function'
112
+
113
+ return (
114
+ <>
115
+ {isRenderFn ? (
116
+ <View {...props}>
117
+ {children({ value, remove, isDragging: false, open: handlePress })}
118
+ </View>
119
+ ) : (
120
+ <Link onPress={handlePress} disabled={disabled} {...props}>
121
+ {children}
122
+ </Link>
123
+ )}
124
+ <BottomDrawer open={open} onClose={() => setOpen(false)} snapPoints={[200]}>
125
+ <View padding="md" gap="xs">
126
+ {showCamera && (
127
+ <Link onPress={handleCamera}>
128
+ <View row gap="md" padding="sm" centerV>
129
+ <Icon name="camera-line" />
130
+ <Text>Camera</Text>
131
+ </View>
132
+ </Link>
133
+ )}
134
+ {showLibrary && (
135
+ <Link onPress={handleLibrary}>
136
+ <View row gap="md" padding="sm" centerV>
137
+ <Icon name="image-line" />
138
+ <Text>Photo Library</Text>
139
+ </View>
140
+ </Link>
141
+ )}
142
+ {showFiles && (
143
+ <Link onPress={handleFiles}>
144
+ <View row gap="md" padding="sm" centerV>
145
+ <Icon name="file-line" />
146
+ <Text>Files</Text>
147
+ </View>
148
+ </Link>
149
+ )}
150
+ </View>
151
+ </BottomDrawer>
152
+ </>
153
+ )
154
+ }
@@ -0,0 +1,143 @@
1
+ import { useState, useRef, useCallback } from 'react'
2
+
3
+ function toArray(val) {
4
+ if (!val) return []
5
+ return Array.isArray(val) ? val : [val]
6
+ }
7
+
8
+ export function useUploadState({ onUpload, onChange, multiple, maxCount, value: valueProp }) {
9
+ const [inFlight, setInFlight] = useState([])
10
+ const [committed, setCommitted] = useState(null)
11
+ const idRef = useRef(0)
12
+ const genRef = useRef(0)
13
+
14
+ const isControlled = valueProp !== undefined
15
+ const externalValue = isControlled ? valueProp : committed
16
+ const externalArray = toArray(externalValue)
17
+
18
+ const externalArrayRef = useRef(externalArray)
19
+ externalArrayRef.current = externalArray
20
+ const onChangeRef = useRef(onChange)
21
+ onChangeRef.current = onChange
22
+ const inFlightRef = useRef(inFlight)
23
+ inFlightRef.current = inFlight
24
+
25
+ const value = multiple
26
+ ? [...externalArray, ...inFlight]
27
+ : (inFlight[0] || externalArray[0] || null)
28
+
29
+ const addFiles = useCallback(
30
+ (normalizedFiles) => {
31
+ if (!normalizedFiles?.length) return
32
+
33
+ if (!onUpload) {
34
+ if (!multiple) {
35
+ const entry = { ...normalizedFiles[0], _id: ++idRef.current }
36
+ if (!isControlled) setCommitted(entry)
37
+ onChangeRef.current?.(entry)
38
+ } else {
39
+ let files = normalizedFiles
40
+ if (maxCount) {
41
+ const available = maxCount - externalArrayRef.current.length
42
+ if (available <= 0) return
43
+ files = files.slice(0, available)
44
+ }
45
+ const entries = files.map((file) => ({ ...file, _id: ++idRef.current }))
46
+ if (!isControlled) {
47
+ setCommitted((prev) => {
48
+ const next = [...toArray(prev), ...entries]
49
+ onChangeRef.current?.(next)
50
+ return next
51
+ })
52
+ } else {
53
+ onChangeRef.current?.([...externalArrayRef.current, ...entries])
54
+ }
55
+ }
56
+ return
57
+ }
58
+
59
+ if (!multiple) {
60
+ const gen = ++genRef.current
61
+ const file = normalizedFiles[0]
62
+ const _id = ++idRef.current
63
+ const entry = { ...file, _id, status: 'uploading' }
64
+
65
+ setInFlight([entry])
66
+
67
+ onUpload(file)
68
+ .then((result) => {
69
+ if (genRef.current !== gen) return
70
+ const done = { ...entry, ...result, status: 'done' }
71
+ setInFlight([])
72
+ if (!isControlled) setCommitted(done)
73
+ onChangeRef.current?.(done)
74
+ })
75
+ .catch((error) => {
76
+ if (genRef.current !== gen) return
77
+ setInFlight((prev) =>
78
+ prev.map((f) => (f._id === _id ? { ...f, status: 'error', error } : f))
79
+ )
80
+ })
81
+ return
82
+ }
83
+
84
+ // Multi mode
85
+ let files = normalizedFiles
86
+ if (maxCount) {
87
+ const available = maxCount - externalArrayRef.current.length - inFlightRef.current.length
88
+ if (available <= 0) return
89
+ files = files.slice(0, available)
90
+ }
91
+
92
+ const entries = files.map((file) => ({
93
+ ...file,
94
+ _id: ++idRef.current,
95
+ status: 'uploading',
96
+ }))
97
+
98
+ setInFlight((prev) => [...prev, ...entries])
99
+
100
+ entries.forEach((entry, i) => {
101
+ onUpload(files[i])
102
+ .then((result) => {
103
+ const done = { ...entry, ...result, status: 'done' }
104
+ setInFlight((prev) => prev.filter((f) => f._id !== entry._id))
105
+ if (!isControlled) {
106
+ setCommitted((prev) => {
107
+ const next = [...toArray(prev), done]
108
+ onChangeRef.current?.(next)
109
+ return next
110
+ })
111
+ } else {
112
+ onChangeRef.current?.([...externalArrayRef.current, done])
113
+ }
114
+ })
115
+ .catch((error) => {
116
+ setInFlight((prev) =>
117
+ prev.map((f) => (f._id === entry._id ? { ...f, status: 'error', error } : f))
118
+ )
119
+ })
120
+ })
121
+ },
122
+ [onUpload, multiple, maxCount, isControlled]
123
+ )
124
+
125
+ const remove = useCallback(
126
+ (file) => {
127
+ if (!file) return
128
+
129
+ setInFlight((prev) => prev.filter((f) => f._id !== file._id))
130
+
131
+ const ext = externalArrayRef.current
132
+ if (ext.some((f) => f._id === file._id)) {
133
+ const next = ext.filter((f) => f._id !== file._id)
134
+ const val = multiple ? next : next[0] || null
135
+ if (!isControlled) setCommitted(val)
136
+ onChangeRef.current?.(val)
137
+ }
138
+ },
139
+ [multiple, isControlled]
140
+ )
141
+
142
+ return { value, addFiles, remove }
143
+ }
@@ -23,6 +23,7 @@ const DEFAULT_PROPS = ([{}, { sticky }]) => ({
23
23
  row: true,
24
24
  centerV: true,
25
25
  padding: 'md',
26
+ borderB: 'overlayDivider',
26
27
  top: 0,
27
28
  left: 0,
28
29
  right: 0,
@@ -44,8 +44,8 @@ export function AvatarLabel(rootProps) {
44
44
  icon={icon}
45
45
  src={src}
46
46
  size={avatarSize || moveScale(sizeCode, moveAvatarSizeScale || -1)}
47
- color={avatarColor || color}
48
47
  dynamicColor={dynamicColor}
48
+ {...(!dynamicColor && { color: avatarColor || color })}
49
49
  square={square}
50
50
  marginH={2}
51
51
  iconSize={iconSize}
@@ -0,0 +1,30 @@
1
+ import React from 'react'
2
+
3
+ import { Avatar } from './Avatar'
4
+ import { View } from '../structure/View'
5
+ import { useGetElementHeight } from '../../theme'
6
+
7
+ export function AvatarsGroup({ maxCount, size = 'md', overlap, children, ...props }) {
8
+ const getSize = useGetElementHeight()
9
+ const sizeValue = getSize(size)
10
+ overlap = overlap || Math.round(sizeValue * 0.6)
11
+
12
+ const items = React.Children.toArray(children).filter(React.isValidElement)
13
+ const visibleItems = maxCount ? items.slice(0, maxCount) : items
14
+ const overflowCount = maxCount ? items.length - maxCount : 0
15
+
16
+ return (
17
+ <View row centerV>
18
+ {visibleItems.map((child, index) => (
19
+ <View key={child.key || index} style={index > 0 ? { marginLeft: -overlap } : undefined}>
20
+ {React.cloneElement(child, { size, border: 1, borderColor: 'overlayBG', ...props })}
21
+ </View>
22
+ ))}
23
+ {overflowCount > 0 && (
24
+ <View style={{ marginLeft: -overlap }}>
25
+ <Avatar name={`+${overflowCount}`} size={size} color="text4" border borderColor="overlayBG" />
26
+ </View>
27
+ )}
28
+ </View>
29
+ )
30
+ }
@@ -77,12 +77,13 @@ function Badge(rootProps) {
77
77
 
78
78
  function BadgeWrapper({ children, dot, ...props }) {
79
79
  if (!children) return <Badge dot={dot} {...props} />
80
- if (!props.value && !props.label && !props.icon) return children
80
+ const hasContent = props.value || props.label || props.icon || (dot && props.value === undefined)
81
+ if (!hasContent) return children
81
82
 
82
83
  return (
83
84
  <View className="neko-badge-wrapper" relative>
84
85
  {children}
85
- <Badge {...props} dot={dot} absolute top={dot ? -2 : -8} right={dot ? -5 : -12} />
86
+ <Badge dot={dot} absolute top={dot ? -2 : -8} right={dot ? -5 : -12} {...props} />
86
87
  </View>
87
88
  )
88
89
  }
@@ -32,7 +32,7 @@ export function ContentLabel(rootProps) {
32
32
  return (
33
33
  <View className="neko-content-label" row gap={gap || AUTO_GAP_SCALE[sizeCode] || 5} centerV {...props}>
34
34
  {!invert && content}
35
- {!!label && (
35
+ {label != null && label != false && label !== '' && (
36
36
  <Text color={color} size={sizeCode} strong={strong} {...textProps}>
37
37
  {label}
38
38
  </Text>
@@ -24,6 +24,7 @@ export function IconLabel(rootProps) {
24
24
  content={
25
25
  !!icon && (
26
26
  <Icon
27
+ center
27
28
  name={icon}
28
29
  size={iconSize || moveScale(sizeCode, moveIconSizeScale || -1)}
29
30
  color={iconColor || color}
@@ -0,0 +1,20 @@
1
+ import { pipe } from 'ramda'
2
+
3
+ import { View } from '../structure/View'
4
+ import { useColorConverter } from '../../modifiers/colorConverter'
5
+ import { useThemeComponentModifier } from '../../modifiers/themeComponent'
6
+
7
+ export function Progress({ value, target = 100, bg = 'divider', height = 8, ...rootProps }) {
8
+ const [{ color }, props] = pipe(
9
+ useColorConverter('primary'),
10
+ useThemeComponentModifier('Progress') //
11
+ )([{}, rootProps])
12
+
13
+ const pct = Math.max(0, Math.min(100, ((value || 0) / target) * 100))
14
+
15
+ return (
16
+ <View className="neko-progress" fullW height={height} bg={bg} br={height} hiddenOverflow relative {...props}>
17
+ <View absolute top={0} bottom={0} left={0} bg={color} width={`${pct}%`} br={height} />
18
+ </View>
19
+ )
20
+ }
@@ -1,12 +1,14 @@
1
1
  export * from './Tag'
2
2
  export * from './Icon'
3
3
  export * from './IconLabel'
4
+ export * from './Progress'
4
5
  export * from './Result'
5
6
  export * from './ResultBar'
6
7
  export * from './Tooltip'
7
8
  export * from './Badge'
8
9
  export * from './Avatar'
9
10
  export * from './AvatarLabel'
11
+ export * from './AvatarsGroup'
10
12
  export * from './Image'
11
13
  export * from './ImageBackground'
12
14
  export * from './LabelValue'
@@ -8,9 +8,9 @@ import { useDefaultModifier } from '../../modifiers/default'
8
8
  import { useThemeComponentModifier } from '../../modifiers/themeComponent'
9
9
 
10
10
  const DEFAULT_PROPS = {
11
- marginH: 'md',
12
11
  bg: 'overlayBG',
13
12
  br: 'md',
13
+ border: 'overlayDivider',
14
14
  titleProps: {
15
15
  strong: true,
16
16
  text4: true,
@@ -14,7 +14,7 @@ const DEFAULT_PROPS = {
14
14
  icon: 'arrow-right-s-line',
15
15
  }
16
16
 
17
- export function SectionItemLink({ children, value, onPress, ...rootProps }) {
17
+ export function SectionItemLink({ children, value, onPress, loading, ...rootProps }) {
18
18
  const [{ color }, formattedProps] = pipe(
19
19
  useColorConverter(),
20
20
  useThemeComponentModifier('SectionItemLink'), //
@@ -26,7 +26,9 @@ export function SectionItemLink({ children, value, onPress, ...rootProps }) {
26
26
  return (
27
27
  <Link className="neko-section-item-link" onPress={onPress}>
28
28
  <SectionItem color={color} {...props}>
29
- {children || <IconLabel gap={2} invert color={color} {...iconLabelProps} label={value} icon={icon} />}
29
+ {children || (
30
+ <IconLabel gap={2} invert color={color} loading={loading} {...iconLabelProps} label={value} icon={icon} />
31
+ )}
30
32
  </SectionItem>
31
33
  </Link>
32
34
  )
@@ -0,0 +1,16 @@
1
+ import React from 'react'
2
+
3
+ import { useSteps } from './StepsHandler'
4
+
5
+ export function ActiveStepContent() {
6
+ const { activeStep } = useSteps()
7
+
8
+ const Content = React.useMemo(
9
+ () => activeStep.render || activeStep.renderContent || activeStep.Content,
10
+ [activeStep.renderContent, activeStep.Content]
11
+ )
12
+
13
+ if (!Content) return false
14
+
15
+ return <Content />
16
+ }
@@ -0,0 +1,53 @@
1
+ import React from 'react'
2
+
3
+ const StepsContext = React.createContext(null)
4
+ export const useSteps = () => React.useContext(StepsContext) || {}
5
+
6
+ export function StepsHandler({ children, items, onSubmit, onValidateStep, onStepChange, resetMaxIndexOnNavigate }) {
7
+ const [activeIndex, setActiveIndex] = React.useState(0)
8
+ const [maxIndexReleased, setMaxIndexReleased] = React.useState(0)
9
+ const [loading, setLoading] = React.useState(false)
10
+ const activeStep = items[activeIndex]
11
+ const isLastStep = activeIndex === items.length - 1
12
+
13
+ const moveToIndex = async (index) => {
14
+ const shouldValidate = index > activeIndex
15
+ if (shouldValidate) {
16
+ setLoading(true)
17
+ try {
18
+ let result = await Promise.resolve(onValidateStep?.())
19
+ if (result === false) return
20
+ result = await Promise.resolve(activeStep?.onValidate?.())
21
+ if (result === false) return
22
+ } catch {
23
+ return
24
+ } finally {
25
+ setLoading(false)
26
+ }
27
+ await Promise.resolve(onStepChange?.())
28
+ }
29
+
30
+ if (index === items.length) onSubmit?.()
31
+ const nextStep = items[index]
32
+ if (!nextStep) return
33
+ setActiveIndex(index)
34
+ if (index > maxIndexReleased || !!resetMaxIndexOnNavigate) setMaxIndexReleased(index)
35
+ }
36
+
37
+ const moveToNextStep = () => moveToIndex(activeIndex + 1)
38
+ const moveToPrevStep = () => moveToIndex(activeIndex - 1)
39
+
40
+ const value = {
41
+ items,
42
+ moveToIndex,
43
+ activeIndex,
44
+ activeStep,
45
+ maxIndexReleased,
46
+ loading,
47
+ isLastStep,
48
+ moveToNextStep,
49
+ moveToPrevStep,
50
+ }
51
+
52
+ return <StepsContext.Provider value={value}>{children}</StepsContext.Provider>
53
+ }
@@ -0,0 +1,14 @@
1
+ import { Menu } from '../actions'
2
+ import { useSteps } from './StepsHandler'
3
+
4
+ export function StepsMenu(props) {
5
+ const { activeIndex, items, moveToIndex, maxIndexReleased } = useSteps()
6
+ const formattedItems = items.map((item, index) => ({
7
+ ...item,
8
+ disabled: maxIndexReleased < index,
9
+ }))
10
+
11
+ return (
12
+ <Menu items={formattedItems} activeIndex={activeIndex} onChangeIndex={(index) => moveToIndex(index)} {...props} />
13
+ )
14
+ }
@@ -0,0 +1,37 @@
1
+ import { Button } from '../actions'
2
+ import { View } from '../structure'
3
+ import { useSteps } from './StepsHandler'
4
+
5
+ export function StepsReturnButton(props) {
6
+ const { activeIndex, moveToPrevStep } = useSteps()
7
+ if (activeIndex === 0) return null
8
+
9
+ return <Button label="Back" outline icon="arrow-left-line" onPress={moveToPrevStep} text4 {...props} />
10
+ }
11
+
12
+ export function StepsSubmitButton({ loading: propLoading, ...props }) {
13
+ const { isLastStep, moveToNextStep, loading } = useSteps()
14
+ const label = isLastStep ? 'Submit' : 'Next'
15
+ const icon = isLastStep ? 'checkbox-circle-line' : 'arrow-right-line'
16
+
17
+ return (
18
+ <Button
19
+ label={label}
20
+ outline={!isLastStep}
21
+ icon={icon}
22
+ onPress={moveToNextStep}
23
+ loading={propLoading || loading}
24
+ invert
25
+ {...props}
26
+ />
27
+ )
28
+ }
29
+
30
+ export function StepsNavigation({ submitProps, returnProps, ...props }) {
31
+ return (
32
+ <View row centerV toRight {...props} gap="sm">
33
+ <StepsReturnButton {...props} {...returnProps} />
34
+ <StepsSubmitButton {...props} {...submitProps} />
35
+ </View>
36
+ )
37
+ }
@@ -0,0 +1,4 @@
1
+ export * from './StepsHandler'
2
+ export * from './StepsMenu'
3
+ export * from './ActiveStepContent'
4
+ export * from './StepsNavigation'
@@ -0,0 +1,34 @@
1
+ import React from 'react'
2
+ import { View } from './View'
3
+
4
+ export function Affix({ children, shadow, offsetTop, offsetBottom, ...props }) {
5
+ const [isFloating, setIsFloating] = React.useState(false)
6
+ const sentinelRef = React.useRef()
7
+
8
+ React.useEffect(() => {
9
+ const sentinel = sentinelRef.current
10
+ if (!sentinel) return
11
+
12
+ const observer = new IntersectionObserver(
13
+ ([entry]) => setIsFloating(!entry.isIntersecting),
14
+ { threshold: [1] }
15
+ )
16
+ observer.observe(sentinel)
17
+ return () => observer.disconnect()
18
+ }, [])
19
+
20
+ return (
21
+ <>
22
+ <div ref={sentinelRef} style={{ height: 0 }} />
23
+ <View
24
+ sticky
25
+ top={offsetBottom === undefined ? (offsetTop || 0) : undefined}
26
+ bottom={offsetBottom}
27
+ shadow={shadow && isFloating}
28
+ {...props}
29
+ >
30
+ {children}
31
+ </View>
32
+ </>
33
+ )
34
+ }
@@ -0,0 +1,3 @@
1
+ export function Affix({ children }) {
2
+ return children
3
+ }
@@ -19,6 +19,7 @@ const DEFAULT_PROPS = {
19
19
  br: 'xl',
20
20
  bg: 'overlayBG',
21
21
  hiddenOverflow: true,
22
+ border: 'overlayDivider',
22
23
  }
23
24
 
24
25
  export function Card({ children, ...rootProps }) {
@@ -1,12 +1,24 @@
1
+ import { pipe } from 'ramda'
2
+
1
3
  import { Text } from '../text'
2
4
  import { View } from './View'
5
+ import { useDefaultModifier } from '../../modifiers/default'
3
6
  import { useResponsiveConverter } from '../../modifiers/responsiveConverter'
7
+ import { useThemeComponentModifier } from '../../modifiers/themeComponent'
4
8
  import { useSafeAreaInsets } from '../../abstractions/helpers/useSafeAreaInsets'
5
9
 
10
+ const DEFAULT_PROPS = {
11
+ borderB: 'overlayDivider',
12
+ }
13
+
6
14
  export function TopBar({ right, left, WrapperView, children, ...rootProps }) {
7
15
  const { top: safeTop } = useSafeAreaInsets()
8
16
 
9
- const [_, props] = useResponsiveConverter([])([{}, rootProps])
17
+ const [_, props] = pipe(
18
+ useThemeComponentModifier('TopBar'),
19
+ useDefaultModifier(DEFAULT_PROPS),
20
+ useResponsiveConverter([])
21
+ )([{}, rootProps])
10
22
  let { useSafeArea = true, title, subtitle } = props
11
23
 
12
24
  const hasContent = !!title || !!subtitle || !!children || !!right || !!left
@@ -1,4 +1,5 @@
1
1
  export * from './Accordion'
2
+ export * from './Affix'
2
3
  export * from './AccordionGroup'
3
4
  export * from './View'
4
5
  export * from './GradientView'