diff --git a/apps/desktop/src/renderer/src/modules/entry-column/templates/list-item-template.tsx b/apps/desktop/src/renderer/src/modules/entry-column/templates/list-item-template.tsx
index 07102e73c..835565a9e 100644
--- a/apps/desktop/src/renderer/src/modules/entry-column/templates/list-item-template.tsx
+++ b/apps/desktop/src/renderer/src/modules/entry-column/templates/list-item-template.tsx
@@ -304,7 +304,7 @@ function AudioCover({
/>
diff --git a/apps/desktop/src/renderer/src/modules/entry-content/header.electron.tsx b/apps/desktop/src/renderer/src/modules/entry-content/header.electron.tsx
index 8b12b8915..023e878a8 100644
--- a/apps/desktop/src/renderer/src/modules/entry-content/header.electron.tsx
+++ b/apps/desktop/src/renderer/src/modules/entry-content/header.electron.tsx
@@ -35,7 +35,7 @@ function EntryHeaderImpl({ view, entryId, className, compact }: EntryHeaderProps
{!hideRecentReader && (
diff --git a/apps/desktop/src/renderer/src/modules/settings/control.tsx b/apps/desktop/src/renderer/src/modules/settings/control.tsx
index 6156e0ac2..330b32337 100644
--- a/apps/desktop/src/renderer/src/modules/settings/control.tsx
+++ b/apps/desktop/src/renderer/src/modules/settings/control.tsx
@@ -105,9 +105,7 @@ export const SettingTabbedSegment: Component<{
}
export const SettingDescription: Component = ({ children, className }) => (
-
- {children}
-
+
{children}
)
export const SettingActionItem = ({
diff --git a/apps/desktop/src/renderer/src/modules/settings/helper/EnhancedIndicator.tsx b/apps/desktop/src/renderer/src/modules/settings/helper/EnhancedIndicator.tsx
index efabc30fa..129a20002 100644
--- a/apps/desktop/src/renderer/src/modules/settings/helper/EnhancedIndicator.tsx
+++ b/apps/desktop/src/renderer/src/modules/settings/helper/EnhancedIndicator.tsx
@@ -1,3 +1,4 @@
+import { RootPortal } from "@follow/components/ui/portal/index.js"
import { Tooltip, TooltipContent, TooltipTrigger } from "@follow/components/ui/tooltip/index.js"
import { useTranslation } from "react-i18next"
@@ -18,13 +19,15 @@ export const EnhancedSettingsIndicator = () => {
)}
-
- {enhancedSettings ? (
- {t("general.enhanced.enabled.tip")}
- ) : (
- {t("general.enhanced.disabled.tip")}
- )}
-
+
+
+ {enhancedSettings ? (
+ {t("general.enhanced.enabled.tip")}
+ ) : (
+ {t("general.enhanced.disabled.tip")}
+ )}
+
+
)
}
diff --git a/apps/desktop/src/renderer/src/modules/settings/helper/SyncIndicator.tsx b/apps/desktop/src/renderer/src/modules/settings/helper/SyncIndicator.tsx
index 97d88b413..2a46375d9 100644
--- a/apps/desktop/src/renderer/src/modules/settings/helper/SyncIndicator.tsx
+++ b/apps/desktop/src/renderer/src/modules/settings/helper/SyncIndicator.tsx
@@ -1,6 +1,7 @@
import { PhCloudCheck } from "@follow/components/icons/PhCloudCheck.jsx"
import { PhCloudWarning } from "@follow/components/icons/PhCloudWarning.jsx"
import { PhCloudX } from "@follow/components/icons/PhCloudX.jsx"
+import { RootPortal } from "@follow/components/ui/portal/index.js"
import { Tooltip, TooltipContent, TooltipTrigger } from "@follow/components/ui/tooltip/index.jsx"
import { useIsOnline } from "@follow/hooks"
import { useEffect, useMemo, useRef } from "react"
@@ -64,9 +65,11 @@ export const SettingSyncIndicator = () => {
-
- {metaInfo.text}
-
+
+
+ {metaInfo.text}
+
+
)
}
diff --git a/apps/mobile/native/ios/Modules/PagerView/EnhancePagerViewModule.swift b/apps/mobile/native/ios/Modules/PagerView/EnhancePagerViewModule.swift
index bb628a753..07232aa2e 100644
--- a/apps/mobile/native/ios/Modules/PagerView/EnhancePagerViewModule.swift
+++ b/apps/mobile/native/ios/Modules/PagerView/EnhancePagerViewModule.swift
@@ -8,172 +8,177 @@
import ExpoModulesCore
public class EnhancePagerViewModule: Module {
- public func definition() -> ModuleDefinition {
- Name("EnhancePagerView")
+ public func definition() -> ModuleDefinition {
+ Name("EnhancePagerView")
- View(EnhancePagerView.self) {
- OnViewDidUpdateProps { view in
- view.initialize()
- }
+ View(EnhancePagerView.self) {
+ OnViewDidUpdateProps { view in
+ view.initialize()
+ }
- Prop("page") { (view: EnhancePagerView, index: Int) in
- view.page = index
- }
+ Prop("page") { (view: EnhancePagerView, index: Int) in
+ view.page = index
+ }
- Prop("initialPageIndex") { (view: EnhancePagerView, index: Int) in
- view.initialPageIndex = index
- }
+ Prop("initialPageIndex") { (view: EnhancePagerView, index: Int) in
+ view.initialPageIndex = index
+ }
- Prop("transitionStyle") { (view: EnhancePagerView, style: TransitionStyle?) in
- guard let style = style else { return }
- view.transitionStyle = style
- }
+ Prop("transitionStyle") { (view: EnhancePagerView, style: TransitionStyle?) in
+ guard let style = style else { return }
+ view.transitionStyle = style
+ }
- AsyncFunction("setPage") { (view: EnhancePagerView, index: Int) in
- view.pageController?.setCurrentPage(index: index)
- }
+ AsyncFunction("setPage") { (view: EnhancePagerView, index: Int) in
+ view.pageController?.setCurrentPage(index: index)
+ }
- AsyncFunction("getCurrentPage") { view in
- view.pageController?.getCurrentPageIndex()
- }
+ AsyncFunction("getCurrentPage") { view in
+ view.pageController?.getCurrentPageIndex()
+ }
- AsyncFunction("getState") { view -> String? in
- if let pageController = view.pageController {
- return pageController.getState().rawValue
- }
- return nil
- }
-
- Events("onPageChange")
- Events("onScroll")
- Events("onScrollBegin")
- Events("onScrollEnd")
- Events("onPageWillAppear")
+ AsyncFunction("getState") { view -> String? in
+ if let pageController = view.pageController {
+ return pageController.getState().rawValue
}
+ return nil
+ }
+
+ Events("onPageChange")
+ Events("onScroll")
+ Events("onScrollBegin")
+ Events("onScrollEnd")
+ Events("onPageWillAppear")
}
+ }
}
enum TransitionStyle: String, Enumerable {
- case scroll
- case pageCurl
- func toUIPageViewControllerTransitionStyle() -> UIPageViewController.TransitionStyle {
- switch self {
- case .scroll:
- return .scroll
- case .pageCurl:
- return .pageCurl
- }
+ case scroll
+ case pageCurl
+ func toUIPageViewControllerTransitionStyle() -> UIPageViewController.TransitionStyle {
+ switch self {
+ case .scroll:
+ return .scroll
+ case .pageCurl:
+ return .pageCurl
}
+ }
}
private class EnhancePagerView: ExpoView, UIGestureRecognizerDelegate {
- fileprivate var pageController: EnhancePagerController?
+ fileprivate var pageController: EnhancePagerController?
- private let onScroll = EventDispatcher()
- private let onScrollBegin = EventDispatcher()
- private let onScrollEnd = EventDispatcher()
- private let onPageChange = EventDispatcher()
- private let onPageWillAppear = EventDispatcher()
+ private let onScroll = EventDispatcher()
+ private let onScrollBegin = EventDispatcher()
+ private let onScrollEnd = EventDispatcher()
+ private let onPageChange = EventDispatcher()
+ private let onPageWillAppear = EventDispatcher()
- private var pageViews: [UIView] = []
+ private var touchHandler: RCTTouchHandler?
- required init(appContext: AppContext? = nil) {
- super.init(appContext: appContext)
+ private var pageViews: [UIView] = []
+
+ required init(appContext: AppContext? = nil) {
+ super.init(appContext: appContext)
+ touchHandler = RCTTouchHandler(bridge: appContext?.reactBridge)
+ }
+
+ override func insertSubview(_ view: UIView, at index: Int) {
+ touchHandler?.attach(to: view)
+ pageViews.insert(view, at: index)
+ pageController?.insertPageView(view: view)
+ }
+
+ func willRemoveSubview(_ subview: UIView, at index: Int) {
+ touchHandler?.detach(from: subview)
+ pageViews.remove(at: index)
+ pageController?.removePageView(at: index)
+ }
+
+ // Props
+ var page: Int = 0 {
+ willSet {
+ pageController?.setCurrentPage(index: newValue)
+ }
+ }
+
+ var initialPageIndex: Int = 0
+
+ var pageGap = 20
+ var transitionStyle: TransitionStyle = .scroll
+ var panGestureRecognizer: UIGestureRecognizer?
+ func initialize() {
+ let panGestureRecognizer = UIPanGestureRecognizer()
+ panGestureRecognizer.delegate = self
+ self.panGestureRecognizer = panGestureRecognizer
+ addGestureRecognizer(panGestureRecognizer)
+
+ pageController = EnhancePagerController(
+ pageViews: pageViews, initialPageIndex: initialPageIndex,
+ transitionStyle: transitionStyle.toUIPageViewControllerTransitionStyle(),
+ options: [
+ .interPageSpacing: pageGap
+ ])
+ guard let pageController = pageController else { return }
+ addSubview(pageController.view)
+ pageController.view.snp.makeConstraints { make in
+ make.edges.equalToSuperview()
}
- override func insertSubview(_ view: UIView, at index: Int) {
- pageViews.insert(view, at: index)
- pageController?.insertPageView(view: view)
+ pageController.onPageIndexChange = { [weak self] index in
+ self?.onPageChange(["index": index])
+ }
+ pageController.onScrollStart = { [weak self] index in
+ self?.onScrollBegin(["index": index])
+ }
+ pageController.onScroll = { [weak self] percent, direction in
+ self?.onScroll(["percent": percent, "direction": direction.rawValue])
+ }
+ pageController.onScrollEnd = { [weak self] index in
+ self?.onScrollEnd(["index": index])
+ }
+ pageController.onPageWillAppear = { [weak self] index in
+ self?.onPageWillAppear(["index": index])
+ }
+ }
+
+ #if RCT_NEW_ARCH_ENABLED
+ override func mountChildComponentView(_ childComponentView: UIView, index: Int) {
+ if childComponentView is EnhancePageView {
+ insertSubview(childComponentView, at: index)
+ }
}
- func willRemoveSubview(_ subview: UIView, at index: Int) {
- pageViews.remove(at: index)
- pageController?.removePageView(at: index)
+ override func unmountChildComponentView(_ childComponentView: UIView, index: Int) {
+ if childComponentView is EnhancePageView {
+ willRemoveSubview(childComponentView, at: index)
+ }
+ }
+ #endif
+
+ func gestureRecognizer(
+ _ gestureRecognizer: UIGestureRecognizer,
+ shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer
+ ) -> Bool {
+ guard let pageController = pageController else { return false }
+ let currentIndex = pageController.getCurrentPageIndex()
+ guard let scrollView = pageController.scrollView else { return false }
+ if gestureRecognizer == panGestureRecognizer,
+ NSStringFromClass(type(of: otherGestureRecognizer)) == "RNSPanGestureRecognizer"
+ {
+ if let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer {
+ let velocity = panGestureRecognizer.velocity(in: self)
+ let isLTR = true
+ let isBackGesture = (isLTR && velocity.x > 0) || (!isLTR && velocity.x < 0)
+
+ if currentIndex == 0 && isBackGesture {
+ scrollView.panGestureRecognizer.isEnabled = false
+ }
+ }
+ return true
}
- // Props
- var page: Int = 0 {
- willSet {
- pageController?.setCurrentPage(index: newValue)
- }
- }
-
- var initialPageIndex: Int = 0
-
- var pageGap = 20
- var transitionStyle: TransitionStyle = .scroll
- var panGestureRecognizer: UIGestureRecognizer?
- func initialize() {
- let panGestureRecognizer = UIPanGestureRecognizer()
- panGestureRecognizer.delegate = self
- self.panGestureRecognizer = panGestureRecognizer
- addGestureRecognizer(panGestureRecognizer)
-
- pageController = EnhancePagerController(
- pageViews: pageViews, initialPageIndex: initialPageIndex,
- transitionStyle: transitionStyle.toUIPageViewControllerTransitionStyle(),
- options: [
- .interPageSpacing: pageGap
- ])
- guard let pageController = pageController else { return }
- addSubview(pageController.view)
- pageController.view.snp.makeConstraints { make in
- make.edges.equalToSuperview()
- }
-
- pageController.onPageIndexChange = { [weak self] index in
- self?.onPageChange(["index": index])
- }
- pageController.onScrollStart = { [weak self] index in
- self?.onScrollBegin(["index": index])
- }
- pageController.onScroll = { [weak self] percent, direction in
- self?.onScroll(["percent": percent, "direction": direction.rawValue])
- }
- pageController.onScrollEnd = { [weak self] index in
- self?.onScrollEnd(["index": index])
- }
- pageController.onPageWillAppear = { [weak self] index in
- self?.onPageWillAppear(["index": index])
- }
- }
-
- #if RCT_NEW_ARCH_ENABLED
- override func mountChildComponentView(_ childComponentView: UIView, index: Int) {
- if childComponentView is EnhancePageView {
- insertSubview(childComponentView, at: index)
- }
- }
-
- override func unmountChildComponentView(_ childComponentView: UIView, index: Int) {
- if childComponentView is EnhancePageView {
- willRemoveSubview(childComponentView, at: index)
- }
- }
- #endif
-
- func gestureRecognizer(
- _ gestureRecognizer: UIGestureRecognizer,
- shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer
- ) -> Bool {
- guard let pageController = pageController else { return false }
- let currentIndex = pageController.getCurrentPageIndex()
- guard let scrollView = pageController.scrollView else { return false }
- if gestureRecognizer == panGestureRecognizer,
- NSStringFromClass(type(of: otherGestureRecognizer)) == "RNSPanGestureRecognizer"
- {
- if let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer {
- let velocity = panGestureRecognizer.velocity(in: self)
- let isLTR = true
- let isBackGesture = (isLTR && velocity.x > 0) || (!isLTR && velocity.x < 0)
-
- if currentIndex == 0 && isBackGesture {
- scrollView.panGestureRecognizer.isEnabled = false
- }
- }
- return true
- }
-
- return false
- }
+ return false
+ }
}
diff --git a/apps/mobile/native/ios/Modules/TabBar/TabBarRootView.swift b/apps/mobile/native/ios/Modules/TabBar/TabBarRootView.swift
index d8b171b35..88b7ed277 100644
--- a/apps/mobile/native/ios/Modules/TabBar/TabBarRootView.swift
+++ b/apps/mobile/native/ios/Modules/TabBar/TabBarRootView.swift
@@ -11,6 +11,7 @@ import SnapKit
import UIKit
class TabBarRootView: ExpoView {
+ private var touchHandler: RCTTouchHandler?
private lazy var tabBarController = {
let tabBarController = UITabBarController()
if #available(iOS 16.0, *), UIDevice.current.userInterfaceIdiom == .pad {
@@ -34,6 +35,10 @@ class TabBarRootView: ExpoView {
required init(appContext: AppContext? = nil) {
super.init(appContext: appContext)
+ touchHandler = RCTTouchHandler(
+ bridge: appContext?.reactBridge
+ )
+
tabBarController.delegate = self
addSubview(vc.view)
vc.addChild(tabBarController)
@@ -74,7 +79,8 @@ class TabBarRootView: ExpoView {
to: toView,
duration: 0.1,
options: [.transitionCrossDissolve, .preferredFramesPerSecond60],
- completion: nil)
+ completion: nil
+ )
}
}
@@ -85,6 +91,7 @@ class TabBarRootView: ExpoView {
}
override func insertSubview(_ subview: UIView, at atIndex: Int) {
+ touchHandler?.attach(to: subview)
if let tabScreenView = subview as? TabScreenView {
let screenVC = UIViewController()
screenVC.view = tabScreenView
@@ -100,6 +107,7 @@ class TabBarRootView: ExpoView {
}
override func willRemoveSubview(_ subview: UIView) {
+ touchHandler?.detach(from: subview)
if let tabScreenView = subview as? TabScreenView {
tabViewControllers.removeAll { viewController in
viewController.view == tabScreenView
diff --git a/configs/tailwind.base.config.ts b/configs/tailwind.base.config.ts
index 5eb27cae7..c424a6c3c 100644
--- a/configs/tailwind.base.config.ts
+++ b/configs/tailwind.base.config.ts
@@ -25,16 +25,16 @@ const twConfig = {
fontSize: {
...theme?.fontSize,
- largeTitle: ["26px", "32px"],
- title1: ["22px", "26px"],
- title2: ["17px", "22px"],
- title3: ["15px", "20px"],
- headline: ["13px", "16px"],
- body: ["13px", "16px"],
- callout: ["12px", "15px"],
- subheadline: ["11px", "14px"],
- footnote: ["10px", "13px"],
- caption: ["10px", "13px"],
+ largeTitle: ["1.625rem", "2rem"], // 26px
+ title1: ["1.375rem", "1.625rem"], // 22px
+ title2: ["1.0625rem", "1.375rem"], // 17px
+ title3: ["0.9375rem", "1.25rem"], // 15px
+ headline: ["0.8125rem", "1rem"], // 13px
+ body: ["0.8125rem", "1rem"], // 13px
+ callout: ["0.75rem", "0.9375rem"], // 12px
+ subheadline: ["0.6875rem", "0.875rem"], // 11px
+ footnote: ["0.625rem", "0.8125rem"], // 10px
+ caption: ["0.625rem", "0.8125rem"], // 10px
},
extend: {
diff --git a/locales/settings/en.json b/locales/settings/en.json
index 3b6076f76..e71ff74b1 100644
--- a/locales/settings/en.json
+++ b/locales/settings/en.json
@@ -83,7 +83,7 @@
"appearance.general": "General",
"appearance.guess_code_language.description": "Major programming languages that use models to infer unlabeled code blocks",
"appearance.guess_code_language.label": "Guess code language",
- "appearance.hide_extra_badge.description": "Hide the special badge of the feed in the sidebar, e.g. Boost,Claimed",
+ "appearance.hide_extra_badge.description": "Hide the special badge of the feed in the sidebar, e.g. Boost, Claimed",
"appearance.hide_extra_badge.label": "Hide special badge",
"appearance.hide_recent_reader.description": "Hide the recent reader in the entry header.",
"appearance.hide_recent_reader.label": "Hide recent reader",