@neko-os/ui 0.0.9 → 0.0.10

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 (139) hide show
  1. package/dist/DynamicStyleTag.js +5 -0
  2. package/dist/DynamicStyleTag.native.js +1 -0
  3. package/dist/NekoUI.js +1 -1
  4. package/dist/abstractions/AnimatedView.web.js +1 -0
  5. package/dist/abstractions/FlatList.js +1 -1
  6. package/dist/abstractions/FlatList.native.js +1 -1
  7. package/dist/abstractions/StaticList.js +1 -0
  8. package/dist/abstractions/helpers/useSafeAreaInsets.js +1 -0
  9. package/dist/abstractions/helpers/useSafeAreaInsets.native.js +1 -0
  10. package/dist/components/actions/Dropdown.js +1 -1
  11. package/dist/components/actions/FloatingButton.js +1 -0
  12. package/dist/components/actions/index.js +1 -1
  13. package/dist/components/actions/menu/VerticalMenu.js +1 -1
  14. package/dist/components/calendar/_helpers/calendarDays.js +1 -1
  15. package/dist/components/feedback/alerter.js +1 -1
  16. package/dist/components/feedback/confirmer.js +1 -1
  17. package/dist/components/helpers/ConditionalLazyRender.js +1 -0
  18. package/dist/components/helpers/LazyAction.js +1 -0
  19. package/dist/components/helpers/LazyRender.js +1 -1
  20. package/dist/components/helpers/LazyRender.native.js +1 -1
  21. package/dist/components/helpers/index.js +1 -1
  22. package/dist/components/index.js +1 -1
  23. package/dist/components/inputs/DateInput.js +1 -1
  24. package/dist/components/inputs/InputWrapper.js +1 -1
  25. package/dist/components/inputs/LinkInput.js +1 -1
  26. package/dist/components/inputs/NumberInput.js +1 -0
  27. package/dist/components/inputs/Picker.js +1 -1
  28. package/dist/components/inputs/Radio.js +1 -1
  29. package/dist/components/inputs/RateInput.js +1 -0
  30. package/dist/components/inputs/SegmentedPicker.js +1 -0
  31. package/dist/components/inputs/Select.js +1 -0
  32. package/dist/components/inputs/datePicker/DayPicker.js +1 -1
  33. package/dist/components/inputs/datePicker/MonthPicker.js +1 -1
  34. package/dist/components/inputs/datePicker/QuarterPicker.js +1 -1
  35. package/dist/components/inputs/datePicker/WeekPicker.js +1 -1
  36. package/dist/components/inputs/datePicker/YearPicker.js +1 -1
  37. package/dist/components/inputs/index.js +1 -1
  38. package/dist/components/list/FlatList.js +1 -1
  39. package/dist/components/presentation/Rate.js +1 -0
  40. package/dist/components/presentation/RateTag.js +1 -0
  41. package/dist/components/presentation/Result.js +1 -1
  42. package/dist/components/presentation/Tooltip.js +1 -1
  43. package/dist/components/presentation/index.js +1 -1
  44. package/dist/components/structure/Accordion.js +1 -1
  45. package/dist/components/structure/Row.js +1 -1
  46. package/dist/components/structure/Segment.js +1 -0
  47. package/dist/components/structure/bottomDrawer/native/BottomDrawer.js +1 -1
  48. package/dist/components/structure/bottomDrawer/native/utils.js +1 -1
  49. package/dist/components/structure/bottomDrawer/web/BottomDrawer.js +1 -1
  50. package/dist/components/structure/index.js +1 -1
  51. package/dist/components/structure/overlay/OverlayHandler.js +1 -1
  52. package/dist/components/structure/popover/Popover.js +1 -1
  53. package/dist/components/structure/popover/Popover_BU.js +1 -0
  54. package/dist/components/tabs/ActiveTabContent.js +1 -0
  55. package/dist/components/tabs/TabsHandler.js +1 -0
  56. package/dist/components/tabs/TabsMenu.js +1 -0
  57. package/dist/components/tabs/index.js +1 -0
  58. package/dist/helpers/string.js +1 -1
  59. package/dist/i18n/I18n.js +1 -0
  60. package/dist/i18n/I18nProvider.js +1 -0
  61. package/dist/i18n/index.js +1 -0
  62. package/dist/index.css +4 -0
  63. package/dist/index.js +1 -1
  64. package/dist/modifiers/animations/fadeEffect.web.js +1 -0
  65. package/dist/modifiers/animations/scrollEffect.web.js +1 -0
  66. package/dist/modifiers/animations/slideEffect.web.js +1 -0
  67. package/dist/modifiers/overflow.js +1 -1
  68. package/dist/modifiers/position.js +1 -1
  69. package/dist/theme/default/base.js +1 -1
  70. package/package.json +1 -1
  71. package/src/DynamicStyleTag.js +21 -0
  72. package/src/DynamicStyleTag.native.js +3 -0
  73. package/src/NekoUI.js +12 -7
  74. package/src/abstractions/AnimatedView.web.js +3 -0
  75. package/src/abstractions/FlatList.js +2 -38
  76. package/src/abstractions/FlatList.native.js +8 -4
  77. package/src/abstractions/StaticList.js +51 -0
  78. package/src/abstractions/helpers/useSafeAreaInsets.js +3 -0
  79. package/src/abstractions/helpers/useSafeAreaInsets.native.js +3 -0
  80. package/src/components/actions/Dropdown.js +13 -9
  81. package/src/components/actions/FloatingButton.js +87 -0
  82. package/src/components/actions/index.js +1 -0
  83. package/src/components/actions/menu/VerticalMenu.js +29 -4
  84. package/src/components/calendar/_helpers/calendarDays.js +2 -0
  85. package/src/components/feedback/alerter.js +1 -1
  86. package/src/components/feedback/confirmer.js +2 -2
  87. package/src/components/helpers/ConditionalLazyRender.js +6 -0
  88. package/src/components/helpers/LazyAction.js +22 -0
  89. package/src/components/helpers/LazyRender.js +2 -2
  90. package/src/components/helpers/LazyRender.native.js +1 -1
  91. package/src/components/helpers/index.js +1 -0
  92. package/src/components/index.js +1 -0
  93. package/src/components/inputs/DateInput.js +11 -1
  94. package/src/components/inputs/InputWrapper.js +0 -1
  95. package/src/components/inputs/LinkInput.js +3 -3
  96. package/src/components/inputs/NumberInput.js +105 -0
  97. package/src/components/inputs/Picker.js +61 -9
  98. package/src/components/inputs/Radio.js +1 -1
  99. package/src/components/inputs/RateInput.js +62 -0
  100. package/src/components/inputs/SegmentedPicker.js +62 -0
  101. package/src/components/inputs/Select.js +189 -0
  102. package/src/components/inputs/datePicker/DayPicker.js +4 -5
  103. package/src/components/inputs/datePicker/MonthPicker.js +2 -2
  104. package/src/components/inputs/datePicker/QuarterPicker.js +2 -2
  105. package/src/components/inputs/datePicker/WeekPicker.js +2 -2
  106. package/src/components/inputs/datePicker/YearPicker.js +9 -6
  107. package/src/components/inputs/index.js +4 -0
  108. package/src/components/list/FlatList.js +41 -4
  109. package/src/components/presentation/Rate.js +58 -0
  110. package/src/components/presentation/RateTag.js +35 -0
  111. package/src/components/presentation/Result.js +2 -2
  112. package/src/components/presentation/Tooltip.js +1 -0
  113. package/src/components/presentation/index.js +2 -0
  114. package/src/components/structure/Accordion.js +1 -1
  115. package/src/components/structure/Row.js +9 -1
  116. package/src/components/structure/Segment.js +51 -0
  117. package/src/components/structure/bottomDrawer/native/BottomDrawer.js +4 -1
  118. package/src/components/structure/bottomDrawer/native/utils.js +29 -22
  119. package/src/components/structure/bottomDrawer/web/BottomDrawer.js +3 -1
  120. package/src/components/structure/index.js +1 -0
  121. package/src/components/structure/overlay/OverlayHandler.js +6 -1
  122. package/src/components/structure/popover/Popover.js +33 -19
  123. package/src/components/structure/popover/Popover_BU.js +157 -0
  124. package/src/components/tabs/ActiveTabContent.js +35 -0
  125. package/src/components/tabs/TabsHandler.js +16 -0
  126. package/src/components/tabs/TabsMenu.js +15 -0
  127. package/src/components/tabs/index.js +3 -0
  128. package/src/helpers/string.js +18 -1
  129. package/src/i18n/I18n.js +97 -0
  130. package/src/i18n/I18nProvider.js +40 -0
  131. package/src/i18n/index.js +2 -0
  132. package/src/index.css +4 -0
  133. package/src/index.js +1 -0
  134. package/src/modifiers/animations/fadeEffect.web.js +3 -0
  135. package/src/modifiers/animations/scrollEffect.web.js +3 -0
  136. package/src/modifiers/animations/slideEffect.web.js +3 -0
  137. package/src/modifiers/overflow.js +6 -1
  138. package/src/modifiers/position.js +7 -0
  139. package/src/theme/default/base.js +6 -2
