From 50c99f966520910f20661659520d7ac930bb010d Mon Sep 17 00:00:00 2001 From: Innei Date: Fri, 11 Oct 2024 22:51:40 +0800 Subject: [PATCH 01/35] chore: add assets header Signed-off-by: Innei --- vercel.json | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/vercel.json b/vercel.json index 5e537787a..c85609201 100644 --- a/vercel.json +++ b/vercel.json @@ -19,7 +19,40 @@ "headers": [ { "key": "Cache-Control", - "value": "public, max-age=31536000, immutable" + "value": "public, max-age=604800, immutable" + }, + { + "key": "CDN-Cache-Control", + "value": "max-age=604800" + }, + { + "key": "Vercel-CDN-Cache-Control", + "value": "max-age=604800" + }, + { + "key": "Cloudflare-CDN-Cache-Control", + "value": "max-age=604800" + } + ] + }, + { + "source": "/assets/(.*)", + "headers": [ + { + "key": "Cache-Control", + "value": "public, max-age=604800, immutable" + }, + { + "key": "CDN-Cache-Control", + "value": "max-age=604800" + }, + { + "key": "Vercel-CDN-Cache-Control", + "value": "max-age=604800" + }, + { + "key": "Cloudflare-CDN-Cache-Control", + "value": "max-age=604800" } ] } From bc779d4fb781870e1ce4f71fa5ef242f99bf5495 Mon Sep 17 00:00:00 2001 From: Innei Date: Fri, 11 Oct 2024 23:07:42 +0800 Subject: [PATCH 02/35] chore(vercel): add vercel headers for assets (#885) Signed-off-by: Innei --- vercel.json | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/vercel.json b/vercel.json index 307562f86..c85609201 100644 --- a/vercel.json +++ b/vercel.json @@ -12,5 +12,49 @@ "source": "/(.*)", "destination": "/index.html" } + ], + "headers": [ + { + "source": "/vendor/(.*)", + "headers": [ + { + "key": "Cache-Control", + "value": "public, max-age=604800, immutable" + }, + { + "key": "CDN-Cache-Control", + "value": "max-age=604800" + }, + { + "key": "Vercel-CDN-Cache-Control", + "value": "max-age=604800" + }, + { + "key": "Cloudflare-CDN-Cache-Control", + "value": "max-age=604800" + } + ] + }, + { + "source": "/assets/(.*)", + "headers": [ + { + "key": "Cache-Control", + "value": "public, max-age=604800, immutable" + }, + { + "key": "CDN-Cache-Control", + "value": "max-age=604800" + }, + { + "key": "Vercel-CDN-Cache-Control", + "value": "max-age=604800" + }, + { + "key": "Cloudflare-CDN-Cache-Control", + "value": "max-age=604800" + } + ] + } ] } From bbde776be35f53c0b6715c031e0c39920c76dcd5 Mon Sep 17 00:00:00 2001 From: Innei Date: Fri, 11 Oct 2024 23:18:38 +0800 Subject: [PATCH 03/35] perf: cache setting key selected atom Signed-off-by: Innei --- apps/renderer/src/atoms/settings/helper.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/renderer/src/atoms/settings/helper.ts b/apps/renderer/src/atoms/settings/helper.ts index 7b84638bf..484491542 100644 --- a/apps/renderer/src/atoms/settings/helper.ts +++ b/apps/renderer/src/atoms/settings/helper.ts @@ -37,8 +37,17 @@ export const createSettingAtom = ( setSettings(newSettings) } - const useSettingKey = >(key: T) => - useAtomValue(useMemo(() => selectAtom(atom, (s) => s[key]), [key])) + const selectAtomCacheMap = {} as Record, any> + + const useSettingKey = >(key: T) => { + let selectedAtom = selectAtomCacheMap[key] + if (!selectedAtom) { + selectedAtom = selectAtom(atom, (s) => s[key]) + selectAtomCacheMap[key] = selectedAtom + } + + return useAtomValue(selectedAtom) + } const useSettingSelector = < T extends keyof ReturnType, From 6ce2c2270fbe611fc7ac8f532f68a45cf5f86cff Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sat, 12 Oct 2024 00:32:39 +0800 Subject: [PATCH 04/35] feat: readHistories option for reads post --- apps/renderer/src/store/entry/helper.ts | 16 ++++++++++------ apps/renderer/src/store/entry/store.ts | 8 +++++++- packages/shared/src/hono.ts | 1 + 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/apps/renderer/src/store/entry/helper.ts b/apps/renderer/src/store/entry/helper.ts index a211cfb62..81618116d 100644 --- a/apps/renderer/src/store/entry/helper.ts +++ b/apps/renderer/src/store/entry/helper.ts @@ -7,9 +7,6 @@ import { useSubscriptionStore } from "../subscription" import { useEntryStore } from "./store" import type { EntryFilter } from "./types" -type EntryId = string -type FeedId = string - export const getFilteredFeedIds = (feedIds: string[], filter?: EntryFilter) => { const state = useEntryStore.getState() const ids = [] as string[] @@ -33,11 +30,18 @@ export const getFilteredFeedIds = (feedIds: string[], filter?: EntryFilter) => { } const unread = create({ - fetcher: async (ids: ([FeedId, EntryId, boolean] | [FeedId, EntryId])[]) => { + fetcher: async ( + ids: { + entryId: string + isInbox: boolean + isPrivate?: boolean + }[], + ) => { await apiClient.reads.$post({ json: { - entryIds: ids.map((i) => i[1]), - isInbox: ids[0][2], + entryIds: ids.map((i) => i.entryId), + isInbox: ids[0].isInbox, + readHistories: ids.filter((i) => !i.isPrivate).map((i) => i.entryId), }, }) diff --git a/apps/renderer/src/store/entry/store.ts b/apps/renderer/src/store/entry/store.ts index 52fe53e40..b290137cd 100644 --- a/apps/renderer/src/store/entry/store.ts +++ b/apps/renderer/src/store/entry/store.ts @@ -11,6 +11,7 @@ import { EntryService } from "~/services" import { feedActions } from "../feed" import { imageActions } from "../image" import { inboxActions } from "../inbox" +import { getSubscriptionByFeedId } from "../subscription" import { feedUnreadActions } from "../unread" import { createZustandStore, doMutationAndTransaction } from "../utils/helper" import { internal_batchMarkRead } from "./helper" @@ -349,6 +350,7 @@ class EntryActions { async markRead({ feedId, entryId, read }: { feedId: string; entryId: string; read: boolean }) { const entry = get().flatMapEntries[entryId] const isInbox = entry?.entries && "inboxHandle" in entry.entries + const subscription = getSubscriptionByFeedId(feedId) if (read && entry?.read) { return @@ -364,7 +366,11 @@ class EntryActions { // Send api request async () => { if (read) { - await internal_batchMarkRead([feedId, entryId, isInbox]) + await internal_batchMarkRead({ + entryId, + isInbox, + isPrivate: subscription?.isPrivate, + }) } else { await apiClient.reads.$delete({ json: { diff --git a/packages/shared/src/hono.ts b/packages/shared/src/hono.ts index 9184f21f3..aa6922d00 100644 --- a/packages/shared/src/hono.ts +++ b/packages/shared/src/hono.ts @@ -5174,6 +5174,7 @@ declare const _routes: hono_hono_base.HonoBase Date: Sat, 12 Oct 2024 02:53:02 +0800 Subject: [PATCH 05/35] feat: power page redirection --- apps/renderer/src/modules/wallet/tip-modal.tsx | 8 ++++---- apps/renderer/src/queries/wallet.tsx | 9 +++------ 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/apps/renderer/src/modules/wallet/tip-modal.tsx b/apps/renderer/src/modules/wallet/tip-modal.tsx index 73e7a9c4e..7c713e9db 100644 --- a/apps/renderer/src/modules/wallet/tip-modal.tsx +++ b/apps/renderer/src/modules/wallet/tip-modal.tsx @@ -1,6 +1,7 @@ import { from } from "dnum" import type { FC } from "react" import { useState } from "react" +import { useNavigate } from "react-router-dom" import { Button } from "~/components/ui/button" import { Divider } from "~/components/ui/divider" @@ -14,7 +15,6 @@ import { UserAvatar } from "~/modules/user/UserAvatar" import { useWallet, useWalletTipMutation } from "~/queries/wallet" import { useFeedClaimModal } from "../claim" -import { useSettingModal } from "../settings/modal/hooks-hack" import { Balance } from "./balance" const DEFAULT_RECOMMENDED_TIP = 10 @@ -65,12 +65,12 @@ const TipModalContent_: FC<{ const { dismiss } = useCurrentModal() - const settingModalPresent = useSettingModal() - const claimFeed = useFeedClaimModal({ feedId, }) + const navigate = useNavigate() + if (myWallet.isPending) { return } @@ -80,7 +80,7 @@ const TipModalContent_: FC<{

{t("tip_modal.no_wallet")}

-
diff --git a/apps/renderer/src/queries/wallet.tsx b/apps/renderer/src/queries/wallet.tsx index b954dc65e..89d24f9b2 100644 --- a/apps/renderer/src/queries/wallet.tsx +++ b/apps/renderer/src/queries/wallet.tsx @@ -1,11 +1,11 @@ import { useMutation } from "@tanstack/react-query" +import { useNavigate } from "react-router-dom" import { toast } from "sonner" import { useAuthQuery } from "~/hooks/common" import { apiClient } from "~/lib/api-fetch" import { defineQuery } from "~/lib/defineQuery" import { getFetchErrorMessage, toastFetchError } from "~/lib/error-parser" -import { useSettingModal } from "~/modules/settings/modal/hooks" export const wallet = { get: ({ userId }: { userId?: string } = {}) => @@ -68,7 +68,7 @@ export const useClaimCheck = () => }) export const useClaimWalletDailyRewardMutation = () => { - const settingModalPresent = useSettingModal() + const navigate = useNavigate() return useMutation({ mutationKey: ["claimWalletDailyReward"], @@ -82,10 +82,7 @@ export const useClaimWalletDailyRewardMutation = () => { window.posthog?.capture("daily_reward_claimed") toast( -
settingModalPresent("wallet")} - > +
navigate("/power")}>
, { From 6760a3486f06ec84ab2b9b72fae490456c6fab65 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sat, 12 Oct 2024 03:26:04 +0800 Subject: [PATCH 06/35] fix: external list and feed page statistics display --- .../src/pages/(external)/(with-layout)/list/[id]/index.tsx | 2 +- locales/external/en.json | 2 +- locales/external/zh-CN.json | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/renderer/src/pages/(external)/(with-layout)/list/[id]/index.tsx b/apps/renderer/src/pages/(external)/(with-layout)/list/[id]/index.tsx index 39875d9dd..4f8a324e8 100644 --- a/apps/renderer/src/pages/(external)/(with-layout)/list/[id]/index.tsx +++ b/apps/renderer/src/pages/(external)/(with-layout)/list/[id]/index.tsx @@ -50,7 +50,7 @@ export function Component() { {t("feed.followsAndFeeds", { subscriptionCount: list.data?.subscriptionCount, subscriptionNoun: t("feed.follower", { count: list.data?.subscriptionCount }), - feedsCount: "feedCount" in listData ? listData.feedCount : 0, + feedsCount: list.data?.feedCount || 0, feedsNoun: t("feed.feeds", { count: listData?.feedIds?.length }), appName: APP_NAME, })} diff --git a/locales/external/en.json b/locales/external/en.json index b0a4619fd..09d413db7 100644 --- a/locales/external/en.json +++ b/locales/external/en.json @@ -8,7 +8,7 @@ "feed.follower_one": "follower", "feed.follower_other": "followers", "feed.followsAndFeeds": "{{subscriptionCount}} {{subscriptionNoun}} and {{feedsCount}} {{feedsNoun}} on {{appName}}", - "feed.followsAndReads": "{{subscriptionCount}} {{subscriptionNoun}} with {{readCount}} {{readNoun}} on {{appName}}", + "feed.followsAndReads": "{{subscriptionCount}} {{subscriptionNoun}} with {{readCount}} recent {{readNoun}} on {{appName}}", "feed.read_one": "read", "feed.read_other": "reads", "feed.view_feed_url": "View Feed URL", diff --git a/locales/external/zh-CN.json b/locales/external/zh-CN.json index 567d90f1f..8857c7e35 100644 --- a/locales/external/zh-CN.json +++ b/locales/external/zh-CN.json @@ -8,9 +8,9 @@ "feed.follower_one": "关注者", "feed.follower_other": "关注者", "feed.followsAndFeeds": "在 {{appName}} 上有 {{subscriptionCount}} 个{{subscriptionNoun}}和 {{feedsCount}} 个{{feedsNoun}}", - "feed.followsAndReads": "在 {{appName}} 上有 {{subscriptionCount}} 个{{subscriptionNoun}},{{readCount}} 篇{{readNoun}}", - "feed.read_one": "文章", - "feed.read_other": "文章", + "feed.followsAndReads": "在 {{appName}} 上有 {{subscriptionCount}} 个{{subscriptionNoun}},{{readCount}} 次近期{{readNoun}}", + "feed.read_one": "阅读", + "feed.read_other": "阅读", "feed.view_feed_url": "查看链接", "header.app": "应用", "header.download": "下载", From a19ab9a24778bb0be2bed43bc584778d49e798d0 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sat, 12 Oct 2024 03:31:43 +0800 Subject: [PATCH 07/35] feat: wide mode icon --- .../src/modules/entry-column/layouts/EntryListHeader.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/renderer/src/modules/entry-column/layouts/EntryListHeader.tsx b/apps/renderer/src/modules/entry-column/layouts/EntryListHeader.tsx index c76d45653..d079cec84 100644 --- a/apps/renderer/src/modules/entry-column/layouts/EntryListHeader.tsx +++ b/apps/renderer/src/modules/entry-column/layouts/EntryListHeader.tsx @@ -261,7 +261,9 @@ const WideModeButton = () => { : t("entry_list_header.switch_to_normalmode") } > - + ) From 926ef007854e8b5bda885c58f97469818589b930 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sat, 12 Oct 2024 09:00:46 +0800 Subject: [PATCH 08/35] feat: transform html (#870) --- .../src/modules/discover/DiscoverFeedForm.tsx | 80 ++++++++++++++++--- .../src/modules/discover/transform-form.tsx | 77 ++++++++++++++++++ .../(layer)/(subview)/discover/index.tsx | 6 ++ locales/app/en.json | 1 + 4 files changed, 155 insertions(+), 9 deletions(-) create mode 100644 apps/renderer/src/modules/discover/transform-form.tsx diff --git a/apps/renderer/src/modules/discover/DiscoverFeedForm.tsx b/apps/renderer/src/modules/discover/DiscoverFeedForm.tsx index aae1a9016..10d3fbae8 100644 --- a/apps/renderer/src/modules/discover/DiscoverFeedForm.tsx +++ b/apps/renderer/src/modules/discover/DiscoverFeedForm.tsx @@ -22,6 +22,7 @@ import { SelectTrigger, SelectValue, } from "~/components/ui/select" +import { EllipsisHorizontalTextWithTooltip } from "~/components/ui/typography" import { nextFrame } from "~/lib/dom" import type { FeedViewType } from "~/lib/enum" import { @@ -84,16 +85,28 @@ const FeedDescription = ({ description }: { description?: string }) => { ) } +const routeParamsKeyPrefix = "route-params-" + +export type RouteParams = Record< + string, + { + description: string + default?: string + } +> + export const DiscoverFeedForm = ({ route, routePrefix, noDescription, submitButtonClassName, + routeParams, }: { route: RSSHubRoute routePrefix: string noDescription?: boolean submitButtonClassName?: string + routeParams?: RouteParams }) => { const { t } = useTranslation() const keys = useMemo( @@ -121,13 +134,22 @@ export const DiscoverFeedForm = ({ () => z.object({ ...Object.fromEntries( - keys.map((keyItem) => [ - keyItem.name, - keyItem.optional ? z.string().optional().nullable() : z.string().min(1), - ]), + keys + .map((keyItem) => [ + keyItem.name, + keyItem.optional ? z.string().optional().nullable() : z.string().min(1), + ]) + .concat( + routeParams + ? Object.entries(routeParams).map(([key]) => [ + `${routeParamsKeyPrefix}${key}`, + z.string(), + ]) + : [], + ), ), }), - [keys], + [keys, routeParams], ) const defaultValue = useMemo(() => { @@ -150,10 +172,30 @@ export const DiscoverFeedForm = ({ const { present, dismissAll } = useModalStack() const onSubmit = useCallback( - (data: Record) => { + (_data: Record) => { + const data = Object.fromEntries( + Object.entries(_data).filter(([key]) => !key.startsWith(routeParamsKeyPrefix)), + ) + try { - const fillRegexpPath = regexpPathToPath(route.path, data) + const routeParamsPath = encodeURIComponent( + Object.entries(_data) + .filter(([key, value]) => key.startsWith(routeParamsKeyPrefix) && value) + .map(([key, value]) => [key.slice(routeParamsKeyPrefix.length), value]) + .map(([key, value]) => `${key}=${value}`) + .join("&"), + ) + + const fillRegexpPath = regexpPathToPath( + routeParams && routeParamsPath + ? route.path.slice(0, route.path.indexOf("/:routeParams")) + : route.path, + data, + ) const url = `rsshub://${routePrefix}${fillRegexpPath}` + + const finalUrl = routeParams && routeParamsPath ? `${url}/${routeParamsPath}` : url + const defaultView = getViewFromRoute(route) || (getSidebarActiveView() as FeedViewType) present({ @@ -161,7 +203,7 @@ export const DiscoverFeedForm = ({ content: () => ( (null) @@ -259,6 +301,26 @@ export const DiscoverFeedForm = ({ ) })} + {routeParams && ( +
+ {Object.entries(routeParams).map(([key, value]) => ( + + {key} + + {!!value.description && ( + + + {value.description} + + + )} + + ))} +
+ )} {!noDescription && ( <> diff --git a/apps/renderer/src/modules/discover/transform-form.tsx b/apps/renderer/src/modules/discover/transform-form.tsx new file mode 100644 index 000000000..1c1f9ae99 --- /dev/null +++ b/apps/renderer/src/modules/discover/transform-form.tsx @@ -0,0 +1,77 @@ +import { LoadingCircle } from "~/components/ui/loading" +import { useAuthQuery } from "~/hooks/common" +import { Queries } from "~/queries" + +import type { RouteParams } from "./DiscoverFeedForm" +import { DiscoverFeedForm } from "./DiscoverFeedForm" + +const transformRouteParams: RouteParams = { + title: { description: "The title of the RSS", default: "Extract from " }, + item: { description: "The HTML elements as item using CSS selector", default: "html" }, + itemTitle: { + description: "The HTML elements as title in item using CSS selector", + default: "item element", + }, + itemTitleAttr: { + description: "The attributes of title element as title", + default: "Element text", + }, + itemLink: { + description: "The HTML elements as link in item using CSS selector", + default: "item element", + }, + itemLinkAttr: { description: "The attributes of link element as link", default: "href" }, + itemDesc: { + description: "The HTML elements as description in item using CSS selector", + default: "item element", + }, + itemDescAttr: { + description: "The attributes of description element as description", + default: "Element html", + }, + itemPubDate: { + description: "The HTML elements as pubDate in item using CSS selector", + default: "item element", + }, + itemPubDateAttr: { + description: "The attributes of pubDate element as pubDate", + default: "Element html", + }, +} + +export function DiscoverTransform() { + const { data, isLoading } = useAuthQuery( + Queries.discover.rsshubNamespace({ + namespace: "rsshub", + }), + { + meta: { + persist: true, + }, + }, + ) + + if (isLoading) { + return ( + <div className="center mt-12 flex w-full flex-col gap-8"> + <LoadingCircle size="large" /> + </div> + ) + } + + return ( + <> + {data?.rsshub.routes && ( + <div className="w-[512px]"> + <DiscoverFeedForm + routePrefix="rsshub" + route={data?.rsshub.routes["/transform/html/:url/:routeParams"]} + routeParams={transformRouteParams} + noDescription + submitButtonClassName="justify-center" + /> + </div> + )} + </> + ) +} diff --git a/apps/renderer/src/pages/(main)/(layer)/(subview)/discover/index.tsx b/apps/renderer/src/pages/(main)/(layer)/(subview)/discover/index.tsx index 086be0b6e..e07c996c6 100644 --- a/apps/renderer/src/pages/(main)/(layer)/(subview)/discover/index.tsx +++ b/apps/renderer/src/pages/(main)/(layer)/(subview)/discover/index.tsx @@ -8,6 +8,7 @@ import { DiscoverImport } from "~/modules/discover/import" import { DiscoverInboxList } from "~/modules/discover/inbox-list-form" import { Recommendations } from "~/modules/discover/recommendations" import { DiscoverRSS3 } from "~/modules/discover/rss3-form" +import { DiscoverTransform } from "~/modules/discover/transform-form" import { DiscoverUser } from "~/modules/discover/user-form" import { Trend } from "~/modules/trending" @@ -42,6 +43,10 @@ const tabs: { name: "words.user", value: "user", }, + { + name: "words.transform", + value: "transform", + }, { name: "words.import", value: "import", @@ -93,4 +98,5 @@ const TabComponent: Record<string, React.FC<{ type?: string }>> = { inbox: DiscoverInboxList, user: DiscoverUser, default: DiscoverForm, + transform: DiscoverTransform, } diff --git a/locales/app/en.json b/locales/app/en.json index a34d7e520..d6969931d 100644 --- a/locales/app/en.json +++ b/locales/app/en.json @@ -284,6 +284,7 @@ "words.search": "Search", "words.starred": "Starred", "words.title": "Title", + "words.transform": "Transform", "words.trending": "Trending", "words.undo": "Undo", "words.unread": "Unread", From e41a48421ba258d8a88e1761f06510d6e3480dc3 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sat, 12 Oct 2024 09:08:16 +0800 Subject: [PATCH 09/35] chore: fix type --- apps/renderer/src/atoms/settings/helper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/renderer/src/atoms/settings/helper.ts b/apps/renderer/src/atoms/settings/helper.ts index 484491542..b66ac0874 100644 --- a/apps/renderer/src/atoms/settings/helper.ts +++ b/apps/renderer/src/atoms/settings/helper.ts @@ -46,7 +46,7 @@ export const createSettingAtom = <T extends object>( selectAtomCacheMap[key] = selectedAtom } - return useAtomValue(selectedAtom) + return useAtomValue(selectedAtom) as ReturnType<typeof getSettings>[T] } const useSettingSelector = < From d54fe81d96e5fc8a5a53c73f044a5195d4283ea4 Mon Sep 17 00:00:00 2001 From: Wenxuan Shen <bushigemen114@gmail.com> Date: Sat, 12 Oct 2024 09:12:17 +0800 Subject: [PATCH 10/35] chore(i18n): Chinese: export feeds (#886) Co-authored-by: Stephen Zhou <38493346+hyoban@users.noreply.github.com> --- locales/settings/zh-CN.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/locales/settings/zh-CN.json b/locales/settings/zh-CN.json index d53db49b8..aee5edf90 100644 --- a/locales/settings/zh-CN.json +++ b/locales/settings/zh-CN.json @@ -89,6 +89,9 @@ "general.app": "应用程序", "general.data_persist.description": "在本地保留数据以启用离线访问和本地搜索", "general.data_persist.label": "保留数据以供离线使用", + "general.export.button": "导出", + "general.export.description": "将你的订阅源导出到 OPML 文件。", + "general.export.label": "导出订阅源", "general.group_by_date.description": "按日期对条目进行分组", "general.group_by_date.label": "按日期分组", "general.language": "语言", From c3abc069780fab2174f66e8f9edda63589b0ab8a Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sat, 12 Oct 2024 09:53:48 +0800 Subject: [PATCH 11/35] fix: do not filter figure, add pre fallback close #847 --- apps/renderer/src/lib/parse-html.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/renderer/src/lib/parse-html.ts b/apps/renderer/src/lib/parse-html.ts index 34cfa6a8d..4b6076a76 100644 --- a/apps/renderer/src/lib/parse-html.ts +++ b/apps/renderer/src/lib/parse-html.ts @@ -74,7 +74,7 @@ export const parseHtml = ( (tag) => tag !== "img" && tag !== "picture", ) } else { - rehypeSchema.tagNames = [...rehypeSchema.tagNames!, "video", "style"] + rehypeSchema.tagNames = [...rehypeSchema.tagNames!, "video", "style", "figure"] rehypeSchema.attributes = { ...rehypeSchema.attributes, "*": renderInlineStyle @@ -181,7 +181,7 @@ export const parseHtml = ( ? propsChildren.find((i) => i.type === "code") : propsChildren - if (!children) return null + if (!children) return createElement("pre", props, props.children) if ( "type" in children && @@ -191,7 +191,7 @@ export const parseHtml = ( language = children.props.className.replace("language-", "") } const code = "props" in children && children.props.children - if (!code) return null + if (!code) createElement("pre", props, props.children) try { codeString = extractCodeFromHtml(renderToString(code)) @@ -203,7 +203,7 @@ export const parseHtml = ( } } - if (!codeString) return null + if (!codeString) return createElement("pre", props, props.children) return createElement(ShikiHighLighter, { code: codeString.trimEnd(), From fd104d0087f070fd5621fa7081a3704eab1b5455 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sat, 12 Oct 2024 12:01:40 +0800 Subject: [PATCH 12/35] fix: show delete category action when available --- apps/renderer/src/modules/discover/feed-form.tsx | 2 +- apps/renderer/src/modules/feed-column/category.tsx | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/renderer/src/modules/discover/feed-form.tsx b/apps/renderer/src/modules/discover/feed-form.tsx index a1f14303c..56f7992fe 100644 --- a/apps/renderer/src/modules/discover/feed-form.tsx +++ b/apps/renderer/src/modules/discover/feed-form.tsx @@ -243,7 +243,7 @@ const FeedInnerForm = ({ onSuccess?.() }, - async onError(err) { + onError(err) { toastFetchError(err) }, }) diff --git a/apps/renderer/src/modules/feed-column/category.tsx b/apps/renderer/src/modules/feed-column/category.tsx index 34e90892e..bf302008b 100644 --- a/apps/renderer/src/modules/feed-column/category.tsx +++ b/apps/renderer/src/modules/feed-column/category.tsx @@ -10,11 +10,12 @@ import { LoadingCircle } from "~/components/ui/loading" import { ROUTE_FEED_IN_FOLDER, views } from "~/constants" import { useNavigateEntry } from "~/hooks/biz/useNavigateEntry" import { getRouteParams, useRouteParamsSelector } from "~/hooks/biz/useRouteParams" -import { useAnyPointDown, useInputComposition } from "~/hooks/common" +import { useAnyPointDown, useAuthQuery, useInputComposition } from "~/hooks/common" import { stopPropagation } from "~/lib/dom" import type { FeedViewType } from "~/lib/enum" import { showNativeMenu } from "~/lib/native-menu" import { cn, sortByAlphabet } from "~/lib/utils" +import { subscription as subscriptionQuery } from "~/queries/subscriptions" import { getPreferredTitle, useAddFeedToFeedList, useFeedStore } from "~/store/feed" import { useOwnedList } from "~/store/list" import { subscriptionActions, useSubscriptionByFeedId } from "~/store/subscription" @@ -132,6 +133,7 @@ function FeedCategoryImpl({ data: ids, view, categoryOpenStateData }: FeedCatego const addMutation = useAddFeedToFeedList() const listList = useOwnedList(view!) + const categories = useAuthQuery(subscriptionQuery.categories()) return ( <div tabIndex={-1} onClick={stopPropagation}> @@ -219,7 +221,8 @@ function FeedCategoryImpl({ data: ids, view, categoryOpenStateData }: FeedCatego { type: "text", label: t("sidebar.feed_column.context_menu.delete_category"), - click: async () => { + hide: !folderName || !categories.data?.includes(folderName), + click: () => { present({ title: t("sidebar.feed_column.context_menu.delete_category_confirmation", { folderName, From e08b46f7ae14668c6d1c747031f3654aa0edf237 Mon Sep 17 00:00:00 2001 From: Innei <tukon479@gmail.com> Date: Sat, 12 Oct 2024 12:30:07 +0800 Subject: [PATCH 13/35] Revert "fix: Mouse click may briefly overlap with background elements (#848)" This reverts commit 57e818f78388329edbea9fcb54254cccefb1c095. Signed-off-by: Innei <tukon479@gmail.com> --- apps/renderer/src/components/ui/modal/stacked/overlay.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/renderer/src/components/ui/modal/stacked/overlay.tsx b/apps/renderer/src/components/ui/modal/stacked/overlay.tsx index f47a66014..420861461 100644 --- a/apps/renderer/src/components/ui/modal/stacked/overlay.tsx +++ b/apps/renderer/src/components/ui/modal/stacked/overlay.tsx @@ -2,7 +2,6 @@ import type { ForwardedRef } from "react" import { forwardRef } from "react" import { m } from "~/components/common/Motion" -import { stopPropagation } from "~/lib/dom" import { cn } from "~/lib/utils" import { RootPortal } from "../../portal" @@ -25,7 +24,7 @@ export const ModalOverlay = forwardRef( ref={ref} id="modal-overlay" className={cn( - "fixed inset-0 z-[11] rounded-[var(--fo-window-radius)] bg-zinc-50/80 dark:bg-neutral-900/80", + "!pointer-events-none fixed inset-0 z-[11] rounded-[var(--fo-window-radius)] bg-zinc-50/80 dark:bg-neutral-900/80", blur && "backdrop-blur-sm", className, )} @@ -33,7 +32,6 @@ export const ModalOverlay = forwardRef( animate={{ opacity: 1 }} exit={{ opacity: 0 }} style={{ zIndex }} - onClick={stopPropagation} /> </RootPortal> ), From 1407e77b63c3b7adf23628e29974012a22197da8 Mon Sep 17 00:00:00 2001 From: Innei <tukon479@gmail.com> Date: Sat, 12 Oct 2024 12:50:45 +0800 Subject: [PATCH 14/35] refactor: show delete category action when available refactor fd104d0087f070fd5621fa7081a3704eab1b5455 Signed-off-by: Innei <tukon479@gmail.com> --- .../src/modules/feed-column/category.tsx | 12 ++++++---- apps/renderer/src/store/subscription/hooks.ts | 5 +++- apps/renderer/src/store/subscription/index.ts | 1 + .../src/store/subscription/selector.ts | 5 ++++ apps/renderer/src/store/subscription/store.ts | 24 +++++++++++++++++++ 5 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 apps/renderer/src/store/subscription/selector.ts diff --git a/apps/renderer/src/modules/feed-column/category.tsx b/apps/renderer/src/modules/feed-column/category.tsx index bf302008b..b304abbee 100644 --- a/apps/renderer/src/modules/feed-column/category.tsx +++ b/apps/renderer/src/modules/feed-column/category.tsx @@ -10,15 +10,18 @@ import { LoadingCircle } from "~/components/ui/loading" import { ROUTE_FEED_IN_FOLDER, views } from "~/constants" import { useNavigateEntry } from "~/hooks/biz/useNavigateEntry" import { getRouteParams, useRouteParamsSelector } from "~/hooks/biz/useRouteParams" -import { useAnyPointDown, useAuthQuery, useInputComposition } from "~/hooks/common" +import { useAnyPointDown, useInputComposition } from "~/hooks/common" import { stopPropagation } from "~/lib/dom" import type { FeedViewType } from "~/lib/enum" import { showNativeMenu } from "~/lib/native-menu" import { cn, sortByAlphabet } from "~/lib/utils" -import { subscription as subscriptionQuery } from "~/queries/subscriptions" import { getPreferredTitle, useAddFeedToFeedList, useFeedStore } from "~/store/feed" import { useOwnedList } from "~/store/list" -import { subscriptionActions, useSubscriptionByFeedId } from "~/store/subscription" +import { + subscriptionActions, + subscriptionCategoryExist, + useSubscriptionByFeedId, +} from "~/store/subscription" import { useFeedUnreadStore } from "~/store/unread" import { useModalStack } from "../../components/ui/modal/stacked/hooks" @@ -133,7 +136,6 @@ function FeedCategoryImpl({ data: ids, view, categoryOpenStateData }: FeedCatego const addMutation = useAddFeedToFeedList() const listList = useOwnedList(view!) - const categories = useAuthQuery(subscriptionQuery.categories()) return ( <div tabIndex={-1} onClick={stopPropagation}> @@ -221,7 +223,7 @@ function FeedCategoryImpl({ data: ids, view, categoryOpenStateData }: FeedCatego { type: "text", label: t("sidebar.feed_column.context_menu.delete_category"), - hide: !folderName || !categories.data?.includes(folderName), + hide: !folderName || !subscriptionCategoryExist(folderName), click: () => { present({ title: t("sidebar.feed_column.context_menu.delete_category_confirmation", { diff --git a/apps/renderer/src/store/subscription/hooks.ts b/apps/renderer/src/store/subscription/hooks.ts index e2b914d4a..1114bb1d5 100644 --- a/apps/renderer/src/store/subscription/hooks.ts +++ b/apps/renderer/src/store/subscription/hooks.ts @@ -1,7 +1,7 @@ import { FEED_COLLECTION_LIST, ROUTE_FEED_IN_FOLDER } from "~/constants" import type { FeedViewType } from "~/lib/enum" -import { useSubscriptionStore } from "../subscription" +import { subscriptionCategoryExistSelector, useSubscriptionStore } from "../subscription" type FeedId = string export const useFeedIdByView = (view: FeedViewType) => @@ -40,3 +40,6 @@ export const useFolderFeedsByFeedId = ({ feedId, view }: { feedId?: string; view } return feedIds }) + +export const useSubscriptionCategoryExist = (name: string) => + useSubscriptionStore(subscriptionCategoryExistSelector(name)) diff --git a/apps/renderer/src/store/subscription/index.ts b/apps/renderer/src/store/subscription/index.ts index a1fdac565..6a6c423c6 100644 --- a/apps/renderer/src/store/subscription/index.ts +++ b/apps/renderer/src/store/subscription/index.ts @@ -1,2 +1,3 @@ export * from "./hooks" +export * from "./selector" export * from "./store" diff --git a/apps/renderer/src/store/subscription/selector.ts b/apps/renderer/src/store/subscription/selector.ts new file mode 100644 index 000000000..a0fbadbf2 --- /dev/null +++ b/apps/renderer/src/store/subscription/selector.ts @@ -0,0 +1,5 @@ +import type { useSubscriptionStore } from "./store" + +type State = ReturnType<typeof useSubscriptionStore.getState> +export const subscriptionCategoryExistSelector = (name: string) => (state: State) => + state.categories.has(name) diff --git a/apps/renderer/src/store/subscription/store.ts b/apps/renderer/src/store/subscription/store.ts index 02629b68d..fe65c64a6 100644 --- a/apps/renderer/src/store/subscription/store.ts +++ b/apps/renderer/src/store/subscription/store.ts @@ -17,6 +17,7 @@ import { inboxActions } from "../inbox" import { listActions } from "../list" import { feedUnreadActions } from "../unread" import { createZustandStore, doMutationAndTransaction } from "../utils/helper" +import { subscriptionCategoryExistSelector } from "./selector" export type SubscriptionFlatModel = Omit<SubscriptionModel, "feeds"> & { defaultCategory?: string @@ -39,6 +40,10 @@ interface SubscriptionState { * Value: Record<string, boolean> */ categoryOpenStateByView: Record<FeedViewType, Record<string, boolean>> + /** + * Category Set + */ + categories: Set<string> } function morphResponseData(data: SubscriptionModel[]): SubscriptionFlatModel[] { @@ -85,6 +90,8 @@ export const useSubscriptionStore = createZustandStore<SubscriptionState>("subsc data: {}, feedIdByView: { ...emptyDataIdByView }, categoryOpenStateByView: { ...emptyCategoryOpenStateByView }, + + categories: new Set(), })) const set = useSubscriptionStore.setState @@ -96,6 +103,20 @@ type MarkReadFilter = { } class SubscriptionActions { + constructor() { + useSubscriptionStore.subscribe((state, prev) => { + if (state.data === prev.data) return + + const categories = new Set<string>() + for (const subscription of Object.values(state.data)) { + subscription.category && categories.add(subscription.category) + } + set((state) => ({ + ...state, + categories, + })) + }) + } async fetchByView(view?: FeedViewType) { const res = await apiClient.subscriptions.$get({ query: { @@ -464,3 +485,6 @@ export const isListSubscription = (feedId?: FeedId) => { if (!subscription) return false return "listId" in subscription && !!subscription.listId } + +export const subscriptionCategoryExist = (name: string) => + subscriptionCategoryExistSelector(name)(get()) From 27569c37845397065b7f6785d308c7aca271c203 Mon Sep 17 00:00:00 2001 From: Innei <i@innei.in> Date: Sat, 12 Oct 2024 13:44:31 +0800 Subject: [PATCH 15/35] chore(release): release v0.0.1-alpha.20 --- CHANGELOG.md | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++-- package.json | 2 +- 2 files changed, 96 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6258a0cb2..09fa12b38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,18 @@ # CHANGELOG -## [0.0.1-alpha.19](https://github.com/RSSNext/follow/compare/v0.0.1-alpha.3...v0.0.1-alpha.19) (2024-10-05) +## [0.0.1-alpha.20](https://github.com/RSSNext/follow/compare/v0.0.1-alpha.19...v0.0.1-alpha.20) (2024-10-12) ### Bug Fixes * [@unixzii](https://github.com/unixzii) feature request ([b41a78d](https://github.com/RSSNext/follow/commit/b41a78d5c66d5846d1fec33cfa29b9864ddfe20f)) * `<Media/>` show fallback ([ca0fd18](https://github.com/RSSNext/follow/commit/ca0fd1802c2f48e4d2a5697f71988df00096fd89)) +* `F12` cannot open devTools in development mode ([#833](https://github.com/RSSNext/follow/issues/833)) ([ba20507](https://github.com/RSSNext/follow/commit/ba20507cbc410ebd21aa8270cd369ad86964abfc)) * `i18nProvider` condition ([0f654b9](https://github.com/RSSNext/follow/commit/0f654b9e61233319787726d3fa3557307efa1b0c)) * `IconButton` props ([f33598b](https://github.com/RSSNext/follow/commit/f33598bb9acf870f9c07475e75b4ed5e78ed6a85)) +* `NotSupport` width reactive ([1292fd4](https://github.com/RSSNext/follow/commit/1292fd41aa04365de1dfae21c6cb9f15255f69db)) * `scrollHideDelay` for scroll bar ([5300803](https://github.com/RSSNext/follow/commit/5300803d395daa485ae8ac04e7eaf2f405c7beb4)) +* about page copy button style ([e6a5042](https://github.com/RSSNext/follow/commit/e6a50427b3c7da16153e766369064bfa1635e532)) * accent color ([918d85a](https://github.com/RSSNext/follow/commit/918d85a591cdfc8c6c12261004a6a463516eaf5c)) * accept import opml ([39ecc82](https://github.com/RSSNext/follow/commit/39ecc82a8ceecd77139ffccb31a33904082a3d1b)) * **achievement:** loading button style ([96bb514](https://github.com/RSSNext/follow/commit/96bb51425427864bc4e77b75808271371839c57a)) @@ -31,6 +34,7 @@ * add lock when login button click ([539f3bc](https://github.com/RSSNext/follow/commit/539f3bc599f4df9784662ca2bf972a94edf556c4)) * add manual refresh of achievement status ([#642](https://github.com/RSSNext/follow/issues/642)) ([419c9cf](https://github.com/RSSNext/follow/commit/419c9cfd51fb766f048cc9a378c150ee974c2ab8)) * add missing commit file ([cf897d7](https://github.com/RSSNext/follow/commit/cf897d74db9130d3575fc05b0c95728bc644470c)) +* add native menu for copy link, close [#822](https://github.com/RSSNext/follow/issues/822) ([5e91f19](https://github.com/RSSNext/follow/commit/5e91f19b18c0b62a27c5b2ac6fee82fae36fd8ce)) * add nonce id for temp feed ([8f81d99](https://github.com/RSSNext/follow/commit/8f81d99f1dd48e60f9861d69c840c77fa70bde93)) * add page error boundary ([86d366d](https://github.com/RSSNext/follow/commit/86d366db76add0ad07eb921290b9444b211e2c4f)) * add rounded class to video fallback message ([#665](https://github.com/RSSNext/follow/issues/665)) ([86d7b8c](https://github.com/RSSNext/follow/commit/86d7b8cc1293d4ec7cca79155a50a5f7ea01dd75)) @@ -49,6 +53,7 @@ * align end for corner button in player ([#301](https://github.com/RSSNext/follow/issues/301)) ([e551063](https://github.com/RSSNext/follow/commit/e55106307a7ce04be3e6cf34079d6781203eff1e)) * align to the baseline ([aebae13](https://github.com/RSSNext/follow/commit/aebae13cbcb0b5dde10bad8e06868c0eb605b13d)) * allow cancel proxy configuration ([#545](https://github.com/RSSNext/follow/issues/545)) ([6e70350](https://github.com/RSSNext/follow/commit/6e70350f05821c26a92700d38e9243d9730eeff0)) +* allow clear translation target in action ([5c8b026](https://github.com/RSSNext/follow/commit/5c8b02625e48d0cb4431a32f102c55d64b3176d1)) * allow logout on login page ([#244](https://github.com/RSSNext/follow/issues/244)) ([8b679d1](https://github.com/RSSNext/follow/commit/8b679d1abdb7db2515bd1acb013adb7d1870312f)) * allow prod and dev builds running in the same time ([#479](https://github.com/RSSNext/follow/issues/479)) ([7140751](https://github.com/RSSNext/follow/commit/7140751bc2c068782b6e9e9255754629d89152c9)) * allow toggle switch by clicking label ([#185](https://github.com/RSSNext/follow/issues/185)) ([5d98eb4](https://github.com/RSSNext/follow/commit/5d98eb42303e4ba6bbe0bfd37d8a17b31f66658a)) @@ -58,6 +63,7 @@ * audioCover animation and estimatedMins style ([#523](https://github.com/RSSNext/follow/issues/523)) ([11ff31b](https://github.com/RSSNext/follow/commit/11ff31bd40af1884a1760d0d1ca5b9a726f13620)) * auto completion can not open when focus in modal ([591f13b](https://github.com/RSSNext/follow/commit/591f13b17f8a22c0c39718d67a88b2024c57efb7)) * auto fill default category and view ([ab31850](https://github.com/RSSNext/follow/commit/ab31850b68b215bef9c4c1ed4e75abad5aaa625d)) +* avatar element masking button ([#852](https://github.com/RSSNext/follow/issues/852)) ([81ca589](https://github.com/RSSNext/follow/commit/81ca589c95ac3b8d9d5cdfbf15faaa8d954fb7d4)) * avatar setting ([55b7868](https://github.com/RSSNext/follow/commit/55b7868f2e2aa3c01468e1268e3436485491ee1a)) * avoid image cls in entry content ([#666](https://github.com/RSSNext/follow/issues/666)) ([ccda887](https://github.com/RSSNext/follow/commit/ccda8875e93a52131307e69956c2d58fa5481e46)) * border color in dark mode ([472fbb2](https://github.com/RSSNext/follow/commit/472fbb2a6b41d9953bbfbda5452558621f71c8d5)) @@ -73,7 +79,9 @@ * catch get voice error ([aefe8d9](https://github.com/RSSNext/follow/commit/aefe8d9e32f8cbeb4b7e7a1618167f5f87da7f63)) * catch setTTS execption ([f7afd37](https://github.com/RSSNext/follow/commit/f7afd373de74a4f531e4a3cbe7c39cd594fdcaff)) * category in route should encodeURLComponent ([d5b79cb](https://github.com/RSSNext/follow/commit/d5b79cba8a5d6d8fe18efee5d58da5610fc3ce68)) +* change copy title icon ([#817](https://github.com/RSSNext/follow/issues/817)) ([b4fed78](https://github.com/RSSNext/follow/commit/b4fed7801bfef27bba2281d8f42e458af5acce88)) * change to `EllipsisHorizontalTextWithTooltip` to feed link ([c8cdfd1](https://github.com/RSSNext/follow/commit/c8cdfd1e944b6e595d518e81bff3ba11f7d22a54)) +* check eagle when available ([b72d455](https://github.com/RSSNext/follow/commit/b72d4557df01fa71d90f561536ee841275b2d364)) * check undefined view ([71712f4](https://github.com/RSSNext/follow/commit/71712f464d2ab3043b602d4d2c311e4cc851e046)) * ci ([a5a4de0](https://github.com/RSSNext/follow/commit/a5a4de00e3612b7799869d133b893817dbcf82f4)) * ci ([8852a81](https://github.com/RSSNext/follow/commit/8852a81d4cfe80a0704bcf52220c39e9ccbe98de)) @@ -81,10 +89,15 @@ * ci env `NODE_OPTIONS` max-old-space-size ([b4f9b1b](https://github.com/RSSNext/follow/commit/b4f9b1b8ea326b1613ca291ed5bbcd932c5e837a)) * **ci:** fetch all depth ([a504a12](https://github.com/RSSNext/follow/commit/a504a127bca93a6675b3ff02bcea0b1eca6e9707)) * **ci:** nightly build ([a4ce7b1](https://github.com/RSSNext/follow/commit/a4ce7b16f476b8d72a0b1761709ec1ceba591242)) +* **ci:** nightly linux build ([702b1d9](https://github.com/RSSNext/follow/commit/702b1d976d52c49647d0433f2dd162c034d0abb4)) * **ci:** remove check diff ([32f3a9e](https://github.com/RSSNext/follow/commit/32f3a9edba28ec2368730c6038ff6d3f8d55b404)) * clean local async data ([ae26dd7](https://github.com/RSSNext/follow/commit/ae26dd7763fe32990086e76fa896ec09dec170cd)) +* clear local data when login other account and store window pos before quit ([c7f74cf](https://github.com/RSSNext/follow/commit/c7f74cf7464da96e5f6249926cbfc3eea9d1497e)) * cls when star in gird item ([#636](https://github.com/RSSNext/follow/issues/636)) ([b993ae0](https://github.com/RSSNext/follow/commit/b993ae050e282c22e40f649141677f7905ede601)) +* cmdk panel layout ([#854](https://github.com/RSSNext/follow/issues/854)) ([81a35e0](https://github.com/RSSNext/follow/commit/81a35e046e8bbc4f60a17c1e5fb0ac342f20009e)) +* code language detection more approximate ([86ce165](https://github.com/RSSNext/follow/commit/86ce16571751c19b64def3dac972f9a5ce37f130)) * config `__dirname` resolve ([f3f3cac](https://github.com/RSSNext/follow/commit/f3f3cac2b4ff0865f863b848397f0e27caa435b3)) +* context menu item title should use title case ([f11eb19](https://github.com/RSSNext/follow/commit/f11eb198157f26861b3d69965f051c2a5b02886e)) * context menu sub menu ([9352dd1](https://github.com/RSSNext/follow/commit/9352dd1a2a2d4d30c04cb41a22b95a0dda3eeb40)) * copy grammatical ([0267b08](https://github.com/RSSNext/follow/commit/0267b080c01733671ac4fc12cfd5ec9c1807c928)) * copywrite ([8967d20](https://github.com/RSSNext/follow/commit/8967d20102bc1ad6f2f94b38909c7abfca6168d1)) @@ -102,14 +115,19 @@ * deeplink navigate ([00d41ce](https://github.com/RSSNext/follow/commit/00d41cee5632dab86f7a93b1bc965cb3a896417a)) * default extra window size ([5688eff](https://github.com/RSSNext/follow/commit/5688eff6a70ab9abc3e94d9dce861726df8d9123)) * determine snowflake id ([7dbf48b](https://github.com/RSSNext/follow/commit/7dbf48b92c9445b83588bcf11892f3728e959977)) +* devtools font not work due to comment ([#846](https://github.com/RSSNext/follow/issues/846)) ([ac09c71](https://github.com/RSSNext/follow/commit/ac09c711d94cd966b5c9839276d11b2e2235e2ce)) * disable window blur material lower than windows 11 ([3735390](https://github.com/RSSNext/follow/commit/3735390af80671a4bf954f70062f3838206b8890)) * disabled ghost button style ([e01985b](https://github.com/RSSNext/follow/commit/e01985b1e9bf8a60ea20f47fc3e7a7a9a969bca9)) * discover form overflow scrollbar ([1145e92](https://github.com/RSSNext/follow/commit/1145e92ae7125873d69f2689d86418b004d93319)) * discover form should preview twice when has optional value ([f0f8185](https://github.com/RSSNext/follow/commit/f0f8185d92e447943c14a4ceeeceb7211498bc28)) * discover page title i18n ([b92d317](https://github.com/RSSNext/follow/commit/b92d317e9c1dbdd674a6b122a02f3f6a3826682f)) +* discover page's trending icon is offset. ([#856](https://github.com/RSSNext/follow/issues/856)) ([3ce0a88](https://github.com/RSSNext/follow/commit/3ce0a88cb6f777306e51a44642cb41e25704e883)) * discover recommendation card link button style ([1ac465c](https://github.com/RSSNext/follow/commit/1ac465cbb96bda4a189dea086caf3bbe77aa64ee)) +* discover search optimistic update data ([a6abd05](https://github.com/RSSNext/follow/commit/a6abd058ac691c0116f625f9226bd465f6319f25)) * **discover:** update follow status after add feed, closes [#269](https://github.com/RSSNext/follow/issues/269), closes ([32a55ec](https://github.com/RSSNext/follow/commit/32a55ece6440f80f837adc6d558029ea5fbd6982)) * display white block ([#633](https://github.com/RSSNext/follow/issues/633)) ([d9bb749](https://github.com/RSSNext/follow/commit/d9bb74937b5b2f528707e80fc2a76a89df10a1a8)) +* do not filter figure, add pre fallback ([c3abc06](https://github.com/RSSNext/follow/commit/c3abc069780fab2174f66e8f9edda63589b0ab8a)), closes [#847](https://github.com/RSSNext/follow/issues/847) +* document title change when entry changed ([a4c1dc2](https://github.com/RSSNext/follow/commit/a4c1dc231c8b792e3e8ed38d07619d1a2a50a358)) * don't auto focus in user profile modal ([f1ce5df](https://github.com/RSSNext/follow/commit/f1ce5df581c0a91967d3d093b6735e2fdd3ea906)) * don't retry when 404 ([8bd9bd0](https://github.com/RSSNext/follow/commit/8bd9bd0a8bf92764d8dd13a0728e3ab821b3484b)) * dont handle unread when filter applied ([acfb35a](https://github.com/RSSNext/follow/commit/acfb35abd0edb85989549849d0176c4a65e5f9fa)) @@ -118,6 +136,7 @@ * draggable panel dragging bg color ([8de7078](https://github.com/RSSNext/follow/commit/8de7078d10b733456c480117ba8ed8d2166e20b9)) * drawer edge shadow style ([cbb8649](https://github.com/RSSNext/follow/commit/cbb8649fde99e7a800153ad35aa041aaf44e6dcf)) * drawer top edge anchor ([248369a](https://github.com/RSSNext/follow/commit/248369afe6d085885fd76a4ecf6a3f9b692b14cf)) +* dropmenu icon prop passive, profile avatar button cls ([ddfcffe](https://github.com/RSSNext/follow/commit/ddfcffeda59c2d2503645b36aba423eff9e2b5b9)) * duplicated separator ([6e1ee50](https://github.com/RSSNext/follow/commit/6e1ee50536ded4b65f76cdb35bdf98c4657a1a74)) * dynamic load i18n resource in electron prod ([2328648](https://github.com/RSSNext/follow/commit/232864852a934d571a2b47af7f4d02c787cc8250)) * eagle icon ([021dfab](https://github.com/RSSNext/follow/commit/021dfab5eeb888f155982cc1cd3636b2b4ca52a3)) @@ -132,6 +151,7 @@ * empty default font on electron app ([#481](https://github.com/RSSNext/follow/issues/481)) ([4f9d4f2](https://github.com/RSSNext/follow/commit/4f9d4f26f22ac86cce64bb9f1582c2be2b3361c3)) * empty entry list will throw not found feed error, fixed [#224](https://github.com/RSSNext/follow/issues/224) ([c41756d](https://github.com/RSSNext/follow/commit/c41756d2b91173a753e09f5de988b71a27daa9ba)) * empty title break ([fbbb2a9](https://github.com/RSSNext/follow/commit/fbbb2a98b204ff17d80f1826134b713854a0f40d)) +* enable pointer events for action buttons in media preview ([#790](https://github.com/RSSNext/follow/issues/790)) ([dcb765e](https://github.com/RSSNext/follow/commit/dcb765ecb4ec93cb1a87493c03a0ced516d5ae76)) * ensure unique keys for search items ([#500](https://github.com/RSSNext/follow/issues/500)) ([6c6b082](https://github.com/RSSNext/follow/commit/6c6b0828b83ff62d95c56417dcb0ebc1faed9535)) * entries hasNext ([4cb5678](https://github.com/RSSNext/follow/commit/4cb56784acfb46516a4320f0088c294eafb32fcf)) * entry bar action ([ba23dcf](https://github.com/RSSNext/follow/commit/ba23dcf46ff7569562d0a786ab85d46093b8abe8)) @@ -142,13 +162,17 @@ * entry preview modal content ([8492c2a](https://github.com/RSSNext/follow/commit/8492c2afb3af79726b9448359a63b432b04a3518)) * entry read history more not showing on desktop ([0c6494b](https://github.com/RSSNext/follow/commit/0c6494b5682078fa1da1ea2e6f5d81aa436a5155)) * entry view tracker params ([0c05a8b](https://github.com/RSSNext/follow/commit/0c05a8b88c1c385b7809f1ea9e3355f0d11e69dd)) +* **entry-layout:** only padding left in wide mode ([c0d49e5](https://github.com/RSSNext/follow/commit/c0d49e5436b9f93857c9efa4bdaf4cc939e86c73)) * env example ([cdb8dd5](https://github.com/RSSNext/follow/commit/cdb8dd5cf31ec2d43b18a50cdd3259302620867e)) * **error:** filter user is empty ([83b4031](https://github.com/RSSNext/follow/commit/83b4031405d2a6e979a32fbb18095f22d19d6a70)) * **eslint:** json sort key ([5a81dd6](https://github.com/RSSNext/follow/commit/5a81dd6786b7c0e4a533f3cb4e50d7900d005875)) * exit full screen before hiding window ([#341](https://github.com/RSSNext/follow/issues/341)) ([bd5b08f](https://github.com/RSSNext/follow/commit/bd5b08f314ddaddb9b079b3d10b6928d28962df5)) * **exteral:** edit or follow in web app when login ([0ccadf7](https://github.com/RSSNext/follow/commit/0ccadf762bf5c761115a485ab4e68be938c527e6)) +* external layout header margin ([#754](https://github.com/RSSNext/follow/issues/754)) ([52e7305](https://github.com/RSSNext/follow/commit/52e730525da0f871de96026f076b01accbddcb17)) +* external list and feed page statistics display ([6760a34](https://github.com/RSSNext/follow/commit/6760a3486f06ec84ab2b9b72fae490456c6fab65)) * **external-page:** feed list overlay style ([1dcffc6](https://github.com/RSSNext/follow/commit/1dcffc60d26596065bc024653d69a109a1941578)) * extract constants ([f48b589](https://github.com/RSSNext/follow/commit/f48b58941344a4a5e547a402e02f56bb5f9f5abf)) +* fake profile avatar position when resize ([3af93e3](https://github.com/RSSNext/follow/commit/3af93e37760aabbf9ffb0e112febb3708576bb9a)) * fallback image overflow, fixed [#375](https://github.com/RSSNext/follow/issues/375) ([ae3d52c](https://github.com/RSSNext/follow/commit/ae3d52cb7c8756e6524ad6fa7f758bbc6cfb1578)) * feed claim action ([4a814ee](https://github.com/RSSNext/follow/commit/4a814ee917ea47ab214dba33b879e24ff4bb3e97)) * feed column animation direction ([0767b6b](https://github.com/RSSNext/follow/commit/0767b6b4db3a69f54d1fc2de11a883d9deec4445)) @@ -172,6 +196,7 @@ * format ([cd4473b](https://github.com/RSSNext/follow/commit/cd4473b3062ca780c0c163c81d3d265077c26862)) * format time locale fallback ([6b1009e](https://github.com/RSSNext/follow/commit/6b1009ecfde47d68859a202a2be8a1cde901f2fc)) * generate i18n template location ([0877448](https://github.com/RSSNext/follow/commit/08774485b10e22dee67333652bb28ecb700e077b)) +* generate invite code modal power icon style ([25a505a](https://github.com/RSSNext/follow/commit/25a505a221f51d6cb70c0d2832b0cd5bbc62e26d)) * generate-i18n scripti ([fd361e8](https://github.com/RSSNext/follow/commit/fd361e88864c57c6f76793519a2e57a650aa4a2b)) * gird item text and icon align center ([eabd59c](https://github.com/RSSNext/follow/commit/eabd59cf1feb774759279832005fcd0e26aa7bb6)) * gird mode skeleton ([0a7f648](https://github.com/RSSNext/follow/commit/0a7f6488c176ee059f7c87f3c51e0234c85c1d4c)) @@ -182,11 +207,13 @@ * handle render error in code block ([8511a79](https://github.com/RSSNext/follow/commit/8511a7909237dd22ccd9f373a0f77a0355ff45ac)) * header icon size ([aff559a](https://github.com/RSSNext/follow/commit/aff559a9ddd2a3a5c9235c8e5b0ab521a73d5db0)) * header layout action button initial flash ([6758793](https://github.com/RSSNext/follow/commit/6758793a3ed1b5ac2ca74d17ef9828f9cd6b8817)) +* hidden menu item is not filtered out on native ([#830](https://github.com/RSSNext/follow/issues/830)) ([190a18e](https://github.com/RSSNext/follow/commit/190a18e3324ffce6c714fd572b72a9216c4fcada)) * hide entry read history, fixed [#278](https://github.com/RSSNext/follow/issues/278) ([a73b4ab](https://github.com/RSSNext/follow/commit/a73b4abe2212b5ba969770358d8db7306b6ad4e6)) * hide peek modal toc ([9c66b33](https://github.com/RSSNext/follow/commit/9c66b33887126287d9f6f5a39f85f76818e28f1f)) * hide tip when feed owned by me ([dfb3c6d](https://github.com/RSSNext/follow/commit/dfb3c6d377041f524c9da80c03639e6fea304202)) * hono.ts ([fd03caa](https://github.com/RSSNext/follow/commit/fd03caac22f9e035734d369351134ed63da93439)) * i18n dispatcher ([c038c79](https://github.com/RSSNext/follow/commit/c038c791af14418ee641af08e689a619b99a1735)) +* i18n key and dark mode in wide mode and transition other ux fix ([6697ff5](https://github.com/RSSNext/follow/commit/6697ff58b30a1f4838fdca3820c725457ec483d4)) * i18n persist ([18e0353](https://github.com/RSSNext/follow/commit/18e035394b8d1a77f8454f47e0049359e69d750a)) * **i18n-selector:** hover cls ([60f1af2](https://github.com/RSSNext/follow/commit/60f1af2409300e64ad351621abf71ed326188af8)) * **i18n/en:** enhance English grammar ([#698](https://github.com/RSSNext/follow/issues/698)) ([4478517](https://github.com/RSSNext/follow/commit/4478517566aced3e55928229433a4cc83dd0c3ae)) @@ -204,16 +231,23 @@ * **i18n:** relative time add `ago` postfix ([9fe48c5](https://github.com/RSSNext/follow/commit/9fe48c57133e0360a74aa46c06f01393cc044136)) * icon button transition ([596538b](https://github.com/RSSNext/follow/commit/596538ba10b6b70d12ccc4efdd9f206d9ba11817)) * icon fallback line height ([02cd98d](https://github.com/RSSNext/follow/commit/02cd98d9cc9c09006a91277a5b976d753054738d)) +* if inline image is too wider, fallback to block image ([f8ccd74](https://github.com/RSSNext/follow/commit/f8ccd74a9c9c4664767add26cc48f6c3dbdbb83d)) * image blurhash `aspectRatio` ([9239483](https://github.com/RSSNext/follow/commit/9239483081e6e4adfda4934695c03df394e873fa)) * image url replacement ([8e75a8c](https://github.com/RSSNext/follow/commit/8e75a8cc6931b354e3206ea22917842c991d4c45)) * **image:** error fallback ([18fdaa2](https://github.com/RSSNext/follow/commit/18fdaa20610fba875054c3d298ecb07e099ad584)) -* import circular and copywrite i18n ([725f9f5](https://github.com/RSSNext/follow/commit/725f9f5509c3b34079923fad47096b108568ccd6)) * import circular and copywrite i18n ([caf5fe5](https://github.com/RSSNext/follow/commit/caf5fe5c839cc68aec786114b5a659cc8352d167)) +* import circular and copywrite i18n ([725f9f5](https://github.com/RSSNext/follow/commit/725f9f5509c3b34079923fad47096b108568ccd6)) +* import circular in dev login page ([a37e927](https://github.com/RSSNext/follow/commit/a37e927e93bf7cb6a5035a74ec8e9708fc559316)) * import type error ([0658c4a](https://github.com/RSSNext/follow/commit/0658c4ab6bd3e9bbbb87a9faf07d00fc04aa0bc1)) +* improve ActionCard state management and UI ([#825](https://github.com/RSSNext/follow/issues/825)) ([56ca95b](https://github.com/RSSNext/follow/commit/56ca95bd9dec7ee581c126c5085eebfe9ca7eb72)) * improve code block parser ([e72cb2d](https://github.com/RSSNext/follow/commit/e72cb2df3f1f5cd314feeb4a9bcc20e30204bca5)) +* improve developing experience with Electron on Windows ([#796](https://github.com/RSSNext/follow/issues/796)) ([3416329](https://github.com/RSSNext/follow/commit/3416329f30baf457dc18c5e2b598e2b86416c9f5)) * improve input component display on focus ([#581](https://github.com/RSSNext/follow/issues/581)) ([d8ddffb](https://github.com/RSSNext/follow/commit/d8ddffbc481dc086c8d1d2cd0c80bdef9126f306)) +* improve proxy URI handling ([#810](https://github.com/RSSNext/follow/issues/810)) ([e7e930d](https://github.com/RSSNext/follow/commit/e7e930d1771e19d909433021d6757eabb44de73f)) +* inbox data refreshment ([a3a7c82](https://github.com/RSSNext/follow/commit/a3a7c82ea6308756a800514d9df528815ba77781)) * incorrect tooltip in read history ([#385](https://github.com/RSSNext/follow/issues/385)) ([cabe210](https://github.com/RSSNext/follow/commit/cabe210aaf8f4a1133fa653532874fa86d02c252)) * inline table style ([5837bd4](https://github.com/RSSNext/follow/commit/5837bd4089b59855d0b583aed5d0e97fce04e094)) +* input box table style ([e0890d5](https://github.com/RSSNext/follow/commit/e0890d5b388facd1f9c16ac706a32f0aa2efdef5)) * Input issues fixed [#535](https://github.com/RSSNext/follow/issues/535),[#536](https://github.com/RSSNext/follow/issues/536) ([3d48637](https://github.com/RSSNext/follow/commit/3d486379b91dff13bfbcc90532efd3e186405a13)) * intelligence ([8b889d1](https://github.com/RSSNext/follow/commit/8b889d1307186d07c4672879d77f77e1d8fead7b)) * invitation code wrap ([4b48202](https://github.com/RSSNext/follow/commit/4b48202ea70ed80b858312d35cf04d1d66515865)) @@ -223,14 +257,18 @@ * kbd cls and set home scope in shortcuts guideline ([d9999a3](https://github.com/RSSNext/follow/commit/d9999a3fc6cfeae0f3b45b6390cf79d9135566b7)) * lang/*.json ([#526](https://github.com/RSSNext/follow/issues/526)) ([be3b2e7](https://github.com/RSSNext/follow/commit/be3b2e7503c1061a1e312394bb0c3556e39ec062)) * language setting syncing ([fa1dc5d](https://github.com/RSSNext/follow/commit/fa1dc5df35a2225bb22320a8fc049d3c0b75fa5b)) +* layout shift ([f5f5213](https://github.com/RSSNext/follow/commit/f5f521300f59a0194a349342d2990e2c5d4bfd63)) +* less white space, close [#818](https://github.com/RSSNext/follow/issues/818) ([4b0802d](https://github.com/RSSNext/follow/commit/4b0802da69bd64192f622c08e53ba95484d27c71)) * link underline style when selected ([781b120](https://github.com/RSSNext/follow/commit/781b1200f8eae3f61b39dc53151c5a688fa36d1b)) * lint ([ef0d80d](https://github.com/RSSNext/follow/commit/ef0d80d8546c804b1b52c58fca7640d2f541188a)) * list data store and list edit form ([f420e78](https://github.com/RSSNext/follow/commit/f420e78ca921217b18a5c6b4811074d8eb11fe4e)) * list item overlay style ([20ef773](https://github.com/RSSNext/follow/commit/20ef77342e73d205409644386c162dc164da009e)) * list manage Modal button zh-cn word wrap ([#590](https://github.com/RSSNext/follow/issues/590)) ([0a89c2f](https://github.com/RSSNext/follow/commit/0a89c2ff73a0fde28c85b87401185332975264e0)) * **list:** adjust power fee ([47fc1ff](https://github.com/RSSNext/follow/commit/47fc1ff7c40961d102caf31c30d9a1eed8a98475)) +* lists check ([657dcf0](https://github.com/RSSNext/follow/commit/657dcf0ff241cde8b68feb2a4db14160c52058c4)) * lists date group ([b57f43f](https://github.com/RSSNext/follow/commit/b57f43fbcc407fe6d6e81b6c6cfbbc38a7d52f68)) * lists edit follow modal in external page ([9cfe2ab](https://github.com/RSSNext/follow/commit/9cfe2ab68531384c0448806cd7366e5c4722461c)) +* lists read all ([4aac049](https://github.com/RSSNext/follow/commit/4aac04958357e25e13df992a92f34ffb717e4c57)) * loadFile options hash ([b41fa66](https://github.com/RSSNext/follow/commit/b41fa665fa334f0037de294d8e0585a5cf94c649)) * loading circle clip path ([ba396be](https://github.com/RSSNext/follow/commit/ba396beaa78eae3c1b250fd846cc8434c2abc07f)) * loading style ([61ee2cc](https://github.com/RSSNext/follow/commit/61ee2ccb3e30d3ab82de0bfe6aca35df38794dca)) @@ -238,6 +276,7 @@ * login button transition ([0f566e7](https://github.com/RSSNext/follow/commit/0f566e757bdc15fc72c4cd3681384d7b4242b55a)) * login page style ([094a668](https://github.com/RSSNext/follow/commit/094a6684b62de69748f20011f5bd0f68833c30e1)) * **login-button:** add overflow ([650aeeb](https://github.com/RSSNext/follow/commit/650aeeb099a18341a6fd25b006e77818f040fa93)) +* mark all as read height ([eb1a944](https://github.com/RSSNext/follow/commit/eb1a9440b5e3eb8fa205251c312e47a1ad47d77f)), closes [#811](https://github.com/RSSNext/follow/issues/811) * mark all as read in feed action ([cbb5022](https://github.com/RSSNext/follow/commit/cbb502223fd82212f8534eb578786cb138813474)) * mark all button overlay position ([5e34d36](https://github.com/RSSNext/follow/commit/5e34d3650eaaa999c660377db3e955269123eab5)) * mark read tooltip and shortcut optional ([d4d72dd](https://github.com/RSSNext/follow/commit/d4d72ddf933c89d246585c77b22f8f498b2a98a1)) @@ -245,6 +284,7 @@ * masonry layout cls ([9428368](https://github.com/RSSNext/follow/commit/9428368cfc4a00afb1c72f9ca3a4267b311c5b2b)) * **masonry:** in view mark read and scroll out mark read ([1c5a1ef](https://github.com/RSSNext/follow/commit/1c5a1ef9a58d7953e0966d2fe8d8fe4543463b84)) * media fallback src overflow ([3dd705f](https://github.com/RSSNext/follow/commit/3dd705f3a427c53d000c4934513c97d6132399d0)) +* media preview bug when zero size, close [#764](https://github.com/RSSNext/follow/issues/764) ([#765](https://github.com/RSSNext/follow/issues/765)) ([208d09b](https://github.com/RSSNext/follow/commit/208d09b8d9d296eed7e62e8a0c71e2c542b99e14)) * media preview image fixed size ([14c7028](https://github.com/RSSNext/follow/commit/14c7028347b22eb1cf768d5c3a4c20ffe9497b93)) * **media-preview:** solve image cls ([e0bcb71](https://github.com/RSSNext/follow/commit/e0bcb718aee57e7eeef31c3ffcdf5564c823c845)) * **media:** if no src then return null ([183009a](https://github.com/RSSNext/follow/commit/183009adee6d5674923a72ae0f5a10b85d4c7ba6)) @@ -256,10 +296,14 @@ * modal title overflow tooltip ([5146dd2](https://github.com/RSSNext/follow/commit/5146dd23487f98080bf246f50101e6d13ed79aea)) * **modal:** limit setting modal drag range ([#732](https://github.com/RSSNext/follow/issues/732)) ([34f462f](https://github.com/RSSNext/follow/commit/34f462f2877ed979a59644e666ce27ba14dadc5b)) * modify the Tooltip content of the list dates title ([#663](https://github.com/RSSNext/follow/issues/663)) ([f99ba5d](https://github.com/RSSNext/follow/commit/f99ba5de916fc17904f6716b4d7eb4ccc295f79c)) +* monospace font always be NSimSun on Windows ([#806](https://github.com/RSSNext/follow/issues/806)) ([a3576b0](https://github.com/RSSNext/follow/commit/a3576b04e84489d103664b9f532c1cff0f2f18b6)) * more highlighted player thumb ([a17ea00](https://github.com/RSSNext/follow/commit/a17ea00c23604312b09283ef89946140b61b2be9)) +* navigating from a tts player doesn't work properly ([#828](https://github.com/RSSNext/follow/issues/828)) ([22a72ac](https://github.com/RSSNext/follow/commit/22a72ac15b8aa7ae5707f68051951ea5707a4ae9)) * new invitation button zindex ([0d79392](https://github.com/RSSNext/follow/commit/0d79392cde4c282cbc3faf69fd697b3726638279)) * nightly build ci ([85a52ad](https://github.com/RSSNext/follow/commit/85a52ad1dfc3f55950b7ae3b59c2c18eaee0e37e)) * null reference introduced in ab8c9e5 ([#667](https://github.com/RSSNext/follow/issues/667)) ([1eae565](https://github.com/RSSNext/follow/commit/1eae565fb37c2ed3b6a627855862d2ae30c3dc00)) +* only can add feed to owned lists, fixed [#863](https://github.com/RSSNext/follow/issues/863) ([0c306bc](https://github.com/RSSNext/follow/commit/0c306bc34ac351ad36617e07769df8dc647d24b5)) +* only valid feed can be claimed ([1e03bf6](https://github.com/RSSNext/follow/commit/1e03bf66e17e3d873081c9f6faa93ee2407f57e1)) * only windows 11 can manually resize logic ([338803a](https://github.com/RSSNext/follow/commit/338803a18936c29fcea694c95baef1b3e8650980)) * optimize ai daily modal ([8872067](https://github.com/RSSNext/follow/commit/88720679df1371543c0feb5d3a48b7b7e664a20b)) * optimize code string parser ([b3d32d0](https://github.com/RSSNext/follow/commit/b3d32d09fd4d5b53ae1692ffdc154e8d37a77fdd)) @@ -271,6 +315,7 @@ * panel split color in dark mode ([3a0cfa1](https://github.com/RSSNext/follow/commit/3a0cfa1ebf794351d7f7b1132c0068a55ff2e9a6)) * panel spliter zindex ([23e428a](https://github.com/RSSNext/follow/commit/23e428ad30d5df968e881462a699fdf40db43131)) * peek modal header background color and copywrite ([b8be81b](https://github.com/RSSNext/follow/commit/b8be81b2105d2c229955a433af91c43f5286194a)) +* picture action button position ([b18e4a2](https://github.com/RSSNext/follow/commit/b18e4a2bd4f4266e4e44da17b3deac9826570322)), closes [#811](https://github.com/RSSNext/follow/issues/811) * picture entry preview in Grid view ([#658](https://github.com/RSSNext/follow/issues/658)) ([634978f](https://github.com/RSSNext/follow/commit/634978f427865f646088f13a315207cde63d532c)) * player holder size ([78cb08c](https://github.com/RSSNext/follow/commit/78cb08c7dc98aeab9cb5575296470106dbeb4e84)) * player marquee mask ([aa9ca62](https://github.com/RSSNext/follow/commit/aa9ca624a8d0304838bc05c330a8165a41430d3e)) @@ -287,6 +332,7 @@ * preview image size ([af474c1](https://github.com/RSSNext/follow/commit/af474c1592b5cf92c114936ccb3e6686ea737e37)) * preview media entry background color in dark mode ([4751447](https://github.com/RSSNext/follow/commit/4751447ce2bd9e0dd7d6865ed48b600a747556cf)) * previous feed should not be preserved when switching feeds ([f1a2ecb](https://github.com/RSSNext/follow/commit/f1a2ecb7d2e517d45ca75dd6371f3570787f5c5f)) +* profile category overflow ([3edee63](https://github.com/RSSNext/follow/commit/3edee63a5a9f691481c8532ba524d541ca09c539)), closes [#811](https://github.com/RSSNext/follow/issues/811) * profile fields are not updated after modifying the profile ([#291](https://github.com/RSSNext/follow/issues/291)) ([b765349](https://github.com/RSSNext/follow/commit/b7653494b7fd6c69572d94aeeb2ee5bf15145658)) * profile header transform when scroll up/down ([c0683ee](https://github.com/RSSNext/follow/commit/c0683eee6def2b835e79dab9eea37cb4567f02b7)) * prose max widht ([2bd5b45](https://github.com/RSSNext/follow/commit/2bd5b45e6bb4cc127dd07aa073d3b83c0a8bee82)) @@ -299,11 +345,13 @@ * read history delay to polling ([f6f8ec8](https://github.com/RSSNext/follow/commit/f6f8ec84dbb0e86b2d5a109088a1759b62c17dec)) * read history style in wide mode ([07ca5ea](https://github.com/RSSNext/follow/commit/07ca5ea22ea6675d08c5df72389733361c4789bb)) * **read-history:** hover card alaway open ([2eaabf0](https://github.com/RSSNext/follow/commit/2eaabf003845e321fa687a17845d30f6ce01135d)) +* **readability:** respect origin html charset ([d5fe10a](https://github.com/RSSNext/follow/commit/d5fe10a95fb9874e23b44a56db8a9fabc6310422)) * reduce Electron framework size ([#217](https://github.com/RSSNext/follow/issues/217)) ([34d5dd2](https://github.com/RSSNext/follow/commit/34d5dd228e6986ff8a15310dd9d5f8ed51933de6)) * reduce tolltip re-render ([c43bafd](https://github.com/RSSNext/follow/commit/c43bafdd5cd7a94f66c722e30d76ae31307f263f)) * reduce wallet setting margin size ([826ebd0](https://github.com/RSSNext/follow/commit/826ebd041a9a143d7785a52d95dc81388b0ea2b4)) * ref not found error ([372e043](https://github.com/RSSNext/follow/commit/372e043ed47c47f7677406bdb1115c7fe577dc29)) * regarding the style issue of selecting subscription types using the Tab and arrow keys ([#525](https://github.com/RSSNext/follow/issues/525)) ([cea7f4a](https://github.com/RSSNext/follow/commit/cea7f4a95ab7336c85613cc551c48639e20b2b9d)) +* **release:** changelog ([206c59a](https://github.com/RSSNext/follow/commit/206c59a2572359f49f5e4efe2af584238ef54eb7)) * remove `src` ([9aa16b6](https://github.com/RSSNext/follow/commit/9aa16b62d84f40c90334396d219ee9ab2a371750)) * remove button leading ([84835c5](https://github.com/RSSNext/follow/commit/84835c5ed9df6ac1370b532980929049e8c0d245)) * remove clamp limit, close [#688](https://github.com/RSSNext/follow/issues/688) ([553ba7d](https://github.com/RSSNext/follow/commit/553ba7d61f48d94b7dd2fa89538ec8bd68956d1b)) @@ -330,10 +378,13 @@ * search items ensure unique keys ([#597](https://github.com/RSSNext/follow/issues/597)) ([ff14738](https://github.com/RSSNext/follow/commit/ff14738eeacf04ffe0c457f3600287fb2ddd0529)) * sentry config ([779236e](https://github.com/RSSNext/follow/commit/779236e0827af3981bce29e3c1ac9a527aec3fd5)) * set auth config first ([a281f58](https://github.com/RSSNext/follow/commit/a281f58a811213d933585280238fec4088ad7749)) +* set cmdf container `z-index` to `1000` ([#859](https://github.com/RSSNext/follow/issues/859)) ([db1d190](https://github.com/RSSNext/follow/commit/db1d19076c781696b9421f53dd79c35a6f49a324)) * set language when init ([fb3b592](https://github.com/RSSNext/follow/commit/fb3b59210ea1f54af234653b5146ba8a9d4bb8cb)) * set selector width as a fixed value ([eb2a845](https://github.com/RSSNext/follow/commit/eb2a84520df503ca4f36955b9d1b312d086fe75a)) * setting align ([b0e86b0](https://github.com/RSSNext/follow/commit/b0e86b08d51deb3d62a96ce93c78bc5b7683e259)) * setting item support props ([0d60da6](https://github.com/RSSNext/follow/commit/0d60da61cbd3bcec0544a4f328fc45dd065a004d)) +* setting modal should be resizable from bottomRight only ([#769](https://github.com/RSSNext/follow/issues/769)) ([7ef5dfc](https://github.com/RSSNext/follow/commit/7ef5dfc036dcfba1e5c5e6d5569ca1178b0d890a)) +* setting modal's edge round is covered by content background ([#768](https://github.com/RSSNext/follow/issues/768)) ([8d95143](https://github.com/RSSNext/follow/commit/8d951436df1d67146b5ed0ca83a7448bd9e23aa6)) * setting sidebar icon size ([dd7042e](https://github.com/RSSNext/follow/commit/dd7042e462f68184566ddf7cc561072066705379)) * setting wallet style update ([a4f155a](https://github.com/RSSNext/follow/commit/a4f155a7174b802e310baaeb2e8ed14d2f5735b2)) * shadow dom font and colors variants ([0355d4f](https://github.com/RSSNext/follow/commit/0355d4fb6bf5e57a1b22bb25d51f7e2c0fbe483a)) @@ -343,10 +394,12 @@ * shiki block style ([75908d4](https://github.com/RSSNext/follow/commit/75908d4a6f43847539accd4bad876983902bd5d8)) * shortcut modal overlay and id ([c210dc9](https://github.com/RSSNext/follow/commit/c210dc900eda2b30e05a9a5434f06810c1a6cd14)) * ShortcutMode cannot be closed using shortcuts keys ([#708](https://github.com/RSSNext/follow/issues/708)) ([12f3965](https://github.com/RSSNext/follow/commit/12f3965f6ac093d0b88eb5e25f47651649dc6ddd)) +* **shortcut:** replace `meta` to `ctrl` in windows ([c520448](https://github.com/RSSNext/follow/commit/c52044884770dcb9292f53e0d269e54d5561e51b)) * shortcuts kbd shake ([#433](https://github.com/RSSNext/follow/issues/433)) ([7e8f462](https://github.com/RSSNext/follow/commit/7e8f462424e6b2b98b316c9814610034db93f8c9)) * should dismiss when outside (quick new panel) ([675ac84](https://github.com/RSSNext/follow/commit/675ac845d4b9d7c6a71b7891440d2860ca34f0a4)) * should use markdown to render link in rsshub parameter desc ([#505](https://github.com/RSSNext/follow/issues/505)) ([2f64787](https://github.com/RSSNext/follow/commit/2f64787e4bc1bc21bf1c1741ed0179f80c66549a)) * show add feed error message ([7763129](https://github.com/RSSNext/follow/commit/77631299438b4fe6b575a9de5881cebfea6e4ba4)) +* show delete category action when available ([fd104d0](https://github.com/RSSNext/follow/commit/fd104d0087f070fd5621fa7081a3704eab1b5455)) * show episode cover for podcast ([#315](https://github.com/RSSNext/follow/issues/315)) ([4ef7f8c](https://github.com/RSSNext/follow/commit/4ef7f8cbd38dd0a148c053e5ee0468e282efe5fb)) * show fallback media when loading error ([#615](https://github.com/RSSNext/follow/issues/615)) ([40dfbde](https://github.com/RSSNext/follow/commit/40dfbde85e4e2fc2c3dc2daaff73ed520c998c37)) * show filtered button only if no next page ([6fb46e7](https://github.com/RSSNext/follow/commit/6fb46e7887409f735df99f7aa08cd0ef61976981)) @@ -363,6 +416,7 @@ * stable mark all feed list, fixed [#245](https://github.com/RSSNext/follow/issues/245) ([c9d098f](https://github.com/RSSNext/follow/commit/c9d098f4e9bc5d3e3ca5bd026f1947adf6dbcca7)) * stable shadow dom key ([06cafb5](https://github.com/RSSNext/follow/commit/06cafb50d8490a29856c27d9344b76090e9f81af)) * star icon place in grid template ([dc3ca01](https://github.com/RSSNext/follow/commit/dc3ca01df3870f5ef43b0e4654aa84fa46f034d8)) +* star icon position in list item ([170c41f](https://github.com/RSSNext/follow/commit/170c41f981a9f25057b51c2309fc81c99f941df4)) * stop stopPropagation on Media Imag ([a92f96b](https://github.com/RSSNext/follow/commit/a92f96bf6159316f595a742209a6bbca0d0b41fa)) * stored user profile item style ([64f40ee](https://github.com/RSSNext/follow/commit/64f40ee614a3d820b555c76b957287f289d01bb9)) * style ([#359](https://github.com/RSSNext/follow/issues/359)) ([3d39308](https://github.com/RSSNext/follow/commit/3d393086966826f194ae660b43bcb0cb33b3d6f3)) @@ -374,6 +428,7 @@ * **styles:** user subscription modal list item style ([a954eb9](https://github.com/RSSNext/follow/commit/a954eb93bc74fc6730244e15067888f88743d067)) * **style:** video play button align center ([465f1a6](https://github.com/RSSNext/follow/commit/465f1a6acf6a1d96a28e724f071f8a68a327a56d)) * subcription status & category empty, input value null ([#263](https://github.com/RSSNext/follow/issues/263)) ([93e2ccf](https://github.com/RSSNext/follow/commit/93e2ccfd5831f8a7f43932acd2976785e3adfbff)) +* subscription group category name ellipsis ([1665a5b](https://github.com/RSSNext/follow/commit/1665a5b2a8b4d4c5810fab38e31610397107e554)) * subscription inbox data ([2b496c4](https://github.com/RSSNext/follow/commit/2b496c4e49f223a9d00381983149e827bdb695fd)) * subview layout ([36a34de](https://github.com/RSSNext/follow/commit/36a34de26caf2ff00847827635eedd3771faadc0)) * supports Windows ([#189](https://github.com/RSSNext/follow/issues/189)) ([486a328](https://github.com/RSSNext/follow/commit/486a328d357317361ef24222fab09eb47e26d07d)) @@ -390,11 +445,15 @@ * toc not responsive in dev mode ([ee1894c](https://github.com/RSSNext/follow/commit/ee1894c2d0c420ecf0e63a6dd6bafda57a25a6e3)) * toc range calcation ([2ebcc58](https://github.com/RSSNext/follow/commit/2ebcc58414802cffc84fc25ad30bb9fe272ea773)) * toc scroll logic ([261d12e](https://github.com/RSSNext/follow/commit/261d12e5600028a5bff3b2c1451271ee962403ed)) +* toc width logic ([0c582f2](https://github.com/RSSNext/follow/commit/0c582f24e7619b6602a66dc8ab01a0e785715af6)) * tooltip content of open image and improve i18n support ([#689](https://github.com/RSSNext/follow/issues/689)) ([440de7b](https://github.com/RSSNext/follow/commit/440de7b737f9abcadc68ab1099fd28a8e6710699)) * tooltip in dark mode shadow ([55266ce](https://github.com/RSSNext/follow/commit/55266ce2cceea4e348c33989398f8f9bb92644a7)) * tooltip style in dark mode ([a61c79e](https://github.com/RSSNext/follow/commit/a61c79ee7d4bd73fdf35fa5565c711297a29c7a0)) * transcation table text overflow ([a026c6e](https://github.com/RSSNext/follow/commit/a026c6e34c0eeac1ee6acec1c8181c009ca0ab36)) * translation markdown tooltip wrapper style ([639bace](https://github.com/RSSNext/follow/commit/639bace313311db6319fb1fe168b68af7aa1e8e0)) +* translation tooltip width ([58d251e](https://github.com/RSSNext/follow/commit/58d251e6e40f3b41d99528411d2a90e65bd519da)), closes [#811](https://github.com/RSSNext/follow/issues/811) +* translation tooltip z index ([71abbc9](https://github.com/RSSNext/follow/commit/71abbc9b8e0954b0ef6b4d65709b40222b8acc81)) +* trending icon ([e09dce4](https://github.com/RSSNext/follow/commit/e09dce467b4c13fc585646a944e8b77a1903d4d7)) * truncate long title in dialog title ([#729](https://github.com/RSSNext/follow/issues/729)) ([8d25987](https://github.com/RSSNext/follow/commit/8d259878c30a987940d7e982c63b37f100008635)) * try fix vercel config ([968dea9](https://github.com/RSSNext/follow/commit/968dea91f474a76298091de6a23f3ba7a11fb22f)) * try to fix linux build ([89eda0f](https://github.com/RSSNext/follow/commit/89eda0f2148b5cc4d45d95f462c6a721022d0bc8)) @@ -402,6 +461,8 @@ * try to fix windows get version ([9fe5a0e](https://github.com/RSSNext/follow/commit/9fe5a0e34571eb86041a108403909c5953ebf6f5)) * try vercel conf ([309db21](https://github.com/RSSNext/follow/commit/309db219e8bc1f0d37acc64e699116403b2d5ebb)) * tts should hide in web ([30721c8](https://github.com/RSSNext/follow/commit/30721c8170baf131a457d97a2a723e96b7b7fc94)) +* turn off native form autocompletion in `AutoCompletion` ([#869](https://github.com/RSSNext/follow/issues/869)) ([a421e5d](https://github.com/RSSNext/follow/commit/a421e5d63664476c6d75c41ac819f00fd8bab75c)) +* type error ([afb7997](https://github.com/RSSNext/follow/commit/afb7997de2601495a643d8d7cc897adea05081b5)) * type error ([97779a0](https://github.com/RSSNext/follow/commit/97779a0daab9ea488619a4fd0a10317a067b71dc)) * type error ([3fb8eac](https://github.com/RSSNext/follow/commit/3fb8eac4f8ff1a6505ee1ed035a713321b63b4c4)) * type error ([c7f11f9](https://github.com/RSSNext/follow/commit/c7f11f99f28bf918aaf8c03b74145b2f9b126a72)) @@ -417,6 +478,7 @@ * typing ([a386fd6](https://github.com/RSSNext/follow/commit/a386fd6e97fb98c42b3eedf156c5b167ff67bd34)) * typo ([deb96c5](https://github.com/RSSNext/follow/commit/deb96c538258c939c60762c723d58955899031cf)) * **ui:** entry title line height ([#608](https://github.com/RSSNext/follow/issues/608)) ([5309491](https://github.com/RSSNext/follow/commit/53094912981ad8cfc79120621725bab1708250f8)) +* **ui:** fetch error toast margin ([e5fc18f](https://github.com/RSSNext/follow/commit/e5fc18fd9a16a0e32928b2d2b04c7d48d546c782)) * **ui:** social media gap if no media ([1435632](https://github.com/RSSNext/follow/commit/14356325e42d87c43f33b975fbb1d963cfa67251)) * **ui:** social media unread dot position ([e760676](https://github.com/RSSNext/follow/commit/e760676827297f60a4d00a51f4be98579c93c9f7)) * undo kbd color in dark mode ([2a106ae](https://github.com/RSSNext/follow/commit/2a106ae632e0641d58d0d45b88f61a1c5c6eafa5)) @@ -426,6 +488,8 @@ * unify setting tab icon color, fix [#303](https://github.com/RSSNext/follow/issues/303) ([33a049a](https://github.com/RSSNext/follow/commit/33a049a8513f5c3cab9ce8a6adefadf7399164f8)) * unread state not up to date, fix [#485](https://github.com/RSSNext/follow/issues/485) ([96f7762](https://github.com/RSSNext/follow/commit/96f77623edd04582e95aa8125ccf4515daac96c1)) * update cmdk high contrast, [@unixzii](https://github.com/unixzii) advice ([cbd7593](https://github.com/RSSNext/follow/commit/cbd75932433ad056b257c5934e6aefc3c0d829dd)) +* update entry action notifications and translations ([#836](https://github.com/RSSNext/follow/issues/836)) ([9230cf7](https://github.com/RSSNext/follow/commit/9230cf71752432ab2d411ae2a83400c37c2a5f2a)) +* update inbox action button ([f7961ed](https://github.com/RSSNext/follow/commit/f7961edc29d786a57f06f9d128a5ca9e506e0eea)) * update invitation fab ([0cd1837](https://github.com/RSSNext/follow/commit/0cd183780f299b94a800cd86342484afa7f716bd)) * update lists table ui ([0d68e75](https://github.com/RSSNext/follow/commit/0d68e7584592d08191c54a16257dd92924216387)) * update search for ([b51d75f](https://github.com/RSSNext/follow/commit/b51d75ffc9b0a9c2760269041aaa4c5a7f6b26d0)) @@ -452,12 +516,15 @@ * **wallet:** add missing space between words in wallet ([#279](https://github.com/RSSNext/follow/issues/279)) ([6873d21](https://github.com/RSSNext/follow/commit/6873d21e267fda102b13bc2a4e52de9bd7eea206)) * window titlebar position, fixed [#197](https://github.com/RSSNext/follow/issues/197) ([b6158ec](https://github.com/RSSNext/follow/commit/b6158ec0bd1e18aed29d028f2ff86008489c8a64)) * windows app titlebar style in dark mode and radius ([3843905](https://github.com/RSSNext/follow/commit/38439050bb6db71bf6d966ab43026b660ad24f9a)) +* Windows json sort diff ([74bf02b](https://github.com/RSSNext/follow/commit/74bf02bdd3ad6bc5c252f568787653819c1a8f2e)) * windows load locale resource, fixed [#447](https://github.com/RSSNext/follow/issues/447) ([862757a](https://github.com/RSSNext/follow/commit/862757a99ff5246058db5ca0d7e60b5f08a2f7ed)) * windows locale lead to app crash, fixed [#255](https://github.com/RSSNext/follow/issues/255) ([bb43da9](https://github.com/RSSNext/follow/commit/bb43da981894d4bf611218bd4b2001a39636df64)) * windows maximize will lost frame and background material ([2bd0e78](https://github.com/RSSNext/follow/commit/2bd0e78e4f859d9c98f53f748c9871a41348db1c)) * windows multi-display ([7490cd1](https://github.com/RSSNext/follow/commit/7490cd12d0e42a7f41931acd9d77bf64be39a26d)) +* windows sep, fixes [#741](https://github.com/RSSNext/follow/issues/741) ([9b1de77](https://github.com/RSSNext/follow/commit/9b1de775d2157606c30c4ece3287a42e1e9463a3)) * **windows:** dont remove locale ([7305eba](https://github.com/RSSNext/follow/commit/7305eba3fee218330818d96ca155f833aa99d631)) * **windows:** skip remove locle ([5df82d0](https://github.com/RSSNext/follow/commit/5df82d0c0f98bebb6e78a694a6ceda3644eb36ef)) +* withdraw availableBalance ([167d82a](https://github.com/RSSNext/follow/commit/167d82adc061078102fa9984d29f94735d052ce9)) * wrong opening status of newly added feed ([#726](https://github.com/RSSNext/follow/issues/726)) ([2520ddb](https://github.com/RSSNext/follow/commit/2520ddb0f4f1923b729ae707a703713f1a158f06)) * wrong text wrap ([#316](https://github.com/RSSNext/follow/issues/316)) ([0cee7ef](https://github.com/RSSNext/follow/commit/0cee7eff25ed1058b108f1c7a9c643ea17b479c0)) * wtf, cursor deleted my code ([1852d1e](https://github.com/RSSNext/follow/commit/1852d1ee812567c473ff26d316b93d1ccf8e8a88)) @@ -474,6 +541,7 @@ * add biz code i18n for fr and ru ([#521](https://github.com/RSSNext/follow/issues/521)) ([0dc4b86](https://github.com/RSSNext/follow/commit/0dc4b866d7eff2d32df2158902d6d1fbdea41f27)) * add biz code i18n for zh-cn ([#503](https://github.com/RSSNext/follow/issues/503)) ([d35e011](https://github.com/RSSNext/follow/commit/d35e0119953a154d18273c1d155f14d03c9a6ce8)) * add biz user info on sentry tracker ([e3e52ab](https://github.com/RSSNext/follow/commit/e3e52abedeb5507ca71d663faa7ef050b661cf0a)) +* add copy title to context menu of feed entry ([#801](https://github.com/RSSNext/follow/issues/801)) ([1f57ab2](https://github.com/RSSNext/follow/commit/1f57ab2ac76ef04aff37814b4c7e961ad33b6e11)) * add discover back to top fab ([a97e60c](https://github.com/RSSNext/follow/commit/a97e60cd005ca7ebb5aed56655b94975ebf1ccb7)) * add divider when sticky for date item ([755e292](https://github.com/RSSNext/follow/commit/755e292af05c3adeae8943cc5c4c05af11d30d16)) * add external resource ([abec0ef](https://github.com/RSSNext/follow/commit/abec0ef191a8138c109b4a52fa36b04f8e7c16bc)) @@ -485,6 +553,7 @@ * add manual setting lang lock keyu ([b9c6a8b](https://github.com/RSSNext/follow/commit/b9c6a8b58099c86a178494ffe4c875f7c31760a3)) * add missing words in zh-HK ([#610](https://github.com/RSSNext/follow/issues/610)) ([d34c1c9](https://github.com/RSSNext/follow/commit/d34c1c95d68445075987f833d29956b45e1036a3)) * add more words i18n ([#516](https://github.com/RSSNext/follow/issues/516)) ([e2b8ec8](https://github.com/RSSNext/follow/commit/e2b8ec88624ad1e8e7f6136a624fc284ae3fb77b)) +* add more words i18n ([#785](https://github.com/RSSNext/follow/issues/785)) ([892ceb2](https://github.com/RSSNext/follow/commit/892ceb2269ec553049c86a8b295c0a08e5649b04)) * add object-cover to feed icon, add zh-HK and zh-TW errors lang ([#508](https://github.com/RSSNext/follow/issues/508)) ([9351a8f](https://github.com/RSSNext/follow/commit/9351a8fe735977ae02320370f9aa6a83854d7adf)) * add og image, fixed [#242](https://github.com/RSSNext/follow/issues/242) ([5d4e958](https://github.com/RSSNext/follow/commit/5d4e9586569e4afe212138d2001ed9007ce9950b)) * add overflow tooltip for feed title ([a89ad8b](https://github.com/RSSNext/follow/commit/a89ad8be84384c1851587d02f6b21ce64ad24bdb)) @@ -527,6 +596,7 @@ * custom feed title ([#300](https://github.com/RSSNext/follow/issues/300)) ([501e2f4](https://github.com/RSSNext/follow/commit/501e2f44c1d3eb9a1a316549faedb2e1288f7fbe)) * date item in entry column ([#199](https://github.com/RSSNext/follow/issues/199)) ([9d5a811](https://github.com/RSSNext/follow/commit/9d5a81112e873f5b422356fa0b3fcf526abb84e5)) * dayjs locale ([6ed0a3b](https://github.com/RSSNext/follow/commit/6ed0a3bf3a937a95985c98bb24c4bc23f6b776de)) +* delete list ([c881d79](https://github.com/RSSNext/follow/commit/c881d799e27b4934144b25f50a493f96838003d5)) * display a tip button and tip users at the bottom of the entry content. ([971f81d](https://github.com/RSSNext/follow/commit/971f81d25d5745748884dcc96a1a072aee3d3dbb)) * display certification in discover form ([1e212ef](https://github.com/RSSNext/follow/commit/1e212effad12bab751179dc9a94d71a37a3b5ed8)) * display claimed feed list in settings ([d9ae277](https://github.com/RSSNext/follow/commit/d9ae277cfa861c4e558542820896bde821341dc4)) @@ -542,6 +612,7 @@ * enlarge the interactive area of the close button ([#483](https://github.com/RSSNext/follow/issues/483)) ([3cc7c21](https://github.com/RSSNext/follow/commit/3cc7c2117d951f9994963c7e4017293b4a8840fa)) * entry preview modal ([3981995](https://github.com/RSSNext/follow/commit/3981995a248680844cdd5a1f7663135863f4ef5f)) * expand entry read history ([#377](https://github.com/RSSNext/follow/issues/377)) ([e7f923a](https://github.com/RSSNext/follow/commit/e7f923a0a08e5a4c7e13ff8dd76820f1b4265f25)) +* export feeds, close [#873](https://github.com/RSSNext/follow/issues/873) ([eae857d](https://github.com/RSSNext/follow/commit/eae857d25e31532fc2f53e3edc71263a94410922)) * expose present user profile modal for electron ([2290760](https://github.com/RSSNext/follow/commit/2290760cbb71c0c061d4be3dc00fa20e9f1ec19a)) * external page i18n ([8d8aa09](https://github.com/RSSNext/follow/commit/8d8aa09230eb5ddd55dffe074b20c9ed81e84a99)) * extract i18n text ([8454691](https://github.com/RSSNext/follow/commit/8454691e221d2f8544b2b741dbaeaf95303abc51)) @@ -587,14 +658,17 @@ * **i18n:** Update Chinese Translation ([#572](https://github.com/RSSNext/follow/issues/572)) ([d24139b](https://github.com/RSSNext/follow/commit/d24139b82233ea04674c8b93ddee323d2c84a8ef)) * **i18n:** zh-CN: context menu of adding feeds to lists ([#661](https://github.com/RSSNext/follow/issues/661)) ([c3b2fa9](https://github.com/RSSNext/follow/commit/c3b2fa9274ef1e199e66d07c94dc6674f1de6045)) * ignore feed errors within 9 hours ([b71926e](https://github.com/RSSNext/follow/commit/b71926ec286b77dd1b9fc25df459176063b194da)) +* image proxy for avatar images ([#524](https://github.com/RSSNext/follow/issues/524)) ([e33aa5f](https://github.com/RSSNext/follow/commit/e33aa5f0c78f6d1664433405c6d705a507a8aeac)) * **image:** blurhash for entry media preview, and other adjustment ([b688848](https://github.com/RSSNext/follow/commit/b688848dacc25f3106c90681b3044a69571a54d5)) * impl cmd+b ([ea8a832](https://github.com/RSSNext/follow/commit/ea8a83271e9be37c277540eb605651d7166d2ea4)) * impl masonry in view mark read and scroll to mark read ([4263658](https://github.com/RSSNext/follow/commit/4263658e3240850ca74fcaa666bf8145553f8874)) +* implement immersive translation functionality with caching support in entry content module ([#714](https://github.com/RSSNext/follow/issues/714)) ([3b67b2c](https://github.com/RSSNext/follow/commit/3b67b2c0a79db9b232336bb5f36eb1e756f4b86e)) * improve shiki code block renderer and show language ([590d9cb](https://github.com/RSSNext/follow/commit/590d9cbb94a63f843d00bf54848bba40157d2452)) * inbox ([#742](https://github.com/RSSNext/follow/issues/742)) ([2fba746](https://github.com/RSSNext/follow/commit/2fba746447c1c10f2d58ac9eb908cd0d6a5fb364)) * inbox list api ([6da197c](https://github.com/RSSNext/follow/commit/6da197c76bc4d08c80277fc8801a68bfbd413248)) * inbox set read and unread ([6da8bce](https://github.com/RSSNext/follow/commit/6da8bce04cb0da99efbad473879350131f993c16)) * inbox unread data updating ([61d9a48](https://github.com/RSSNext/follow/commit/61d9a48310d726205271d1d01026511fb4ccb276)) +* independent power page ([6aeb666](https://github.com/RSSNext/follow/commit/6aeb66683b2e03ba3f21647589e03ac2b705bf83)) * integration settings page ([f9f1938](https://github.com/RSSNext/follow/commit/f9f19386b28e853eb03b3ca5bae629d4f6542cb3)) * invitation limitation message ([fa37a0c](https://github.com/RSSNext/follow/commit/fa37a0ca2c8235fb5fd47f96c26de7fdcd762ad8)) * **invitation:** add signout button ([3c0f4e7](https://github.com/RSSNext/follow/commit/3c0f4e779c68a933d57e232d62774fca1c0b86ed)) @@ -642,18 +716,23 @@ * path parser v8 ([5be2e9a](https://github.com/RSSNext/follow/commit/5be2e9aad4309ba5d63451460d674e233981f6e3)) * picture entry preview modal ([29f2c0c](https://github.com/RSSNext/follow/commit/29f2c0ca41badb34b001ac9dff91c1e2b600a71f)) * pictures masonry ([#212](https://github.com/RSSNext/follow/issues/212)) ([3f9533a](https://github.com/RSSNext/follow/commit/3f9533aa3a4470b6d705eda15ed988dc0686858a)) +* power page redirection ([dd398cd](https://github.com/RSSNext/follow/commit/dd398cdc4d082f1c3292dc5fc4729a88a9650756)) * preview media min width ([242d0aa](https://github.com/RSSNext/follow/commit/242d0aa55eb5bef84d714ee43fa4b614f726fd03)) * preview social media ai daily ([0252bc0](https://github.com/RSSNext/follow/commit/0252bc022306123973ffd27b1cb211aadffae052)) * prompt the full categories when editing the feed ([#392](https://github.com/RSSNext/follow/issues/392)) ([d5ce474](https://github.com/RSSNext/follow/commit/d5ce4744fe28c5d4d05844af6fe344fdf7849424)) * read clipboard ([e115b6d](https://github.com/RSSNext/follow/commit/e115b6de66df93422465044bc2d2930aa7a073fc)) * read image proxy url from ab value ([d81f57d](https://github.com/RSSNext/follow/commit/d81f57d2ad24ab9176a6d342f427676065c0f5f6)) * readability support ([#178](https://github.com/RSSNext/follow/issues/178)) ([6c052b8](https://github.com/RSSNext/follow/commit/6c052b881b77e75763a9c4117cd562d21a58044d)) +* readHistories option for reads post ([6ce2c22](https://github.com/RSSNext/follow/commit/6ce2c2270fbe611fc7ac8f532f68a45cf5f86cff)) * redesign image preview swiper style ([23971b5](https://github.com/RSSNext/follow/commit/23971b53f383dc1d6793c3b0dd4ca58a71c5b71e)) * reduce motion use fade-in and fade-out transition ([78053c1](https://github.com/RSSNext/follow/commit/78053c17fd91ccd7568fe57af3767cd6636929e2)) * refresh cursor style when split panel can't drag ([c9f70c0](https://github.com/RSSNext/follow/commit/c9f70c09891eaf5dec89c305a5382e705c8c7eb3)) * refresh unread data in entries refresh action ([31dfbd8](https://github.com/RSSNext/follow/commit/31dfbd8de56bafa6b26188a1329d9d81fca36ed6)) +* registerPushNotifications ([#812](https://github.com/RSSNext/follow/issues/812)) ([baab5b9](https://github.com/RSSNext/follow/commit/baab5b993f3adef1865e136ba668bfad5492201b)) * Remember the open state of the category, Ensure that each View'… ([#709](https://github.com/RSSNext/follow/issues/709)) ([cb2078d](https://github.com/RSSNext/follow/commit/cb2078da70ac93add77aee9da83d5687c4b8b9c8)) +* remove power modal ([80f1b0f](https://github.com/RSSNext/follow/commit/80f1b0fd287e38c9cfe82e2ec9099c21fe863bf1)) * remove tooltip border ([9e770c9](https://github.com/RSSNext/follow/commit/9e770c96a18beeb290adb9d189dd6afff9dbb817)) +* remove userId query for wallet get ([b19fc2b](https://github.com/RSSNext/follow/commit/b19fc2be2e0a4a7b49b61619c42170be0d6d100b)) * render social media with full text ([1531d2b](https://github.com/RSSNext/follow/commit/1531d2b70916b3aff7293db411f472cb013cc4e7)) * resizeable setting panel and adjust action tab ([5fd9b23](https://github.com/RSSNext/follow/commit/5fd9b23f03bccd6d3bc427ee0e5c31bfb69e3c42)) * save to instapaper ([9d9b2c5](https://github.com/RSSNext/follow/commit/9d9b2c5eccc11b5d6ca10be59041aef4985cc34b)) @@ -668,6 +747,7 @@ * show media fallback for picture items ([83123f8](https://github.com/RSSNext/follow/commit/83123f8fb23e03a3384719e9228301aac122c215)) * show media fallback for video item ([3446a81](https://github.com/RSSNext/follow/commit/3446a81ea28d9e18e5dfa18306758cda64637520)) * show reasons for profile update failure ([#484](https://github.com/RSSNext/follow/issues/484)) ([b8b94ac](https://github.com/RSSNext/follow/commit/b8b94ac6c4e97088144f20cb8abd8f1d8080f8fd)) +* silence action ([#823](https://github.com/RSSNext/follow/issues/823)) ([dd0364d](https://github.com/RSSNext/follow/commit/dd0364d1a9e521a0669f014c6ff51570181aafdd)) * smaller and fixed unread dot ([72aa3a8](https://github.com/RSSNext/follow/commit/72aa3a8cae968893b7ca3b0f8abf11c50c739c74)) * smaller lists image ([31591d6](https://github.com/RSSNext/follow/commit/31591d68d595c9b44bf2ec49b7e3083acd612bb3)) * some optimize ([5f61579](https://github.com/RSSNext/follow/commit/5f6157972c7ce2bf45b6e7b4026d9e727795c9a3)) @@ -682,6 +762,7 @@ * support i18n ([#345](https://github.com/RSSNext/follow/issues/345)) ([53c1c66](https://github.com/RSSNext/follow/commit/53c1c6639f3e7383ec77f6aace672ba34cd8bbba)) * support pageup/pagedown to scroll up/down ([6e0c3bc](https://github.com/RSSNext/follow/commit/6e0c3bc5e3e2437a51fa991940b4e4496ed2bb75)) * support setting proxy for app ([#452](https://github.com/RSSNext/follow/issues/452)) ([cfd5275](https://github.com/RSSNext/follow/commit/cfd527545ade50a529698bdd57ec16d0f3ccee98)) +* support shortcut to toggle wide mode ([b7a054f](https://github.com/RSSNext/follow/commit/b7a054f3132079693f0d93a65eb236c95920bcb8)) * support toc parser ([fb4ca52](https://github.com/RSSNext/follow/commit/fb4ca522440aced4d2aa18fda2a9d5c43e32d0d1)) * sync indicator when disable ([945ddda](https://github.com/RSSNext/follow/commit/945dddae2534f07e5289e307c36de1f8334636bc)) * tiny styles ([78bcc55](https://github.com/RSSNext/follow/commit/78bcc5562baa12cece51da6564b77c6f37a1596c)) @@ -689,6 +770,12 @@ * toast when upgrade ([2a71bfc](https://github.com/RSSNext/follow/commit/2a71bfc0756011c0226c16ef53a755a47cf44acb)) * toc hoverable ([3be6f2b](https://github.com/RSSNext/follow/commit/3be6f2ba019cb914e8ff452065d252e01e7ae496)) * toc position calcation ([a7828d4](https://github.com/RSSNext/follow/commit/a7828d41e1e8e849a4f7df7e0c5e50c5d15a2491)) +* **toc:** redesign toc item in wide mode ([535afe2](https://github.com/RSSNext/follow/commit/535afe2393fafe6ea18bc4254c79132967825238)) +* transform html ([#870](https://github.com/RSSNext/follow/issues/870)) ([926ef00](https://github.com/RSSNext/follow/commit/926ef007854e8b5bda885c58f97469818589b930)) +* **trending:** implement trending feature and components ([#820](https://github.com/RSSNext/follow/issues/820)) ([6c4c543](https://github.com/RSSNext/follow/commit/6c4c5437085934f38c0527ac61239460c1c19cfc)) +* trim social media view end redundant br elements ([#826](https://github.com/RSSNext/follow/issues/826)) ([f83278b](https://github.com/RSSNext/follow/commit/f83278bff841b324e420d311ca592a5e77657f0b)) +* tx types filter ([142c0f5](https://github.com/RSSNext/follow/commit/142c0f5712980407c688700bf8c98412caa8ea89)) +* **ui:** enhance context menu with hover effects, disable option, and quick list creation ([#787](https://github.com/RSSNext/follow/issues/787)) ([d2b5cc3](https://github.com/RSSNext/follow/commit/d2b5cc36e9750403d0cc9ee48db842d993c3f7e6)) * **ui:** social media ui refresh ([#459](https://github.com/RSSNext/follow/issues/459)) ([fcd96ab](https://github.com/RSSNext/follow/commit/fcd96ab2db4335caa8a6d5055cf12b0a2802fea1)) * update discord link ([a45071b](https://github.com/RSSNext/follow/commit/a45071b75da3fa343d52d3ddd6626693b73ea35d)) * update hono.ts ([66174a0](https://github.com/RSSNext/follow/commit/66174a028d0e709e0bd38cd7862bddeb1bdd19b4)) @@ -698,6 +785,7 @@ * update invitations ([84c7b46](https://github.com/RSSNext/follow/commit/84c7b46155c064eab1dbd030add4a00dee412469)) * update readwise logo ([c85460c](https://github.com/RSSNext/follow/commit/c85460c5bd13a3dadda1d4592b1ce6e434f4a8c6)) * update redirect page layout ([bca6276](https://github.com/RSSNext/follow/commit/bca627696eca663abb02483ffb5c98ed2dc0eebc)) +* updateNotificationsToken on login ([810919c](https://github.com/RSSNext/follow/commit/810919ca1bff128503e8386118bf9d7323479068)) * use check api for dailytask; claim toast ([feec0b0](https://github.com/RSSNext/follow/commit/feec0b0f0fb717725bf34208715d89c73968e885)) * use claim check api ([03764da](https://github.com/RSSNext/follow/commit/03764dac0ec500068376372ce4d85b1bc412bcd4)) * use dotlottie and add confetti ([2385d15](https://github.com/RSSNext/follow/commit/2385d1530c62d7adada3923832d8f57a13268b6e)) @@ -710,10 +798,15 @@ * warn when go to external untrusted link ([06be9b5](https://github.com/RSSNext/follow/commit/06be9b58f7c054ef166ea7d5759944280de9a201)) * webhook action setting ([0016a07](https://github.com/RSSNext/follow/commit/0016a0742b7ecd107152e09cb629d0d2ea637764)) * wide mode ([346db5a](https://github.com/RSSNext/follow/commit/346db5ad480966d669edf4d4e1517fba866de93a)) +* wide mode icon ([a19ab9a](https://github.com/RSSNext/follow/commit/a19ab9a24778bb0be2bed43bc584778d49e798d0)) +* **wide-mode:** support `esc` to return back ([a162b3b](https://github.com/RSSNext/follow/commit/a162b3be9f795056b15a7ead339e271884d30e4e)) +* wider user drop menu ([555428c](https://github.com/RSSNext/follow/commit/555428cbb58d13a3eac50edb3dcfbc7269e920c3)) ### Performance Improvements +* cache setting key selected atom ([bbde776](https://github.com/RSSNext/follow/commit/bbde776be35f53c0b6715c031e0c39920c76dcd5)) +* compress and split main entry bundle size ([766ce67](https://github.com/RSSNext/follow/commit/766ce6732cebb54b90f7e8e34d95ff591fec4ab2)) * **i18n:** use nested key to reduce i18n resource size ([4fb1487](https://github.com/RSSNext/follow/commit/4fb1487576bf3100e6cb2a8170c9d936b6401b42)) * memo entry column to reduce resize panel re-render ([6bca4b4](https://github.com/RSSNext/follow/commit/6bca4b4a033d27b0953a8e6c3e625e3cd9b71277)) * merge all namespace of i18n resource in prod ([92bfce0](https://github.com/RSSNext/follow/commit/92bfce0f7e5faa6eef8d19d813f682271dc1bbf0)) diff --git a/package.json b/package.json index e3ed3504c..3647b212e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "Follow", "type": "module", - "version": "0.0.1-alpha.19", + "version": "0.0.1-alpha.20", "private": true, "packageManager": "pnpm@9.11.0", "description": "Next generation information browser", From 996113948a932c1c66f8e892eb2d9a7851669c18 Mon Sep 17 00:00:00 2001 From: Innei <tukon479@gmail.com> Date: Sat, 12 Oct 2024 14:07:25 +0800 Subject: [PATCH 16/35] chore: feed column footer version margin Signed-off-by: Innei <tukon479@gmail.com> --- apps/renderer/src/pages/(main)/layout.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/renderer/src/pages/(main)/layout.tsx b/apps/renderer/src/pages/(main)/layout.tsx index 0b7c472bb..f49abbf1c 100644 --- a/apps/renderer/src/pages/(main)/layout.tsx +++ b/apps/renderer/src/pages/(main)/layout.tsx @@ -48,9 +48,9 @@ import { AppLayoutGridContainerProvider } from "~/providers/app-grid-layout-cont const FooterInfo = () => { const { t } = useTranslation() return ( - <div className="relative"> + <div className="relative !mt-0"> {APP_VERSION?.[0] === "0" && ( - <div className="pointer-events-none !mt-0 w-full py-3 text-center text-xs opacity-20"> + <div className="pointer-events-none w-full py-3 text-center text-xs opacity-20"> {t("early_access")}{" "} {GIT_COMMIT_SHA ? `(${GIT_COMMIT_SHA.slice(0, 7).toUpperCase()})` : ""} </div> From 23fc4ad78a44c2399f0faed888de399ee03e17c9 Mon Sep 17 00:00:00 2001 From: Innei <tukon479@gmail.com> Date: Sat, 12 Oct 2024 15:16:18 +0800 Subject: [PATCH 17/35] chore: update changelogithub Signed-off-by: Innei <tukon479@gmail.com> --- .github/workflows/build.yml | 2 +- changelogithub.config.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9fade4a1e..e73176ce8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -150,7 +150,7 @@ jobs: out/make/**/*.AppImage out/make/**/*.yml - - run: npx @innei/changelogithub + - run: npx changelogithub if: github.ref_type == 'tag' || github.event.inputs.tag_version != '' continue-on-error: true env: diff --git a/changelogithub.config.ts b/changelogithub.config.ts index 40322ada1..726e583e3 100644 --- a/changelogithub.config.ts +++ b/changelogithub.config.ts @@ -1,4 +1,4 @@ export default { tagFilter: (tag: string) => tag.startsWith("v") && !tag.includes("nightly"), - dry: true, + dry: !process.env.CI, } From fc38072320f8225e6ae60f4e25719eaeb9ff5e6a Mon Sep 17 00:00:00 2001 From: Innei <tukon479@gmail.com> Date: Sat, 12 Oct 2024 15:26:26 +0800 Subject: [PATCH 18/35] fix(vercel): filter subpath Signed-off-by: Innei <tukon479@gmail.com> --- vercel.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vercel.json b/vercel.json index c85609201..de5710a18 100644 --- a/vercel.json +++ b/vercel.json @@ -9,7 +9,7 @@ "destination": "/__debug_proxy.html" }, { - "source": "/(.*)", + "source": "/((?!assets|vendor|locales/).*)", "destination": "/index.html" } ], From 079043f423a5e4043012a32f8e4f6abf4941e480 Mon Sep 17 00:00:00 2001 From: DIYgod <i@diygod.me> Date: Sat, 12 Oct 2024 16:13:56 +0800 Subject: [PATCH 19/35] chore: add VITE_FIREBASE_CONFIG --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e73176ce8..250a75abe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,6 +21,7 @@ env: VITE_IMGPROXY_URL: ${{ vars.VITE_IMGPROXY_URL }} VITE_SENTRY_DSN: ${{ vars.VITE_SENTRY_DSN }} VITE_POSTHOG_KEY: ${{ vars.VITE_POSTHOG_KEY }} + VITE_FIREBASE_CONFIG: ${{ vars.VITE_FIREBASE_CONFIG }} NODE_OPTIONS: --max-old-space-size=8192 jobs: From 97041abab5f0846249343de07f592ba6fc421870 Mon Sep 17 00:00:00 2001 From: DIYgod <i@diygod.me> Date: Sat, 12 Oct 2024 17:09:55 +0800 Subject: [PATCH 20/35] feat: notifications logger --- apps/main/src/init.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/main/src/init.ts b/apps/main/src/init.ts index b7d28879d..997800b3d 100644 --- a/apps/main/src/init.ts +++ b/apps/main/src/init.ts @@ -12,6 +12,7 @@ import { getIconPath } from "./helper" import { t } from "./lib/i18n" import { store } from "./lib/store" import { updateNotificationsToken } from "./lib/user" +import { logger } from "./logger" import { registerAppMenu } from "./menu" import type { RendererHandlers } from "./renderer-handlers" import { initializeSentry } from "./sentry" @@ -154,12 +155,15 @@ const registerPushNotifications = async () => { persistentIds: persistentIds || [], credentials, }) + logger.info(`PushReceiver initialized with token ${credentials?.fcm?.token}`) instance.onCredentialsChanged(({ newCredentials }) => { + logger.info(`PushReceiver credentials changed to ${newCredentials?.fcm?.token}`) updateNotificationsToken(newCredentials) }) instance.onNotification((notification) => { + logger.info(`PushReceiver received notification: ${JSON.stringify(notification.message.data)}`) const data = notification.message.data as MessagingData switch (data.type) { case "new-entry": { From 75e02472908529259e13292cce685692832d9d9a Mon Sep 17 00:00:00 2001 From: Whitewater <me@waterwater.moe> Date: Sat, 12 Oct 2024 02:33:40 -0800 Subject: [PATCH 21/35] refactor: revamp z-index usage (#864) * refactor: revamp z-index usage in root container * refactor: simplify modal structure and overlay handling * refactor: remove unnecessary z-index from SelectContent component * fix: update ModalOverlay to use Dialog.Overlay for improved dimiss behavior * feat: integrate ModalOverlay with default modal * refactor: extract ModalOverlay rendering into a variable for cleaner code * update Signed-off-by: Innei <tukon479@gmail.com> --------- Signed-off-by: Innei <tukon479@gmail.com> Co-authored-by: Innei <tukon479@gmail.com> --- .../ui/context-menu/context-menu.tsx | 2 +- .../ui/modal/stacked/declarative-modal.tsx | 11 ++---- .../src/components/ui/modal/stacked/modal.tsx | 32 +++++++++------ .../components/ui/modal/stacked/overlay.tsx | 11 ++++-- .../components/ui/modal/stacked/provider.tsx | 17 +------- apps/renderer/src/components/ui/select.tsx | 2 +- apps/renderer/src/modules/panel/cmdf.tsx | 39 ++++++++++--------- apps/renderer/src/pages/(main)/layout.tsx | 10 ++--- .../app-grid-layout-container-provider.tsx | 2 +- .../renderer/src/providers/root-providers.tsx | 13 ++++--- 10 files changed, 67 insertions(+), 72 deletions(-) diff --git a/apps/renderer/src/components/ui/context-menu/context-menu.tsx b/apps/renderer/src/components/ui/context-menu/context-menu.tsx index 1cec540a9..8134de6d5 100644 --- a/apps/renderer/src/components/ui/context-menu/context-menu.tsx +++ b/apps/renderer/src/components/ui/context-menu/context-menu.tsx @@ -46,7 +46,7 @@ const ContextMenuSubContent = React.forwardRef< <ContextMenuPrimitive.SubContent ref={ref} className={cn( - "z-[1001] min-w-32 overflow-hidden rounded-md border bg-theme-modal-background-opaque p-1 text-theme-foreground/90 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:shadow-zinc-800/60", + "min-w-32 overflow-hidden rounded-md border bg-theme-modal-background-opaque p-1 text-theme-foreground/90 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:shadow-zinc-800/60", className, )} {...props} diff --git a/apps/renderer/src/components/ui/modal/stacked/declarative-modal.tsx b/apps/renderer/src/components/ui/modal/stacked/declarative-modal.tsx index 1dea9153b..454df525b 100644 --- a/apps/renderer/src/components/ui/modal/stacked/declarative-modal.tsx +++ b/apps/renderer/src/components/ui/modal/stacked/declarative-modal.tsx @@ -6,9 +6,7 @@ import { jotaiStore } from "~/lib/jotai" import { cn } from "~/lib/utils" import { modalStackAtom } from "./atom" -import { MODAL_STACK_Z_INDEX } from "./constants" import { ModalInternal } from "./modal" -import { ModalOverlay } from "./overlay" import type { ModalProps } from "./types" export interface DeclarativeModalProps extends Omit<ModalProps, "content"> { @@ -40,12 +38,9 @@ const DeclarativeModalImpl: FC<DeclarativeModalProps> = ({ return ( <AnimatePresence> {open && ( - <> - <ModalInternal isTop onClose={onOpenChange} index={index} item={item}> - {children} - </ModalInternal> - <ModalOverlay zIndex={MODAL_STACK_Z_INDEX - 1 + index} /> - </> + <ModalInternal isTop onClose={onOpenChange} index={index} item={item}> + {children} + </ModalInternal> )} </AnimatePresence> ) diff --git a/apps/renderer/src/components/ui/modal/stacked/modal.tsx b/apps/renderer/src/components/ui/modal/stacked/modal.tsx index fcdd01cdb..1a5189d42 100644 --- a/apps/renderer/src/components/ui/modal/stacked/modal.tsx +++ b/apps/renderer/src/components/ui/modal/stacked/modal.tsx @@ -34,11 +34,12 @@ import { Divider } from "../../divider" import { RootPortalProvider } from "../../portal/provider" import { EllipsisHorizontalTextWithTooltip } from "../../typography" import { modalStackAtom } from "./atom" -import { MODAL_STACK_Z_INDEX, modalMontionConfig } from "./constants" +import { modalMontionConfig } from "./constants" import type { CurrentModalContentProps, ModalActionsInternal } from "./context" import { CurrentModalContext } from "./context" import { useResizeableModal } from "./hooks" -import type { ModalProps } from "./types" +import { ModalOverlay } from "./overlay" +import type { ModalOverlayOptions, ModalProps } from "./types" const DragBar = isElectronBuild ? ( <span className="drag-region fixed left-0 right-36 top-0 h-8" /> @@ -51,9 +52,10 @@ export const ModalInternal = memo( index: number isTop: boolean + overlayOptions?: ModalOverlayOptions onClose?: (open: boolean) => void } & PropsWithChildren - >(function Modal({ item, index, onClose: onPropsClose, children, isTop }, ref) { + >(function Modal({ item, overlayOptions, onClose: onPropsClose, children, isTop }, ref) { const { CustomModalComponent, modalClassName, @@ -96,8 +98,8 @@ export const ModalInternal = memo( ) const opaque = useUISettingKey("modalOpaque") + const modalSettingOverlay = useUISettingKey("modalOverlay") - const zIndexStyle = useMemo(() => ({ zIndex: MODAL_STACK_Z_INDEX + index + 1 }), [index]) const dismiss = useCallback( (e: SyntheticEvent) => { e.stopPropagation() @@ -224,10 +226,7 @@ export const ModalInternal = memo( } }, [switchHotkeyScope]) - const modalStyle = useMemo( - () => ({ ...zIndexStyle, ...resizeableStyle }), - [resizeableStyle, zIndexStyle], - ) + const modalStyle = resizeableStyle const isSelectingRef = useRef(false) const handleSelectStart = useCallback(() => { isSelectingRef.current = true @@ -269,17 +268,27 @@ export const ModalInternal = memo( }, []) useImperativeHandle(ref, () => modalElementRef.current!) + + const Overlay = ( + <ModalOverlay + blur={overlayOptions?.blur} + className={cn(overlayOptions?.className, { + hidden: item.overlay ? false : !modalSettingOverlay, + })} + /> + ) if (CustomModalComponent) { return ( <Wrapper> <Dialog.Root open onOpenChange={onClose} modal={modal}> <Dialog.Portal> + {Overlay} <Dialog.DialogTitle className="sr-only">{title}</Dialog.DialogTitle> <Dialog.Content asChild onOpenAutoFocus={openAutoFocus}> <div ref={edgeElementRef} className={cn( - "no-drag-region fixed z-20", + "no-drag-region fixed", modal ? "inset-0 overflow-auto" : "left-0 top-0", currentIsClosing ? "!pointer-events-none" : "!pointer-events-auto", modalContainerClassName, @@ -287,7 +296,6 @@ export const ModalInternal = memo( onPointerUp={handleDetectSelectEnd} onClick={handleClickOutsideToDismiss} onFocus={stopPropagation} - style={zIndexStyle} > {DragBar} <div @@ -315,12 +323,12 @@ export const ModalInternal = memo( <Wrapper> <Dialog.Root modal={modal} open onOpenChange={onClose}> <Dialog.Portal> + {Overlay} <Dialog.Content asChild onOpenAutoFocus={openAutoFocus}> <div ref={edgeElementRef} - style={zIndexStyle} className={cn( - "fixed z-20 flex", + "fixed flex", modal ? "inset-0 overflow-auto" : "left-0 top-0", currentIsClosing && "!pointer-events-none", modalContainerClassName, diff --git a/apps/renderer/src/components/ui/modal/stacked/overlay.tsx b/apps/renderer/src/components/ui/modal/stacked/overlay.tsx index 420861461..cbf618063 100644 --- a/apps/renderer/src/components/ui/modal/stacked/overlay.tsx +++ b/apps/renderer/src/components/ui/modal/stacked/overlay.tsx @@ -1,10 +1,11 @@ +import * as Dialog from "@radix-ui/react-dialog" import type { ForwardedRef } from "react" import { forwardRef } from "react" import { m } from "~/components/common/Motion" import { cn } from "~/lib/utils" -import { RootPortal } from "../../portal" +import { softSpringPreset } from "../../constants/spring" export const ModalOverlay = forwardRef( ( @@ -19,20 +20,22 @@ export const ModalOverlay = forwardRef( }, ref: ForwardedRef<HTMLDivElement>, ) => ( - <RootPortal> + <Dialog.Overlay asChild> <m.div ref={ref} id="modal-overlay" className={cn( - "!pointer-events-none fixed inset-0 z-[11] rounded-[var(--fo-window-radius)] bg-zinc-50/80 dark:bg-neutral-900/80", + // NOTE: pointer-events-none is required, if remove this, when modal is closing, you can not click element behind the modal + "!pointer-events-none fixed inset-0 rounded-[var(--fo-window-radius)] bg-zinc-50/80 dark:bg-neutral-900/80", blur && "backdrop-blur-sm", className, )} + transition={softSpringPreset} initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }} style={{ zIndex }} /> - </RootPortal> + </Dialog.Overlay> ), ) diff --git a/apps/renderer/src/components/ui/modal/stacked/provider.tsx b/apps/renderer/src/components/ui/modal/stacked/provider.tsx index 97996ba11..076fcec21 100644 --- a/apps/renderer/src/components/ui/modal/stacked/provider.tsx +++ b/apps/renderer/src/components/ui/modal/stacked/provider.tsx @@ -2,12 +2,8 @@ import { AnimatePresence } from "framer-motion" import { useAtomValue } from "jotai" import type { FC, PropsWithChildren } from "react" -import { useUISettingKey } from "~/atoms/settings/ui" - import { modalStackAtom } from "./atom" -import { MODAL_STACK_Z_INDEX } from "./constants" import { ModalInternal } from "./modal" -import { ModalOverlay } from "./overlay" export const ModalStackProvider: FC<PropsWithChildren> = ({ children }) => ( <> @@ -19,11 +15,6 @@ export const ModalStackProvider: FC<PropsWithChildren> = ({ children }) => ( const ModalStack = () => { const stack = useAtomValue(modalStackAtom) - const modalSettingOverlay = useUISettingKey("modalOverlay") - - const forceOverlay = stack.some((item) => item.overlay) - const allForceHideOverlay = stack.every((item) => item.overlay === false) - const topModalIndex = stack.findLastIndex((item) => item.modal) const overlayIndex = stack.findLastIndex((item) => item.overlay || item.modal) const overlayOptions = stack[overlayIndex]?.overlayOptions @@ -35,15 +26,9 @@ const ModalStack = () => { item={item} index={index * 2} isTop={index === topModalIndex * 2} + overlayOptions={overlayOptions} /> ))} - {stack.length > 0 && (modalSettingOverlay || forceOverlay) && !allForceHideOverlay && ( - <ModalOverlay - zIndex={MODAL_STACK_Z_INDEX + overlayIndex * 2 - 2} - blur={overlayOptions?.blur} - className={overlayOptions?.className} - /> - )} </AnimatePresence> ) } diff --git a/apps/renderer/src/components/ui/select.tsx b/apps/renderer/src/components/ui/select.tsx index 7fd0af8b5..b4261c1d0 100644 --- a/apps/renderer/src/components/ui/select.tsx +++ b/apps/renderer/src/components/ui/select.tsx @@ -71,7 +71,7 @@ const SelectContent = React.forwardRef< <SelectPrimitive.Content ref={ref} className={cn( - "shadow-perfect relative z-[1000] max-h-96 min-w-32 overflow-hidden rounded-md border bg-popover text-popover-foreground", + "shadow-perfect relative max-h-96 min-w-32 overflow-hidden rounded-md border bg-popover text-popover-foreground", position === "popper" && [ "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", diff --git a/apps/renderer/src/modules/panel/cmdf.tsx b/apps/renderer/src/modules/panel/cmdf.tsx index 2d00095ed..4b4577e18 100644 --- a/apps/renderer/src/modules/panel/cmdf.tsx +++ b/apps/renderer/src/modules/panel/cmdf.tsx @@ -9,6 +9,7 @@ import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react import { useDebounceCallback, useEventCallback } from "usehooks-ts" import { softSpringPreset } from "~/components/ui/constants/spring" +import { RootPortal } from "~/components/ui/portal" import { useInputComposition, useRefValue } from "~/hooks/common" import { tipcClient } from "~/lib/client" import { nextFrame } from "~/lib/dom" @@ -117,7 +118,7 @@ const CmdFImpl: FC<{ e.preventDefault() nativeSearch(value) }} - className="center shadow-perfect fixed right-8 top-12 z-[1000] size-9 w-64 gap-2 rounded-2xl border bg-zinc-50/90 pl-3 pr-2 backdrop-blur duration-200 focus-within:border-accent dark:bg-neutral-800/80" + className="center shadow-perfect fixed right-8 top-12 size-9 w-64 gap-2 rounded-2xl border bg-zinc-50/90 pl-3 pr-2 backdrop-blur duration-200 focus-within:border-accent dark:bg-neutral-800/80" > <div className="relative h-full grow"> <input @@ -238,22 +239,24 @@ export const CmdF = () => { setShow(true) }) return ( - <AnimatePresence> - {show && ( - <m.div - className="relative z-[1000]" - initial={{ opacity: 0.8, y: -150 }} - animate={{ opacity: 1, y: 0 }} - exit={{ opacity: 0, y: -150 }} - transition={softSpringPreset} - > - <CmdFImpl - onClose={() => { - setShow(false) - }} - /> - </m.div> - )} - </AnimatePresence> + <RootPortal> + <AnimatePresence> + {show && ( + <m.div + className="fixed top-0 w-full" + initial={{ opacity: 0.8, y: -150 }} + animate={{ opacity: 1, y: 0 }} + exit={{ opacity: 0, y: -150 }} + transition={softSpringPreset} + > + <CmdFImpl + onClose={() => { + setShow(false) + }} + /> + </m.div> + )} + </AnimatePresence> + </RootPortal> ) } diff --git a/apps/renderer/src/pages/(main)/layout.tsx b/apps/renderer/src/pages/(main)/layout.tsx index f49abbf1c..76144111e 100644 --- a/apps/renderer/src/pages/(main)/layout.tsx +++ b/apps/renderer/src/pages/(main)/layout.tsx @@ -123,10 +123,6 @@ export function Component() { </AppErrorBoundary> </main> - <SearchCmdK /> - <CmdNTrigger /> - {ELECTRON && <CmdF />} - {isAuthFail && !user && ( <RootPortal> <DeclarativeModal @@ -141,6 +137,10 @@ export function Component() { </DeclarativeModal> </RootPortal> )} + + <SearchCmdK /> + <CmdNTrigger /> + {ELECTRON && <CmdF />} </RootContainer> ) } @@ -155,7 +155,7 @@ const RootContainer = forwardRef<HTMLDivElement, PropsWithChildren>(({ children "--fo-feed-col-w": `${feedColWidth}px`, } as any } - className="flex h-screen overflow-hidden" + className="relative z-0 flex h-screen overflow-hidden" onContextMenu={preventDefault} > {children} diff --git a/apps/renderer/src/providers/app-grid-layout-container-provider.tsx b/apps/renderer/src/providers/app-grid-layout-container-provider.tsx index 3e1a9472c..1a93092a3 100644 --- a/apps/renderer/src/providers/app-grid-layout-container-provider.tsx +++ b/apps/renderer/src/providers/app-grid-layout-container-provider.tsx @@ -28,7 +28,7 @@ export const AppLayoutGridContainerProvider: FC<PropsWithChildren> = ({ children return ( <AppLayoutGridContainerWidthContext.Provider value={width}> - <div ref={ref} className="contents"> + <div ref={ref} className="relative z-0 contents"> {children} </div> </AppLayoutGridContainerWidthContext.Provider> diff --git a/apps/renderer/src/providers/root-providers.tsx b/apps/renderer/src/providers/root-providers.tsx index c8076f7c3..c40cfbeef 100644 --- a/apps/renderer/src/providers/root-providers.tsx +++ b/apps/renderer/src/providers/root-providers.tsx @@ -62,6 +62,13 @@ export const RootProviders: FC<PropsWithChildren> = ({ children }) => ( <EventProvider /> <UserProvider /> + + <StableRouterProvider /> + <SettingSync /> + + {import.meta.env.DEV && <Devtools />} + {children} + <Suspense> <LazyExtensionExposeProvider /> <LazyModalStackProvider /> @@ -69,12 +76,6 @@ export const RootProviders: FC<PropsWithChildren> = ({ children }) => ( <LazyLottieRenderContainer /> <LazyFeatureFlagDebugger /> </Suspense> - - <StableRouterProvider /> - <SettingSync /> - - {import.meta.env.DEV && <Devtools />} - {children} <Toaster /> </I18nProvider> </Provider> From 45b4bd8085377e8178b6804c0718726ecc15145b Mon Sep 17 00:00:00 2001 From: cos <cosine_yu@qq.com> Date: Sat, 12 Oct 2024 18:50:13 +0800 Subject: [PATCH 22/35] fix: windows web mark all read ui (#908) --- .../src/modules/entry-column/components/mark-all-button.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/renderer/src/modules/entry-column/components/mark-all-button.tsx b/apps/renderer/src/modules/entry-column/components/mark-all-button.tsx index 961457973..f5cf45876 100644 --- a/apps/renderer/src/modules/entry-column/components/mark-all-button.tsx +++ b/apps/renderer/src/modules/entry-column/components/mark-all-button.tsx @@ -9,7 +9,7 @@ import { useOnClickOutside } from "usehooks-ts" import { ActionButton, Button, IconButton } from "~/components/ui/button" import { Kbd, KbdCombined } from "~/components/ui/kbd/Kbd" import { RootPortal } from "~/components/ui/portal" -import { ElECTRON_CUSTOM_TITLEBAR_HEIGHT, HotKeyScopeMap } from "~/constants" +import { ElECTRON_CUSTOM_TITLEBAR_HEIGHT, HotKeyScopeMap, isElectronBuild } from "~/constants" import { shortcuts } from "~/constants/shortcuts" import { useI18n } from "~/hooks/common" import { cn, getOS } from "~/lib/utils" @@ -51,7 +51,9 @@ export const MarkAllReadWithOverlay = forwardRef< <m.div ref={setPopoverRef} initial={{ y: -70 }} - animate={{ y: getOS() === "Windows" ? -ElECTRON_CUSTOM_TITLEBAR_HEIGHT : 0 }} + animate={{ + y: isElectronBuild && getOS() === "Windows" ? -ElECTRON_CUSTOM_TITLEBAR_HEIGHT : 0, + }} exit={{ y: -70 }} transition={{ type: "spring", damping: 20, stiffness: 300 }} className="shadow-modal absolute z-50 bg-theme-modal-background-opaque shadow" From bb463a311fe020d079ed021489239a9141246a48 Mon Sep 17 00:00:00 2001 From: lawvs <18554747+lawvs@users.noreply.github.com> Date: Sat, 12 Oct 2024 20:32:23 +0800 Subject: [PATCH 23/35] fix: add aria-describedby to modal content --- apps/renderer/src/components/ui/modal/stacked/modal.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/renderer/src/components/ui/modal/stacked/modal.tsx b/apps/renderer/src/components/ui/modal/stacked/modal.tsx index 1a5189d42..1aabbfe51 100644 --- a/apps/renderer/src/components/ui/modal/stacked/modal.tsx +++ b/apps/renderer/src/components/ui/modal/stacked/modal.tsx @@ -284,7 +284,7 @@ export const ModalInternal = memo( <Dialog.Portal> {Overlay} <Dialog.DialogTitle className="sr-only">{title}</Dialog.DialogTitle> - <Dialog.Content asChild onOpenAutoFocus={openAutoFocus}> + <Dialog.Content asChild aria-describedby={undefined} onOpenAutoFocus={openAutoFocus}> <div ref={edgeElementRef} className={cn( @@ -324,7 +324,7 @@ export const ModalInternal = memo( <Dialog.Root modal={modal} open onOpenChange={onClose}> <Dialog.Portal> {Overlay} - <Dialog.Content asChild onOpenAutoFocus={openAutoFocus}> + <Dialog.Content asChild aria-describedby={undefined} onOpenAutoFocus={openAutoFocus}> <div ref={edgeElementRef} className={cn( From 9a84a293967d5d415e86041c7a586846519def5f Mon Sep 17 00:00:00 2001 From: Innei <tukon479@gmail.com> Date: Sat, 12 Oct 2024 21:41:55 +0800 Subject: [PATCH 24/35] feat: support specific import for web and electron Signed-off-by: Innei <tukon479@gmail.com> --- .../src/providers/lazy/index.electron.ts | 5 +++ apps/renderer/src/providers/lazy/index.ts | 35 ++++++++++++++++ .../renderer/src/providers/root-providers.tsx | 36 ++++------------ apps/renderer/src/router.web.tsx | 29 +++++++++++++ electron.vite.config.ts | 3 ++ plugins/vite/deps.ts | 2 +- plugins/vite/specific-import.ts | 42 +++++++++++++++++++ vite.config.ts | 7 +++- 8 files changed, 129 insertions(+), 30 deletions(-) create mode 100644 apps/renderer/src/providers/lazy/index.electron.ts create mode 100644 apps/renderer/src/providers/lazy/index.ts create mode 100644 apps/renderer/src/router.web.tsx create mode 100644 plugins/vite/specific-import.ts diff --git a/apps/renderer/src/providers/lazy/index.electron.ts b/apps/renderer/src/providers/lazy/index.electron.ts new file mode 100644 index 000000000..50a081c33 --- /dev/null +++ b/apps/renderer/src/providers/lazy/index.electron.ts @@ -0,0 +1,5 @@ +export { ContextMenuProvider as LazyContextMenuProvider } from "../context-menu-provider" +export { ExtensionExposeProvider as LazyExtensionExposeProvider } from "../extension-expose-provider" +export { LottieRenderContainer as LazyLottieRenderContainer } from "~/components/ui/lottie-container" +export { ModalStackProvider as LazyModalStackProvider } from "~/components/ui/modal" +export { FeatureFlagDebugger as LazyFeatureFlagDebugger } from "~/modules/ab/providers" diff --git a/apps/renderer/src/providers/lazy/index.ts b/apps/renderer/src/providers/lazy/index.ts new file mode 100644 index 000000000..48d13bc5d --- /dev/null +++ b/apps/renderer/src/providers/lazy/index.ts @@ -0,0 +1,35 @@ +import { lazy } from "react" + +const LazyLottieRenderContainer = lazy(() => + import("../../components/ui/lottie-container").then((res) => ({ + default: res.LottieRenderContainer, + })), +) +const LazyContextMenuProvider = lazy(() => + import("./../context-menu-provider").then((res) => ({ + default: res.ContextMenuProvider, + })), +) +const LazyModalStackProvider = lazy(() => + import("../../components/ui/modal/stacked/provider").then((res) => ({ + default: res.ModalStackProvider, + })), +) + +const LazyExtensionExposeProvider = lazy(() => + import("./../extension-expose-provider").then((res) => ({ + default: res.ExtensionExposeProvider, + })), +) +const LazyFeatureFlagDebugger = lazy(() => + import("../../modules/ab/providers").then((res) => ({ + default: res.FeatureFlagDebugger, + })), +) +export { + LazyContextMenuProvider, + LazyExtensionExposeProvider, + LazyFeatureFlagDebugger, + LazyLottieRenderContainer, + LazyModalStackProvider, +} diff --git a/apps/renderer/src/providers/root-providers.tsx b/apps/renderer/src/providers/root-providers.tsx index c40cfbeef..9b357e3a7 100644 --- a/apps/renderer/src/providers/root-providers.tsx +++ b/apps/renderer/src/providers/root-providers.tsx @@ -4,7 +4,7 @@ import { PersistQueryClientProvider } from "@tanstack/react-query-persist-client import { LazyMotion, MotionConfig } from "framer-motion" import { Provider } from "jotai" import type { FC, PropsWithChildren } from "react" -import { lazy, Suspense } from "react" +import { Suspense } from "react" import { HotkeysProvider } from "react-hotkeys-hook" import { Toaster } from "~/components/ui/sonner" @@ -15,36 +15,18 @@ import { persistConfig, queryClient } from "~/lib/query-client" import { EventProvider } from "./event-provider" import { I18nProvider } from "./i18n-provider" import { InvalidateQueryProvider } from "./invalidate-query-provider" +import { + LazyContextMenuProvider, + LazyExtensionExposeProvider, + LazyFeatureFlagDebugger, + LazyLottieRenderContainer, + LazyModalStackProvider, + // specific import should add `index` postfix +} from "./lazy/index" import { SettingSync } from "./setting-sync" import { StableRouterProvider } from "./stable-router-provider" import { UserProvider } from "./user-provider" -const LazyLottieRenderContainer = lazy(() => - import("../components/ui/lottie-container").then((res) => ({ - default: res.LottieRenderContainer, - })), -) -const LazyContextMenuProvider = lazy(() => - import("./context-menu-provider").then((res) => ({ - default: res.ContextMenuProvider, - })), -) -const LazyModalStackProvider = lazy(() => - import("../components/ui/modal/stacked/provider").then((res) => ({ - default: res.ModalStackProvider, - })), -) - -const LazyExtensionExposeProvider = lazy(() => - import("./extension-expose-provider").then((res) => ({ - default: res.ExtensionExposeProvider, - })), -) -const LazyFeatureFlagDebugger = lazy(() => - import("../modules/ab/providers").then((res) => ({ - default: res.FeatureFlagDebugger, - })), -) const loadFeatures = () => import("../framer-lazy-feature").then((res) => res.default) export const RootProviders: FC<PropsWithChildren> = ({ children }) => ( <LazyMotion features={loadFeatures} strict key="framer"> diff --git a/apps/renderer/src/router.web.tsx b/apps/renderer/src/router.web.tsx new file mode 100644 index 000000000..0bd90846b --- /dev/null +++ b/apps/renderer/src/router.web.tsx @@ -0,0 +1,29 @@ +import { IN_ELECTRON } from "@follow/shared/constants" +import { wrapCreateBrowserRouter } from "@sentry/react" +import { createBrowserRouter, createHashRouter } from "react-router-dom" + +import { ErrorElement } from "./components/common/ErrorElement" +import { NotFound } from "./components/common/NotFound" +import { buildGlobRoutes } from "./lib/route-builder" + +const globTree = import.meta.glob("./pages/**/*.tsx") +const tree = buildGlobRoutes(globTree) + +let routerCreator = + IN_ELECTRON || globalThis["__DEBUG_PROXY__"] ? createHashRouter : createBrowserRouter +if (window.SENTRY_RELEASE) { + routerCreator = wrapCreateBrowserRouter(routerCreator) +} + +export const router = routerCreator([ + { + path: "/", + lazy: () => import("./App"), + children: tree, + errorElement: <ErrorElement />, + }, + { + path: "*", + element: <NotFound />, + }, +]) diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 200a59db6..7d159b193 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -3,6 +3,7 @@ import { resolve } from "node:path" import { defineConfig } from "electron-vite" import { viteRenderBaseConfig } from "./configs/vite.render.config" +import { createPlatformSpecificImportPlugin } from "./plugins/vite/specific-import" export default defineConfig({ main: { @@ -41,6 +42,8 @@ export default defineConfig({ renderer: { ...viteRenderBaseConfig, + plugins: [...viteRenderBaseConfig.plugins, createPlatformSpecificImportPlugin(true)], + root: "apps/renderer", build: { outDir: "dist/renderer", diff --git a/plugins/vite/deps.ts b/plugins/vite/deps.ts index ebf8ee6fd..1a24a0168 100644 --- a/plugins/vite/deps.ts +++ b/plugins/vite/deps.ts @@ -1,6 +1,6 @@ import type { Plugin, UserConfig } from "vite" -export function createDependencyChunksPlugin(dependencies: string[] | string[][]): Plugin { +export function createDependencyChunksPlugin(dependencies: string[][]): Plugin { return { name: "dependency-chunks", config(config: UserConfig) { diff --git a/plugins/vite/specific-import.ts b/plugins/vite/specific-import.ts new file mode 100644 index 000000000..6717fc261 --- /dev/null +++ b/plugins/vite/specific-import.ts @@ -0,0 +1,42 @@ +import type { Plugin } from "vite" + +export function createPlatformSpecificImportPlugin(isElectron = false): Plugin { + return { + name: "platform-specific-import", + enforce: "pre", + async resolveId(source, importer) { + if (!importer) { + return null + } + + const allowExts = [".js", ".jsx", ".ts", ".tsx"] + + if (!allowExts.some((ext) => importer.endsWith(ext))) return null + + if (importer.includes("node_modules")) return null + const [path, query] = source.split("?") + + if (path.startsWith(".") || path.startsWith("/")) { + const priorities = isElectron + ? [".electron.ts", ".electron.tsx", ".electron.js", ".electron.jsx"] + : [".web.ts", ".web.tsx", ".web.js", ".web.jsx"] + + for (const ext of priorities) { + const resolvedPath = await this.resolve( + `${path}${ext}${query ? `?${query}` : ""}`, + importer, + { + skipSelf: true, + }, + ) + + if (resolvedPath) { + return resolvedPath.id + } + } + } + + return null + }, + } +} diff --git a/vite.config.ts b/vite.config.ts index bce3faf32..f64089379 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -11,6 +11,7 @@ import { viteRenderBaseConfig } from "./configs/vite.render.config" import type { env as EnvType } from "./packages/shared/src/env" import { createDependencyChunksPlugin } from "./plugins/vite/deps" import { htmlInjectPlugin } from "./plugins/vite/html-inject" +import { createPlatformSpecificImportPlugin } from "./plugins/vite/specific-import" const __dirname = fileURLToPath(new URL(".", import.meta.url)) const isCI = process.env.CI === "true" || process.env.CI === "1" @@ -75,7 +76,8 @@ export default ({ mode }) => { devPrint(), createDependencyChunksPlugin([ // React framework - ["react", "react-dom", "react-router-dom", "react-error-boundary", "react-dom/server"], + ["react", "react-dom"], + ["react-error-boundary", "react-dom/server", "react-router-dom"], // Data Statement ["zustand", "jotai", "use-context-selector", "immer", "dexie"], // Remark @@ -131,7 +133,6 @@ export default ({ mode }) => { "@tanstack/react-query-persist-client", "@tanstack/query-sync-storage-persister", ], - ["blurhash", "react-blurhash"], ["tldts"], ["shiki", "@shikijs/transformers"], ["@sentry/react", "posthog-js"], @@ -139,6 +140,8 @@ export default ({ mode }) => { ["swiper"], ]), + + createPlatformSpecificImportPlugin(false), ], define: { From b541b484fcbf946ce56f987e2b7e33b8afff56bb Mon Sep 17 00:00:00 2001 From: DIYgod <i@diygod.me> Date: Sat, 12 Oct 2024 22:11:49 +0800 Subject: [PATCH 25/35] chore: VITE_FIREBASE_CONFIG --- .github/workflows/nightly.yml | 1 + types/vite.d.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index eb896bc4d..de68a4c81 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -10,6 +10,7 @@ env: VITE_IMGPROXY_URL: ${{ vars.VITE_IMGPROXY_URL }} VITE_SENTRY_DSN: ${{ vars.VITE_SENTRY_DSN }} VITE_POSTHOG_KEY: ${{ vars.VITE_POSTHOG_KEY }} + VITE_FIREBASE_CONFIG: ${{ vars.VITE_FIREBASE_CONFIG }} NODE_OPTIONS: --max-old-space-size=8192 jobs: diff --git a/types/vite.d.ts b/types/vite.d.ts index bf3f5370b..43f292ae0 100644 --- a/types/vite.d.ts +++ b/types/vite.d.ts @@ -6,6 +6,7 @@ interface ImportMetaEnv { VITE_IMGPROXY_URL: string VITE_SENTRY_DSN: string VITE_POSTHOG_KEY: string + VITE_FIREBASE_CONFIG: string } interface ImportMeta { From 728ea84fa6e9faff1990184285390a1d86eb2c56 Mon Sep 17 00:00:00 2001 From: Innei <tukon479@gmail.com> Date: Sat, 12 Oct 2024 22:54:29 +0800 Subject: [PATCH 26/35] fix: init store after app init Signed-off-by: Innei <tukon479@gmail.com> --- apps/main/src/init.ts | 9 ++------- apps/main/src/lib/store.ts | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/apps/main/src/init.ts b/apps/main/src/init.ts index 997800b3d..f4de31573 100644 --- a/apps/main/src/init.ts +++ b/apps/main/src/init.ts @@ -19,10 +19,6 @@ import { initializeSentry } from "./sentry" import { router } from "./tipc" import { createMainWindow, getMainWindow } from "./window" -const appFolder = { - prod: "Follow", - dev: "Follow (dev)", -} if (process.argv.length === 3 && process.argv[2].startsWith("follow-dev:")) { process.env.NODE_ENV = "development" } @@ -32,7 +28,8 @@ const isDev = process.env.NODE_ENV === "development" * Mandatory and fast initializers for the app */ export function initializeAppStage0() { - app.setPath("appData", path.join(app.getPath("appData"), isDev ? appFolder.dev : appFolder.prod)) + if (isDev) app.setPath("appData", path.join(app.getPath("appData"), "Follow (dev)")) + initializeSentry() } export const initializeAppStage1 = () => { if (process.defaultApp) { @@ -45,8 +42,6 @@ export const initializeAppStage1 = () => { app.setAsDefaultProtocolClient(APP_PROTOCOL) } - initializeSentry() - registerIpcMain(router) if (app.dock) { diff --git a/apps/main/src/lib/store.ts b/apps/main/src/lib/store.ts index 0f0697d7a..2fa22bd30 100644 --- a/apps/main/src/lib/store.ts +++ b/apps/main/src/lib/store.ts @@ -3,15 +3,26 @@ import { resolve } from "node:path" import { app } from "electron" import { JSONFileSyncPreset } from "lowdb/node" -const db = JSONFileSyncPreset(resolve(app.getPath("userData"), "db.json"), {}) as { +let db: { data: Record<string, unknown> write: () => void read: () => void } +const createOrGetDb = () => { + if (!db) { + db = JSONFileSyncPreset(resolve(app.getPath("userData"), "db.json"), {}) as typeof db + } + return db +} export const store = { - get: (key: string) => db.data[key] as any, + get: (key: string) => { + const db = createOrGetDb() + + return db.data[key] as any + }, set: (key: string, value: any) => { + const db = createOrGetDb() db.data[key] = value db.write() }, From 2f5c3872e6c5d7ea6b9039ab8f86b30c4ab489be Mon Sep 17 00:00:00 2001 From: DIYgod <i@diygod.me> Date: Sat, 12 Oct 2024 22:57:20 +0800 Subject: [PATCH 27/35] chore: firebase debug --- apps/main/src/init.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/main/src/init.ts b/apps/main/src/init.ts index f4de31573..14a1679eb 100644 --- a/apps/main/src/init.ts +++ b/apps/main/src/init.ts @@ -145,12 +145,14 @@ const registerPushNotifications = async () => { updateNotificationsToken() const instance = new PushReceiver({ - debug: isDev, + debug: true, firebase: env.VITE_FIREBASE_CONFIG, persistentIds: persistentIds || [], credentials, }) - logger.info(`PushReceiver initialized with token ${credentials?.fcm?.token}`) + logger.info( + `PushReceiver initialized with token ${credentials?.fcm?.token} and firebase config ${env.VITE_FIREBASE_CONFIG}`, + ) instance.onCredentialsChanged(({ newCredentials }) => { logger.info(`PushReceiver credentials changed to ${newCredentials?.fcm?.token}`) From f196493b68a84489de93ac0c3944b039c79f25c0 Mon Sep 17 00:00:00 2001 From: DIYgod <i@diygod.me> Date: Sun, 13 Oct 2024 00:04:35 +0800 Subject: [PATCH 28/35] feat: add bundleId to PushReceiver --- apps/main/src/init.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/main/src/init.ts b/apps/main/src/init.ts index 14a1679eb..88433af79 100644 --- a/apps/main/src/init.ts +++ b/apps/main/src/init.ts @@ -149,11 +149,17 @@ const registerPushNotifications = async () => { firebase: env.VITE_FIREBASE_CONFIG, persistentIds: persistentIds || [], credentials, + bundleId: "is.follow", + chromeId: "is.follow", }) logger.info( `PushReceiver initialized with token ${credentials?.fcm?.token} and firebase config ${env.VITE_FIREBASE_CONFIG}`, ) + instance.onReady(() => { + logger.info("PushReceiver ready") + }) + instance.onCredentialsChanged(({ newCredentials }) => { logger.info(`PushReceiver credentials changed to ${newCredentials?.fcm?.token}`) updateNotificationsToken(newCredentials) From a5bb6358082c7943dc63e3fb09455266b9c415e0 Mon Sep 17 00:00:00 2001 From: DIYgod <i@diygod.me> Date: Sun, 13 Oct 2024 01:15:23 +0800 Subject: [PATCH 29/35] chore: firebase debug --- apps/main/src/init.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/main/src/init.ts b/apps/main/src/init.ts index 88433af79..460f9f815 100644 --- a/apps/main/src/init.ts +++ b/apps/main/src/init.ts @@ -148,12 +148,12 @@ const registerPushNotifications = async () => { debug: true, firebase: env.VITE_FIREBASE_CONFIG, persistentIds: persistentIds || [], - credentials, + credentials: credentials || null, bundleId: "is.follow", chromeId: "is.follow", }) logger.info( - `PushReceiver initialized with token ${credentials?.fcm?.token} and firebase config ${env.VITE_FIREBASE_CONFIG}`, + `PushReceiver initialized with credentials ${JSON.stringify(credentials)} and firebase config ${env.VITE_FIREBASE_CONFIG}`, ) instance.onReady(() => { @@ -199,4 +199,6 @@ const registerPushNotifications = async () => { }) await instance.connect() + + logger.info("PushReceiver connected") } From 880947563cea512fb30177edc4be50fc961478fc Mon Sep 17 00:00:00 2001 From: DIYgod <i@diygod.me> Date: Sun, 13 Oct 2024 01:28:29 +0800 Subject: [PATCH 30/35] chore: firebase debug --- apps/main/src/init.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/main/src/init.ts b/apps/main/src/init.ts index 460f9f815..c6351c5d5 100644 --- a/apps/main/src/init.ts +++ b/apps/main/src/init.ts @@ -198,7 +198,11 @@ const registerPushNotifications = async () => { store.set(persistentIdsKey, instance.persistentIds) }) - await instance.connect() + try { + await instance.connect() + } catch (error) { + logger.error(`PushReceiver error: ${error}`) + } logger.info("PushReceiver connected") } From b2916bd8b81d02e1f5b673ed34c7f0f181d641c2 Mon Sep 17 00:00:00 2001 From: DIYgod <i@diygod.me> Date: Sun, 13 Oct 2024 01:52:14 +0800 Subject: [PATCH 31/35] fix: json parse for env VITE_FIREBASE_CONFIG --- apps/main/src/init.ts | 4 ++-- packages/shared/src/env.ts | 22 +--------------------- 2 files changed, 3 insertions(+), 23 deletions(-) diff --git a/apps/main/src/init.ts b/apps/main/src/init.ts index c6351c5d5..f077c68da 100644 --- a/apps/main/src/init.ts +++ b/apps/main/src/init.ts @@ -146,7 +146,7 @@ const registerPushNotifications = async () => { const instance = new PushReceiver({ debug: true, - firebase: env.VITE_FIREBASE_CONFIG, + firebase: JSON.parse(env.VITE_FIREBASE_CONFIG), persistentIds: persistentIds || [], credentials: credentials || null, bundleId: "is.follow", @@ -201,7 +201,7 @@ const registerPushNotifications = async () => { try { await instance.connect() } catch (error) { - logger.error(`PushReceiver error: ${error}`) + logger.error(`PushReceiver error: ${error instanceof Error ? error.stack : error}`) } logger.info("PushReceiver connected") diff --git a/packages/shared/src/env.ts b/packages/shared/src/env.ts index 963343424..ae29ed510 100644 --- a/packages/shared/src/env.ts +++ b/packages/shared/src/env.ts @@ -11,27 +11,7 @@ export const env = createEnv({ VITE_SENTRY_DSN: z.string().optional(), VITE_POSTHOG_KEY: z.string().optional(), VITE_INBOXES_EMAIL: z.string().default("@follow.re"), - VITE_FIREBASE_CONFIG: z - .string() - .transform((content) => { - try { - return JSON.parse(content) - } catch { - return z.NEVER - } - }) - .pipe( - z.object({ - apiKey: z.string(), - authDomain: z.string(), - projectId: z.string(), - storageBucket: z.string(), - messagingSenderId: z.string(), - appId: z.string(), - measurementId: z.string(), - }), - ) - .optional(), + VITE_FIREBASE_CONFIG: z.string().optional(), }, emptyStringAsUndefined: true, From fac97f1e9863a9e93cb80751ad313583003cbb5f Mon Sep 17 00:00:00 2001 From: DIYgod <i@diygod.me> Date: Sun, 13 Oct 2024 02:42:13 +0800 Subject: [PATCH 32/35] chore(release): release v0.0.1-alpha.21 --- CHANGELOG.md | 10 +++++++++- package.json | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09fa12b38..ca733950d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # CHANGELOG -## [0.0.1-alpha.20](https://github.com/RSSNext/follow/compare/v0.0.1-alpha.19...v0.0.1-alpha.20) (2024-10-12) +## [0.0.1-alpha.21](https://github.com/RSSNext/follow/compare/v0.0.1-alpha.19...v0.0.1-alpha.21) (2024-10-12) ### Bug Fixes @@ -17,6 +17,7 @@ * accept import opml ([39ecc82](https://github.com/RSSNext/follow/commit/39ecc82a8ceecd77139ffccb31a33904082a3d1b)) * **achievement:** loading button style ([96bb514](https://github.com/RSSNext/follow/commit/96bb51425427864bc4e77b75808271371839c57a)) * add app version on posthog ([9933463](https://github.com/RSSNext/follow/commit/99334639e28b2a2a17b9c3fdd64f0d6d37bdd181)) +* add aria-describedby to modal content ([bb463a3](https://github.com/RSSNext/follow/commit/bb463a311fe020d079ed021489239a9141246a48)) * add bg when context menu trigger, fix [#389](https://github.com/RSSNext/follow/issues/389) ([53f3185](https://github.com/RSSNext/follow/commit/53f3185e7955d1a72912905d8565c5efb0a0bda0)) * add copy image in electron, fix [#317](https://github.com/RSSNext/follow/issues/317) ([466e0b7](https://github.com/RSSNext/follow/commit/466e0b78ccc5df66ab11a1e71a800e70c9b34312)) * add db index ([a888a78](https://github.com/RSSNext/follow/commit/a888a789e10ecd8b3fab713e859bfe9f56bfe0ad)) @@ -246,6 +247,7 @@ * improve proxy URI handling ([#810](https://github.com/RSSNext/follow/issues/810)) ([e7e930d](https://github.com/RSSNext/follow/commit/e7e930d1771e19d909433021d6757eabb44de73f)) * inbox data refreshment ([a3a7c82](https://github.com/RSSNext/follow/commit/a3a7c82ea6308756a800514d9df528815ba77781)) * incorrect tooltip in read history ([#385](https://github.com/RSSNext/follow/issues/385)) ([cabe210](https://github.com/RSSNext/follow/commit/cabe210aaf8f4a1133fa653532874fa86d02c252)) +* init store after app init ([728ea84](https://github.com/RSSNext/follow/commit/728ea84fa6e9faff1990184285390a1d86eb2c56)) * inline table style ([5837bd4](https://github.com/RSSNext/follow/commit/5837bd4089b59855d0b583aed5d0e97fce04e094)) * input box table style ([e0890d5](https://github.com/RSSNext/follow/commit/e0890d5b388facd1f9c16ac706a32f0aa2efdef5)) * Input issues fixed [#535](https://github.com/RSSNext/follow/issues/535),[#536](https://github.com/RSSNext/follow/issues/536) ([3d48637](https://github.com/RSSNext/follow/commit/3d486379b91dff13bfbcc90532efd3e186405a13)) @@ -254,6 +256,7 @@ * invitation page error display area ([5915357](https://github.com/RSSNext/follow/commit/59153573d8a5d368adfe41b0f5cebc4d6d44a9f3)) * **invitation:** reset app data then logout ([5933cea](https://github.com/RSSNext/follow/commit/5933ceab63de0a7a46e85d0b841acbf893d8fcec)) * **item:** center content if no desc ([18e26a4](https://github.com/RSSNext/follow/commit/18e26a41c3cf80316bc97c44a1239e6ec45c5db9)) +* json parse for env VITE_FIREBASE_CONFIG ([b2916bd](https://github.com/RSSNext/follow/commit/b2916bd8b81d02e1f5b673ed34c7f0f181d641c2)) * kbd cls and set home scope in shortcuts guideline ([d9999a3](https://github.com/RSSNext/follow/commit/d9999a3fc6cfeae0f3b45b6390cf79d9135566b7)) * lang/*.json ([#526](https://github.com/RSSNext/follow/issues/526)) ([be3b2e7](https://github.com/RSSNext/follow/commit/be3b2e7503c1061a1e312394bb0c3556e39ec062)) * language setting syncing ([fa1dc5d](https://github.com/RSSNext/follow/commit/fa1dc5df35a2225bb22320a8fc049d3c0b75fa5b)) @@ -507,6 +510,7 @@ * user modal list padding ([992ea15](https://github.com/RSSNext/follow/commit/992ea1594af02e3815adae2fe99de4f205543239)) * user profile can not scroll by scrollbar ([eac1965](https://github.com/RSSNext/follow/commit/eac1965cfc3d2bc86e11f256237322f15892b897)) * userActions in feed store ([8da4fb7](https://github.com/RSSNext/follow/commit/8da4fb71d9cc14832bc985cf8c1bd6f04dbe4e4c)) +* **vercel:** filter subpath ([fc38072](https://github.com/RSSNext/follow/commit/fc38072320f8225e6ae60f4e25719eaeb9ff5e6a)) * video preview ([e38820c](https://github.com/RSSNext/follow/commit/e38820c1aa2294f45e05d331bf4bce0e4d8efb44)) * view icon color in dark mode ([991bff7](https://github.com/RSSNext/follow/commit/991bff7660e93b872f1398c89c0fe4316f4327d9)) * view source content in picture view ([16938f6](https://github.com/RSSNext/follow/commit/16938f60786f8496152361405c0fcff4635f7d59)) @@ -522,6 +526,7 @@ * windows maximize will lost frame and background material ([2bd0e78](https://github.com/RSSNext/follow/commit/2bd0e78e4f859d9c98f53f748c9871a41348db1c)) * windows multi-display ([7490cd1](https://github.com/RSSNext/follow/commit/7490cd12d0e42a7f41931acd9d77bf64be39a26d)) * windows sep, fixes [#741](https://github.com/RSSNext/follow/issues/741) ([9b1de77](https://github.com/RSSNext/follow/commit/9b1de775d2157606c30c4ece3287a42e1e9463a3)) +* windows web mark all read ui ([#908](https://github.com/RSSNext/follow/issues/908)) ([45b4bd8](https://github.com/RSSNext/follow/commit/45b4bd8085377e8178b6804c0718726ecc15145b)) * **windows:** dont remove locale ([7305eba](https://github.com/RSSNext/follow/commit/7305eba3fee218330818d96ca155f833aa99d631)) * **windows:** skip remove locle ([5df82d0](https://github.com/RSSNext/follow/commit/5df82d0c0f98bebb6e78a694a6ceda3644eb36ef)) * withdraw availableBalance ([167d82a](https://github.com/RSSNext/follow/commit/167d82adc061078102fa9984d29f94735d052ce9)) @@ -541,6 +546,7 @@ * add biz code i18n for fr and ru ([#521](https://github.com/RSSNext/follow/issues/521)) ([0dc4b86](https://github.com/RSSNext/follow/commit/0dc4b866d7eff2d32df2158902d6d1fbdea41f27)) * add biz code i18n for zh-cn ([#503](https://github.com/RSSNext/follow/issues/503)) ([d35e011](https://github.com/RSSNext/follow/commit/d35e0119953a154d18273c1d155f14d03c9a6ce8)) * add biz user info on sentry tracker ([e3e52ab](https://github.com/RSSNext/follow/commit/e3e52abedeb5507ca71d663faa7ef050b661cf0a)) +* add bundleId to PushReceiver ([f196493](https://github.com/RSSNext/follow/commit/f196493b68a84489de93ac0c3944b039c79f25c0)) * add copy title to context menu of feed entry ([#801](https://github.com/RSSNext/follow/issues/801)) ([1f57ab2](https://github.com/RSSNext/follow/commit/1f57ab2ac76ef04aff37814b4c7e961ad33b6e11)) * add discover back to top fab ([a97e60c](https://github.com/RSSNext/follow/commit/a97e60cd005ca7ebb5aed56655b94975ebf1ccb7)) * add divider when sticky for date item ([755e292](https://github.com/RSSNext/follow/commit/755e292af05c3adeae8943cc5c4c05af11d30d16)) @@ -705,6 +711,7 @@ * new power page ([c3630f8](https://github.com/RSSNext/follow/commit/c3630f85bd221ecf875b20337e5c6a452c613362)) * no media available tip in picture item ([1d4fca4](https://github.com/RSSNext/follow/commit/1d4fca4e7d0e7c6f02f1ac775f36079ef5ce1129)) * no media available tip in picture item ([58d9b3b](https://github.com/RSSNext/follow/commit/58d9b3b1b09f52def911521c08d9835f31221401)) +* notifications logger ([97041ab](https://github.com/RSSNext/follow/commit/97041abab5f0846249343de07f592ba6fc421870)) * only closing window can trigger query invalidation ([a8e48f4](https://github.com/RSSNext/follow/commit/a8e48f493127104035e9537e0461c4a40e2dc339)) * only show has media entry item in picture view ([f7dedf2](https://github.com/RSSNext/follow/commit/f7dedf2b27f2597a49e9381af5581b6d0550421b)) * optimize 404 page ([f51b1e2](https://github.com/RSSNext/follow/commit/f51b1e2de9e8d8c3bdea9db79476c17cd7247a4b)) @@ -763,6 +770,7 @@ * support pageup/pagedown to scroll up/down ([6e0c3bc](https://github.com/RSSNext/follow/commit/6e0c3bc5e3e2437a51fa991940b4e4496ed2bb75)) * support setting proxy for app ([#452](https://github.com/RSSNext/follow/issues/452)) ([cfd5275](https://github.com/RSSNext/follow/commit/cfd527545ade50a529698bdd57ec16d0f3ccee98)) * support shortcut to toggle wide mode ([b7a054f](https://github.com/RSSNext/follow/commit/b7a054f3132079693f0d93a65eb236c95920bcb8)) +* support specific import for web and electron ([9a84a29](https://github.com/RSSNext/follow/commit/9a84a293967d5d415e86041c7a586846519def5f)) * support toc parser ([fb4ca52](https://github.com/RSSNext/follow/commit/fb4ca522440aced4d2aa18fda2a9d5c43e32d0d1)) * sync indicator when disable ([945ddda](https://github.com/RSSNext/follow/commit/945dddae2534f07e5289e307c36de1f8334636bc)) * tiny styles ([78bcc55](https://github.com/RSSNext/follow/commit/78bcc5562baa12cece51da6564b77c6f37a1596c)) diff --git a/package.json b/package.json index 3647b212e..41d218a66 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "Follow", "type": "module", - "version": "0.0.1-alpha.20", + "version": "0.0.1-alpha.21", "private": true, "packageManager": "pnpm@9.11.0", "description": "Next generation information browser", From 795dccbfc5320e7371f88a0e8740611a562c7e95 Mon Sep 17 00:00:00 2001 From: Jerry Wong <hwy0127@gmail.com> Date: Sun, 13 Oct 2024 12:10:54 +0800 Subject: [PATCH 33/35] fix: power page z-index (#910) * refactor: optimize CSS classes in EntryPlaceholderLogo and TableHeader Simplify CSS classes in EntryPlaceholderLogo component and remove unnecessary z-index usage in TableHeader component. * update Signed-off-by: Innei <tukon479@gmail.com> --------- Signed-off-by: Innei <tukon479@gmail.com> Co-authored-by: Innei <tukon479@gmail.com> --- .../components/EntryPlaceholderLogo.tsx | 4 +- .../power/transaction-section/index.tsx | 2 +- .../modules/profile/user-profile-modal.tsx | 2 +- locales/app/zh-HK.json | 47 ++++++++++--------- locales/common/zh-HK.json | 1 + locales/settings/zh-HK.json | 8 +++- 6 files changed, 36 insertions(+), 28 deletions(-) diff --git a/apps/renderer/src/modules/entry-content/components/EntryPlaceholderLogo.tsx b/apps/renderer/src/modules/entry-content/components/EntryPlaceholderLogo.tsx index f210a4f6f..829d6b8bd 100644 --- a/apps/renderer/src/modules/entry-content/components/EntryPlaceholderLogo.tsx +++ b/apps/renderer/src/modules/entry-content/components/EntryPlaceholderLogo.tsx @@ -14,12 +14,12 @@ export const EntryPlaceholderLogo = () => { <div onContextMenu={stopPropagation} className={cn( - "flex w-full min-w-0 flex-col items-center justify-center gap-1 text-balance px-12 pb-6 text-center text-lg font-medium text-zinc-400 duration-500", + "flex w-full min-w-0 flex-col items-center justify-center gap-1 px-12 pb-6 text-center text-lg font-medium text-zinc-400 duration-500", !logoShow && "translate-y-[-50px] opacity-0", )} > <Logo className="size-16 opacity-40 grayscale" /> - <span className="max-w-[60ch]">{title}</span> + <div className="line-clamp-3 w-[60ch] max-w-full">{title}</div> </div> ) } diff --git a/apps/renderer/src/modules/power/transaction-section/index.tsx b/apps/renderer/src/modules/power/transaction-section/index.tsx index 104a9c14f..ea3cd63d2 100644 --- a/apps/renderer/src/modules/power/transaction-section/index.tsx +++ b/apps/renderer/src/modules/power/transaction-section/index.tsx @@ -56,7 +56,7 @@ export const TransactionsSection: Component = ({ className }) => { </Tabs> <div className={cn("w-fit min-w-0 grow overflow-x-auto", className)}> <Table className="w-full table-fixed"> - <TableHeader className="sticky top-0 z-10 bg-theme-background"> + <TableHeader className="sticky top-0 bg-theme-background"> <TableRow className="[&_*]:!pl-0 [&_*]:!font-semibold"> <TableHead>{t("wallet.transactions.type")}</TableHead> <TableHead>{t("wallet.transactions.amount")}</TableHead> diff --git a/apps/renderer/src/modules/profile/user-profile-modal.tsx b/apps/renderer/src/modules/profile/user-profile-modal.tsx index dcf79838d..be195584f 100644 --- a/apps/renderer/src/modules/profile/user-profile-modal.tsx +++ b/apps/renderer/src/modules/profile/user-profile-modal.tsx @@ -398,7 +398,7 @@ const SubscriptionItem: FC<{ !isLoose && "flex items-center", )} > - <div className="truncate font-medium leading-none">{subscription.feeds?.title}</div> + <div className="truncate font-medium leading-tight">{subscription.feeds?.title}</div> {isLoose && ( <div className="mt-1 line-clamp-1 text-xs text-zinc-500"> {subscription.feeds?.description} diff --git a/locales/app/zh-HK.json b/locales/app/zh-HK.json index a4d0646de..509e3234e 100644 --- a/locales/app/zh-HK.json +++ b/locales/app/zh-HK.json @@ -54,9 +54,9 @@ "entry_actions.copied_notify": "{{which}}已複製到剪貼板", "entry_actions.copy_link": "複製連結", "entry_actions.copy_title": "複製標題", - "entry_actions.failed_to_save_to_eagle": "無法保存至 Eagle。", - "entry_actions.failed_to_save_to_instapaper": "無法保存至 Instapaper。", - "entry_actions.failed_to_save_to_readwise": "無法保存至 Readwise。", + "entry_actions.failed_to_save_to_eagle": "無法保存至 Eagle", + "entry_actions.failed_to_save_to_instapaper": "無法保存至 Instapaper", + "entry_actions.failed_to_save_to_readwise": "無法保存至 Readwise", "entry_actions.mark_as_read": "標記為已讀", "entry_actions.mark_as_unread": "標記為未讀", "entry_actions.open_in_browser": "在{{which}}中開啟", @@ -64,17 +64,17 @@ "entry_actions.save_media_to_eagle": "保存媒體至 Eagle", "entry_actions.save_to_instapaper": "保存至 Instapaper", "entry_actions.save_to_readwise": "保存至 Readwise", - "entry_actions.saved_to_eagle": "已保存至 Eagle。", - "entry_actions.saved_to_instapaper": "已保存至 Instapaper。", - "entry_actions.saved_to_readwise": "已保存至 Readwise。", + "entry_actions.saved_to_eagle": "已保存至 Eagle", + "entry_actions.saved_to_instapaper": "已保存至 Instapaper", + "entry_actions.saved_to_readwise": "已保存至 Readwise", "entry_actions.share": "分享", "entry_actions.star": "收藏", - "entry_actions.starred": "已收藏。", + "entry_actions.starred": "已收藏", "entry_actions.tip": "贊助", "entry_actions.unstar": "取消收藏", - "entry_actions.unstarred": "已取消收藏。", + "entry_actions.unstarred": "已取消收藏", "entry_actions.view_source_content": "查看原始內容", - "entry_column.filtered_content_tip": "你已隱藏篩選內容。", + "entry_column.filtered_content_tip": "你已隱藏篩選內容", "entry_column.filtered_content_tip_2": "除了以上顯示的條目,還有一些已篩選的內容。", "entry_column.refreshing": "刷新新條目中...", "entry_content.ai_summary": "AI 摘要", @@ -85,12 +85,12 @@ "entry_content.readability_notice": "此內容由 Readability 提供。如果你發現排版異常,請到來源網站查看原始內容。", "entry_content.render_error": "渲染錯誤:", "entry_content.report_issue": "報告問題", - "entry_content.support_amount": "{{amount}} 人支持了此訂閱源的創作者。", + "entry_content.support_amount": "{{amount}} 人支持了此訂閱源的創作者", "entry_content.support_creator": "支持創作者", "entry_content.web_app_notice": "網頁應用可能不支持此內容類型。你可以下載桌面應用程式。", "entry_list.zero_unread": "全部已讀", "entry_list_header.daily_report": "每日報告", - "entry_list_header.hide_no_image_items": "隱藏沒有圖片的條目。", + "entry_list_header.hide_no_image_items": "隱藏沒有圖片的條目", "entry_list_header.items": "項目", "entry_list_header.new_entries_available": "有新條目可用", "entry_list_header.refetch": "重新抓取", @@ -105,12 +105,12 @@ "entry_list_header.unread": "未讀", "feed_claim_modal.choose_verification_method": "有三種驗證方法可選,你可以選擇其中一種進行驗證。", "feed_claim_modal.claim_button": "認領", - "feed_claim_modal.content_instructions": "複製以下內容並貼到你最新的 RSS 訂閱源中。", + "feed_claim_modal.content_instructions": "複製以下內容並貼到你最新的 RSS 訂閱源中", "feed_claim_modal.description_current": "當前描述:", - "feed_claim_modal.description_instructions": "複製以下內容並貼到你的 RSS 訂閱源中的 <code /> 欄位。", + "feed_claim_modal.description_instructions": "複製以下內容並貼到你的 RSS 訂閱源中的 <code /> 欄位", "feed_claim_modal.failed_to_load": "無法加載認領信息", "feed_claim_modal.rss_format_choice": "RSS 生成器通常有兩種格式可選。請根據需要複製以下的 XML 和 JSON 格式。", - "feed_claim_modal.rss_instructions": "複製以下代碼並貼到你的 RSS 生成器中。", + "feed_claim_modal.rss_instructions": "複製以下代碼並貼到你的 RSS 生成器中", "feed_claim_modal.rss_json_format": "JSON 格式", "feed_claim_modal.rss_xml_format": "XML 格式", "feed_claim_modal.rsshub_notice": "此訂閱源由 RSSHub 提供,緩存時間為 1 小時。發布內容後,請等待最多 1 小時更改才能生效。", @@ -122,23 +122,23 @@ "feed_form.add_follow": "新增關注", "feed_form.category": "分類", "feed_form.category_description": "默認情況下,你的關注會按網站分組。", - "feed_form.error_fetching_feed": "獲取訂閱源時出錯。", + "feed_form.error_fetching_feed": "獲取訂閱源時出錯", "feed_form.fee": "跟隨費用", "feed_form.fee_description": "要跟隨此清單,您必須向清單創建者支付費用。", - "feed_form.feed_not_found": "未找到相關資訊流。", + "feed_form.feed_not_found": "未找到相關資訊流", "feed_form.feedback": "反饋", "feed_form.follow": "關注", "feed_form.follow_with_fee": "跟隨需要 {{fee}} Power", - "feed_form.followed": "🎉 已關注。", + "feed_form.followed": "🎉 已關注", "feed_form.private_follow": "私人關注", - "feed_form.private_follow_description": "此關注是否在你的個人資料頁面上公開可見。", + "feed_form.private_follow_description": "此關注是否在你的個人資料頁面上公開可見", "feed_form.retry": "重試", "feed_form.title": "標題", "feed_form.title_description": "此資訊流的自定義標題。留空則使用默認標題。", "feed_form.unfollow": "取消關注", "feed_form.update": "更新", "feed_form.update_follow": "更新關注", - "feed_form.updated": "🎉 已更新。", + "feed_form.updated": "🎉 已更新", "feed_form.view": "視圖", "feed_item.claimed_by_owner": "訂閲源所有者", "feed_item.claimed_by_unknown": "未知所有者", @@ -152,7 +152,7 @@ "feed_view_type.pictures": "圖片", "feed_view_type.social_media": "社交媒體", "feed_view_type.videos": "視頻", - "mark_all_read_button.auto_confirm_info": "將在 3 秒後自動確認。", + "mark_all_read_button.auto_confirm_info": "將在 3 秒後自動確認", "mark_all_read_button.confirm": "確認", "mark_all_read_button.confirm_mark_all": "確定將 <which /> 標記為已讀?", "mark_all_read_button.confirm_mark_all_info": "確定將所有標記為已讀?", @@ -163,7 +163,7 @@ "notify.unSupportWidth": "{{app_name}} 目前尚未支援流動裝置", "notify.unSupportWidth_1": "您的裝置寬度為 <b>{{width}}</b>,低於支援的最小寬度 {{minWidth}}", "notify.unSupportWidth_2": "請切換至桌面應用程式繼續使用 {{app_name}} <br /> 下載連結:<url />", - "notify.unfollow_feed": "已取消關注 <FeedItem />。", + "notify.unfollow_feed": "已取消關注 <FeedItem />", "notify.update_info": "{{app_name}} 已準備好更新!", "notify.update_info_1": "點擊以重新啟動", "player.back_10s": "倒退 10 秒", @@ -181,7 +181,7 @@ "player.volume": "音量", "resize.tooltip.double_click_to_collapse": "<b>雙擊</b>以摺疊", "resize.tooltip.drag_to_resize": "<b>拖曳</b>以調整大小", - "search.empty.no_results": "未找到結果。", + "search.empty.no_results": "未找到結果", "search.group.entries": "條目", "search.group.feeds": "訂閱源", "search.options.all": "所有", @@ -239,7 +239,7 @@ "tip_modal.feed_owner": "訂閱源擁有者", "tip_modal.low_balance": "你的餘額不足以覆蓋此贊助。請調整金額。", "tip_modal.no_wallet": "你尚未擁有錢包。請創建一個錢包以進行贊助。", - "tip_modal.tip_amount_sent": "已經發送給作者。", + "tip_modal.tip_amount_sent": "已經發送給作者", "tip_modal.tip_now": "立刻贊助", "tip_modal.tip_sent": "贊助成功!感謝你的支持。", "tip_modal.tip_support": "⭐ 贊助以顯示你的支持!", @@ -284,6 +284,7 @@ "words.search": "搜尋", "words.starred": "收藏", "words.title": "標題", + "words.transform": "轉換", "words.trending": "熱門", "words.undo": "撤銷", "words.unread": "未讀", diff --git a/locales/common/zh-HK.json b/locales/common/zh-HK.json index 8f7c2df5a..a948663a4 100644 --- a/locales/common/zh-HK.json +++ b/locales/common/zh-HK.json @@ -16,6 +16,7 @@ "words.back": "返回", "words.copy": "複製", "words.create": "創建", + "words.delete": "刪除", "words.edit": "編輯", "words.entry": "條目", "words.id": "ID", diff --git a/locales/settings/zh-HK.json b/locales/settings/zh-HK.json index 61124c83d..385e08ac9 100644 --- a/locales/settings/zh-HK.json +++ b/locales/settings/zh-HK.json @@ -89,6 +89,9 @@ "general.app": "應用程式", "general.data_persist.description": "本地保存數據以啟用離線存取和本地搜尋。", "general.data_persist.label": "離線使用時保留數據", + "general.export.button": "匯出", + "general.export.description": "匯出你的訂閱到 OPML 文件", + "general.export.label": "匯出訂閱", "general.group_by_date.description": "按日期分組條目。", "general.group_by_date.label": "按日期分組", "general.language": "語言", @@ -159,6 +162,8 @@ "lists.create": "建立新清單", "lists.created.error": "建立清單失敗。", "lists.created.success": "成功建立清單!", + "lists.delete.error": "刪除清單失敗。", + "lists.delete.success": "成功刪除清單!", "lists.description": "描述", "lists.earnings": "收益", "lists.edit.error": "編輯清單失敗。", @@ -184,7 +189,7 @@ "lists.submit": "提交", "lists.subscriptions": "訂閱", "lists.title": "標題", - "lists.view": "查看", + "lists.view": "視圖", "profile.avatar.label": "頭像", "profile.handle.description": "你的唯一識別符。", "profile.handle.label": "識別符", @@ -226,6 +231,7 @@ "wallet.transactions.to": "發送至", "wallet.transactions.tx": "交易", "wallet.transactions.type": "類型", + "wallet.transactions.types.all": "全部", "wallet.transactions.types.burn": "銷燬", "wallet.transactions.types.mint": "鑄造", "wallet.transactions.types.purchase": "購買", From 719f1dae0e9762218b9e3c24b0aec2ced7f382be Mon Sep 17 00:00:00 2001 From: Kevin Cui <github@bugs.cc> Date: Sun, 13 Oct 2024 12:11:22 +0800 Subject: [PATCH 34/35] fix: app icon incorrect in Windows Control Panel (#899) Close: https://discord.com/channels/1243823539426033696/1294232031148118088 Signed-off-by: Kevin Cui <bh@bugs.cc> --- forge.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/forge.config.ts b/forge.config.ts index e579a2809..3eea4a775 100644 --- a/forge.config.ts +++ b/forge.config.ts @@ -154,6 +154,7 @@ const config: ForgeConfig = { new MakerSquirrel({ name: "Follow", setupIcon: "resources/icon.ico", + iconUrl: "https://app.follow.is/favicon.ico", }), new MakerAppImage({ options: { From b0bad7afe07e847a0e7b6eabaa02a2c17d024d25 Mon Sep 17 00:00:00 2001 From: Innei <tukon479@gmail.com> Date: Sun, 13 Oct 2024 12:45:31 +0800 Subject: [PATCH 35/35] fix: only navigate to root when document is focus Signed-off-by: Innei <tukon479@gmail.com> --- apps/renderer/src/modules/feed-column/list.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/renderer/src/modules/feed-column/list.tsx b/apps/renderer/src/modules/feed-column/list.tsx index aca3f0ae1..ca63fbce9 100644 --- a/apps/renderer/src/modules/feed-column/list.tsx +++ b/apps/renderer/src/modules/feed-column/list.tsx @@ -138,6 +138,7 @@ function FeedListImpl({ className, view }: { className?: string; view: number }) className="font-bold" onClick={(e) => { e.stopPropagation() + if (!document.hasFocus()) return if (view !== undefined) { navigateEntry({ entryId: null,