@fountain-ui/lab 2.0.0-beta.5 → 2.0.0-beta.6

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.
@@ -26,7 +26,6 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
26
26
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
27
 
28
28
  const defaultOptions = {
29
- translucent: false,
30
29
  shouldTranslateYReset: false
31
30
  };
32
31
  const ANIMATION_DURATION_MILLIS = 100;
@@ -41,7 +40,6 @@ function useLargerValueOfLastTwoValues(value) {
41
40
 
42
41
  function useUnstableCollapsibleAppBar(userOptions = defaultOptions) {
43
42
  const {
44
- translucent,
45
43
  shouldTranslateYReset
46
44
  } = { ...defaultOptions,
47
45
  ...userOptions
@@ -184,9 +182,9 @@ function useUnstableCollapsibleAppBar(userOptions = defaultOptions) {
184
182
  });
185
183
 
186
184
  const hasCollapsible = collapsibleToolbarHeight > 0;
187
- const appBarStyle = [animatedStyle, translucent ? {
185
+ const appBarStyle = [animatedStyle, {
188
186
  paddingTop: safeAreaInsets.top
189
- } : undefined, hasCollapsible ? styles.floating : undefined];
187
+ }, hasCollapsible ? styles.floating : undefined];
190
188
  return {
191
189
  appBarStyle,
192
190
  vectorY,
@@ -1 +1 @@
1
- {"version":3,"sources":["useUnstableCollapsibleAppBar.ts"],"names":["defaultOptions","translucent","shouldTranslateYReset","ANIMATION_DURATION_MILLIS","SUPPORTS_DRAG_DETECTION","Platform","OS","useLargerValueOfLastTwoValues","value","refLatestTwoValues","current","shift","push","Math","max","useUnstableCollapsibleAppBar","userOptions","styles","safeAreaInsets","appBarHeight","onAppBarLayout","appBarMaxHeight","collapsibleToolbarHeight","onCollapsibleToolbarLayout","maxTranslateY","Animated","useDerivedValue","translateY","useSharedValue","lastTranslateY","lastOffsetY","prevOffsetY","overlapped","vectorY","elevationStyle","animatedStyle","useAnimatedStyle","transform","boxShadow","elevation","shadowColor","shadowOffset","shadowRadius","shadowOpacity","indexRef","React","useRef","offsetsRef","onScrollViewChanged","nextIndex","prevIndex","withTiming","duration","savedOffsetY","scrollHandler","useAnimatedScrollHandler","onBeginDrag","onMomentumBegin","onScroll","event","offsetY","contentOffset","y","ty","maxTy","deltaY","dy","min","onEndDrag","onMomentumEnd","threshold","nextTranslateY","hasCollapsible","appBarStyle","paddingTop","top","undefined","floating","scrollContentInsets"],"mappings":"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","sourcesContent":["import React, { useRef } from 'react';\nimport { Falsy, Platform, RegisteredStyle, ScrollViewProps, ViewProps, ViewStyle } from 'react-native';\nimport Animated from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport useAppbarStyles from './useAppbarStyles';\nimport useElevationStyle from './useElevationStyle';\nimport useHeight from './useHeight';\n\ntype WebOnlyStyle = { boxShadow: any };\n\ntype ViewStyleProp = Array<ViewStyle | RegisteredStyle<ViewStyle> | WebOnlyStyle | Falsy>;\n\ntype OnScroll = ScrollViewProps['onScroll'];\n\ntype OnLayoutCallback = ViewProps['onLayout'];\n\nexport interface ContentInsets {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n}\n\nexport interface Options {\n translucent?: boolean;\n shouldTranslateYReset?: boolean;\n}\n\nexport interface CollapsibleAppBar {\n appBarStyle: ViewStyleProp;\n vectorY: Animated.SharedValue<number>;\n onAppBarLayout: OnLayoutCallback;\n onCollapsibleToolbarLayout: OnLayoutCallback;\n onScroll: OnScroll;\n onScrollViewChanged: (index: number) => void;\n scrollContentInsets: ContentInsets;\n}\n\nconst defaultOptions: Required<Options> = {\n translucent: false,\n shouldTranslateYReset: false,\n};\n\nconst ANIMATION_DURATION_MILLIS = 100;\n\nconst SUPPORTS_DRAG_DETECTION = Platform.OS !== 'web';\n\n\nfunction useLargerValueOfLastTwoValues(value: number) {\n const refLatestTwoValues = useRef([0, 0]);\n\n refLatestTwoValues.current.shift();\n refLatestTwoValues.current.push(value);\n\n return Math.max(...refLatestTwoValues.current);\n}\n\n\nexport default function useUnstableCollapsibleAppBar(userOptions: Options = defaultOptions): CollapsibleAppBar {\n const {\n translucent,\n shouldTranslateYReset,\n }: Required<Options> = {\n ...defaultOptions,\n ...userOptions,\n };\n\n const styles = useAppbarStyles();\n\n const safeAreaInsets = useSafeAreaInsets();\n\n const [appBarHeight, onAppBarLayout] = useHeight();\n const appBarMaxHeight = useLargerValueOfLastTwoValues(appBarHeight);\n const [collapsibleToolbarHeight, onCollapsibleToolbarLayout] = useHeight();\n\n const maxTranslateY = Animated.useDerivedValue(() => -collapsibleToolbarHeight);\n\n const translateY = Animated.useSharedValue<number>(0);\n const lastTranslateY = Animated.useSharedValue<number>(0);\n const lastOffsetY = Animated.useSharedValue<number>(0);\n const prevOffsetY = Animated.useSharedValue<number>(0);\n const overlapped = Animated.useSharedValue<boolean>(false);\n const vectorY = Animated.useSharedValue<number>(0);\n\n const elevationStyle = useElevationStyle(4);\n const animatedStyle = Animated.useAnimatedStyle(() => {\n return Platform.OS === 'web' ? ({\n transform: [{ translateY: translateY.value }],\n boxShadow: overlapped.value ? elevationStyle?.boxShadow : 0,\n }) : ({\n transform: [{ translateY: translateY.value }],\n elevation: overlapped.value ? elevationStyle?.elevation : 0,\n shadowColor: elevationStyle?.shadowColor,\n shadowOffset: elevationStyle?.shadowOffset,\n shadowRadius: elevationStyle?.shadowRadius,\n shadowOpacity: overlapped.value ? elevationStyle?.shadowOpacity : 0,\n });\n });\n\n const indexRef = React.useRef<number>(0);\n const offsetsRef = React.useRef<Array<number>>([]);\n\n const onScrollViewChanged = (nextIndex: number) => {\n const prevIndex = indexRef.current;\n if (prevIndex === nextIndex) {\n if (shouldTranslateYReset) {\n translateY.value = Animated.withTiming(0, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n\n vectorY.value = 0;\n offsetsRef.current = [];\n overlapped.value = false;\n }\n\n return;\n }\n\n offsetsRef.current[prevIndex] = lastOffsetY.value;\n\n const savedOffsetY = offsetsRef.current[nextIndex] ?? 0;\n lastOffsetY.value = savedOffsetY;\n\n indexRef.current = nextIndex;\n\n // Determine whether to overlap every time index is changed.\n overlapped.value = savedOffsetY > 0;\n\n // If next ScrollView's offset is too short, expand app bar.\n if (translateY.value < 0 && savedOffsetY < appBarHeight) {\n translateY.value = Animated.withTiming(0, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n\n vectorY.value = 0;\n }\n };\n\n const scrollHandler = Animated.useAnimatedScrollHandler({\n onBeginDrag: () => {\n lastTranslateY.value = translateY.value;\n },\n onMomentumBegin: () => {\n lastTranslateY.value = translateY.value;\n },\n onScroll: (event) => {\n const offsetY = event.contentOffset.y;\n\n const ty = translateY.value;\n const maxTy = maxTranslateY.value;\n\n const deltaY = offsetY - prevOffsetY.value;\n vectorY.value = (vectorY.value * deltaY >= 0 && offsetY > 0) ? vectorY.value + deltaY : deltaY;\n prevOffsetY.value = offsetY;\n\n if (SUPPORTS_DRAG_DETECTION) {\n const dy = offsetY - lastOffsetY.value;\n\n translateY.value = offsetY <= 0 ? 0 : Math.min(Math.max(lastTranslateY.value - dy, maxTy), 0);\n\n overlapped.value = offsetY + translateY.value > 0;\n } else {\n if (offsetY > -maxTy) {\n if (ty === 0) {\n translateY.value = Animated.withTiming(Math.min(Math.max(-offsetY, maxTy), 0), {\n duration: ANIMATION_DURATION_MILLIS,\n });\n }\n } else {\n if (ty === maxTy) {\n translateY.value = Animated.withTiming(0, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n }\n }\n\n overlapped.value = offsetY > 0;\n\n lastOffsetY.value = offsetY;\n }\n },\n onEndDrag: (event) => {\n lastOffsetY.value = event.contentOffset.y;\n },\n onMomentumEnd: (event) => {\n const offsetY = event.contentOffset.y;\n\n lastOffsetY.value = offsetY;\n\n const ty = translateY.value;\n const maxTy = maxTranslateY.value;\n\n // If toolbar is already positioned on edge, do nothing.\n if (ty <= maxTy || ty >= 0) {\n return;\n }\n\n const threshold = maxTy * 0.5;\n\n const nextTranslateY = (ty > threshold || offsetY < appBarHeight) ? 0 : maxTy;\n\n overlapped.value = offsetY + nextTranslateY > 0;\n\n translateY.value = Animated.withTiming(nextTranslateY, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n },\n });\n\n const hasCollapsible = collapsibleToolbarHeight > 0;\n\n const appBarStyle = [\n animatedStyle,\n translucent ? { paddingTop: safeAreaInsets.top } : undefined,\n hasCollapsible ? styles.floating : undefined,\n ];\n\n return {\n appBarStyle,\n vectorY,\n onAppBarLayout,\n onCollapsibleToolbarLayout,\n onScroll: scrollHandler,\n onScrollViewChanged,\n scrollContentInsets: { top: hasCollapsible ? appBarMaxHeight : 0 },\n };\n};\n"]}
1
+ {"version":3,"sources":["useUnstableCollapsibleAppBar.ts"],"names":["defaultOptions","shouldTranslateYReset","ANIMATION_DURATION_MILLIS","SUPPORTS_DRAG_DETECTION","Platform","OS","useLargerValueOfLastTwoValues","value","refLatestTwoValues","current","shift","push","Math","max","useUnstableCollapsibleAppBar","userOptions","styles","safeAreaInsets","appBarHeight","onAppBarLayout","appBarMaxHeight","collapsibleToolbarHeight","onCollapsibleToolbarLayout","maxTranslateY","Animated","useDerivedValue","translateY","useSharedValue","lastTranslateY","lastOffsetY","prevOffsetY","overlapped","vectorY","elevationStyle","animatedStyle","useAnimatedStyle","transform","boxShadow","elevation","shadowColor","shadowOffset","shadowRadius","shadowOpacity","indexRef","React","useRef","offsetsRef","onScrollViewChanged","nextIndex","prevIndex","withTiming","duration","savedOffsetY","scrollHandler","useAnimatedScrollHandler","onBeginDrag","onMomentumBegin","onScroll","event","offsetY","contentOffset","y","ty","maxTy","deltaY","dy","min","onEndDrag","onMomentumEnd","threshold","nextTranslateY","hasCollapsible","appBarStyle","paddingTop","top","floating","undefined","scrollContentInsets"],"mappings":"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","sourcesContent":["import React, { useRef } from 'react';\nimport { Falsy, Platform, RegisteredStyle, ScrollViewProps, ViewProps, ViewStyle } from 'react-native';\nimport Animated from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport useAppbarStyles from './useAppbarStyles';\nimport useElevationStyle from './useElevationStyle';\nimport useHeight from './useHeight';\n\ntype WebOnlyStyle = { boxShadow: any };\n\ntype ViewStyleProp = Array<ViewStyle | RegisteredStyle<ViewStyle> | WebOnlyStyle | Falsy>;\n\ntype OnScroll = ScrollViewProps['onScroll'];\n\ntype OnLayoutCallback = ViewProps['onLayout'];\n\nexport interface ContentInsets {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n}\n\nexport interface Options {\n shouldTranslateYReset?: boolean;\n}\n\nexport interface CollapsibleAppBar {\n appBarStyle: ViewStyleProp;\n vectorY: Animated.SharedValue<number>;\n onAppBarLayout: OnLayoutCallback;\n onCollapsibleToolbarLayout: OnLayoutCallback;\n onScroll: OnScroll;\n onScrollViewChanged: (index: number) => void;\n scrollContentInsets: ContentInsets;\n}\n\nconst defaultOptions: Required<Options> = {\n shouldTranslateYReset: false,\n};\n\nconst ANIMATION_DURATION_MILLIS = 100;\n\nconst SUPPORTS_DRAG_DETECTION = Platform.OS !== 'web';\n\n\nfunction useLargerValueOfLastTwoValues(value: number) {\n const refLatestTwoValues = useRef([0, 0]);\n\n refLatestTwoValues.current.shift();\n refLatestTwoValues.current.push(value);\n\n return Math.max(...refLatestTwoValues.current);\n}\n\n\nexport default function useUnstableCollapsibleAppBar(userOptions: Options = defaultOptions): CollapsibleAppBar {\n const { shouldTranslateYReset }: Required<Options> = {\n ...defaultOptions,\n ...userOptions,\n };\n\n const styles = useAppbarStyles();\n\n const safeAreaInsets = useSafeAreaInsets();\n\n const [appBarHeight, onAppBarLayout] = useHeight();\n const appBarMaxHeight = useLargerValueOfLastTwoValues(appBarHeight);\n const [collapsibleToolbarHeight, onCollapsibleToolbarLayout] = useHeight();\n\n const maxTranslateY = Animated.useDerivedValue(() => -collapsibleToolbarHeight);\n\n const translateY = Animated.useSharedValue<number>(0);\n const lastTranslateY = Animated.useSharedValue<number>(0);\n const lastOffsetY = Animated.useSharedValue<number>(0);\n const prevOffsetY = Animated.useSharedValue<number>(0);\n const overlapped = Animated.useSharedValue<boolean>(false);\n const vectorY = Animated.useSharedValue<number>(0);\n\n const elevationStyle = useElevationStyle(4);\n const animatedStyle = Animated.useAnimatedStyle(() => {\n return Platform.OS === 'web' ? ({\n transform: [{ translateY: translateY.value }],\n boxShadow: overlapped.value ? elevationStyle?.boxShadow : 0,\n }) : ({\n transform: [{ translateY: translateY.value }],\n elevation: overlapped.value ? elevationStyle?.elevation : 0,\n shadowColor: elevationStyle?.shadowColor,\n shadowOffset: elevationStyle?.shadowOffset,\n shadowRadius: elevationStyle?.shadowRadius,\n shadowOpacity: overlapped.value ? elevationStyle?.shadowOpacity : 0,\n });\n });\n\n const indexRef = React.useRef<number>(0);\n const offsetsRef = React.useRef<Array<number>>([]);\n\n const onScrollViewChanged = (nextIndex: number) => {\n const prevIndex = indexRef.current;\n if (prevIndex === nextIndex) {\n if (shouldTranslateYReset) {\n translateY.value = Animated.withTiming(0, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n\n vectorY.value = 0;\n offsetsRef.current = [];\n overlapped.value = false;\n }\n\n return;\n }\n\n offsetsRef.current[prevIndex] = lastOffsetY.value;\n\n const savedOffsetY = offsetsRef.current[nextIndex] ?? 0;\n lastOffsetY.value = savedOffsetY;\n\n indexRef.current = nextIndex;\n\n // Determine whether to overlap every time index is changed.\n overlapped.value = savedOffsetY > 0;\n\n // If next ScrollView's offset is too short, expand app bar.\n if (translateY.value < 0 && savedOffsetY < appBarHeight) {\n translateY.value = Animated.withTiming(0, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n\n vectorY.value = 0;\n }\n };\n\n const scrollHandler = Animated.useAnimatedScrollHandler({\n onBeginDrag: () => {\n lastTranslateY.value = translateY.value;\n },\n onMomentumBegin: () => {\n lastTranslateY.value = translateY.value;\n },\n onScroll: (event) => {\n const offsetY = event.contentOffset.y;\n\n const ty = translateY.value;\n const maxTy = maxTranslateY.value;\n\n const deltaY = offsetY - prevOffsetY.value;\n vectorY.value = (vectorY.value * deltaY >= 0 && offsetY > 0) ? vectorY.value + deltaY : deltaY;\n prevOffsetY.value = offsetY;\n\n if (SUPPORTS_DRAG_DETECTION) {\n const dy = offsetY - lastOffsetY.value;\n\n translateY.value = offsetY <= 0 ? 0 : Math.min(Math.max(lastTranslateY.value - dy, maxTy), 0);\n\n overlapped.value = offsetY + translateY.value > 0;\n } else {\n if (offsetY > -maxTy) {\n if (ty === 0) {\n translateY.value = Animated.withTiming(Math.min(Math.max(-offsetY, maxTy), 0), {\n duration: ANIMATION_DURATION_MILLIS,\n });\n }\n } else {\n if (ty === maxTy) {\n translateY.value = Animated.withTiming(0, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n }\n }\n\n overlapped.value = offsetY > 0;\n\n lastOffsetY.value = offsetY;\n }\n },\n onEndDrag: (event) => {\n lastOffsetY.value = event.contentOffset.y;\n },\n onMomentumEnd: (event) => {\n const offsetY = event.contentOffset.y;\n\n lastOffsetY.value = offsetY;\n\n const ty = translateY.value;\n const maxTy = maxTranslateY.value;\n\n // If toolbar is already positioned on edge, do nothing.\n if (ty <= maxTy || ty >= 0) {\n return;\n }\n\n const threshold = maxTy * 0.5;\n\n const nextTranslateY = (ty > threshold || offsetY < appBarHeight) ? 0 : maxTy;\n\n overlapped.value = offsetY + nextTranslateY > 0;\n\n translateY.value = Animated.withTiming(nextTranslateY, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n },\n });\n\n const hasCollapsible = collapsibleToolbarHeight > 0;\n\n const appBarStyle = [\n animatedStyle,\n { paddingTop: safeAreaInsets.top },\n hasCollapsible ? styles.floating : undefined,\n ];\n\n return {\n appBarStyle,\n vectorY,\n onAppBarLayout,\n onCollapsibleToolbarLayout,\n onScroll: scrollHandler,\n onScrollViewChanged,\n scrollContentInsets: { top: hasCollapsible ? appBarMaxHeight : 0 },\n };\n};\n"]}
@@ -6,7 +6,6 @@ import useAppbarStyles from './useAppbarStyles';
6
6
  import useElevationStyle from './useElevationStyle';
7
7
  import useHeight from './useHeight';
8
8
  const defaultOptions = {
9
- translucent: false,
10
9
  shouldTranslateYReset: false
11
10
  };
12
11
  const ANIMATION_DURATION_MILLIS = 100;
@@ -21,7 +20,6 @@ function useLargerValueOfLastTwoValues(value) {
21
20
 
22
21
  export default function useUnstableCollapsibleAppBar(userOptions = defaultOptions) {
23
22
  const {
24
- translucent,
25
23
  shouldTranslateYReset
26
24
  } = { ...defaultOptions,
27
25
  ...userOptions
@@ -152,9 +150,9 @@ export default function useUnstableCollapsibleAppBar(userOptions = defaultOption
152
150
  }
153
151
  });
154
152
  const hasCollapsible = collapsibleToolbarHeight > 0;
155
- const appBarStyle = [animatedStyle, translucent ? {
153
+ const appBarStyle = [animatedStyle, {
156
154
  paddingTop: safeAreaInsets.top
157
- } : undefined, hasCollapsible ? styles.floating : undefined];
155
+ }, hasCollapsible ? styles.floating : undefined];
158
156
  return {
159
157
  appBarStyle,
160
158
  vectorY,
@@ -1 +1 @@
1
- {"version":3,"sources":["useUnstableCollapsibleAppBar.ts"],"names":["React","useRef","Platform","Animated","useSafeAreaInsets","useAppbarStyles","useElevationStyle","useHeight","defaultOptions","translucent","shouldTranslateYReset","ANIMATION_DURATION_MILLIS","SUPPORTS_DRAG_DETECTION","OS","useLargerValueOfLastTwoValues","value","refLatestTwoValues","current","shift","push","Math","max","useUnstableCollapsibleAppBar","userOptions","styles","safeAreaInsets","appBarHeight","onAppBarLayout","appBarMaxHeight","collapsibleToolbarHeight","onCollapsibleToolbarLayout","maxTranslateY","useDerivedValue","translateY","useSharedValue","lastTranslateY","lastOffsetY","prevOffsetY","overlapped","vectorY","elevationStyle","animatedStyle","useAnimatedStyle","transform","boxShadow","elevation","shadowColor","shadowOffset","shadowRadius","shadowOpacity","indexRef","offsetsRef","onScrollViewChanged","nextIndex","prevIndex","withTiming","duration","savedOffsetY","scrollHandler","useAnimatedScrollHandler","onBeginDrag","onMomentumBegin","onScroll","event","offsetY","contentOffset","y","ty","maxTy","deltaY","dy","min","onEndDrag","onMomentumEnd","threshold","nextTranslateY","hasCollapsible","appBarStyle","paddingTop","top","undefined","floating","scrollContentInsets"],"mappings":"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","sourcesContent":["import React, { useRef } from 'react';\nimport { Falsy, Platform, RegisteredStyle, ScrollViewProps, ViewProps, ViewStyle } from 'react-native';\nimport Animated from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport useAppbarStyles from './useAppbarStyles';\nimport useElevationStyle from './useElevationStyle';\nimport useHeight from './useHeight';\n\ntype WebOnlyStyle = { boxShadow: any };\n\ntype ViewStyleProp = Array<ViewStyle | RegisteredStyle<ViewStyle> | WebOnlyStyle | Falsy>;\n\ntype OnScroll = ScrollViewProps['onScroll'];\n\ntype OnLayoutCallback = ViewProps['onLayout'];\n\nexport interface ContentInsets {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n}\n\nexport interface Options {\n translucent?: boolean;\n shouldTranslateYReset?: boolean;\n}\n\nexport interface CollapsibleAppBar {\n appBarStyle: ViewStyleProp;\n vectorY: Animated.SharedValue<number>;\n onAppBarLayout: OnLayoutCallback;\n onCollapsibleToolbarLayout: OnLayoutCallback;\n onScroll: OnScroll;\n onScrollViewChanged: (index: number) => void;\n scrollContentInsets: ContentInsets;\n}\n\nconst defaultOptions: Required<Options> = {\n translucent: false,\n shouldTranslateYReset: false,\n};\n\nconst ANIMATION_DURATION_MILLIS = 100;\n\nconst SUPPORTS_DRAG_DETECTION = Platform.OS !== 'web';\n\n\nfunction useLargerValueOfLastTwoValues(value: number) {\n const refLatestTwoValues = useRef([0, 0]);\n\n refLatestTwoValues.current.shift();\n refLatestTwoValues.current.push(value);\n\n return Math.max(...refLatestTwoValues.current);\n}\n\n\nexport default function useUnstableCollapsibleAppBar(userOptions: Options = defaultOptions): CollapsibleAppBar {\n const {\n translucent,\n shouldTranslateYReset,\n }: Required<Options> = {\n ...defaultOptions,\n ...userOptions,\n };\n\n const styles = useAppbarStyles();\n\n const safeAreaInsets = useSafeAreaInsets();\n\n const [appBarHeight, onAppBarLayout] = useHeight();\n const appBarMaxHeight = useLargerValueOfLastTwoValues(appBarHeight);\n const [collapsibleToolbarHeight, onCollapsibleToolbarLayout] = useHeight();\n\n const maxTranslateY = Animated.useDerivedValue(() => -collapsibleToolbarHeight);\n\n const translateY = Animated.useSharedValue<number>(0);\n const lastTranslateY = Animated.useSharedValue<number>(0);\n const lastOffsetY = Animated.useSharedValue<number>(0);\n const prevOffsetY = Animated.useSharedValue<number>(0);\n const overlapped = Animated.useSharedValue<boolean>(false);\n const vectorY = Animated.useSharedValue<number>(0);\n\n const elevationStyle = useElevationStyle(4);\n const animatedStyle = Animated.useAnimatedStyle(() => {\n return Platform.OS === 'web' ? ({\n transform: [{ translateY: translateY.value }],\n boxShadow: overlapped.value ? elevationStyle?.boxShadow : 0,\n }) : ({\n transform: [{ translateY: translateY.value }],\n elevation: overlapped.value ? elevationStyle?.elevation : 0,\n shadowColor: elevationStyle?.shadowColor,\n shadowOffset: elevationStyle?.shadowOffset,\n shadowRadius: elevationStyle?.shadowRadius,\n shadowOpacity: overlapped.value ? elevationStyle?.shadowOpacity : 0,\n });\n });\n\n const indexRef = React.useRef<number>(0);\n const offsetsRef = React.useRef<Array<number>>([]);\n\n const onScrollViewChanged = (nextIndex: number) => {\n const prevIndex = indexRef.current;\n if (prevIndex === nextIndex) {\n if (shouldTranslateYReset) {\n translateY.value = Animated.withTiming(0, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n\n vectorY.value = 0;\n offsetsRef.current = [];\n overlapped.value = false;\n }\n\n return;\n }\n\n offsetsRef.current[prevIndex] = lastOffsetY.value;\n\n const savedOffsetY = offsetsRef.current[nextIndex] ?? 0;\n lastOffsetY.value = savedOffsetY;\n\n indexRef.current = nextIndex;\n\n // Determine whether to overlap every time index is changed.\n overlapped.value = savedOffsetY > 0;\n\n // If next ScrollView's offset is too short, expand app bar.\n if (translateY.value < 0 && savedOffsetY < appBarHeight) {\n translateY.value = Animated.withTiming(0, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n\n vectorY.value = 0;\n }\n };\n\n const scrollHandler = Animated.useAnimatedScrollHandler({\n onBeginDrag: () => {\n lastTranslateY.value = translateY.value;\n },\n onMomentumBegin: () => {\n lastTranslateY.value = translateY.value;\n },\n onScroll: (event) => {\n const offsetY = event.contentOffset.y;\n\n const ty = translateY.value;\n const maxTy = maxTranslateY.value;\n\n const deltaY = offsetY - prevOffsetY.value;\n vectorY.value = (vectorY.value * deltaY >= 0 && offsetY > 0) ? vectorY.value + deltaY : deltaY;\n prevOffsetY.value = offsetY;\n\n if (SUPPORTS_DRAG_DETECTION) {\n const dy = offsetY - lastOffsetY.value;\n\n translateY.value = offsetY <= 0 ? 0 : Math.min(Math.max(lastTranslateY.value - dy, maxTy), 0);\n\n overlapped.value = offsetY + translateY.value > 0;\n } else {\n if (offsetY > -maxTy) {\n if (ty === 0) {\n translateY.value = Animated.withTiming(Math.min(Math.max(-offsetY, maxTy), 0), {\n duration: ANIMATION_DURATION_MILLIS,\n });\n }\n } else {\n if (ty === maxTy) {\n translateY.value = Animated.withTiming(0, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n }\n }\n\n overlapped.value = offsetY > 0;\n\n lastOffsetY.value = offsetY;\n }\n },\n onEndDrag: (event) => {\n lastOffsetY.value = event.contentOffset.y;\n },\n onMomentumEnd: (event) => {\n const offsetY = event.contentOffset.y;\n\n lastOffsetY.value = offsetY;\n\n const ty = translateY.value;\n const maxTy = maxTranslateY.value;\n\n // If toolbar is already positioned on edge, do nothing.\n if (ty <= maxTy || ty >= 0) {\n return;\n }\n\n const threshold = maxTy * 0.5;\n\n const nextTranslateY = (ty > threshold || offsetY < appBarHeight) ? 0 : maxTy;\n\n overlapped.value = offsetY + nextTranslateY > 0;\n\n translateY.value = Animated.withTiming(nextTranslateY, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n },\n });\n\n const hasCollapsible = collapsibleToolbarHeight > 0;\n\n const appBarStyle = [\n animatedStyle,\n translucent ? { paddingTop: safeAreaInsets.top } : undefined,\n hasCollapsible ? styles.floating : undefined,\n ];\n\n return {\n appBarStyle,\n vectorY,\n onAppBarLayout,\n onCollapsibleToolbarLayout,\n onScroll: scrollHandler,\n onScrollViewChanged,\n scrollContentInsets: { top: hasCollapsible ? appBarMaxHeight : 0 },\n };\n};\n"]}
1
+ {"version":3,"sources":["useUnstableCollapsibleAppBar.ts"],"names":["React","useRef","Platform","Animated","useSafeAreaInsets","useAppbarStyles","useElevationStyle","useHeight","defaultOptions","shouldTranslateYReset","ANIMATION_DURATION_MILLIS","SUPPORTS_DRAG_DETECTION","OS","useLargerValueOfLastTwoValues","value","refLatestTwoValues","current","shift","push","Math","max","useUnstableCollapsibleAppBar","userOptions","styles","safeAreaInsets","appBarHeight","onAppBarLayout","appBarMaxHeight","collapsibleToolbarHeight","onCollapsibleToolbarLayout","maxTranslateY","useDerivedValue","translateY","useSharedValue","lastTranslateY","lastOffsetY","prevOffsetY","overlapped","vectorY","elevationStyle","animatedStyle","useAnimatedStyle","transform","boxShadow","elevation","shadowColor","shadowOffset","shadowRadius","shadowOpacity","indexRef","offsetsRef","onScrollViewChanged","nextIndex","prevIndex","withTiming","duration","savedOffsetY","scrollHandler","useAnimatedScrollHandler","onBeginDrag","onMomentumBegin","onScroll","event","offsetY","contentOffset","y","ty","maxTy","deltaY","dy","min","onEndDrag","onMomentumEnd","threshold","nextTranslateY","hasCollapsible","appBarStyle","paddingTop","top","floating","undefined","scrollContentInsets"],"mappings":"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","sourcesContent":["import React, { useRef } from 'react';\nimport { Falsy, Platform, RegisteredStyle, ScrollViewProps, ViewProps, ViewStyle } from 'react-native';\nimport Animated from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport useAppbarStyles from './useAppbarStyles';\nimport useElevationStyle from './useElevationStyle';\nimport useHeight from './useHeight';\n\ntype WebOnlyStyle = { boxShadow: any };\n\ntype ViewStyleProp = Array<ViewStyle | RegisteredStyle<ViewStyle> | WebOnlyStyle | Falsy>;\n\ntype OnScroll = ScrollViewProps['onScroll'];\n\ntype OnLayoutCallback = ViewProps['onLayout'];\n\nexport interface ContentInsets {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n}\n\nexport interface Options {\n shouldTranslateYReset?: boolean;\n}\n\nexport interface CollapsibleAppBar {\n appBarStyle: ViewStyleProp;\n vectorY: Animated.SharedValue<number>;\n onAppBarLayout: OnLayoutCallback;\n onCollapsibleToolbarLayout: OnLayoutCallback;\n onScroll: OnScroll;\n onScrollViewChanged: (index: number) => void;\n scrollContentInsets: ContentInsets;\n}\n\nconst defaultOptions: Required<Options> = {\n shouldTranslateYReset: false,\n};\n\nconst ANIMATION_DURATION_MILLIS = 100;\n\nconst SUPPORTS_DRAG_DETECTION = Platform.OS !== 'web';\n\n\nfunction useLargerValueOfLastTwoValues(value: number) {\n const refLatestTwoValues = useRef([0, 0]);\n\n refLatestTwoValues.current.shift();\n refLatestTwoValues.current.push(value);\n\n return Math.max(...refLatestTwoValues.current);\n}\n\n\nexport default function useUnstableCollapsibleAppBar(userOptions: Options = defaultOptions): CollapsibleAppBar {\n const { shouldTranslateYReset }: Required<Options> = {\n ...defaultOptions,\n ...userOptions,\n };\n\n const styles = useAppbarStyles();\n\n const safeAreaInsets = useSafeAreaInsets();\n\n const [appBarHeight, onAppBarLayout] = useHeight();\n const appBarMaxHeight = useLargerValueOfLastTwoValues(appBarHeight);\n const [collapsibleToolbarHeight, onCollapsibleToolbarLayout] = useHeight();\n\n const maxTranslateY = Animated.useDerivedValue(() => -collapsibleToolbarHeight);\n\n const translateY = Animated.useSharedValue<number>(0);\n const lastTranslateY = Animated.useSharedValue<number>(0);\n const lastOffsetY = Animated.useSharedValue<number>(0);\n const prevOffsetY = Animated.useSharedValue<number>(0);\n const overlapped = Animated.useSharedValue<boolean>(false);\n const vectorY = Animated.useSharedValue<number>(0);\n\n const elevationStyle = useElevationStyle(4);\n const animatedStyle = Animated.useAnimatedStyle(() => {\n return Platform.OS === 'web' ? ({\n transform: [{ translateY: translateY.value }],\n boxShadow: overlapped.value ? elevationStyle?.boxShadow : 0,\n }) : ({\n transform: [{ translateY: translateY.value }],\n elevation: overlapped.value ? elevationStyle?.elevation : 0,\n shadowColor: elevationStyle?.shadowColor,\n shadowOffset: elevationStyle?.shadowOffset,\n shadowRadius: elevationStyle?.shadowRadius,\n shadowOpacity: overlapped.value ? elevationStyle?.shadowOpacity : 0,\n });\n });\n\n const indexRef = React.useRef<number>(0);\n const offsetsRef = React.useRef<Array<number>>([]);\n\n const onScrollViewChanged = (nextIndex: number) => {\n const prevIndex = indexRef.current;\n if (prevIndex === nextIndex) {\n if (shouldTranslateYReset) {\n translateY.value = Animated.withTiming(0, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n\n vectorY.value = 0;\n offsetsRef.current = [];\n overlapped.value = false;\n }\n\n return;\n }\n\n offsetsRef.current[prevIndex] = lastOffsetY.value;\n\n const savedOffsetY = offsetsRef.current[nextIndex] ?? 0;\n lastOffsetY.value = savedOffsetY;\n\n indexRef.current = nextIndex;\n\n // Determine whether to overlap every time index is changed.\n overlapped.value = savedOffsetY > 0;\n\n // If next ScrollView's offset is too short, expand app bar.\n if (translateY.value < 0 && savedOffsetY < appBarHeight) {\n translateY.value = Animated.withTiming(0, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n\n vectorY.value = 0;\n }\n };\n\n const scrollHandler = Animated.useAnimatedScrollHandler({\n onBeginDrag: () => {\n lastTranslateY.value = translateY.value;\n },\n onMomentumBegin: () => {\n lastTranslateY.value = translateY.value;\n },\n onScroll: (event) => {\n const offsetY = event.contentOffset.y;\n\n const ty = translateY.value;\n const maxTy = maxTranslateY.value;\n\n const deltaY = offsetY - prevOffsetY.value;\n vectorY.value = (vectorY.value * deltaY >= 0 && offsetY > 0) ? vectorY.value + deltaY : deltaY;\n prevOffsetY.value = offsetY;\n\n if (SUPPORTS_DRAG_DETECTION) {\n const dy = offsetY - lastOffsetY.value;\n\n translateY.value = offsetY <= 0 ? 0 : Math.min(Math.max(lastTranslateY.value - dy, maxTy), 0);\n\n overlapped.value = offsetY + translateY.value > 0;\n } else {\n if (offsetY > -maxTy) {\n if (ty === 0) {\n translateY.value = Animated.withTiming(Math.min(Math.max(-offsetY, maxTy), 0), {\n duration: ANIMATION_DURATION_MILLIS,\n });\n }\n } else {\n if (ty === maxTy) {\n translateY.value = Animated.withTiming(0, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n }\n }\n\n overlapped.value = offsetY > 0;\n\n lastOffsetY.value = offsetY;\n }\n },\n onEndDrag: (event) => {\n lastOffsetY.value = event.contentOffset.y;\n },\n onMomentumEnd: (event) => {\n const offsetY = event.contentOffset.y;\n\n lastOffsetY.value = offsetY;\n\n const ty = translateY.value;\n const maxTy = maxTranslateY.value;\n\n // If toolbar is already positioned on edge, do nothing.\n if (ty <= maxTy || ty >= 0) {\n return;\n }\n\n const threshold = maxTy * 0.5;\n\n const nextTranslateY = (ty > threshold || offsetY < appBarHeight) ? 0 : maxTy;\n\n overlapped.value = offsetY + nextTranslateY > 0;\n\n translateY.value = Animated.withTiming(nextTranslateY, {\n duration: ANIMATION_DURATION_MILLIS,\n });\n },\n });\n\n const hasCollapsible = collapsibleToolbarHeight > 0;\n\n const appBarStyle = [\n animatedStyle,\n { paddingTop: safeAreaInsets.top },\n hasCollapsible ? styles.floating : undefined,\n ];\n\n return {\n appBarStyle,\n vectorY,\n onAppBarLayout,\n onCollapsibleToolbarLayout,\n onScroll: scrollHandler,\n onScrollViewChanged,\n scrollContentInsets: { top: hasCollapsible ? appBarMaxHeight : 0 },\n };\n};\n"]}
@@ -13,7 +13,6 @@ export interface ContentInsets {
13
13
  right?: number;
14
14
  }
15
15
  export interface Options {
16
- translucent?: boolean;
17
16
  shouldTranslateYReset?: boolean;
18
17
  }
19
18
  export interface CollapsibleAppBar {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fountain-ui/lab",
3
- "version": "2.0.0-beta.5",
3
+ "version": "2.0.0-beta.6",
4
4
  "private": false,
5
5
  "author": "Fountain-UI Team",
6
6
  "description": "Incubator for Fountain-UI React components.",
@@ -17,7 +17,7 @@
17
17
  "dependencies": {
18
18
  "@emotion/react": "^11.4.1",
19
19
  "@emotion/styled": "^11.0.0",
20
- "@fountain-ui/icons": "^2.0.0-beta.5",
20
+ "@fountain-ui/icons": "^2.0.0-beta.6",
21
21
  "@fountain-ui/utils": "^2.0.0-beta.3",
22
22
  "react-native-calendars": "1.1267.0"
23
23
  },
@@ -84,5 +84,5 @@
84
84
  "publishConfig": {
85
85
  "access": "public"
86
86
  },
87
- "gitHead": "5ff7454430142fbdfc2f57a71ad1de83768dd0ec"
87
+ "gitHead": "10ec965daab032df7f6e7e09f793de59b9b5f787"
88
88
  }
@@ -22,7 +22,6 @@ export interface ContentInsets {
22
22
  }
23
23
 
24
24
  export interface Options {
25
- translucent?: boolean;
26
25
  shouldTranslateYReset?: boolean;
27
26
  }
28
27
 
@@ -37,7 +36,6 @@ export interface CollapsibleAppBar {
37
36
  }
38
37
 
39
38
  const defaultOptions: Required<Options> = {
40
- translucent: false,
41
39
  shouldTranslateYReset: false,
42
40
  };
43
41
 
@@ -57,10 +55,7 @@ function useLargerValueOfLastTwoValues(value: number) {
57
55
 
58
56
 
59
57
  export default function useUnstableCollapsibleAppBar(userOptions: Options = defaultOptions): CollapsibleAppBar {
60
- const {
61
- translucent,
62
- shouldTranslateYReset,
63
- }: Required<Options> = {
58
+ const { shouldTranslateYReset }: Required<Options> = {
64
59
  ...defaultOptions,
65
60
  ...userOptions,
66
61
  };
@@ -211,7 +206,7 @@ export default function useUnstableCollapsibleAppBar(userOptions: Options = defa
211
206
 
212
207
  const appBarStyle = [
213
208
  animatedStyle,
214
- translucent ? { paddingTop: safeAreaInsets.top } : undefined,
209
+ { paddingTop: safeAreaInsets.top },
215
210
  hasCollapsible ? styles.floating : undefined,
216
211
  ];
217
212