diff --git a/apps/desktop/src/renderer/src/components/ui/button/base.tsx b/apps/desktop/src/renderer/src/components/ui/button/base.tsx index 9b080cc22..12b8c92af 100644 --- a/apps/desktop/src/renderer/src/components/ui/button/base.tsx +++ b/apps/desktop/src/renderer/src/components/ui/button/base.tsx @@ -45,7 +45,7 @@ export const AnimatedCommandButton: FC void + contentClassName?: string } export const CollapseGroup: Component<{ @@ -91,7 +92,9 @@ export const CollapseControlled: Component< )} - {props.children} + + {props.children} + ) export const CollapseContent: Component<{ diff --git a/apps/desktop/src/renderer/src/components/ui/fab/FABContainer.tsx b/apps/desktop/src/renderer/src/components/ui/fab/FABContainer.tsx index 93cdf3ddc..04f735e6a 100644 --- a/apps/desktop/src/renderer/src/components/ui/fab/FABContainer.tsx +++ b/apps/desktop/src/renderer/src/components/ui/fab/FABContainer.tsx @@ -52,12 +52,13 @@ export const FABBase = typescriptHappyForwardRef( "mt-2 flex items-center justify-center", "size-9 text-lg md:text-base", "outline-accent hover:opacity-100 focus:opacity-100 focus:outline-none", - "rounded-xl border border-zinc-400/20 backdrop-blur-lg dark:border-zinc-500/30 dark:text-zinc-200", - "bg-zinc-50/80 shadow-lg dark:bg-neutral-900/80", + "hover:border-border bg-background relative rounded-xl border border-transparent", + "group duration-200", className, )} {...rest} > +
{children} )} diff --git a/apps/desktop/src/renderer/src/components/ui/markdown/components/Toc.tsx b/apps/desktop/src/renderer/src/components/ui/markdown/components/Toc.tsx index 183d8cf66..cfb976185 100644 --- a/apps/desktop/src/renderer/src/components/ui/markdown/components/Toc.tsx +++ b/apps/desktop/src/renderer/src/components/ui/markdown/components/Toc.tsx @@ -143,7 +143,9 @@ const TocHoverCard: React.FC = ({ exit={{ opacity: 0, x: 110, transition: { duration: 0.1 } }} transition={{ duration: 0.5, type: "spring" }} className={cn( - "relative z-10 -mt-1 rounded-xl border bg-white px-3 py-1 text-xs drop-shadow-xl dark:bg-neutral-950", + "relative z-10 -mt-1 rounded-xl border", + "px-3 py-1 text-xs", + "bg-material-ultra-thick backdrop-blur-background shadow-context-menu", "scrollbar-none max-h-[calc(100svh-4rem)] overflow-auto", )} > diff --git a/apps/desktop/src/renderer/src/components/ui/markdown/renderers/BlockErrorBoundary.tsx b/apps/desktop/src/renderer/src/components/ui/markdown/renderers/BlockErrorBoundary.tsx index 68f40ff45..8185a4925 100644 --- a/apps/desktop/src/renderer/src/components/ui/markdown/renderers/BlockErrorBoundary.tsx +++ b/apps/desktop/src/renderer/src/components/ui/markdown/renderers/BlockErrorBoundary.tsx @@ -6,7 +6,7 @@ export const BlockError = (props: { error: any; message: string }) => { captureException(props.error) }, []) return ( -
+
{props.message}
{props.error?.message}
diff --git a/apps/desktop/src/renderer/src/components/ui/media.tsx b/apps/desktop/src/renderer/src/components/ui/media.tsx index e5cda2ce7..e09ddd745 100644 --- a/apps/desktop/src/renderer/src/components/ui/media.tsx +++ b/apps/desktop/src/renderer/src/components/ui/media.tsx @@ -334,7 +334,7 @@ const FallbackMedia: FC = ({ type, mediaContainerClassName, classNam
{ dragMomentum={false} dragConstraints={{ current: document.documentElement }} className={cn( - "absolute inset-x-2 bottom-2 h-8 rounded-2xl border bg-zinc-100/90 backdrop-blur-xl dark:border-transparent dark:bg-neutral-700/90", + "bg-material-thick backdrop-blur-background border-border absolute inset-x-2 bottom-2 h-8 rounded-2xl border", "flex items-center gap-3 px-3", "mx-auto max-w-[80vw]", )} diff --git a/apps/desktop/src/renderer/src/components/ui/media/VolumeSlider.tsx b/apps/desktop/src/renderer/src/components/ui/media/VolumeSlider.tsx index f31a7dfd2..aea8a7e60 100644 --- a/apps/desktop/src/renderer/src/components/ui/media/VolumeSlider.tsx +++ b/apps/desktop/src/renderer/src/components/ui/media/VolumeSlider.tsx @@ -15,11 +15,13 @@ export const VolumeSlider: FC<{ onVolumeChange?.(values[0]!) }} > - - + + + + {/* indicator */} diff --git a/apps/desktop/src/renderer/src/components/ui/modal/components/base.tsx b/apps/desktop/src/renderer/src/components/ui/modal/components/base.tsx index 198833af2..c7813fe60 100644 --- a/apps/desktop/src/renderer/src/components/ui/modal/components/base.tsx +++ b/apps/desktop/src/renderer/src/components/ui/modal/components/base.tsx @@ -17,14 +17,14 @@ export const PeekModalBaseButton = ({ {icon} - {label} {label} diff --git a/apps/desktop/src/renderer/src/components/ui/modal/inspire/InPeekModal.tsx b/apps/desktop/src/renderer/src/components/ui/modal/inspire/InPeekModal.tsx new file mode 100644 index 000000000..d4ac4b5bf --- /dev/null +++ b/apps/desktop/src/renderer/src/components/ui/modal/inspire/InPeekModal.tsx @@ -0,0 +1,5 @@ +import { createContext, useContext } from "react" + +export const InPeekModal = createContext(false) +InPeekModal.displayName = "InPeekModal" +export const useInPeekModal = () => useContext(InPeekModal) diff --git a/apps/desktop/src/renderer/src/components/ui/modal/inspire/PeekModal.tsx b/apps/desktop/src/renderer/src/components/ui/modal/inspire/PeekModal.tsx index ae8c5cca6..6258f34b5 100644 --- a/apps/desktop/src/renderer/src/components/ui/modal/inspire/PeekModal.tsx +++ b/apps/desktop/src/renderer/src/components/ui/modal/inspire/PeekModal.tsx @@ -1,7 +1,7 @@ import { getStableRouterNavigate } from "@follow/components/atoms/route.js" import { RootPortalProvider } from "@follow/components/ui/portal/provider.js" import type { PropsWithChildren, ReactNode } from "react" -import { createContext, useContext, useState } from "react" +import { useState } from "react" import { useTranslation } from "react-i18next" import { m } from "~/components/common/Motion" @@ -9,9 +9,8 @@ import { m } from "~/components/common/Motion" import { PeekModalBaseButton } from "../components/base" import { FixedModalCloseButton } from "../components/close" import { useCurrentModal, useModalStack } from "../stacked/hooks" +import { InPeekModal } from "./InPeekModal" -const InPeekModal = createContext(false) -export const useInPeekModal = () => useContext(InPeekModal) export const PeekModal = ( props: PropsWithChildren<{ to?: string @@ -32,7 +31,7 @@ export const PeekModal = ( return (
= ({ children, className, as: As = "main" }) => ( = ({ day }) => { return ( diff --git a/apps/desktop/src/renderer/src/modules/ai/ai-daily/daily.tsx b/apps/desktop/src/renderer/src/modules/ai/ai-daily/daily.tsx index bb13972bc..91d324e61 100644 --- a/apps/desktop/src/renderer/src/modules/ai/ai-daily/daily.tsx +++ b/apps/desktop/src/renderer/src/modules/ai/ai-daily/daily.tsx @@ -1,6 +1,5 @@ +import { Spring } from "@follow/components/constants/spring.js" import { EmptyIcon } from "@follow/components/icons/empty.jsx" -import { AutoResizeHeight } from "@follow/components/ui/auto-resize-height/index.jsx" -import { Card, CardContent } from "@follow/components/ui/card/index.jsx" import { LoadingCircle } from "@follow/components/ui/loading/index.jsx" import { RootPortal } from "@follow/components/ui/portal/index.js" import { ScrollArea } from "@follow/components/ui/scroll-area/index.js" @@ -12,6 +11,7 @@ import { } from "@follow/components/ui/tooltip/index.jsx" import { nextFrame, stopPropagation } from "@follow/utils/dom" import { cn, isBizId } from "@follow/utils/utils" +import { noop } from "foxact/noop" import type { Components } from "hast-util-to-jsx-runtime" import type { Variant } from "motion/react" import { m, useAnimationControls } from "motion/react" @@ -21,7 +21,7 @@ import { Trans, useTranslation } from "react-i18next" import { MenuItemText } from "~/atoms/context-menu" import { useGeneralSettingSelector } from "~/atoms/settings/general" -import { Collapse } from "~/components/ui/collapse" +import { CollapseControlled } from "~/components/ui/collapse" import { RelativeTime } from "~/components/ui/datetime" import { DropdownMenu, @@ -57,18 +57,34 @@ import { remarkSnowflakeId } from "./plugins/parse-snowflake" import type { DailyItemProps, DailyView } from "./types" import { useParseDailyDate } from "./useParseDailyDate" -export const DailyItem = ({ view, day, className }: DailyItemProps) => { +export const DailyItem = ({ + view, + day, + className, + onClick, + isOpened, +}: DailyItemProps & { + isOpened: boolean + onClick: () => void +}) => { const { title, startDate, endDate } = useParseDailyDate(day) return ( - } - className={cn(className, "mx-auto w-full max-w-lg border-b pb-6 last:border-b-0")} + contentClassName="flex-1 flex flex-col" + title={ + + } + className={cn(className, "mx-auto w-full max-w-lg border-b last:border-b-0")} > - + ) } @@ -93,8 +109,9 @@ export const DailyReportTitle = ({ return (
{t("ai_daily.title", { title })}
@@ -167,29 +184,30 @@ interface DailyReportContentProps { endDate: number } -export const DailyReportContent: Component = ({ +const DailyReportContent: Component = ({ endDate, startDate, view, - className, }) => { const content = useQueryData({ endDate, startDate, view }) const RelatedEntryLink = useState(() => createRelatedEntryLink("modal"))[0] return ( - - - - - {content.isLoading ? ( - - ) : ( - !!content.data && ( +
+
+ + {content.isLoading ? ( + + ) : ( + !!content.data && ( + { pipeline.use(remarkSnowflakeId) @@ -205,12 +223,12 @@ export const DailyReportContent: Component = ({ > {content.data} - ) - )} - + + ) + )} - - +
+
) } @@ -457,7 +475,7 @@ const EntryToastPreview = ({ entryId }: { entryId: string }) => { } const EntryModalPreview = ({ entryId }: { entryId: string }) => ( - + = ({ entryId }) => { - + {availableActions.map((config) => config instanceof MenuItemText ? ( { const ctxValue = React.useContext(EntryContentPlaceholderContext) const openedSummary = useAtomValue(ctxValue.openedSummary) const setOpenedSummary = useSetAtom(ctxValue.openedSummary) + return ( -
+ <>
} @@ -67,27 +68,35 @@ const SummaryDetailContent = () => { />
- { - const isAllClosed = Object.values(state).every((v) => !v) - if (isAllClosed) { - setOpenedSummary(null) - } - }} - > + { + if (openedSummary === DayOf.Today) { + setOpenedSummary(null) + } else { + setOpenedSummary(DayOf.Today) + } + }} day={DayOf.Today} view={view as DailyView} className={cn(openedSummary === DayOf.Today && "grow", "pt-6")} /> { + if (openedSummary === DayOf.Yesterday) { + setOpenedSummary(null) + } else { + setOpenedSummary(DayOf.Yesterday) + } + }} day={DayOf.Yesterday} view={view as DailyView} className={cn(openedSummary === DayOf.Yesterday && "grow", "pt-6")} /> -
+ ) } diff --git a/apps/desktop/src/renderer/src/modules/entry-column/Items/article-item.tsx b/apps/desktop/src/renderer/src/modules/entry-column/Items/article-item.tsx index 2f4faa37a..084021c61 100644 --- a/apps/desktop/src/renderer/src/modules/entry-column/Items/article-item.tsx +++ b/apps/desktop/src/renderer/src/modules/entry-column/Items/article-item.tsx @@ -14,20 +14,18 @@ export function ArticleItem({ entryId, entryPreview, translation }: UniversalIte export function ArticleItemStateLess({ entry, feed }: EntryItemStatelessProps) { return ( -
+
-
+
· {!!entry.publishedAt && }
{entry.title}
-
- {entry.description} -
+
{entry.description}
{entry.media?.[0] ? ( +
-
+
· @@ -70,7 +68,7 @@ export const ArticleItemSkeleton = (
-
+
diff --git a/apps/desktop/src/renderer/src/modules/entry-column/Items/audio-item.tsx b/apps/desktop/src/renderer/src/modules/entry-column/Items/audio-item.tsx index c13ed3416..56d826c68 100644 --- a/apps/desktop/src/renderer/src/modules/entry-column/Items/audio-item.tsx +++ b/apps/desktop/src/renderer/src/modules/entry-column/Items/audio-item.tsx @@ -13,11 +13,11 @@ export function AudioItem({ entryId, entryPreview, translation }: UniversalItemP export function AudioItemStateLess({ entry, feed }: EntryItemStatelessProps) { return ( -
+
-
+
· {!!entry.publishedAt && } @@ -55,11 +55,11 @@ export function AudioItemStateLess({ entry, feed }: EntryItemStatelessProps) { } export const AudioItemSkeleton = ( -
+
-
+
· diff --git a/apps/desktop/src/renderer/src/modules/entry-column/Items/notification-item.tsx b/apps/desktop/src/renderer/src/modules/entry-column/Items/notification-item.tsx index bac6f68d2..ebd39314e 100644 --- a/apps/desktop/src/renderer/src/modules/entry-column/Items/notification-item.tsx +++ b/apps/desktop/src/renderer/src/modules/entry-column/Items/notification-item.tsx @@ -18,7 +18,7 @@ export function NotificationItemStateLess({ entry, feed }: EntryItemStatelessPro
-
+
· {!!entry.publishedAt && } @@ -35,7 +35,7 @@ export const NotificationItemSkeleton = (
-
+
· diff --git a/apps/desktop/src/renderer/src/modules/entry-column/Items/picture-item-stateless.tsx b/apps/desktop/src/renderer/src/modules/entry-column/Items/picture-item-stateless.tsx index d395c7d49..7665dfbcd 100644 --- a/apps/desktop/src/renderer/src/modules/entry-column/Items/picture-item-stateless.tsx +++ b/apps/desktop/src/renderer/src/modules/entry-column/Items/picture-item-stateless.tsx @@ -10,7 +10,7 @@ import type { EntryItemStatelessProps } from "../types" export function PictureItemStateLess({ entry, feed }: EntryItemStatelessProps) { return ( -
+
@@ -49,7 +49,7 @@ export function PictureItemStateLess({ entry, feed }: EntryItemStatelessProps) {
- · + · {!!entry.publishedAt && }
diff --git a/apps/desktop/src/renderer/src/modules/entry-column/Items/picture-item.tsx b/apps/desktop/src/renderer/src/modules/entry-column/Items/picture-item.tsx index d237b6cfc..dbb20506a 100644 --- a/apps/desktop/src/renderer/src/modules/entry-column/Items/picture-item.tsx +++ b/apps/desktop/src/renderer/src/modules/entry-column/Items/picture-item.tsx @@ -178,7 +178,7 @@ MasonryItemFixedDimensionWrapper.whyDidYouRender = { } export const PictureItemSkeleton = ( -
+
@@ -193,7 +193,7 @@ export const PictureItemSkeleton = (
- · + ·
diff --git a/apps/desktop/src/renderer/src/modules/entry-column/Items/social-media-item.tsx b/apps/desktop/src/renderer/src/modules/entry-column/Items/social-media-item.tsx index 3a655cffb..54247279a 100644 --- a/apps/desktop/src/renderer/src/modules/entry-column/Items/social-media-item.tsx +++ b/apps/desktop/src/renderer/src/modules/entry-column/Items/social-media-item.tsx @@ -199,7 +199,7 @@ export function SocialMediaItemStateLess({ entry, feed }: EntryItemStatelessProp } export const SocialMediaItemSkeleton = ( -
+
@@ -207,7 +207,7 @@ export const SocialMediaItemSkeleton = (
- · + ·
diff --git a/apps/desktop/src/renderer/src/modules/entry-column/Items/video-item.tsx b/apps/desktop/src/renderer/src/modules/entry-column/Items/video-item.tsx index 22698ca57..11a4fe28c 100644 --- a/apps/desktop/src/renderer/src/modules/entry-column/Items/video-item.tsx +++ b/apps/desktop/src/renderer/src/modules/entry-column/Items/video-item.tsx @@ -190,7 +190,7 @@ const PreviewVideoModalContent: ModalContentComponent<{ export function VideoItemStateLess({ entry, feed }: EntryItemStatelessProps) { return ( -
+
@@ -221,10 +221,10 @@ export function VideoItemStateLess({ entry, feed }: EntryItemStatelessProps) {
{entry.title}
-
+
- · + · {!!entry.publishedAt && }
@@ -235,7 +235,7 @@ export function VideoItemStateLess({ entry, feed }: EntryItemStatelessProps) { } export const VideoItemSkeleton = ( -
+
@@ -250,7 +250,7 @@ export const VideoItemSkeleton = (
- · + ·
diff --git a/apps/desktop/src/renderer/src/modules/entry-column/layouts/EntryItemWrapper.tsx b/apps/desktop/src/renderer/src/modules/entry-column/layouts/EntryItemWrapper.tsx index 207bae12f..0773bb4df 100644 --- a/apps/desktop/src/renderer/src/modules/entry-column/layouts/EntryItemWrapper.tsx +++ b/apps/desktop/src/renderer/src/modules/entry-column/layouts/EntryItemWrapper.tsx @@ -139,7 +139,6 @@ export const EntryItemWrapper: FC<