about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authordan <dan.abramov@gmail.com>2024-12-13 18:20:48 +0000
committerGitHub <noreply@github.com>2024-12-13 18:20:48 +0000
commitf6aecf5c28c849690d5054282f87eeb21bfb79a9 (patch)
treee5e1dca3388ffe92419b2c481238bbdcf41ddc00 /src
parent41228dce19c43d606f0e2c84b993de6bca5f8fff (diff)
downloadvoidsky-f6aecf5c28c849690d5054282f87eeb21bfb79a9.tar.zst
Give minWidth to tab indicator only (#7095)
Diffstat (limited to 'src')
-rw-r--r--src/view/com/pager/TabBar.tsx18
-rw-r--r--src/view/com/pager/TabBar.web.tsx39
2 files changed, 43 insertions, 14 deletions
diff --git a/src/view/com/pager/TabBar.tsx b/src/view/com/pager/TabBar.tsx
index b257559bc..8e89b9c1f 100644
--- a/src/view/com/pager/TabBar.tsx
+++ b/src/view/com/pager/TabBar.tsx
@@ -237,12 +237,25 @@ export function TabBar({
         opacity: 0,
       }
     }
+
+    function getScaleX(index: number) {
+      const textWidth = textLayoutsValue[index].width
+      const itemWidth = layoutsValue[index].width
+      const minIndicatorWidth = 45
+      const maxIndicatorWidth = itemWidth - 2 * CONTENT_PADDING
+      const indicatorWidth = Math.min(
+        Math.max(minIndicatorWidth, textWidth),
+        maxIndicatorWidth,
+      )
+      return indicatorWidth / contentSize.get()
+    }
+
     if (textLayoutsValue.length === 1) {
       return {
         opacity: 1,
         transform: [
           {
-            scaleX: textLayoutsValue[0].width / contentSize.get(),
+            scaleX: getScaleX(0),
           },
         ],
       }
@@ -261,7 +274,7 @@ export function TabBar({
           scaleX: interpolate(
             dragProgress.get(),
             textLayoutsValue.map((l, i) => i),
-            textLayoutsValue.map(l => l.width / contentSize.get()),
+            textLayoutsValue.map((l, i) => getScaleX(i)),
           ),
         },
       ],
@@ -429,7 +442,6 @@ const styles = StyleSheet.create({
   },
   itemText: {
     lineHeight: 20,
-    minWidth: 45,
     textAlign: 'center',
   },
   outerBottomBorder: {
diff --git a/src/view/com/pager/TabBar.web.tsx b/src/view/com/pager/TabBar.web.tsx
index c83889432..cabd955f0 100644
--- a/src/view/com/pager/TabBar.web.tsx
+++ b/src/view/com/pager/TabBar.web.tsx
@@ -25,16 +25,12 @@ export function TabBar({
   testID,
   selectedPage,
   items,
-  indicatorColor,
   onSelect,
   onPressSelected,
 }: TabBarProps) {
   const t = useTheme()
   const scrollElRef = useRef<ScrollView>(null)
   const itemRefs = useRef<Array<Element>>([])
-  const indicatorStyle = {
-    borderBottomColor: indicatorColor || t.palette.primary_500,
-  }
   const {gtMobile} = useBreakpoints()
   const styles = gtMobile ? desktopStyles : mobileStyles
 
@@ -122,12 +118,19 @@ export function TabBar({
                   style={[
                     styles.itemText,
                     selected ? t.atoms.text : t.atoms.text_contrast_medium,
-                    selected && indicatorStyle,
                     a.text_md,
                     a.font_bold,
                     {lineHeight: 20},
                   ]}>
                   {item}
+                  <View
+                    style={[
+                      styles.itemIndicator,
+                      selected && {
+                        backgroundColor: t.palette.primary_500,
+                      },
+                    ]}
+                  />
                 </Text>
               </View>
             </PressableWithHover>
@@ -158,13 +161,20 @@ const desktopStyles = StyleSheet.create({
   },
   itemInner: {
     alignItems: 'center',
+    overflowX: 'hidden',
   },
   itemText: {
     textAlign: 'center',
+    paddingBottom: 10 + 3,
+  },
+  itemIndicator: {
+    position: 'absolute',
+    bottom: 0,
+    height: 3,
+    left: '50%',
+    transform: 'translateX(-50%)',
     minWidth: 45,
-    paddingBottom: 12,
-    borderBottomWidth: 3,
-    borderBottomColor: 'transparent',
+    width: '100%',
   },
   outerBottomBorder: {
     position: 'absolute',
@@ -194,13 +204,20 @@ const mobileStyles = StyleSheet.create({
   itemInner: {
     flexGrow: 1,
     alignItems: 'center',
+    overflowX: 'hidden',
   },
   itemText: {
     textAlign: 'center',
+    paddingBottom: 10 + 3,
+  },
+  itemIndicator: {
+    position: 'absolute',
+    bottom: 0,
+    height: 3,
+    left: '50%',
+    transform: 'translateX(-50%)',
     minWidth: 45,
-    paddingBottom: 10,
-    borderBottomWidth: 3,
-    borderBottomColor: 'transparent',
+    width: '100%',
   },
   outerBottomBorder: {
     position: 'absolute',