@@ -0,0 +1 @@
1
+ import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";import _slicedToArray from"@babel/runtime/helpers/slicedToArray";var _jsxFileName="/Users/christianstorch/Apps/nekoapps/libs/neko-ui/src/components/structure/Segment.js";var _excluded=["children"],_excluded2=["br"];import{pipe}from'ramda';import React from'react';import{View}from"./View";import{useDefaultModifier}from"../../modifiers/default";import{useSizeConverter}from"../../modifiers/sizeConverter";import{useThemeComponentModifier}from"../../modifiers/themeComponent";import{jsx as _jsx}from"react/jsx-runtime";var DEFAULT_PROPS=function DEFAULT_PROPS(_ref){var _ref2=_slicedToArray(_ref,1),sizeCode=_ref2[0].sizeCode;return{row:true,justify:'stretch',br:sizeCode};};export function Segment(_ref3){var children=_ref3.children,rootProps=_objectWithoutProperties(_ref3,_excluded);var _pipe=pipe(useSizeConverter('elementHeights','md'),useThemeComponentModifier('Segment'),useDefaultModifier(DEFAULT_PROPS))([{},rootProps]),_pipe2=_slicedToArray(_pipe,2),sizeCode=_pipe2[0].sizeCode,formattedProps=_pipe2[1];var br=formattedProps.br,props=_objectWithoutProperties(formattedProps,_excluded2);var size=children==null?void 0:children.length;return _jsx(View,Object.assign({className:"neko-segment"},props,{children:React.Children.map(children,function(child,index){if(!React.isValidElement(child))return child;var isFirst=index===0;var isLast=size-1===index;var childProps=child.props||{};var newProps={brL:br,brR:br,size:sizeCode};if(!isLast){newProps.brR=0;}if(!isFirst){newProps.brL=0;}return React.cloneElement(child,newProps);})}));}
@@ -1 +1 @@
1
- import _slicedToArray from"@babel/runtime/helpers/slicedToArray";import _toConsumableArray from"@babel/runtime/helpers/toConsumableArray";import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";var _jsxFileName="/Users/christianstorch/Apps/nekoapps/libs/neko-ui/src/components/structure/bottomDrawer/native/BottomDrawer.js";var _excluded=["children","render","setRender","open","onClose","snapPoints","useSafeArea","enableOverScroll","enableHandlePanningGesture","enableContentPanningGesture","animationConfig","hideHandle","contentProps"],_excluded2=["open"];import{GestureDetector,Gesture,GestureHandlerRootView}from'react-native-gesture-handler';import{Modal,Dimensions,StyleSheet,BackHandler,Platform}from"react-native-web";import{useSafeAreaInsets}from'react-native-safe-area-context';import Animated,{useSharedValue,useAnimatedStyle,withSpring,runOnJS,useAnimatedReaction}from'react-native-reanimated';import React from'react';import{DrawerHandle}from"./DrawerHandle";import{DrawerProvider}from"./DrawerContext";import{Pressable}from"../../../actions/Pressable";import{View}from"../../View";import{normalizeSnapPoints,findClosestSnapPoint}from"./utils";import{useColors}from"../../../../theme/ThemeHandler";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";function InnerContent(_ref){var children=_ref.children,render=_ref.render,setRender=_ref.setRender,open=_ref.open,onClose=_ref.onClose,_ref$snapPoints=_ref.snapPoints,snapPoints=_ref$snapPoints===void 0?['50%']:_ref$snapPoints,_ref$useSafeArea=_ref.useSafeArea,useSafeArea=_ref$useSafeArea===void 0?true:_ref$useSafeArea,_ref$enableOverScroll=_ref.enableOverScroll,enableOverScroll=_ref$enableOverScroll===void 0?true:_ref$enableOverScroll,_ref$enableHandlePann=_ref.enableHandlePanningGesture,enableHandlePanningGesture=_ref$enableHandlePann===void 0?true:_ref$enableHandlePann,_ref$enableContentPan=_ref.enableContentPanningGesture,enableContentPanningGesture=_ref$enableContentPan===void 0?true:_ref$enableContentPan,_ref$animationConfig=_ref.animationConfig,animationConfig=_ref$animationConfig===void 0?{damping:50,stiffness:500,mass:0.3,overshootClamping:true,restDisplacementThreshold:10,restSpeedThreshold:10}:_ref$animationConfig,hideHandle=_ref.hideHandle,contentProps=_ref.contentProps,props=_objectWithoutProperties(_ref,_excluded);var _Dimensions$get=Dimensions.get('window'),SCREEN_HEIGHT=_Dimensions$get.height;var insets=useSafeAreaInsets();var bottomInset=useSafeArea?insets.bottom:0;var colors=useColors();var translateY=useSharedValue(SCREEN_HEIGHT);var scrollOffset=useSharedValue(0);var scrollEnabled=useSharedValue(false);var isScrolling=useSharedValue(false);var snapIndex=useSharedValue(0);var velocityY=useSharedValue(0);var normalizedSnapPoints=React.useMemo(function(){return normalizeSnapPoints(snapPoints,SCREEN_HEIGHT);},[snapPoints]);var maxSnapPoint=React.useMemo(function(){return Math.max.apply(Math,_toConsumableArray(normalizedSnapPoints));},[normalizedSnapPoints]);var minSnapPoint=React.useMemo(function(){return Math.min.apply(Math,_toConsumableArray(normalizedSnapPoints));},[normalizedSnapPoints]);React.useEffect(function(){if(open){var targetY=SCREEN_HEIGHT-normalizedSnapPoints[0];translateY.value=withSpring(targetY,animationConfig);snapIndex.value=0;}else{translateY.value=withSpring(SCREEN_HEIGHT,animationConfig,function(){scrollOffset.value=0;scrollEnabled.value=false;runOnJS(setRender)(false);});snapIndex.value=-1;}},[open]);React.useEffect(function(){if(!onClose||!open||Platform.OS!=='android')return;var backHandler=BackHandler.addEventListener('hardwareBackPress',function(){onClose();return true;});return function(){return backHandler.remove();};},[open,onClose]);useAnimatedReaction(function(){return translateY.value;},function(currentY){var atMaxSnapPoint=currentY<=SCREEN_HEIGHT-maxSnapPoint;scrollEnabled.value=atMaxSnapPoint;},[]);var handleClose=React.useCallback(function(){onClose==null?void 0:onClose();},[onClose]);if(!onClose)handleClose=false;var snapTo=React.useCallback(function(index){'worklet';var snapPoint=normalizedSnapPoints[index];if(snapPoint!==undefined){translateY.value=withSpring(SCREEN_HEIGHT-snapPoint,animationConfig);snapIndex.value=index;}},[normalizedSnapPoints]);var gestureStartTranslateY=useSharedValue(0);var panGesture=React.useMemo(function(){return Gesture.Pan().enabled(enableHandlePanningGesture||enableContentPanningGesture).onStart(function(){gestureStartTranslateY.value=translateY.value;}).onUpdate(function(event){var newTranslateY=gestureStartTranslateY.value+event.translationY;var maxPosition=SCREEN_HEIGHT-maxSnapPoint;if(enableOverScroll&&newTranslateY>=maxPosition){translateY.value=newTranslateY;}else{translateY.value=Math.max(maxPosition,Math.min(SCREEN_HEIGHT,newTranslateY));}velocityY.value=event.velocityY;}).onEnd(function(){var currentPosition=SCREEN_HEIGHT-translateY.value;var shouldClose=!!handleClose&&(velocityY.value>2000&&currentPosition<minSnapPoint*0.75||currentPosition<minSnapPoint*0.25);if(shouldClose){runOnJS(handleClose)();}else{var closestSnapIndex=findClosestSnapPoint(currentPosition,normalizedSnapPoints,velocityY.value);var targetSnapPoint=normalizedSnapPoints[closestSnapIndex];translateY.value=withSpring(SCREEN_HEIGHT-targetSnapPoint,animationConfig);snapIndex.value=closestSnapIndex;}});},[enableHandlePanningGesture,enableContentPanningGesture,enableOverScroll,maxSnapPoint,minSnapPoint,normalizedSnapPoints,animationConfig,handleClose]);var animatedSheetStyle=useAnimatedStyle(function(){var currentHeight=SCREEN_HEIGHT-translateY.value;return{transform:[{translateY:translateY.value}],maxHeight:currentHeight};});var contextValue=React.useMemo(function(){return{translateY:translateY,scrollOffset:scrollOffset,scrollEnabled:scrollEnabled,isScrolling:isScrolling,snapIndex:snapIndex,maxSnapPoint:maxSnapPoint,snapTo:snapTo,animationConfig:animationConfig};},[maxSnapPoint]);return _jsxs(GestureHandlerRootView,{style:{flex:1},children:[_jsx(Pressable,{absoluteFill:true,bg:"backdrop_op70",onPress:function onPress(){if(!handleClose)return;runOnJS(handleClose)();}}),_jsx(DrawerProvider,{value:contextValue,children:_jsx(GestureDetector,{gesture:panGesture,children:_jsx(Animated.View,{style:[styles.container,{height:SCREEN_HEIGHT},animatedSheetStyle],pointerEvents:"box-none",children:_jsxs(View,Object.assign({flex:true,bg:"overlayBG",shadow:true,paddingB:useSafeArea&&bottomInset,borderRadiusT:"xxxl",marginL:"auto",marginR:"auto",fullW:true},props,{children:[_jsx(DrawerHandle,{hide:hideHandle}),_jsx(View,Object.assign({flex:true},contentProps,{children:children}))]}))})})})]});}var styles=StyleSheet.create({container:{position:'absolute',left:0,right:0,top:0}});export function BottomDrawer(_ref2){var open=_ref2.open,props=_objectWithoutProperties(_ref2,_excluded2);var _React$useState=React.useState(open),_React$useState2=_slicedToArray(_React$useState,2),render=_React$useState2[0],setRender=_React$useState2[1];React.useEffect(function(){if(open){setRender(true);}},[open]);return _jsx(Modal,{visible:render,transparent:true,statusBarTranslucent:true,navigationBarTranslucent:true,animationType:"none",children:_jsx(InnerContent,Object.assign({},props,{open:open,render:render,setRender:setRender}))});}
1
+ import _slicedToArray from"@babel/runtime/helpers/slicedToArray";import _toConsumableArray from"@babel/runtime/helpers/toConsumableArray";import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";var _jsxFileName="/Users/christianstorch/Apps/nekoapps/libs/neko-ui/src/components/structure/bottomDrawer/native/BottomDrawer.js";var _excluded=["children","render","setRender","open","onClose","snapPoints","useSafeArea","enableOverScroll","enableHandlePanningGesture","enableContentPanningGesture","animationConfig","hideHandle","contentProps"],_excluded2=["open"];import{GestureDetector,Gesture,GestureHandlerRootView}from'react-native-gesture-handler';import{Modal,Dimensions,StyleSheet,BackHandler,Platform}from"react-native-web";import{useSafeAreaInsets}from'react-native-safe-area-context';import Animated,{useSharedValue,useAnimatedStyle,withSpring,runOnJS,useAnimatedReaction}from'react-native-reanimated';import React from'react';import{DrawerHandle}from"./DrawerHandle";import{DrawerProvider}from"./DrawerContext";import{Pressable}from"../../../actions/Pressable";import{View}from"../../View";import{normalizeSnapPoints,findClosestSnapPoint}from"./utils";import{useColors}from"../../../../theme/ThemeHandler";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";function InnerContent(_ref){var children=_ref.children,render=_ref.render,setRender=_ref.setRender,open=_ref.open,onClose=_ref.onClose,_ref$snapPoints=_ref.snapPoints,snapPoints=_ref$snapPoints===void 0?['50%']:_ref$snapPoints,_ref$useSafeArea=_ref.useSafeArea,useSafeArea=_ref$useSafeArea===void 0?true:_ref$useSafeArea,_ref$enableOverScroll=_ref.enableOverScroll,enableOverScroll=_ref$enableOverScroll===void 0?true:_ref$enableOverScroll,_ref$enableHandlePann=_ref.enableHandlePanningGesture,enableHandlePanningGesture=_ref$enableHandlePann===void 0?true:_ref$enableHandlePann,_ref$enableContentPan=_ref.enableContentPanningGesture,enableContentPanningGesture=_ref$enableContentPan===void 0?true:_ref$enableContentPan,_ref$animationConfig=_ref.animationConfig,animationConfig=_ref$animationConfig===void 0?{damping:50,stiffness:500,mass:0.3,overshootClamping:true,restDisplacementThreshold:10,restSpeedThreshold:10}:_ref$animationConfig,hideHandle=_ref.hideHandle,contentProps=_ref.contentProps,props=_objectWithoutProperties(_ref,_excluded);var _Dimensions$get=Dimensions.get('window'),SCREEN_HEIGHT=_Dimensions$get.height;var insets=useSafeAreaInsets();var bottomInset=useSafeArea?insets.bottom:0;var colors=useColors();var translateY=useSharedValue(SCREEN_HEIGHT);var scrollOffset=useSharedValue(0);var scrollEnabled=useSharedValue(false);var isScrolling=useSharedValue(false);var snapIndex=useSharedValue(0);var velocityY=useSharedValue(0);var normalizedSnapPoints=React.useMemo(function(){return normalizeSnapPoints(snapPoints,SCREEN_HEIGHT,bottomInset);},[snapPoints,useSafeArea]);var maxSnapPoint=React.useMemo(function(){return Math.max.apply(Math,_toConsumableArray(normalizedSnapPoints));},[normalizedSnapPoints]);var minSnapPoint=React.useMemo(function(){return Math.min.apply(Math,_toConsumableArray(normalizedSnapPoints));},[normalizedSnapPoints]);React.useEffect(function(){if(open){var targetY=SCREEN_HEIGHT-normalizedSnapPoints[0];translateY.value=withSpring(targetY,animationConfig);snapIndex.value=0;}else{translateY.value=withSpring(SCREEN_HEIGHT,animationConfig,function(){scrollOffset.value=0;scrollEnabled.value=false;runOnJS(setRender)(false);});snapIndex.value=-1;}},[open]);React.useEffect(function(){if(!onClose||!open||Platform.OS!=='android')return;var backHandler=BackHandler.addEventListener('hardwareBackPress',function(){onClose();return true;});return function(){return backHandler.remove();};},[open,onClose]);useAnimatedReaction(function(){return translateY.value;},function(currentY){var atMaxSnapPoint=currentY<=SCREEN_HEIGHT-maxSnapPoint;scrollEnabled.value=atMaxSnapPoint;},[]);var handleClose=React.useCallback(function(){onClose==null?void 0:onClose();},[onClose]);if(!onClose)handleClose=false;var snapTo=React.useCallback(function(index){'worklet';var snapPoint=normalizedSnapPoints[index];if(snapPoint!==undefined){translateY.value=withSpring(SCREEN_HEIGHT-snapPoint,animationConfig);snapIndex.value=index;}},[normalizedSnapPoints]);var gestureStartTranslateY=useSharedValue(0);var panGesture=React.useMemo(function(){return Gesture.Pan().enabled(enableHandlePanningGesture||enableContentPanningGesture).onStart(function(){gestureStartTranslateY.value=translateY.value;}).onUpdate(function(event){var newTranslateY=gestureStartTranslateY.value+event.translationY;var maxPosition=SCREEN_HEIGHT-maxSnapPoint;if(enableOverScroll&&newTranslateY>=maxPosition){translateY.value=newTranslateY;}else{translateY.value=Math.max(maxPosition,Math.min(SCREEN_HEIGHT,newTranslateY));}velocityY.value=event.velocityY;}).onEnd(function(){var currentPosition=SCREEN_HEIGHT-translateY.value;var shouldClose=!!handleClose&&(velocityY.value>2000&&currentPosition<minSnapPoint*0.75||currentPosition<minSnapPoint*0.25);if(shouldClose){runOnJS(handleClose)();}else{var closestSnapIndex=findClosestSnapPoint(currentPosition,normalizedSnapPoints,velocityY.value);var targetSnapPoint=normalizedSnapPoints[closestSnapIndex];translateY.value=withSpring(SCREEN_HEIGHT-targetSnapPoint,animationConfig);snapIndex.value=closestSnapIndex;}});},[enableHandlePanningGesture,enableContentPanningGesture,enableOverScroll,maxSnapPoint,minSnapPoint,normalizedSnapPoints,animationConfig,handleClose]);var animatedSheetStyle=useAnimatedStyle(function(){var currentHeight=SCREEN_HEIGHT-translateY.value;return{transform:[{translateY:translateY.value}],maxHeight:currentHeight};});var contextValue=React.useMemo(function(){return{translateY:translateY,scrollOffset:scrollOffset,scrollEnabled:scrollEnabled,isScrolling:isScrolling,snapIndex:snapIndex,maxSnapPoint:maxSnapPoint,snapTo:snapTo,animationConfig:animationConfig};},[maxSnapPoint]);return _jsxs(GestureHandlerRootView,{style:{flex:1},children:[_jsx(Pressable,{absoluteFill:true,bg:"backdrop_op70",onPress:function onPress(){if(!handleClose)return;runOnJS(handleClose)();}}),_jsx(DrawerProvider,{value:contextValue,children:_jsx(GestureDetector,{gesture:panGesture,children:_jsx(Animated.View,{style:[styles.container,{height:SCREEN_HEIGHT},animatedSheetStyle],pointerEvents:"box-none",children:_jsxs(View,Object.assign({flex:true,bg:"overlayBG",shadow:true,paddingB:useSafeArea&&bottomInset,borderRadiusT:"xxxl",marginL:"auto",marginR:"auto",fullW:true},props,{children:[_jsx(DrawerHandle,{hide:hideHandle}),_jsx(View,Object.assign({flex:true},contentProps,{children:children}))]}))})})})]});}var styles=StyleSheet.create({container:{position:'absolute',left:0,right:0,top:0}});export function BottomDrawer(_ref2){var open=_ref2.open,props=_objectWithoutProperties(_ref2,_excluded2);var _React$useState=React.useState(open),_React$useState2=_slicedToArray(_React$useState,2),render=_React$useState2[0],setRender=_React$useState2[1];React.useEffect(function(){if(open){setRender(true);}},[open]);return _jsx(Modal,{visible:render,transparent:true,statusBarTranslucent:true,navigationBarTranslucent:true,animationType:"none",children:_jsx(InnerContent,Object.assign({},props,{open:open,render:render,setRender:setRender}))});}
@@ -1 +1 @@
1
- export function normalizeSnapPoints(snapPoints,screenHeight){return snapPoints.map(function(point){if(typeof point==='string'&&point.endsWith('%')){var percentage=parseFloat(point)/100;return screenHeight*percentage;}return point;});}export function findClosestSnapPoint(currentPosition,snapPoints){'worklet';var velocity=arguments.length>2&&arguments[2]!==undefined?arguments[2]:0;var velocityImpact=velocity*0.03;var adjustedPosition=currentPosition+velocityImpact;var closestIndex=0;var minDistance=Math.abs(snapPoints[0]-adjustedPosition);for(var i=1;i<snapPoints.length;i++){var distance=Math.abs(snapPoints[i]-adjustedPosition);if(distance<minDistance){minDistance=distance;closestIndex=i;}}if(velocity<-1500&&closestIndex<snapPoints.length-1){closestIndex++;}else if(velocity>1500&&closestIndex>0){closestIndex--;}if(snapPoints.length>1){var currentSnapDistance=minDistance;var snapPointSpacing=Math.abs(snapPoints[Math.min(closestIndex+1,snapPoints.length-1)]-snapPoints[closestIndex]);if(currentSnapDistance<snapPointSpacing*0.2){return closestIndex;}}return closestIndex;}export function clamp(value,min,max){'worklet';return Math.min(Math.max(value,min),max);}
1
+ import{is}from'ramda';export function normalizeSnapPoints(snapPoints,screenHeight,bottomInset){return snapPoints.map(function(point){if(typeof point==='string'&&point.endsWith('%')){var percentage=parseFloat(point)/100;return screenHeight*percentage;}if(is(Number,point)){point=point+bottomInset;}return point;});}export function findClosestSnapPoint(currentPosition,snapPoints){'worklet';var velocity=arguments.length>2&&arguments[2]!==undefined?arguments[2]:0;var velocityImpact=velocity*0.03;var adjustedPosition=currentPosition+velocityImpact;var closestIndex=0;var minDistance=Math.abs(snapPoints[0]-adjustedPosition);for(var i=1;i<snapPoints.length;i++){var distance=Math.abs(snapPoints[i]-adjustedPosition);if(distance<minDistance){minDistance=distance;closestIndex=i;}}if(velocity<-1500&&closestIndex<snapPoints.length-1){closestIndex++;}else if(velocity>1500&&closestIndex>0){closestIndex--;}if(snapPoints.length>1){var currentSnapDistance=minDistance;var snapPointSpacing=Math.abs(snapPoints[Math.min(closestIndex+1,snapPoints.length-1)]-snapPoints[closestIndex]);if(currentSnapDistance<snapPointSpacing*0.2){return closestIndex;}}return closestIndex;}export function clamp(value,min,max){'worklet';return Math.min(Math.max(value,min),max);}
@@ -1 +1 @@
1
- var _this=this,_jsxFileName="/Users/christianstorch/Apps/nekoapps/libs/neko-ui/src/components/structure/bottomDrawer/web/BottomDrawer.js";import{Drawer}from"../../drawer";import{jsx as _jsx}from"react/jsx-runtime";export var BottomDrawer=function BottomDrawer(props){return _jsx(Drawer,Object.assign({height:400},props));};
1
+ import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";var _excluded=["snapPoints","contentProps"];var _this=this,_jsxFileName="/Users/christianstorch/Apps/nekoapps/libs/neko-ui/src/components/structure/bottomDrawer/web/BottomDrawer.js";import{Drawer}from"../../drawer";import{jsx as _jsx}from"react/jsx-runtime";export var BottomDrawer=function BottomDrawer(_ref){var snapPoints=_ref.snapPoints,contentProps=_ref.contentProps,props=_objectWithoutProperties(_ref,_excluded);return _jsx(Drawer,Object.assign({height:(snapPoints==null?void 0:snapPoints[0])||400,contentProps:Object.assign({padding:0},contentProps)},props));};
@@ -1 +1 @@
1
- export*from"./Accordion";export*from"./AccordionGroup";export*from"./View";export*from"./GradientView";export*from"./BlurView";export*from"./SafeAreaView";export*from"./Card";export*from"./Row";export*from"./Col";export*from"./modal";export*from"./drawer";export*from"./bottomDrawer";export*from"./popover/Popover";
1
+ export*from"./Accordion";export*from"./AccordionGroup";export*from"./View";export*from"./GradientView";export*from"./BlurView";export*from"./SafeAreaView";export*from"./Card";export*from"./Row";export*from"./Col";export*from"./modal";export*from"./drawer";export*from"./bottomDrawer";export*from"./popover/Popover";export*from"./Segment";
@@ -1 +1 @@
1
- import _slicedToArray from"@babel/runtime/helpers/slicedToArray";import _defineProperty from"@babel/runtime/helpers/defineProperty";var _jsxFileName="/Users/christianstorch/Apps/nekoapps/libs/neko-ui/src/components/structure/overlay/OverlayHandler.js";import{toPairs,dissoc}from'ramda';import React from'react';import{OverlayWrapper}from"./OverlayWrapper";import{Text}from"../../text/Text";import{genRandonId}from"../../../helpers/random";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";var OverlayContext=React.createContext(null);export var useOverlay=function useOverlay(){return React.useContext(OverlayContext);};export var useRegisterOverlay=function useRegisterOverlay(){var opts=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var unmountOnClose=opts.unmountOnClose;var timeout=React.useRef(null);var _useOverlay=useOverlay(),overlays=_useOverlay.overlays,setOverlays=_useOverlay.setOverlays;var randomId=React.useMemo(function(){return genRandonId();},[]);var overlay=overlays[randomId]||{};var mergeOverlay=function mergeOverlay(value){return setOverlays(function(data){return Object.assign({},data,_defineProperty({},randomId,Object.assign({},overlay,value)));});};var closeOverlay=function closeOverlay(){return mergeOverlay({open:false});};var removeOverlay=function removeOverlay(){return setOverlays(function(data){return dissoc(randomId,data);});};var stopDelayedClosing=function stopDelayedClosing(){return!!(timeout!=null&&timeout.current)&&clearTimeout(timeout.current);};React.useEffect(function(){return function(){return removeOverlay();};},[]);var onOpen=function onOpen(_ref){var content=_ref.content,triggerRect=_ref.triggerRect,placement=_ref.placement,_ref$options=_ref.options,options=_ref$options===void 0?{}:_ref$options;stopDelayedClosing();mergeOverlay(Object.assign({open:true,content:content,triggerRect:triggerRect,placement:placement},options));};var onClose=function onClose(){stopDelayedClosing();timeout.current=setTimeout(function(){!!unmountOnClose?removeOverlay():closeOverlay();},250);};var onFastClose=function onFastClose(){stopDelayedClosing();!!unmountOnClose?removeOverlay():closeOverlay();};return{onOpen:onOpen,onClose:onClose,onFastClose:onFastClose,stopDelayedClosing:stopDelayedClosing};};export function OverlayHandler(_ref2){var _this=this;var children=_ref2.children;var _React$useState=React.useState({}),_React$useState2=_slicedToArray(_React$useState,2),overlays=_React$useState2[0],setOverlays=_React$useState2[1];return _jsxs(OverlayContext.Provider,{value:{overlays:overlays,setOverlays:setOverlays},children:[children,toPairs(overlays).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],overlay=_ref4[1];var handleClickOutside=function handleClickOutside(){return setTimeout(function(){return setOverlays(function(data){return dissoc(key,data);});},100);};return _jsx(OverlayWrapper,{triggerRect:overlay.triggerRect,placement:overlay.placement,onClickOutside:overlay.dismissOnClickOutside?handleClickOutside:null,display:!overlay.open&&'none',children:overlay.content},key);})]});}
1
+ import _slicedToArray from"@babel/runtime/helpers/slicedToArray";import _defineProperty from"@babel/runtime/helpers/defineProperty";var _jsxFileName="/Users/christianstorch/Apps/nekoapps/libs/neko-ui/src/components/structure/overlay/OverlayHandler.js";import{toPairs,dissoc}from'ramda';import React from'react';import{OverlayWrapper}from"./OverlayWrapper";import{Text}from"../../text/Text";import{genRandonId}from"../../../helpers/random";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";var OverlayContext=React.createContext(null);export var useOverlay=function useOverlay(){return React.useContext(OverlayContext);};export var useRegisterOverlay=function useRegisterOverlay(){var opts=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var unmountOnClose=opts.unmountOnClose;var timeout=React.useRef(null);var _useOverlay=useOverlay(),overlays=_useOverlay.overlays,setOverlays=_useOverlay.setOverlays;var randomId=React.useMemo(function(){return genRandonId();},[]);var overlay=overlays[randomId]||{};var mergeOverlay=function mergeOverlay(value){return setOverlays(function(data){return Object.assign({},data,_defineProperty({},randomId,Object.assign({},overlay,value)));});};var closeOverlay=function closeOverlay(){return mergeOverlay({open:false});};var removeOverlay=function removeOverlay(){return setOverlays(function(data){return dissoc(randomId,data);});};var stopDelayedClosing=function stopDelayedClosing(){return!!(timeout!=null&&timeout.current)&&clearTimeout(timeout.current);};React.useEffect(function(){return function(){return removeOverlay();};},[]);var onOpen=function onOpen(_ref){var content=_ref.content,triggerRect=_ref.triggerRect,placement=_ref.placement,_ref$options=_ref.options,options=_ref$options===void 0?{}:_ref$options;stopDelayedClosing();mergeOverlay(Object.assign({open:true,content:content,triggerRect:triggerRect,placement:placement},options));};var onUpdate=function onUpdate(_ref2){var content=_ref2.content,_ref2$options=_ref2.options,options=_ref2$options===void 0?{}:_ref2$options;if(!overlay.open)return;mergeOverlay(Object.assign({content:content},options));};var onClose=function onClose(){stopDelayedClosing();timeout.current=setTimeout(function(){!!unmountOnClose?removeOverlay():closeOverlay();},250);};var onFastClose=function onFastClose(){stopDelayedClosing();!!unmountOnClose?removeOverlay():closeOverlay();};return{onOpen:onOpen,onClose:onClose,onUpdate:onUpdate,onFastClose:onFastClose,stopDelayedClosing:stopDelayedClosing};};export function OverlayHandler(_ref3){var _this=this;var children=_ref3.children;var _React$useState=React.useState({}),_React$useState2=_slicedToArray(_React$useState,2),overlays=_React$useState2[0],setOverlays=_React$useState2[1];return _jsxs(OverlayContext.Provider,{value:{overlays:overlays,setOverlays:setOverlays},children:[children,toPairs(overlays).map(function(_ref4){var _ref5=_slicedToArray(_ref4,2),key=_ref5[0],overlay=_ref5[1];var handleClickOutside=function handleClickOutside(){return setTimeout(function(){return setOverlays(function(data){return dissoc(key,data);});},100);};return _jsx(OverlayWrapper,{triggerRect:overlay.triggerRect,placement:overlay.placement,onClickOutside:overlay.dismissOnClickOutside?handleClickOutside:null,display:!overlay.open&&'none',children:overlay.content},key);})]});}
@@ -1 +1 @@
1
- import _slicedToArray from"@babel/runtime/helpers/slicedToArray";import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";var _jsxFileName="/Users/christianstorch/Apps/nekoapps/libs/neko-ui/src/components/structure/popover/Popover.js";var _excluded=["renderContent","content","trigger","placement","unmountOnClose","children","parentWidth","parentMinWidth","useBottomDrawer","bottomDrawerProps"],_excluded2=["children","content","renderContent","snapPoints"];import React from'react';import{BottomDrawer}from"../bottomDrawer";import{PopoverContent}from"./PopoverContent";import{useRegisterOverlay}from"../overlay/OverlayHandler";import{useResponsiveValue}from"../../../responsive";import{jsx as _jsx,Fragment as _Fragment,jsxs as _jsxs}from"react/jsx-runtime";export function Popover(_ref){var _this=this;var renderContent=_ref.renderContent,content=_ref.content,_ref$trigger=_ref.trigger,trigger=_ref$trigger===void 0?'hover':_ref$trigger,_ref$placement=_ref.placement,placement=_ref$placement===void 0?'bottom':_ref$placement,unmountOnClose=_ref.unmountOnClose,children=_ref.children,parentWidth=_ref.parentWidth,parentMinWidth=_ref.parentMinWidth,_ref$useBottomDrawer=_ref.useBottomDrawer,useBottomDrawer=_ref$useBottomDrawer===void 0?{}:_ref$useBottomDrawer,_ref$bottomDrawerProp=_ref.bottomDrawerProps,bottomDrawerProps=_ref$bottomDrawerProp===void 0?{}:_ref$bottomDrawerProp,props=_objectWithoutProperties(_ref,_excluded);var shouldUseDrawer=useResponsiveValue(useBottomDrawer);var ref=React.useRef(null);var _useRegisterOverlay=useRegisterOverlay({unmountOnClose:unmountOnClose}),onOpen=_useRegisterOverlay.onOpen,onClose=_useRegisterOverlay.onClose,onFastClose=_useRegisterOverlay.onFastClose,stopDelayedClosing=_useRegisterOverlay.stopDelayedClosing;var click=trigger==='click';var hover=trigger==='hover';var focus=trigger==='focus';renderContent=renderContent||function(){return content;};var show=function show(e){if(e&&e.stopPropagation)e.stopPropagation();var rect=ref.current.getBoundingClientRect();var scrollX=window.scrollX||window.pageXOffset;var scrollY=window.scrollY||window.pageYOffset;var triggerRect={left:rect.left+scrollX,right:rect.right+scrollX,top:rect.top+scrollY,bottom:rect.bottom+scrollY,width:rect.width,height:rect.height};onOpen({content:_jsx(PopoverContent,Object.assign({placement:placement,width:parentWidth?rect.width:undefined,minWidth:parentMinWidth?rect.width:undefined},props,{onMouseEnter:hover?stopDelayedClosing:undefined,onMouseLeave:hover?onClose:undefined,children:renderContent({onClose:onFastClose})})),triggerRect:triggerRect,placement:placement,options:{dismissOnClickOutside:click||focus}});};React.useEffect(function(){return function(){return onClose();};},[]);if(shouldUseDrawer){return _jsx(DrawerPopover,Object.assign({content:content,renderContent:renderContent,children:children},props,bottomDrawerProps));}var child=React.Children.only(children);var childProps={ref:ref,onClick:show};if(hover)childProps={ref:ref,onMouseEnter:show,onMouseLeave:onClose};if(focus)childProps={ref:ref,onFocus:show};return React.cloneElement(child,childProps);}function DrawerPopover(_ref2){var children=_ref2.children,content=_ref2.content,renderContent=_ref2.renderContent,snapPoints=_ref2.snapPoints,props=_objectWithoutProperties(_ref2,_excluded2);var _React$useState=React.useState(false),_React$useState2=_slicedToArray(_React$useState,2),open=_React$useState2[0],setOpen=_React$useState2[1];var onClose=function onClose(){return setOpen(false);};var child=React.Children.only(children);var childProps={onClick:function onClick(){return setOpen(true);}};return _jsxs(_Fragment,{children:[React.cloneElement(child,childProps),_jsx(BottomDrawer,Object.assign({open:open,onClose:onClose,snapPoints:snapPoints},props,{children:renderContent({onClose:onClose})}))]});}
1
+ import _slicedToArray from"@babel/runtime/helpers/slicedToArray";import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";var _jsxFileName="/Users/christianstorch/Apps/nekoapps/libs/neko-ui/src/components/structure/popover/Popover.js";var _excluded=["renderContent","content","trigger","placement","unmountOnClose","children","parentWidth","parentMinWidth","useBottomDrawer","bottomDrawerProps","watch","disabled"],_excluded2=["children","content","renderContent","snapPoints"];import React from'react';import{BottomDrawer}from"../bottomDrawer";import{PopoverContent}from"./PopoverContent";import{useRegisterOverlay}from"../overlay/OverlayHandler";import{useResponsiveValue}from"../../../responsive";import{jsx as _jsx,Fragment as _Fragment,jsxs as _jsxs}from"react/jsx-runtime";export function Popover(_ref){var _this=this;var renderContent=_ref.renderContent,content=_ref.content,_ref$trigger=_ref.trigger,trigger=_ref$trigger===void 0?'hover':_ref$trigger,_ref$placement=_ref.placement,placement=_ref$placement===void 0?'bottom':_ref$placement,unmountOnClose=_ref.unmountOnClose,children=_ref.children,parentWidth=_ref.parentWidth,parentMinWidth=_ref.parentMinWidth,_ref$useBottomDrawer=_ref.useBottomDrawer,useBottomDrawer=_ref$useBottomDrawer===void 0?{}:_ref$useBottomDrawer,_ref$bottomDrawerProp=_ref.bottomDrawerProps,bottomDrawerProps=_ref$bottomDrawerProp===void 0?{}:_ref$bottomDrawerProp,watch=_ref.watch,disabled=_ref.disabled,props=_objectWithoutProperties(_ref,_excluded);var shouldUseDrawer=useResponsiveValue(useBottomDrawer);var ref=React.useRef(null);var _useRegisterOverlay=useRegisterOverlay({unmountOnClose:unmountOnClose}),onOpen=_useRegisterOverlay.onOpen,onUpdate=_useRegisterOverlay.onUpdate,onClose=_useRegisterOverlay.onClose,onFastClose=_useRegisterOverlay.onFastClose,stopDelayedClosing=_useRegisterOverlay.stopDelayedClosing;var click=trigger==='click';var hover=trigger==='hover';var focus=trigger==='focus';renderContent=renderContent||function(){return content;};var buildContent=function buildContent(){var _ref$current,_ref$current$getBound,_ref$current2,_ref$current2$getBoun;return _jsx(PopoverContent,Object.assign({placement:placement,width:parentWidth?(_ref$current=ref.current)==null?void 0:(_ref$current$getBound=_ref$current.getBoundingClientRect())==null?void 0:_ref$current$getBound.width:undefined,minWidth:parentMinWidth?(_ref$current2=ref.current)==null?void 0:(_ref$current2$getBoun=_ref$current2.getBoundingClientRect())==null?void 0:_ref$current2$getBoun.width:undefined},props,{onMouseEnter:hover?stopDelayedClosing:undefined,onMouseLeave:hover?onClose:undefined,children:renderContent({onClose:onFastClose})}));};var computeTriggerRect=function computeTriggerRect(){var rect=ref.current.getBoundingClientRect();var scrollX=window.scrollX||window.pageXOffset;var scrollY=window.scrollY||window.pageYOffset;return{left:rect.left+scrollX,right:rect.right+scrollX,top:rect.top+scrollY,bottom:rect.bottom+scrollY,width:rect.width,height:rect.height};};var show=function show(e){if(e&&e.stopPropagation)e.stopPropagation();var triggerRect=computeTriggerRect();onOpen({content:buildContent(),triggerRect:triggerRect,placement:placement,options:{dismissOnClickOutside:click||focus}});};React.useEffect(function(){return function(){return onClose();};},[]);React.useEffect(function(){if(!ref.current||!watch)return;onUpdate({content:buildContent(),options:{dismissOnClickOutside:click||focus}});},watch);if(shouldUseDrawer){return _jsx(DrawerPopover,Object.assign({content:content,renderContent:renderContent,children:children},props,bottomDrawerProps));}var child=React.Children.only(children);var childProps={ref:ref,onClick:show};if(hover)childProps={ref:ref,onMouseEnter:show,onMouseLeave:onClose,disabled:disabled};if(focus)childProps={ref:ref,onFocus:show,disabled:disabled};return React.cloneElement(child,childProps);}function DrawerPopover(_ref2){var children=_ref2.children,content=_ref2.content,renderContent=_ref2.renderContent,snapPoints=_ref2.snapPoints,props=_objectWithoutProperties(_ref2,_excluded2);var _React$useState=React.useState(false),_React$useState2=_slicedToArray(_React$useState,2),open=_React$useState2[0],setOpen=_React$useState2[1];var onClose=function onClose(){return setOpen(false);};var child=React.Children.only(children);var childProps={onClick:function onClick(){return setOpen(true);}};return _jsxs(_Fragment,{children:[React.cloneElement(child,childProps),_jsx(BottomDrawer,Object.assign({open:open,onClose:onClose,snapPoints:snapPoints},props,{children:renderContent({onClose:onClose})}))]});}
@@ -0,0 +1 @@
1
+ import _slicedToArray from"@babel/runtime/helpers/slicedToArray";import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";var _jsxFileName="/Users/christianstorch/Apps/nekoapps/libs/neko-ui/src/components/structure/popover/Popover_BU.js";var _excluded=["renderContent","content","trigger","placement","unmountOnClose","children","parentWidth","parentMinWidth","useBottomDrawer","bottomDrawerProps","watch"],_excluded2=["children","content","renderContent","snapPoints"];import React from'react';import{BottomDrawer}from"../bottomDrawer";import{PopoverContent}from"./PopoverContent";import{useRegisterOverlay}from"../overlay/OverlayHandler";import{useResponsiveValue}from"../../../responsive";import{jsx as _jsx,Fragment as _Fragment,jsxs as _jsxs}from"react/jsx-runtime";export function Popover(_ref){var _this=this;var renderContent=_ref.renderContent,content=_ref.content,_ref$trigger=_ref.trigger,trigger=_ref$trigger===void 0?'hover':_ref$trigger,_ref$placement=_ref.placement,placement=_ref$placement===void 0?'bottom':_ref$placement,unmountOnClose=_ref.unmountOnClose,children=_ref.children,parentWidth=_ref.parentWidth,parentMinWidth=_ref.parentMinWidth,_ref$useBottomDrawer=_ref.useBottomDrawer,useBottomDrawer=_ref$useBottomDrawer===void 0?{}:_ref$useBottomDrawer,_ref$bottomDrawerProp=_ref.bottomDrawerProps,bottomDrawerProps=_ref$bottomDrawerProp===void 0?{}:_ref$bottomDrawerProp,watch=_ref.watch,props=_objectWithoutProperties(_ref,_excluded);var shouldUseDrawer=useResponsiveValue(useBottomDrawer);var ref=React.useRef(null);var _useRegisterOverlay=useRegisterOverlay({unmountOnClose:unmountOnClose}),onOpen=_useRegisterOverlay.onOpen,onUpdate=_useRegisterOverlay.onUpdate,onClose=_useRegisterOverlay.onClose,onFastClose=_useRegisterOverlay.onFastClose,stopDelayedClosing=_useRegisterOverlay.stopDelayedClosing;var click=trigger==='click';var hover=trigger==='hover';var focus=trigger==='focus';renderContent=renderContent||function(){return content;};var buildContent=function buildContent(){var _ref$current,_ref$current$getBound,_ref$current2,_ref$current2$getBoun;return _jsx(PopoverContent,Object.assign({placement:placement,width:parentWidth?(_ref$current=ref.current)==null?void 0:(_ref$current$getBound=_ref$current.getBoundingClientRect())==null?void 0:_ref$current$getBound.width:undefined,minWidth:parentMinWidth?(_ref$current2=ref.current)==null?void 0:(_ref$current2$getBoun=_ref$current2.getBoundingClientRect())==null?void 0:_ref$current2$getBoun.width:undefined},props,{onMouseEnter:hover?stopDelayedClosing:undefined,onMouseLeave:hover?onClose:undefined,children:renderContent({onClose:onFastClose})}));};var computeTriggerRect=function computeTriggerRect(){var rect=ref.current.getBoundingClientRect();var scrollX=window.scrollX||window.pageXOffset;var scrollY=window.scrollY||window.pageYOffset;return{left:rect.left+scrollX,right:rect.right+scrollX,top:rect.top+scrollY,bottom:rect.bottom+scrollY,width:rect.width,height:rect.height};};var show=function show(e){if(e&&e.stopPropagation)e.stopPropagation();var triggerRect=computeTriggerRect();onOpen({content:buildContent(),triggerRect:triggerRect,placement:placement,options:{dismissOnClickOutside:click||focus}});};React.useEffect(function(){return function(){return onClose();};},[]);React.useEffect(function(){if(!ref.current)return;var triggerRect=computeTriggerRect();onUpdate({content:buildContent(),triggerRect:triggerRect,placement:placement,options:{dismissOnClickOutside:click||focus}});},[watch,renderContent]);if(shouldUseDrawer){return _jsx(DrawerPopover,Object.assign({content:content,renderContent:renderContent,children:children},props,bottomDrawerProps));}var child=React.Children.only(children);var childProps={ref:ref,onClick:show};if(hover)childProps={ref:ref,onMouseEnter:show,onMouseLeave:onClose};if(focus)childProps={ref:ref,onFocus:show};return React.cloneElement(child,childProps);}function DrawerPopover(_ref2){var children=_ref2.children,content=_ref2.content,renderContent=_ref2.renderContent,snapPoints=_ref2.snapPoints,props=_objectWithoutProperties(_ref2,_excluded2);var _React$useState=React.useState(false),_React$useState2=_slicedToArray(_React$useState,2),open=_React$useState2[0],setOpen=_React$useState2[1];var onClose=function onClose(){return setOpen(false);};var child=React.Children.only(children);var childProps={onClick:function onClick(){return setOpen(true);}};return _jsxs(_Fragment,{children:[React.cloneElement(child,childProps),_jsx(BottomDrawer,Object.assign({open:open,onClose:onClose,snapPoints:snapPoints},props,{children:renderContent({onClose:onClose})}))]});}
@@ -0,0 +1 @@
1
+ import _slicedToArray from"@babel/runtime/helpers/slicedToArray";import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";var _jsxFileName="/Users/christianstorch/Apps/nekoapps/libs/neko-ui/src/components/tabs/ActiveTabContent.js";var _excluded=["item","active"];import React from'react';import{AnimatedView}from"../animations";import{View}from"../structure";import{useTabs}from"./TabsHandler";import{jsx as _jsx}from"react/jsx-runtime";var duration=100;function Item(_ref){var item=_ref.item,active=_ref.active,props=_objectWithoutProperties(_ref,_excluded);var Content=React.useMemo(function(){return item.renderContent||item.Content;},[item.renderContent,item.Content]);var _React$useState=React.useState(active),_React$useState2=_slicedToArray(_React$useState,2),open=_React$useState2[0],setOpen=_React$useState2[1];React.useEffect(function(){if(!!active){setTimeout(function(){return setOpen(true);},duration);}else{setOpen(active);}},[active]);return _jsx(AnimatedView,Object.assign({open:open,fade:{duration:duration},flex:true,display:!open&&'none'},props,{children:_jsx(Content,{})}));}export function ActiveTabContent(_ref2){var _this=this;var lazy=_ref2.lazy,unmountOnClose=_ref2.unmountOnClose;var _useTabs=useTabs(),activeKey=_useTabs.activeKey,items=_useTabs.items;if(!(items!=null&&items.length))return false;return items.map(function(item){return _jsx(Item,{item:item,active:item.key===activeKey,lazy:lazy,unmountOnClose:unmountOnClose},item.key);});}
@@ -0,0 +1 @@
1
+ import _slicedToArray from"@babel/runtime/helpers/slicedToArray";var _jsxFileName="/Users/christianstorch/Apps/nekoapps/libs/neko-ui/src/components/tabs/TabsHandler.js";import React from'react';import{jsx as _jsx}from"react/jsx-runtime";var TabsContext=React.createContext(null);export var useTabs=function useTabs(){return React.useContext(TabsContext)||{};};export function TabsHandler(_ref){var _items$;var children=_ref.children,items=_ref.items,initialKey=_ref.initialKey;var _React$useState=React.useState(initialKey||(items==null?void 0:(_items$=items[0])==null?void 0:_items$.key)),_React$useState2=_slicedToArray(_React$useState,2),activeKey=_React$useState2[0],setActiveKey=_React$useState2[1];var activeTab=React.useMemo(function(){return items==null?void 0:items.find(function(item){return item.key===activeKey;});},[activeKey]);var value={items:items,onChange:setActiveKey,activeKey:activeKey,activeTab:activeTab};return _jsx(TabsContext.Provider,{value:value,children:children});}
@@ -0,0 +1 @@
1
+ var _jsxFileName="/Users/christianstorch/Apps/nekoapps/libs/neko-ui/src/components/tabs/TabsMenu.js";import{Menu}from"../actions";import{SegmentedPicker}from"../inputs";import{useTabs}from"./TabsHandler";import{jsx as _jsx}from"react/jsx-runtime";export function TabsMenu(props){var _useTabs=useTabs(),activeKey=_useTabs.activeKey,items=_useTabs.items,_onChange=_useTabs.onChange;return _jsx(Menu,Object.assign({items:items,activeKey:activeKey,onChange:function onChange(_ref){var key=_ref.key;return _onChange(key);}},props));}export function TabsSegmentedMenu(props){var _useTabs2=useTabs(),activeKey=_useTabs2.activeKey,items=_useTabs2.items,onChange=_useTabs2.onChange;return _jsx(SegmentedPicker,Object.assign({options:items,valueKey:"key",value:activeKey,onChange:onChange},props));}
@@ -0,0 +1 @@
1
+ export*from"./TabsHandler";export*from"./TabsMenu";export*from"./ActiveTabContent";
@@ -1 +1 @@
1
- import{adjust,compose,defaultTo,head,join,juxt,map,pipe,replace,split,tail,toLower,toUpper}from'ramda';export var removeSpecialChars=replace(/[^a-zA-Z ,0-9]/g,'');export var capitalize=compose(join(''),juxt([compose(toUpper,head),tail]),toLower,defaultTo(''));export var capitalizeFirstLetter=compose(join(''),juxt([compose(toUpper,head),tail]),defaultTo(''));export var capitalizeSentence=compose(join(' '),map(capitalize),split('. '),defaultTo(''));export var capitalizeAll=compose(join(' '),map(capitalize),split(' '),defaultTo(''));export var isLower=function isLower(str){return(str||'').toLowerCase()===str;};export var capitalizeIfLower=function capitalizeIfLower(str){return isLower(str)?capitalize(str):str;};export var capitalizeAllIfLower=function capitalizeAllIfLower(str){return isLower(str)?capitalizeAll(str):str;};export var capitalizeSentenceIfLower=function capitalizeSentenceIfLower(str){return isLower(str)?capitalizeSentence(str):str;};export var getInitials=function getInitials(str){if(!str)return'--';if(str.includes(' ')){str=str.split(' ').map(head).join('');}return str.substring(0,2);};export var splitWords=split(new RegExp(/[/\-_ ]/gi));export var toKebabCase=function toKebabCase(str){return str.split('').map(function(letter,index){if(letter==='_')return'-';if((letter==null?void 0:letter.toUpperCase())===letter)return`${index!==0?'-':''}${letter==null?void 0:letter.toLowerCase()}`;return letter;}).join('');};export var toSnakeCase=pipe(toKebabCase,replace(/-/g,'_'));export var toCamelCase=pipe(splitWords,map(capitalize),adjust(0,toLower),join(''));export var truncateString=function truncateString(str,size){if(!size)return str;if(!!str&&str.length>size)return str.substring(0,size)+'...';return str;};export var truncate=truncateString;export var slugify=function slugify(text){return toSnakeCase(text);};
1
+ import{adjust,compose,defaultTo,head,join,juxt,map,pipe,replace,split,tail,toLower,toUpper,trim}from'ramda';export var removeSpecialChars=replace(/[^a-zA-Z ,0-9]/g,'');export var capitalize=compose(join(''),juxt([compose(toUpper,head),tail]),toLower,defaultTo(''));export var capitalizeFirstLetter=compose(join(''),juxt([compose(toUpper,head),tail]),defaultTo(''));export var capitalizeSentence=compose(join(' '),map(capitalize),split('. '),defaultTo(''));export var capitalizeAll=compose(join(' '),map(capitalize),split(' '),defaultTo(''));export var isLower=function isLower(str){return(str||'').toLowerCase()===str;};export var capitalizeIfLower=function capitalizeIfLower(str){return isLower(str)?capitalize(str):str;};export var capitalizeAllIfLower=function capitalizeAllIfLower(str){return isLower(str)?capitalizeAll(str):str;};export var capitalizeSentenceIfLower=function capitalizeSentenceIfLower(str){return isLower(str)?capitalizeSentence(str):str;};export var getInitials=function getInitials(str){if(!str)return'--';if(str.includes(' ')){str=str.split(' ').map(head).join('');}return str.substring(0,2);};export var splitWords=split(new RegExp(/[/\-_ ]/gi));export var toKebabCase=function toKebabCase(str){return str.split('').map(function(letter,index){if(letter==='_')return'-';if((letter==null?void 0:letter.toUpperCase())===letter)return`${index!==0?'-':''}${letter==null?void 0:letter.toLowerCase()}`;return letter;}).join('');};export var toSnakeCase=pipe(toKebabCase,replace(/-/g,'_'));export var toCamelCase=pipe(splitWords,map(capitalize),adjust(0,toLower),join(''));export var truncateString=function truncateString(str,size){if(!size)return str;if(!!str&&str.length>size)return str.substring(0,size)+'...';return str;};export var truncate=truncateString;export var slugify=function slugify(text){return toSnakeCase(text);};export var normalizeString=pipe(toLower,trim,function(str){return str.normalize('NFD').replace(/[\u0300-\u036f]/g,'');});
@@ -0,0 +1 @@
1
+ import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";import _asyncToGenerator from"@babel/runtime/helpers/asyncToGenerator";import _classCallCheck from"@babel/runtime/helpers/classCallCheck";import _createClass from"@babel/runtime/helpers/createClass";var _excluded=["ns","context"];export var I18n=function(){function I18n(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};_classCallCheck(this,I18n);this.language=options.language||'en';this.fallback=options.fallback||'en';this.onChangeLanguage=options.onChangeLanguage;this.resources=options.resources||{};this.loader=options.loader;}return _createClass(I18n,[{key:"addResources",value:function addResources(lang,ns,data){if(!this.resources[lang])this.resources[lang]={};this.resources[lang][ns]=Object.assign({},this.resources[lang][ns],data);}},{key:"changeLanguage",value:function changeLanguage(lang){var _this$onChangeLanguag;this.language=lang;(_this$onChangeLanguag=this.onChangeLanguage)==null?void 0:_this$onChangeLanguag.call(this,lang);}},{key:"tAsync",value:function(){var _tAsync=_asyncToGenerator(function*(key){var _this$resources$this$;var opts=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var _opts$ns=opts.ns,ns=_opts$ns===void 0?'common':_opts$ns;if(!((_this$resources$this$=this.resources[this.language])!=null&&_this$resources$this$[ns])&&this.loader){yield this._loadNamespace(this.language,ns);}return this.t(key,opts);});function tAsync(_x){return _tAsync.apply(this,arguments);}return tAsync;}()},{key:"t",value:function t(key){var _this$resources$this$2;var opts=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var _opts$ns2=opts.ns,ns=_opts$ns2===void 0?'common':_opts$ns2,context=opts.context,vars=_objectWithoutProperties(opts,_excluded);var count=vars==null?void 0:vars.count;if(key.includes(':')){var splittedKey=key.split(':');ns=splittedKey[0];key=splittedKey[1];}var langData=(_this$resources$this$2=this.resources[this.language])==null?void 0:_this$resources$this$2[ns];var value=this._resolveKey(langData,key,count,context);if(context)console.log(context,value);if(!value){var _this$resources$this$3;var fallbackData=(_this$resources$this$3=this.resources[this.fallback])==null?void 0:_this$resources$this$3[ns];value=this._resolveKey(fallbackData,key,count,context)||key;}return this._interpolate(value,vars);}},{key:"_loadNamespace",value:function(){var _loadNamespace2=_asyncToGenerator(function*(lang,ns){if(!this.loader)return;var data=yield this.loader(lang,ns);this.addResources(lang,ns,data);});function _loadNamespace(_x2,_x3){return _loadNamespace2.apply(this,arguments);}return _loadNamespace;}()},{key:"_resolveKey",value:function _resolveKey(nsData,key,count,context){if(!nsData)return null;var parts=key.split('.');var basePath=parts.slice(0,-1);var baseKey=parts[parts.length-1];var parent=basePath.reduce(function(acc,part){return acc?acc[part]:undefined;},nsData)||nsData;if(!parent)return null;if(context){var contextKey=`${baseKey}_${context}`;if(parent[contextKey]!=null){return parent[contextKey];}}if(typeof count==='number'){if(count===0){var singularKey=`${baseKey}_zero`;if(parent[singularKey]!=null){return parent[singularKey];}}if(count===1){var _singularKey=`${baseKey}_one`;if(parent[_singularKey]!=null){return parent[_singularKey];}}}return parent[baseKey];}},{key:"_interpolate",value:function _interpolate(str,vars){if(typeof str!=='string')return str;return str.replace(/\{\{(.*?)\}\}/g,function(_,v){var _vars$v$trim;return(_vars$v$trim=vars[v.trim()])!=null?_vars$v$trim:'';});}}]);}();
@@ -0,0 +1 @@
1
+ import _slicedToArray from"@babel/runtime/helpers/slicedToArray";var _jsxFileName="/Users/christianstorch/Apps/nekoapps/libs/neko-ui/src/i18n/I18nProvider.js";import React from'react';import{I18n}from"./I18n";import{jsx as _jsx}from"react/jsx-runtime";var I18nContext=React.createContext();export function I18nProvider(_ref){var children=_ref.children,i18n=_ref.i18n,config=_ref.config;var i18nRef=React.useRef(i18n||new I18n(config));var _React$useState=React.useState(0),_React$useState2=_slicedToArray(_React$useState,2),v=_React$useState2[0],setVersion=_React$useState2[1];var forceUpdate=React.useCallback(function(){return setVersion(function(v){return v+1;});},[]);var changeLanguage=React.useCallback(function(lang){i18nRef.current.changeLanguage(lang);forceUpdate();},[forceUpdate]);var value=React.useMemo(function(){return{t:function t(){var _i18nRef$current;return(_i18nRef$current=i18nRef.current).t.apply(_i18nRef$current,arguments);},i18n:i18nRef.current,v:v,language:i18nRef.current.language,changeLanguage:changeLanguage};},[v,forceUpdate,changeLanguage]);return _jsx(I18nContext.Provider,{value:value,children:children});}export function useTranslation(namespace){var ctx=React.useContext(I18nContext);if(!ctx)throw new Error('useTranslation must be used inside <I18nProvider>');var t=function t(key){var opts=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};return ctx==null?void 0:ctx.t==null?void 0:ctx.t(key,Object.assign({ns:namespace},opts));};return Object.assign({},ctx,{t:t});}
@@ -0,0 +1 @@
1
+ export*from"./I18nProvider";export*from"./I18n";
package/dist/index.css CHANGED
@@ -62,6 +62,10 @@ button {
62
62
  opacity: 0.95;
63
63
  }
