refactor(desktop): update text styles and enhance tooltip functionality
- Replaced hardcoded text sizes with standardized 'text-body' class for consistency across various components. - Wrapped TooltipContent in RootPortal for better rendering in EnhancedSettingsIndicator and SettingSyncIndicator components. - Improved accessibility and visual consistency in EntryHeaderImpl and EntryContent components by updating text styles. Signed-off-by: Innei <tukon479@gmail.com>
This commit is contained in:
parent
e95759b0ed
commit
91b9fae6c5
|
|
@ -304,7 +304,7 @@ function AudioCover({
|
|||
/>
|
||||
<div
|
||||
className={cn(
|
||||
"group-hover:backdrop-blur-background text-[13px] opacity-0 backdrop-blur-none duration-200 group-hover:opacity-100",
|
||||
"group-hover:backdrop-blur-background text-body opacity-0 backdrop-blur-none duration-200 group-hover:opacity-100",
|
||||
isMobile && "backdrop-blur-background opacity-100",
|
||||
)}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ function EntryHeaderImpl({ view, entryId, className, compact }: EntryHeaderProps
|
|||
{!hideRecentReader && (
|
||||
<div
|
||||
className={cn(
|
||||
"zen-mode-macos:left-12 absolute left-5 top-0 flex h-full items-center gap-2 text-[13px] leading-none text-zinc-500",
|
||||
"zen-mode-macos:left-12 text-body absolute left-5 top-0 flex h-full items-center gap-2 leading-none text-zinc-500",
|
||||
"visible z-[11]",
|
||||
views[view]!.wideMode && "static",
|
||||
shouldShowMeta && "hidden",
|
||||
|
|
|
|||
|
|
@ -148,7 +148,7 @@ export const EntryContent: Component<{
|
|||
{!hideRecentReader && (
|
||||
<div
|
||||
className={cn(
|
||||
"absolute top-0 my-2 -mt-8 flex items-center gap-2 text-[13px] leading-none text-zinc-500",
|
||||
"text-body absolute top-0 my-2 -mt-8 flex items-center gap-2 leading-none text-zinc-500",
|
||||
"visible z-[11]",
|
||||
)}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -105,9 +105,7 @@ export const SettingTabbedSegment: Component<{
|
|||
}
|
||||
|
||||
export const SettingDescription: Component = ({ children, className }) => (
|
||||
<small className={cn("text-text-secondary block w-4/5 text-[13px] leading-tight", className)}>
|
||||
{children}
|
||||
</small>
|
||||
<small className={cn("text-text-secondary text-body block w-4/5", className)}>{children}</small>
|
||||
)
|
||||
|
||||
export const SettingActionItem = ({
|
||||
|
|
|
|||
|
|
@ -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 = () => {
|
|||
)}
|
||||
</IconTransition>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent className="max-w-[40ch]">
|
||||
{enhancedSettings ? (
|
||||
<p>{t("general.enhanced.enabled.tip")}</p>
|
||||
) : (
|
||||
<p>{t("general.enhanced.disabled.tip")}</p>
|
||||
)}
|
||||
</TooltipContent>
|
||||
<RootPortal>
|
||||
<TooltipContent className="max-w-[40ch]">
|
||||
{enhancedSettings ? (
|
||||
<p>{t("general.enhanced.enabled.tip")}</p>
|
||||
) : (
|
||||
<p>{t("general.enhanced.disabled.tip")}</p>
|
||||
)}
|
||||
</TooltipContent>
|
||||
</RootPortal>
|
||||
</Tooltip>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.icon className="size-4" />
|
||||
</div>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent>
|
||||
<div className="text-center text-xs">{metaInfo.text}</div>
|
||||
</TooltipContent>
|
||||
<RootPortal>
|
||||
<TooltipContent>
|
||||
<div className="text-center text-xs">{metaInfo.text}</div>
|
||||
</TooltipContent>
|
||||
</RootPortal>
|
||||
</Tooltip>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Reference in New Issue