64
64
 
65
+ /* ::placeholder { */
66
+ /* color: rgba(127, 127, 127, 0.4); */
67
+ /* } */
68
+
65
69
  @keyframes wave-effect {
66
70
  0% {
67
71
  opacity: 1;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- export*from"./helpers";export*from"./components";export*from"./theme";export*from"./responsive";export*from"./NekoUI";export var version=41;
1
+ export*from"./helpers";export*from"./components";export*from"./theme";export*from"./responsive";export*from"./i18n";export*from"./NekoUI";export var version=41;
@@ -0,0 +1 @@
1
+ import{useFadeEffect as useFadeEffectNative}from"./fadeEffect.native";export var useFadeEffect=useFadeEffectNative;
@@ -0,0 +1 @@
1
+ import{useScrollEffect as useScrollEffectNative}from"./scrollEffect.native";export var useScrollEffect=useScrollEffectNative;
@@ -0,0 +1 @@
1
+ import{useSlideEffect as useSlideEffectNative}from"./slideEffect.native";export var useSlideEffect=useSlideEffectNative;
@@ -1 +1 @@
1
- import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";import _slicedToArray from"@babel/runtime/helpers/slicedToArray";var _excluded=["hiddenOverflow","scroll","scrollY","scrollX","overflow","overflowY","overflowX"];import{clearProps}from"./_helpers";export function useOverflowModifier(_ref){var _ref2=_slicedToArray(_ref,2),values=_ref2[0],props=_ref2[1];var hiddenOverflow=props.hiddenOverflow,scroll=props.scroll,scrollY=props.scrollY,scrollX=props.scrollX,overflow=props.overflow,overflowY=props.overflowY,overflowX=props.overflowX,restProps=_objectWithoutProperties(props,_excluded);if(hiddenOverflow)overflow='hidden';if(scroll)overflow='scroll';if(scrollY)overflowY='scroll';if(scrollX)overflowX='scroll';var style=clearProps({overflow:overflow,overflowY:overflowY,overflowX:overflowX});return[values,Object.assign({},restProps,{style:Object.assign({},props.style,style)})];}
1
+ import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";import _slicedToArray from"@babel/runtime/helpers/slicedToArray";var _excluded=["hiddenOverflow","scroll","noScroll","scrollY","scrollX","overflow","overflowY","overflowX"];import{clearProps}from"./_helpers";export function useOverflowModifier(_ref){var _ref2=_slicedToArray(_ref,2),values=_ref2[0],props=_ref2[1];var hiddenOverflow=props.hiddenOverflow,scroll=props.scroll,noScroll=props.noScroll,scrollY=props.scrollY,scrollX=props.scrollX,overflow=props.overflow,overflowY=props.overflowY,overflowX=props.overflowX,restProps=_objectWithoutProperties(props,_excluded);if(hiddenOverflow)overflow='hidden';if(scroll)overflow='scroll';if(scrollY)overflowY='scroll';if(scrollX)overflowX='scroll';if(noScroll){if(overflow==='scroll')overflow=undefined;if(overflowY==='scroll')overflowY=undefined;if(overflowX==='scroll')overflowX=undefined;}var style=clearProps({overflow:overflow,overflowY:overflowY,overflowX:overflowX});return[values,Object.assign({},restProps,{style:Object.assign({},props.style,style)})];}
@@ -1 +1 @@
1
- import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";import _slicedToArray from"@babel/runtime/helpers/slicedToArray";var _excluded=["position","absolute","absoluteFill","fixedFill","relative","fixed","sticky","top","bottom","left","right","zIndex"];import{Platform}from"../abstractions/Platform";import{clearProps}from"./_helpers";export function usePositionModifier(_ref){var _ref2=_slicedToArray(_ref,2),values=_ref2[0],props=_ref2[1];var position=props.position,absolute=props.absolute,absoluteFill=props.absoluteFill,fixedFill=props.fixedFill,relative=props.relative,fixed=props.fixed,sticky=props.sticky,top=props.top,bottom=props.bottom,left=props.left,right=props.right,zIndex=props.zIndex,restProps=_objectWithoutProperties(props,_excluded);if(!zIndex&&!!absolute)zIndex=10;if(absolute||absoluteFill)position='absolute';if(relative)position='relative';if(fixed||fixedFill)position='fixed';if(sticky)position='sticky';if(absoluteFill||fixedFill){top=0;bottom=0;left=0;right=0;}if(Platform.OS!=='web'&&['fixed','sticky'].includes(position)){position='absolute';}var style=clearProps({position:position,top:top,bottom:bottom,left:left,right:right,zIndex:zIndex});return[values,Object.assign({},restProps,{style:Object.assign({},props.style,style)})];}
1
+ import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";import _slicedToArray from"@babel/runtime/helpers/slicedToArray";var _excluded=["position","absolute","absoluteFill","fixedFill","relative","fixed","sticky","top","bottom","left","right","zIndex"];import{Platform}from"../abstractions/Platform";import{clearProps}from"./_helpers";import{useGetSpace}from"../theme";export function usePositionModifier(_ref){var _ref2=_slicedToArray(_ref,2),values=_ref2[0],props=_ref2[1];var getSpace=useGetSpace();var position=props.position,absolute=props.absolute,absoluteFill=props.absoluteFill,fixedFill=props.fixedFill,relative=props.relative,fixed=props.fixed,sticky=props.sticky,top=props.top,bottom=props.bottom,left=props.left,right=props.right,zIndex=props.zIndex,restProps=_objectWithoutProperties(props,_excluded);if(!zIndex&&!!absolute)zIndex=10;if(absolute||absoluteFill)position='absolute';if(relative)position='relative';if(fixed||fixedFill)position='fixed';if(sticky)position='sticky';top=getSpace(top);bottom=getSpace(bottom);right=getSpace(right);left=getSpace(left);if(absoluteFill||fixedFill){top=0;bottom=0;left=0;right=0;}if(Platform.OS!=='web'&&['fixed','sticky'].includes(position)){position='absolute';}var style=clearProps({position:position,top:top,bottom:bottom,left:left,right:right,zIndex:zIndex});return[values,Object.assign({},restProps,{style:Object.assign({},props.style,style)})];}
@@ -1 +1 @@
1
- export var BASE_THEME={spaces:{xxxs:1,xxs:3,xs:5,sm:10,md:15,lg:20,xl:30,xxl:40,xxxl:50},radius:{xxxs:4,xxs:5,xs:5,sm:7,md:8,lg:10,xl:12,xxl:15,xxxl:18},icons:{xxxs:10,xxs:12,xs:14,sm:16,md:18,lg:22,xl:26,xxl:28,xxxl:32},elementHeights:{xs:20,sm:30,md:35,lg:50,xl:60},texts:{h1:{fontSize:35,strong:true},h2:{fontSize:28,strong:true},h3:{fontSize:26,strong:true},h4:{fontSize:22,strong:true},h5:{fontSize:18,strong:true},h6:{fontSize:16,strong:true},p:{fontSize:14},sm:{fontSize:12},xs:{fontSize:10},xxs:{fontSize:8}}};
1
+ export var BASE_THEME={spaces:{xxxs:1,xxs:3,xs:5,sm:10,md:15,lg:20,xl:30,xxl:40,xxxl:50},radius:{xxxs:4,xxs:5,xs:5,sm:7,md:8,lg:10,xl:12,xxl:15,xxxl:18},icons:{xxxs:10,xxs:12,xs:14,sm:16,md:18,lg:22,xl:26,xxl:28,xxxl:32},elementHeights:{xxxs:10,xxs:15,xs:20,sm:30,md:35,lg:40,xl:50,xxl:60,xxxl:70},texts:{h1:{fontSize:35,strong:true},h2:{fontSize:28,strong:true},h3:{fontSize:26,strong:true},h4:{fontSize:22,strong:true},h5:{fontSize:18,strong:true},h6:{fontSize:16,strong:true},p:{fontSize:14},sm:{fontSize:12},xs:{fontSize:10},xxs:{fontSize:8}}};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neko-os/ui",
3
- "version": "0.0.9",
3
+ "version": "0.0.10",
4
4
  "author": "Christian Storch <ccstorch@gmail.com>",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -0,0 +1,21 @@
1
+ import React from 'react'
2
+
3
+ import { useColors } from './theme'
4
+
5
+ export function DynamicStyleTag() {
6
+ const colors = useColors()
7
+ const placeholderColor = colors.text_op30
8
+
9
+ React.useEffect(() => {
10
+ const style = document.createElement('style')
11
+ style.innerHTML = `
12
+ ::placeholder {
13
+ color: ${placeholderColor};
14
+ }
15
+ `
16
+ document.head.appendChild(style)
17
+ return () => style.remove()
18
+ }, [placeholderColor])
19
+
20
+ return false
21
+ }
@@ -0,0 +1,3 @@
1
+ export function DynamicStyleTag() {
2
+ return false
3
+ }
package/src/NekoUI.js CHANGED
@@ -1,3 +1,5 @@
1
+ import { DynamicStyleTag } from './DynamicStyleTag'
2
+ import { I18nProvider } from './i18n'
1
3
  import { ModalsHandler } from './components/structure/modal/handler/ModalsHandler'
2
4
  import { NotificationsHandler } from './components/feedback/notifications/NotificationsHandler'
3
5
  import { OverlayHandler } from './components/structure/overlay/OverlayHandler'
@@ -7,18 +9,21 @@ import { ThemeHandler } from './theme/ThemeHandler'
7
9
  import { ThemePickerDrawer } from './components/theme'
8
10
  import { useThemeHandler } from './theme'
9
11
 
10
- export function NekoUI({ children, ...props }) {
12
+ export function NekoUI({ children, i18n, ...props }) {
11
13
  return (
12
14
  <ThemeHandler {...props}>
15
+ <DynamicStyleTag />
13
16
  <ResponsiveHandler>
14
17
  <PortalHandler>
15
18
  <ModalsHandler>
16
- <NotificationsHandler>
17
- <OverlayHandler>
18
- {children}
19
- <FixedComponents />
20
- </OverlayHandler>
21
- </NotificationsHandler>
19
+ <I18nProvider i18n={i18n}>
20
+ <NotificationsHandler>
21
+ <OverlayHandler>
22
+ {children}
23
+ <FixedComponents />
24
+ </OverlayHandler>
25
+ </NotificationsHandler>
26
+ </I18nProvider>
22
27
  </ModalsHandler>
23
28
  </PortalHandler>
24
29
  </ResponsiveHandler>
@@ -0,0 +1,3 @@
1
+ import { AbsAnimatedView as NativeAbsAnimatedView } from './AnimatedView.native'
2
+
3
+ export const AbsAnimatedView = NativeAbsAnimatedView
@@ -1,39 +1,3 @@
1
- import React from 'react'
2
- import { AbsView } from './View'
1
+ import { AbsStaticList } from './StaticList'
3
2
 
4
- const defaultRender = () => false
5
-
6
- export function AbsFlatList({
7
- data,
8
- renderItem,
9
- ListEmptyComponent,
10
- Empty,
11
- renderEmpty,
12
- ListFooterComponent,
13
- Footer,
14
- renderFooter,
15
- ListHeaderComponent,
16
- Header,
17
- renderHeader,
18
- keyExtractor,
19
- ...props
20
- }) {
21
- ListEmptyComponent = ListEmptyComponent || Empty || defaultRender
22
- ListFooterComponent = ListFooterComponent || Footer || renderFooter || defaultRender
23
- ListHeaderComponent = ListHeaderComponent || Header || renderHeader || defaultRender
24
- keyExtractor = keyExtractor || ((item, index) => index)
25
- renderItem = renderItem || defaultRender
26
-
27
- return (
28
- <AbsView {...props}>
29
- <ListHeaderComponent />
30
-
31
- {!data?.length && <ListEmptyComponent />}
32
- {data?.map?.((item, index) => (
33
- <React.Fragment key={keyExtractor(item, index)}>{renderItem({ item, index })}</React.Fragment>
34
- ))}
35
-
36
- <ListFooterComponent />
37
- </AbsView>
38
- )
39
- }
3
+ export const AbsFlatList = AbsStaticList
@@ -2,6 +2,9 @@ import { FlatList } from 'react-native'
2
2
 
3
3
  export const AbsFlatList = ({
4
4
  style: { height, width, ...style },
5
+ ItemSeparatorComponent,
6
+ Separator,
7
+ renderSeparator,
5
8
  ListEmptyComponent,
6
9
  Empty,
7
10
  renderEmpty,
@@ -11,18 +14,19 @@ export const AbsFlatList = ({
11
14
  ListHeaderComponent,
12
15
  Header,
13
16
  renderHeader,
14
-
15
17
  ...props
16
18
  }) => {
17
- ListEmptyComponent = ListEmptyComponent || Empty || defaultRender
18
- ListFooterComponent = ListFooterComponent || Footer || renderFooter || defaultRender
19
- ListHeaderComponent = ListHeaderComponent || Header || renderHeader || defaultRender
19
+ ItemSeparatorComponent = ItemSeparatorComponent || Separator || renderSeparator
20
+ ListEmptyComponent = ListEmptyComponent || Empty || renderEmpty
21
+ ListFooterComponent = ListFooterComponent || Footer || renderFooter
22
+ ListHeaderComponent = ListHeaderComponent || Header || renderHeader
20
23
 
21
24
  return (
22
25
  <FlatList
23
26
  height={height}
24
27
  width={width}
25
28
  {...props}
29
+ ItemSeparatorComponent={ItemSeparatorComponent}
26
30
  ListEmptyComponent={ListEmptyComponent}
27
31
  ListFooterComponent={ListFooterComponent}
28
32
  ListHeaderComponent={ListHeaderComponent}
@@ -0,0 +1,51 @@
1
+ import React from 'react'
2
+
3
+ import { AbsView } from './View'
4
+ import { LazyAction } from '../components/helpers/LazyAction'
5
+
6
+ const defaultRender = () => false
7
+
8
+ export function AbsStaticList({
9
+ data,
10
+ renderItem,
11
+ ItemSeparatorComponent,
12
+ Separator,
13
+ renderSeparator,
14
+ ListEmptyComponent,
15
+ Empty,
16
+ renderEmpty,
17
+ ListFooterComponent,
18
+ Footer,
19
+ renderFooter,
20
+ ListHeaderComponent,
21
+ Header,
22
+ renderHeader,
23
+ keyExtractor,
24
+ onEndReached,
25
+ ...props
26
+ }) {
27
+ ItemSeparatorComponent = ItemSeparatorComponent || Separator || renderSeparator || defaultRender
28
+ ListEmptyComponent = ListEmptyComponent || Empty || renderEmpty || defaultRender
29
+ ListFooterComponent = ListFooterComponent || Footer || renderFooter || defaultRender
30
+ ListHeaderComponent = ListHeaderComponent || Header || renderHeader || defaultRender
31
+ keyExtractor = keyExtractor || ((item, index) => index)
32
+ renderItem = renderItem || defaultRender
33
+
34
+ return (
35
+ <AbsView {...props}>
36
+ <ListHeaderComponent />
37
+
38
+ {!data?.length && <ListEmptyComponent />}
39
+ {data?.map?.((item, index) => (
40
+ <React.Fragment key={keyExtractor(item, index)}>
41
+ {index !== 0 && <ItemSeparatorComponent />}
42
+ {renderItem({ item, index })}
43
+ </React.Fragment>
44
+ ))}
45
+
46
+ <LazyAction action={onEndReached} destroyOffScreen />
47
+
48
+ <ListFooterComponent />
49
+ </AbsView>
50
+ )
51
+ }
@@ -0,0 +1,3 @@
1
+ export const useSafeAreaInsets = () => {
2
+ return { top: 0, bottom: 0, left: 0, right: 0 }
3
+ }
@@ -0,0 +1,3 @@
1
+ import { useSafeAreaInsets as _useSafeAreaInsets } from 'react-native-safe-area-context'
2
+
3
+ export const useSafeAreaInsets = _useSafeAreaInsets
@@ -5,8 +5,10 @@ import { Link } from './Link'
5
5
  import { Menu } from './menu/Menu'
6
6
  import { Popover } from '../structure/popover/Popover'
7
7
  import { View } from '../structure/View'
8
+ import { useResponsiveValue } from '../../responsive'
8
9
  import { useThemeComponentModifier } from '../../modifiers/themeComponent'
9
10
 
11
+ // TODO: Refactor to use default values
10
12
  export function Dropdown({ items, ...rootProps }) {
11
13
  const [_, formattedProps] = pipe(
12
14
  useThemeComponentModifier('Dropdown')
@@ -21,7 +23,7 @@ export function Dropdown({ items, ...rootProps }) {
21
23
  // useFlexModifier
22
24
  )([{}, rootProps])
23
25
 
24
- const {
26
+ let {
25
27
  onChange,
26
28
  label,
27
29
  trigger = 'click',
@@ -33,21 +35,22 @@ export function Dropdown({ items, ...rootProps }) {
33
35
  children,
34
36
  placement,
35
37
  gap,
38
+ useBottomDrawer,
36
39
  ...props
37
40
  } = formattedProps
38
41
 
42
+ useBottomDrawer = useResponsiveValue(useBottomDrawer || { native: true, sm: true, md: true })
43
+
39
44
  return (
40
45
  <View className="neko-dropdown" {...props}>
41
46
  <Popover
42
47
  useParentMinWidth
43
48
  placement={placement || 'bottomLeft'}
44
49
  trigger={trigger}
45
- padding="xs"
46
- useBottomDrawer={{ native: true, sm: true, md: true }}
47
- bottomDrawerProps={{
48
- bg: 'mainBG',
49
- contentProps: { bg: 'overlayBG', br: 'lg', margin: 'md' },
50
- }}
50
+ padding={0}
51
+ // In case its web use the Drawer component
52
+ contentProps={{ padding: 0 }}
53
+ useBottomDrawer={useBottomDrawer}
51
54
  {...popoverProps}
52
55
  renderContent={({ onClose }) => {
53
56
  const handleChange = (...params) => {
@@ -59,8 +62,9 @@ export function Dropdown({ items, ...rootProps }) {
59
62
  vertical
60
63
  items={items}
61
64
  onChange={handleChange}
62
- _linkPaddingV="lg"
63
- _linkProps={{ borderB: true, padding: 'lg', borderL: 0, brColor: 'divider' }}
65
+ linkPaddingH={useBottomDrawer ? 'md' : 'sm'}
66
+ linkMinHeight={useBottomDrawer ? 'xl' : 'md'}
67
+ withDivider={useBottomDrawer}
64
68
  />
65
69
  )
66
70
  }}
@@ -0,0 +1,87 @@
1
+ import { pipe } from 'ramda'
2
+
3
+ import { AbsTouchableOpacity } from '../../abstractions/TouchableOpacity'
4
+ import { Icon } from '../presentation'
5
+ import { Loading } from '../state'
6
+ import { moveScale } from '../../theme/helpers/sizeScale'
7
+ import { useBackgroundModifier } from '../../modifiers/background'
8
+ import { useBorderModifier } from '../../modifiers/border'
9
+ import { useColorConverter } from '../../modifiers/colorConverter'
10
+ import { useCursorModifier } from '../../modifiers/cursor'
11
+ import { useDefaultModifier } from '../../modifiers/default'
12
+ import { useDisplayModifier } from '../../modifiers/display'
13
+ import { useFlexModifier } from '../../modifiers/flex'
14
+ import { useFlexWrapperModifier } from '../../modifiers/flexWrapper'
15
+ import { useFullColorModifier } from '../../modifiers/fullColor'
16
+ import { useHoverConverter } from '../../modifiers/hover'
17
+ import { useMarginModifier } from '../../modifiers/margin'
18
+ import { usePaddingModifier } from '../../modifiers/padding'
19
+ import { usePositionModifier } from '../../modifiers/position'
20
+ import { useSafeAreaInsets } from '../../abstractions/helpers/useSafeAreaInsets'
21
+ import { useSizeConverter } from '../../modifiers/sizeConverter'
22
+ import { useSizeModifier } from '../../modifiers/size'
23
+ import { useStateModifier } from '../../modifiers/state'
24
+ import { useThemeComponentModifier } from '../../modifiers/themeComponent'
25
+
26
+ const DEFAULT_PROPS =
27
+ ({ bottomInset }) =>
28
+ ([{ sizeCode }, { square }]) => {
29
+ sizeCode = moveScale(sizeCode, 1)
30
+
31
+ return {
32
+ absolute: true,
33
+ shadow: true,
34
+ bottom: 'md',
35
+ marginB: bottomInset,
36
+ right: 'md',
37
+ round: !square,
38
+ ration: 1,
39
+ padding: 'xxxs',
40
+ height: sizeCode,
41
+ width: sizeCode,
42
+ br: sizeCode,
43
+ border: 1,
44
+ center: true,
45
+ pointer: true,
46
+ hover: {
47
+ opacity: 0.7,
48
+ },
49
+ }
50
+ }
51
+
52
+ export function FloatingButton({ useSafeArea = true, ...rootProps }) {
53
+ const insets = useSafeAreaInsets()
54
+ const bottomInset = useSafeArea ? insets.bottom : 0
55
+
56
+ let [{ loading, fontColor, color, sizeCode }, formattedProps] = pipe(
57
+ useColorConverter('primary'),
58
+ useSizeConverter('elementHeights', 'md'),
59
+ useThemeComponentModifier('FloatingButton'),
60
+ useDefaultModifier(DEFAULT_PROPS({ bottomInset })),
61
+ useHoverConverter,
62
+ useCursorModifier,
63
+ useFullColorModifier,
64
+ useDisplayModifier,
65
+ useStateModifier,
66
+ useSizeModifier,
67
+ usePositionModifier,
68
+ usePaddingModifier,
69
+ useMarginModifier,
70
+ useFlexModifier,
71
+ useFlexWrapperModifier,
72
+ useBackgroundModifier,
73
+ useBorderModifier
74
+ )([{}, rootProps])
75
+ sizeCode = moveScale(sizeCode, 1)
76
+
77
+ const { icon, iconProps, size, ...props } = formattedProps
78
+
79
+ let content = <Icon flex color={fontColor} size={sizeCode} name={icon} loading={loading} {...iconProps} />
80
+ if (loading) content = <Loading size={sizeCode} color={fontColor} />
81
+
82
+ return (
83
+ <AbsTouchableOpacity className="neko-floating-button neko-wave-click-effect" type="button" {...props}>
84
+ {content}
85
+ </AbsTouchableOpacity>
86
+ )
87
+ }
@@ -1,4 +1,5 @@
1
1
  export * from './Button'
2
+ export * from './FloatingButton'
2
3
  export * from './Link'
3
4
  export * from './Pressable'
4
5
  export * from './Dropdown'