From 94b9535d28292dbc209e251e3b0cb18d480d6a3b Mon Sep 17 00:00:00 2001 From: Innei Date: Fri, 20 Sep 2024 23:39:11 +0800 Subject: [PATCH 01/47] feat(audio-view): seek circle indicator Signed-off-by: Innei --- .../ui/markdown/components/TimeStamp.tsx | 70 ++++++++++++++++++- apps/renderer/src/styles/colors.css | 4 ++ tailwind.config.ts | 7 +- 3 files changed, 73 insertions(+), 8 deletions(-) diff --git a/apps/renderer/src/components/ui/markdown/components/TimeStamp.tsx b/apps/renderer/src/components/ui/markdown/components/TimeStamp.tsx index 802951e1d..4c568ee7a 100644 --- a/apps/renderer/src/components/ui/markdown/components/TimeStamp.tsx +++ b/apps/renderer/src/components/ui/markdown/components/TimeStamp.tsx @@ -1,16 +1,24 @@ import { AudioPlayer } from "~/atoms/player" import { nextFrame } from "~/lib/dom" import { useEntryContentContext } from "~/modules/entry-content/hooks" +import { useEntry } from "~/store/entry" import { timeStringToSeconds } from "../utils" export const TimeStamp = (props: { time: string }) => { const { entryId, audioSrc: src } = useEntryContentContext() + const entry = useEntry(entryId) + const mediaDuration = entry?.entries.attachments?.[0]?.duration_in_seconds + if (!src) return {props.time} + + const seekTo = timeStringToSeconds(props.time) + if (typeof seekTo !== "number") return {props.time} + return ( { AudioPlayer.mount({ type: "audio", @@ -18,11 +26,67 @@ export const TimeStamp = (props: { time: string }) => { src, currentTime: 0, }) - nextFrame(() => AudioPlayer.seek(timeStringToSeconds(props.time) || 0)) + nextFrame(() => AudioPlayer.seek(seekTo)) }} > - + {/* */} + {!!mediaDuration && ( + + )} {props.time} ) } + +interface CircleProgressProps { + percent: number + size?: number + strokeWidth?: number + strokeColor?: string + backgroundColor?: string + className?: string +} + +const CircleProgress: React.FC = ({ + percent, + size = 100, + strokeWidth = 8, + strokeColor = "hsl(var(--fo-a))", + backgroundColor = "hsl(var(--fo-inactive))", + className, +}) => { + const normalizedPercent = Math.min(100, Math.max(0, percent)) + const radius = (size - strokeWidth) / 2 + const circumference = radius * 2 * Math.PI + const offset = circumference - (normalizedPercent / 100) * circumference + + return ( + + + + + ) +} diff --git a/apps/renderer/src/styles/colors.css b/apps/renderer/src/styles/colors.css index 150f83560..f2fb876a7 100644 --- a/apps/renderer/src/styles/colors.css +++ b/apps/renderer/src/styles/colors.css @@ -1,4 +1,6 @@ [data-theme="light"] { + --fo-a: 21.6, 100%, 50%; + --fo-vibrancy-background: theme(colors.native.active); --fo-vibrancy-foreground: 0, 0%, 45%; @@ -21,6 +23,8 @@ } [data-theme="dark"] { + --fo-a: 21.6, 100%, 50%; + --fo-vibrancy-foreground: 0, 0%, 83%; --fo-vibrancy-background: theme(colors.native.active); diff --git a/tailwind.config.ts b/tailwind.config.ts index ef575ab0d..c0121d72a 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -40,10 +40,7 @@ export default resolveConfig({ DEFAULT: "hsl(var(--muted) / )", foreground: "hsl(var(--muted-foreground) / )", }, - accent: { - DEFAULT: "#ff5c00", - foreground: "hsl(var(--fo-text-primary), )", - }, + accent: "hsl(var(--fo-a) / )", popover: { DEFAULT: "hsl(var(--popover) / )", @@ -61,7 +58,7 @@ export default resolveConfig({ theme: { // https://uicolors.app/create accent: { - DEFAULT: "#ff5c00", + DEFAULT: "hsl(var(--fo-a) / )", 50: "#fff7ec", 100: "#ffeed3", 200: "#ffd9a5", From a5e33112ff2782cdbca316ff1d4dd6fd78116a1c Mon Sep 17 00:00:00 2001 From: Innei Date: Fri, 20 Sep 2024 23:42:42 +0800 Subject: [PATCH 02/47] fix: style center Signed-off-by: Innei --- .../src/components/ui/markdown/components/TimeStamp.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/renderer/src/components/ui/markdown/components/TimeStamp.tsx b/apps/renderer/src/components/ui/markdown/components/TimeStamp.tsx index 4c568ee7a..702110285 100644 --- a/apps/renderer/src/components/ui/markdown/components/TimeStamp.tsx +++ b/apps/renderer/src/components/ui/markdown/components/TimeStamp.tsx @@ -18,7 +18,7 @@ export const TimeStamp = (props: { time: string }) => { return ( { AudioPlayer.mount({ type: "audio", @@ -29,10 +29,9 @@ export const TimeStamp = (props: { time: string }) => { nextFrame(() => AudioPlayer.seek(seekTo)) }} > - {/* */} {!!mediaDuration && ( Date: Sat, 21 Sep 2024 11:11:21 +0800 Subject: [PATCH 03/47] fix: position of swiper navigation buttons (#541) --- apps/renderer/src/components/ui/media/preview-media.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/renderer/src/components/ui/media/preview-media.tsx b/apps/renderer/src/components/ui/media/preview-media.tsx index 36e272ec3..fb9bcc8e6 100644 --- a/apps/renderer/src/components/ui/media/preview-media.tsx +++ b/apps/renderer/src/components/ui/media/preview-media.tsx @@ -174,7 +174,7 @@ export const PreviewMediaContent: FC<{
{Array.from({ length: media.length }) .fill(0) From 4dadd3119ad2e709c940b0f30b33ef68f4247aae Mon Sep 17 00:00:00 2001 From: "Kaffi Y." Date: Sat, 21 Sep 2024 12:31:51 +0800 Subject: [PATCH 04/47] refactor: deprecate hsl legacy syntax (#542) --- apps/renderer/src/lib/color.ts | 4 ++-- apps/renderer/src/styles/colors.css | 24 ++++++++++++------------ tailwind.config.ts | 10 +++++----- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/apps/renderer/src/lib/color.ts b/apps/renderer/src/lib/color.ts index 9230a078d..04e18bef9 100644 --- a/apps/renderer/src/lib/color.ts +++ b/apps/renderer/src/lib/color.ts @@ -7,8 +7,8 @@ const getRandomColor = (lightness: [number, number], saturation: [number, number const lightBackground = lightAccent < 80 ? lightAccent + 20 : 100 return { - accent: `hsl(${hue}, ${satAccent}%, ${lightAccent}%)`, - background: `hsl(${hue}, ${satBackground}%, ${lightBackground}%)`, + accent: `hsl(${hue} ${satAccent}% ${lightAccent}%)`, + background: `hsl(${hue} ${satBackground}% ${lightBackground}%)`, } } diff --git a/apps/renderer/src/styles/colors.css b/apps/renderer/src/styles/colors.css index f2fb876a7..4f3b47595 100644 --- a/apps/renderer/src/styles/colors.css +++ b/apps/renderer/src/styles/colors.css @@ -1,47 +1,47 @@ [data-theme="light"] { - --fo-a: 21.6, 100%, 50%; + --fo-a: 21.6 100% 50%; --fo-vibrancy-background: theme(colors.native.active); - --fo-vibrancy-foreground: 0, 0%, 45%; + --fo-vibrancy-foreground: 0 0% 45%; - --fo-text-primary: 0, 0%, 10%; + --fo-text-primary: 0 0% 10%; --fo-item-active: theme(colors.zinc.400/0.3); --fo-item-hover: theme(colors.zinc.400/0.2); - --fo-inactive: 0, 0%, 80%; - --fo-disabled: 0, 0%, 70%; + --fo-inactive: 0 0% 80%; + --fo-disabled: 0 0% 70%; --fo-background: theme(colors.background); --fo-modal-background: theme(colors.zinc.50/0.8); --fo-modal-background-opaque: theme(colors.zinc.50); - --fo-text-primary-hover: 0, 0%, 14.9%; + --fo-text-primary-hover: 0 0% 14.9%; --fo-button-hover: theme(colors.zinc.500/0.1); } [data-theme="dark"] { - --fo-a: 21.6, 100%, 50%; + --fo-a: 21.6 100% 50%; - --fo-vibrancy-foreground: 0, 0%, 83%; + --fo-vibrancy-foreground: 0 0% 83%; --fo-vibrancy-background: theme(colors.native.active); - --fo-text-primary: 0, 0%, 80%; + --fo-text-primary: 0 0% 80%; --fo-item-active: theme(colors.neutral.600/0.4); --fo-item-hover: theme(colors.neutral.700/0.3); - --fo-inactive: 0, 0%, 50%; - --fo-disabled: 0, 0%, 35%; + --fo-inactive: 0 0% 50%; + --fo-disabled: 0 0% 35%; --fo-background: theme(colors.background); --fo-modal-background: theme(colors.neutral.900/0.8); --fo-modal-background-opaque: theme(colors.neutral.900); - --fo-text-primary-hover: 240, 4.9%, 83.9%; + --fo-text-primary-hover: 240 4.9% 83.9%; --fo-button-hover: theme(colors.neutral.400/0.15); } diff --git a/tailwind.config.ts b/tailwind.config.ts index c0121d72a..530668396 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -72,7 +72,7 @@ export default resolveConfig({ 950: "#461304", }, - vibrancyFg: "hsl(var(--fo-vibrancy-foreground), )", + vibrancyFg: "hsl(var(--fo-vibrancy-foreground) / )", vibrancyBg: "var(--fo-vibrancy-background)", item: { @@ -80,13 +80,13 @@ export default resolveConfig({ hover: "var(--fo-item-hover)", }, - inactive: "hsl(var(--fo-inactive), )", - disabled: "hsl(var(--fo-disabled), )", + inactive: "hsl(var(--fo-inactive) / )", + disabled: "hsl(var(--fo-disabled) / )", - foreground: "hsl(var(--fo-text-primary), )", + foreground: "hsl(var(--fo-text-primary) / )", background: "var(--fo-background)", - "foreground-hover": "hsl(var(--fo-text-primary-hover), )", + "foreground-hover": "hsl(var(--fo-text-primary-hover) / )", modal: { background: "var(--fo-modal-background)", From b6ff6fb48f3133e10f8fc7598eaa9a7bc63aec25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=87?= Date: Sat, 21 Sep 2024 16:59:19 +0800 Subject: [PATCH 05/47] feat: add support for pointer cursor (#517) * feat: add support for pointer cursor (cherry picked from commit dcabf91d843f2487ad32ceacfdd2d1b9d7c2a5bf) * fix: correct useEffect update (cherry picked from commit cbf0a821cd5a9b72b14b63c317d88e68fbd6783d) * feat: remove default values * feat: pointer cursor Signed-off-by: Innei * fix: remove select content animation when position is `item-aligned` Signed-off-by: Innei * update hover Signed-off-by: Innei --------- Signed-off-by: Innei Co-authored-by: Innei --- apps/renderer/src/atoms/settings/ui.ts | 1 + .../src/components/common/ShadowDOM.tsx | 4 ++- .../src/components/ui/button/variants.tsx | 2 +- .../ui/context-menu/context-menu.tsx | 6 ++-- .../ui/dropdown-menu/dropdown-menu.tsx | 6 ++-- apps/renderer/src/components/ui/media.tsx | 4 +-- .../src/components/ui/media/SwipeMedia.tsx | 2 +- apps/renderer/src/components/ui/select.tsx | 13 +++++---- apps/renderer/src/components/ui/switch.tsx | 7 +++-- apps/renderer/src/initialize/index.ts | 6 ++++ .../src/modules/ai/ai-daily/daily.tsx | 2 +- .../modules/discover/recommendations-card.tsx | 29 ++++++++++--------- .../modules/entry-column/Items/video-item.tsx | 2 +- .../templates/list-item-template.tsx | 2 +- .../src/modules/entry-content/index.tsx | 2 +- .../src/modules/feed-column/category.tsx | 2 +- .../src/modules/feed-column/header.tsx | 2 +- .../renderer/src/modules/feed-column/item.tsx | 2 +- .../renderer/src/modules/feed-column/list.tsx | 4 +-- .../modules/profile/user-profile-modal.tsx | 2 +- .../renderer/src/modules/settings/control.tsx | 2 +- .../src/modules/settings/tabs/apperance.tsx | 4 +++ .../tabs/wallet/transaction-section/index.tsx | 2 +- .../(with-layout)/profile/[id]/index.tsx | 2 +- apps/renderer/src/pages/(main)/layout.tsx | 2 +- apps/renderer/src/pages/settings/layout.tsx | 2 +- apps/renderer/src/providers/setting-sync.tsx | 3 +- apps/renderer/src/styles/base.css | 2 +- apps/renderer/src/styles/cursor.css | 11 +++++++ apps/renderer/src/styles/main.css | 1 + locales/settings/en.json | 2 ++ locales/settings/zh-CN.json | 2 ++ packages/shared/src/interface/settings.ts | 1 + tailwind.config.ts | 10 +++++++ 34 files changed, 97 insertions(+), 49 deletions(-) create mode 100644 apps/renderer/src/styles/cursor.css diff --git a/apps/renderer/src/atoms/settings/ui.ts b/apps/renderer/src/atoms/settings/ui.ts index 8340f53eb..8a0fb1e25 100644 --- a/apps/renderer/src/atoms/settings/ui.ts +++ b/apps/renderer/src/atoms/settings/ui.ts @@ -19,6 +19,7 @@ export const createDefaultSettings = (): UISettings => ({ modalDraggable: true, modalOpaque: true, reduceMotion: false, + usePointerCursor: false, // Font uiFontFamily: "SN Pro", diff --git a/apps/renderer/src/components/common/ShadowDOM.tsx b/apps/renderer/src/components/common/ShadowDOM.tsx index 80135fd9e..09884fc68 100644 --- a/apps/renderer/src/components/common/ShadowDOM.tsx +++ b/apps/renderer/src/components/common/ShadowDOM.tsx @@ -103,6 +103,7 @@ export const ShadowDOM: FC>> & { const uiFont = useUISettingKey("uiFontFamily") const reduceMotion = useReduceMotion() + const usePointerCursor = useUISettingKey("usePointerCursor") return ( @@ -111,8 +112,9 @@ export const ShadowDOM: FC>> & { style={useMemo( () => ({ fontFamily: `${uiFont},"SN Pro", system-ui, sans-serif`, + "--pointer": usePointerCursor ? "pointer" : "default", }), - [uiFont], + [uiFont, usePointerCursor], )} id="shadow-html" data-motion-reduce={reduceMotion} diff --git a/apps/renderer/src/components/ui/button/variants.tsx b/apps/renderer/src/components/ui/button/variants.tsx index c7f99ccef..d87f3ca1f 100644 --- a/apps/renderer/src/components/ui/button/variants.tsx +++ b/apps/renderer/src/components/ui/button/variants.tsx @@ -7,7 +7,7 @@ import { cn } from "~/lib/utils" export const styledButtonVariant = cva( [ - "inline-flex cursor-default select-none items-center justify-center gap-2 outline-offset-2 transition active:transition-none disabled:cursor-not-allowed", + "inline-flex cursor-button select-none items-center justify-center gap-2 outline-offset-2 transition active:transition-none disabled:cursor-not-allowed", "ring-accent/20 duration-200 disabled:ring-0", "align-middle", ], 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 e6c58492f..8ce004024 100644 --- a/apps/renderer/src/components/ui/context-menu/context-menu.tsx +++ b/apps/renderer/src/components/ui/context-menu/context-menu.tsx @@ -24,7 +24,7 @@ const ContextMenuSubTrigger = React.forwardRef< = ({ onError={errorHandle} className={cn( !(props.width || props.height) && "size-full", - "bg-gray-200 object-cover duration-200 dark:bg-neutral-800", + "cursor-card bg-gray-200 object-cover duration-200 dark:bg-neutral-800", popper && "cursor-zoom-in", mediaLoadState === "loaded" ? "opacity-100" : "opacity-0", @@ -126,7 +126,7 @@ const MediaImpl: FC = ({ className={cn( "center", !(props.width || props.height) && "size-full", - "relative bg-stone-100 object-cover", + "relative cursor-card bg-stone-100 object-cover", mediaContainerClassName, )} onClick={handleClick} diff --git a/apps/renderer/src/components/ui/media/SwipeMedia.tsx b/apps/renderer/src/components/ui/media/SwipeMedia.tsx index bcac8d084..da50c2da3 100644 --- a/apps/renderer/src/components/ui/media/SwipeMedia.tsx +++ b/apps/renderer/src/components/ui/media/SwipeMedia.tsx @@ -59,7 +59,7 @@ export function SwipeMedia({
(({ className, ...props }, ref) => ( @@ -54,7 +55,7 @@ const SelectScrollDownButton = React.forwardRef< >(({ className, ...props }, ref) => ( @@ -70,9 +71,11 @@ const SelectContent = React.forwardRef< (({ className, ...props }, ref) => ( - + )) Switch.displayName = SwitchPrimitives.Root.displayName diff --git a/apps/renderer/src/initialize/index.ts b/apps/renderer/src/initialize/index.ts index b978e7328..df82fada9 100644 --- a/apps/renderer/src/initialize/index.ts +++ b/apps/renderer/src/initialize/index.ts @@ -7,6 +7,8 @@ import duration from "dayjs/plugin/duration" import localizedFormat from "dayjs/plugin/localizedFormat" import relativeTime from "dayjs/plugin/relativeTime" import { enableMapSet } from "immer" +import React from "react" +import ReactDOM from "react-dom" import { toast } from "sonner" import { getUISettings } from "~/atoms/settings/ui" @@ -119,6 +121,10 @@ export const initializeApp = async () => { data_hydrated_time: dataHydratedTime, version: APP_VERSION, }) + + // expose `React` `ReactDOM` to global, it's easier for developers to make plugins + window.React = React + window.ReactDOM = ReactDOM } import.meta.hot?.dispose(cleanup) diff --git a/apps/renderer/src/modules/ai/ai-daily/daily.tsx b/apps/renderer/src/modules/ai/ai-daily/daily.tsx index 1caa5993d..e22a099d0 100644 --- a/apps/renderer/src/modules/ai/ai-daily/daily.tsx +++ b/apps/renderer/src/modules/ai/ai-daily/daily.tsx @@ -65,7 +65,7 @@ export const DailyReportTitle = ({
{t("ai_daily.title", { title })}
- + diff --git a/apps/renderer/src/modules/discover/recommendations-card.tsx b/apps/renderer/src/modules/discover/recommendations-card.tsx index 9ea155fb7..fde564d04 100644 --- a/apps/renderer/src/modules/discover/recommendations-card.tsx +++ b/apps/renderer/src/modules/discover/recommendations-card.tsx @@ -25,20 +25,21 @@ export const RecommendationCard: FC = memo(({ data, rou
    {Object.keys(data.routes).map((route) => ( -
  • { - present({ - content: () => ( - - ), - icon: , - title: `${data.name} - ${data.routes[route].name}`, - }) - }} - > - {data.routes[route].name} +
  • +
  • ))}
diff --git a/apps/renderer/src/modules/entry-column/Items/video-item.tsx b/apps/renderer/src/modules/entry-column/Items/video-item.tsx index 314058079..943ccf66d 100644 --- a/apps/renderer/src/modules/entry-column/Items/video-item.tsx +++ b/apps/renderer/src/modules/entry-column/Items/video-item.tsx @@ -58,7 +58,7 @@ export function VideoItem({ entryId, entryPreview, translation }: UniversalItemP return (
{ if (iframeSrc) { modalStack.present({ diff --git a/apps/renderer/src/modules/entry-column/templates/list-item-template.tsx b/apps/renderer/src/modules/entry-column/templates/list-item-template.tsx index b55d3f0b6..4ab6ecf43 100644 --- a/apps/renderer/src/modules/entry-column/templates/list-item-template.tsx +++ b/apps/renderer/src/modules/entry-column/templates/list-item-template.tsx @@ -68,7 +68,7 @@ export function ListItem({ onMouseEnter={handlePrefetchEntry} onMouseLeave={handlePrefetchEntry.cancel} className={cn( - "group relative flex py-4 pl-3 pr-2", + "group relative flex cursor-menu py-4 pl-3 pr-2", !asRead && "before:absolute before:-left-0.5 before:top-[1.4375rem] before:block before:size-2 before:rounded-full before:bg-accent", )} diff --git a/apps/renderer/src/modules/entry-content/index.tsx b/apps/renderer/src/modules/entry-content/index.tsx index 8987863c5..0d34683a9 100644 --- a/apps/renderer/src/modules/entry-content/index.tsx +++ b/apps/renderer/src/modules/entry-content/index.tsx @@ -219,7 +219,7 @@ export const EntryContentRender: Component<{ entryId: string }> = ({ entryId, cl
diff --git a/apps/renderer/src/modules/feed-column/category.tsx b/apps/renderer/src/modules/feed-column/category.tsx index 439e8366c..b64032676 100644 --- a/apps/renderer/src/modules/feed-column/category.tsx +++ b/apps/renderer/src/modules/feed-column/category.tsx @@ -120,7 +120,7 @@ function FeedCategoryImpl({ {!!showCollapse && (
{ diff --git a/apps/renderer/src/modules/feed-column/header.tsx b/apps/renderer/src/modules/feed-column/header.tsx index 3f42dcdee..e2a87dddf 100644 --- a/apps/renderer/src/modules/feed-column/header.tsx +++ b/apps/renderer/src/modules/feed-column/header.tsx @@ -126,7 +126,7 @@ const LogoContextMenu: FC = ({ children }) => { toast.success(t.common("app.copied_to_clipboard")) }} className={cn( - "relative flex cursor-default select-none items-center rounded-sm px-1 py-0.5 text-sm outline-none", + "relative flex cursor-menu select-none items-center rounded-sm px-1 py-0.5 text-sm outline-none", "focus-within:outline-transparent hover:bg-theme-item-hover dark:hover:bg-neutral-800", "gap-2 text-foreground/80 [&_svg]:size-3", )} diff --git a/apps/renderer/src/modules/feed-column/item.tsx b/apps/renderer/src/modules/feed-column/item.tsx index 20e74c5d2..2fd1bec89 100644 --- a/apps/renderer/src/modules/feed-column/item.tsx +++ b/apps/renderer/src/modules/feed-column/item.tsx @@ -68,7 +68,7 @@ const FeedItemImpl = ({ view, feedId, className, showUnreadCount = true }: FeedI
{ @@ -140,7 +140,7 @@ function FeedListImpl({ className, view }: { className?: string; view: number })
diff --git a/apps/renderer/src/modules/profile/user-profile-modal.tsx b/apps/renderer/src/modules/profile/user-profile-modal.tsx index 5cefbbff0..7571cbdbb 100644 --- a/apps/renderer/src/modules/profile/user-profile-modal.tsx +++ b/apps/renderer/src/modules/profile/user-profile-modal.tsx @@ -373,7 +373,7 @@ const SubscriptionItem: FC<{ data-feed-id={subscription.feedId} > diff --git a/apps/renderer/src/modules/settings/control.tsx b/apps/renderer/src/modules/settings/control.tsx index dfdb28ebc..c991cc80e 100644 --- a/apps/renderer/src/modules/settings/control.tsx +++ b/apps/renderer/src/modules/settings/control.tsx @@ -37,7 +37,7 @@ export const SettingSwitch: Component<{ return (
- +
) } diff --git a/apps/renderer/src/modules/settings/tabs/apperance.tsx b/apps/renderer/src/modules/settings/tabs/apperance.tsx index 278282c80..484a497db 100644 --- a/apps/renderer/src/modules/settings/tabs/apperance.tsx +++ b/apps/renderer/src/modules/settings/tabs/apperance.tsx @@ -93,6 +93,10 @@ export const SettingAppearance = () => { label: t("appearance.reduce_motion.label"), description: t("appearance.reduce_motion.description"), }), + defineItem("usePointerCursor", { + label: t("appearance.use_pointer_cursor.label"), + description: t("appearance.use_pointer_cursor.description"), + }), ]} />
diff --git a/apps/renderer/src/modules/settings/tabs/wallet/transaction-section/index.tsx b/apps/renderer/src/modules/settings/tabs/wallet/transaction-section/index.tsx index 116ef3100..42f0fd9d8 100644 --- a/apps/renderer/src/modules/settings/tabs/wallet/transaction-section/index.tsx +++ b/apps/renderer/src/modules/settings/tabs/wallet/transaction-section/index.tsx @@ -174,7 +174,7 @@ const UserRenderer = ({ onClick={() => { if (user?.id) presentUserModal(user.id) }} - className={cn("flex items-center", user?.id ? "cursor-pointer" : "cursor-default")} + className="flex cursor-button items-center" > {name === APP_NAME ? ( diff --git a/apps/renderer/src/pages/(external)/(with-layout)/profile/[id]/index.tsx b/apps/renderer/src/pages/(external)/(with-layout)/profile/[id]/index.tsx index 498edaaf3..8a841e8ef 100644 --- a/apps/renderer/src/pages/(external)/(with-layout)/profile/[id]/index.tsx +++ b/apps/renderer/src/pages/(external)/(with-layout)/profile/[id]/index.tsx @@ -73,7 +73,7 @@ export function Component() { {subscriptions.data?.[category].map((subscription) => (
diff --git a/apps/renderer/src/pages/(main)/layout.tsx b/apps/renderer/src/pages/(main)/layout.tsx index 8efb3272f..e0e65b87e 100644 --- a/apps/renderer/src/pages/(main)/layout.tsx +++ b/apps/renderer/src/pages/(main)/layout.tsx @@ -53,7 +53,7 @@ const FooterInfo = () => { onClick={() => { window.open(`${repository.url}/releases`) }} - className="center cursor-pointer rounded-full border bg-background p-1.5 shadow-sm" + className="center rounded-full border bg-background p-1.5 shadow-sm" > diff --git a/apps/renderer/src/pages/settings/layout.tsx b/apps/renderer/src/pages/settings/layout.tsx index f01ca46b9..f0353b163 100644 --- a/apps/renderer/src/pages/settings/layout.tsx +++ b/apps/renderer/src/pages/settings/layout.tsx @@ -19,7 +19,7 @@ function Layout() { {settings.map((t) => ( { fontFamily: fontCss, }) root.style.cssText += `\n--fo-font-family: ${fontCss}` + root.style.cssText += `\n--pointer: ${setting.usePointerCursor ? "pointer" : "default"}` Object.assign(document.body.style, { fontFamily: fontCss, }) - }, [setting.uiFontFamily]) + }, [setting.uiFontFamily, setting.usePointerCursor]) useEffect(() => { if (setting.showDockBadge) { diff --git a/apps/renderer/src/styles/base.css b/apps/renderer/src/styles/base.css index 00db7ae55..b9fa4870e 100644 --- a/apps/renderer/src/styles/base.css +++ b/apps/renderer/src/styles/base.css @@ -21,7 +21,7 @@ body, } button { - @apply cursor-default; + cursor: var(--pointer); } .prose a { diff --git a/apps/renderer/src/styles/cursor.css b/apps/renderer/src/styles/cursor.css new file mode 100644 index 000000000..44600e474 --- /dev/null +++ b/apps/renderer/src/styles/cursor.css @@ -0,0 +1,11 @@ +html, +#shadow-html { + --cursor-button: var(--pointer); + --cursor-select: var(--pointer); + --cursor-checkbox: var(--pointer); + --cursor-link: var(--pointer); + --cursor-menu: default; + --cursor-radio: var(--pointer); + --cursor-switch: var(--pointer); + --cursor-card: var(--pointer); +} diff --git a/apps/renderer/src/styles/main.css b/apps/renderer/src/styles/main.css index c2bd55c4e..92f1866ce 100644 --- a/apps/renderer/src/styles/main.css +++ b/apps/renderer/src/styles/main.css @@ -4,3 +4,4 @@ @import "./colors.css"; @import "./additional.css"; @import "./scrollbar.css"; +@import "./cursor.css"; diff --git a/locales/settings/en.json b/locales/settings/en.json index 33937f27a..3f9fa74aa 100644 --- a/locales/settings/en.json +++ b/locales/settings/en.json @@ -73,6 +73,8 @@ "appearance.title": "Appearance", "appearance.ui_font": "UI Font", "appearance.unread_count": "Unread count", + "appearance.use_pointer_cursor.description": "Change the cursor to a pointer when hovering over any interactive element.", + "appearance.use_pointer_cursor.label": "Use pointer cursors", "common.give_star": "Love our product? Give us a star on GitHub!", "feeds.claimTips": "To claim your feeds and receive tips, right-click on the feed in your subscription list and select Claim.", "feeds.noFeeds": "No claimed feeds", diff --git a/locales/settings/zh-CN.json b/locales/settings/zh-CN.json index dbfa3efb1..1d83e906f 100644 --- a/locales/settings/zh-CN.json +++ b/locales/settings/zh-CN.json @@ -73,6 +73,8 @@ "appearance.title": "外观", "appearance.ui_font": "界面字体", "appearance.unread_count": "未读数", + "appearance.use_pointer_cursor.description": "悬停在任何可交互元素上时将光标更改为指针。", + "appearance.use_pointer_cursor.label": "使用指针光标", "common.give_star": "喜欢我们的产品吗? 在 GitHub 上给我们 star 吧!", "feeds.claimTips": "要认证你的订阅源并接收打赏,请在订阅列表中右键点击订阅源并选择“认证”。", "feeds.noFeeds": "没有已认证的订阅源", diff --git a/packages/shared/src/interface/settings.ts b/packages/shared/src/interface/settings.ts index e2094493b..2f4496125 100644 --- a/packages/shared/src/interface/settings.ts +++ b/packages/shared/src/interface/settings.ts @@ -22,6 +22,7 @@ export interface UISettings { modalDraggable: boolean modalOpaque: boolean reduceMotion: boolean + usePointerCursor: boolean | null uiFontFamily: string readerFontFamily: string readerRenderInlineStyle: boolean diff --git a/tailwind.config.ts b/tailwind.config.ts index 530668396..14526a5ad 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -27,6 +27,16 @@ export default resolveConfig({ theme: "var(--fo-font-family)", default: "SN pro, sans-serif, system-ui", }, + cursor: { + button: "var(--cursor-button)", + select: "var(--cursor-select)", + checkbox: "var(--cursor-checkbox)", + link: "var(--cursor-link)", + menu: "var(--cursor-menu)", + radio: "var(--cursor-radio)", + switch: "var(--cursor-switch)", + card: "var(--cursor-card)", + }, colors: { border: "hsl(var(--border) / )", background: "hsl(var(--background) / )", From b34aa579f07af9dd3feca036b8996e561204d850 Mon Sep 17 00:00:00 2001 From: Innei Date: Sat, 21 Sep 2024 16:59:39 +0800 Subject: [PATCH 06/47] fix: overflow text in setting modal layout Signed-off-by: Innei --- apps/renderer/src/modules/settings/modal/layout.tsx | 2 +- apps/renderer/src/modules/settings/title.tsx | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/renderer/src/modules/settings/modal/layout.tsx b/apps/renderer/src/modules/settings/modal/layout.tsx index 5beba5833..a29a0546d 100644 --- a/apps/renderer/src/modules/settings/modal/layout.tsx +++ b/apps/renderer/src/modules/settings/modal/layout.tsx @@ -97,7 +97,7 @@ export function SettingModalLayout(
)}
-
+
{APP_NAME} diff --git a/apps/renderer/src/modules/settings/title.tsx b/apps/renderer/src/modules/settings/title.tsx index 684af3f6a..405d2942e 100644 --- a/apps/renderer/src/modules/settings/title.tsx +++ b/apps/renderer/src/modules/settings/title.tsx @@ -1,6 +1,7 @@ import { useTranslation } from "react-i18next" import { useLoaderData } from "react-router-dom" +import { EllipsisHorizontalTextWithTooltip } from "~/components/ui/typography" import { cn } from "~/lib/utils" import { settings } from "./constants" @@ -15,9 +16,9 @@ export const SettingsSidebarTitle = ({ path, className }: { path: string; classN } return ( -
- - {t(tab.name as any)} +
+ + {t(tab.name as any)}
) } From b2c48a49e3789cb3dfd9e9170f5371fc6b25c4b1 Mon Sep 17 00:00:00 2001 From: Innei Date: Sat, 21 Sep 2024 18:17:07 +0800 Subject: [PATCH 07/47] fix: reorganize package.json Signed-off-by: Innei --- apps/main/package.json | 13 +- apps/renderer/package.json | 7 - configs/vite.render.config.ts | 2 +- package.json | 3 - packages/shared/package.json | 173 +---------- pnpm-lock.yaml | 559 ++-------------------------------- 6 files changed, 30 insertions(+), 727 deletions(-) diff --git a/apps/main/package.json b/apps/main/package.json index 6cffcb189..bd1c1840f 100644 --- a/apps/main/package.json +++ b/apps/main/package.json @@ -26,8 +26,6 @@ "@follow/shared": "workspace:*", "@mozilla/readability": "^0.5.0", "@sentry/electron": "5.4.0", - "@yornaath/batshit": "0.10.1", - "bufferutil": "4.0.8", "builder-util-runtime": "9.2.5", "dayjs": "1.11.13", "dotenv": "16.4.5", @@ -37,8 +35,6 @@ "electron-updater": "^6.3.4", "font-list": "1.5.1", "i18next": "^23.15.1", - "i18next-browser-languagedetector": "8.0.0", - "idb-keyval": "6.2.1", "linkedom": "^0.18.4", "lodash-es": "4.17.21", "lowdb": "7.0.1", @@ -48,21 +44,14 @@ "posthog-js": "1.161.5", "posthog-node": "4.2.0", "semver": "7.6.3", - "tldts": "6.1.46", - "vscode-languagedetection": "npm:@vscode/vscode-languagedetection@^1.0.22", - "zod": "3.23.8" + "vscode-languagedetection": "npm:@vscode/vscode-languagedetection@^1.0.22" }, "devDependencies": { - "@babel/generator": "7.25.6", - "@hono/node-server": "1.13.0", "@types/lodash-es": "4.17.12", "@types/node": "^22.5.5", - "drizzle-orm": "0.33.0", "electron": "32.1.0", "electron-devtools-installer": "3.2.0", "hono": "4.6.2", - "rimraf": "6.0.1", - "tsx": "4.19.1", "typescript": "^5.6.2" } } diff --git a/apps/renderer/package.json b/apps/renderer/package.json index 085656fd4..c091c4fa7 100644 --- a/apps/renderer/package.json +++ b/apps/renderer/package.json @@ -11,7 +11,6 @@ "@egjs/react-infinitegrid": "4.12.0", "@egoist/tipc": "0.3.2", "@electron-toolkit/preload": "^3.0.1", - "@electron-toolkit/utils": "^3.0.0", "@follow/electron-main": "workspace:*", "@follow/shared": "workspace:*", "@fontsource/sn-pro": "5.1.0", @@ -49,8 +48,6 @@ "@tanstack/react-query-persist-client": "5.56.2", "@use-gesture/react": "10.3.1", "@yornaath/batshit": "0.10.1", - "bufferutil": "4.0.8", - "builder-util-runtime": "9.2.5", "class-variance-authority": "0.7.0", "click-to-react-component": "1.1.0", "clsx": "2.1.1", @@ -58,7 +55,6 @@ "dayjs": "1.11.13", "dexie": "4.0.8", "dnum": "^2.13.1", - "dotenv": "16.4.5", "electron-log": "5.2.0", "foxact": "0.2.38", "framer-motion": "11.5.4", @@ -74,7 +70,6 @@ "lethargy": "1.0.9", "linkedom": "^0.18.4", "lodash-es": "4.17.21", - "msedge-tts": "1.3.4", "nanoid": "5.0.7", "ofetch": "1.3.4", "path-to-regexp": "8.1.0", @@ -100,7 +95,6 @@ "remark-gh-alerts": "0.0.3", "remark-parse": "11.0.0", "remark-rehype": "11.1.0", - "semver": "7.6.3", "shiki": "1.17.7", "sonner": "^1.5.0", "swiper": "11.1.14", @@ -109,7 +103,6 @@ "unified": "11.0.5", "use-context-selector": "2.0.0", "usehooks-ts": "3.1.0", - "utf-8-validate": "6.0.4", "vfile": "6.0.3", "zod": "3.23.8", "zustand": "4.5.5" diff --git a/configs/vite.render.config.ts b/configs/vite.render.config.ts index 62bea76d9..41b28d992 100644 --- a/configs/vite.render.config.ts +++ b/configs/vite.render.config.ts @@ -22,7 +22,7 @@ function localesPlugin(): Plugin { enforce: "post", generateBundle(_options, bundle) { const localesDir = path.resolve(__dirname, "../locales") - const namespaces = fs.readdirSync(localesDir) + const namespaces = fs.readdirSync(localesDir).filter((dir) => dir !== ".DS_Store") const languageResources = {} namespaces.forEach((namespace) => { diff --git a/package.json b/package.json index 060a2c681..b3ce27c34 100644 --- a/package.json +++ b/package.json @@ -67,9 +67,6 @@ "@types/react-dom": "^18.3.0", "@vitejs/plugin-legacy": "5.4.2", "@vitejs/plugin-react": "^4.3.1", - "@yornaath/batshit": "0.10.1", - "bufferutil": "4.0.8", - "builder-util-runtime": "9.2.5", "cssnano": "7.0.6", "dnum": "^2.13.1", "dotenv": "16.4.5", diff --git a/packages/shared/package.json b/packages/shared/package.json index f0a19ed28..db11c1aa0 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -25,170 +25,17 @@ }, "scripts": {}, "dependencies": { - "@egjs/react-infinitegrid": "4.12.0", - "@egoist/tipc": "0.3.2", - "@electron-toolkit/preload": "^3.0.1", - "@electron-toolkit/utils": "^3.0.0", - "@fontsource/sn-pro": "5.1.0", - "@hono/auth-js": "1.0.10", - "@hookform/resolvers": "3.9.0", - "@iconify/tools": "4.0.6", - "@microflash/remark-callout-directives": "4.3.1", - "@mozilla/readability": "^0.5.0", - "@radix-ui/react-alert-dialog": "1.1.1", - "@radix-ui/react-avatar": "1.1.0", - "@radix-ui/react-checkbox": "1.1.1", - "@radix-ui/react-context-menu": "2.2.1", - "@radix-ui/react-dialog": "1.1.1", - "@radix-ui/react-dropdown-menu": "2.1.1", - "@radix-ui/react-hover-card": "1.1.1", - "@radix-ui/react-label": "2.1.0", - "@radix-ui/react-popover": "1.1.1", - "@radix-ui/react-radio-group": "1.2.0", - "@radix-ui/react-scroll-area": "1.1.0", - "@radix-ui/react-select": "2.1.1", - "@radix-ui/react-slider": "^1.2.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-switch": "1.1.0", - "@radix-ui/react-tabs": "1.1.0", - "@radix-ui/react-toast": "1.2.1", - "@radix-ui/react-tooltip": "1.1.2", - "@sentry/electron": "5.4.0", - "@sentry/react": "8.30.0", - "@sentry/vite-plugin": "2.22.4", - "@shikijs/transformers": "1.17.7", - "@t3-oss/env-core": "0.11.1", - "@tanstack/query-sync-storage-persister": "5.56.2", - "@tanstack/react-query": "5.56.2", - "@tanstack/react-query-devtools": "5.56.2", - "@tanstack/react-query-persist-client": "5.56.2", - "@use-gesture/react": "10.3.1", - "@yornaath/batshit": "0.10.1", - "bufferutil": "4.0.8", - "builder-util-runtime": "9.2.5", - "class-variance-authority": "0.7.0", - "click-to-react-component": "1.1.0", - "clsx": "2.1.1", - "cmdk": "1.0.0", - "dayjs": "1.11.13", - "dexie": "4.0.8", - "dnum": "^2.13.1", - "dotenv": "16.4.5", - "electron-context-menu": "4.0.4", - "electron-log": "5.2.0", - "electron-squirrel-startup": "1.0.1", - "electron-updater": "^6.3.4", - "font-list": "1.5.1", - "foxact": "0.2.38", - "framer-motion": "11.5.4", - "franc-min": "6.2.0", - "fuse.js": "7.0.0", - "hast-util-to-jsx-runtime": "2.3.0", - "hast-util-to-text": "4.0.2", - "i18next": "^23.15.1", - "i18next-browser-languagedetector": "8.0.0", - "idb-keyval": "6.2.1", - "immer": "10.1.1", - "jotai": "2.9.3", - "lethargy": "1.0.9", - "linkedom": "^0.18.4", - "lodash-es": "4.17.21", - "lowdb": "7.0.1", - "msedge-tts": "1.3.4", - "nanoid": "5.0.7", - "ofetch": "1.3.4", - "path-to-regexp": "8.1.0", - "posthog-js": "1.161.5", - "posthog-node": "4.2.0", - "re-resizable": "6.9.18", - "react-error-boundary": "4.0.13", - "react-fast-marquee": "1.6.5", - "react-hook-form": "7.53.0", - "react-hotkeys-hook": "4.5.1", - "react-i18next": "^15.0.2", - "react-intersection-observer": "9.13.1", - "react-resizable-layout": "npm:@innei/react-resizable-layout@0.7.3-fork.1", - "react-router-dom": "6.26.2", - "react-selecto": "1.26.3", - "react-shadow": "20.5.0", - "react-virtuoso": "4.10.4", - "rehype-infer-description-meta": "2.0.0", - "rehype-parse": "9.0.0", - "rehype-sanitize": "6.0.0", - "rehype-stringify": "10.0.0", - "remark-directive": "3.0.0", - "remark-gfm": "4.0.0", - "remark-gh-alerts": "0.0.3", - "remark-parse": "11.0.0", - "remark-rehype": "11.1.0", - "semver": "7.6.3", - "shiki": "1.17.7", - "sonner": "^1.5.0", - "swiper": "11.1.14", - "tailwind-merge": "2.5.2", - "tldts": "6.1.46", - "unified": "11.0.5", - "use-context-selector": "2.0.0", - "usehooks-ts": "3.1.0", - "utf-8-validate": "6.0.4", - "vfile": "6.0.3", - "vscode-languagedetection": "npm:@vscode/vscode-languagedetection@^1.0.22", - "zod": "3.23.8", - "zustand": "4.5.5" - }, - "devDependencies": { - "@babel/generator": "7.25.6", - "@clack/prompts": "0.7.0", - "@egoist/tailwindcss-icons": "1.8.1", - "@electron-forge/cli": "7.4.0", - "@electron-forge/maker-dmg": "7.4.0", - "@electron-forge/maker-squirrel": "7.4.0", - "@electron-forge/maker-zip": "7.4.0", - "@electron-forge/plugin-fuses": "7.4.0", - "@electron-forge/publisher-github": "7.4.0", + "@electron-toolkit/preload": "^3.0.0", "@electron-toolkit/tsconfig": "^1.0.1", - "@hono/node-server": "1.13.0", - "@iconify-json/logos": "1.2.0", - "@iconify-json/mingcute": "1.2.0", - "@iconify-json/simple-icons": "^1.2.3", - "@pengx17/electron-forge-maker-appimage": "1.2.1", - "@tailwindcss/container-queries": "0.1.1", - "@tailwindcss/typography": "0.5.15", - "@types/lodash-es": "4.17.12", - "@types/node": "^22.5.5", - "@types/react": "^18.3.7", - "@types/react-dom": "^18.3.0", - "@vercel/ncc": "0.38.1", - "@vitejs/plugin-legacy": "5.4.2", - "@vitejs/plugin-react": "^4.3.1", - "cssnano": "7.0.6", - "drizzle-orm": "0.33.0", - "electron": "32.1.0", - "electron-devtools-installer": "3.2.0", - "electron-packager-languages": "0.5.0", - "electron-vite": "^2.3.0", - "eslint": "^9.10.0", - "eslint-config-hyoban": "^3.1.6", - "fake-indexeddb": "6.0.0", - "hono": "4.6.2", - "lint-staged": "15.2.10", - "nbump": "2.0.4", - "postcss": "8.4.47", - "postcss-js": "4.0.1", - "prettier": "3.3.3", + "@hono/node-server": "^1.13.0", + "@t3-oss/env-core": "^0.11.0", + "drizzle-orm": "^0.33.0", + "electron": "^32.1.0", + "hono": "^4.6.2", "react": "^18.3.1", "react-dom": "^18.3.1", - "rimraf": "6.0.1", - "shx": "^0.3.4", - "simple-git-hooks": "2.11.1", - "tailwindcss": "3.4.11", - "tailwindcss-animate": "1.0.7", - "tsx": "4.19.1", - "typescript": "^5.6.2", - "vite": "^5.4.6", - "vite-bundle-analyzer": "0.10.6", - "vite-plugin-mkcert": "1.17.6", - "vite-tsconfig-paths": "5.0.1", - "vitest": "2.0.5" - } + "sonner": "^1.5.0", + "zod": "^3.23.8" + }, + "devDependencies": {} } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 38bacbe31..08f784994 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -122,15 +122,6 @@ importers: '@vitejs/plugin-react': specifier: ^4.3.1 version: 4.3.1(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0)) - '@yornaath/batshit': - specifier: 0.10.1 - version: 0.10.1 - bufferutil: - specifier: 4.0.8 - version: 4.0.8 - builder-util-runtime: - specifier: 9.2.5 - version: 9.2.5 cssnano: specifier: 7.0.6 version: 7.0.6(postcss@8.4.47) @@ -248,12 +239,6 @@ importers: '@sentry/electron': specifier: 5.4.0 version: 5.4.0 - '@yornaath/batshit': - specifier: 0.10.1 - version: 0.10.1 - bufferutil: - specifier: 4.0.8 - version: 4.0.8 builder-util-runtime: specifier: 9.2.5 version: 9.2.5 @@ -281,12 +266,6 @@ importers: i18next: specifier: ^23.15.1 version: 23.15.1 - i18next-browser-languagedetector: - specifier: 8.0.0 - version: 8.0.0 - idb-keyval: - specifier: 6.2.1 - version: 6.2.1 linkedom: specifier: ^0.18.4 version: 0.18.4 @@ -314,31 +293,16 @@ importers: semver: specifier: 7.6.3 version: 7.6.3 - tldts: - specifier: 6.1.46 - version: 6.1.46 vscode-languagedetection: specifier: npm:@vscode/vscode-languagedetection@^1.0.22 version: '@vscode/vscode-languagedetection@1.0.22' - zod: - specifier: 3.23.8 - version: 3.23.8 devDependencies: - '@babel/generator': - specifier: 7.25.6 - version: 7.25.6 - '@hono/node-server': - specifier: 1.13.0 - version: 1.13.0(hono@4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e)) '@types/lodash-es': specifier: 4.17.12 version: 4.17.12 '@types/node': specifier: ^22.5.5 version: 22.5.5 - drizzle-orm: - specifier: 0.33.0 - version: 0.33.0(@opentelemetry/api@1.9.0)(@types/pg@8.11.8)(@types/react@18.3.7)(react@18.3.1) electron: specifier: 32.1.0 version: 32.1.0 @@ -348,12 +312,6 @@ importers: hono: specifier: 4.6.2 version: 4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e) - rimraf: - specifier: 6.0.1 - version: 6.0.1 - tsx: - specifier: 4.19.1 - version: 4.19.1 typescript: specifier: ^5.6.2 version: 5.6.2 @@ -369,9 +327,6 @@ importers: '@electron-toolkit/preload': specifier: ^3.0.1 version: 3.0.1(electron@32.1.0) - '@electron-toolkit/utils': - specifier: ^3.0.0 - version: 3.0.0(electron@32.1.0) '@follow/electron-main': specifier: workspace:* version: link:../main @@ -483,12 +438,6 @@ importers: '@yornaath/batshit': specifier: 0.10.1 version: 0.10.1 - bufferutil: - specifier: 4.0.8 - version: 4.0.8 - builder-util-runtime: - specifier: 9.2.5 - version: 9.2.5 class-variance-authority: specifier: 0.7.0 version: 0.7.0 @@ -510,9 +459,6 @@ importers: dnum: specifier: ^2.13.1 version: 2.13.1 - dotenv: - specifier: 16.4.5 - version: 16.4.5 electron-log: specifier: 5.2.0 version: 5.2.0 @@ -558,9 +504,6 @@ importers: lodash-es: specifier: 4.17.21 version: 4.17.21 - msedge-tts: - specifier: 1.3.4 - version: 1.3.4(bufferutil@4.0.8)(utf-8-validate@6.0.4) nanoid: specifier: 5.0.7 version: 5.0.7 @@ -636,9 +579,6 @@ importers: remark-rehype: specifier: 11.1.0 version: 11.1.0 - semver: - specifier: 7.6.3 - version: 7.6.3 shiki: specifier: 1.17.7 version: 1.17.7 @@ -663,9 +603,6 @@ importers: usehooks-ts: specifier: 3.1.0 version: 3.1.0(react@18.3.1) - utf-8-validate: - specifier: 6.0.4 - version: 6.0.4 vfile: specifier: 6.0.3 version: 6.0.3 @@ -709,496 +646,39 @@ importers: packages/shared: dependencies: - '@egjs/react-infinitegrid': - specifier: 4.12.0 - version: 4.12.0 - '@egoist/tipc': - specifier: 0.3.2 - version: 0.3.2(electron@32.1.0)(react@18.3.1) '@electron-toolkit/preload': - specifier: ^3.0.1 - version: 3.0.1(electron@32.1.0) - '@electron-toolkit/utils': specifier: ^3.0.0 - version: 3.0.0(electron@32.1.0) - '@fontsource/sn-pro': - specifier: 5.1.0 - version: 5.1.0 - '@hono/auth-js': - specifier: 1.0.10 - version: 1.0.10(@auth/core@0.34.2)(hono@4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e))(react@18.3.1) - '@hookform/resolvers': - specifier: 3.9.0 - version: 3.9.0(react-hook-form@7.53.0(react@18.3.1)) - '@iconify/tools': - specifier: 4.0.6 - version: 4.0.6 - '@microflash/remark-callout-directives': - specifier: 4.3.1 - version: 4.3.1 - '@mozilla/readability': - specifier: ^0.5.0 - version: 0.5.0(patch_hash=fgkvsbckled47trggkhdkimzbm) - '@radix-ui/react-alert-dialog': - specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-avatar': - specifier: 1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-checkbox': - specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-context-menu': - specifier: 2.2.1 - version: 2.2.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-dialog': - specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-dropdown-menu': - specifier: 2.1.1 - version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-hover-card': - specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-label': - specifier: 2.1.0 - version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popover': - specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-radio-group': - specifier: 1.2.0 - version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-scroll-area': - specifier: 1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-select': - specifier: 2.1.1 - version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slider': - specifier: ^1.2.0 - version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': - specifier: 1.1.0 - version: 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-switch': - specifier: 1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-tabs': - specifier: 1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toast': - specifier: 1.2.1 - version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-tooltip': - specifier: 1.1.2 - version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@sentry/electron': - specifier: 5.4.0 - version: 5.4.0 - '@sentry/react': - specifier: 8.30.0 - version: 8.30.0(react@18.3.1) - '@sentry/vite-plugin': - specifier: 2.22.4 - version: 2.22.4(encoding@0.1.13) - '@shikijs/transformers': - specifier: 1.17.7 - version: 1.17.7 - '@t3-oss/env-core': - specifier: 0.11.1 - version: 0.11.1(typescript@5.6.2)(zod@3.23.8) - '@tanstack/query-sync-storage-persister': - specifier: 5.56.2 - version: 5.56.2 - '@tanstack/react-query': - specifier: 5.56.2 - version: 5.56.2(react@18.3.1) - '@tanstack/react-query-devtools': - specifier: 5.56.2 - version: 5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1) - '@tanstack/react-query-persist-client': - specifier: 5.56.2 - version: 5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1) - '@use-gesture/react': - specifier: 10.3.1 - version: 10.3.1(react@18.3.1) - '@yornaath/batshit': - specifier: 0.10.1 - version: 0.10.1 - bufferutil: - specifier: 4.0.8 - version: 4.0.8 - builder-util-runtime: - specifier: 9.2.5 - version: 9.2.5 - class-variance-authority: - specifier: 0.7.0 - version: 0.7.0 - click-to-react-component: - specifier: 1.1.0 - version: 1.1.0(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - clsx: - specifier: 2.1.1 - version: 2.1.1 - cmdk: - specifier: 1.0.0 - version: 1.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - dayjs: - specifier: 1.11.13 - version: 1.11.13 - dexie: - specifier: 4.0.8 - version: 4.0.8 - dnum: - specifier: ^2.13.1 - version: 2.13.1 - dotenv: - specifier: 16.4.5 - version: 16.4.5 - electron-context-menu: - specifier: 4.0.4 - version: 4.0.4(patch_hash=c53at4t5fflixuwjz35hmcqdu4) - electron-log: - specifier: 5.2.0 - version: 5.2.0 - electron-squirrel-startup: - specifier: 1.0.1 - version: 1.0.1 - electron-updater: - specifier: ^6.3.4 - version: 6.3.4 - font-list: - specifier: 1.5.1 - version: 1.5.1 - foxact: - specifier: 0.2.38 - version: 0.2.38(react@18.3.1) - framer-motion: - specifier: 11.5.4 - version: 11.5.4(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - franc-min: - specifier: 6.2.0 - version: 6.2.0 - fuse.js: - specifier: 7.0.0 - version: 7.0.0 - hast-util-to-jsx-runtime: - specifier: 2.3.0 - version: 2.3.0 - hast-util-to-text: - specifier: 4.0.2 - version: 4.0.2 - i18next: - specifier: ^23.15.1 - version: 23.15.1 - i18next-browser-languagedetector: - specifier: 8.0.0 - version: 8.0.0 - idb-keyval: - specifier: 6.2.1 - version: 6.2.1 - immer: - specifier: 10.1.1 - version: 10.1.1(patch_hash=og7mbnoo5vh43tjlw5rbmrdbvu) - jotai: - specifier: 2.9.3 - version: 2.9.3(@types/react@18.3.7)(react@18.3.1) - lethargy: - specifier: 1.0.9 - version: 1.0.9 - linkedom: - specifier: ^0.18.4 - version: 0.18.4 - lodash-es: - specifier: 4.17.21 - version: 4.17.21 - lowdb: - specifier: 7.0.1 - version: 7.0.1 - msedge-tts: - specifier: 1.3.4 - version: 1.3.4(bufferutil@4.0.8)(utf-8-validate@6.0.4) - nanoid: - specifier: 5.0.7 - version: 5.0.7 - ofetch: - specifier: 1.3.4 - version: 1.3.4 - path-to-regexp: - specifier: 8.1.0 - version: 8.1.0 - posthog-js: - specifier: 1.161.5 - version: 1.161.5 - posthog-node: - specifier: 4.2.0 - version: 4.2.0 - re-resizable: - specifier: 6.9.18 - version: 6.9.18(patch_hash=yitcmpfwcomg2fky72uc3lhk2i)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-error-boundary: - specifier: 4.0.13 - version: 4.0.13(react@18.3.1) - react-fast-marquee: - specifier: 1.6.5 - version: 1.6.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-hook-form: - specifier: 7.53.0 - version: 7.53.0(react@18.3.1) - react-hotkeys-hook: - specifier: 4.5.1 - version: 4.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-i18next: - specifier: ^15.0.2 - version: 15.0.2(i18next@23.15.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-intersection-observer: - specifier: 9.13.1 - version: 9.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-resizable-layout: - specifier: npm:@innei/react-resizable-layout@0.7.3-fork.1 - version: '@innei/react-resizable-layout@0.7.3-fork.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)' - react-router-dom: - specifier: 6.26.2 - version: 6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-selecto: - specifier: 1.26.3 - version: 1.26.3 - react-shadow: - specifier: 20.5.0 - version: 20.5.0(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-virtuoso: - specifier: 4.10.4 - version: 4.10.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rehype-infer-description-meta: - specifier: 2.0.0 - version: 2.0.0 - rehype-parse: - specifier: 9.0.0 - version: 9.0.0 - rehype-sanitize: - specifier: 6.0.0 - version: 6.0.0 - rehype-stringify: - specifier: 10.0.0 - version: 10.0.0 - remark-directive: - specifier: 3.0.0 - version: 3.0.0 - remark-gfm: - specifier: 4.0.0 - version: 4.0.0 - remark-gh-alerts: - specifier: 0.0.3 - version: 0.0.3(@types/mdast@4.0.4)(unified@11.0.5) - remark-parse: - specifier: 11.0.0 - version: 11.0.0 - remark-rehype: - specifier: 11.1.0 - version: 11.1.0 - semver: - specifier: 7.6.3 - version: 7.6.3 - shiki: - specifier: 1.17.7 - version: 1.17.7 - sonner: - specifier: ^1.5.0 - version: 1.5.0(patch_hash=6s3tquyt5wnkqaogymn3mkivuq)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - swiper: - specifier: 11.1.14 - version: 11.1.14 - tailwind-merge: - specifier: 2.5.2 - version: 2.5.2 - tldts: - specifier: 6.1.46 - version: 6.1.46 - unified: - specifier: 11.0.5 - version: 11.0.5 - use-context-selector: - specifier: 2.0.0 - version: 2.0.0(react@18.3.1)(scheduler@0.23.2) - usehooks-ts: - specifier: 3.1.0 - version: 3.1.0(react@18.3.1) - utf-8-validate: - specifier: 6.0.4 - version: 6.0.4 - vfile: - specifier: 6.0.3 - version: 6.0.3 - vscode-languagedetection: - specifier: npm:@vscode/vscode-languagedetection@^1.0.22 - version: '@vscode/vscode-languagedetection@1.0.22' - zod: - specifier: 3.23.8 - version: 3.23.8 - zustand: - specifier: 4.5.5 - version: 4.5.5(@types/react@18.3.7)(immer@10.1.1(patch_hash=og7mbnoo5vh43tjlw5rbmrdbvu))(react@18.3.1) - devDependencies: - '@babel/generator': - specifier: 7.25.6 - version: 7.25.6 - '@clack/prompts': - specifier: 0.7.0 - version: 0.7.0 - '@egoist/tailwindcss-icons': - specifier: 1.8.1 - version: 1.8.1(tailwindcss@3.4.11) - '@electron-forge/cli': - specifier: 7.4.0 - version: 7.4.0(encoding@0.1.13) - '@electron-forge/maker-dmg': - specifier: 7.4.0 - version: 7.4.0 - '@electron-forge/maker-squirrel': - specifier: 7.4.0 - version: 7.4.0 - '@electron-forge/maker-zip': - specifier: 7.4.0 - version: 7.4.0 - '@electron-forge/plugin-fuses': - specifier: 7.4.0 - version: 7.4.0(@electron/fuses@1.8.0) - '@electron-forge/publisher-github': - specifier: 7.4.0 - version: 7.4.0(encoding@0.1.13) + version: 3.0.1(electron@32.1.0) '@electron-toolkit/tsconfig': specifier: ^1.0.1 version: 1.0.1(@types/node@22.5.5) '@hono/node-server': - specifier: 1.13.0 + specifier: ^1.13.0 version: 1.13.0(hono@4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e)) - '@iconify-json/logos': - specifier: 1.2.0 - version: 1.2.0 - '@iconify-json/mingcute': - specifier: 1.2.0 - version: 1.2.0 - '@iconify-json/simple-icons': - specifier: ^1.2.3 - version: 1.2.3 - '@pengx17/electron-forge-maker-appimage': - specifier: 1.2.1 - version: 1.2.1(dmg-builder@25.0.5(electron-builder-squirrel-windows@25.0.5))(electron-builder-squirrel-windows@25.0.5(dmg-builder@25.0.5)) - '@tailwindcss/container-queries': - specifier: 0.1.1 - version: 0.1.1(tailwindcss@3.4.11) - '@tailwindcss/typography': - specifier: 0.5.15 - version: 0.5.15(tailwindcss@3.4.11) - '@types/lodash-es': - specifier: 4.17.12 - version: 4.17.12 - '@types/node': - specifier: ^22.5.5 - version: 22.5.5 - '@types/react': - specifier: ^18.3.7 - version: 18.3.7 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 - '@vercel/ncc': - specifier: 0.38.1 - version: 0.38.1 - '@vitejs/plugin-legacy': - specifier: 5.4.2 - version: 5.4.2(terser@5.32.0)(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0)) - '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0)) - cssnano: - specifier: 7.0.6 - version: 7.0.6(postcss@8.4.47) + '@t3-oss/env-core': + specifier: ^0.11.0 + version: 0.11.1(typescript@5.6.2)(zod@3.23.8) drizzle-orm: - specifier: 0.33.0 + specifier: ^0.33.0 version: 0.33.0(@opentelemetry/api@1.9.0)(@types/pg@8.11.8)(@types/react@18.3.7)(react@18.3.1) electron: - specifier: 32.1.0 + specifier: ^32.1.0 version: 32.1.0 - electron-devtools-installer: - specifier: 3.2.0 - version: 3.2.0 - electron-packager-languages: - specifier: 0.5.0 - version: 0.5.0 - electron-vite: - specifier: ^2.3.0 - version: 2.3.0(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0)) - eslint: - specifier: ^9.10.0 - version: 9.10.0(jiti@1.21.6) - eslint-config-hyoban: - specifier: ^3.1.6 - version: 3.1.6(@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(tailwindcss@3.4.11)(typescript@5.6.2) - fake-indexeddb: - specifier: 6.0.0 - version: 6.0.0 hono: - specifier: 4.6.2 + specifier: ^4.6.2 version: 4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e) - lint-staged: - specifier: 15.2.10 - version: 15.2.10 - nbump: - specifier: 2.0.4 - version: 2.0.4(conventional-commits-filter@5.0.0) - postcss: - specifier: 8.4.47 - version: 8.4.47 - postcss-js: - specifier: 4.0.1 - version: 4.0.1(postcss@8.4.47) - prettier: - specifier: 3.3.3 - version: 3.3.3 react: specifier: ^18.3.1 version: 18.3.1 react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) - rimraf: - specifier: 6.0.1 - version: 6.0.1 - shx: - specifier: ^0.3.4 - version: 0.3.4 - simple-git-hooks: - specifier: 2.11.1 - version: 2.11.1 - tailwindcss: - specifier: 3.4.11 - version: 3.4.11 - tailwindcss-animate: - specifier: 1.0.7 - version: 1.0.7(tailwindcss@3.4.11) - tsx: - specifier: 4.19.1 - version: 4.19.1 - typescript: - specifier: ^5.6.2 - version: 5.6.2 - vite: - specifier: ^5.4.6 - version: 5.4.6(@types/node@22.5.5)(terser@5.32.0) - vite-bundle-analyzer: - specifier: 0.10.6 - version: 0.10.6 - vite-plugin-mkcert: - specifier: 1.17.6 - version: 1.17.6(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0)) - vite-tsconfig-paths: - specifier: 5.0.1 - version: 5.0.1(typescript@5.6.2)(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0)) - vitest: - specifier: 2.0.5 - version: 2.0.5(@types/node@22.5.5)(terser@5.32.0) + sonner: + specifier: ^1.5.0 + version: 1.5.0(patch_hash=6s3tquyt5wnkqaogymn3mkivuq)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 packages: @@ -4128,10 +3608,6 @@ packages: peerDependencies: react: '>= 16.8.0' - '@vercel/ncc@0.38.1': - resolution: {integrity: sha512-IBBb+iI2NLu4VQn3Vwldyi2QwaXt5+hTyh58ggAMoCGE6DJmPvwL3KPBWcJl1m9LYPChBLE980Jw+CS4Wokqxw==} - hasBin: true - '@vitejs/plugin-legacy@5.4.2': resolution: {integrity: sha512-hlyyQL+wEIyOWdwsUKX+0g3kBU4AbHmVzHarLvVKiGGGqLIYjttMvvjk6zGY8RD9dab6QuFNhDoxg0YFhQ26xA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -12826,8 +12302,6 @@ snapshots: '@use-gesture/core': 10.3.1 react: 18.3.1 - '@vercel/ncc@0.38.1': {} - '@vitejs/plugin-legacy@5.4.2(terser@5.32.0)(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0))': dependencies: '@babel/core': 7.25.2 @@ -13314,6 +12788,7 @@ snapshots: bufferutil@4.0.8: dependencies: node-gyp-build: 4.8.1 + optional: true builder-util-runtime@9.2.4: dependencies: @@ -16591,7 +16066,8 @@ snapshots: optionalDependencies: encoding: 0.1.13 - node-gyp-build@4.8.1: {} + node-gyp-build@4.8.1: + optional: true node-gyp@9.4.1: dependencies: @@ -18493,6 +17969,7 @@ snapshots: utf-8-validate@6.0.4: dependencies: node-gyp-build: 4.8.1 + optional: true utf8-byte-length@1.0.5: {} From 7ecd34ac1e1bba91e67cbf4c3f863378cc84f748 Mon Sep 17 00:00:00 2001 From: Innei Date: Sat, 21 Sep 2024 18:19:05 +0800 Subject: [PATCH 08/47] chore: update deps Signed-off-by: Innei --- apps/main/package.json | 8 +- apps/renderer/package.json | 22 +- package.json | 26 +- packages/shared/package.json | 8 +- pnpm-lock.yaml | 1800 ++++++++++++++++++---------------- 5 files changed, 986 insertions(+), 878 deletions(-) diff --git a/apps/main/package.json b/apps/main/package.json index bd1c1840f..018ce7f19 100644 --- a/apps/main/package.json +++ b/apps/main/package.json @@ -35,13 +35,13 @@ "electron-updater": "^6.3.4", "font-list": "1.5.1", "i18next": "^23.15.1", - "linkedom": "^0.18.4", + "linkedom": "^0.18.5", "lodash-es": "4.17.21", "lowdb": "7.0.1", "msedge-tts": "1.3.4", "nanoid": "5.0.7", - "ofetch": "1.3.4", - "posthog-js": "1.161.5", + "ofetch": "1.4.0", + "posthog-js": "1.163.0", "posthog-node": "4.2.0", "semver": "7.6.3", "vscode-languagedetection": "npm:@vscode/vscode-languagedetection@^1.0.22" @@ -49,7 +49,7 @@ "devDependencies": { "@types/lodash-es": "4.17.12", "@types/node": "^22.5.5", - "electron": "32.1.0", + "electron": "32.1.2", "electron-devtools-installer": "3.2.0", "hono": "4.6.2", "typescript": "^5.6.2" diff --git a/apps/renderer/package.json b/apps/renderer/package.json index c091c4fa7..ffc0d6ae1 100644 --- a/apps/renderer/package.json +++ b/apps/renderer/package.json @@ -40,7 +40,7 @@ "@radix-ui/react-tooltip": "1.1.2", "@sentry/react": "8.30.0", "@sentry/vite-plugin": "2.22.4", - "@shikijs/transformers": "1.17.7", + "@shikijs/transformers": "1.18.0", "@t3-oss/env-core": "^0.11.1", "@tanstack/query-sync-storage-persister": "5.56.2", "@tanstack/react-query": "5.56.2", @@ -57,7 +57,7 @@ "dnum": "^2.13.1", "electron-log": "5.2.0", "foxact": "0.2.38", - "framer-motion": "11.5.4", + "framer-motion": "11.5.6", "franc-min": "6.2.0", "fuse.js": "7.0.0", "hast-util-to-jsx-runtime": "2.3.0", @@ -66,14 +66,14 @@ "i18next-browser-languagedetector": "8.0.0", "idb-keyval": "6.2.1", "immer": "10.1.1", - "jotai": "2.9.3", + "jotai": "2.10.0", "lethargy": "1.0.9", - "linkedom": "^0.18.4", + "linkedom": "^0.18.5", "lodash-es": "4.17.21", "nanoid": "5.0.7", - "ofetch": "1.3.4", + "ofetch": "1.4.0", "path-to-regexp": "8.1.0", - "posthog-js": "1.161.5", + "posthog-js": "1.163.0", "re-resizable": "6.9.18", "react-error-boundary": "4.0.13", "react-fast-marquee": "1.6.5", @@ -94,12 +94,12 @@ "remark-gfm": "4.0.0", "remark-gh-alerts": "0.0.3", "remark-parse": "11.0.0", - "remark-rehype": "11.1.0", - "shiki": "1.17.7", + "remark-rehype": "11.1.1", + "shiki": "1.18.0", "sonner": "^1.5.0", "swiper": "11.1.14", "tailwind-merge": "2.5.2", - "tldts": "6.1.46", + "tldts": "6.1.47", "unified": "11.0.5", "use-context-selector": "2.0.0", "usehooks-ts": "3.1.0", @@ -109,10 +109,10 @@ }, "devDependencies": { "@babel/generator": "7.25.6", - "@hono/node-server": "1.13.0", + "@hono/node-server": "1.13.1", "@types/lodash-es": "4.17.12", "@types/node": "^22.5.5", - "@types/react": "^18.3.7", + "@types/react": "^18.3.8", "@types/react-dom": "^18.3.0", "fake-indexeddb": "6.0.0", "react": "^18.3.1", diff --git a/package.json b/package.json index b3ce27c34..65fa7a672 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "type": "module", "version": "0.0.1-alpha.13", "private": true, - "packageManager": "pnpm@9.10.0+sha512.73a29afa36a0d092ece5271de5177ecbf8318d454ecd701343131b8ebc0c1a91c487da46ab77c8e596d6acf1461e3594ced4becedf8921b074fbd8653ed7051c", + "packageManager": "pnpm@9.11.0", "description": "Next generation information browser", "author": "Follow Team", "license": "GPL-3.0-only", @@ -40,15 +40,15 @@ "@babel/generator": "7.25.6", "@clack/prompts": "0.7.0", "@egoist/tailwindcss-icons": "1.8.1", - "@electron-forge/cli": "7.4.0", - "@electron-forge/maker-dmg": "7.4.0", - "@electron-forge/maker-squirrel": "7.4.0", - "@electron-forge/maker-zip": "7.4.0", - "@electron-forge/plugin-fuses": "7.4.0", - "@electron-forge/publisher-github": "7.4.0", + "@electron-forge/cli": "7.5.0", + "@electron-forge/maker-dmg": "7.5.0", + "@electron-forge/maker-squirrel": "7.5.0", + "@electron-forge/maker-zip": "7.5.0", + "@electron-forge/plugin-fuses": "7.5.0", + "@electron-forge/publisher-github": "7.5.0", "@electron-toolkit/tsconfig": "^1.0.1", "@fontsource/sn-pro": "5.1.0", - "@hono/node-server": "1.13.0", + "@hono/node-server": "1.13.1", "@hookform/resolvers": "3.9.0", "@iconify-json/logos": "1.2.0", "@iconify-json/mingcute": "1.2.0", @@ -63,7 +63,7 @@ "@tailwindcss/typography": "0.5.15", "@types/lodash-es": "4.17.12", "@types/node": "^22.5.5", - "@types/react": "^18.3.7", + "@types/react": "^18.3.8", "@types/react-dom": "^18.3.0", "@vitejs/plugin-legacy": "5.4.2", "@vitejs/plugin-react": "^4.3.1", @@ -71,11 +71,11 @@ "dnum": "^2.13.1", "dotenv": "16.4.5", "drizzle-orm": "0.33.0", - "electron": "32.1.0", + "electron": "32.1.2", "electron-devtools-installer": "3.2.0", "electron-packager-languages": "0.5.0", "electron-vite": "^2.3.0", - "eslint": "^9.10.0", + "eslint": "^9.11.0", "eslint-config-hyoban": "^3.1.6", "fake-indexeddb": "6.0.0", "hono": "4.6.2", @@ -89,12 +89,12 @@ "rimraf": "6.0.1", "shx": "^0.3.4", "simple-git-hooks": "2.11.1", - "tailwindcss": "3.4.11", + "tailwindcss": "3.4.12", "tailwindcss-animate": "1.0.7", "tsup": "8.3.0", "tsx": "4.19.1", "typescript": "^5.6.2", - "vite": "^5.4.6", + "vite": "^5.4.7", "vite-bundle-analyzer": "0.10.6", "vite-plugin-mkcert": "1.17.6", "vite-tsconfig-paths": "5.0.1", diff --git a/packages/shared/package.json b/packages/shared/package.json index db11c1aa0..42f490379 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -25,12 +25,12 @@ }, "scripts": {}, "dependencies": { - "@electron-toolkit/preload": "^3.0.0", + "@electron-toolkit/preload": "^3.0.1", "@electron-toolkit/tsconfig": "^1.0.1", - "@hono/node-server": "^1.13.0", - "@t3-oss/env-core": "^0.11.0", + "@hono/node-server": "^1.13.1", + "@t3-oss/env-core": "^0.11.1", "drizzle-orm": "^0.33.0", - "electron": "^32.1.0", + "electron": "^32.1.2", "hono": "^4.6.2", "react": "^18.3.1", "react-dom": "^18.3.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08f784994..bc616a63a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,25 +40,25 @@ importers: version: 0.7.0 '@egoist/tailwindcss-icons': specifier: 1.8.1 - version: 1.8.1(tailwindcss@3.4.11) + version: 1.8.1(tailwindcss@3.4.12) '@electron-forge/cli': - specifier: 7.4.0 - version: 7.4.0(encoding@0.1.13) + specifier: 7.5.0 + version: 7.5.0(encoding@0.1.13) '@electron-forge/maker-dmg': - specifier: 7.4.0 - version: 7.4.0 + specifier: 7.5.0 + version: 7.5.0 '@electron-forge/maker-squirrel': - specifier: 7.4.0 - version: 7.4.0 + specifier: 7.5.0 + version: 7.5.0 '@electron-forge/maker-zip': - specifier: 7.4.0 - version: 7.4.0 + specifier: 7.5.0 + version: 7.5.0 '@electron-forge/plugin-fuses': - specifier: 7.4.0 - version: 7.4.0(@electron/fuses@1.8.0) + specifier: 7.5.0 + version: 7.5.0(@electron/fuses@1.8.0) '@electron-forge/publisher-github': - specifier: 7.4.0 - version: 7.4.0(encoding@0.1.13) + specifier: 7.5.0 + version: 7.5.0(encoding@0.1.13) '@electron-toolkit/tsconfig': specifier: ^1.0.1 version: 1.0.1(@types/node@22.5.5) @@ -66,8 +66,8 @@ importers: specifier: 5.1.0 version: 5.1.0 '@hono/node-server': - specifier: 1.13.0 - version: 1.13.0(hono@4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e)) + specifier: 1.13.1 + version: 1.13.1(hono@4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e)) '@hookform/resolvers': specifier: 3.9.0 version: 3.9.0(react-hook-form@7.53.0(react@18.3.1)) @@ -100,10 +100,10 @@ importers: version: 0.11.1(typescript@5.6.2)(zod@3.23.8) '@tailwindcss/container-queries': specifier: 0.1.1 - version: 0.1.1(tailwindcss@3.4.11) + version: 0.1.1(tailwindcss@3.4.12) '@tailwindcss/typography': specifier: 0.5.15 - version: 0.5.15(tailwindcss@3.4.11) + version: 0.5.15(tailwindcss@3.4.12) '@types/lodash-es': specifier: 4.17.12 version: 4.17.12 @@ -111,17 +111,17 @@ importers: specifier: ^22.5.5 version: 22.5.5 '@types/react': - specifier: ^18.3.7 - version: 18.3.7 + specifier: ^18.3.8 + version: 18.3.8 '@types/react-dom': specifier: ^18.3.0 version: 18.3.0 '@vitejs/plugin-legacy': specifier: 5.4.2 - version: 5.4.2(terser@5.32.0)(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0)) + version: 5.4.2(terser@5.32.0)(vite@5.4.7(@types/node@22.5.5)(terser@5.32.0)) '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0)) + version: 4.3.1(vite@5.4.7(@types/node@22.5.5)(terser@5.32.0)) cssnano: specifier: 7.0.6 version: 7.0.6(postcss@8.4.47) @@ -133,10 +133,10 @@ importers: version: 16.4.5 drizzle-orm: specifier: 0.33.0 - version: 0.33.0(@opentelemetry/api@1.9.0)(@types/pg@8.11.8)(@types/react@18.3.7)(react@18.3.1) + version: 0.33.0(@opentelemetry/api@1.9.0)(@types/pg@8.11.8)(@types/react@18.3.8)(react@18.3.1) electron: - specifier: 32.1.0 - version: 32.1.0 + specifier: 32.1.2 + version: 32.1.2 electron-devtools-installer: specifier: 3.2.0 version: 3.2.0 @@ -145,13 +145,13 @@ importers: version: 0.5.0 electron-vite: specifier: ^2.3.0 - version: 2.3.0(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0)) + version: 2.3.0(vite@5.4.7(@types/node@22.5.5)(terser@5.32.0)) eslint: - specifier: ^9.10.0 - version: 9.10.0(jiti@1.21.6) + specifier: ^9.11.0 + version: 9.11.0(jiti@1.21.6) eslint-config-hyoban: specifier: ^3.1.6 - version: 3.1.6(@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(tailwindcss@3.4.11)(typescript@5.6.2) + version: 3.1.6(@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.0(jiti@1.21.6))(tailwindcss@3.4.12)(typescript@5.6.2) fake-indexeddb: specifier: 6.0.0 version: 6.0.0 @@ -189,11 +189,11 @@ importers: specifier: 2.11.1 version: 2.11.1 tailwindcss: - specifier: 3.4.11 - version: 3.4.11 + specifier: 3.4.12 + version: 3.4.12 tailwindcss-animate: specifier: 1.0.7 - version: 1.0.7(tailwindcss@3.4.11) + version: 1.0.7(tailwindcss@3.4.12) tsup: specifier: 8.3.0 version: 8.3.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1)(typescript@5.6.2)(yaml@2.5.1) @@ -204,17 +204,17 @@ importers: specifier: ^5.6.2 version: 5.6.2 vite: - specifier: ^5.4.6 - version: 5.4.6(@types/node@22.5.5)(terser@5.32.0) + specifier: ^5.4.7 + version: 5.4.7(@types/node@22.5.5)(terser@5.32.0) vite-bundle-analyzer: specifier: 0.10.6 version: 0.10.6 vite-plugin-mkcert: specifier: 1.17.6 - version: 1.17.6(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0)) + version: 1.17.6(vite@5.4.7(@types/node@22.5.5)(terser@5.32.0)) vite-tsconfig-paths: specifier: 5.0.1 - version: 5.0.1(typescript@5.6.2)(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0)) + version: 5.0.1(typescript@5.6.2)(vite@5.4.7(@types/node@22.5.5)(terser@5.32.0)) vitest: specifier: '2.0' version: 2.0.5(@types/node@22.5.5)(terser@5.32.0) @@ -223,13 +223,13 @@ importers: dependencies: '@egoist/tipc': specifier: 0.3.2 - version: 0.3.2(electron@32.1.0)(react@18.3.1) + version: 0.3.2(electron@32.1.2)(react@18.3.1) '@electron-toolkit/preload': specifier: ^3.0.1 - version: 3.0.1(electron@32.1.0) + version: 3.0.1(electron@32.1.2) '@electron-toolkit/utils': specifier: ^3.0.0 - version: 3.0.0(electron@32.1.0) + version: 3.0.0(electron@32.1.2) '@follow/shared': specifier: workspace:* version: link:../../packages/shared @@ -267,8 +267,8 @@ importers: specifier: ^23.15.1 version: 23.15.1 linkedom: - specifier: ^0.18.4 - version: 0.18.4 + specifier: ^0.18.5 + version: 0.18.5 lodash-es: specifier: 4.17.21 version: 4.17.21 @@ -282,11 +282,11 @@ importers: specifier: 5.0.7 version: 5.0.7 ofetch: - specifier: 1.3.4 - version: 1.3.4 + specifier: 1.4.0 + version: 1.4.0 posthog-js: - specifier: 1.161.5 - version: 1.161.5 + specifier: 1.163.0 + version: 1.163.0 posthog-node: specifier: 4.2.0 version: 4.2.0 @@ -304,8 +304,8 @@ importers: specifier: ^22.5.5 version: 22.5.5 electron: - specifier: 32.1.0 - version: 32.1.0 + specifier: 32.1.2 + version: 32.1.2 electron-devtools-installer: specifier: 3.2.0 version: 3.2.0 @@ -323,10 +323,10 @@ importers: version: 4.12.0 '@egoist/tipc': specifier: 0.3.2 - version: 0.3.2(electron@32.1.0)(react@18.3.1) + version: 0.3.2(electron@32.1.2)(react@18.3.1) '@electron-toolkit/preload': specifier: ^3.0.1 - version: 3.0.1(electron@32.1.0) + version: 3.0.1(electron@32.1.2) '@follow/electron-main': specifier: workspace:* version: link:../main @@ -356,58 +356,58 @@ importers: version: 0.5.0(patch_hash=fgkvsbckled47trggkhdkimzbm) '@radix-ui/react-alert-dialog': specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-avatar': specifier: 1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-checkbox': specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-context-menu': specifier: 2.2.1 - version: 2.2.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.2.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dialog': specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dropdown-menu': specifier: 2.1.1 - version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-hover-card': specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-label': specifier: 2.1.0 - version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-popover': specifier: 1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-radio-group': specifier: 1.2.0 - version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-scroll-area': specifier: 1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-select': specifier: 2.1.1 - version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slider': specifier: ^1.2.0 - version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': specifier: 1.1.0 - version: 1.1.0(@types/react@18.3.7)(react@18.3.1) + version: 1.1.0(@types/react@18.3.8)(react@18.3.1) '@radix-ui/react-switch': specifier: 1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-tabs': specifier: 1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-toast': specifier: 1.2.1 - version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-tooltip': specifier: 1.1.2 - version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@sentry/react': specifier: 8.30.0 version: 8.30.0(react@18.3.1) @@ -415,8 +415,8 @@ importers: specifier: 2.22.4 version: 2.22.4(encoding@0.1.13) '@shikijs/transformers': - specifier: 1.17.7 - version: 1.17.7 + specifier: 1.18.0 + version: 1.18.0 '@t3-oss/env-core': specifier: ^0.11.1 version: 0.11.1(typescript@5.6.2)(zod@3.23.8) @@ -443,13 +443,13 @@ importers: version: 0.7.0 click-to-react-component: specifier: 1.1.0 - version: 1.1.0(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.0(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: specifier: 2.1.1 version: 2.1.1 cmdk: specifier: 1.0.0 - version: 1.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) dayjs: specifier: 1.11.13 version: 1.11.13 @@ -466,8 +466,8 @@ importers: specifier: 0.2.38 version: 0.2.38(react@18.3.1) framer-motion: - specifier: 11.5.4 - version: 11.5.4(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 11.5.6 + version: 11.5.6(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) franc-min: specifier: 6.2.0 version: 6.2.0 @@ -493,14 +493,14 @@ importers: specifier: 10.1.1 version: 10.1.1(patch_hash=og7mbnoo5vh43tjlw5rbmrdbvu) jotai: - specifier: 2.9.3 - version: 2.9.3(@types/react@18.3.7)(react@18.3.1) + specifier: 2.10.0 + version: 2.10.0(@types/react@18.3.8)(react@18.3.1) lethargy: specifier: 1.0.9 version: 1.0.9 linkedom: - specifier: ^0.18.4 - version: 0.18.4 + specifier: ^0.18.5 + version: 0.18.5 lodash-es: specifier: 4.17.21 version: 4.17.21 @@ -508,14 +508,14 @@ importers: specifier: 5.0.7 version: 5.0.7 ofetch: - specifier: 1.3.4 - version: 1.3.4 + specifier: 1.4.0 + version: 1.4.0 path-to-regexp: specifier: 8.1.0 version: 8.1.0 posthog-js: - specifier: 1.161.5 - version: 1.161.5 + specifier: 1.163.0 + version: 1.163.0 re-resizable: specifier: 6.9.18 version: 6.9.18(patch_hash=yitcmpfwcomg2fky72uc3lhk2i)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -577,11 +577,11 @@ importers: specifier: 11.0.0 version: 11.0.0 remark-rehype: - specifier: 11.1.0 - version: 11.1.0 + specifier: 11.1.1 + version: 11.1.1 shiki: - specifier: 1.17.7 - version: 1.17.7 + specifier: 1.18.0 + version: 1.18.0 sonner: specifier: ^1.5.0 version: 1.5.0(patch_hash=6s3tquyt5wnkqaogymn3mkivuq)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -592,8 +592,8 @@ importers: specifier: 2.5.2 version: 2.5.2 tldts: - specifier: 6.1.46 - version: 6.1.46 + specifier: 6.1.47 + version: 6.1.47 unified: specifier: 11.0.5 version: 11.0.5 @@ -611,14 +611,14 @@ importers: version: 3.23.8 zustand: specifier: 4.5.5 - version: 4.5.5(@types/react@18.3.7)(immer@10.1.1(patch_hash=og7mbnoo5vh43tjlw5rbmrdbvu))(react@18.3.1) + version: 4.5.5(@types/react@18.3.8)(immer@10.1.1(patch_hash=og7mbnoo5vh43tjlw5rbmrdbvu))(react@18.3.1) devDependencies: '@babel/generator': specifier: 7.25.6 version: 7.25.6 '@hono/node-server': - specifier: 1.13.0 - version: 1.13.0(hono@4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e)) + specifier: 1.13.1 + version: 1.13.1(hono@4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e)) '@types/lodash-es': specifier: 4.17.12 version: 4.17.12 @@ -626,8 +626,8 @@ importers: specifier: ^22.5.5 version: 22.5.5 '@types/react': - specifier: ^18.3.7 - version: 18.3.7 + specifier: ^18.3.8 + version: 18.3.8 '@types/react-dom': specifier: ^18.3.0 version: 18.3.0 @@ -647,23 +647,23 @@ importers: packages/shared: dependencies: '@electron-toolkit/preload': - specifier: ^3.0.0 - version: 3.0.1(electron@32.1.0) + specifier: ^3.0.1 + version: 3.0.1(electron@32.1.2) '@electron-toolkit/tsconfig': specifier: ^1.0.1 version: 1.0.1(@types/node@22.5.5) '@hono/node-server': - specifier: ^1.13.0 - version: 1.13.0(hono@4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e)) + specifier: ^1.13.1 + version: 1.13.1(hono@4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e)) '@t3-oss/env-core': - specifier: ^0.11.0 + specifier: ^0.11.1 version: 0.11.1(typescript@5.6.2)(zod@3.23.8) drizzle-orm: specifier: ^0.33.0 - version: 0.33.0(@opentelemetry/api@1.9.0)(@types/pg@8.11.8)(@types/react@18.3.7)(react@18.3.1) + version: 0.33.0(@opentelemetry/api@1.9.0)(@types/pg@8.11.8)(@types/react@18.3.8)(react@18.3.1) electron: - specifier: ^32.1.0 - version: 32.1.0 + specifier: ^32.1.2 + version: 32.1.2 hono: specifier: ^4.6.2 version: 4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e) @@ -1374,81 +1374,93 @@ packages: peerDependencies: electron: '>=26.0.0' - '@electron-forge/cli@7.4.0': - resolution: {integrity: sha512-a+zZv3ja/IxkJzNyx4sOHSZv6DPV85S0PEVF6pcRjUpbDL5r+DxjRFsNc0Nq4UIWyFm1nw7RWoPdd9uDst4Tvg==} + '@electron-forge/cli@7.5.0': + resolution: {integrity: sha512-dlxr4ac5ONWs1Wmbgh18rclxcp9Fe5SzCF9ookp08Z1w4YP9FbQd1SHs0oLKWLF6qH9qdX8H2EWB9Nt6tOzC5g==} engines: {node: '>= 16.4.0'} hasBin: true - '@electron-forge/core-utils@7.4.0': - resolution: {integrity: sha512-9RLG0F9SX466TpkaTcW+V15KmnGuTpmr7NKMRlngtHXmnkBUJz4Mxp1x33WZLgL90dJrxrRgHSfVBtA4lstDPw==} + '@electron-forge/core-utils@7.5.0': + resolution: {integrity: sha512-PtyQT6qeOEJsi4ltoB7Jb6YUUCwK3gDt5gVyAF2aJ8eZi9rJ0hasHc5vjcmBaz9FwDMjYZrBD8oRBhNgbhEakQ==} engines: {node: '>= 16.4.0'} - '@electron-forge/core@7.4.0': - resolution: {integrity: sha512-pYHKpB2CKeQgWsb+gox+FPkEvP+6Q2zGj2eZtgZRtKppoWIXrHIpOtcm6FllJ/gZ5u4AsQzVIYReAHGaBa0osw==} + '@electron-forge/core@7.5.0': + resolution: {integrity: sha512-Hg/fXabRZtMbyrtnpzpb3i49qNai+juCg+6bgyjYfWgJGr5VGH947lWd7skujH5qJ+Y7FgvANDGnenZuQwxZNw==} engines: {node: '>= 16.4.0'} '@electron-forge/maker-base@7.4.0': resolution: {integrity: sha512-LwWS4VPdwjISl1KpLhmM1Qr1M3sRTTQ/RsX+GlFd7cQ1W/FsgxMjaTG4Od1d+a5CGVTh3s6X2g99TSUfxjOveg==} engines: {node: '>= 16.4.0'} - '@electron-forge/maker-dmg@7.4.0': - resolution: {integrity: sha512-xRCMNtnpvQNwrDYvwbVFegnErnIMpHGZANrjwushlH9+Fsu60DFvf5s3AVkgsYdQTqlY7wYRG1mziYZmRlPAIw==} + '@electron-forge/maker-base@7.5.0': + resolution: {integrity: sha512-+jluKW2UPxaI1+qQQ8fqaUVVbZohRjOSF0Iti7STRFbgJKJitzPB24Cjji9qJCKIx5klMeEiwp0YPAE/d9Xt8g==} engines: {node: '>= 16.4.0'} - '@electron-forge/maker-squirrel@7.4.0': - resolution: {integrity: sha512-mCQyufnSNfjffiKho59ZqVg4W601zGOl6h01OyfDwjOU/G4iQtpnnDEOXGe26q7OVT5ORb1WDnfyGgBeJ6Ge7g==} + '@electron-forge/maker-dmg@7.5.0': + resolution: {integrity: sha512-OcySukBT6FQJRbb0CKXnre4e0JinJfDGteCOLypB8UsN5Wg/4lIDB0hMhBmWGPJkZXKUDGkB1lhkdcLKbzT50Q==} engines: {node: '>= 16.4.0'} - '@electron-forge/maker-zip@7.4.0': - resolution: {integrity: sha512-UGbMdpuK/P29x1FFRWNOs3bNz+7QNFWVWyTM5hcWqib66cNuUmoaPifQyuwW2POIrIohrxlzLK87/i9Zc8g4dA==} + '@electron-forge/maker-squirrel@7.5.0': + resolution: {integrity: sha512-fz3vbp1BnbQWeZVVM3lKOGhrCVKLjAXKDTntBL2+8Rz02a63eozGjOtC5KZYXax6nM4TF6LvwjagY/qTs5jFag==} engines: {node: '>= 16.4.0'} - '@electron-forge/plugin-base@7.4.0': - resolution: {integrity: sha512-LcTNtEc2YaWvhhqWVIfdJ+J0/krSgc2dqYAHhOH2aLUSm9End3dKO/PZ1Y6DPsiPiJKHnSLBJ/XBN/16NY4Sjw==} + '@electron-forge/maker-zip@7.5.0': + resolution: {integrity: sha512-gIO3bEbubOJqWV6kd0b9nBwTrFfFQv/K8PAqg6e0uSZiy7QuSCFZVAZse02gO3AzxVDSVjjTQ4nmXBXC4Glh1A==} engines: {node: '>= 16.4.0'} - '@electron-forge/plugin-fuses@7.4.0': - resolution: {integrity: sha512-LKcyIaO0sUkzZdOB1PySjG1R9KAl5Vi453ZQcambBI7RpZtPKozluNd0zlXey1cf7ycTwhzvmrI6ss3LHQyjvw==} + '@electron-forge/plugin-base@7.5.0': + resolution: {integrity: sha512-44AbXSb5lDY8uHIo0mJ91atOSWgxv3iuECk07/gDBiuMPX62dwHnLteEjQF4GBXJZTpnV7SxhD+d2AUBQmoojw==} + engines: {node: '>= 16.4.0'} + + '@electron-forge/plugin-fuses@7.5.0': + resolution: {integrity: sha512-nF5C4TN/rzN95F5HwAkyYTgy44Mu3EAys8O5zShzg7rye8d5BTnx2peAGtROZcChSaHRql09EeoOswNtuJNMcw==} engines: {node: '>= 16.4.0'} peerDependencies: '@electron/fuses': '>=1.0.0' - '@electron-forge/publisher-base@7.4.0': - resolution: {integrity: sha512-PiJk4RfaC55SnVnteLW2ZIQNM9DpGOi6YoUn5t8i9UcVp2rFIdya7bJY/b9u1hwubm4d5+TdypMVEuJjM44CJQ==} + '@electron-forge/publisher-base@7.5.0': + resolution: {integrity: sha512-PcF3jWA+oXRwNVWjKW6GxHJywJ62QXpYF/8SMs7kgKzBDzLqrbUnWuaXoCP5kCP+AxM495ZU5L2dyJek1eM+VA==} engines: {node: '>= 16.4.0'} - '@electron-forge/publisher-github@7.4.0': - resolution: {integrity: sha512-hrxKNssJyU8Yuz0qv384y5RKojMG0nWeG7/kidjp8PX/RnqjGRU/JJ0Worl28g8LGiLt5R5JIfNLngLaFMn8tg==} + '@electron-forge/publisher-github@7.5.0': + resolution: {integrity: sha512-876lMpsNzVcfJ0sdq/aP93dal7mMcnEa78AQoQb/vmewvwR7TtNjYyv/+Wtyu/M/BVyZ4sZB8Dd/C2xOMFSyrQ==} engines: {node: '>= 16.4.0'} '@electron-forge/shared-types@7.4.0': resolution: {integrity: sha512-5Ehy6enUjBaU08odf9u9TOhmOVXlqobzMvKUixtkdAWgV1XZAUJmn+p21xhj0IkO92MQiXMGv66w9pDNjRT8uQ==} engines: {node: '>= 16.4.0'} - '@electron-forge/template-base@7.4.0': - resolution: {integrity: sha512-3YWdRSGzQfQPQkQxStn2wkJ/SuNGGKo9slwFJGvqMV+Pbx3/M/hYi9sMXOuaqVZgeaBp8Ap27yFPxaIIOC3vcA==} + '@electron-forge/shared-types@7.5.0': + resolution: {integrity: sha512-VXuLVGYa3ZulBlmjA40ZEpk+iPH5ebN0v7t27wDt3rm23bph2aQrL7uSTLXhobenXYBVKggXnQt6rJ9A7FCDNQ==} engines: {node: '>= 16.4.0'} - '@electron-forge/template-vite-typescript@7.4.0': - resolution: {integrity: sha512-wdByG807VWcUd81E6572b/G/Ki8gb+GrCIWxO7Cl3qBa+yNaU1sHhBwB1RyTbQy1r8ubSBtsWrRD1J/yzHKWoQ==} + '@electron-forge/template-base@7.5.0': + resolution: {integrity: sha512-wEz4FI90jje4FdwJ4FzqUejodfioNcJjlgG2Ci1FiRn4Qv0jX4MP8SEgKmnD44181/44HgMa429zxRv/fDYzOw==} engines: {node: '>= 16.4.0'} - '@electron-forge/template-vite@7.4.0': - resolution: {integrity: sha512-YPVyCGiBKmZPCxK/Bd2louV3PBcxI2nT2+tRKP+mlEHOWrxbZIfmZSR2lIAFvK/ALKlwUKROdmlwyi7ZcdT7JQ==} + '@electron-forge/template-vite-typescript@7.5.0': + resolution: {integrity: sha512-bD9QQ6uEsDHp6/V7odCkoK53egy0A4LEh++F1VYFt7SWJ5+InkcSLww7ELz2hrNmpmXb+euRrNagL1gorPToSA==} engines: {node: '>= 16.4.0'} - '@electron-forge/template-webpack-typescript@7.4.0': - resolution: {integrity: sha512-O5gwjNSGFNRdJWyiCtevcOBDPAMhgOPvLORh9qR1GcjyTutWwHWmZzycqH+MmkhpQPgrAYDEeipXcOQhSbzNZA==} + '@electron-forge/template-vite@7.5.0': + resolution: {integrity: sha512-AkMO5nW5jC8ijCYeoAK7hu+K5o7NMoHNsn71eepJ/kjOnSxXjJeBVGmP4DgzF2zc6AgeRz2TCKx6P8GUtFG5cw==} engines: {node: '>= 16.4.0'} - '@electron-forge/template-webpack@7.4.0': - resolution: {integrity: sha512-W558AEGwQrwEtKIbIJPPs0LIsaC/1Vncj5NgqKehEMJjBb0KQq4hwBu/6dauQrfun4jRCOp7LV+OVrf5XPJ7QA==} + '@electron-forge/template-webpack-typescript@7.5.0': + resolution: {integrity: sha512-Q11xAzFxWtES0bwykMd8MAzrVRtmSruXQxQIvqM7Qf3VmU8joq8v5njmn13LeCDkcRGjALiJqO8EsgsW3bttNw==} + engines: {node: '>= 16.4.0'} + + '@electron-forge/template-webpack@7.5.0': + resolution: {integrity: sha512-Il9dO4VMhxibsYTsKRkccWUN3WFg55PEQFL93oarFcEtAT3sjMx/1bZDj/2AIHqbwIf7IrCylPKiPP2uUNOM9Q==} engines: {node: '>= 16.4.0'} '@electron-forge/tracer@7.4.0': resolution: {integrity: sha512-F4jbnDn4yIZjmky1FZ6rgBKTM05AZQQfHkyJW2hdS4pDKJjdKAqWytoZKDi1/S6Cr6tN+DD0TFGD3V0i6HPHYQ==} engines: {node: '>= 14.17.5'} + '@electron-forge/tracer@7.5.0': + resolution: {integrity: sha512-1dE0wKCmv/K3BXCH70o2jp/y2kXgZQm73gIvzyadySXYwu2L4BWxhAO+Q+JsnbUk+nclHEup5ph4D0JoPIWLcQ==} + engines: {node: '>= 14.17.5'} + '@electron-toolkit/preload@3.0.1': resolution: {integrity: sha512-EzoQmpK8jqqU8YnM5jRe0GJjGVJPke2KtANqz8QtN2JPT96ViOvProBdK5C6riCm0j1T8jjAGVQCZLQy9OVoIA==} peerDependencies: @@ -1469,6 +1481,11 @@ packages: engines: {node: '>=10.12.0'} hasBin: true + '@electron/asar@3.2.13': + resolution: {integrity: sha512-pY5z2qQSwbFzJsBdgfJIzXf5ElHTVMutC2dxh0FD60njknMu3n1NnTABOcQwbb5/v5soqE79m9UjaJryBf3epg==} + engines: {node: '>=10.12.0'} + hasBin: true + '@electron/fuses@1.8.0': resolution: {integrity: sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==} hasBin: true @@ -1508,6 +1525,11 @@ packages: engines: {node: '>= 16.13.0'} hasBin: true + '@electron/packager@18.3.5': + resolution: {integrity: sha512-ClgTxXTt3MesWAcjIxIkgxELjTcllw1FRoVsihP7uT48kpDMqI71p4XvnMWbq8PvU57TcrKICAaLkxRhbc+/wQ==} + engines: {node: '>= 16.13.0'} + hasBin: true + '@electron/rebuild@3.6.0': resolution: {integrity: sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw==} engines: {node: '>=12.13.0'} @@ -1875,12 +1897,16 @@ packages: resolution: {integrity: sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.11.0': + resolution: {integrity: sha512-LPkkenkDqyzTFauZLLAPhIb48fj6drrfMvRGSL9tS3AcZBSVTllemLSNyCvHNNL2t797S/6DJNSIwRwXgMO/eQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.1.0': - resolution: {integrity: sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==} + '@eslint/plugin-kit@0.2.0': + resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@floating-ui/core@0.6.2': @@ -1950,8 +1976,8 @@ packages: hono: '>=3.*' react: '>=18' - '@hono/node-server@1.13.0': - resolution: {integrity: sha512-kz323qIQkNQElEGroo/E9MKPDuIR5pkuk/XEWd50K+cSEKdmdiYx0PKWUdaNY2ecJYngtF+njDMsMKplL6zfEg==} + '@hono/node-server@1.13.1': + resolution: {integrity: sha512-TSxE6cT5RHnawbjnveexVN7H2Dpn1YaLxQrCOLCUwD+hFbqbFsnJBgdWcYtASqtWVjA+Qgi8uqFug39GsHjo5A==} engines: {node: '>=18.14.1'} peerDependencies: hono: ^4 @@ -3275,20 +3301,20 @@ packages: resolution: {integrity: sha512-C51PUlTv0BXN3+e9SjPHptNX3b9E0clrsaR5c//l/sFkQjuteDHKChA1gNzZSvfoa3gm9NzZAgpk3hVF2O3nBA==} engines: {node: '>= 14'} - '@shikijs/core@1.17.7': - resolution: {integrity: sha512-ZnIDxFu/yvje3Q8owSHaEHd+bu/jdWhHAaJ17ggjXofHx5rc4bhpCSW+OjC6smUBi5s5dd023jWtZ1gzMu/yrw==} + '@shikijs/core@1.18.0': + resolution: {integrity: sha512-VK4BNVCd2leY62Nm2JjyxtRLkyrZT/tv104O81eyaCjHq4Adceq2uJVFJJAIof6lT1mBwZrEo2qT/T+grv3MQQ==} - '@shikijs/engine-javascript@1.17.7': - resolution: {integrity: sha512-wwSf7lKPsm+hiYQdX+1WfOXujtnUG6fnN4rCmExxa4vo+OTmvZ9B1eKauilvol/LHUPrQgW12G3gzem7pY5ckw==} + '@shikijs/engine-javascript@1.18.0': + resolution: {integrity: sha512-qoP/aO/ATNwYAUw1YMdaip/YVEstMZEgrwhePm83Ll9OeQPuxDZd48szZR8oSQNQBT8m8UlWxZv8EA3lFuyI5A==} - '@shikijs/engine-oniguruma@1.17.7': - resolution: {integrity: sha512-pvSYGnVeEIconU28NEzBXqSQC/GILbuNbAHwMoSfdTBrobKAsV1vq2K4cAgiaW1TJceLV9QMGGh18hi7cCzbVQ==} + '@shikijs/engine-oniguruma@1.18.0': + resolution: {integrity: sha512-B9u0ZKI/cud+TcmF8Chyh+R4V5qQVvyDOqXC2l2a4x73PBSBc6sZ0JRAX3eqyJswqir6ktwApUUGBYePdKnMJg==} - '@shikijs/transformers@1.17.7': - resolution: {integrity: sha512-Nu7DaUT/qHDqbEsWBBqX6MyPMFbR4hUZcK11TA+zU/nPu9eDFE8v0p+n+eT4A3+3mxX6czMSF81W4QNsQ/NSpQ==} + '@shikijs/transformers@1.18.0': + resolution: {integrity: sha512-EdX/UIVaaS8qp9NWRyHIXp2dmuLpdVvx+UVpbIn9eafFlLemAuljPb2+K40ie6jrlg0uUIqkg25CM/8I34yBNw==} - '@shikijs/types@1.17.7': - resolution: {integrity: sha512-+qA4UyhWLH2q4EFd+0z4K7GpERDU+c+CN2XYD3sC+zjvAr5iuwD1nToXZMt1YODshjkEGEDV86G7j66bKjqDdg==} + '@shikijs/types@1.18.0': + resolution: {integrity: sha512-O9N36UEaGGrxv1yUrN2nye7gDLG5Uq0/c1LyfmxsvzNPqlHzWo9DI0A4+fhW2y3bGKuQu/fwS7EPdKJJCowcVA==} '@shikijs/vscode-textmate@9.2.2': resolution: {integrity: sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==} @@ -3375,6 +3401,9 @@ packages: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} + '@types/appdmg@0.5.5': + resolution: {integrity: sha512-G+n6DgZTZFOteITE30LnWj+HRVIGr7wMlAiLWOO02uJFWVEitaPU9JVXm9wJokkgshBawb2O1OykdcsmkkZfgg==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3471,8 +3500,8 @@ packages: '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - '@types/react@18.3.7': - resolution: {integrity: sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==} + '@types/react@18.3.8': + resolution: {integrity: sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q==} '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -4747,9 +4776,9 @@ packages: resolution: {integrity: sha512-USiB9816d2JzKv0LiSbreRfTg5lDk3lWh0vlx/gugCO92ZIJkHVH0UM18EHvKeadErP6Xn4yiTphWzYfbA2Ong==} engines: {node: '>=18'} - electron-installer-dmg@4.0.0: - resolution: {integrity: sha512-g3W6XnyUa7QGrAF7ViewHdt6bXV2KYU1Pm1CY3pZpp+H6mOjCHHAhf/iZAxtaX1ERCb+SQHz7xSsAHuNH9I8ZQ==} - engines: {node: '>= 12.13.0'} + electron-installer-dmg@5.0.1: + resolution: {integrity: sha512-qOa1aAQdX57C+vzhDk3549dd/PRlNL4F8y736MTD1a43qptD+PvHY97Bo9gSf+OZ8iUWE7BrYSpk/FgLUe40EA==} + engines: {node: '>= 16'} hasBin: true electron-is-dev@3.0.1: @@ -4794,8 +4823,8 @@ packages: resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} engines: {node: '>=8.0.0'} - electron@32.1.0: - resolution: {integrity: sha512-4etE3K6vPUkHihf7nvawngbB5+jLuUJgZh31f9ki1Gfveo0qwNDkLv/doabw+4zFFWKUXI+uFUpyOpL5+RwS+Q==} + electron@32.1.2: + resolution: {integrity: sha512-CXe6doFzhmh1U7daOvUzmF6Cj8hssdYWMeEPRnRO6rB9/bbwMlWctcQ7P8NJXhLQ88/vYUJQrJvlJPh8qM0BRQ==} engines: {node: '>= 12.20.55'} hasBin: true @@ -5061,8 +5090,8 @@ packages: resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.10.0: - resolution: {integrity: sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==} + eslint@9.11.0: + resolution: {integrity: sha512-yVS6XODx+tMFMDFcG4+Hlh+qG7RM6cCJXtQhCKLSsr3XkLvWggHjCqjfh0XsPPnt1c56oaT6PMgW9XWQQjdHXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -5257,8 +5286,8 @@ packages: react: optional: true - framer-motion@11.5.4: - resolution: {integrity: sha512-E+tb3/G6SO69POkdJT+3EpdMuhmtCh9EWuK4I1DnIC23L7tFPrl8vxP+LSovwaw6uUr73rUbpb4FgK011wbRJQ==} + framer-motion@11.5.6: + resolution: {integrity: sha512-JMwUpAxv/DWgul9vPgX0ElKn0G66sUc6O9tOXsYwn3zxwvhxFljSXC0XT2QCzuTYBshwC8nyDAa1SYcV0Ldbhw==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 @@ -5561,6 +5590,9 @@ packages: hast-util-to-html@9.0.2: resolution: {integrity: sha512-RP5wNpj5nm1Z8cloDv4Sl4RS8jH5HYa0v93YB6Wb4poEzgMo/dAAL0KcT4974dCjcNG5pkLqTImeFHHCwwfY3g==} + hast-util-to-html@9.0.3: + resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + hast-util-to-jsx-runtime@2.3.0: resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} @@ -5909,8 +5941,8 @@ packages: jose@5.8.0: resolution: {integrity: sha512-E7CqYpL/t7MMnfGnK/eg416OsFCVUrU/Y3Vwe7QjKhu/BkS1Ms455+2xsqZQVN57/U2MHMBvEb5SrmAZWAIntA==} - jotai@2.9.3: - resolution: {integrity: sha512-IqMWKoXuEzWSShjd9UhalNsRGbdju5G2FrqNLQJT+Ih6p41VNYe2sav5hnwQx4HJr25jq9wRqvGSWGviGG6Gjw==} + jotai@2.10.0: + resolution: {integrity: sha512-8W4u0aRlOIwGlLQ0sqfl/c6+eExl5D8lZgAUolirZLktyaj4WnxO/8a0HEPmtriQAB6X5LMhXzZVmw02X0P0qQ==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=17.0.0' @@ -6034,8 +6066,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - linkedom@0.18.4: - resolution: {integrity: sha512-JhLErxMIEOKByMi3fURXgI1fYOzR87L1Cn0+MI9GlMckFrqFZpV1SUGox1jcKtsKN3y6JgclcQf0FzZT//BuGw==} + linkedom@0.18.5: + resolution: {integrity: sha512-JGLaGGtqtu+eOhYrC1wkWYTBcpVWL4AsnwAtMtgO1Q0gI0PuPJKI0zBBE+a/1BrhOE3Uw8JI/ycByAv5cLrAuQ==} lint-staged@15.2.10: resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==} @@ -6634,8 +6666,8 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - ofetch@1.3.4: - resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} + ofetch@1.4.0: + resolution: {integrity: sha512-MuHgsEhU6zGeX+EMh+8mSMrYTnsqJQQrpM00Q6QHMKNqQ0bKy0B43tk8tL1wg+CnsSTy1kg4Ir2T5Ig6rD+dfQ==} ohash@1.1.3: resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} @@ -7183,8 +7215,8 @@ packages: postgres-range@1.1.4: resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} - posthog-js@1.161.5: - resolution: {integrity: sha512-KGkb12grSQvGRauH6z+AUB83c4dgWqzmJFDjyMXarWRafaLN80HzjN1jk806x27HvdDXi21jtwiXekioWzEQ9g==} + posthog-js@1.163.0: + resolution: {integrity: sha512-gpLbxZkOm06oOWg0uvCxBIVIHrhX3A5hxf9eAi/Z+aFP9DvWxwHQdGUkIWjnYUyxXilIbLxBPvWmiM98dYsAHA==} posthog-node@4.2.0: resolution: {integrity: sha512-hgyCYMyzMvuF3qWMw6JvS8gT55v7Mtp5wKWcnDrw+nu39D0Tk9BXD7I0LOBp0lGlHEPaXCEVYUtviNKrhMALGA==} @@ -7551,8 +7583,8 @@ packages: remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - remark-rehype@11.1.0: - resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + remark-rehype@11.1.1: + resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} @@ -7746,8 +7778,8 @@ packages: engines: {node: '>=4'} hasBin: true - shiki@1.17.7: - resolution: {integrity: sha512-Zf6hNtWhFyF4XP5OOsXkBTEx9JFPiN0TQx4wSe+Vqeuczewgk2vT4IZhF4gka55uelm052BD5BaHavNqUNZd+A==} + shiki@1.18.0: + resolution: {integrity: sha512-8jo7tOXr96h9PBQmOHVrltnETn1honZZY76YA79MHheGQg55jBvbm9dtU+MI5pjC5NJCFuA6rvVTLVeSW5cE4A==} shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} @@ -8020,8 +8052,8 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.4.11: - resolution: {integrity: sha512-qhEuBcLemjSJk5ajccN9xJFtM/h0AVCPaA6C92jNP+M2J8kX+eMJHI7R2HFKUvvAsMpcfLILMCFYSeDwpMmlUg==} + tailwindcss@3.4.12: + resolution: {integrity: sha512-Htf/gHj2+soPb9UayUNci/Ja3d8pTmu9ONTfh4QY8r3MATTZOzmv6UYWF7ZwikEIC8okpfqmGqrmDehua8mF8w==} engines: {node: '>=14.0.0'} hasBin: true @@ -8080,11 +8112,11 @@ packages: resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} engines: {node: '>=14.0.0'} - tldts-core@6.1.46: - resolution: {integrity: sha512-zA3ai/j4aFcmbqTvTONkSBuWs0Q4X4tJxa0gV9sp6kDbq5dAhQDSg0WUkReEm0fBAKAGNj+wPKCCsR8MYOYmwA==} + tldts-core@6.1.47: + resolution: {integrity: sha512-6SWyFMnlst1fEt7GQVAAu16EGgFK0cLouH/2Mk6Ftlwhv3Ol40L0dlpGMcnnNiiOMyD2EV/aF3S+U2nKvvLvrA==} - tldts@6.1.46: - resolution: {integrity: sha512-fw81lXV2CijkNrZAZvee7wegs+EOlTyIuVl/z4q6OUzZHQ1jGL2xQzKXq9geYf/1tzo9LZQLrkcko2m8HLh+rg==} + tldts@6.1.47: + resolution: {integrity: sha512-R/K2tZ5MiY+mVrnSkNJkwqYT2vUv1lcT6wJvd2emGaMJ7PHUGRY4e3tUsdFCXgqxi2QgbHjL3yJgXCo40v9Hxw==} hasBin: true tmp-promise@3.0.3: @@ -8436,8 +8468,8 @@ packages: vite: optional: true - vite@5.4.6: - resolution: {integrity: sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==} + vite@5.4.7: + resolution: {integrity: sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -9542,25 +9574,25 @@ snapshots: dependencies: '@egjs/infinitegrid': 4.12.0 - '@egoist/tailwindcss-icons@1.8.1(tailwindcss@3.4.11)': + '@egoist/tailwindcss-icons@1.8.1(tailwindcss@3.4.12)': dependencies: '@iconify/utils': 2.1.32 - tailwindcss: 3.4.11 + tailwindcss: 3.4.12 transitivePeerDependencies: - supports-color - '@egoist/tipc@0.3.2(electron@32.1.0)(react@18.3.1)': + '@egoist/tipc@0.3.2(electron@32.1.2)(react@18.3.1)': dependencies: - electron: 32.1.0 + electron: 32.1.2 optionalDependencies: '@tanstack/react-query': 5.56.2(react@18.3.1) transitivePeerDependencies: - react - '@electron-forge/cli@7.4.0(encoding@0.1.13)': + '@electron-forge/cli@7.5.0(encoding@0.1.13)': dependencies: - '@electron-forge/core': 7.4.0(encoding@0.1.13) - '@electron-forge/shared-types': 7.4.0 + '@electron-forge/core': 7.5.0(encoding@0.1.13) + '@electron-forge/shared-types': 7.5.0 '@electron/get': 3.1.0 chalk: 4.1.2 commander: 4.1.1 @@ -9573,9 +9605,9 @@ snapshots: - encoding - supports-color - '@electron-forge/core-utils@7.4.0': + '@electron-forge/core-utils@7.5.0': dependencies: - '@electron-forge/shared-types': 7.4.0 + '@electron-forge/shared-types': 7.5.0 '@electron/rebuild': 3.6.0 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 @@ -9589,21 +9621,21 @@ snapshots: - bluebird - supports-color - '@electron-forge/core@7.4.0(encoding@0.1.13)': + '@electron-forge/core@7.5.0(encoding@0.1.13)': dependencies: - '@electron-forge/core-utils': 7.4.0 - '@electron-forge/maker-base': 7.4.0 - '@electron-forge/plugin-base': 7.4.0 - '@electron-forge/publisher-base': 7.4.0 - '@electron-forge/shared-types': 7.4.0 - '@electron-forge/template-base': 7.4.0 - '@electron-forge/template-vite': 7.4.0 - '@electron-forge/template-vite-typescript': 7.4.0 - '@electron-forge/template-webpack': 7.4.0 - '@electron-forge/template-webpack-typescript': 7.4.0 - '@electron-forge/tracer': 7.4.0 + '@electron-forge/core-utils': 7.5.0 + '@electron-forge/maker-base': 7.5.0 + '@electron-forge/plugin-base': 7.5.0 + '@electron-forge/publisher-base': 7.5.0 + '@electron-forge/shared-types': 7.5.0 + '@electron-forge/template-base': 7.5.0 + '@electron-forge/template-vite': 7.5.0 + '@electron-forge/template-vite-typescript': 7.5.0 + '@electron-forge/template-webpack': 7.5.0 + '@electron-forge/template-webpack-typescript': 7.5.0 + '@electron-forge/tracer': 7.5.0 '@electron/get': 3.1.0 - '@electron/packager': 18.3.4 + '@electron/packager': 18.3.5 '@electron/rebuild': 3.6.0 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 @@ -9640,21 +9672,30 @@ snapshots: - bluebird - supports-color - '@electron-forge/maker-dmg@7.4.0': + '@electron-forge/maker-base@7.5.0': dependencies: - '@electron-forge/maker-base': 7.4.0 - '@electron-forge/shared-types': 7.4.0 + '@electron-forge/shared-types': 7.5.0 fs-extra: 10.1.0 - optionalDependencies: - electron-installer-dmg: 4.0.0 + which: 2.0.2 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/maker-squirrel@7.4.0': + '@electron-forge/maker-dmg@7.5.0': dependencies: - '@electron-forge/maker-base': 7.4.0 - '@electron-forge/shared-types': 7.4.0 + '@electron-forge/maker-base': 7.5.0 + '@electron-forge/shared-types': 7.5.0 + fs-extra: 10.1.0 + optionalDependencies: + electron-installer-dmg: 5.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + + '@electron-forge/maker-squirrel@7.5.0': + dependencies: + '@electron-forge/maker-base': 7.5.0 + '@electron-forge/shared-types': 7.5.0 fs-extra: 10.1.0 optionalDependencies: electron-winstaller: 5.4.0 @@ -9662,10 +9703,10 @@ snapshots: - bluebird - supports-color - '@electron-forge/maker-zip@7.4.0': + '@electron-forge/maker-zip@7.5.0': dependencies: - '@electron-forge/maker-base': 7.4.0 - '@electron-forge/shared-types': 7.4.0 + '@electron-forge/maker-base': 7.5.0 + '@electron-forge/shared-types': 7.5.0 cross-zip: 4.0.1 fs-extra: 10.1.0 got: 11.8.6 @@ -9673,33 +9714,33 @@ snapshots: - bluebird - supports-color - '@electron-forge/plugin-base@7.4.0': + '@electron-forge/plugin-base@7.5.0': dependencies: - '@electron-forge/shared-types': 7.4.0 + '@electron-forge/shared-types': 7.5.0 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/plugin-fuses@7.4.0(@electron/fuses@1.8.0)': + '@electron-forge/plugin-fuses@7.5.0(@electron/fuses@1.8.0)': dependencies: - '@electron-forge/plugin-base': 7.4.0 - '@electron-forge/shared-types': 7.4.0 + '@electron-forge/plugin-base': 7.5.0 + '@electron-forge/shared-types': 7.5.0 '@electron/fuses': 1.8.0 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/publisher-base@7.4.0': + '@electron-forge/publisher-base@7.5.0': dependencies: - '@electron-forge/shared-types': 7.4.0 + '@electron-forge/shared-types': 7.5.0 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/publisher-github@7.4.0(encoding@0.1.13)': + '@electron-forge/publisher-github@7.5.0(encoding@0.1.13)': dependencies: - '@electron-forge/publisher-base': 7.4.0 - '@electron-forge/shared-types': 7.4.0 + '@electron-forge/publisher-base': 7.5.0 + '@electron-forge/shared-types': 7.5.0 '@octokit/core': 3.6.0(encoding@0.1.13) '@octokit/plugin-retry': 3.0.9 '@octokit/request-error': 2.1.0 @@ -9725,9 +9766,19 @@ snapshots: - bluebird - supports-color - '@electron-forge/template-base@7.4.0': + '@electron-forge/shared-types@7.5.0': dependencies: - '@electron-forge/shared-types': 7.4.0 + '@electron-forge/tracer': 7.5.0 + '@electron/packager': 18.3.5 + '@electron/rebuild': 3.6.0 + listr2: 7.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + + '@electron-forge/template-base@7.5.0': + dependencies: + '@electron-forge/shared-types': 7.5.0 '@malept/cross-spawn-promise': 2.0.0 debug: 4.3.7 fs-extra: 10.1.0 @@ -9736,37 +9787,37 @@ snapshots: - bluebird - supports-color - '@electron-forge/template-vite-typescript@7.4.0': + '@electron-forge/template-vite-typescript@7.5.0': dependencies: - '@electron-forge/shared-types': 7.4.0 - '@electron-forge/template-base': 7.4.0 + '@electron-forge/shared-types': 7.5.0 + '@electron-forge/template-base': 7.5.0 fs-extra: 10.1.0 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/template-vite@7.4.0': + '@electron-forge/template-vite@7.5.0': dependencies: - '@electron-forge/shared-types': 7.4.0 - '@electron-forge/template-base': 7.4.0 + '@electron-forge/shared-types': 7.5.0 + '@electron-forge/template-base': 7.5.0 fs-extra: 10.1.0 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/template-webpack-typescript@7.4.0': + '@electron-forge/template-webpack-typescript@7.5.0': dependencies: - '@electron-forge/shared-types': 7.4.0 - '@electron-forge/template-base': 7.4.0 + '@electron-forge/shared-types': 7.5.0 + '@electron-forge/template-base': 7.5.0 fs-extra: 10.1.0 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/template-webpack@7.4.0': + '@electron-forge/template-webpack@7.5.0': dependencies: - '@electron-forge/shared-types': 7.4.0 - '@electron-forge/template-base': 7.4.0 + '@electron-forge/shared-types': 7.5.0 + '@electron-forge/template-base': 7.5.0 fs-extra: 10.1.0 transitivePeerDependencies: - bluebird @@ -9776,17 +9827,21 @@ snapshots: dependencies: chrome-trace-event: 1.0.4 - '@electron-toolkit/preload@3.0.1(electron@32.1.0)': + '@electron-forge/tracer@7.5.0': dependencies: - electron: 32.1.0 + chrome-trace-event: 1.0.4 + + '@electron-toolkit/preload@3.0.1(electron@32.1.2)': + dependencies: + electron: 32.1.2 '@electron-toolkit/tsconfig@1.0.1(@types/node@22.5.5)': dependencies: '@types/node': 22.5.5 - '@electron-toolkit/utils@3.0.0(electron@32.1.0)': + '@electron-toolkit/utils@3.0.0(electron@32.1.2)': dependencies: - electron: 32.1.0 + electron: 32.1.2 '@electron/asar@3.2.10': dependencies: @@ -9794,6 +9849,13 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + '@electron/asar@3.2.13': + dependencies: + '@types/glob': 7.2.0 + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.2 + '@electron/fuses@1.8.0': dependencies: chalk: 4.1.2 @@ -9898,6 +9960,30 @@ snapshots: transitivePeerDependencies: - supports-color + '@electron/packager@18.3.5': + dependencies: + '@electron/asar': 3.2.13 + '@electron/get': 3.1.0 + '@electron/notarize': 2.4.0 + '@electron/osx-sign': 1.3.1 + '@electron/universal': 2.0.1 + '@electron/windows-sign': 1.1.3 + debug: 4.3.7 + extract-zip: 2.0.1 + filenamify: 4.3.0 + fs-extra: 11.2.0 + galactus: 1.0.0 + get-package-info: 1.0.0 + junk: 3.1.0 + parse-author: 2.0.0 + plist: 3.1.0 + resedit: 2.0.2 + resolve: 1.22.8 + semver: 7.6.3 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - supports-color + '@electron/rebuild@3.6.0': dependencies: '@malept/cross-spawn-promise': 2.0.0 @@ -10107,20 +10193,20 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.10.0(jiti@1.21.6))': + '@eslint-community/eslint-utils@4.4.0(eslint@9.11.0(jiti@1.21.6))': dependencies: - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.0': {} - '@eslint-react/ast@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@eslint-react/ast@1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: '@eslint-react/tools': 1.14.1 - '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/types': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/types': 8.6.0 '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) birecord: 0.1.1 string-ts: 2.2.0 ts-pattern: 5.3.1 @@ -10129,18 +10215,18 @@ snapshots: - supports-color - typescript - '@eslint-react/core@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@eslint-react/core@1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/jsx': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/ast': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@eslint-react/tools': 1.14.1 - '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/var': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/types': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/var': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/type-utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/type-utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) birecord: 0.1.1 short-unique-id: 5.2.0 ts-pattern: 5.3.1 @@ -10149,46 +10235,46 @@ snapshots: - supports-color - typescript - '@eslint-react/eslint-plugin@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@eslint-react/eslint-plugin@1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@eslint-react/tools': 1.14.1 - '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/types': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/type-utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/type-utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - eslint: 9.10.0(jiti@1.21.6) - eslint-plugin-react-debug: 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - eslint-plugin-react-dom: 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - eslint-plugin-react-hooks-extra: 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - eslint-plugin-react-naming-convention: 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - eslint-plugin-react-web-api: 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - eslint-plugin-react-x: 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.11.0(jiti@1.21.6) + eslint-plugin-react-debug: 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + eslint-plugin-react-dom: 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + eslint-plugin-react-hooks-extra: 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + eslint-plugin-react-naming-convention: 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + eslint-plugin-react-web-api: 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + eslint-plugin-react-x: 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@eslint-react/jsx@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@eslint-react/jsx@1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/ast': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@eslint-react/tools': 1.14.1 - '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/var': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/types': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/var': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.6.0 '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) ts-pattern: 5.3.1 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/shared@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@eslint-react/shared@1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: '@eslint-react/tools': 1.14.1 - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) picomatch: 4.0.2 transitivePeerDependencies: - eslint @@ -10197,24 +10283,24 @@ snapshots: '@eslint-react/tools@1.14.1': {} - '@eslint-react/types@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@eslint-react/types@1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: '@eslint-react/tools': 1.14.1 '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/var@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@eslint-react/var@1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/ast': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@eslint-react/tools': 1.14.1 - '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/types': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.6.0 '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) ts-pattern: 5.3.1 transitivePeerDependencies: - eslint @@ -10247,9 +10333,11 @@ snapshots: '@eslint/js@9.10.0': {} + '@eslint/js@9.11.0': {} + '@eslint/object-schema@2.1.4': {} - '@eslint/plugin-kit@0.1.0': + '@eslint/plugin-kit@0.2.0': dependencies: levn: 0.4.1 @@ -10268,23 +10356,23 @@ snapshots: '@floating-ui/core': 1.6.7 '@floating-ui/utils': 0.2.7 - '@floating-ui/react-dom-interactions@0.3.1(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@floating-ui/react-dom-interactions@0.3.1(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/react-dom': 0.6.3(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/react-dom': 0.6.3(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) aria-hidden: 1.2.4 point-in-polygon: 1.1.0 - use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.7)(react@18.3.1) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.8)(react@18.3.1) transitivePeerDependencies: - '@types/react' - react - react-dom - '@floating-ui/react-dom@0.6.3(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@floating-ui/react-dom@0.6.3(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/dom': 0.4.5 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.7)(react@18.3.1) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.8)(react@18.3.1) transitivePeerDependencies: - '@types/react' @@ -10331,7 +10419,7 @@ snapshots: hono: 4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e) react: 18.3.1 - '@hono/node-server@1.13.0(hono@4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e))': + '@hono/node-server@1.13.1(hono@4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e))': dependencies: hono: 4.6.2(patch_hash=iej2g43ojhll5opwbnvyorjq4e) @@ -10875,675 +10963,675 @@ snapshots: '@radix-ui/primitive@1.1.0': {} - '@radix-ui/react-alert-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-alert-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-avatar@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-avatar@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-checkbox@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-checkbox@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.8)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.8)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-context-menu@2.2.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-context-menu@2.2.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-context@1.0.1(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-context@1.0.1(@types/react@18.3.8)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-context@1.1.0(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-context@1.1.0(@types/react@18.3.8)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-dialog@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dialog@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.8)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.5(@types/react@18.3.7)(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.8)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.7)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.8)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-direction@1.1.0(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-direction@1.1.0(@types/react@18.3.8)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.8)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.8)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-hover-card@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-hover-card@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-id@1.0.1(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-id@1.0.1(@types/react@18.3.8)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-id@1.1.0(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-id@1.1.0(@types/react@18.3.8)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.7)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.8)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-popover@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popover@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.7)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.8)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.8)(react@18.3.1) '@radix-ui/rect': 1.1.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-portal@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-radio-group@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-radio-group@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-scroll-area@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-scroll-area@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-select@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-select@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.7)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.8)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-slider@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-slider@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-slot@1.0.2(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-slot@1.0.2(@types/react@18.3.8)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-slot@1.1.0(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-slot@1.1.0(@types/react@18.3.8)(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-switch@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-switch@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-tabs@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tabs@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-toast@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-toast@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-tooltip@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tooltip@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 - '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.8)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.8)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.8)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.8)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.8)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.8)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.8)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.4 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.8)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.8)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.8)(react@18.3.1)': dependencies: '@radix-ui/rect': 1.1.0 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-use-size@1.1.0(@types/react@18.3.7)(react@18.3.1)': + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.8)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 '@types/react-dom': 18.3.0 '@radix-ui/rect@1.1.0': {} @@ -11876,31 +11964,31 @@ snapshots: - encoding - supports-color - '@shikijs/core@1.17.7': + '@shikijs/core@1.18.0': dependencies: - '@shikijs/engine-javascript': 1.17.7 - '@shikijs/engine-oniguruma': 1.17.7 - '@shikijs/types': 1.17.7 + '@shikijs/engine-javascript': 1.18.0 + '@shikijs/engine-oniguruma': 1.18.0 + '@shikijs/types': 1.18.0 '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 - hast-util-to-html: 9.0.2 + hast-util-to-html: 9.0.3 - '@shikijs/engine-javascript@1.17.7': + '@shikijs/engine-javascript@1.18.0': dependencies: - '@shikijs/types': 1.17.7 + '@shikijs/types': 1.18.0 '@shikijs/vscode-textmate': 9.2.2 oniguruma-to-js: 0.4.3 - '@shikijs/engine-oniguruma@1.17.7': + '@shikijs/engine-oniguruma@1.18.0': dependencies: - '@shikijs/types': 1.17.7 + '@shikijs/types': 1.18.0 '@shikijs/vscode-textmate': 9.2.2 - '@shikijs/transformers@1.17.7': + '@shikijs/transformers@1.18.0': dependencies: - shiki: 1.17.7 + shiki: 1.18.0 - '@shikijs/types@1.17.7': + '@shikijs/types@1.18.0': dependencies: '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 @@ -11909,10 +11997,10 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@stylistic/eslint-plugin@2.8.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@stylistic/eslint-plugin@2.8.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@typescript-eslint/utils': 8.4.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - eslint: 9.10.0(jiti@1.21.6) + '@typescript-eslint/utils': 8.4.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.11.0(jiti@1.21.6) eslint-visitor-keys: 4.0.0 espree: 10.1.0 estraverse: 5.3.0 @@ -11935,17 +12023,17 @@ snapshots: optionalDependencies: typescript: 5.6.2 - '@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.11)': + '@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.12)': dependencies: - tailwindcss: 3.4.11 + tailwindcss: 3.4.12 - '@tailwindcss/typography@0.5.15(tailwindcss@3.4.11)': + '@tailwindcss/typography@0.5.15(tailwindcss@3.4.12)': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.11 + tailwindcss: 3.4.12 '@tanstack/query-core@5.56.2': {} @@ -11989,6 +12077,11 @@ snapshots: '@trysound/sax@0.2.0': {} + '@types/appdmg@0.5.5': + dependencies: + '@types/node': 22.5.5 + optional: true + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.25.6 @@ -12113,9 +12206,9 @@ snapshots: '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - '@types/react@18.3.7': + '@types/react@18.3.8': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 @@ -12145,15 +12238,15 @@ snapshots: '@types/node': 22.5.5 optional: true - '@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/parser': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/type-utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/type-utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/visitor-keys': 8.6.0 - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -12163,14 +12256,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@typescript-eslint/parser@8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: '@typescript-eslint/scope-manager': 8.6.0 '@typescript-eslint/types': 8.6.0 '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) '@typescript-eslint/visitor-keys': 8.6.0 debug: 4.3.7 - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -12186,10 +12279,10 @@ snapshots: '@typescript-eslint/types': 8.6.0 '@typescript-eslint/visitor-keys': 8.6.0 - '@typescript-eslint/type-utils@8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@typescript-eslint/type-utils@8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: @@ -12232,24 +12325,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.4.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@typescript-eslint/utils@8.4.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.0(jiti@1.21.6)) '@typescript-eslint/scope-manager': 8.4.0 '@typescript-eslint/types': 8.4.0 '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.6.2) - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@typescript-eslint/utils@8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.0(jiti@1.21.6)) '@typescript-eslint/scope-manager': 8.6.0 '@typescript-eslint/types': 8.6.0 '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) transitivePeerDependencies: - supports-color - typescript @@ -12275,17 +12368,17 @@ snapshots: '@unocss/core@0.62.3': {} - '@unocss/eslint-config@0.62.3(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@unocss/eslint-config@0.62.3(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@unocss/eslint-plugin': 0.62.3(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@unocss/eslint-plugin': 0.62.3(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) transitivePeerDependencies: - eslint - supports-color - typescript - '@unocss/eslint-plugin@0.62.3(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + '@unocss/eslint-plugin@0.62.3(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@typescript-eslint/utils': 8.4.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.4.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@unocss/config': 0.62.3 '@unocss/core': 0.62.3 magic-string: 0.30.11 @@ -12302,7 +12395,7 @@ snapshots: '@use-gesture/core': 10.3.1 react: 18.3.1 - '@vitejs/plugin-legacy@5.4.2(terser@5.32.0)(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0))': + '@vitejs/plugin-legacy@5.4.2(terser@5.32.0)(vite@5.4.7(@types/node@22.5.5)(terser@5.32.0))': dependencies: '@babel/core': 7.25.2 '@babel/preset-env': 7.25.4(@babel/core@7.25.2) @@ -12313,18 +12406,18 @@ snapshots: regenerator-runtime: 0.14.1 systemjs: 6.15.1 terser: 5.32.0 - vite: 5.4.6(@types/node@22.5.5)(terser@5.32.0) + vite: 5.4.7(@types/node@22.5.5)(terser@5.32.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.3.1(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0))': + '@vitejs/plugin-react@4.3.1(vite@5.4.7(@types/node@22.5.5)(terser@5.32.0))': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.6(@types/node@22.5.5)(terser@5.32.0) + vite: 5.4.7(@types/node@22.5.5)(terser@5.32.0) transitivePeerDependencies: - supports-color @@ -13047,9 +13140,9 @@ snapshots: slice-ansi: 5.0.0 string-width: 7.2.0 - click-to-react-component@1.1.0(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + click-to-react-component@1.1.0(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@floating-ui/react-dom-interactions': 0.3.1(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/react-dom-interactions': 0.3.1(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) htm: 3.1.1 react: 18.3.1 react-merge-refs: 1.1.0 @@ -13075,10 +13168,10 @@ snapshots: clsx@2.1.1: {} - cmdk@1.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + cmdk@1.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -13576,11 +13669,11 @@ snapshots: dotenv@9.0.2: {} - drizzle-orm@0.33.0(@opentelemetry/api@1.9.0)(@types/pg@8.11.8)(@types/react@18.3.7)(react@18.3.1): + drizzle-orm@0.33.0(@opentelemetry/api@1.9.0)(@types/pg@8.11.8)(@types/react@18.3.8)(react@18.3.1): optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/pg': 8.11.8 - '@types/react': 18.3.7 + '@types/react': 18.3.8 react: 18.3.1 ds-store@0.1.6: @@ -13626,8 +13719,9 @@ snapshots: pupa: 3.1.0 unused-filename: 4.0.1 - electron-installer-dmg@4.0.0: + electron-installer-dmg@5.0.1: dependencies: + '@types/appdmg': 0.5.5 debug: 4.3.7 minimist: 1.2.8 optionalDependencies: @@ -13689,7 +13783,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron-vite@2.3.0(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0)): + electron-vite@2.3.0(vite@5.4.7(@types/node@22.5.5)(terser@5.32.0)): dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) @@ -13697,7 +13791,7 @@ snapshots: esbuild: 0.21.5 magic-string: 0.30.11 picocolors: 1.1.0 - vite: 5.4.6(@types/node@22.5.5)(terser@5.32.0) + vite: 5.4.7(@types/node@22.5.5)(terser@5.32.0) transitivePeerDependencies: - supports-color @@ -13714,7 +13808,7 @@ snapshots: - supports-color optional: true - electron@32.1.0: + electron@32.1.2: dependencies: '@electron/get': 2.0.3 '@types/node': 20.16.5 @@ -13841,46 +13935,46 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.10.0(jiti@1.21.6)): + eslint-compat-utils@0.5.1(eslint@9.11.0(jiti@1.21.6)): dependencies: - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) semver: 7.6.3 - eslint-config-flat-gitignore@0.3.0(eslint@9.10.0(jiti@1.21.6)): + eslint-config-flat-gitignore@0.3.0(eslint@9.11.0(jiti@1.21.6)): dependencies: '@eslint/compat': 1.1.1 - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) find-up-simple: 1.0.0 - eslint-config-hyoban@3.1.6(@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(tailwindcss@3.4.11)(typescript@5.6.2): + eslint-config-hyoban@3.1.6(@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.0(jiti@1.21.6))(tailwindcss@3.4.12)(typescript@5.6.2): dependencies: - '@eslint-react/eslint-plugin': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/eslint-plugin': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@eslint/js': 9.10.0 - '@stylistic/eslint-plugin': 2.8.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@stylistic/eslint-plugin': 2.8.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@types/eslint': 9.6.1 - '@unocss/eslint-config': 0.62.3(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@unocss/eslint-config': 0.62.3(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) defu: 6.1.4 - eslint: 9.10.0(jiti@1.21.6) - eslint-config-flat-gitignore: 0.3.0(eslint@9.10.0(jiti@1.21.6)) - eslint-plugin-antfu: 2.6.0(eslint@9.10.0(jiti@1.21.6)) - eslint-plugin-command: 0.2.5(eslint@9.10.0(jiti@1.21.6)) - eslint-plugin-hyoban: 0.6.1(eslint@9.10.0(jiti@1.21.6)) - eslint-plugin-import-x: 4.2.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - eslint-plugin-jsonc: 2.16.0(eslint@9.10.0(jiti@1.21.6)) - eslint-plugin-package-json: 0.15.3(eslint@9.10.0(jiti@1.21.6))(jsonc-eslint-parser@2.4.0) - eslint-plugin-react-compiler: 0.0.0-experimental-f8a5409-20240829(eslint@9.10.0(jiti@1.21.6)) - eslint-plugin-react-hooks: 5.1.0-rc-fb9a90fa48-20240614(eslint@9.10.0(jiti@1.21.6)) - eslint-plugin-react-refresh: 0.4.11(eslint@9.10.0(jiti@1.21.6)) - eslint-plugin-regexp: 2.6.0(eslint@9.10.0(jiti@1.21.6)) - eslint-plugin-simple-import-sort: 12.1.1(eslint@9.10.0(jiti@1.21.6)) - eslint-plugin-tailwindcss: 3.17.4(tailwindcss@3.4.11) - eslint-plugin-unicorn: 55.0.0(eslint@9.10.0(jiti@1.21.6)) - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6)) + eslint: 9.11.0(jiti@1.21.6) + eslint-config-flat-gitignore: 0.3.0(eslint@9.11.0(jiti@1.21.6)) + eslint-plugin-antfu: 2.6.0(eslint@9.11.0(jiti@1.21.6)) + eslint-plugin-command: 0.2.5(eslint@9.11.0(jiti@1.21.6)) + eslint-plugin-hyoban: 0.6.1(eslint@9.11.0(jiti@1.21.6)) + eslint-plugin-import-x: 4.2.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + eslint-plugin-jsonc: 2.16.0(eslint@9.11.0(jiti@1.21.6)) + eslint-plugin-package-json: 0.15.3(eslint@9.11.0(jiti@1.21.6))(jsonc-eslint-parser@2.4.0) + eslint-plugin-react-compiler: 0.0.0-experimental-f8a5409-20240829(eslint@9.11.0(jiti@1.21.6)) + eslint-plugin-react-hooks: 5.1.0-rc-fb9a90fa48-20240614(eslint@9.11.0(jiti@1.21.6)) + eslint-plugin-react-refresh: 0.4.11(eslint@9.11.0(jiti@1.21.6)) + eslint-plugin-regexp: 2.6.0(eslint@9.11.0(jiti@1.21.6)) + eslint-plugin-simple-import-sort: 12.1.1(eslint@9.11.0(jiti@1.21.6)) + eslint-plugin-tailwindcss: 3.17.4(tailwindcss@3.4.12) + eslint-plugin-unicorn: 55.0.0(eslint@9.11.0(jiti@1.21.6)) + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.0(jiti@1.21.6)) globals: 15.9.0 jsonc-eslint-parser: 2.4.0 local-pkg: 0.5.0 read-package-up: 11.0.0 - typescript-eslint: 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + typescript-eslint: 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -13896,26 +13990,26 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-antfu@2.6.0(eslint@9.10.0(jiti@1.21.6)): + eslint-plugin-antfu@2.6.0(eslint@9.11.0(jiti@1.21.6)): dependencies: '@antfu/utils': 0.7.10 - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) - eslint-plugin-command@0.2.5(eslint@9.10.0(jiti@1.21.6)): + eslint-plugin-command@0.2.5(eslint@9.11.0(jiti@1.21.6)): dependencies: '@es-joy/jsdoccomment': 0.48.0 - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) - eslint-plugin-hyoban@0.6.1(eslint@9.10.0(jiti@1.21.6)): + eslint-plugin-hyoban@0.6.1(eslint@9.11.0(jiti@1.21.6)): dependencies: - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) - eslint-plugin-import-x@4.2.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): + eslint-plugin-import-x@4.2.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2): dependencies: - '@typescript-eslint/utils': 8.4.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.4.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) debug: 4.3.7 doctrine: 3.0.0 - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.8.0 is-glob: 4.0.3 @@ -13927,23 +14021,23 @@ snapshots: - supports-color - typescript - eslint-plugin-jsonc@2.16.0(eslint@9.10.0(jiti@1.21.6)): + eslint-plugin-jsonc@2.16.0(eslint@9.11.0(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6)) - eslint: 9.10.0(jiti@1.21.6) - eslint-compat-utils: 0.5.1(eslint@9.10.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.0(jiti@1.21.6)) + eslint: 9.11.0(jiti@1.21.6) + eslint-compat-utils: 0.5.1(eslint@9.11.0(jiti@1.21.6)) espree: 9.6.1 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.0 natural-compare: 1.4.0 synckit: 0.6.2 - eslint-plugin-package-json@0.15.3(eslint@9.10.0(jiti@1.21.6))(jsonc-eslint-parser@2.4.0): + eslint-plugin-package-json@0.15.3(eslint@9.11.0(jiti@1.21.6))(jsonc-eslint-parser@2.4.0): dependencies: '@altano/repository-tools': 0.1.1 detect-indent: 6.1.0 detect-newline: 3.1.0 - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) jsonc-eslint-parser: 2.4.0 package-json-validator: 0.6.5 semver: 7.6.3 @@ -13951,32 +14045,32 @@ snapshots: sort-package-json: 1.57.0 validate-npm-package-name: 5.0.1 - eslint-plugin-react-compiler@0.0.0-experimental-f8a5409-20240829(eslint@9.10.0(jiti@1.21.6)): + eslint-plugin-react-compiler@0.0.0-experimental-f8a5409-20240829(eslint@9.11.0(jiti@1.21.6)): dependencies: '@babel/core': 7.25.2 '@babel/parser': 7.25.6 '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.25.2) - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) hermes-parser: 0.20.1 zod: 3.23.8 zod-validation-error: 3.3.1(zod@3.23.8) transitivePeerDependencies: - supports-color - eslint-plugin-react-debug@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): + eslint-plugin-react-debug@1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2): dependencies: - '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/core': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/jsx': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/ast': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/core': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@eslint-react/tools': 1.14.1 - '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/var': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/types': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/var': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/type-utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/type-utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - eslint: 9.10.0(jiti@1.21.6) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.11.0(jiti@1.21.6) string-ts: 2.2.0 ts-pattern: 5.3.1 optionalDependencies: @@ -13984,142 +14078,142 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): + eslint-plugin-react-dom@1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2): dependencies: - '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/core': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/jsx': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/ast': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/core': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@eslint-react/tools': 1.14.1 - '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/var': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/types': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/var': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.6.0 '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - eslint: 9.10.0(jiti@1.21.6) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.11.0(jiti@1.21.6) ts-pattern: 5.3.1 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): + eslint-plugin-react-hooks-extra@1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2): dependencies: - '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/core': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/jsx': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/ast': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/core': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@eslint-react/tools': 1.14.1 - '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/var': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/types': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/var': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/type-utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/type-utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - eslint: 9.10.0(jiti@1.21.6) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.11.0(jiti@1.21.6) ts-pattern: 5.3.1 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@5.1.0-rc-fb9a90fa48-20240614(eslint@9.10.0(jiti@1.21.6)): + eslint-plugin-react-hooks@5.1.0-rc-fb9a90fa48-20240614(eslint@9.11.0(jiti@1.21.6)): dependencies: - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) - eslint-plugin-react-naming-convention@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): + eslint-plugin-react-naming-convention@1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2): dependencies: - '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/core': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/jsx': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/ast': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/core': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@eslint-react/tools': 1.14.1 - '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/types': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/type-utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/type-utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - eslint: 9.10.0(jiti@1.21.6) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.11.0(jiti@1.21.6) ts-pattern: 5.3.1 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-refresh@0.4.11(eslint@9.10.0(jiti@1.21.6)): + eslint-plugin-react-refresh@0.4.11(eslint@9.11.0(jiti@1.21.6)): dependencies: - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) - eslint-plugin-react-web-api@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): + eslint-plugin-react-web-api@1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2): dependencies: - '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/core': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/jsx': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/ast': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/core': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@eslint-react/tools': 1.14.1 - '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/var': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/types': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/var': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.6.0 '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) birecord: 0.1.1 - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) ts-pattern: 5.3.1 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): + eslint-plugin-react-x@1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2): dependencies: - '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/core': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/jsx': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/ast': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/core': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@eslint-react/tools': 1.14.1 - '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@eslint-react/var': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/types': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/var': 1.14.1(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/type-utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/type-utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - eslint: 9.10.0(jiti@1.21.6) - is-immutable-type: 5.0.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.11.0(jiti@1.21.6) + is-immutable-type: 5.0.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) ts-pattern: 5.3.1 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-regexp@2.6.0(eslint@9.10.0(jiti@1.21.6)): + eslint-plugin-regexp@2.6.0(eslint@9.11.0(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.0(jiti@1.21.6)) '@eslint-community/regexpp': 4.11.0 comment-parser: 1.4.1 - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) jsdoc-type-pratt-parser: 4.1.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-simple-import-sort@12.1.1(eslint@9.10.0(jiti@1.21.6)): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.11.0(jiti@1.21.6)): dependencies: - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) - eslint-plugin-tailwindcss@3.17.4(tailwindcss@3.4.11): + eslint-plugin-tailwindcss@3.17.4(tailwindcss@3.4.12): dependencies: fast-glob: 3.3.2 postcss: 8.4.47 - tailwindcss: 3.4.11 + tailwindcss: 3.4.12 - eslint-plugin-unicorn@55.0.0(eslint@9.10.0(jiti@1.21.6)): + eslint-plugin-unicorn@55.0.0(eslint@9.11.0(jiti@1.21.6)): dependencies: '@babel/helper-validator-identifier': 7.24.7 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.0(jiti@1.21.6)) ci-info: 4.0.0 clean-regexp: 1.0.0 core-js-compat: 3.38.1 - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) esquery: 1.6.0 globals: 15.9.0 indent-string: 4.0.0 @@ -14132,11 +14226,11 @@ snapshots: semver: 7.6.3 strip-indent: 3.0.0 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.0(jiti@1.21.6)): dependencies: - eslint: 9.10.0(jiti@1.21.6) + eslint: 9.11.0(jiti@1.21.6) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) eslint-scope@8.0.2: dependencies: @@ -14147,14 +14241,14 @@ snapshots: eslint-visitor-keys@4.0.0: {} - eslint@9.10.0(jiti@1.21.6): + eslint@9.11.0(jiti@1.21.6): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.0(jiti@1.21.6)) '@eslint-community/regexpp': 4.11.0 '@eslint/config-array': 0.18.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.10.0 - '@eslint/plugin-kit': 0.1.0 + '@eslint/js': 9.11.0 + '@eslint/plugin-kit': 0.2.0 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 @@ -14398,7 +14492,7 @@ snapshots: optionalDependencies: react: 18.3.1 - framer-motion@11.5.4(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + framer-motion@11.5.6(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: tslib: 2.7.0 optionalDependencies: @@ -14826,6 +14920,20 @@ snapshots: stringify-entities: 4.0.4 zwitch: 2.0.4 + hast-util-to-html@9.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + hast-util-to-jsx-runtime@2.3.0: dependencies: '@types/estree': 1.0.5 @@ -15101,10 +15209,10 @@ snapshots: is-hexadecimal@2.0.1: {} - is-immutable-type@5.0.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): + is-immutable-type@5.0.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2): dependencies: - '@typescript-eslint/type-utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - eslint: 9.10.0(jiti@1.21.6) + '@typescript-eslint/type-utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.11.0(jiti@1.21.6) ts-api-utils: 1.3.0(typescript@5.6.2) ts-declaration-location: 1.0.4(typescript@5.6.2) typescript: 5.6.2 @@ -15189,9 +15297,9 @@ snapshots: jose@5.8.0: {} - jotai@2.9.3(@types/react@18.3.7)(react@18.3.1): + jotai@2.10.0(@types/react@18.3.8)(react@18.3.1): optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 react: 18.3.1 joycon@3.1.1: {} @@ -15292,7 +15400,7 @@ snapshots: lines-and-columns@1.2.4: {} - linkedom@0.18.4: + linkedom@0.18.5: dependencies: css-select: 5.1.0 cssom: 0.5.0 @@ -16154,7 +16262,7 @@ snapshots: obuf@1.1.2: {} - ofetch@1.3.4: + ofetch@1.4.0: dependencies: destr: 2.0.3 node-fetch-native: 1.6.4 @@ -16668,7 +16776,7 @@ snapshots: postgres-range@1.1.4: {} - posthog-js@1.161.5: + posthog-js@1.163.0: dependencies: fflate: 0.4.8 preact: 10.23.2 @@ -16818,35 +16926,35 @@ snapshots: react-refresh@0.14.2: {} - react-remove-scroll-bar@2.3.6(@types/react@18.3.7)(react@18.3.1): + react-remove-scroll-bar@2.3.6(@types/react@18.3.8)(react@18.3.1): dependencies: react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.7)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.8)(react@18.3.1) tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - react-remove-scroll@2.5.5(@types/react@18.3.7)(react@18.3.1): + react-remove-scroll@2.5.5(@types/react@18.3.8)(react@18.3.1): dependencies: react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.3.7)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.7)(react@18.3.1) + react-remove-scroll-bar: 2.3.6(@types/react@18.3.8)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.8)(react@18.3.1) tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.3.7)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.7)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.8)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.8)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - react-remove-scroll@2.5.7(@types/react@18.3.7)(react@18.3.1): + react-remove-scroll@2.5.7(@types/react@18.3.8)(react@18.3.1): dependencies: react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.3.7)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.7)(react@18.3.1) + react-remove-scroll-bar: 2.3.6(@types/react@18.3.8)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.8)(react@18.3.1) tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.3.7)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.7)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.8)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.8)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -16871,14 +16979,14 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-style-singleton@2.2.1(@types/react@18.3.7)(react@18.3.1): + react-style-singleton@2.2.1(@types/react@18.3.8)(react@18.3.1): dependencies: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 react-virtuoso@4.10.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -17092,7 +17200,7 @@ snapshots: transitivePeerDependencies: - supports-color - remark-rehype@11.1.0: + remark-rehype@11.1.1: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -17314,12 +17422,12 @@ snapshots: interpret: 1.4.0 rechoir: 0.6.2 - shiki@1.17.7: + shiki@1.18.0: dependencies: - '@shikijs/core': 1.17.7 - '@shikijs/engine-javascript': 1.17.7 - '@shikijs/engine-oniguruma': 1.17.7 - '@shikijs/types': 1.17.7 + '@shikijs/core': 1.18.0 + '@shikijs/engine-javascript': 1.18.0 + '@shikijs/engine-oniguruma': 1.18.0 + '@shikijs/types': 1.18.0 '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 @@ -17581,11 +17689,11 @@ snapshots: tailwind-merge@2.5.2: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.11): + tailwindcss-animate@1.0.7(tailwindcss@3.4.12): dependencies: - tailwindcss: 3.4.11 + tailwindcss: 3.4.12 - tailwindcss@3.4.11: + tailwindcss@3.4.12: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -17674,11 +17782,11 @@ snapshots: tinyspy@3.0.0: {} - tldts-core@6.1.46: {} + tldts-core@6.1.47: {} - tldts@6.1.46: + tldts@6.1.47: dependencies: - tldts-core: 6.1.46 + tldts-core: 6.1.47 tmp-promise@3.0.3: dependencies: @@ -17793,11 +17901,11 @@ snapshots: type-fest@4.26.1: {} - typescript-eslint@8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): + typescript-eslint@8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@typescript-eslint/parser': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/parser': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.6))(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -17926,31 +18034,31 @@ snapshots: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.2(@types/react@18.3.7)(react@18.3.1): + use-callback-ref@1.3.2(@types/react@18.3.8)(react@18.3.1): dependencies: react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 use-context-selector@2.0.0(react@18.3.1)(scheduler@0.23.2): dependencies: react: 18.3.1 scheduler: 0.23.2 - use-isomorphic-layout-effect@1.1.2(@types/react@18.3.7)(react@18.3.1): + use-isomorphic-layout-effect@1.1.2(@types/react@18.3.8)(react@18.3.1): dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 - use-sidecar@1.1.2(@types/react@18.3.7)(react@18.3.1): + use-sidecar@1.1.2(@types/react@18.3.8)(react@18.3.1): dependencies: detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 use-sync-external-store@1.2.2(react@18.3.1): dependencies: @@ -18012,7 +18120,7 @@ snapshots: debug: 4.3.7 pathe: 1.1.2 tinyrainbow: 1.2.0 - vite: 5.4.6(@types/node@22.5.5)(terser@5.32.0) + vite: 5.4.7(@types/node@22.5.5)(terser@5.32.0) transitivePeerDependencies: - '@types/node' - less @@ -18024,28 +18132,28 @@ snapshots: - supports-color - terser - vite-plugin-mkcert@1.17.6(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0)): + vite-plugin-mkcert@1.17.6(vite@5.4.7(@types/node@22.5.5)(terser@5.32.0)): dependencies: '@octokit/rest': 20.1.1 axios: 1.7.7(debug@4.3.7) debug: 4.3.7 picocolors: 1.1.0 - vite: 5.4.6(@types/node@22.5.5)(terser@5.32.0) + vite: 5.4.7(@types/node@22.5.5)(terser@5.32.0) transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.0.1(typescript@5.6.2)(vite@5.4.6(@types/node@22.5.5)(terser@5.32.0)): + vite-tsconfig-paths@5.0.1(typescript@5.6.2)(vite@5.4.7(@types/node@22.5.5)(terser@5.32.0)): dependencies: debug: 4.3.7 globrex: 0.1.2 tsconfck: 3.1.1(typescript@5.6.2) optionalDependencies: - vite: 5.4.6(@types/node@22.5.5)(terser@5.32.0) + vite: 5.4.7(@types/node@22.5.5)(terser@5.32.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.6(@types/node@22.5.5)(terser@5.32.0): + vite@5.4.7(@types/node@22.5.5)(terser@5.32.0): dependencies: esbuild: 0.21.5 postcss: 8.4.47 @@ -18073,7 +18181,7 @@ snapshots: tinybench: 2.9.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.6(@types/node@22.5.5)(terser@5.32.0) + vite: 5.4.7(@types/node@22.5.5)(terser@5.32.0) vite-node: 2.0.5(@types/node@22.5.5)(terser@5.32.0) why-is-node-running: 2.3.0 optionalDependencies: @@ -18221,11 +18329,11 @@ snapshots: zod@3.23.8: {} - zustand@4.5.5(@types/react@18.3.7)(immer@10.1.1(patch_hash=og7mbnoo5vh43tjlw5rbmrdbvu))(react@18.3.1): + zustand@4.5.5(@types/react@18.3.8)(immer@10.1.1(patch_hash=og7mbnoo5vh43tjlw5rbmrdbvu))(react@18.3.1): dependencies: use-sync-external-store: 1.2.2(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.8 immer: 10.1.1(patch_hash=og7mbnoo5vh43tjlw5rbmrdbvu) react: 18.3.1 From cea7f4a95ab7336c85613cc551c48639e20b2b9d Mon Sep 17 00:00:00 2001 From: Kieran Cui <78460423+cuikaipeng@users.noreply.github.com> Date: Sat, 21 Sep 2024 18:39:11 +0800 Subject: [PATCH 09/47] fix: regarding the style issue of selecting subscription types using the Tab and arrow keys (#525) * fix: The problem with the display of the right content area When switching subscription types, the right side may briefly show the content of the previous type before displaying the current type's content after the data request is completed. * fix:Regarding the style issue of selecting subscription types using the Tab and arrow keys When a subscription type is selected with the mouse and then switched using the tab key or arrow keys, the background color of the subscription type does not change correctly, always remaining dark for the initially clicked type. I noticed in the code that the style includes focus-visible:bg-zinc-500/30 focus-visible:!outline-none which suggests that the intended behavior is for the background color to change based on the currently focused subscription type when using the tab key or arrow keys. However, the focus-visible style may not be applied correctly due to keyboard event listeners in the code. To address this, I introduced a variable to track whether the switch is made via the tab key or arrow keys. --------- Co-authored-by: Stephen Zhou Co-authored-by: Innei --- apps/renderer/src/components/ui/button/index.tsx | 2 +- apps/renderer/src/modules/feed-column/index.tsx | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/renderer/src/components/ui/button/index.tsx b/apps/renderer/src/components/ui/button/index.tsx index e25826916..c68a03805 100644 --- a/apps/renderer/src/components/ui/button/index.tsx +++ b/apps/renderer/src/components/ui/button/index.tsx @@ -62,7 +62,7 @@ export const ActionButton = React.forwardRef< className={cn( "no-drag-region inline-flex size-8 items-center justify-center text-xl", active && "bg-zinc-500/15 hover:bg-zinc-500/20", - "focus-visible:bg-zinc-500/30 focus-visible:!outline-none", + //"focus-visible:bg-zinc-500/30 focus-visible:!outline-none", "rounded-md duration-200 hover:bg-theme-button-hover data-[state=open]:bg-theme-button-hover", "disabled:cursor-not-allowed disabled:opacity-50", className, diff --git a/apps/renderer/src/modules/feed-column/index.tsx b/apps/renderer/src/modules/feed-column/index.tsx index f23e14fa5..f33dd963d 100644 --- a/apps/renderer/src/modules/feed-column/index.tsx +++ b/apps/renderer/src/modules/feed-column/index.tsx @@ -88,10 +88,12 @@ export function FeedColumn({ children, className }: PropsWithChildren<{ classNam } }, [setActive_]) + const [useHotkeysSwitch, setUseHotkeysSwitch] = useState(false) useHotkeys( shortcuts.feeds.switchBetweenViews.key, (e) => { e.preventDefault() + setUseHotkeysSwitch(true) if (isHotkeyPressed("Left")) { setActive((i) => { if (i === 0) { @@ -161,9 +163,11 @@ export function FeedColumn({ children, className }: PropsWithChildren<{ classNam "flex flex-col items-center gap-1 text-xl", ELECTRON ? "hover:!bg-theme-vibrancyBg" : "", showSidebarUnreadCount && "h-11", + active === index && useHotkeysSwitch ? "bg-zinc-500/30" : "", )} onClick={(e) => { setActive(index) + setUseHotkeysSwitch(false) e.stopPropagation() }} > From 8f3acd648eab7f44f61c1685b996f02cfe8cc443 Mon Sep 17 00:00:00 2001 From: Innei Date: Sat, 21 Sep 2024 19:28:52 +0800 Subject: [PATCH 10/47] fix: split entry history api and accurate count Signed-off-by: Innei --- .../components/EntryReadHistory.tsx | 78 +++++++++---------- .../feeds/[feedId]/[entryId]/index.tsx | 13 ++-- .../(main)/(layer)/feeds/[feedId]/layout.tsx | 10 ++- apps/renderer/src/pages/(main)/layout.tsx | 20 +++-- .../app-grid-layout-container-provider.tsx | 42 ++++++++++ .../src/store/entry-history/action.ts | 24 +++--- apps/renderer/src/store/entry/store.ts | 7 +- packages/shared/src/hono.ts | 13 +--- 8 files changed, 118 insertions(+), 89 deletions(-) create mode 100644 apps/renderer/src/providers/app-grid-layout-container-provider.tsx diff --git a/apps/renderer/src/modules/entry-content/components/EntryReadHistory.tsx b/apps/renderer/src/modules/entry-content/components/EntryReadHistory.tsx index a21b3cc0d..3f09a955f 100644 --- a/apps/renderer/src/modules/entry-content/components/EntryReadHistory.tsx +++ b/apps/renderer/src/modules/entry-content/components/EntryReadHistory.tsx @@ -5,13 +5,14 @@ import { HoverCardTrigger, } from "@radix-ui/react-hover-card" import clsx from "clsx" -import { LayoutGroup, m } from "framer-motion" -import { memo, useEffect, useState } from "react" +import { m } from "framer-motion" +import { memo } from "react" import { useWhoami } from "~/atoms/user" import { Avatar, AvatarFallback, AvatarImage } from "~/components/ui/avatar" import { Tooltip, TooltipContent, TooltipPortal, TooltipTrigger } from "~/components/ui/tooltip" import { useAuthQuery } from "~/hooks/common" +import { useAppLayoutGridContainerWidth } from "~/providers/app-grid-layout-container-provider" import { Queries } from "~/queries" import { useEntryReadHistory } from "~/store/entry" import { useUserById } from "~/store/user" @@ -22,20 +23,14 @@ export const EntryReadHistory: Component<{ entryId: string }> = ({ entryId }) => const me = useWhoami() const entryHistory = useEntryReadHistory(entryId) - const [isEnabledPolling, setIsEnabledPolling] = useState(false) - useAuthQuery(Queries.entries.entryReadingHistory(entryId), { + const { data } = useAuthQuery(Queries.entries.entryReadingHistory(entryId), { refetchInterval: 1000 * 60, - enabled: isEnabledPolling, }) - useEffect(() => { - const timer = setTimeout(() => { - setIsEnabledPolling(true) - }, 1000 * 60) + const totalCount = data?.total || 0 - return () => { - clearTimeout(timer) - } - }, [entryId]) + const appGirdContainerWidth = useAppLayoutGridContainerWidth() + + const LIMIT = appGirdContainerWidth > 600 ? 10 : 5 if (!entryHistory) return null if (!me) return null @@ -43,36 +38,32 @@ export const EntryReadHistory: Component<{ entryId: string }> = ({ entryId }) => return (
- - {entryHistory.userIds - .filter((id) => id !== me?.id) - .slice(0, 10) + {entryHistory.userIds + .filter((id) => id !== me?.id) + .slice(0, LIMIT) - .map((userId, i) => ( - - ))} - + .map((userId, i) => ( + + ))} - {entryHistory.readCount && - entryHistory.readCount > 10 && - entryHistory.userIds && - entryHistory.userIds.length >= 10 && ( - - - - + {!!totalCount && totalCount > LIMIT && ( + + + + + {totalCount > LIMIT && ( = ({ entryId }) =>
    {entryHistory.userIds .filter((id) => id !== me?.id) - .slice(10) + .slice(LIMIT) .map((userId) => ( ))}
-
- )} + )} +
+ )}
) } diff --git a/apps/renderer/src/pages/(main)/(layer)/feeds/[feedId]/[entryId]/index.tsx b/apps/renderer/src/pages/(main)/(layer)/feeds/[feedId]/[entryId]/index.tsx index 302a6fa21..e598bc25e 100644 --- a/apps/renderer/src/pages/(main)/(layer)/feeds/[feedId]/[entryId]/index.tsx +++ b/apps/renderer/src/pages/(main)/(layer)/feeds/[feedId]/[entryId]/index.tsx @@ -4,6 +4,7 @@ import { useParams } from "react-router-dom" import { ROUTE_ENTRY_PENDING, views } from "~/constants" import { useRouteView } from "~/hooks/biz/useRouteParams" import { EntryContent } from "~/modules/entry-content" +import { AppLayoutGridContainerProvider } from "~/providers/app-grid-layout-container-provider" export const Component = () => { const { entryId } = useParams() @@ -11,11 +12,13 @@ export const Component = () => { const inWideMode = view ? views[view].wideMode : false return ( - {!inWideMode && ( -
- -
- )} + + {!inWideMode && ( +
+ +
+ )} +
) } diff --git a/apps/renderer/src/pages/(main)/(layer)/feeds/[feedId]/layout.tsx b/apps/renderer/src/pages/(main)/(layer)/feeds/[feedId]/layout.tsx index 73585cdda..3efa90a13 100644 --- a/apps/renderer/src/pages/(main)/(layer)/feeds/[feedId]/layout.tsx +++ b/apps/renderer/src/pages/(main)/(layer)/feeds/[feedId]/layout.tsx @@ -2,12 +2,13 @@ import { useMemo, useRef } from "react" import { useResizable } from "react-resizable-layout" import { Outlet } from "react-router-dom" -import { getUISettings, setUISetting } from "~/atoms/settings/ui" +import { getUISettings, setUISetting, useUISettingKey } from "~/atoms/settings/ui" import { PanelSplitter } from "~/components/ui/divider" import { views } from "~/constants" import { useRouteParams } from "~/hooks/biz/useRouteParams" import { cn, isSafari } from "~/lib/utils" import { EntryColumn } from "~/modules/entry-column" +import { AppLayoutGridContainerProvider } from "~/providers/app-grid-layout-container-provider" export function Component() { const containerRef = useRef(null) @@ -17,11 +18,12 @@ export function Component() { const entryColWidth = useMemo(() => getUISettings().entryColWidth, []) const { view } = useRouteParams() const inWideMode = view ? views[view].wideMode : false + const feedColumnWidth = useUISettingKey("feedColWidth") const { position, separatorProps, isDragging, separatorCursor } = useResizable({ axis: "x", // FIXME: Less than this width causes grid images to overflow on safari min: isSafari() ? 356 : 300, - max: 450, + max: Math.max((window.innerWidth - feedColumnWidth) / 2, 600), initial: entryColWidth, containerRef, onResizeEnd({ position }) { @@ -37,7 +39,9 @@ export function Component() { width: position, }} > - + + +
{!inWideMode && ( diff --git a/apps/renderer/src/pages/(main)/layout.tsx b/apps/renderer/src/pages/(main)/layout.tsx index e0e65b87e..7a264e37f 100644 --- a/apps/renderer/src/pages/(main)/layout.tsx +++ b/apps/renderer/src/pages/(main)/layout.tsx @@ -33,6 +33,7 @@ import { useShortcutsModal } from "~/modules/modal/shortcuts" import { CmdF } from "~/modules/panel/cmdf" import { SearchCmdK } from "~/modules/panel/cmdk" import { CmdNTrigger } from "~/modules/panel/cmdn" +import { AppLayoutGridContainerProvider } from "~/providers/app-grid-layout-container-provider" const FooterInfo = () => { const { t } = useTranslation() @@ -84,16 +85,19 @@ export function Component() { > {!import.meta.env.PROD && } - - - - + + + + + - {ELECTRON && } + {ELECTRON && } + + + + + - - -
(0) + +export const AppLayoutGridContainerProvider: FC = ({ children }) => { + const [width, setWidth] = useState(0) + const ref = useRef(null) + useLayoutEffect(() => { + const $first = ref.current?.firstElementChild + if (!$first) return + const handler = throttle(() => { + if (!$first) return + + const { width } = $first.getBoundingClientRect() + setWidth(width) + }, 100) + + handler() + + const resizeObserver = new ResizeObserver(handler) + resizeObserver.observe($first) + return () => { + resizeObserver.disconnect() + } + }, []) + + return ( + +
+ {children} +
+
+ ) +} + +export const useAppLayoutGridContainerWidth = () => { + const width = useContext(AppLayoutGridContainerWidthContext) + return width +} diff --git a/apps/renderer/src/store/entry-history/action.ts b/apps/renderer/src/store/entry-history/action.ts index 376efddac..c3b63e267 100644 --- a/apps/renderer/src/store/entry-history/action.ts +++ b/apps/renderer/src/store/entry-history/action.ts @@ -1,24 +1,24 @@ import { apiClient } from "~/lib/api-fetch" -import type { UserModel } from "~/models" import { entryActions } from "../entry/store" import { userActions } from "../user" class EntryHistoryActions { async fetchEntryHistory(entryId: string) { - const res = await apiClient.entries["read-histories"][entryId].$get() - - const data = res.data as { - users: Record - entryReadHistories: { - entryId: string - userIds: string[] - readCount: number - } - } + const { data } = await apiClient.entries["read-histories"][":id"].$get({ + param: { + id: entryId, + }, + query: { + page: "1", + size: "100", + }, + }) userActions.upsert(data.users) - entryActions.updateReadHistory(entryId, data.entryReadHistories) + if (data.entryReadHistories) { + entryActions.updateReadHistory(entryId, data.entryReadHistories) + } return data } diff --git a/apps/renderer/src/store/entry/store.ts b/apps/renderer/src/store/entry/store.ts index 7a89cd903..de83dbeaf 100644 --- a/apps/renderer/src/store/entry/store.ts +++ b/apps/renderer/src/store/entry/store.ts @@ -5,13 +5,12 @@ import { isNil, merge, omit } from "lodash-es" import { runTransactionInScope } from "~/database" import { apiClient } from "~/lib/api-fetch" import { getEntriesParams, omitObjectUndefinedValue } from "~/lib/utils" -import type { CombinedEntryModel, EntryModel, FeedModel, UserModel } from "~/models" +import type { CombinedEntryModel, EntryModel, FeedModel } from "~/models" import { EntryService } from "~/services" import { feedActions } from "../feed" import { imageActions } from "../image" import { feedUnreadActions } from "../unread" -import { userActions } from "../user" import { createZustandStore, doMutationAndTransaction } from "../utils/helper" import { internal_batchMarkRead } from "./helper" import type { EntryState, FlatEntryModel } from "./types" @@ -63,10 +62,6 @@ class EntryActions { omit(data, "read") as any, ]) feedActions.upsertMany([data.feeds]) - userActions.upsert(data.users as Record) - if (data.entryReadHistories) { - this.updateReadHistory(entryId, data.entryReadHistories) - } } return data diff --git a/packages/shared/src/hono.ts b/packages/shared/src/hono.ts index ef708be2a..ae3a5ec8f 100644 --- a/packages/shared/src/hono.ts +++ b/packages/shared/src/hono.ts @@ -3218,6 +3218,7 @@ declare const _routes: hono_hono_base.HonoBase Date: Sat, 21 Sep 2024 19:30:49 +0800 Subject: [PATCH 11/47] fix: format --- .../src/providers/app-grid-layout-container-provider.tsx | 1 - 1 file changed, 1 deletion(-) 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 071ed27cc..3e1a9472c 100644 --- a/apps/renderer/src/providers/app-grid-layout-container-provider.tsx +++ b/apps/renderer/src/providers/app-grid-layout-container-provider.tsx @@ -2,7 +2,6 @@ import { throttle } from "lodash-es" import type { FC, PropsWithChildren } from "react" import { createContext, useContext, useLayoutEffect, useRef, useState } from "react" - const AppLayoutGridContainerWidthContext = createContext(0) export const AppLayoutGridContainerProvider: FC = ({ children }) => { From cdec3510352cc7281e75ef1957e32bc6e712cf04 Mon Sep 17 00:00:00 2001 From: Innei Date: Sat, 21 Sep 2024 20:44:42 +0800 Subject: [PATCH 12/47] fix: add tooltip for resize panel Signed-off-by: Innei --- .../components/ui/divider/PanelSpliter.tsx | 37 ++++++++++++++----- apps/renderer/src/constants/shortcuts.ts | 2 +- .../src/modules/feed-column/header.tsx | 10 ++++- apps/renderer/src/pages/(main)/layout.tsx | 37 ++++++++++++++++--- locales/app/en.json | 2 + 5 files changed, 71 insertions(+), 17 deletions(-) diff --git a/apps/renderer/src/components/ui/divider/PanelSpliter.tsx b/apps/renderer/src/components/ui/divider/PanelSpliter.tsx index adeb23c1c..84325904a 100644 --- a/apps/renderer/src/components/ui/divider/PanelSpliter.tsx +++ b/apps/renderer/src/components/ui/divider/PanelSpliter.tsx @@ -1,14 +1,19 @@ import * as React from "react" +import { useMeasure } from "~/hooks/common" import { cn } from "~/lib/utils" +import { Tooltip, TooltipContent, TooltipTrigger } from "../tooltip" + export const PanelSplitter = ( props: React.DetailedHTMLProps, HTMLDivElement> & { isDragging?: boolean cursor?: string + + tooltip?: React.ReactNode }, ) => { - const { isDragging, cursor, ...rest } = props + const { isDragging, cursor, tooltip, ...rest } = props React.useEffect(() => { if (!isDragging) return @@ -26,16 +31,30 @@ export const PanelSplitter = ( } }, [cursor, isDragging]) + const [ref, { height }] = useMeasure() + + const El = ( +
+ ) + return (
-
+ {tooltip ? ( + + {El} + {tooltip} + + ) : ( + El + )}
) } diff --git a/apps/renderer/src/constants/shortcuts.ts b/apps/renderer/src/constants/shortcuts.ts index 80d0ed4aa..38efb5e1b 100644 --- a/apps/renderer/src/constants/shortcuts.ts +++ b/apps/renderer/src/constants/shortcuts.ts @@ -18,7 +18,7 @@ export const shortcuts = { layout: { toggleSidebar: { name: "keys.layout.toggleSidebar", - key: "Meta+B", + key: "Meta+B, [", }, showShortcuts: { name: "keys.layout.showShortcuts", diff --git a/apps/renderer/src/modules/feed-column/header.tsx b/apps/renderer/src/modules/feed-column/header.tsx index e2a87dddf..f91331c1d 100644 --- a/apps/renderer/src/modules/feed-column/header.tsx +++ b/apps/renderer/src/modules/feed-column/header.tsx @@ -1,6 +1,6 @@ import { m } from "framer-motion" import type { FC, PropsWithChildren } from "react" -import { memo, useCallback, useRef, useState } from "react" +import { memo, useCallback, useEffect, useRef, useState } from "react" import { useTranslation } from "react-i18next" import { Link } from "react-router-dom" import { toast } from "sonner" @@ -77,10 +77,16 @@ export const FeedColumnHeader = memo(() => { const LayoutActionButton = () => { const feedColumnShow = useFeedColumnShow() - const [animation] = useState({ + const [animation, setAnimation] = useState({ width: !feedColumnShow ? "auto" : 0, }) + useEffect(() => { + setAnimation({ + width: !feedColumnShow ? "auto" : 0, + }) + }, [feedColumnShow]) + const t = useI18n() return ( diff --git a/apps/renderer/src/pages/(main)/layout.tsx b/apps/renderer/src/pages/(main)/layout.tsx index 7a264e37f..a34dea0f5 100644 --- a/apps/renderer/src/pages/(main)/layout.tsx +++ b/apps/renderer/src/pages/(main)/layout.tsx @@ -4,7 +4,7 @@ import { throttle } from "lodash-es" import type { PropsWithChildren } from "react" import React, { useEffect, useRef, useState } from "react" import { useHotkeys } from "react-hotkeys-hook" -import { useTranslation } from "react-i18next" +import { Trans, useTranslation } from "react-i18next" import { useResizable } from "react-resizable-layout" import { Outlet } from "react-router-dom" @@ -15,12 +15,14 @@ import { useLoginModalShow, useWhoami } from "~/atoms/user" import { AppErrorBoundary } from "~/components/common/AppErrorBoundary" import { ErrorComponentType } from "~/components/errors/enum" import { PanelSplitter } from "~/components/ui/divider" +import { Kbd } from "~/components/ui/kbd/Kbd" import { DeclarativeModal } from "~/components/ui/modal/stacked/declarative-modal" import { NoopChildren } from "~/components/ui/modal/stacked/utils" import { RootPortal } from "~/components/ui/portal" import { HotKeyScopeMap } from "~/constants" import { shortcuts } from "~/constants/shortcuts" import { useDailyTask } from "~/hooks/biz/useDailyTask" +import { useI18n } from "~/hooks/common" import { preventDefault } from "~/lib/dom" import { cn } from "~/lib/utils" import { EnvironmentIndicator } from "~/modules/app/EnvironmentIndicator" @@ -200,6 +202,7 @@ const FeedResponsiveResizerContainer = ({ timer = clearTimeout(timer) } }, [feedColumnShow]) + const t = useI18n() return ( <> @@ -217,9 +220,6 @@ const FeedResponsiveResizerContainer = ({ "--fo-feed-col-w": `${position}px`, }} > - {/* {React.cloneElement(children, { - className: "!bg-native", - })} */} {children}
@@ -231,7 +231,34 @@ const FeedResponsiveResizerContainer = ({ /> {delayShowSplitter && ( - + { + setFeedColumnShow(false) + }} + tooltip={ + !isDragging && ( + <> +
+ {/* Drag to resize */} + }} /> +
+
+ + }} + /> + {" "} + {"["} +
+ + ) + } + /> )} ) diff --git a/locales/app/en.json b/locales/app/en.json index eade1ec5c..7a428a993 100644 --- a/locales/app/en.json +++ b/locales/app/en.json @@ -127,6 +127,8 @@ "player.playback_rate": "Playback Rate", "player.unmute": "Unmute", "player.volume": "Volume", + "resize.tooltip.double_click_to_collapse": "Double click to collapse", + "resize.tooltip.drag_to_resize": "Drag to resize", "search.empty.no_results": "No results found.", "search.group.entries": "Entries", "search.group.feeds": "Feeds", From b752a60db6db302c2ac3860a94993d75c29785be Mon Sep 17 00:00:00 2001 From: Innei Date: Sat, 21 Sep 2024 20:51:56 +0800 Subject: [PATCH 13/47] feat: add resize indicator Signed-off-by: Innei --- apps/renderer/src/components/icons/resize.tsx | 12 ++++++++++++ apps/renderer/src/modules/settings/modal/layout.tsx | 7 +++++-- 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 apps/renderer/src/components/icons/resize.tsx diff --git a/apps/renderer/src/components/icons/resize.tsx b/apps/renderer/src/components/icons/resize.tsx new file mode 100644 index 000000000..dd8507a79 --- /dev/null +++ b/apps/renderer/src/components/icons/resize.tsx @@ -0,0 +1,12 @@ +import type { SVGProps } from "react" + +export function LetsIconsResizeDownRightLight(props: SVGProps) { + return ( + + + + + + + ) +} diff --git a/apps/renderer/src/modules/settings/modal/layout.tsx b/apps/renderer/src/modules/settings/modal/layout.tsx index a29a0546d..5c8b4c13a 100644 --- a/apps/renderer/src/modules/settings/modal/layout.tsx +++ b/apps/renderer/src/modules/settings/modal/layout.tsx @@ -6,6 +6,7 @@ import { Suspense, useCallback, useEffect, useRef } from "react" import { useUISettingSelector } from "~/atoms/settings/ui" import { m } from "~/components/common/Motion" import { Logo } from "~/components/icons/logo" +import { LetsIconsResizeDownRightLight } from "~/components/icons/resize" import { useResizeableModal } from "~/components/ui/modal" import { preventDefault } from "~/lib/dom" import { cn } from "~/lib/utils" @@ -62,7 +63,7 @@ export function SettingModalLayout( scale: 0.96, }} className={cn( - "relative flex overflow-hidden rounded-xl border border-border", + "relative flex overflow-hidden rounded-xl rounded-br-none border border-border", !overlay && "shadow-perfect", )} style={resizeableStyle} @@ -98,7 +99,7 @@ export function SettingModalLayout( )}
-
+
{APP_NAME}
@@ -125,6 +126,8 @@ export function SettingModalLayout( {children}
+ + From 23e428ad30d5df968e881462a699fdf40db43131 Mon Sep 17 00:00:00 2001 From: Innei Date: Sat, 21 Sep 2024 21:47:51 +0800 Subject: [PATCH 14/47] fix: panel spliter zindex Signed-off-by: Innei --- apps/renderer/src/components/ui/divider/PanelSpliter.tsx | 2 +- apps/renderer/src/styles/tailwind-extend.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/renderer/src/components/ui/divider/PanelSpliter.tsx b/apps/renderer/src/components/ui/divider/PanelSpliter.tsx index 84325904a..607dac7ee 100644 --- a/apps/renderer/src/components/ui/divider/PanelSpliter.tsx +++ b/apps/renderer/src/components/ui/divider/PanelSpliter.tsx @@ -39,7 +39,7 @@ export const PanelSplitter = ( ref={ref} {...rest} className={cn( - "absolute inset-0 z-[11] w-[2px] -translate-x-1/2 cursor-ew-resize bg-transparent hover:bg-gray-400 active:!bg-accent hover:dark:bg-neutral-500", + "absolute inset-0 z-[1] w-[2px] -translate-x-1/2 cursor-ew-resize bg-transparent hover:bg-gray-400 active:!bg-accent hover:dark:bg-neutral-500", isDragging ? "bg-accent" : "", )} /> diff --git a/apps/renderer/src/styles/tailwind-extend.css b/apps/renderer/src/styles/tailwind-extend.css index 2f3333145..65be9b392 100644 --- a/apps/renderer/src/styles/tailwind-extend.css +++ b/apps/renderer/src/styles/tailwind-extend.css @@ -75,7 +75,7 @@ border-width: 1px; border-color: var(--fallback-bc, theme(colors.theme.accent.DEFAULT)); - --bc: theme(colors.accent.foreground); + --bc: theme(colors.background); --fallback-bc: var(--bc); --chkbg: var(--bc); --fallback-b1: theme(colors.background); From ffcc6c90d53b372d2d180f53d32fa47dff9daac4 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sat, 21 Sep 2024 21:57:30 +0800 Subject: [PATCH 15/47] feat: lists (#533) * feat: lists and feeds sub title in feed column * feat: lists setting panel * fix: imports * fix: avatar align in profile setting * fix: styles in settings * feat: lists setting table * feat: list and listsubscription types * feat: target model * fix: target model types errors * feat: seperate feed list and list list * feat: edit lists * feat: lists feeds management * feat: new feed column * feat: use feedId for single feed entries request * fix: lists feedId * feat: disable invalid functions for lists * feat: discover target selector * feat: list follow modal * feat: feed icon text size * feat: use list get api * feat: lists edit action * fix: radio color * fix: radio click area * feat: list external page * feat: hide mark all action for list * feat: lists unread * fix: types * fix: add tooltip for resize panel Signed-off-by: Innei * feat: add resize indicator Signed-off-by: Innei * fix: hide section when no lists Signed-off-by: Innei --------- Signed-off-by: Innei Co-authored-by: Innei --- apps/renderer/src/components/feed-icon.tsx | 64 +- apps/renderer/src/components/feed-summary.tsx | 18 +- .../ui/markdown/renderers/MarkdownLink.tsx | 4 +- .../src/components/ui/radio-group/Radio.tsx | 9 +- apps/renderer/src/database/schemas/feed.ts | 4 +- .../renderer/src/hooks/biz/useFeedActions.tsx | 92 +- .../src/hooks/biz/useSubscriptionActions.tsx | 3 +- apps/renderer/src/lib/utils.ts | 6 +- apps/renderer/src/models/types.ts | 36 +- .../src/modules/claim/feed-claim-modal.tsx | 3 +- .../src/modules/discover/feed-form.tsx | 96 +- apps/renderer/src/modules/discover/form.tsx | 56 +- apps/renderer/src/modules/discover/import.tsx | 3 +- .../modules/entry-column/hooks/useMarkAll.ts | 12 +- .../src/modules/entry-column/index.tsx | 13 +- .../entry-column/layouts/EntryListHeader.tsx | 41 +- .../src/modules/entry-column/types.ts | 4 +- .../src/modules/entry-content/index.tsx | 4 +- .../src/modules/feed-column/category.tsx | 4 +- .../src/modules/feed-column/header.tsx | 7 - .../renderer/src/modules/feed-column/item.tsx | 29 +- .../renderer/src/modules/feed-column/list.tsx | 72 +- .../src/modules/feed-column/unread-number.tsx | 16 +- apps/renderer/src/modules/panel/cmdk.tsx | 4 +- apps/renderer/src/modules/profile/hooks.ts | 2 +- .../modules/profile/profile-setting-form.tsx | 13 +- .../modules/profile/user-profile-modal.tsx | 1 + .../src/modules/settings/tabs/feeds.tsx | 2 + .../src/modules/settings/tabs/lists.tsx | 455 +++++ .../wallet/my-wallet-section/withdraw.tsx | 1 - .../(with-layout)/feed/[id]/index.tsx | 13 +- .../(with-layout)/list/[id]/index.tsx | 70 + .../(with-layout)/profile/[id]/index.tsx | 92 +- .../src/pages/settings/(settings)/feeds.tsx | 2 +- .../pages/settings/(settings)/integration.tsx | 2 +- .../pages/settings/(settings)/invitations.tsx | 2 +- .../src/pages/settings/(settings)/list.tsx | 21 + .../src/pages/settings/(settings)/profile.tsx | 2 +- .../pages/settings/(settings)/shortcuts.tsx | 2 +- .../src/pages/settings/(settings)/wallet.tsx | 2 +- apps/renderer/src/queries/feed.ts | 6 +- apps/renderer/src/queries/index.ts | 2 + apps/renderer/src/queries/lists.ts | 9 + apps/renderer/src/services/cleaner.spec.ts | 4 +- apps/renderer/src/services/feed.ts | 14 +- apps/renderer/src/store/entry/store.ts | 4 +- apps/renderer/src/store/feed/hooks.ts | 8 +- apps/renderer/src/store/feed/store.ts | 50 +- apps/renderer/src/store/feed/types.ts | 10 +- apps/renderer/src/store/search/index.ts | 1 + apps/renderer/src/store/search/types.ts | 4 +- apps/renderer/src/store/subscription/store.ts | 48 +- icons/mgc/compass_cute_fi.svg | 1 + icons/mgc/edit_cute_re.svg | 1 + icons/mgc/inbox_cute_re.svg | 1 + icons/mgc/rada_cute_fi.svg | 1 + icons/mgc/rada_cute_re.svg | 1 + locales/app/en.json | 13 + locales/external/en.json | 3 + locales/settings/en.json | 27 + packages/shared/src/hono.ts | 1523 +++++++++++++---- 61 files changed, 2361 insertions(+), 652 deletions(-) create mode 100644 apps/renderer/src/modules/settings/tabs/lists.tsx create mode 100644 apps/renderer/src/pages/(external)/(with-layout)/list/[id]/index.tsx create mode 100644 apps/renderer/src/pages/settings/(settings)/list.tsx create mode 100644 apps/renderer/src/queries/lists.ts create mode 100644 icons/mgc/compass_cute_fi.svg create mode 100644 icons/mgc/edit_cute_re.svg create mode 100644 icons/mgc/inbox_cute_re.svg create mode 100644 icons/mgc/rada_cute_fi.svg create mode 100644 icons/mgc/rada_cute_re.svg diff --git a/apps/renderer/src/components/feed-icon.tsx b/apps/renderer/src/components/feed-icon.tsx index 1eb7fa7f0..30c3b84a4 100644 --- a/apps/renderer/src/components/feed-icon.tsx +++ b/apps/renderer/src/components/feed-icon.tsx @@ -5,7 +5,7 @@ import { forwardRef, useMemo } from "react" import { getColorScheme, stringToHue } from "~/lib/color" import { getImageProxyUrl } from "~/lib/img-proxy" import { cn, getUrlIcon } from "~/lib/utils" -import type { CombinedEntryModel, FeedModel } from "~/models" +import type { CombinedEntryModel, FeedModel, TargetModel } from "~/models" import { PlatformIcon } from "./ui/platform-icon" @@ -75,7 +75,7 @@ export function FeedIcon({ siteUrl, useMedia, }: { - feed?: FeedModel + feed?: TargetModel entry?: CombinedEntryModel["entries"] fallbackUrl?: string className?: string @@ -98,8 +98,8 @@ export function FeedIcon({ } const colors = useMemo( - () => getColorScheme(stringToHue(feed?.title || feed?.url || siteUrl!), true), - [feed?.title, feed?.url, siteUrl], + () => getColorScheme(stringToHue(feed?.title || (feed as FeedModel)?.url || siteUrl!), true), + [feed?.title, (feed as FeedModel)?.url, siteUrl], ) let ImageElement: ReactNode let finalSrc = "" @@ -109,6 +109,32 @@ export function FeedIcon({ height: size, } + const fallbackIcon = ( + + + {!!feed?.title && feed.title[0]} + + + ) + switch (true) { case !feed && !!siteUrl: { const [src] = getFeedIconSrc({ @@ -137,9 +163,9 @@ export function FeedIcon({ break } case !!fallbackUrl: - case !!feed?.siteUrl: { + case !!(feed as FeedModel)?.siteUrl: { const [src, fallbackSrc] = getFeedIconSrc({ - siteUrl: feed?.siteUrl || fallbackUrl, + siteUrl: (feed as FeedModel)?.siteUrl || fallbackUrl, fallback, proxy: { width: size * 2, @@ -150,7 +176,7 @@ export function FeedIcon({ ImageElement = ( @@ -163,6 +189,10 @@ export function FeedIcon({ ) break } + case !!feed?.title && !!feed.title[0]: { + ImageElement = fallbackIcon + break + } default: { ImageElement = break @@ -183,25 +213,7 @@ export function FeedIcon({ > {ImageElement} - - - {!!feed?.title && feed.title[0]} - - + {fallbackIcon} ) } diff --git a/apps/renderer/src/components/feed-summary.tsx b/apps/renderer/src/components/feed-summary.tsx index 623a65adb..ef5550533 100644 --- a/apps/renderer/src/components/feed-summary.tsx +++ b/apps/renderer/src/components/feed-summary.tsx @@ -1,6 +1,8 @@ +import { WEB_URL } from "@follow/shared/constants" + import { FeedIcon } from "~/components/feed-icon" import { cn } from "~/lib/utils" -import type { FeedModel } from "~/models" +import type { TargetModel } from "~/models" import { FeedCertification } from "./feed-certification" import { EllipsisHorizontalTextWithTooltip } from "./ui/typography" @@ -10,14 +12,14 @@ export function FollowSummary({ docs, className, }: { - feed: FeedModel + feed: TargetModel docs?: string className?: string }) { return (
diff --git a/apps/renderer/src/components/ui/markdown/renderers/MarkdownLink.tsx b/apps/renderer/src/components/ui/markdown/renderers/MarkdownLink.tsx index 1eeb78814..90060b253 100644 --- a/apps/renderer/src/components/ui/markdown/renderers/MarkdownLink.tsx +++ b/apps/renderer/src/components/ui/markdown/renderers/MarkdownLink.tsx @@ -18,7 +18,9 @@ const safeUrl = (url: string, baseUrl: string) => { export const MarkdownLink = (props: LinkProps) => { const { view, feedId } = useEntryContentContext() - const feedSiteUrl = useFeedByIdSelector(feedId, (feed) => feed?.siteUrl) + const feedSiteUrl = useFeedByIdSelector(feedId, (feed) => + "siteUrl" in feed ? feed.siteUrl : undefined, + ) const populatedFullHref = useMemo(() => { const { href } = props diff --git a/apps/renderer/src/components/ui/radio-group/Radio.tsx b/apps/renderer/src/components/ui/radio-group/Radio.tsx index 75843b541..c53835b88 100644 --- a/apps/renderer/src/components/ui/radio-group/Radio.tsx +++ b/apps/renderer/src/components/ui/radio-group/Radio.tsx @@ -23,13 +23,13 @@ export const Radio: FC< onChange?.(e) }) return ( -
+
-
diff --git a/apps/renderer/src/database/schemas/feed.ts b/apps/renderer/src/database/schemas/feed.ts index 563be27fc..de391b9da 100644 --- a/apps/renderer/src/database/schemas/feed.ts +++ b/apps/renderer/src/database/schemas/feed.ts @@ -1,8 +1,8 @@ -import type { FeedModel } from "~/models" +import type { TargetModel } from "~/models" export type DB_FeedUnread = { id: string count: number } -export type DB_Feed = FeedModel & { id: string } +export type DB_Feed = TargetModel & { id: string } diff --git a/apps/renderer/src/hooks/biz/useFeedActions.tsx b/apps/renderer/src/hooks/biz/useFeedActions.tsx index 05e6449f6..6ed7d9af4 100644 --- a/apps/renderer/src/hooks/biz/useFeedActions.tsx +++ b/apps/renderer/src/hooks/biz/useFeedActions.tsx @@ -38,6 +38,7 @@ export const useFeedActions = ({ const items = useMemo(() => { if (!feed) return [] + const isList = feed?.type === "list" const items: NativeMenuItem[] = [ { type: "text" as const, @@ -46,7 +47,9 @@ export const useFeedActions = ({ click: () => { present({ title: t("sidebar.feed_actions.edit_feed"), - content: ({ dismiss }) => , + content: ({ dismiss }) => ( + + ), }) }, }, @@ -60,7 +63,11 @@ export const useFeedActions = ({ }, { type: "text" as const, - label: t("sidebar.feed_actions.navigate_to_feed"), + label: t( + isList + ? "sidebar.feed_actions.navigate_to_list" + : "sidebar.feed_actions.navigate_to_feed", + ), shortcut: "Meta+G", disabled: !isEntryList || getRouteParams().feedId === feedId, click: () => { @@ -71,14 +78,18 @@ export const useFeedActions = ({ type: "separator" as const, disabled: isEntryList, }, - { - type: "text", - label: t("sidebar.feed_actions.mark_all_as_read"), - shortcut: "Meta+Shift+A", - disabled: isEntryList, - click: () => subscriptionActions.markReadByFeedIds([feedId]), - }, - ...(!feed.ownerUserId && !!feed.id + ...(!isList + ? [ + { + type: "text" as const, + label: t("sidebar.feed_actions.mark_all_as_read"), + shortcut: "Meta+Shift+A", + disabled: isEntryList, + click: () => subscriptionActions.markReadByFeedIds({ feedIds: [feedId] }), + }, + ] + : []), + ...(!feed.ownerUserId && !!feed.id && !isList ? [ { type: "text" as const, @@ -96,7 +107,11 @@ export const useFeedActions = ({ ? [ { type: "text" as const, - label: t("sidebar.feed_actions.feed_owned_by_you"), + label: t( + isList + ? "sidebar.feed_actions.list_owned_by_you" + : "sidebar.feed_actions.feed_owned_by_you", + ), }, ] : []), @@ -106,37 +121,58 @@ export const useFeedActions = ({ }, { type: "text" as const, - label: t("sidebar.feed_actions.open_feed_in_browser"), + label: t( + isList + ? "sidebar.feed_actions.open_list_in_browser" + : "sidebar.feed_actions.open_feed_in_browser", + ), disabled: isEntryList, shortcut: "O", - click: () => window.open(`${WEB_URL}/feed/${feedId}?view=${view}`, "_blank"), - }, - { - type: "text" as const, - label: t("sidebar.feed_actions.open_site_in_browser"), - shortcut: "Meta+O", - disabled: isEntryList, - click: () => { - const feed = getFeedById(feedId) - if (feed) { - feed.siteUrl && window.open(feed.siteUrl, "_blank") - } - }, + click: () => + window.open( + isList + ? `${WEB_URL}/list/${feedId}?view=${view}` + : `${WEB_URL}/feed/${feedId}?view=${view}`, + "_blank", + ), }, + ...(!isList + ? [ + { + type: "text" as const, + label: t("sidebar.feed_actions.open_site_in_browser"), + shortcut: "Meta+O", + disabled: isEntryList, + click: () => { + const feed = getFeedById(feedId) + if (feed) { + "siteUrl" in feed && feed.siteUrl && window.open(feed.siteUrl, "_blank") + } + }, + }, + ] + : []), { type: "separator", disabled: isEntryList, }, { type: "text" as const, - label: t("sidebar.feed_actions.copy_feed_url"), + label: t( + isList ? "sidebar.feed_actions.copy_list_url" : "sidebar.feed_actions.copy_feed_url", + ), disabled: isEntryList, shortcut: "Meta+C", - click: () => navigator.clipboard.writeText(feed.url), + click: () => { + const url = isList ? `${WEB_URL}/list/${feedId}?view=${view}` : feed.url + navigator.clipboard.writeText(url) + }, }, { type: "text" as const, - label: t("sidebar.feed_actions.copy_feed_id"), + label: t( + isList ? "sidebar.feed_actions.copy_list_id" : "sidebar.feed_actions.copy_feed_id", + ), shortcut: "Meta+Shift+C", disabled: isEntryList, click: () => { diff --git a/apps/renderer/src/hooks/biz/useSubscriptionActions.tsx b/apps/renderer/src/hooks/biz/useSubscriptionActions.tsx index 9e93e80cb..b79212f53 100644 --- a/apps/renderer/src/hooks/biz/useSubscriptionActions.tsx +++ b/apps/renderer/src/hooks/biz/useSubscriptionActions.tsx @@ -26,7 +26,8 @@ export const useDeleteSubscription = ({ onSuccess }: { onSuccess?: () => void }) // TODO store action await apiClient.subscriptions.$post({ json: { - url: feed.url, + url: feed.type === "feed" ? feed.url : undefined, + listId: feed.type === "list" ? feed.id : undefined, view: subscription.view, category: subscription.category, isPrivate: subscription.isPrivate, diff --git a/apps/renderer/src/lib/utils.ts b/apps/renderer/src/lib/utils.ts index a93ccd755..f109b5358 100644 --- a/apps/renderer/src/lib/utils.ts +++ b/apps/renderer/src/lib/utils.ts @@ -27,7 +27,11 @@ export function getEntriesParams({ id, view }: { id?: number | string; view?: nu if (id === FEED_COLLECTION_LIST) { params.isCollection = true } else if (id && id !== ROUTE_FEED_PENDING) { - params.feedIdList = `${id}`.split(",") + if (id.toString().includes(",")) { + params.feedIdList = `${id}`.split(",") + } else { + params.feedId = `${id}` + } } if (view === FeedViewType.SocialMedia) { params.withContent = true diff --git a/apps/renderer/src/models/types.ts b/apps/renderer/src/models/types.ts index 43dc3923c..099aacd62 100644 --- a/apps/renderer/src/models/types.ts +++ b/apps/renderer/src/models/types.ts @@ -19,22 +19,15 @@ export type ActiveList = { view: number } -export type FeedResponse = SubscriptionResponse[number]["feeds"] - export type TransactionModel = ExtractBizResponse< typeof apiClient.wallets.transactions.$get >["data"][number] -export type FeedModel = ExtractBizResponse["data"]["feed"] & { - owner?: UserModel | null - tipUsers?: UserModel[] | null -} +export type FeedModel = ExtractBizResponse["data"]["feed"] -export type SubscriptionResponse = Array< - ExtractBizResponse["data"][number] & { - unread?: number - } -> +export type ListModel = ExtractBizResponse["data"]["list"] + +export type TargetModel = FeedModel | ListModel export type EntryResponse = Exclude< Extract, { code: 0 }>["data"], @@ -60,13 +53,6 @@ export type ActionsResponse = Exclude< undefined >["rules"] -export type ListResponse = { - code: number - data?: T - total?: number - message?: string -} - export type DataResponse = { code: number data?: T @@ -74,15 +60,15 @@ export type DataResponse = { export type ActiveEntryId = Nullable -export type SubscriptionModel = SubscriptionResponse[number] - -export type FeedListModel = { - list: { - list: SubscriptionResponse - name: string - }[] +export type SubscriptionModel = ExtractBizResponse< + typeof apiClient.subscriptions.$get +>["data"][number] & { + unread?: number } +export type FeedSubscriptionModel = Extract +export type ListSubscriptionModel = Extract + export type SupportedLanguages = z.infer export type RecommendationItem = ExtractBizResponse< diff --git a/apps/renderer/src/modules/claim/feed-claim-modal.tsx b/apps/renderer/src/modules/claim/feed-claim-modal.tsx index db01bd3f3..ebe120f79 100644 --- a/apps/renderer/src/modules/claim/feed-claim-modal.tsx +++ b/apps/renderer/src/modules/claim/feed-claim-modal.tsx @@ -12,6 +12,7 @@ import { LoadingCircle } from "~/components/ui/loading" import { useCurrentModal } from "~/components/ui/modal" import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/tabs" import { useAuthQuery } from "~/hooks/common" +import type { FeedModel } from "~/models" import { Queries } from "~/queries" import { useClaimFeedMutation } from "~/queries/feed" import { useFeedById } from "~/store/feed" @@ -20,7 +21,7 @@ export const FeedClaimModalContent: FC<{ feedId: string }> = ({ feedId }) => { const { t } = useTranslation() - const feed = useFeedById(feedId) + const feed = useFeedById(feedId) as FeedModel const { data: claimMessage, isLoading, diff --git a/apps/renderer/src/modules/discover/feed-form.tsx b/apps/renderer/src/modules/discover/feed-form.tsx index 58b0769c3..3827c0705 100644 --- a/apps/renderer/src/modules/discover/feed-form.tsx +++ b/apps/renderer/src/modules/discover/feed-form.tsx @@ -49,14 +49,15 @@ const defaultValue = { view: FeedViewType.Articles.toString() } as z.infer asWidget?: boolean onSuccess?: () => void -}> = ({ id: _id, defaultValues = defaultValue, url, asWidget, onSuccess }) => { - const queryParams = { id: _id, url } +}> = ({ id: _id, defaultValues = defaultValue, url, asWidget, onSuccess, isList }) => { + const queryParams = { id: _id, url, isList } const feedQuery = useFeed(queryParams) @@ -165,10 +166,16 @@ const FeedInnerForm = ({ const buttonRef = useRef(null) const isSubscribed = !!subscription const feed = useFeedByIdOrUrl({ id, url })! + const isList = feed?.type === "list" const form = useForm>({ resolver: zodResolver(formSchema), - defaultValues, + defaultValues: isList + ? { + ...defaultValues, + view: feed.view.toString(), + } + : defaultValues, }) const { setClickOutSideToDismiss, dismiss } = useCurrentModal() @@ -189,17 +196,16 @@ const FeedInnerForm = ({ const followMutation = useMutation({ mutationFn: async (values: z.infer) => { const body = { - url: feed.url, + ...(isList ? { listId: feed.id } : { url: feed.url }), view: Number.parseInt(values.view), category: values.category, isPrivate: values.isPrivate, title: values.title, - ...(isSubscribed && { feedId: feed.id }), + ...(isSubscribed && !isList && { feedId: feed.id }), } const $method = isSubscribed ? apiClient.subscriptions.$patch : apiClient.subscriptions.$post return $method({ - // @ts-expect-error json: body, }) }, @@ -266,7 +272,9 @@ const FeedInnerForm = ({ {t("feed_form.view")} - + {views.map((view) => (
{titleAtBottom && titleInfo} diff --git a/apps/renderer/src/modules/entry-column/types.ts b/apps/renderer/src/modules/entry-column/types.ts index 6856f78f3..f6e7fb6ff 100644 --- a/apps/renderer/src/modules/entry-column/types.ts +++ b/apps/renderer/src/modules/entry-column/types.ts @@ -1,11 +1,11 @@ import type { FC } from "react" -import type { CombinedEntryModel, FeedModel } from "~/models" +import type { CombinedEntryModel, TargetModel } from "~/models" export type UniversalItemProps = { entryId: string entryPreview?: CombinedEntryModel & { - feeds: FeedModel + feeds: TargetModel feedId: string } translation?: { diff --git a/apps/renderer/src/modules/entry-content/index.tsx b/apps/renderer/src/modules/entry-content/index.tsx index 0d34683a9..ed68a6a53 100644 --- a/apps/renderer/src/modules/entry-content/index.tsx +++ b/apps/renderer/src/modules/entry-content/index.tsx @@ -35,7 +35,7 @@ import { stopPropagation } from "~/lib/dom" import { FeedViewType } from "~/lib/enum" import { getNewIssueUrl } from "~/lib/issues" import { cn } from "~/lib/utils" -import type { ActiveEntryId } from "~/models" +import type { ActiveEntryId, FeedModel } from "~/models" import { useIsSoFWrappedElement, useWrappedElement, @@ -97,7 +97,7 @@ export const EntryContentRender: Component<{ entryId: string }> = ({ entryId, cl const entry = useEntry(entryId) useTitle(entry?.entries.title) - const feed = useFeedById(entry?.feedId) + const feed = useFeedById(entry?.feedId) as FeedModel const entryHistory = useEntryReadHistory(entryId) diff --git a/apps/renderer/src/modules/feed-column/category.tsx b/apps/renderer/src/modules/feed-column/category.tsx index b64032676..596736dc2 100644 --- a/apps/renderer/src/modules/feed-column/category.tsx +++ b/apps/renderer/src/modules/feed-column/category.tsx @@ -155,7 +155,9 @@ function FeedCategoryImpl({ type: "text", label: t("sidebar.feed_column.context_menu.mark_as_read"), click: () => { - subscriptionActions.markReadByFeedIds(ids) + subscriptionActions.markReadByFeedIds({ + feedIds: ids, + }) }, }, { type: "separator" }, diff --git a/apps/renderer/src/modules/feed-column/header.tsx b/apps/renderer/src/modules/feed-column/header.tsx index f91331c1d..4fabea7fc 100644 --- a/apps/renderer/src/modules/feed-column/header.tsx +++ b/apps/renderer/src/modules/feed-column/header.tsx @@ -2,7 +2,6 @@ import { m } from "framer-motion" import type { FC, PropsWithChildren } from "react" import { memo, useCallback, useEffect, useRef, useState } from "react" import { useTranslation } from "react-i18next" -import { Link } from "react-router-dom" import { toast } from "sonner" import { setAppSearchOpen } from "~/atoms/app" @@ -34,7 +33,6 @@ const useBackHome = (active: number) => { export const FeedColumnHeader = memo(() => { const [active] = useSidebarActiveView() - const { t } = useTranslation() const navigateBackHome = useBackHome(active) const normalStyle = !window.electron || window.electron.process.platform !== "darwin" return ( @@ -62,11 +60,6 @@ export const FeedColumnHeader = memo(() => {
- - - - -
diff --git a/apps/renderer/src/modules/feed-column/item.tsx b/apps/renderer/src/modules/feed-column/item.tsx index 2fd1bec89..67fa32ec7 100644 --- a/apps/renderer/src/modules/feed-column/item.tsx +++ b/apps/renderer/src/modules/feed-column/item.tsx @@ -17,7 +17,7 @@ import { getNewIssueUrl } from "~/lib/issues" import { showNativeMenu } from "~/lib/native-menu" import { cn } from "~/lib/utils" import { getPreferredTitle, useFeedById } from "~/store/feed" -import { useSubscriptionByFeedId } from "~/store/subscription" +import { subscriptionActions, useSubscriptionByFeedId } from "~/store/subscription" import { useFeedUnreadStore } from "~/store/unread" import { UnreadNumber } from "./unread-number" @@ -32,6 +32,8 @@ const FeedItemImpl = ({ view, feedId, className, showUnreadCount = true }: FeedI const { t } = useTranslation() const subscription = useSubscriptionByFeedId(feedId) const navigate = useNavigateEntry() + const feed = useFeedById(feedId) + const handleNavigate: React.MouseEventHandler = useCallback( (e) => { e.stopPropagation() @@ -41,20 +43,23 @@ const FeedItemImpl = ({ view, feedId, className, showUnreadCount = true }: FeedI entryId: null, view, }) + if (feed?.type === "list") { + subscriptionActions.markReadByFeedIds({ + listId: feedId, + }) + } // focus to main container in order to let keyboard can navigate entry items by arrow keys nextFrame(() => { getMainContainerElement()?.focus() }) }, - [feedId, navigate, view], + [feedId, navigate, view, feed?.type], ) const feedUnread = useFeedUnreadStore((state) => state.data[feedId] || 0) const isActive = useRouteParamsSelector((routerParams) => routerParams.feedId === feedId) - const feed = useFeedById(feedId) - const { items } = useFeedActions({ feedId, view }) const [isContextMenuOpen, setIsContextMenuOpen] = useState(false) @@ -68,9 +73,9 @@ const FeedItemImpl = ({ view, feedId, className, showUnreadCount = true }: FeedI
{ setIsContextMenuOpen(true) const nextItems = items.concat() - if (feed.errorAt && feed.errorMessage) { + if (feed.type === "feed" && feed.errorAt && feed.errorMessage) { nextItems.push( { type: "separator", @@ -109,10 +114,10 @@ const FeedItemImpl = ({ view, feedId, className, showUnreadCount = true }: FeedI
- +
{getPreferredTitle(feed)}
- - {feed.errorAt && ( + {feed.type === "feed" && } + {feed.type === "feed" && feed.errorAt && ( @@ -157,7 +162,7 @@ const FeedItemImpl = ({ view, feedId, className, showUnreadCount = true }: FeedI )}
- +
) diff --git a/apps/renderer/src/modules/feed-column/list.tsx b/apps/renderer/src/modules/feed-column/list.tsx index 828269cf6..79240391b 100644 --- a/apps/renderer/src/modules/feed-column/list.tsx +++ b/apps/renderer/src/modules/feed-column/list.tsx @@ -2,7 +2,7 @@ import * as HoverCard from "@radix-ui/react-hover-card" import { AnimatePresence, m } from "framer-motion" import { Fragment, memo, useMemo, useState } from "react" import { useTranslation } from "react-i18next" -import { Link } from "react-router-dom" +import { Link, useLocation, useNavigate } from "react-router-dom" import { useUISettingKey } from "~/atoms/settings/ui" import { ScrollArea } from "~/components/ui/scroll-area" @@ -29,7 +29,7 @@ import { import { FeedCategory } from "./category" import { UnreadNumber } from "./unread-number" -const useGroupedData = (view: FeedViewType) => { +const useFeedsGroupedData = (view: FeedViewType) => { const { data: remoteData } = useAuthQuery(Queries.subscription.byView(view)) const data = useSubscriptionByView(view) || remoteData @@ -53,6 +53,26 @@ const useGroupedData = (view: FeedViewType) => { }, [data]) } +const useListsGroupedData = (view: FeedViewType) => { + const { data: remoteData } = useAuthQuery(Queries.subscription.byView(view)) + + const data = useSubscriptionByView(view) || remoteData + + return useMemo(() => { + if (!data || data.length === 0) return {} + + const groupFolder = {} as Record + + for (const subscription of data) { + if (!subscription.category && !subscription.defaultCategory) { + groupFolder[subscription.feedId] = [subscription.feedId] + } + } + + return groupFolder + }, [data]) +} + const useUpdateUnreadCount = () => { useAuthQuery(Queries.subscription.unreadAll(), { refetchInterval: false, @@ -61,28 +81,32 @@ const useUpdateUnreadCount = () => { function FeedListImpl({ className, view }: { className?: string; view: number }) { const [expansion, setExpansion] = useState(false) - const data = useGroupedData(view) + const feedsData = useFeedsGroupedData(view) + const listsData = useListsGroupedData(view) useUpdateUnreadCount() const totalUnread = useFeedUnreadStore((state) => { let unread = 0 - for (const category in data) { - for (const feedId of data[category]) { + for (const category in feedsData) { + for (const feedId of feedsData[category]) { unread += state.data[feedId] || 0 } } return unread }) - const hasData = Object.keys(data).length > 0 + const hasData = Object.keys(feedsData).length > 0 || Object.keys(listsData).length > 0 const feedId = useRouteFeedId() - const navigate = useNavigateEntry() + const navigateEntry = useNavigateEntry() const { t } = useTranslation() + const location = useLocation() + const navigate = useNavigate() + return (
{ e.stopPropagation() if (view !== undefined) { - navigate({ + navigateEntry({ entryId: null, feedId: null, view, @@ -117,13 +141,26 @@ function FeedListImpl({ className, view }: { className?: string; view: number })
{ + e.stopPropagation() + navigate(`/discover`) + }} + > + + {t("words.discover")} +
+
{ e.stopPropagation() if (view !== undefined) { - navigate({ + navigateEntry({ entryId: null, feedId: FEED_COLLECTION_LIST, view, @@ -131,11 +168,22 @@ function FeedListImpl({ className, view }: { className?: string; view: number }) } }} > - + {t("words.starred")}
+ {Object.keys(listsData).length > 0 && ( + <> +
+ {t("words.lists")} +
+ + + )} +
+ {t("words.feeds")} +
{hasData ? ( - + ) : (
{ +export const UnreadNumber = ({ + unread, + className, + isList, +}: { + unread: number + className?: string + isList?: boolean +}) => { const showUnreadCount = useUISettingKey("sidebarShowUnreadCount") if (!showUnreadCount) return null if (!unread) return null @@ -9,7 +17,11 @@ export const UnreadNumber = ({ unread, className }: { unread: number; className?
- {unread} + {isList ? ( + + ) : ( + unread + )}
) } diff --git a/apps/renderer/src/modules/panel/cmdk.tsx b/apps/renderer/src/modules/panel/cmdk.tsx index 48498c4db..84e91f2a3 100644 --- a/apps/renderer/src/modules/panel/cmdk.tsx +++ b/apps/renderer/src/modules/panel/cmdk.tsx @@ -178,7 +178,7 @@ export const SearchCmdK: React.FC = () => { feedId={entry.feedId} entryId={entry.item.id} id={entry.item.id} - icon={feed?.siteUrl} + icon={feed?.type === "feed" ? feed?.siteUrl : undefined} subtitle={feed?.title} /> ) @@ -203,7 +203,7 @@ export const SearchCmdK: React.FC = () => { feedId={feed.item.id!} entryId={ROUTE_ENTRY_PENDING} id={feed.item.id!} - icon={feed.item.siteUrl} + icon={feed.item.type === "feed" ? feed.item.siteUrl : undefined} subtitle={useFeedUnreadStore.getState().data[feed.item.id!]?.toString()} /> ))} diff --git a/apps/renderer/src/modules/profile/hooks.ts b/apps/renderer/src/modules/profile/hooks.ts index 7e697d50f..579737d8c 100644 --- a/apps/renderer/src/modules/profile/hooks.ts +++ b/apps/renderer/src/modules/profile/hooks.ts @@ -19,7 +19,7 @@ export const useUserSubscriptionsQuery = (userId: string | undefined) => { const groupFolder = {} as Record for (const subscription of res.data || []) { - if (!subscription.category && subscription.feeds) { + if (!subscription.category && "feeds" in subscription) { const { siteUrl } = subscription.feeds if (!siteUrl) continue const parsed = parse(siteUrl) diff --git a/apps/renderer/src/modules/profile/profile-setting-form.tsx b/apps/renderer/src/modules/profile/profile-setting-form.tsx index d334b7edd..0a299a669 100644 --- a/apps/renderer/src/modules/profile/profile-setting-form.tsx +++ b/apps/renderer/src/modules/profile/profile-setting-form.tsx @@ -102,14 +102,17 @@ export const ProfileSettingForm = () => { {t("profile.avatar.label")} - +
+ + {field.value && ( + + + + )} +
- - - -
)} /> diff --git a/apps/renderer/src/modules/profile/user-profile-modal.tsx b/apps/renderer/src/modules/profile/user-profile-modal.tsx index 7571cbdbb..6dfb1a9b0 100644 --- a/apps/renderer/src/modules/profile/user-profile-modal.tsx +++ b/apps/renderer/src/modules/profile/user-profile-modal.tsx @@ -366,6 +366,7 @@ const SubscriptionItem: FC<{ const isFollowed = !!useSubscriptionStore((state) => state.data[subscription.feedId]) const { present } = useModalStack() const isLoose = variant === "loose" + if (!("feeds" in subscription)) return null return ( {

{t("feeds.claimTips")}

+
{claimedList.data?.length ? ( diff --git a/apps/renderer/src/modules/settings/tabs/lists.tsx b/apps/renderer/src/modules/settings/tabs/lists.tsx new file mode 100644 index 000000000..5245cc9f9 --- /dev/null +++ b/apps/renderer/src/modules/settings/tabs/lists.tsx @@ -0,0 +1,455 @@ +import { WEB_URL } from "@follow/shared/constants" +import { zodResolver } from "@hookform/resolvers/zod" +import { useMutation } from "@tanstack/react-query" +import { useState } from "react" +import { useForm } from "react-hook-form" +import { useTranslation } from "react-i18next" +import { toast } from "sonner" +import { z } from "zod" + +import { FeedCertification } from "~/components/feed-certification" +import { Avatar, AvatarImage } from "~/components/ui/avatar" +import { Button } from "~/components/ui/button" +import { Card, CardHeader } from "~/components/ui/card" +import { Divider } from "~/components/ui/divider" +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "~/components/ui/form" +import { Input } from "~/components/ui/input" +import { LoadingCircle } from "~/components/ui/loading" +import { useModalStack } from "~/components/ui/modal" +import { ScrollArea } from "~/components/ui/scroll-area" +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "~/components/ui/table" +import { views } from "~/constants" +import { useAuthQuery } from "~/hooks/common" +import { apiClient } from "~/lib/api-fetch" +import { cn } from "~/lib/utils" +import type { ListModel } from "~/models" +import { Queries } from "~/queries" +import { feedActions, useFeedById } from "~/store/feed" + +export const SettingLists = () => { + const { t: appT } = useTranslation() + const { t } = useTranslation("settings") + const listList = useAuthQuery(Queries.lists.list()) + + const { present } = useModalStack() + + return ( +
+
+

{t("lists.info")}

+
+ + +
+ + {listList.data?.length ? ( + + + + + {t("lists.title")} + + + {t("lists.view")} + + + {t("lists.fee")} + + + {t("lists.feeds")} + + + {t("lists.edit")} + + + + + {listList.data?.map((row) => ( + + + + {row.image && ( + + + + )} + {row.title} + + + +
+ + {views[row.view].icon} + + {appT(views[row.view].name)} +
+
+ +
+ {row.fee} + +
+
+ + + + + + +
+ ))} +
+
+ ) : listList.isLoading ? ( + + ) : ( +
+

{t("lists.noLists")}

+
+ )} +
+
+
+ ) +} + +const formSchema = z.object({ + view: z.string(), + title: z.string(), + description: z.string().optional(), + image: z.string().optional(), + fee: z.number().min(0), +}) + +const ListCreationModalContent = ({ dismiss, id }: { dismiss: () => void; id?: string }) => { + const { t: appT } = useTranslation() + const { t } = useTranslation("settings") + + const list = useFeedById(id) as ListModel + + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + view: list?.view.toString() || views[0].view.toString(), + fee: list?.fee || 0, + title: list?.title || "", + description: list?.description || "", + image: list?.image || "", + }, + }) + + const createMutation = useMutation({ + mutationFn: async (values: z.infer) => { + if (id) { + await apiClient.lists.$patch({ + json: { + listId: id, + ...values, + view: Number.parseInt(values.view), + }, + }) + } else { + await apiClient.lists.$post({ + json: { + ...values, + view: Number.parseInt(values.view), + }, + }) + } + }, + onSuccess: () => { + toast.success(t(id ? "lists.edit.success" : "lists.created.success")) + Queries.lists.list().invalidate() + dismiss() + }, + async onError() { + toast.error(t(id ? "lists.edit.error" : "lists.created.error")) + }, + }) + + function onSubmit(values: z.infer) { + createMutation.mutate(values) + } + + return ( + + + ( + +
+ + {t("lists.title")} + * + +
+ + + + +
+ )} + /> + ( + +
+ {t("lists.description")} +
+ + + + +
+ )} + /> + ( +
+ + {t("lists.image")} + +
+ + {field.value && ( + + + + )} +
+
+ +
+
+ )} + /> + ( + + {t("lists.view")} + + + {views.map((view) => ( +
+ + +
+ ))} +
+
+ +
+ )} + /> + ( + +
+ {t("lists.fee")} + {t("lists.fee.description")} +
+ +
+ field.onChange(value.target.valueAsNumber)} + /> + +
+
+ +
+ )} + /> + + + + ) +} + +export const ListFeedsModalContent = ({ id }: { id: string }) => { + const list = useFeedById(id) as ListModel + const { t } = useTranslation("settings") + + const [addValue, setAddValue] = useState("") + const addMutation = useMutation({ + mutationFn: async (values: string) => { + const feed = await apiClient.lists.feeds.$post({ + json: { + listId: id, + feedId: values, + }, + }) + feedActions.upsertMany([feed.data]) + }, + onSuccess: () => { + toast.success(t("lists.feeds.add.success")) + Queries.lists.list().invalidate() + }, + async onError() { + toast.error(t("lists.feeds.add.error")) + }, + }) + + const removeMutation = useMutation({ + mutationFn: async (feedId: string) => { + await apiClient.lists.feeds.$delete({ + json: { + listId: id, + feedId, + }, + }) + }, + onSuccess: () => { + toast.success(t("lists.feeds.delete.success")) + Queries.lists.list().invalidate() + }, + async onError() { + toast.error(t("lists.feeds.delete.error")) + }, + }) + + return ( +
+
+ setAddValue(e.target.value)} + /> + +
+ + + + + + + {t("lists.feeds.id")} + + + {t("lists.feeds.title")} + + + {t("lists.feeds.owner")} + + + {t("lists.feeds.remove")} + + + + + {list.feeds?.map((row) => ( + + + {row.id} + + + + {row.image && ( + + + + )} + {row.title} + + + + + + + + + + ))} + +
+
+
+ ) +} diff --git a/apps/renderer/src/modules/settings/tabs/wallet/my-wallet-section/withdraw.tsx b/apps/renderer/src/modules/settings/tabs/wallet/my-wallet-section/withdraw.tsx index 54f457643..ba10bc143 100644 --- a/apps/renderer/src/modules/settings/tabs/wallet/my-wallet-section/withdraw.tsx +++ b/apps/renderer/src/modules/settings/tabs/wallet/my-wallet-section/withdraw.tsx @@ -129,7 +129,6 @@ const WithdrawModalContent = ({ dismiss }: { dismiss: () => void }) => { {t("wallet.withdraw.amountLabel")} field.onChange(value.target.valueAsNumber)} diff --git a/apps/renderer/src/pages/(external)/(with-layout)/feed/[id]/index.tsx b/apps/renderer/src/pages/(external)/(with-layout)/feed/[id]/index.tsx index a3a6ab47f..5dee62824 100644 --- a/apps/renderer/src/pages/(external)/(with-layout)/feed/[id]/index.tsx +++ b/apps/renderer/src/pages/(external)/(with-layout)/feed/[id]/index.tsx @@ -14,6 +14,7 @@ import { usePresentFeedFormModal } from "~/hooks/biz/useFeedFormModal" import { useTitle } from "~/hooks/common" import { FeedViewType } from "~/lib/enum" import { cn } from "~/lib/utils" +import type { FeedModel } from "~/models" import { ArticleItem } from "~/modules/entry-column/Items/article-item" import { NotificationItem } from "~/modules/entry-column/Items/notification-item" import { PictureItem } from "~/modules/entry-column/Items/picture-item" @@ -31,6 +32,7 @@ export function Component() { const feed = useFeed({ id, }) + const feedData = feed.data?.feed as FeedModel const entries = useEntriesPreview({ id, }) @@ -93,11 +95,11 @@ export function Component() { })}
- {feed.data.feed.url.startsWith("https://") ? ( + {feedData.url.startsWith("https://") ? ( + + +
+ ) + )} +
+ ) +} diff --git a/apps/renderer/src/pages/(external)/(with-layout)/profile/[id]/index.tsx b/apps/renderer/src/pages/(external)/(with-layout)/profile/[id]/index.tsx index 8a841e8ef..9a65cd621 100644 --- a/apps/renderer/src/pages/(external)/(with-layout)/profile/[id]/index.tsx +++ b/apps/renderer/src/pages/(external)/(with-layout)/profile/[id]/index.tsx @@ -70,50 +70,58 @@ export function Component() {

{category}

- {subscriptions.data?.[category].map((subscription) => ( -
- - -
-
- {subscription.feeds?.title} -
- {subscription.feeds?.description && ( -
- {subscription.feeds.description} + {subscriptions.data?.[category].map( + (subscription) => + "feeds" in subscription && ( + - - - - -
- ))} + presentFeedFormModal(subscription.feedId) + }} + > + {isMe ? ( + t.common("words.edit") + ) : ( + <> + + {APP_NAME} + + )} + + +
+ ), + )}
)) diff --git a/apps/renderer/src/pages/settings/(settings)/feeds.tsx b/apps/renderer/src/pages/settings/(settings)/feeds.tsx index d988ea63e..5d81f184e 100644 --- a/apps/renderer/src/pages/settings/(settings)/feeds.tsx +++ b/apps/renderer/src/pages/settings/(settings)/feeds.tsx @@ -3,7 +3,7 @@ import { SettingsTitle } from "~/modules/settings/title" import { defineSettingPageData } from "~/modules/settings/utils" const iconName = "i-mgc-certificate-cute-re" -const priority = 1053 +const priority = 1060 export const loader = defineSettingPageData({ iconName, diff --git a/apps/renderer/src/pages/settings/(settings)/integration.tsx b/apps/renderer/src/pages/settings/(settings)/integration.tsx index 2fb020a6d..b90bc1fb2 100644 --- a/apps/renderer/src/pages/settings/(settings)/integration.tsx +++ b/apps/renderer/src/pages/settings/(settings)/integration.tsx @@ -3,7 +3,7 @@ import { SettingsTitle } from "~/modules/settings/title" import { defineSettingPageData } from "~/modules/settings/utils" const iconName = "i-mgc-department-cute-re" -const priority = 1025 +const priority = 1030 export const loader = defineSettingPageData({ iconName, diff --git a/apps/renderer/src/pages/settings/(settings)/invitations.tsx b/apps/renderer/src/pages/settings/(settings)/invitations.tsx index 673ff6f6a..02a3e81d0 100644 --- a/apps/renderer/src/pages/settings/(settings)/invitations.tsx +++ b/apps/renderer/src/pages/settings/(settings)/invitations.tsx @@ -3,7 +3,7 @@ import { SettingsTitle } from "~/modules/settings/title" import { defineSettingPageData } from "~/modules/settings/utils" const iconName = "i-mgc-heart-hand-cute-re" -const priority = 1055 +const priority = 1070 export const loader = defineSettingPageData({ iconName, diff --git a/apps/renderer/src/pages/settings/(settings)/list.tsx b/apps/renderer/src/pages/settings/(settings)/list.tsx new file mode 100644 index 000000000..b1a4b1d8b --- /dev/null +++ b/apps/renderer/src/pages/settings/(settings)/list.tsx @@ -0,0 +1,21 @@ +import { SettingLists } from "~/modules/settings/tabs/lists" +import { SettingsTitle } from "~/modules/settings/title" +import { defineSettingPageData } from "~/modules/settings/utils" + +const iconName = "i-mgc-rada-cute-re" +const priority = 1050 + +export const loader = defineSettingPageData({ + iconName, + name: "titles.lists", + priority, +}) + +export function Component() { + return ( + <> + + + + ) +} diff --git a/apps/renderer/src/pages/settings/(settings)/profile.tsx b/apps/renderer/src/pages/settings/(settings)/profile.tsx index 3e1e583ef..fa1603f6f 100644 --- a/apps/renderer/src/pages/settings/(settings)/profile.tsx +++ b/apps/renderer/src/pages/settings/(settings)/profile.tsx @@ -3,7 +3,7 @@ import { SettingsTitle } from "~/modules/settings/title" import { defineSettingPageData } from "~/modules/settings/utils" const iconName = "i-mgc-user-setting-cute-re" -const priority = 1030 +const priority = 1090 export const loader = defineSettingPageData({ iconName, name: "titles.profile", diff --git a/apps/renderer/src/pages/settings/(settings)/shortcuts.tsx b/apps/renderer/src/pages/settings/(settings)/shortcuts.tsx index 33dc7a48d..604981f65 100644 --- a/apps/renderer/src/pages/settings/(settings)/shortcuts.tsx +++ b/apps/renderer/src/pages/settings/(settings)/shortcuts.tsx @@ -7,7 +7,7 @@ import { SettingsTitle } from "~/modules/settings/title" import { defineSettingPageData } from "~/modules/settings/utils" const iconName = "i-mgc-hotkey-cute-re" -const priority = 1040 +const priority = 1080 export const loader = defineSettingPageData({ iconName, diff --git a/apps/renderer/src/pages/settings/(settings)/wallet.tsx b/apps/renderer/src/pages/settings/(settings)/wallet.tsx index 65fb01491..00d795c9a 100644 --- a/apps/renderer/src/pages/settings/(settings)/wallet.tsx +++ b/apps/renderer/src/pages/settings/(settings)/wallet.tsx @@ -2,7 +2,7 @@ import { SettingWallet } from "~/modules/settings/tabs/wallet" import { defineSettingPageData } from "~/modules/settings/utils" const iconName = `i-mgc-power-outline` -const priority = 1050 +const priority = 1040 export const loader = defineSettingPageData({ iconName, diff --git a/apps/renderer/src/queries/feed.ts b/apps/renderer/src/queries/feed.ts index d647ca018..3419c3ef7 100644 --- a/apps/renderer/src/queries/feed.ts +++ b/apps/renderer/src/queries/feed.ts @@ -12,13 +12,14 @@ import { feedActions } from "~/store/feed" import { entries } from "./entries" export const feed = { - byId: ({ id, url }: FeedQueryParams) => + byId: ({ id, url, isList }: FeedQueryParams) => defineQuery( ["feed", id, url], async () => feedActions.fetchFeedById({ id, url, + isList, }), { rootKey: ["feed"], @@ -40,11 +41,12 @@ export const feed = { }), } -export const useFeed = ({ id, url }: FeedQueryParams) => +export const useFeed = ({ id, url, isList }: FeedQueryParams) => useAuthQuery( feed.byId({ id, url, + isList, }), { enabled: diff --git a/apps/renderer/src/queries/index.ts b/apps/renderer/src/queries/index.ts index 4560008eb..abba5ccfa 100644 --- a/apps/renderer/src/queries/index.ts +++ b/apps/renderer/src/queries/index.ts @@ -5,6 +5,7 @@ import { discover } from "./discover" import { entries } from "./entries" import { feed } from "./feed" import { invitations } from "./invitations" +import { lists } from "./lists" import { subscription } from "./subscriptions" import { wallet } from "./wallet" @@ -18,4 +19,5 @@ export const Queries = { discover, wallet, invitations, + lists, } diff --git a/apps/renderer/src/queries/lists.ts b/apps/renderer/src/queries/lists.ts new file mode 100644 index 000000000..a995596ba --- /dev/null +++ b/apps/renderer/src/queries/lists.ts @@ -0,0 +1,9 @@ +import { defineQuery } from "~/lib/defineQuery" +import { feedActions } from "~/store/feed" + +export const lists = { + list: () => + defineQuery(["lists"], async () => feedActions.fetchOwnedLists(), { + rootKey: ["lists"], + }), +} diff --git a/apps/renderer/src/services/cleaner.spec.ts b/apps/renderer/src/services/cleaner.spec.ts index c2f7228f4..4c211073d 100644 --- a/apps/renderer/src/services/cleaner.spec.ts +++ b/apps/renderer/src/services/cleaner.spec.ts @@ -1,5 +1,5 @@ // @ts-nocheck -import type { FeedModel } from "@follow/shared/hono" +import type { TargetModel } from "@follow/shared/hono" import { beforeAll, describe, expect, test } from "vitest" import { browserDB } from "~/database" @@ -42,7 +42,7 @@ const subscriptions: SubscriptionFlatModel[] = [ }, ] -const feeds: FeedModel[] = [ +const feeds: TargetModel[] = [ { id: "feed-id-1", }, diff --git a/apps/renderer/src/services/feed.ts b/apps/renderer/src/services/feed.ts index b056111f8..1f4324098 100644 --- a/apps/renderer/src/services/feed.ts +++ b/apps/renderer/src/services/feed.ts @@ -1,26 +1,26 @@ import { browserDB } from "~/database" -import type { FeedModel } from "~/models/types" +import type { TargetModel } from "~/models/types" import { BaseService } from "./base" import { CleanerService } from "./cleaner" -type FeedModelWithId = FeedModel & { id: string } -class ServiceStatic extends BaseService { +type TargetModelWithId = TargetModel & { id: string } +class ServiceStatic extends BaseService { constructor() { super(browserDB.feeds) } - override async upsertMany(data: FeedModel[]) { + override async upsertMany(data: TargetModel[]) { const filterData = data.filter((d) => d.id) CleanerService.reset(filterData.map((d) => ({ type: "feed", id: d.id! }))) - return this.table.bulkPut(filterData as FeedModelWithId[]) + return this.table.bulkPut(filterData as TargetModelWithId[]) } - override async upsert(data: FeedModel): Promise { + override async upsert(data: TargetModel): Promise { if (!data.id) return null CleanerService.reset([{ type: "feed", id: data.id }]) - return this.table.put(data as FeedModelWithId) + return this.table.put(data as TargetModelWithId) } async bulkDelete(ids: string[]) { diff --git a/apps/renderer/src/store/entry/store.ts b/apps/renderer/src/store/entry/store.ts index de83dbeaf..86cc96730 100644 --- a/apps/renderer/src/store/entry/store.ts +++ b/apps/renderer/src/store/entry/store.ts @@ -5,7 +5,7 @@ import { isNil, merge, omit } from "lodash-es" import { runTransactionInScope } from "~/database" import { apiClient } from "~/lib/api-fetch" import { getEntriesParams, omitObjectUndefinedValue } from "~/lib/utils" -import type { CombinedEntryModel, EntryModel, FeedModel } from "~/models" +import type { CombinedEntryModel, EntryModel, TargetModel } from "~/models" import { EntryService } from "~/services" import { feedActions } from "../feed" @@ -178,7 +178,7 @@ class EntryActions { } upsertMany(data: CombinedEntryModel[]) { - const feeds = [] as FeedModel[] + const feeds = [] as TargetModel[] const entries = [] as EntryModel[] const entry2Read = {} as Record const entryFeedMap = {} as Record diff --git a/apps/renderer/src/store/feed/hooks.ts b/apps/renderer/src/store/feed/hooks.ts index 22509663f..ad28fea66 100644 --- a/apps/renderer/src/store/feed/hooks.ts +++ b/apps/renderer/src/store/feed/hooks.ts @@ -4,13 +4,13 @@ import { useShallow } from "zustand/react/shallow" import { FEED_COLLECTION_LIST, ROUTE_FEED_IN_FOLDER, ROUTE_FEED_PENDING, views } from "~/constants" import { useRouteParams } from "~/hooks/biz/useRouteParams" -import type { FeedModel } from "~/models" +import type { TargetModel } from "~/models" import { getSubscriptionByFeedId } from "../subscription" import { useFeedStore } from "./store" import type { FeedQueryParams } from "./types" -export const useFeedById = (feedId: Nullable): FeedModel | null => +export const useFeedById = (feedId: Nullable): TargetModel | null => useFeedStore((state) => (feedId ? state.feeds[feedId] : null)) export const useFeedByIdOrUrl = (feed: FeedQueryParams) => @@ -19,14 +19,14 @@ export const useFeedByIdOrUrl = (feed: FeedQueryParams) => return state.feeds[feed.id] } if (feed.url) { - return Object.values(state.feeds).find((f) => f.url === feed.url) || null + return Object.values(state.feeds).find((f) => f.type === "feed" && f.url === feed.url) || null } return null }) export const useFeedByIdSelector = ( feedId: Nullable, - selector: (feed: FeedModel) => T, + selector: (feed: TargetModel) => T, ) => useFeedStore( useShallow((state) => (feedId && state.feeds[feedId] ? selector(state.feeds[feedId]) : null)), diff --git a/apps/renderer/src/store/feed/store.ts b/apps/renderer/src/store/feed/store.ts index 51f3ab9bf..37c8257b5 100644 --- a/apps/renderer/src/store/feed/store.ts +++ b/apps/renderer/src/store/feed/store.ts @@ -4,7 +4,7 @@ import { nanoid } from "nanoid" import { whoami } from "~/atoms/user" import { runTransactionInScope } from "~/database" import { apiClient } from "~/lib/api-fetch" -import type { FeedModel, UserModel } from "~/models" +import type { TargetModel, UserModel } from "~/models" import { FeedService } from "~/services" import { getSubscriptionByFeedId } from "../subscription" @@ -23,21 +23,25 @@ class FeedActions { set({ feeds: {} }) } - upsertMany(feeds: FeedModel[]) { + upsertMany(feeds: TargetModel[]) { runTransactionInScope(() => { FeedService.upsertMany(feeds) }) set((state) => produce(state, (state) => { for (const feed of feeds) { - if (feed.errorAt && new Date(feed.errorAt).getTime() > Date.now() - 1000 * 60 * 60 * 9) { + if ( + feed.type === "feed" && + feed.errorAt && + new Date(feed.errorAt).getTime() > Date.now() - 1000 * 60 * 60 * 9 + ) { feed.errorAt = null } if (feed.id) { if (feed.owner) { userActions.upsert(feed.owner as UserModel) } - if (feed.tipUsers) { + if (feed.type === "feed" && feed.tipUsers) { userActions.upsert(feed.tipUsers) } @@ -55,12 +59,15 @@ class FeedActions { const nonce = feed["nonce"] || nanoid(8) state.feeds[nonce] = { ...feed, id: nonce } } + if ("feeds" in feed && feed.feeds) { + this.upsertMany(feed.feeds) + } } }), ) } - private patch(feedId: string, patch: Partial) { + private patch(feedId: string, patch: Partial) { set((state) => produce(state, (state) => { const feed = state.feeds[feedId] @@ -96,18 +103,24 @@ class FeedActions { // API Fetcher // - async fetchFeedById({ id, url }: FeedQueryParams) { - const res = await apiClient.feeds.$get({ - query: { - id, - url, - }, - }) + async fetchFeedById({ id, url, isList }: FeedQueryParams) { + const res = isList + ? await apiClient.lists.$get({ + query: { + listId: id!, + }, + }) + : await apiClient.feeds.$get({ + query: { + id, + url, + }, + }) const nonce = nanoid(8) const finalData = { - ...res.data.feed, + ...("list" in res.data ? res.data.list : res.data.feed), } if (!finalData.id) { @@ -120,13 +133,20 @@ class FeedActions { feed: !finalData.id ? { ...finalData, id: nonce } : finalData, } } + + async fetchOwnedLists() { + const res = await apiClient.lists.list.$get() + this.upsertMany(res.data) + + return res.data + } } export const feedActions = new FeedActions() -export const getFeedById = (feedId: string): Nullable => +export const getFeedById = (feedId: string): Nullable => useFeedStore.getState().feeds[feedId] -export const getPreferredTitle = (feed?: FeedModel | null) => { +export const getPreferredTitle = (feed?: TargetModel | null) => { if (!feed?.id) { return feed?.title } diff --git a/apps/renderer/src/store/feed/types.ts b/apps/renderer/src/store/feed/types.ts index 097bdb3c5..d5bde4f2f 100644 --- a/apps/renderer/src/store/feed/types.ts +++ b/apps/renderer/src/store/feed/types.ts @@ -1,15 +1,15 @@ -import type { FeedModel } from "~/models" +import type { TargetModel } from "~/models" type FeedId = string export interface FeedState { - feeds: Record + feeds: Record } export interface FeedActions { - upsertMany: (feeds: FeedModel[]) => void + upsertMany: (feeds: TargetModel[]) => void clear: () => void - patch: (feedId: FeedId, patch: Partial) => void + patch: (feedId: FeedId, patch: Partial) => void } -export type FeedQueryParams = { id?: string; url?: string } +export type FeedQueryParams = { id?: string; url?: string; isList?: boolean } diff --git a/apps/renderer/src/store/search/index.ts b/apps/renderer/src/store/search/index.ts index 702dc9adc..ca6d344c5 100644 --- a/apps/renderer/src/store/search/index.ts +++ b/apps/renderer/src/store/search/index.ts @@ -44,6 +44,7 @@ class SearchActions { const feedsMap = new Map(feeds.map((feed) => [feed.id, feed])) const entriesFuse = this.createFuse(entries, ["title", "content", "description", "id"]) + // @ts-expect-error const feedsFuse = this.createFuse(feeds, ["title", "description", "id", "siteUrl", "url"]) const subscriptionsFuse = this.createFuse(subscriptions, ["title", "category"]) diff --git a/apps/renderer/src/store/search/types.ts b/apps/renderer/src/store/search/types.ts index 3c1200671..c53a583a6 100644 --- a/apps/renderer/src/store/search/types.ts +++ b/apps/renderer/src/store/search/types.ts @@ -1,4 +1,4 @@ -import type { EntryModel, FeedModel } from "~/models" +import type { EntryModel, TargetModel } from "~/models" import type { SubscriptionFlatModel } from "../subscription" import type { SearchType } from "./constants" @@ -9,7 +9,7 @@ export interface SearchResult exten } export interface SearchState { - feeds: SearchResult[] + feeds: SearchResult[] entries: SearchResult[] subscriptions: SearchResult[] diff --git a/apps/renderer/src/store/subscription/store.ts b/apps/renderer/src/store/subscription/store.ts index 146d0b520..b2304f207 100644 --- a/apps/renderer/src/store/subscription/store.ts +++ b/apps/renderer/src/store/subscription/store.ts @@ -35,7 +35,7 @@ function morphResponseData(data: SubscriptionModel[]): SubscriptionFlatModel[] { const result: SubscriptionFlatModel[] = [] for (const subscription of data) { const cloned: SubscriptionFlatModel = { ...subscription } - if (!subscription.category && subscription.feeds) { + if (!subscription.category && "feeds" in subscription && subscription.feeds) { const { siteUrl } = subscription.feeds if (!siteUrl) { cloned.defaultCategory = subscription.feedId @@ -99,7 +99,7 @@ class SubscriptionActions { const transformedData = morphResponseData(res.data) this.upsertMany(transformedData) - feedActions.upsertMany(res.data.map((s) => s.feeds)) + feedActions.upsertMany(res.data.map((s) => ("feeds" in s ? s.feeds : s.lists))) return res.data } @@ -145,30 +145,42 @@ class SubscriptionActions { ) } - async markReadByFeedIds(feedIds: string[]): Promise - async markReadByFeedIds( - feedIds: string[], - view: FeedViewType, - filter?: MarkReadFilter, - ): Promise - async markReadByFeedIds(...args: [string[], FeedViewType?, MarkReadFilter?]) { - const [feedIds, view, filter] = args - - const stableFeedIds = feedIds.concat() + async markReadByFeedIds({ + feedIds, + view, + filter, + listId, + }: { + feedIds?: string[] + view?: FeedViewType + filter?: MarkReadFilter + listId?: string + }) { + const stableFeedIds = feedIds?.concat() || [] doMutationAndTransaction( () => apiClient.reads.all.$post({ json: { - feedIdList: stableFeedIds, + ...(listId + ? { + listId, + } + : { + feedIdList: stableFeedIds, + }), ...filter, }, }), async () => { - for (const feedId of stableFeedIds) { - // We can not process this logic in local, so skip it. and then we will fetch the unread count from server. - !filter && feedUnreadActions.updateByFeedId(feedId, 0) - entryActions.patchManyByFeedId(feedId, { read: true }, filter) + if (listId) { + feedUnreadActions.updateByFeedId(listId, 0) + } else { + for (const feedId of stableFeedIds) { + // We can not process this logic in local, so skip it. and then we will fetch the unread count from server. + !filter && feedUnreadActions.updateByFeedId(feedId, 0) + entryActions.patchManyByFeedId(feedId, { read: true }, filter) + } } if (filter) { feedUnreadActions.fetchUnreadByView(view) @@ -202,7 +214,7 @@ class SubscriptionActions { if (idSet.has(id)) { const subscription = state.data[id] const feed = getFeedById(subscription.feedId) - if (!feed) return + if (!feed || feed.type !== "feed") return const { siteUrl } = feed if (!siteUrl) return const parsed = parse(siteUrl) diff --git a/icons/mgc/compass_cute_fi.svg b/icons/mgc/compass_cute_fi.svg new file mode 100644 index 000000000..2da00c491 --- /dev/null +++ b/icons/mgc/compass_cute_fi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/mgc/edit_cute_re.svg b/icons/mgc/edit_cute_re.svg new file mode 100644 index 000000000..b14c7754e --- /dev/null +++ b/icons/mgc/edit_cute_re.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/mgc/inbox_cute_re.svg b/icons/mgc/inbox_cute_re.svg new file mode 100644 index 000000000..9a80024ac --- /dev/null +++ b/icons/mgc/inbox_cute_re.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/mgc/rada_cute_fi.svg b/icons/mgc/rada_cute_fi.svg new file mode 100644 index 000000000..117e4a5ac --- /dev/null +++ b/icons/mgc/rada_cute_fi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/mgc/rada_cute_re.svg b/icons/mgc/rada_cute_re.svg new file mode 100644 index 000000000..67ac9fce9 --- /dev/null +++ b/icons/mgc/rada_cute_re.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/locales/app/en.json b/locales/app/en.json index 7a428a993..ca2ec2a2c 100644 --- a/locales/app/en.json +++ b/locales/app/en.json @@ -14,6 +14,9 @@ "discover.rss_hub_route": "RSSHub Route", "discover.rss_url": "RSS URL", "discover.select_placeholder": "Select", + "discover.target": "Type", + "discover.target.feeds": "Feeds", + "discover.target.lists": "Lists", "early_access": "Early Access", "entry_actions.copy_link": "Copy link", "entry_actions.failed_to_save_to_eagle": "Failed to save to Eagle.", @@ -81,9 +84,12 @@ "feed_form.category": "Category", "feed_form.category_description": "By default, your follows will be grouped by website.", "feed_form.error_fetching_feed": "Error in fetching feed.", + "feed_form.fee": "Follow fee", + "feed_form.fee_description": "To follow this list, you must pay a fee to the list creator.", "feed_form.feed_not_found": "Feed not found.", "feed_form.feedback": "Feedback", "feed_form.follow": "Follow", + "feed_form.follow_with_fee": "Follow with {{fee}} Power", "feed_form.followed": "🎉 Followed.", "feed_form.private_follow": "Private Follow", "feed_form.private_follow_description": "Whether this follow is publicly visible on your profile page.", @@ -148,12 +154,17 @@ "sidebar.feed_actions.claim_feed": "Claim Feed", "sidebar.feed_actions.copy_feed_id": "Copy feed ID", "sidebar.feed_actions.copy_feed_url": "Copy feed URL", + "sidebar.feed_actions.copy_list_id": "Copy list ID", + "sidebar.feed_actions.copy_list_url": "Copy list URL", "sidebar.feed_actions.edit": "Edit", "sidebar.feed_actions.edit_feed": "Edit feed", "sidebar.feed_actions.feed_owned_by_you": "This feed is owned by you", + "sidebar.feed_actions.list_owned_by_you": "This list is owned by you", "sidebar.feed_actions.mark_all_as_read": "Mark all as read", "sidebar.feed_actions.navigate_to_feed": "Navigate to feed", + "sidebar.feed_actions.navigate_to_list": "Navigate to list", "sidebar.feed_actions.open_feed_in_browser": "Open feed in browser", + "sidebar.feed_actions.open_list_in_browser": "Open list in browser", "sidebar.feed_actions.open_site_in_browser": "Open site in browser", "sidebar.feed_actions.unfollow": "Unfollow", "sidebar.feed_actions.unfollow_feed": "Unfollow feed", @@ -195,9 +206,11 @@ "words.confirm": "Confirm", "words.discover": "Discover", "words.email": "Email", + "words.feeds": "Feeds", "words.import": "Import", "words.items": "Items", "words.language": "Language", + "words.lists": "Lists", "words.load_archived_entries": "Load archived entries", "words.login": "Login", "words.rss": "RSS", diff --git a/locales/external/en.json b/locales/external/en.json index 9fc84c75c..6292cc41e 100644 --- a/locales/external/en.json +++ b/locales/external/en.json @@ -1,7 +1,10 @@ { "copied_link": "Copied link to clipboard", + "feed.feeds_one": "feed", + "feed.feeds_other": "feeds", "feed.follower_one": "follower", "feed.follower_other": "followers", + "feed.followsAndFeeds": "{{subscriptionCount}} {{subscriptionNoun}} with {{feedsCount}} {{feedsNoun}} on {{appName}}", "feed.followsAndReads": "{{subscriptionCount}} {{subscriptionNoun}} with {{readCount}} {{readNoun}} on {{appName}}", "feed.read_one": "read", "feed.read_other": "reads", diff --git a/locales/settings/en.json b/locales/settings/en.json index 3f9fa74aa..f7660b11d 100644 --- a/locales/settings/en.json +++ b/locales/settings/en.json @@ -152,6 +152,32 @@ "invitation.tableHeaders.creationTime": "Creation Time", "invitation.tableHeaders.usedBy": "Used by", "invitation.title": "Invitation Code", + "lists.create": "Create New List", + "lists.created.error": "Failed to create list.", + "lists.created.success": "List created successfully!", + "lists.description": "Description", + "lists.edit": "Edit", + "lists.edit.error": "Failed to edit list.", + "lists.edit.success": "List edited successfully!", + "lists.fee": "Fee", + "lists.fee.description": "The fee others need to pay you to subscribe to this list.", + "lists.feeds": "Feeds", + "lists.feeds.add": "Add", + "lists.feeds.add.error": "Failed to add feed to list.", + "lists.feeds.add.success": "Feed added to list.", + "lists.feeds.delete.error": "Failed to remove feed from list.", + "lists.feeds.delete.success": "Feed removed from list.", + "lists.feeds.id": "Feed ID", + "lists.feeds.manage": "Manage Feeds", + "lists.feeds.owner": "Owner", + "lists.feeds.remove": "Remove", + "lists.feeds.title": "Title", + "lists.image": "Image", + "lists.info": "Lists are collections of feeds that you can share or sell for others to subscribe to. Subscribers will synchronize and access all feeds in the list.", + "lists.noLists": "No lists", + "lists.submit": "Submit", + "lists.title": "Title", + "lists.view": "View", "profile.avatar.label": "Avatar", "profile.handle.description": "Your unique identifier.", "profile.handle.label": "Handle", @@ -168,6 +194,7 @@ "titles.general": "General", "titles.integration": "Integration", "titles.invitations": "Invitations", + "titles.lists": "Lists", "titles.power": "Power", "titles.profile": "Profile", "titles.shortcuts": "Shortcuts", diff --git a/packages/shared/src/hono.ts b/packages/shared/src/hono.ts index ae3a5ec8f..d94dad9f3 100644 --- a/packages/shared/src/hono.ts +++ b/packages/shared/src/hono.ts @@ -1226,49 +1226,6 @@ declare const feedsOpenAPISchema: zod.ZodObject<{ errorAt: string | null; ownerUserId: string | null; }>; -declare const feedsInputSchema: zod.ZodObject<{ - description: zod.ZodOptional>; - title: zod.ZodOptional>; - id: zod.ZodOptional; - image: zod.ZodOptional>; - url: zod.ZodString; - siteUrl: zod.ZodOptional>; - checkedAt: zod.ZodString; - lastModifiedHeader: zod.ZodOptional>; - etagHeader: zod.ZodOptional>; - ttl: zod.ZodOptional>; - errorMessage: zod.ZodOptional>; - errorAt: zod.ZodOptional>; - ownerUserId: zod.ZodOptional>; -}, zod.UnknownKeysParam, zod.ZodTypeAny, { - url: string; - checkedAt: string; - description?: string | null | undefined; - title?: string | null | undefined; - id?: string | undefined; - image?: string | null | undefined; - siteUrl?: string | null | undefined; - lastModifiedHeader?: string | null | undefined; - etagHeader?: string | null | undefined; - ttl?: number | null | undefined; - errorMessage?: string | null | undefined; - errorAt?: string | null | undefined; - ownerUserId?: string | null | undefined; -}, { - url: string; - checkedAt: string; - description?: string | null | undefined; - title?: string | null | undefined; - id?: string | undefined; - image?: string | null | undefined; - siteUrl?: string | null | undefined; - lastModifiedHeader?: string | null | undefined; - etagHeader?: string | null | undefined; - ttl?: number | null | undefined; - errorMessage?: string | null | undefined; - errorAt?: string | null | undefined; - ownerUserId?: string | null | undefined; -}>; declare const feedsRelations: drizzle_orm.Relations<"feeds", { subscriptions: drizzle_orm.Many<"subscriptions">; entries: drizzle_orm.Many<"entries">; @@ -1276,201 +1233,6 @@ declare const feedsRelations: drizzle_orm.Relations<"feeds", { }>; type FeedModel = InferInsertModel; -declare const invitations: drizzle_orm_pg_core.PgTableWithColumns<{ - name: "invitations"; - schema: undefined; - columns: { - code: drizzle_orm_pg_core.PgColumn<{ - name: "code"; - tableName: "invitations"; - dataType: "string"; - columnType: "PgText"; - data: string; - driverParam: string; - notNull: true; - hasDefault: false; - isPrimaryKey: true; - isAutoincrement: false; - hasRuntimeDefault: false; - enumValues: [string, ...string[]]; - baseColumn: never; - generated: undefined; - }, {}, {}>; - createdAt: drizzle_orm_pg_core.PgColumn<{ - name: "created_at"; - tableName: "invitations"; - dataType: "date"; - columnType: "PgTimestamp"; - data: Date; - driverParam: string; - notNull: false; - hasDefault: true; - isPrimaryKey: false; - isAutoincrement: false; - hasRuntimeDefault: false; - enumValues: undefined; - baseColumn: never; - generated: undefined; - }, {}, {}>; - fromUserId: drizzle_orm_pg_core.PgColumn<{ - name: "from_user_id"; - tableName: "invitations"; - dataType: "string"; - columnType: "PgText"; - data: string; - driverParam: string; - notNull: true; - hasDefault: false; - isPrimaryKey: false; - isAutoincrement: false; - hasRuntimeDefault: false; - enumValues: [string, ...string[]]; - baseColumn: never; - generated: undefined; - }, {}, {}>; - toUserId: drizzle_orm_pg_core.PgColumn<{ - name: "to_user_id"; - tableName: "invitations"; - dataType: "string"; - columnType: "PgText"; - data: string; - driverParam: string; - notNull: false; - hasDefault: false; - isPrimaryKey: false; - isAutoincrement: false; - hasRuntimeDefault: false; - enumValues: [string, ...string[]]; - baseColumn: never; - generated: undefined; - }, {}, {}>; - }; - dialect: "pg"; -}>; -declare const invitationsOpenAPISchema: zod.ZodObject<{ - code: zod.ZodString; - createdAt: zod.ZodNullable; - fromUserId: zod.ZodString; - toUserId: zod.ZodNullable; -}, zod.UnknownKeysParam, zod.ZodTypeAny, { - code: string; - createdAt: string | null; - fromUserId: string; - toUserId: string | null; -}, { - code: string; - createdAt: string | null; - fromUserId: string; - toUserId: string | null; -}>; -declare const invitationsRelations: drizzle_orm.Relations<"invitations", { - users: drizzle_orm.One<"user", false>; -}>; - -declare const settings: drizzle_orm_pg_core.PgTableWithColumns<{ - name: "settings"; - schema: undefined; - columns: { - id: drizzle_orm_pg_core.PgColumn<{ - name: "id"; - tableName: "settings"; - dataType: "string"; - columnType: "PgText"; - data: string; - driverParam: string; - notNull: true; - hasDefault: true; - isPrimaryKey: true; - isAutoincrement: false; - hasRuntimeDefault: true; - enumValues: [string, ...string[]]; - baseColumn: never; - generated: undefined; - }, {}, {}>; - userId: drizzle_orm_pg_core.PgColumn<{ - name: "user_id"; - tableName: "settings"; - dataType: "string"; - columnType: "PgText"; - data: string; - driverParam: string; - notNull: true; - hasDefault: false; - isPrimaryKey: false; - isAutoincrement: false; - hasRuntimeDefault: false; - enumValues: [string, ...string[]]; - baseColumn: never; - generated: undefined; - }, {}, {}>; - tab: drizzle_orm_pg_core.PgColumn<{ - name: "tab"; - tableName: "settings"; - dataType: "string"; - columnType: "PgText"; - data: "general" | "appearance" | "integration"; - driverParam: string; - notNull: true; - hasDefault: false; - isPrimaryKey: false; - isAutoincrement: false; - hasRuntimeDefault: false; - enumValues: ["general", "appearance", "integration"]; - baseColumn: never; - generated: undefined; - }, {}, {}>; - payload: drizzle_orm_pg_core.PgColumn<{ - name: "payload"; - tableName: "settings"; - dataType: "json"; - columnType: "PgJsonb"; - data: Record; - driverParam: unknown; - notNull: false; - hasDefault: true; - isPrimaryKey: false; - isAutoincrement: false; - hasRuntimeDefault: false; - enumValues: undefined; - baseColumn: never; - generated: undefined; - }, {}, {}>; - updateAt: drizzle_orm_pg_core.PgColumn<{ - name: "update_at"; - tableName: "settings"; - dataType: "date"; - columnType: "PgTimestamp"; - data: Date; - driverParam: string; - notNull: false; - hasDefault: false; - isPrimaryKey: false; - isAutoincrement: false; - hasRuntimeDefault: false; - enumValues: undefined; - baseColumn: never; - generated: undefined; - }, {}, {}>; - version: drizzle_orm_pg_core.PgColumn<{ - name: "version"; - tableName: "settings"; - dataType: "number"; - columnType: "PgInteger"; - data: number; - driverParam: string | number; - notNull: true; - hasDefault: true; - isPrimaryKey: false; - isAutoincrement: false; - hasRuntimeDefault: false; - enumValues: undefined; - baseColumn: never; - generated: undefined; - }, {}, {}>; - }; - dialect: "pg"; -}>; - declare const subscriptions: drizzle_orm_pg_core.PgTableWithColumns<{ name: "subscriptions"; schema: undefined; @@ -1751,6 +1513,625 @@ declare const timelineRelations: drizzle_orm.Relations<"timeline", { collections: drizzle_orm.One<"collections", true>; }>; +declare const invitations: drizzle_orm_pg_core.PgTableWithColumns<{ + name: "invitations"; + schema: undefined; + columns: { + code: drizzle_orm_pg_core.PgColumn<{ + name: "code"; + tableName: "invitations"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: true; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + createdAt: drizzle_orm_pg_core.PgColumn<{ + name: "created_at"; + tableName: "invitations"; + dataType: "date"; + columnType: "PgTimestamp"; + data: Date; + driverParam: string; + notNull: false; + hasDefault: true; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + fromUserId: drizzle_orm_pg_core.PgColumn<{ + name: "from_user_id"; + tableName: "invitations"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + toUserId: drizzle_orm_pg_core.PgColumn<{ + name: "to_user_id"; + tableName: "invitations"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: false; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + }; + dialect: "pg"; +}>; +declare const invitationsOpenAPISchema: zod.ZodObject<{ + code: zod.ZodString; + createdAt: zod.ZodNullable; + fromUserId: zod.ZodString; + toUserId: zod.ZodNullable; +}, zod.UnknownKeysParam, zod.ZodTypeAny, { + code: string; + createdAt: string | null; + fromUserId: string; + toUserId: string | null; +}, { + code: string; + createdAt: string | null; + fromUserId: string; + toUserId: string | null; +}>; +declare const invitationsRelations: drizzle_orm.Relations<"invitations", { + users: drizzle_orm.One<"user", false>; +}>; + +declare const lists: drizzle_orm_pg_core.PgTableWithColumns<{ + name: "lists"; + schema: undefined; + columns: { + id: drizzle_orm_pg_core.PgColumn<{ + name: "id"; + tableName: "lists"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: true; + isPrimaryKey: true; + isAutoincrement: false; + hasRuntimeDefault: true; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + feedIds: drizzle_orm_pg_core.PgColumn<{ + name: "feed_ids"; + tableName: "lists"; + dataType: "array"; + columnType: "PgArray"; + data: string[]; + driverParam: string | string[]; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: drizzle_orm.Column<{ + name: "feed_ids"; + tableName: "lists"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: false; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, object, object>; + generated: undefined; + }, {}, {}>; + title: drizzle_orm_pg_core.PgColumn<{ + name: "title"; + tableName: "lists"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + description: drizzle_orm_pg_core.PgColumn<{ + name: "description"; + tableName: "lists"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: false; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + image: drizzle_orm_pg_core.PgColumn<{ + name: "image"; + tableName: "lists"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: false; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + view: drizzle_orm_pg_core.PgColumn<{ + name: "view"; + tableName: "lists"; + dataType: "number"; + columnType: "PgSmallInt"; + data: number; + driverParam: string | number; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + fee: drizzle_orm_pg_core.PgColumn<{ + name: "fee"; + tableName: "lists"; + dataType: "number"; + columnType: "PgInteger"; + data: number; + driverParam: string | number; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + timelineUpdatedAt: drizzle_orm_pg_core.PgColumn<{ + name: "timeline_updated_at"; + tableName: "lists"; + dataType: "date"; + columnType: "PgTimestamp"; + data: Date; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + ownerUserId: drizzle_orm_pg_core.PgColumn<{ + name: "owner_user_id"; + tableName: "lists"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + }; + dialect: "pg"; +}>; +declare const listsOpenAPISchema: zod.ZodObject<{ + id: zod.ZodString; + feedIds: zod.ZodArray; + title: zod.ZodString; + description: zod.ZodNullable; + image: zod.ZodNullable; + view: zod.ZodNumber; + fee: zod.ZodNumber; + timelineUpdatedAt: zod.ZodString; + ownerUserId: zod.ZodString; +}, zod.UnknownKeysParam, zod.ZodTypeAny, { + description: string | null; + title: string; + id: string; + image: string | null; + view: number; + ownerUserId: string; + feedIds: string[]; + fee: number; + timelineUpdatedAt: string; +}, { + description: string | null; + title: string; + id: string; + image: string | null; + view: number; + ownerUserId: string; + feedIds: string[]; + fee: number; + timelineUpdatedAt: string; +}>; +declare const listsRelations: drizzle_orm.Relations<"lists", { + owner: drizzle_orm.One<"user", true>; + listsSubscriptions: drizzle_orm.Many<"lists_subscriptions">; +}>; + +declare const listsSubscriptions: drizzle_orm_pg_core.PgTableWithColumns<{ + name: "lists_subscriptions"; + schema: undefined; + columns: { + userId: drizzle_orm_pg_core.PgColumn<{ + name: "user_id"; + tableName: "lists_subscriptions"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + listId: drizzle_orm_pg_core.PgColumn<{ + name: "list_id"; + tableName: "lists_subscriptions"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + view: drizzle_orm_pg_core.PgColumn<{ + name: "view"; + tableName: "lists_subscriptions"; + dataType: "number"; + columnType: "PgSmallInt"; + data: number; + driverParam: string | number; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + title: drizzle_orm_pg_core.PgColumn<{ + name: "title"; + tableName: "lists_subscriptions"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: false; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + lastViewedAt: drizzle_orm_pg_core.PgColumn<{ + name: "last_viewed_at"; + tableName: "lists_subscriptions"; + dataType: "date"; + columnType: "PgTimestamp"; + data: Date; + driverParam: string; + notNull: false; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + isPrivate: drizzle_orm_pg_core.PgColumn<{ + name: "is_private"; + tableName: "lists_subscriptions"; + dataType: "boolean"; + columnType: "PgBoolean"; + data: boolean; + driverParam: boolean; + notNull: true; + hasDefault: true; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + }; + dialect: "pg"; +}>; +declare const listsSubscriptionsOpenAPISchema: zod.ZodObject<{ + userId: zod.ZodString; + listId: zod.ZodString; + view: zod.ZodNumber; + title: zod.ZodNullable; + lastViewedAt: zod.ZodNullable; + isPrivate: zod.ZodBoolean; +}, zod.UnknownKeysParam, zod.ZodTypeAny, { + title: string | null; + userId: string; + view: number; + isPrivate: boolean; + listId: string; + lastViewedAt: string | null; +}, { + title: string | null; + userId: string; + view: number; + isPrivate: boolean; + listId: string; + lastViewedAt: string | null; +}>; +declare const listsSubscriptionsRelations: drizzle_orm.Relations<"lists_subscriptions", { + users: drizzle_orm.One<"user", true>; + lists: drizzle_orm.One<"lists", true>; +}>; + +declare const listsTimeline: drizzle_orm_pg_core.PgTableWithColumns<{ + name: "lists_timeline"; + schema: undefined; + columns: { + listId: drizzle_orm_pg_core.PgColumn<{ + name: "list_id"; + tableName: "lists_timeline"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + feedId: drizzle_orm_pg_core.PgColumn<{ + name: "feedId"; + tableName: "lists_timeline"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + entryId: drizzle_orm_pg_core.PgColumn<{ + name: "entry_id"; + tableName: "lists_timeline"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + insertedAt: drizzle_orm_pg_core.PgColumn<{ + name: "inserted_at"; + tableName: "lists_timeline"; + dataType: "date"; + columnType: "PgTimestamp"; + data: Date; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + }; + dialect: "pg"; +}>; +declare const listsTimelineOpenAPISchema: zod.ZodObject<{ + listId: zod.ZodString; + feedId: zod.ZodString; + entryId: zod.ZodString; + insertedAt: zod.ZodString; +}, zod.UnknownKeysParam, zod.ZodTypeAny, { + feedId: string; + insertedAt: string; + entryId: string; + listId: string; +}, { + feedId: string; + insertedAt: string; + entryId: string; + listId: string; +}>; +declare const listsTimelineRelations: drizzle_orm.Relations<"lists_timeline", { + entries: drizzle_orm.One<"entries", true>; + feeds: drizzle_orm.One<"feeds", true>; +}>; + +declare const settings: drizzle_orm_pg_core.PgTableWithColumns<{ + name: "settings"; + schema: undefined; + columns: { + id: drizzle_orm_pg_core.PgColumn<{ + name: "id"; + tableName: "settings"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: true; + isPrimaryKey: true; + isAutoincrement: false; + hasRuntimeDefault: true; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + userId: drizzle_orm_pg_core.PgColumn<{ + name: "user_id"; + tableName: "settings"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + tab: drizzle_orm_pg_core.PgColumn<{ + name: "tab"; + tableName: "settings"; + dataType: "string"; + columnType: "PgText"; + data: "general" | "appearance" | "integration"; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: ["general", "appearance", "integration"]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + payload: drizzle_orm_pg_core.PgColumn<{ + name: "payload"; + tableName: "settings"; + dataType: "json"; + columnType: "PgJsonb"; + data: Record; + driverParam: unknown; + notNull: false; + hasDefault: true; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + updateAt: drizzle_orm_pg_core.PgColumn<{ + name: "update_at"; + tableName: "settings"; + dataType: "date"; + columnType: "PgTimestamp"; + data: Date; + driverParam: string; + notNull: false; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + version: drizzle_orm_pg_core.PgColumn<{ + name: "version"; + tableName: "settings"; + dataType: "number"; + columnType: "PgInteger"; + data: number; + driverParam: string | number; + notNull: true; + hasDefault: true; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + }; + dialect: "pg"; +}>; + declare const users: drizzle_orm_pg_core.PgTableWithColumns<{ name: "user"; schema: undefined; @@ -2188,6 +2569,7 @@ declare const verificationTokens: drizzle_orm_pg_core.PgTableWithColumns<{ }>; declare const usersRelations: drizzle_orm.Relations<"user", { subscriptions: drizzle_orm.Many<"subscriptions">; + listsSubscriptions: drizzle_orm.Many<"lists_subscriptions">; collections: drizzle_orm.Many<"collections">; actions: drizzle_orm.One<"actions", true>; wallets: drizzle_orm.One<"wallets", true>; @@ -2412,6 +2794,22 @@ declare const transactions: drizzle_orm_pg_core.PgTableWithColumns<{ baseColumn: never; generated: undefined; }, {}, {}>; + toListId: drizzle_orm_pg_core.PgColumn<{ + name: "to_list_id"; + tableName: "transactions"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: false; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; toEntryId: drizzle_orm_pg_core.PgColumn<{ name: "to_entry_id"; tableName: "transactions"; @@ -2485,6 +2883,7 @@ declare const transactionsOpenAPISchema: zod.ZodObject<{ fromUserId: zod.ZodNullable; toUserId: zod.ZodNullable; toFeedId: zod.ZodNullable; + toListId: zod.ZodNullable; toEntryId: zod.ZodNullable; powerToken: zod.ZodString; createdAt: zod.ZodString; @@ -2496,6 +2895,7 @@ declare const transactionsOpenAPISchema: zod.ZodObject<{ toUserId: string | null; hash: string; toFeedId: string | null; + toListId: string | null; toEntryId: string | null; powerToken: string; comment: string | null; @@ -2506,6 +2906,7 @@ declare const transactionsOpenAPISchema: zod.ZodObject<{ toUserId: string | null; hash: string; toFeedId: string | null; + toListId: string | null; toEntryId: string | null; powerToken: string; comment: string | null; @@ -2571,6 +2972,288 @@ declare const feedPowerTokensRelations: drizzle_orm.Relations<"feedPowerTokens", }>; declare const _routes: hono_hono_base.HonoBase; type AppType = typeof _routes; -export { type ActionsModel, type AppType, type AttachmentsModel, type EntriesModel, type EntryReadHistoriesModel, type FeedModel, type MediaModel, type SettingsModel, accounts, actions, actionsItemOpenAPISchema, actionsOpenAPISchema, actionsRelations, collections, collectionsOpenAPISchema, collectionsRelations, entries, entriesOpenAPISchema, entriesRelations, entryReadHistories, entryReadHistoriesOpenAPISchema, entryReadHistoriesRelations, feedPowerTokens, feedPowerTokensOpenAPISchema, feedPowerTokensRelations, feeds, feedsInputSchema, feedsOpenAPISchema, feedsRelations, invitations, invitationsOpenAPISchema, invitationsRelations, languageSchema, sessions, settings, subscriptions, subscriptionsOpenAPISchema, subscriptionsRelations, timeline, timelineOpenAPISchema, timelineRelations, transactionType, transactions, transactionsOpenAPISchema, transactionsRelations, users, usersOpenApiSchema, usersRelations, verificationTokens, wallets, walletsOpenAPISchema, walletsRelations }; +export { type ActionsModel, type AppType, type AttachmentsModel, type EntriesModel, type EntryReadHistoriesModel, type FeedModel, type MediaModel, type SettingsModel, accounts, actions, actionsItemOpenAPISchema, actionsOpenAPISchema, actionsRelations, collections, collectionsOpenAPISchema, collectionsRelations, entries, entriesOpenAPISchema, entriesRelations, entryReadHistories, entryReadHistoriesOpenAPISchema, entryReadHistoriesRelations, feedPowerTokens, feedPowerTokensOpenAPISchema, feedPowerTokensRelations, feeds, feedsOpenAPISchema, feedsRelations, invitations, invitationsOpenAPISchema, invitationsRelations, languageSchema, lists, listsOpenAPISchema, listsRelations, listsSubscriptions, listsSubscriptionsOpenAPISchema, listsSubscriptionsRelations, listsTimeline, listsTimelineOpenAPISchema, listsTimelineRelations, sessions, settings, subscriptions, subscriptionsOpenAPISchema, subscriptionsRelations, timeline, timelineOpenAPISchema, timelineRelations, transactionType, transactions, transactionsOpenAPISchema, transactionsRelations, users, usersOpenApiSchema, usersRelations, verificationTokens, wallets, walletsOpenAPISchema, walletsRelations }; From 912ef59f75a0309cba81b2fbce6764eed944936e Mon Sep 17 00:00:00 2001 From: Innei Date: Sat, 21 Sep 2024 22:14:49 +0800 Subject: [PATCH 16/47] refactor: extract `ViewSelectorRadioGroup` Signed-off-by: Innei --- .../src/modules/discover/feed-form.tsx | 41 ++--------- .../src/modules/settings/tabs/lists.tsx | 73 +++++++------------ .../modules/shared/ViewSelectorRadioGroup.tsx | 46 ++++++++++++ locales/common/en.json | 3 + 4 files changed, 84 insertions(+), 79 deletions(-) create mode 100644 apps/renderer/src/modules/shared/ViewSelectorRadioGroup.tsx diff --git a/apps/renderer/src/modules/discover/feed-form.tsx b/apps/renderer/src/modules/discover/feed-form.tsx index 3827c0705..d271ecc1a 100644 --- a/apps/renderer/src/modules/discover/feed-form.tsx +++ b/apps/renderer/src/modules/discover/feed-form.tsx @@ -24,7 +24,6 @@ import { Input } from "~/components/ui/input" import { LoadingCircle } from "~/components/ui/loading" import { useCurrentModal } from "~/components/ui/modal" import { Switch } from "~/components/ui/switch" -import { views } from "~/constants" import { useAuthQuery, useI18n } from "~/hooks/common" import { apiClient } from "~/lib/api-fetch" import { tipcClient } from "~/lib/client" @@ -38,6 +37,8 @@ import { useFeedByIdOrUrl } from "~/store/feed" import { useSubscriptionByFeedId } from "~/store/subscription" import { feedUnreadActions } from "~/store/unread" +import { ViewSelectorRadioGroup } from "../shared/ViewSelectorRadioGroup" + const formSchema = z.object({ view: z.string(), category: z.string().nullable().optional(), @@ -271,38 +272,12 @@ const FeedInnerForm = ({ render={() => ( {t("feed_form.view")} - - - {views.map((view) => ( -
- - -
- ))} -
-
+ +
)} diff --git a/apps/renderer/src/modules/settings/tabs/lists.tsx b/apps/renderer/src/modules/settings/tabs/lists.tsx index 5245cc9f9..9d41c5e2b 100644 --- a/apps/renderer/src/modules/settings/tabs/lists.tsx +++ b/apps/renderer/src/modules/settings/tabs/lists.tsx @@ -10,7 +10,6 @@ import { z } from "zod" import { FeedCertification } from "~/components/feed-certification" import { Avatar, AvatarImage } from "~/components/ui/avatar" import { Button } from "~/components/ui/button" -import { Card, CardHeader } from "~/components/ui/card" import { Divider } from "~/components/ui/divider" import { Form, @@ -34,16 +33,18 @@ import { TableRow, } from "~/components/ui/table" import { views } from "~/constants" -import { useAuthQuery } from "~/hooks/common" +import { useAuthQuery, useI18n } from "~/hooks/common" import { apiClient } from "~/lib/api-fetch" import { cn } from "~/lib/utils" import type { ListModel } from "~/models" +import { ViewSelectorRadioGroup } from "~/modules/shared/ViewSelectorRadioGroup" import { Queries } from "~/queries" import { feedActions, useFeedById } from "~/store/feed" export const SettingLists = () => { - const { t: appT } = useTranslation() - const { t } = useTranslation("settings") + // const { t: appT } = useTranslation() + const t = useI18n() + // const { t } = useTranslation("settings") const listList = useAuthQuery(Queries.lists.list()) const { present } = useModalStack() @@ -51,18 +52,18 @@ export const SettingLists = () => { return (
-

{t("lists.info")}

+

{t.settings("lists.info")}

@@ -72,19 +73,19 @@ export const SettingLists = () => { - {t("lists.title")} + {t.settings("lists.title")} - {t("lists.view")} + {t.settings("lists.view")} - {t("lists.fee")} + {t.settings("lists.fee")} - {t("lists.feeds")} + {t.settings("lists.feeds")} - {t("lists.edit")} + {t.settings("lists.edit")} @@ -110,7 +111,7 @@ export const SettingLists = () => { {views[row.view].icon} - {appT(views[row.view].name)} + {t(views[row.view].name)}
@@ -124,7 +125,7 @@ export const SettingLists = () => { variant="ghost" onClick={() => { present({ - title: t("lists.feeds.manage"), + title: t.settings("lists.feeds.manage"), content: () => , }) }} @@ -137,7 +138,7 @@ export const SettingLists = () => { variant="ghost" onClick={() => { present({ - title: t("lists.edit"), + title: t.settings("lists.edit"), content: ({ dismiss }) => ( ), @@ -155,7 +156,7 @@ export const SettingLists = () => { ) : (
-

{t("lists.noLists")}

+

{t.settings("lists.noLists")}

)} @@ -173,9 +174,10 @@ const formSchema = z.object({ }) const ListCreationModalContent = ({ dismiss, id }: { dismiss: () => void; id?: string }) => { - const { t: appT } = useTranslation() const { t } = useTranslation("settings") + const appT = useI18n() + const list = useFeedById(id) as ListModel const form = useForm>({ @@ -224,7 +226,7 @@ const ListCreationModalContent = ({ dismiss, id }: { dismiss: () => void; id?: s return (
- + void; id?: s render={() => ( {t("lists.view")} - - - {views.map((view) => ( -
- - -
- ))} -
-
+ +
)} @@ -338,9 +317,11 @@ const ListCreationModalContent = ({ dismiss, id }: { dismiss: () => void; id?: s )} /> - +
+ +
) diff --git a/apps/renderer/src/modules/shared/ViewSelectorRadioGroup.tsx b/apps/renderer/src/modules/shared/ViewSelectorRadioGroup.tsx new file mode 100644 index 000000000..b53008c38 --- /dev/null +++ b/apps/renderer/src/modules/shared/ViewSelectorRadioGroup.tsx @@ -0,0 +1,46 @@ +import { forwardRef } from "react" + +import { Card, CardHeader } from "~/components/ui/card" +import { views } from "~/constants" +import { useI18n } from "~/hooks/common" +import { cn } from "~/lib/utils" + +export const ViewSelectorRadioGroup = forwardRef< + HTMLInputElement, + React.InputHTMLAttributes +>(({ className, ...rest }, ref) => { + const t = useI18n() + + return ( + + + {views.map((view) => ( +
+ + +
+ ))} +
+
+ ) +}) diff --git a/locales/common/en.json b/locales/common/en.json index cac928eec..f6a497fa7 100644 --- a/locales/common/en.json +++ b/locales/common/en.json @@ -12,6 +12,7 @@ "tips.load-lng-error": "Failed to load language pack", "words.back": "Back", "words.copy": "Copy", + "words.create": "Create", "words.edit": "Edit", "words.entry": "Entry", "words.id": "ID", @@ -25,5 +26,7 @@ "words.result_one": "result", "words.result_other": "results", "words.space": " ", + "words.submit": "Submit", + "words.update": "Update", "words.which.all": "All" } From cf9285b40e6fc8b027588fe01a0f50b29dd202dc Mon Sep 17 00:00:00 2001 From: Innei Date: Sat, 21 Sep 2024 22:32:59 +0800 Subject: [PATCH 17/47] fix: adjust layout Signed-off-by: Innei --- .../src/modules/feed-column/header.tsx | 7 ++++ .../renderer/src/modules/feed-column/list.tsx | 37 ++++++------------- icons/mgc/compass_3_cute_re.svg | 1 + 3 files changed, 20 insertions(+), 25 deletions(-) create mode 100644 icons/mgc/compass_3_cute_re.svg diff --git a/apps/renderer/src/modules/feed-column/header.tsx b/apps/renderer/src/modules/feed-column/header.tsx index 4fabea7fc..269e4821f 100644 --- a/apps/renderer/src/modules/feed-column/header.tsx +++ b/apps/renderer/src/modules/feed-column/header.tsx @@ -2,6 +2,7 @@ import { m } from "framer-motion" import type { FC, PropsWithChildren } from "react" import { memo, useCallback, useEffect, useRef, useState } from "react" import { useTranslation } from "react-i18next" +import { Link } from "react-router-dom" import { toast } from "sonner" import { setAppSearchOpen } from "~/atoms/app" @@ -35,6 +36,7 @@ export const FeedColumnHeader = memo(() => { const [active] = useSidebarActiveView() const navigateBackHome = useBackHome(active) const normalStyle = !window.electron || window.electron.process.platform !== "darwin" + const { t } = useTranslation() return (
{ )}
+ + + + + diff --git a/apps/renderer/src/modules/feed-column/list.tsx b/apps/renderer/src/modules/feed-column/list.tsx index 79240391b..18b0a9541 100644 --- a/apps/renderer/src/modules/feed-column/list.tsx +++ b/apps/renderer/src/modules/feed-column/list.tsx @@ -2,7 +2,7 @@ import * as HoverCard from "@radix-ui/react-hover-card" import { AnimatePresence, m } from "framer-motion" import { Fragment, memo, useMemo, useState } from "react" import { useTranslation } from "react-i18next" -import { Link, useLocation, useNavigate } from "react-router-dom" +import { Link } from "react-router-dom" import { useUISettingKey } from "~/atoms/settings/ui" import { ScrollArea } from "~/components/ui/scroll-area" @@ -104,15 +104,9 @@ function FeedListImpl({ className, view }: { className?: string; view: number }) const { t } = useTranslation() - const location = useLocation() - const navigate = useNavigate() - return (
-
+
{ @@ -138,23 +132,11 @@ function FeedListImpl({ className, view }: { className?: string; view: number })
+
{ - e.stopPropagation() - navigate(`/discover`) - }} - > - - {t("words.discover")} -
-
{ @@ -168,18 +150,23 @@ function FeedListImpl({ className, view }: { className?: string; view: number }) } }} > - + {t("words.starred")}
{Object.keys(listsData).length > 0 && ( <> -
+
{t("words.lists")}
)} -
+
{t("words.feeds")}
{hasData ? ( diff --git a/icons/mgc/compass_3_cute_re.svg b/icons/mgc/compass_3_cute_re.svg new file mode 100644 index 000000000..1a71a5483 --- /dev/null +++ b/icons/mgc/compass_3_cute_re.svg @@ -0,0 +1 @@ + \ No newline at end of file From b51d75ffc9b0a9c2760269041aaa4c5a7f6b26d0 Mon Sep 17 00:00:00 2001 From: Innei Date: Sat, 21 Sep 2024 22:42:01 +0800 Subject: [PATCH 18/47] fix: update search for Signed-off-by: Innei --- apps/renderer/src/modules/discover/form.tsx | 10 +++-- .../src/modules/feed-column/header.tsx | 41 +++++++++++++------ .../renderer/src/modules/feed-column/list.tsx | 4 +- locales/app/en.json | 2 +- 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/apps/renderer/src/modules/discover/form.tsx b/apps/renderer/src/modules/discover/form.tsx index 0b0957339..a82500ec6 100644 --- a/apps/renderer/src/modules/discover/form.tsx +++ b/apps/renderer/src/modules/discover/form.tsx @@ -206,11 +206,15 @@ export function DiscoverForm({ type }: { type: string }) { control={form.control} name="target" render={({ field }) => ( - + {t("discover.target")} -
- +
+ diff --git a/apps/renderer/src/modules/feed-column/header.tsx b/apps/renderer/src/modules/feed-column/header.tsx index 269e4821f..bb48a516d 100644 --- a/apps/renderer/src/modules/feed-column/header.tsx +++ b/apps/renderer/src/modules/feed-column/header.tsx @@ -1,6 +1,7 @@ import { m } from "framer-motion" import type { FC, PropsWithChildren } from "react" import { memo, useCallback, useEffect, useRef, useState } from "react" +import { useHotkeys } from "react-hotkeys-hook" import { useTranslation } from "react-i18next" import { Link } from "react-router-dom" import { toast } from "sonner" @@ -65,7 +66,7 @@ export const FeedColumnHeader = memo(() => { - + @@ -145,17 +146,33 @@ const LogoContextMenu: FC = ({ children }) => { ) } -const SearchActionButton = () => { +// const SearchActionButton = () => { +// const canSearch = useGeneralSettingKey("dataPersist") +// const { t } = useTranslation() +// if (!canSearch) return null +// return ( +// setAppSearchOpen(true)} +// > +// +// +// ) +// } + +const SearchTrigger = () => { const canSearch = useGeneralSettingKey("dataPersist") - const { t } = useTranslation() - if (!canSearch) return null - return ( - setAppSearchOpen(true)} - > - - + + useHotkeys( + "meta+k", + () => { + setAppSearchOpen(true) + }, + { + enabled: canSearch, + }, ) + + return null } diff --git a/apps/renderer/src/modules/feed-column/list.tsx b/apps/renderer/src/modules/feed-column/list.tsx index 18b0a9541..c202c7a81 100644 --- a/apps/renderer/src/modules/feed-column/list.tsx +++ b/apps/renderer/src/modules/feed-column/list.tsx @@ -136,7 +136,7 @@ function FeedListImpl({ className, view }: { className?: string; view: number })
{ @@ -150,7 +150,7 @@ function FeedListImpl({ className, view }: { className?: string; view: number }) } }} > - + {t("words.starred")}
{Object.keys(listsData).length > 0 && ( diff --git a/locales/app/en.json b/locales/app/en.json index ca2ec2a2c..71942178e 100644 --- a/locales/app/en.json +++ b/locales/app/en.json @@ -14,7 +14,7 @@ "discover.rss_hub_route": "RSSHub Route", "discover.rss_url": "RSS URL", "discover.select_placeholder": "Select", - "discover.target": "Type", + "discover.target": "Search for", "discover.target.feeds": "Feeds", "discover.target.lists": "Lists", "early_access": "Early Access", From 2839010964f4b27fb1e473211b17913506869fda Mon Sep 17 00:00:00 2001 From: Innei Date: Sat, 21 Sep 2024 23:08:56 +0800 Subject: [PATCH 19/47] feat: manage feeds fuzzy search by feed title Signed-off-by: Innei --- .../ui/auto-completion/AutoCompletion.tsx | 9 +- .../src/modules/settings/tabs/lists.tsx | 89 ++++++++++++++----- locales/settings/en.json | 3 +- 3 files changed, 74 insertions(+), 27 deletions(-) diff --git a/apps/renderer/src/components/ui/auto-completion/AutoCompletion.tsx b/apps/renderer/src/components/ui/auto-completion/AutoCompletion.tsx index 181cae95a..b66d39366 100644 --- a/apps/renderer/src/components/ui/auto-completion/AutoCompletion.tsx +++ b/apps/renderer/src/components/ui/auto-completion/AutoCompletion.tsx @@ -21,9 +21,11 @@ export interface AutocompleteProps extends React.InputHTMLAttributes suggestion?.name export const Autocomplete = forwardRef( ( @@ -34,7 +36,7 @@ export const Autocomplete = forwardRef( maxHeight, portal, value, - + searchKeys = defaultSearchKeys, defaultValue, ...inputProps }, @@ -48,7 +50,7 @@ export const Autocomplete = forwardRef( const doFilter = useCallback(() => { const fuse = new Fuse(suggestions, { - keys: ["name", "value"], + keys: searchKeys, }) const trimInputValue = (value as string)?.trim() @@ -56,8 +58,9 @@ export const Autocomplete = forwardRef( if (!trimInputValue) return setFilterableSuggestions(suggestions) const results = fuse.search(trimInputValue) + setFilterableSuggestions(results.map((result) => result.item)) - }, [suggestions, value]) + }, [suggestions, value, searchKeys]) useEffect(() => { doFilter() }, [doFilter]) diff --git a/apps/renderer/src/modules/settings/tabs/lists.tsx b/apps/renderer/src/modules/settings/tabs/lists.tsx index 9d41c5e2b..63789c755 100644 --- a/apps/renderer/src/modules/settings/tabs/lists.tsx +++ b/apps/renderer/src/modules/settings/tabs/lists.tsx @@ -1,13 +1,16 @@ import { WEB_URL } from "@follow/shared/constants" import { zodResolver } from "@hookform/resolvers/zod" import { useMutation } from "@tanstack/react-query" -import { useState } from "react" +import { useMemo, useRef, useState } from "react" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import { toast } from "sonner" import { z } from "zod" import { FeedCertification } from "~/components/feed-certification" +import { FeedIcon } from "~/components/feed-icon" +import type { Suggestion } from "~/components/ui/auto-completion" +import { Autocomplete } from "~/components/ui/auto-completion" import { Avatar, AvatarImage } from "~/components/ui/avatar" import { Button } from "~/components/ui/button" import { Divider } from "~/components/ui/divider" @@ -35,11 +38,12 @@ import { import { views } from "~/constants" import { useAuthQuery, useI18n } from "~/hooks/common" import { apiClient } from "~/lib/api-fetch" -import { cn } from "~/lib/utils" +import { cn, isBizId } from "~/lib/utils" import type { ListModel } from "~/models" import { ViewSelectorRadioGroup } from "~/modules/shared/ViewSelectorRadioGroup" import { Queries } from "~/queries" -import { feedActions, useFeedById } from "~/store/feed" +import { feedActions, getFeedById, useFeedById } from "~/store/feed" +import { useSubscriptionStore } from "~/store/subscription" export const SettingLists = () => { // const { t: appT } = useTranslation() @@ -331,7 +335,7 @@ export const ListFeedsModalContent = ({ id }: { id: string }) => { const list = useFeedById(id) as ListModel const { t } = useTranslation("settings") - const [addValue, setAddValue] = useState("") + const [feedSearchFor, setFeedSearchFor] = useState("") const addMutation = useMutation({ mutationFn: async (values: string) => { const feed = await apiClient.lists.feeds.$post({ @@ -369,24 +373,67 @@ export const ListFeedsModalContent = ({ id }: { id: string }) => { }, }) + const allFeeds = useSubscriptionStore((store) => { + const feedInfo = [] as { title: string; id: string }[] + + const allSubscriptions = Object.values(store.feedIdByView).flat() + + for (const feedId of allSubscriptions) { + const subscription = store.data[feedId] + const feed = getFeedById(feedId) + if (feed && feed.type === "feed") { + feedInfo.push({ title: subscription.title || feed.title || "", id: feed.id }) + } + } + return feedInfo + }) + + const autocompleteSuggestions: Suggestion[] = useMemo(() => { + return allFeeds.map((feed) => ({ + name: feed.title, + value: feed.id, + })) + }, [allFeeds]) + + const selectedFeedIdRef = useRef() return ( -
+ <>
- setAddValue(e.target.value)} - /> - + { + selectedFeedIdRef.current = e?.value + setFeedSearchFor(e?.name || "") + }} + onChange={(e) => { + setFeedSearchFor(e.target.value) + }} + suggestions={autocompleteSuggestions} + /> +
- + - + {/* {t("lists.feeds.id")} - + */} {t("lists.feeds.title")} @@ -394,27 +441,23 @@ export const ListFeedsModalContent = ({ id }: { id: string }) => { {t("lists.feeds.owner")} - {t("lists.feeds.remove")} + {t("lists.feeds.actions")} {list.feeds?.map((row) => ( - + {/* {row.id} - + */} - {row.image && ( - - - - )} + {row.siteUrl && } {row.title} @@ -431,6 +474,6 @@ export const ListFeedsModalContent = ({ id }: { id: string }) => {
-
+ ) } diff --git a/locales/settings/en.json b/locales/settings/en.json index f7660b11d..5f18fbf98 100644 --- a/locales/settings/en.json +++ b/locales/settings/en.json @@ -162,6 +162,7 @@ "lists.fee": "Fee", "lists.fee.description": "The fee others need to pay you to subscribe to this list.", "lists.feeds": "Feeds", + "lists.feeds.actions": "Actions", "lists.feeds.add": "Add", "lists.feeds.add.error": "Failed to add feed to list.", "lists.feeds.add.success": "Feed added to list.", @@ -170,7 +171,7 @@ "lists.feeds.id": "Feed ID", "lists.feeds.manage": "Manage Feeds", "lists.feeds.owner": "Owner", - "lists.feeds.remove": "Remove", + "lists.feeds.search": "Search for feed", "lists.feeds.title": "Title", "lists.image": "Image", "lists.info": "Lists are collections of feeds that you can share or sell for others to subscribe to. Subscribers will synchronize and access all feeds in the list.", From 0d68e7584592d08191c54a16257dd92924216387 Mon Sep 17 00:00:00 2001 From: Innei Date: Sat, 21 Sep 2024 23:16:18 +0800 Subject: [PATCH 20/47] fix: update lists table ui Signed-off-by: Innei --- .../src/modules/settings/tabs/lists.tsx | 94 ++++++++++--------- locales/common/en.json | 2 + 2 files changed, 54 insertions(+), 42 deletions(-) diff --git a/apps/renderer/src/modules/settings/tabs/lists.tsx b/apps/renderer/src/modules/settings/tabs/lists.tsx index 63789c755..6953a57e4 100644 --- a/apps/renderer/src/modules/settings/tabs/lists.tsx +++ b/apps/renderer/src/modules/settings/tabs/lists.tsx @@ -35,6 +35,7 @@ import { TableHeader, TableRow, } from "~/components/ui/table" +import { Tooltip, TooltipContent, TooltipPortal, TooltipTrigger } from "~/components/ui/tooltip" import { views } from "~/constants" import { useAuthQuery, useI18n } from "~/hooks/common" import { apiClient } from "~/lib/api-fetch" @@ -76,31 +77,27 @@ export const SettingLists = () => { - - {t.settings("lists.title")} - - + {t.settings("lists.title")} + {t.settings("lists.view")} - + {t.settings("lists.fee")} - - {t.settings("lists.feeds")} - - - {t.settings("lists.edit")} + + + {t.common("words.actions")} - + {listList.data?.map((row) => ( {row.image && ( @@ -111,46 +108,59 @@ export const SettingLists = () => { -
+
+ {t(views[row.view].name)} {views[row.view].icon} - {t(views[row.view].name)}
-
+
{row.fee}
+ - - - - + + + + + + {t.common("words.manage")} + + + + + + + + {t.common("words.edit")} + + ))} @@ -411,7 +421,7 @@ export const ListFeedsModalContent = ({ id }: { id: string }) => { setFeedSearchFor(e.target.value) }} suggestions={autocompleteSuggestions} - /> + />
@@ -373,7 +373,9 @@ export const ModalInternal = memo(
- {finalChildren} + + {finalChildren} +
diff --git a/apps/renderer/src/components/ui/modal/stacked/utils.ts b/apps/renderer/src/components/ui/modal/stacked/utils.ts deleted file mode 100644 index 1a211d5a7..000000000 --- a/apps/renderer/src/components/ui/modal/stacked/utils.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { PropsWithChildren } from "react" - -export const NoopChildren = ({ children }: PropsWithChildren) => children diff --git a/apps/renderer/src/components/user-button.tsx b/apps/renderer/src/components/user-button.tsx index 4208cd092..1f941ab63 100644 --- a/apps/renderer/src/components/user-button.tsx +++ b/apps/renderer/src/components/user-button.tsx @@ -11,6 +11,7 @@ import { apiClient } from "~/lib/api-fetch" import { defineQuery } from "~/lib/defineQuery" import { nextFrame } from "~/lib/dom" import { cn } from "~/lib/utils" +import { useAchievementModal } from "~/modules/achievement/hooks" import { LoginModalContent } from "~/modules/auth/LoginModalContent" import { usePresentUserProfileModal } from "~/modules/profile/hooks" import { useSettingModal } from "~/modules/settings/modal/hooks" @@ -26,8 +27,8 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from "./ui/dropdown-menu/dropdown-menu" +import { PlainModal } from "./ui/modal/stacked/custom-modal" import { useModalStack } from "./ui/modal/stacked/hooks" -import { NoopChildren } from "./ui/modal/stacked/utils" interface LoginProps { method?: "redirect" | "modal" @@ -43,7 +44,7 @@ export const LoginButton: FC = (props) => { method === "modal" ? () => { modalStack.present({ - CustomModalComponent: NoopChildren, + CustomModalComponent: PlainModal, title: "Login", id: "login", content: () => , @@ -65,6 +66,7 @@ export const ProfileButton: FC = memo((props) => { const signOut = useSignOut() const settingModalPresent = useSettingModal() const presentUserProfile = usePresentUserProfileModal("dialog") + const presentAchievement = useAchievementModal() const { t } = useTranslation() if (status !== "authenticated") { return @@ -99,6 +101,15 @@ export const ProfileButton: FC = memo((props) => { > {t("user_button.profile")} + + { + presentAchievement() + }} + icon={} + > + {t("user_button.achievement")} + = Promise.resolve() + private abortController = new AbortController() next(fn: () => any | Promise) { + const { signal } = this.abortController this.chain = this.chain.then(() => { + if (signal.aborted) { + throw "Chain aborted" + } return fn() || Promise.resolve() }) } + + wait(ms: number): this { + this.chain = this.chain.then(() => sleep(ms)) + return this + } + + abort() { + this.chain = Promise.resolve() + this.abortController.abort() + this.abortController = new AbortController() + } } diff --git a/apps/renderer/src/lottie/achievement.json b/apps/renderer/src/lottie/achievement.json new file mode 100644 index 000000000..3889e0bce --- /dev/null +++ b/apps/renderer/src/lottie/achievement.json @@ -0,0 +1,2123 @@ +{ + "v": "5.5.8", + "fr": 29.9700012207031, + "ip": 0, + "op": 150.000006109625, + "w": 144, + "h": 144, + "nm": "Plan Complete 2021", + "ddd": 0, + "assets": [], + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "Layer 6", + "parent": 10, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 90, + "s": [0] + }, + { "t": 100.000004073084, "s": [100] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [41.998, -3.5, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [-0.002, 0.001], + [-0.002, 0.001] + ], + "o": [ + [0.002, -0.001], + [0.002, -0.001], + [0, 0] + ], + "v": [ + [-3.657, 2.133], + [0, 0], + [3.657, -2.133] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { "a": 0, "k": [1, 0.764705896378, 0.466666668653, 1], "ix": 3 }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 4, "ix": 5 }, + "lc": 2, + "lj": 2, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tm", + "s": { + "a": 1, + "k": [ + { "i": { "x": [0], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 90, "s": [0] }, + { "t": 130.000005295009, "s": [100] } + ], + "ix": 1 + }, + "e": { "a": 0, "k": 1, "ix": 2 }, + "o": { "a": 0, "k": 0, "ix": 3 }, + "m": 1, + "ix": 2, + "nm": "Trim Paths 1", + "mn": "ADBE Vector Filter - Trim", + "hd": false + } + ], + "ip": 90.0000036657751, + "op": 150.000006109625, + "st": 30.0000012219251, + "bm": 0 + }, + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "Layer 5", + "parent": 10, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 100, + "s": [0] + }, + { "t": 110.000004480392, "s": [100] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [-41.998, -3.5, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0.002, 0.001], + [0.002, 0.001] + ], + "o": [ + [-0.002, -0.001], + [-0.002, -0.001], + [0, 0] + ], + "v": [ + [3.657, 2.133], + [0, 0], + [-3.657, -2.133] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { "a": 0, "k": [1, 0.686274528503, 0.313725501299, 1], "ix": 3 }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 4, "ix": 5 }, + "lc": 2, + "lj": 2, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tm", + "s": { + "a": 1, + "k": [ + { "i": { "x": [0], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 100, "s": [0] }, + { "t": 140.000005702317, "s": [100] } + ], + "ix": 1 + }, + "e": { "a": 0, "k": 1, "ix": 2 }, + "o": { "a": 0, "k": 0, "ix": 3 }, + "m": 1, + "ix": 2, + "nm": "Trim Paths 1", + "mn": "ADBE Vector Filter - Trim", + "hd": false + } + ], + "ip": 100.000004073084, + "op": 160.000006516934, + "st": 40.0000016292334, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "Layer 4", + "parent": 10, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 90, + "s": [0] + }, + { "t": 100.000004073084, "s": [100] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [-40.001, -16.001, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0] + ], + "v": [ + [5.743, 5.744], + [-5.743, -5.744] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 3 }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 4, "ix": 5 }, + "lc": 2, + "lj": 2, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tm", + "s": { + "a": 1, + "k": [ + { "i": { "x": [0], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 90, "s": [0] }, + { "t": 130.000005295009, "s": [100] } + ], + "ix": 1 + }, + "e": { "a": 0, "k": 1, "ix": 2 }, + "o": { "a": 0, "k": 0, "ix": 3 }, + "m": 1, + "ix": 2, + "nm": "Trim Paths 1", + "mn": "ADBE Vector Filter - Trim", + "hd": false + } + ], + "ip": 90.0000036657751, + "op": 150.000006109625, + "st": 30.0000012219251, + "bm": 0 + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "Layer 3", + "parent": 10, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.833], "y": [0.833] }, + "o": { "x": [0.167], "y": [0.167] }, + "t": 100, + "s": [0] + }, + { "t": 110.000004480392, "s": [100] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [40.002, -16.001, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0] + ], + "v": [ + [-5.744, 5.744], + [5.744, -5.744] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { "a": 0, "k": [1, 0.686274528503, 0.313725501299, 1], "ix": 3 }, + "o": { "a": 0, "k": 100, "ix": 4 }, + "w": { "a": 0, "k": 4, "ix": 5 }, + "lc": 2, + "lj": 2, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tm", + "s": { + "a": 1, + "k": [ + { "i": { "x": [0], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 100, "s": [0] }, + { "t": 140.000005702317, "s": [100] } + ], + "ix": 1 + }, + "e": { "a": 0, "k": 1, "ix": 2 }, + "o": { "a": 0, "k": 0, "ix": 3 }, + "m": 1, + "ix": 2, + "nm": "Trim Paths 1", + "mn": "ADBE Vector Filter - Trim", + "hd": false + } + ], + "ip": 100.000004073084, + "op": 160.000006516934, + "st": 40.0000016292334, + "bm": 0 + }, + { + "ddd": 0, + "ind": 5, + "ty": 4, + "nm": "Path 15295", + "parent": 10, + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [-29.994, 5.999, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 70, + "s": [0, 0, 100] + }, + { "t": 90.0000036657751, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [2.178, 0.916], + [-0.152, 0.387], + [-0.195, 0.076], + [-0.918, 2.177], + [-0.387, -0.15], + [-0.076, -0.196], + [-2.177, -0.917], + [0.152, -0.387], + [0.195, -0.076], + [0.916, -2.177], + [0.387, 0.152], + [0.076, 0.195] + ], + "o": [ + [-0.918, -2.177], + [-0.387, -0.152], + [0.076, -0.195], + [2.177, -0.918], + [0.15, -0.387], + [0.196, 0.076], + [0.917, 2.177], + [0.387, 0.152], + [-0.076, 0.195], + [-2.177, 0.916], + [-0.152, 0.387], + [-0.195, -0.076], + [0, 0] + ], + "v": [ + [-0.699, 5.527], + [-5.527, 0.702], + [-5.952, -0.273], + [-5.527, -0.698], + [-0.699, -5.525], + [0.273, -5.953], + [0.701, -5.525], + [5.527, -0.698], + [5.952, 0.277], + [5.527, 0.702], + [0.702, 5.527], + [-0.273, 5.952], + [-0.698, 5.527] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Path 15295", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 70.0000028511585, + "op": 150.000006109625, + "st": 40.0000016292334, + "bm": 0 + }, + { + "ddd": 0, + "ind": 6, + "ty": 4, + "nm": "Path 15297", + "parent": 10, + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [25, -19, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 50, + "s": [0, 0, 100] + }, + { "t": 70.0000028511585, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [2.904, 1.221], + [-0.2, 0.515], + [-0.261, 0.102], + [-1.224, 2.903], + [-0.515, -0.2], + [-0.102, -0.261], + [-2.903, -1.224], + [0.2, -0.515], + [0.261, -0.102], + [1.221, -2.903], + [0.515, 0.2], + [0.102, 0.261] + ], + "o": [ + [-1.222, -2.904], + [-0.515, -0.2], + [0.102, -0.261], + [2.903, -1.224], + [0.2, -0.515], + [0.261, 0.102], + [1.223, 2.903], + [0.515, 0.2], + [-0.102, 0.261], + [-2.903, 1.221], + [-0.2, 0.515], + [-0.261, -0.102], + [0, 0] + ], + "v": [ + [-0.931, 7.367], + [-7.368, 0.934], + [-7.938, -0.361], + [-7.368, -0.93], + [-0.931, -7.367], + [0.363, -7.937], + [0.933, -7.367], + [7.368, -0.93], + [7.938, 0.364], + [7.368, 0.934], + [0.934, 7.367], + [-0.36, 7.937], + [-0.93, 7.367] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Path 15297", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 50.0000020365418, + "op": 150.000006109625, + "st": 20.0000008146167, + "bm": 0 + }, + { + "ddd": 0, + "ind": 7, + "ty": 4, + "nm": "Path 15294", + "parent": 10, + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [17, 32, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 60, + "s": [0, 0, 100] + }, + { "t": 80.0000032584668, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [2.904, 1.221], + [-0.2, 0.515], + [-0.261, 0.102], + [-1.224, 2.903], + [-0.515, -0.2], + [-0.102, -0.261], + [-2.903, -1.224], + [0.2, -0.515], + [0.261, -0.102], + [1.221, -2.903], + [0.515, 0.2], + [0.102, 0.261] + ], + "o": [ + [-1.222, -2.904], + [-0.515, -0.2], + [0.102, -0.261], + [2.903, -1.224], + [0.2, -0.515], + [0.261, 0.102], + [1.223, 2.903], + [0.515, 0.2], + [-0.102, 0.261], + [-2.903, 1.221], + [-0.2, 0.515], + [-0.261, -0.102], + [0, 0] + ], + "v": [ + [-0.931, 7.367], + [-7.368, 0.934], + [-7.938, -0.361], + [-7.368, -0.93], + [-0.931, -7.367], + [0.363, -7.937], + [0.933, -7.367], + [7.368, -0.93], + [7.938, 0.364], + [7.368, 0.934], + [0.934, 7.367], + [-0.36, 7.937], + [-0.93, 7.367] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Path 15294", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 60.0000024438501, + "op": 150.000006109625, + "st": 30.0000012219251, + "bm": 0 + }, + { + "ddd": 0, + "ind": 8, + "ty": 4, + "nm": "Layer 2", + "parent": 10, + "td": 1, + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [0, 0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [-2.349, -6.785], + [0, 0], + [-6.796, 0.004], + [0, 0], + [-2.227, 6.42], + [0, 0], + [5.936, 4.041], + [0, 0], + [5.428, -3.699] + ], + "o": [ + [0, 0], + [-5.935, 4.041], + [0, 0], + [2.227, 6.42], + [0, 0], + [6.796, 0.004], + [0, 0], + [2.349, -6.786], + [0, 0], + [-5.428, -3.699], + [0, 0] + ], + "v": [ + [-8.998, -61.226], + [-59.048, -27.1], + [-65.124, -8.756], + [-46.418, 45.28], + [-31.344, 56], + [31.342, 56], + [46.416, 45.281], + [65.124, -8.755], + [59.046, -27.1], + [8.997, -61.226], + [-8.998, -61.226] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [1, 0.878431379795, 0.729411780834, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Path 15226", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 7235", + "np": 1, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [6.549, 0.101], + [0, 0], + [2.452, 6.073], + [0, 0], + [-0.264, 2.244], + [0, 0], + [0, 0], + [0, 0], + [-5.364, -3.302], + [0, 0], + [0, 0], + [0, 0], + [0.802, -2.112] + ], + "o": [ + [0, 0], + [-2.452, 6.074], + [0, 0], + [-6.549, 0.101], + [0, 0], + [-0.801, -2.112], + [0, 0], + [0, 0], + [0, 0], + [5.364, -3.302], + [0, 0], + [0, 0], + [0, 0], + [0.262, 2.244], + [0, 0] + ], + "v": [ + [65.083, 5.185], + [46.559, 54.085], + [31.621, 63.996], + [-31.619, 63.996], + [-46.557, 54.085], + [-65.082, 5.185], + [-65.9, -1.445], + [-65.9, -13.491], + [-53.944, -15.356], + [-8.744, -43.523], + [8.75, -43.523], + [53.95, -15.356], + [65.9, -13.491], + [65.9, -1.445], + [65.078, 5.184] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.976470589638, 0.803921580315, 0.423529416323, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Path 15225", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 7232", + "np": 1, + "cix": 2, + "bm": 0, + "ix": 2, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 150.000006109625, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 9, + "ty": 4, + "nm": "Group 61797", + "parent": 10, + "tt": 1, + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { + "a": 1, + "k": [ + { "i": { "x": [0], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 10, "s": [45] }, + { "t": 70.0000028511585, "s": [0] } + ], + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0, "y": 1 }, + "o": { "x": 0.333, "y": 0 }, + "t": 10, + "s": [-1.341, -105.613, 0], + "to": [0.223, 17.602, 0], + "ti": [-0.223, -17.602, 0] + }, + { "t": 70.0000028511585, "s": [0, 0, 0] } + ], + "ix": 2 + }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [0.47, -0.237], + [0, 0], + [0.399, 0.789], + [-0.067, 0.348], + [0, 0], + [0.371, 0.375], + [0, 0], + [-0.626, 0.623], + [-0.352, 0.044], + [0, 0], + [-0.243, 0.468], + [0, 0], + [-0.787, -0.403], + [-0.151, -0.322], + [0, 0], + [-0.521, -0.086], + [0, 0], + [0.141, -0.872], + [0.26, -0.242], + [0, 0], + [-0.08, -0.521], + [0, 0], + [0.874, -0.132], + [0.309, 0.17] + ], + "o": [ + [0, 0], + [-0.462, -0.253], + [0, 0], + [-0.789, 0.399], + [-0.16, -0.316], + [0, 0], + [0.099, -0.518], + [0, 0], + [-0.623, -0.626], + [0.251, -0.25], + [0, 0], + [0.523, -0.065], + [0, 0], + [0.403, -0.787], + [0.316, 0.162], + [0, 0], + [0.224, 0.478], + [0, 0], + [0.872, 0.141], + [-0.057, 0.351], + [0, 0], + [-0.384, 0.361], + [0, 0], + [0.132, 0.874], + [-0.349, 0.053], + [0, 0] + ], + "v": [ + [6.309, 19.713], + [0.6, 16.572], + [-0.888, 16.545], + [-6.715, 19.469], + [-8.865, 18.763], + [-9.009, 17.738], + [-7.787, 11.339], + [-8.221, 9.912], + [-12.795, 5.278], + [-12.79, 3.015], + [-11.859, 2.562], + [-5.396, 1.746], + [-4.172, 0.895], + [-1.181, -4.892], + [0.973, -5.587], + [1.693, -4.841], + [4.466, 1.052], + [5.655, 1.952], + [12.083, 3.009], + [13.407, 4.844], + [12.918, 5.759], + [8.17, 10.218], + [7.683, 11.627], + [8.665, 18.068], + [7.323, 19.89], + [6.309, 19.709] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [1, 0.686274528503, 0.313725501299, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Path 279286", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 61793", + "np": 1, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [-13.255, 0], + [0, -13.255], + [13.255, 0], + [0, 13.255] + ], + "o": [ + [13.255, 0], + [0, 13.255], + [-13.255, 0], + [0, -13.255] + ], + "v": [ + [0, -16], + [24, 8], + [0, 32], + [-24, 8] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [1, 0.870588243008, 0.517647087574, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Ellipse 4722", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 2, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [-17.673, 0], + [0, -17.673], + [17.673, 0], + [0, 17.673] + ], + "o": [ + [17.673, 0], + [0, 17.673], + [-17.673, 0], + [0, -17.673] + ], + "v": [ + [0, -24], + [32, 8], + [0, 40], + [-32, 8] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.976470589638, 0.803921580315, 0.423529416323, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Ellipse 4721", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 3, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 61794", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [-0.134, 3.171], + [0, 0], + [-3.17, 0.147], + [0, 0], + [0.134, -3.171], + [0, 0], + [3.169, -0.147] + ], + "o": [ + [0, 0], + [-3.17, -0.147], + [0, 0], + [-0.134, -3.171], + [0, 0], + [3.17, 0.147], + [0, 0], + [0.135, 3.17], + [0, 0] + ], + "v": [ + [14.511, -18], + [-14.51, -18], + [-20, -24], + [-20, -24], + [-14.51, -30], + [14.511, -30], + [20.001, -24], + [20.001, -24], + [14.513, -18] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.615686297417, 0.776470601559, 0.890196084976, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Path 279283", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 61792", + "np": 1, + "cix": 2, + "bm": 0, + "ix": 2, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [-8, -70], + [8, -70], + [8, -30], + [-8, -30] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Rectangle 9679", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0.002, 0], + [0, 0], + [-0.009, 2.198], + [0, 0.001], + [0, 0], + [0, 0], + [-2.199, 0.011], + [-0.001, 0], + [0, 0], + [0.01, -2.199], + [0, 0], + [2.199, -0.01] + ], + "o": [ + [0, 0], + [-2.198, -0.009], + [0, -0.001], + [0, 0], + [0, 0], + [-0.01, -2.199], + [0.001, 0], + [0, 0], + [2.199, 0.01], + [0, 0], + [0.01, 2.199], + [-0.002, 0] + ], + "v": [ + [32.035, -70], + [-32.036, -70], + [-36, -73.996], + [-36, -74], + [-36, -74], + [-36, -74], + [-32.038, -78], + [-32.036, -78], + [32.042, -78], + [36.005, -74], + [36.005, -74], + [32.041, -70] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.615686297417, 0.776470601559, 0.890196084976, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Path 279282", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 2, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [3.001, -1.534], + [0, 0], + [0, 0], + [0, 0], + [0, 2.928], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [0, 0], + [-3.143, -1.509], + [0, 0], + [0, 0], + [0, 0], + [-0.003, 2.848] + ], + "v": [ + [22.548, -34.07], + [14.584, -30], + [-14.686, -30], + [-23.227, -34.1], + [-28.292, -41.25], + [-27.948, -70.001], + [27.708, -70.001], + [27.367, -41.101] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.929411768913, 0.486274510622, 0.533333361149, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Path 279281", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 3, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 61791", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 3, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 150.000006109625, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 10, + "ty": 4, + "nm": "Layer 1", + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { + "a": 1, + "k": [ + { "i": { "x": [0], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 0, "s": [15] }, + { "t": 60.0000024438501, "s": [0] } + ], + "ix": 10 + }, + "p": { "a": 0, "k": [72, 72, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0, 0, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, + "t": 0, + "s": [0, 0, 100] + }, + { "t": 60.0000024438501, "s": [100, 100, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [-2.349, -6.785], + [0, 0], + [-6.796, 0.004], + [0, 0], + [-2.227, 6.42], + [0, 0], + [5.936, 4.041], + [0, 0], + [5.428, -3.699] + ], + "o": [ + [0, 0], + [-5.935, 4.041], + [0, 0], + [2.227, 6.42], + [0, 0], + [6.796, 0.004], + [0, 0], + [2.349, -6.786], + [0, 0], + [-5.428, -3.699], + [0, 0] + ], + "v": [ + [-8.998, -61.226], + [-59.048, -27.1], + [-65.124, -8.756], + [-46.418, 45.28], + [-31.344, 56], + [31.342, 56], + [46.416, 45.281], + [65.124, -8.755], + [59.046, -27.1], + [8.997, -61.226], + [-8.998, -61.226] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { "a": 0, "k": [1, 0.878431379795, 0.729411780834, 1], "ix": 4 }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Path 15226", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 7235", + "np": 1, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [6.549, 0.101], + [0, 0], + [2.452, 6.073], + [0, 0], + [-0.264, 2.244], + [0, 0], + [0, 0], + [0, 0], + [-5.364, -3.302], + [0, 0], + [0, 0], + [0, 0], + [0.802, -2.112] + ], + "o": [ + [0, 0], + [-2.452, 6.074], + [0, 0], + [-6.549, 0.101], + [0, 0], + [-0.801, -2.112], + [0, 0], + [0, 0], + [0, 0], + [5.364, -3.302], + [0, 0], + [0, 0], + [0, 0], + [0.262, 2.244], + [0, 0] + ], + "v": [ + [65.083, 5.185], + [46.559, 54.085], + [31.621, 63.996], + [-31.619, 63.996], + [-46.557, 54.085], + [-65.082, 5.185], + [-65.9, -1.445], + [-65.9, -13.491], + [-53.944, -15.356], + [-8.744, -43.523], + [8.75, -43.523], + [53.95, -15.356], + [65.9, -13.491], + [65.9, -1.445], + [65.078, 5.184] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.976470589638, 0.803921580315, 0.423529416323, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Path 15225", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 7232", + "np": 1, + "cix": 2, + "bm": 0, + "ix": 2, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 150.000006109625, + "st": 0, + "bm": 0 + } + ], + "markers": [] +} diff --git a/apps/renderer/src/modules/achievement/hooks.tsx b/apps/renderer/src/modules/achievement/hooks.tsx new file mode 100644 index 000000000..c02870243 --- /dev/null +++ b/apps/renderer/src/modules/achievement/hooks.tsx @@ -0,0 +1,269 @@ +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" +import { useSingleton } from "foxact/use-singleton" +import { atom, useStore } from "jotai" +import type { LottieRef } from "lottie-react" +import Lottie from "lottie-react" +import { nanoid } from "nanoid" +import type { FC } from "react" +import { useCallback, useEffect, useRef } from "react" +import { Trans } from "react-i18next" + +import { Button } from "~/components/ui/button" +import { styledButtonVariant } from "~/components/ui/button/variants" +import { LoadingCircle, LoadingWithIcon } from "~/components/ui/loading" +import { useModalStack } from "~/components/ui/modal" +import { SlideUpModal } from "~/components/ui/modal/stacked/custom-modal" +import { useI18n } from "~/hooks/common" +import { apiClient } from "~/lib/api-fetch" +import { Chain } from "~/lib/chain" +import achievementAnimation from "~/lottie/achievement.json" + +enum AchievementsActionIdMap { + FIRST_CLAIM_FEED = 0, +} + +const achievementActionIdCopyMap: Record< + AchievementsActionIdMap, + { title: I18nKeys; description: I18nKeys } +> = { + [AchievementsActionIdMap.FIRST_CLAIM_FEED]: { + title: "achievement.first_claim_feed", + description: "achievement.first_claim_feed_description", + }, +} + +export const useAchievementModal = () => { + const { present } = useModalStack() + + return useCallback(() => { + present({ + id: "achievement", + title: "Achievements", + content: AchievementModalContent, + CustomModalComponent: SlideUpModal, + }) + }, [present]) +} + +const buildDefaultAchievements = () => { + return [ + { + id: nanoid(), + actionId: AchievementsActionIdMap.FIRST_CLAIM_FEED, + type: "checking", + progress: 0, + progressMax: 0, + }, + ] +} +export const AchievementModalContent: FC = () => { + const lottieRef: LottieRef = useRef(null) + useEffect(() => { + lottieRef.current?.setSpeed(2) + }, []) + + const jotaiStore = useStore() + const queryClient = useQueryClient() + + const defaultAchievements = useSingleton(buildDefaultAchievements) + + const _achievementType = apiClient.achievement.$get({ + query: { + type: "all", + }, + }) + type Achievement = Awaited["data"] + const { + data: achievements, + isLoading, + refetch, + } = useQuery({ + queryKey: ["achievements"], + meta: { + persist: true, + }, + queryFn: async () => { + const res = await apiClient.achievement.$get({ + query: { + type: "all", + }, + }) + + jotaiStore.set(achievementsDataAtom.current, res.data) + return res.data + }, + initialData: defaultAchievements.current as Achievement, + }) + + useEffect(() => { + if (!achievements) return + let shouldPolling = false + const pollingChain = new Chain() + for (const achievement of achievements) { + if (achievement.type === "checking") { + shouldPolling = true + break + } + } + + if (shouldPolling) { + pollingChain.wait(2000).next(() => { + refetch() + }) + } + + return () => { + pollingChain.abort() + } + }, [achievements, refetch]) + + const { mutateAsync: mintAchievement, isPending: isMinting } = useMutation({ + mutationFn: async (actionId: number) => { + return apiClient.achievement.$put({ + json: { + actionId, + }, + }) + }, + }) + const achievementsDataAtom = useSingleton(() => atom()) + const t = useI18n() + + return ( +
+ + +
{t("words.achievement")}
+ + + + {t("words.power")} + + + ), + }} + /> + + +
    + {isLoading ? ( +
    + } size="large" /> +
    + ) : ( + achievements?.map((achievement) => { + const copy = achievementActionIdCopyMap[achievement.actionId] + if (!copy) return null + + return ( +
  • +
    +
    + {t(copy.title)} + + {achievement.power && ( + + {achievement.power} + + + )} +
    +
    + {t(copy.description)} +
    +
    + + {achievement.type === "checking" && ( +
    + + {t("words.mint")} +
    + )} + {achievement.type === "incomplete" && ( +
    + + + {achievement.progress} / {achievement.progressMax} + + + + + +
    + )} + + {achievement.type === "received" && ( +
    + + {t("achievement.all_done")} +
    + )} + {achievement.type === "completed" && ( + + )} +
  • + ) + }) + )} +
+
+ ) +} diff --git a/apps/renderer/src/modules/ai/ai-daily/daily.tsx b/apps/renderer/src/modules/ai/ai-daily/daily.tsx index e22a099d0..527972693 100644 --- a/apps/renderer/src/modules/ai/ai-daily/daily.tsx +++ b/apps/renderer/src/modules/ai/ai-daily/daily.tsx @@ -17,7 +17,7 @@ import { Media } from "~/components/ui/media" import { usePreviewMedia } from "~/components/ui/media/hooks" import { useModalStack } from "~/components/ui/modal" import { PeekModal } from "~/components/ui/modal/inspire/PeekModal" -import { NoopChildren } from "~/components/ui/modal/stacked/utils" +import { PlainModal } from "~/components/ui/modal/stacked/custom-modal" import { Paper } from "~/components/ui/paper" import { ScrollArea } from "~/components/ui/scroll-area" import { Tooltip, TooltipContent, TooltipPortal, TooltipTrigger } from "~/components/ui/tooltip" @@ -242,7 +242,7 @@ const createRelatedEntryLink = (variant: "toast" | "modal") => (props: LinkProps if (variant === "toast") { present({ ...basePresentProps, - CustomModalComponent: NoopChildren, + CustomModalComponent: PlainModal, content: () => , overlay: false, modal: false, diff --git a/apps/renderer/src/modules/entry-column/Items/video-item.tsx b/apps/renderer/src/modules/entry-column/Items/video-item.tsx index 943ccf66d..91e99b715 100644 --- a/apps/renderer/src/modules/entry-column/Items/video-item.tsx +++ b/apps/renderer/src/modules/entry-column/Items/video-item.tsx @@ -6,7 +6,7 @@ import { m } from "~/components/common/Motion" import { Media } from "~/components/ui/media" import type { ModalContentComponent } from "~/components/ui/modal" import { useModalStack } from "~/components/ui/modal" -import { NoopChildren } from "~/components/ui/modal/stacked/utils" +import { PlainModal } from "~/components/ui/modal/stacked/custom-modal" import { Skeleton } from "~/components/ui/skeleton" import { useRouteParamsSelector } from "~/hooks/biz/useRouteParams" import { urlToIframe } from "~/lib/url-to-iframe" @@ -65,7 +65,7 @@ export function VideoItem({ entryId, entryPreview, translation }: UniversalItemP title: "", content: (props) => , clickOutsideToDismiss: true, - CustomModalComponent: NoopChildren, + CustomModalComponent: PlainModal, overlay: true, }) } diff --git a/apps/renderer/src/modules/modal/shortcuts.tsx b/apps/renderer/src/modules/modal/shortcuts.tsx index 0ef56098d..66642d8dc 100644 --- a/apps/renderer/src/modules/modal/shortcuts.tsx +++ b/apps/renderer/src/modules/modal/shortcuts.tsx @@ -7,7 +7,7 @@ import { useUISettingKey } from "~/atoms/settings/ui" import { MotionButtonBase } from "~/components/ui/button" import { KbdCombined } from "~/components/ui/kbd/Kbd" import { useCurrentModal, useModalStack } from "~/components/ui/modal" -import { NoopChildren } from "~/components/ui/modal/stacked/utils" +import { PlainModal } from "~/components/ui/modal/stacked/custom-modal" import { ScrollArea } from "~/components/ui/scroll-area" import { shortcuts } from "~/constants/shortcuts" import { useSwitchHotKeyScope } from "~/hooks/common" @@ -89,7 +89,7 @@ export const useShortcutsModal = () => { overlay: false, id: "shortcuts", content: () => , - CustomModalComponent: NoopChildren, + CustomModalComponent: PlainModal, clickOutsideToDismiss: true, }) }, [present]) diff --git a/apps/renderer/src/modules/panel/cmdn.tsx b/apps/renderer/src/modules/panel/cmdn.tsx index 3c30d2b9c..6873454f7 100644 --- a/apps/renderer/src/modules/panel/cmdn.tsx +++ b/apps/renderer/src/modules/panel/cmdn.tsx @@ -9,7 +9,7 @@ import { getSidebarActiveView } from "~/atoms/sidebar" import { m } from "~/components/common/Motion" import { Form, FormControl, FormField, FormItem } from "~/components/ui/form" import { useModalStack } from "~/components/ui/modal" -import { NoopChildren } from "~/components/ui/modal/stacked/utils" +import { PlainModal } from "~/components/ui/modal/stacked/custom-modal" import { HotKeyScopeMap } from "~/constants" import { tipcClient } from "~/lib/client" import type { FeedViewType } from "~/lib/enum" @@ -108,7 +108,7 @@ export const CmdNTrigger = () => { present({ title: "Quick Follow", content: CmdNPanel, - CustomModalComponent: NoopChildren, + CustomModalComponent: PlainModal, overlay: false, id: "quick-add", clickOutsideToDismiss: true, diff --git a/apps/renderer/src/modules/profile/hooks.ts b/apps/renderer/src/modules/profile/hooks.ts index 579737d8c..b17fbf8ef 100644 --- a/apps/renderer/src/modules/profile/hooks.ts +++ b/apps/renderer/src/modules/profile/hooks.ts @@ -2,7 +2,7 @@ import { createElement, useCallback } from "react" import { parse } from "tldts" import { useModalStack } from "~/components/ui/modal" -import { NoopChildren } from "~/components/ui/modal/stacked/utils" +import { PlainModal } from "~/components/ui/modal/stacked/custom-modal" import { useAuthQuery } from "~/hooks/common" import { apiClient } from "~/lib/api-fetch" import { defineQuery } from "~/lib/defineQuery" @@ -55,7 +55,7 @@ export const usePresentUserProfileModal = (variant: "drawer" | "dialog" = "dialo userId, variant, }), - CustomModalComponent: NoopChildren, + CustomModalComponent: PlainModal, clickOutsideToDismiss: true, modal: variant === "dialog", overlay: variant === "dialog", diff --git a/apps/renderer/src/modules/settings/modal/content.tsx b/apps/renderer/src/modules/settings/modal/content.tsx index e04a26260..32b2a585f 100644 --- a/apps/renderer/src/modules/settings/modal/content.tsx +++ b/apps/renderer/src/modules/settings/modal/content.tsx @@ -2,10 +2,9 @@ import { repository } from "@pkg" import i18next from "i18next" import type { FC } from "react" import { Suspense, useDeferredValue, useEffect, useLayoutEffect, useState } from "react" -import { Trans, useTranslation } from "react-i18next" +import { Trans } from "react-i18next" -import { MotionButtonBase } from "~/components/ui/button" -import { useCurrentModal } from "~/components/ui/modal" +import { ModalClose } from "~/components/ui/modal/stacked/components" import { ScrollArea } from "~/components/ui/scroll-area" import { SettingsTitle } from "~/modules/settings/title" @@ -43,21 +42,6 @@ export const SettingModalContent: FC<{ ) } -const Close = () => { - const { dismiss } = useCurrentModal() - const { t } = useTranslation("common") - - return ( - - - - ) -} - const Content = () => { const key = useDeferredValue(useSettingTab() || "general") const { Component, loader } = pages[key] @@ -75,7 +59,7 @@ const Content = () => { return ( - + { createElement(SettingModalContent, { initialTab, }), - CustomModalComponent: NoopChildren, + CustomModalComponent: PlainModal, modalContainerClassName: "overflow-hidden", }), [present], diff --git a/apps/renderer/src/pages/(main)/layout.tsx b/apps/renderer/src/pages/(main)/layout.tsx index a34dea0f5..b012893b3 100644 --- a/apps/renderer/src/pages/(main)/layout.tsx +++ b/apps/renderer/src/pages/(main)/layout.tsx @@ -16,8 +16,8 @@ import { AppErrorBoundary } from "~/components/common/AppErrorBoundary" import { ErrorComponentType } from "~/components/errors/enum" import { PanelSplitter } from "~/components/ui/divider" import { Kbd } from "~/components/ui/kbd/Kbd" +import { PlainModal } from "~/components/ui/modal/stacked/custom-modal" import { DeclarativeModal } from "~/components/ui/modal/stacked/declarative-modal" -import { NoopChildren } from "~/components/ui/modal/stacked/utils" import { RootPortal } from "~/components/ui/portal" import { HotKeyScopeMap } from "~/constants" import { shortcuts } from "~/constants/shortcuts" @@ -119,7 +119,7 @@ export function Component() { \ No newline at end of file diff --git a/locales/app/en.json b/locales/app/en.json index 71942178e..a20db65eb 100644 --- a/locales/app/en.json +++ b/locales/app/en.json @@ -1,4 +1,8 @@ { + "achievement.all_done": "All done!", + "achievement.first_claim_feed": "Feed Owner", + "achievement.first_claim_feed_description": "You own your feed on Follow", + "achievement.mint_more_power": "Be a hardcore player and earn more ", "ai_daily.title": "Top News - {{title}}", "ai_daily.tooltip.content": "Here is news selected by AI from your timeline ( - ) that may be important to you.", "ai_daily.tooltip.update_schedule": "Update daily at 8 AM and 8 PM.", @@ -192,6 +196,7 @@ "tip_modal.tip_support": "⭐ Tip to show your support!", "tip_modal.unclaimed_feed": "No one has claimed this feed yet. The received Power will be securely held in the blockchain contract until it is claimed.", "user_button.account": "Account", + "user_button.achievement": "Achievements", "user_button.download_desktop_app": "Download Desktop app", "user_button.log_out": "Log out", "user_button.power": "Power", @@ -202,6 +207,7 @@ "user_profile.loading": "Loading", "user_profile.share": "Share", "user_profile.toggle_item_style": "Toggle Item Style", + "words.achievement": "Achievements", "words.add": "Add", "words.confirm": "Confirm", "words.discover": "Discover", @@ -213,6 +219,8 @@ "words.lists": "Lists", "words.load_archived_entries": "Load archived entries", "words.login": "Login", + "words.mint": "Mint", + "words.power": "Power", "words.rss": "RSS", "words.rss3": "RSS3", "words.rsshub": "RSSHub", diff --git a/locales/app/ja.json b/locales/app/ja.json index 0ee5411c2..51b0dde27 100644 --- a/locales/app/ja.json +++ b/locales/app/ja.json @@ -1,47 +1,47 @@ { "ai_daily.title": "トップニュース - {{title}}", - "ai_daily.tooltip.content": "こちらは、AIがあなたのタイムラインから選んだニュースです( - )。あなたにとって重要なニュースかもしれません。", - "ai_daily.tooltip.update_schedule": "毎日午前8時と午後8時に更新されます。", - "app.copy_logo_svg": "ロゴSVGをコピー", + "ai_daily.tooltip.content": "こちらは、AI があなたのタイムラインから選んだニュースです( - )。あなたにとって重要なニュースかもしれません。", + "ai_daily.tooltip.update_schedule": "毎日午前 8 時と午後 8 時に更新されます。", + "app.copy_logo_svg": "ロゴ SVG をコピー", "app.toggle_sidebar": "サイドバーを切り替え", - "discover.any_url_or_keyword": "任意のURLまたはキーワード", + "discover.any_url_or_keyword": "任意の URL またはキーワード", "discover.default_option": " (デフォルト)", "discover.feed_description": "このフィードの説明は以下の通りです。必要な情報をパラメータフォームに入力してください。", - "discover.feed_maintainers": "このフィードはRSSHubが提供しています。に感謝します。", - "discover.import.click_to_upload": "OPMLファイルをアップロードするにはクリック", + "discover.feed_maintainers": "このフィードは RSSHub が提供しています。に感謝します。", + "discover.import.click_to_upload": "OPML ファイルをアップロードするにはクリック", "discover.popular": "人気", "discover.preview": "プレビュー", - "discover.rss_hub_route": "RSSHubルート", + "discover.rss_hub_route": "RSSHub ルート", "discover.rss_url": "RSS URL", "discover.select_placeholder": "選択", "early_access": "アーリーアクセス", "entry_actions.copy_link": "リンクをコピー", - "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.link_copied": "リンクがクリップボードにコピーされました。", "entry_actions.mark_as_read": "既読にする", "entry_actions.mark_as_unread": "未読にする", "entry_actions.open_in_browser": "ブラウザで開く", - "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.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.share": "共有", "entry_actions.star": "スター", - "entry_actions.starred": "スターに登録されました。", + "entry_actions.starred": "スターに登録されまし��。", "entry_actions.tip": "チップ", "entry_actions.unstar": "スターを解除", "entry_actions.unstarred": "スターが解除されました。", "entry_column.refreshing": "新しいエントリを更新中...", - "entry_content.ai_summary": "AIによる要約", + "entry_content.ai_summary": "AI による要約", "entry_content.fetching_content": "元のコンテンツを取得し、処理中です...", - "entry_content.header.play_tts": "TTSを再生", + "entry_content.header.play_tts": "TTS を再生", "entry_content.header.readability": "読みやすさ", "entry_content.no_content": "コンテンツがありません", - "entry_content.readability_notice": "このコンテンツはReadabilityにより提供されています。誤字などを発見した場合は、元のサイトでオリジナルのコンテンツをご覧ください。", + "entry_content.readability_notice": "このコンテンツは Readability により提供されています。誤字などを発見した場合は、元のサイトでオリジナルのコンテンツをご覧ください。", "entry_content.render_error": "レンダリングエラー:", "entry_content.report_issue": "問題を報告", "entry_content.web_app_notice": "このコンテンツタイプはウェブアプリではサポートされていないかもしれません。デスクトップアプリをダウンロードしてください。", @@ -58,20 +58,20 @@ "entry_list_header.switch_to_grid": "グリッドに切り替え", "entry_list_header.switch_to_masonry": "メイソンリーレイアウトに切り替え", "entry_list_header.unread": "未読", - "feed_claim_modal.choose_verification_method": "選択肢は3つあります。そのうち1つを選んで確認してください。", + "feed_claim_modal.choose_verification_method": "選択肢は 3 つあります。そのうち 1 つを選んで確認してください。", "feed_claim_modal.claim_button": "クレーム", - "feed_claim_modal.content_instructions": "以下の内容をコピーして、最新のRSSフィードに投稿してください。", - "feed_claim_modal.description_current": "現在の説明:", - "feed_claim_modal.description_instructions": "次の内容をコピーし、RSSフィードのフィールドに貼り付けてください。", + "feed_claim_modal.content_instructions": "以下の内容をコピーして、最新の RSS フィードに投稿してください。", + "feed_claim_modal.description_current": "現在の説明:", + "feed_claim_modal.description_instructions": "次の内容をコピーし、RSS フィードのフィールドに貼り付けてください。", "feed_claim_modal.failed_to_load": "クレームメッセージの読み込みに失敗しました", - "feed_claim_modal.rss_format_choice": "RSSジェネレータには通常2つのフォーマットがあります。必要に応じて以下のXMLおよびJSONフォーマットをコピーしてください。", - "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時間かかる場合があります。", + "feed_claim_modal.rss_format_choice": "RSS ジェネレータには通常 2 つのフォーマットがあります。必要に応じて以下の XML および JSON フォーマットをコピーしてください。", + "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 時間かかる場合があります。", "feed_claim_modal.tab_content": "コンテンツ", "feed_claim_modal.tab_description": "説明", - "feed_claim_modal.tab_rss": "RSSタグ", + "feed_claim_modal.tab_rss": "RSS タグ", "feed_claim_modal.verify_ownership": "このフィードを自分のものとしてクレームするには、所有権を確認する必要があります。", "feed_form.add_follow": "フォローを追加", "feed_form.category": "カテゴリー", @@ -96,25 +96,25 @@ "feed_item.claimed_by_you": "あなたによってクレームされています", "feed_item.claimed_feed": "クレームされたフィード", "feed_item.error_since": "エラー発生時刻", - "feed_item.not_publicly_visible": "プロフィールページに公開されていません", + "feed_item.not_publicly_visible": "プロ���ィールページに公開されていません", "feed_view_type.articles": "記事", "feed_view_type.audios": "オーディオ", "feed_view_type.notifications": "通知", "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": "すべてを既読にしますか?", "mark_all_read_button.mark_all_as_read": "すべてを既読にする", "mark_all_read_button.mark_as_read": "{{which}}を既読にする", "mark_all_read_button.undo": "元に戻す", - "player.back_10s": "10秒戻る", + "player.back_10s": "10 秒戻る", "player.close": "閉じる", "player.download": "ダウンロード", "player.exit_full_screen": "フルスクリーンを終了", - "player.forward_10s": "10秒進む", + "player.forward_10s": "10 秒進む", "player.full_screen": "フルスクリーン", "player.mute": "ミュート", "player.open_entry": "エントリを開く", @@ -140,8 +140,8 @@ "sidebar.category_remove_dialog.title": "カテゴリーを削除", "sidebar.feed_actions.claim": "クレーム", "sidebar.feed_actions.claim_feed": "フィードをクレーム", - "sidebar.feed_actions.copy_feed_id": "フィードIDをコピー", - "sidebar.feed_actions.copy_feed_url": "フィードURLをコピー", + "sidebar.feed_actions.copy_feed_id": "フィード ID をコピー", + "sidebar.feed_actions.copy_feed_url": "フィード URL をコピー", "sidebar.feed_actions.edit": "編集", "sidebar.feed_actions.edit_feed": "フィードを編集", "sidebar.feed_actions.feed_owned_by_you": "このフィードはあなたが所有しています", @@ -157,8 +157,8 @@ "sidebar.feed_column.context_menu.mark_as_read": "既読にする", "sidebar.feed_column.context_menu.rename_category": "カテゴリーの名前を変更", "sidebar.select_sort_method": "並べ替え方法を選択", - "signin.continue_with_github": "GitHubで続ける", - "signin.continue_with_google": "Googleで続ける", + "signin.continue_with_github": "GitHub で続ける", + "signin.continue_with_google": "Google で続ける", "signin.sign_in_to": "サインイン", "sync_indicator.disabled": "セキュリティ上の理由により、同期は無効になっています。", "sync_indicator.offline": "オフライン", @@ -173,9 +173,9 @@ "tip_modal.tip_now": "今すぐチップ", "tip_modal.tip_sent": "チップが正常に送信されました!ご支援ありがとうございます。", "tip_modal.tip_support": "⭐ サポートを示すためにチップを送る!", - "tip_modal.unclaimed_feed": "このフィードはまだ誰にもクレームされていません。受け取ったPowerは、フィードがクレームされるまでブロックチェーン契約で安全に保持されます。", + "tip_modal.unclaimed_feed": "このフィードはまだ誰にもクレームされていません。受け取った Power は、フィードがクレームされるまでブロックチェーン契約で安全に保持されます。", "user_button.account": "アカウント", - "user_button.download_desktop_app": "デスクトップアプリをダウンロード", + "user_button.download_desktop_app": "アプリをダウンロード", "user_button.log_out": "ログアウト", "user_button.power": "Power", "user_button.preferences": "設定", diff --git a/packages/shared/src/hono.ts b/packages/shared/src/hono.ts index d94dad9f3..92815780b 100644 --- a/packages/shared/src/hono.ts +++ b/packages/shared/src/hono.ts @@ -1,15 +1,179 @@ import * as hono_hono_base from 'hono/hono-base'; import { HttpBindings } from '@hono/node-server'; -import * as drizzle_orm from 'drizzle-orm'; -import { InferInsertModel } from 'drizzle-orm'; -import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core'; import * as zod from 'zod'; import { z } from 'zod'; +import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core'; +import * as drizzle_orm from 'drizzle-orm'; +import { InferInsertModel } from 'drizzle-orm'; type Env = { Bindings: HttpBindings; }; +declare const achievements: drizzle_orm_pg_core.PgTableWithColumns<{ + name: "achievements"; + schema: undefined; + columns: { + id: drizzle_orm_pg_core.PgColumn<{ + name: "id"; + tableName: "achievements"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: true; + isPrimaryKey: true; + isAutoincrement: false; + hasRuntimeDefault: true; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + userId: drizzle_orm_pg_core.PgColumn<{ + name: "user_id"; + tableName: "achievements"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + type: drizzle_orm_pg_core.PgColumn<{ + name: "type"; + tableName: "achievements"; + dataType: "string"; + columnType: "PgText"; + data: "received" | "checking" | "completed" | "incomplete"; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: ["checking", "completed", "incomplete", "received"]; + baseColumn: never; + generated: undefined; + }, {}, {}>; + actionId: drizzle_orm_pg_core.PgColumn<{ + name: "action_id"; + tableName: "achievements"; + dataType: "number"; + columnType: "PgInteger"; + data: number; + driverParam: string | number; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + progress: drizzle_orm_pg_core.PgColumn<{ + name: "progress"; + tableName: "achievements"; + dataType: "number"; + columnType: "PgInteger"; + data: number; + driverParam: string | number; + notNull: true; + hasDefault: true; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + progressMax: drizzle_orm_pg_core.PgColumn<{ + name: "progress_max"; + tableName: "achievements"; + dataType: "number"; + columnType: "PgInteger"; + data: number; + driverParam: string | number; + notNull: true; + hasDefault: true; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + done: drizzle_orm_pg_core.PgColumn<{ + name: "done"; + tableName: "achievements"; + dataType: "boolean"; + columnType: "PgBoolean"; + data: boolean; + driverParam: boolean; + notNull: true; + hasDefault: true; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + doneAt: drizzle_orm_pg_core.PgColumn<{ + name: "done_at"; + tableName: "achievements"; + dataType: "date"; + columnType: "PgTimestamp"; + data: Date; + driverParam: string; + notNull: false; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: undefined; + baseColumn: never; + generated: undefined; + }, {}, {}>; + }; + dialect: "pg"; +}>; +declare const achievementsOpenAPISchema: zod.ZodObject<{ + id: zod.ZodString; + userId: zod.ZodString; + type: zod.ZodEnum<["checking", "completed", "incomplete", "received"]>; + actionId: zod.ZodNumber; + progress: zod.ZodNumber; + progressMax: zod.ZodNumber; + done: zod.ZodBoolean; + doneAt: zod.ZodNullable; +}, zod.UnknownKeysParam, zod.ZodTypeAny, { + type: "received" | "checking" | "completed" | "incomplete"; + id: string; + userId: string; + actionId: number; + progress: number; + progressMax: number; + done: boolean; + doneAt: string | null; +}, { + type: "received" | "checking" | "completed" | "incomplete"; + id: string; + userId: string; + actionId: number; + progress: number; + progressMax: number; + done: boolean; + doneAt: string | null; +}>; + declare const languageSchema: z.ZodEnum<["en", "ja", "zh-CN", "zh-TW"]>; declare const conditionFieldSchema: z.ZodEnum<["view", "title", "site_url", "feed_url", "category"]>; declare const conditionOperatorSchema: z.ZodEnum<["contains", "not_contains", "eq", "not_eq", "gt", "lt", "regex"]>; @@ -110,11 +274,11 @@ declare const actionsItemOpenAPISchema: z.ZodObject<{ value: z.ZodUnion<[z.ZodString, z.ZodNumber]>; }, "strip", z.ZodTypeAny, { value: string | number; - field: "title" | "content" | "all" | "author" | "url" | "order"; + field: "title" | "all" | "content" | "author" | "url" | "order"; operator: "contains" | "not_contains" | "eq" | "not_eq" | "gt" | "lt" | "regex"; }, { value: string | number; - field: "title" | "content" | "all" | "author" | "url" | "order"; + field: "title" | "all" | "content" | "author" | "url" | "order"; operator: "contains" | "not_contains" | "eq" | "not_eq" | "gt" | "lt" | "regex"; }>, "many">>; }, "strip", z.ZodTypeAny, { @@ -127,7 +291,7 @@ declare const actionsItemOpenAPISchema: z.ZodObject<{ }[] | undefined; blockRules?: { value: string | number; - field: "title" | "content" | "all" | "author" | "url" | "order"; + field: "title" | "all" | "content" | "author" | "url" | "order"; operator: "contains" | "not_contains" | "eq" | "not_eq" | "gt" | "lt" | "regex"; }[] | undefined; }, { @@ -140,17 +304,12 @@ declare const actionsItemOpenAPISchema: z.ZodObject<{ }[] | undefined; blockRules?: { value: string | number; - field: "title" | "content" | "all" | "author" | "url" | "order"; + field: "title" | "all" | "content" | "author" | "url" | "order"; operator: "contains" | "not_contains" | "eq" | "not_eq" | "gt" | "lt" | "regex"; }[] | undefined; }>; }, "strip", z.ZodTypeAny, { name: string; - condition: { - value: string; - field: "title" | "view" | "site_url" | "feed_url" | "category"; - operator: "contains" | "not_contains" | "eq" | "not_eq" | "gt" | "lt" | "regex"; - }[]; result: { summary?: boolean | undefined; translation?: "en" | "ja" | "zh-CN" | "zh-TW" | undefined; @@ -161,17 +320,17 @@ declare const actionsItemOpenAPISchema: z.ZodObject<{ }[] | undefined; blockRules?: { value: string | number; - field: "title" | "content" | "all" | "author" | "url" | "order"; + field: "title" | "all" | "content" | "author" | "url" | "order"; operator: "contains" | "not_contains" | "eq" | "not_eq" | "gt" | "lt" | "regex"; }[] | undefined; }; + condition: { + value: string; + field: "title" | "view" | "site_url" | "feed_url" | "category"; + operator: "contains" | "not_contains" | "eq" | "not_eq" | "gt" | "lt" | "regex"; + }[]; }, { name: string; - condition: { - value: string; - field: "title" | "view" | "site_url" | "feed_url" | "category"; - operator: "contains" | "not_contains" | "eq" | "not_eq" | "gt" | "lt" | "regex"; - }[]; result: { summary?: boolean | undefined; translation?: "en" | "ja" | "zh-CN" | "zh-TW" | undefined; @@ -182,10 +341,15 @@ declare const actionsItemOpenAPISchema: z.ZodObject<{ }[] | undefined; blockRules?: { value: string | number; - field: "title" | "content" | "all" | "author" | "url" | "order"; + field: "title" | "all" | "content" | "author" | "url" | "order"; operator: "contains" | "not_contains" | "eq" | "not_eq" | "gt" | "lt" | "regex"; }[] | undefined; }; + condition: { + value: string; + field: "title" | "view" | "site_url" | "feed_url" | "category"; + operator: "contains" | "not_contains" | "eq" | "not_eq" | "gt" | "lt" | "regex"; + }[]; }>; declare const actionsOpenAPISchema: z.ZodObject; }, "strip", z.ZodTypeAny, { value: string | number; - field: "title" | "content" | "all" | "author" | "url" | "order"; + field: "title" | "all" | "content" | "author" | "url" | "order"; operator: "contains" | "not_contains" | "eq" | "not_eq" | "gt" | "lt" | "regex"; }, { value: string | number; - field: "title" | "content" | "all" | "author" | "url" | "order"; + field: "title" | "all" | "content" | "author" | "url" | "order"; operator: "contains" | "not_contains" | "eq" | "not_eq" | "gt" | "lt" | "regex"; }>, "many">>; }, "strip", z.ZodTypeAny, { @@ -247,7 +411,7 @@ declare const actionsOpenAPISchema: z.ZodObject; }, "strip", z.ZodTypeAny, { name: string; - condition: { - value: string; - field: "title" | "view" | "site_url" | "feed_url" | "category"; - operator: "contains" | "not_contains" | "eq" | "not_eq" | "gt" | "lt" | "regex"; - }[]; result: { summary?: boolean | undefined; translation?: "en" | "ja" | "zh-CN" | "zh-TW" | undefined; @@ -281,17 +440,17 @@ declare const actionsOpenAPISchema: z.ZodObject, "many">>>; }>, "strip", z.ZodTypeAny, { userId: string; rules?: { name: string; - condition: { - value: string; - field: "title" | "view" | "site_url" | "feed_url" | "category"; - operator: "contains" | "not_contains" | "eq" | "not_eq" | "gt" | "lt" | "regex"; - }[]; result: { summary?: boolean | undefined; translation?: "en" | "ja" | "zh-CN" | "zh-TW" | undefined; @@ -326,20 +485,20 @@ declare const actionsOpenAPISchema: z.ZodObject; declare const actionsRelations: drizzle_orm.Relations<"actions", { @@ -3999,6 +4163,7 @@ declare const _routes: hono_hono_base.HonoBase; type AppType = typeof _routes; -export { type ActionsModel, type AppType, type AttachmentsModel, type EntriesModel, type EntryReadHistoriesModel, type FeedModel, type MediaModel, type SettingsModel, accounts, actions, actionsItemOpenAPISchema, actionsOpenAPISchema, actionsRelations, collections, collectionsOpenAPISchema, collectionsRelations, entries, entriesOpenAPISchema, entriesRelations, entryReadHistories, entryReadHistoriesOpenAPISchema, entryReadHistoriesRelations, feedPowerTokens, feedPowerTokensOpenAPISchema, feedPowerTokensRelations, feeds, feedsOpenAPISchema, feedsRelations, invitations, invitationsOpenAPISchema, invitationsRelations, languageSchema, lists, listsOpenAPISchema, listsRelations, listsSubscriptions, listsSubscriptionsOpenAPISchema, listsSubscriptionsRelations, listsTimeline, listsTimelineOpenAPISchema, listsTimelineRelations, sessions, settings, subscriptions, subscriptionsOpenAPISchema, subscriptionsRelations, timeline, timelineOpenAPISchema, timelineRelations, transactionType, transactions, transactionsOpenAPISchema, transactionsRelations, users, usersOpenApiSchema, usersRelations, verificationTokens, wallets, walletsOpenAPISchema, walletsRelations }; +export { type ActionsModel, type AppType, type AttachmentsModel, type EntriesModel, type EntryReadHistoriesModel, type FeedModel, type MediaModel, type SettingsModel, accounts, achievements, achievementsOpenAPISchema, actions, actionsItemOpenAPISchema, actionsOpenAPISchema, actionsRelations, collections, collectionsOpenAPISchema, collectionsRelations, entries, entriesOpenAPISchema, entriesRelations, entryReadHistories, entryReadHistoriesOpenAPISchema, entryReadHistoriesRelations, feedPowerTokens, feedPowerTokensOpenAPISchema, feedPowerTokensRelations, feeds, feedsOpenAPISchema, feedsRelations, invitations, invitationsOpenAPISchema, invitationsRelations, languageSchema, lists, listsOpenAPISchema, listsRelations, listsSubscriptions, listsSubscriptionsOpenAPISchema, listsSubscriptionsRelations, listsTimeline, listsTimelineOpenAPISchema, listsTimelineRelations, sessions, settings, subscriptions, subscriptionsOpenAPISchema, subscriptionsRelations, timeline, timelineOpenAPISchema, timelineRelations, transactionType, transactions, transactionsOpenAPISchema, transactionsRelations, users, usersOpenApiSchema, usersRelations, verificationTokens, wallets, walletsOpenAPISchema, walletsRelations }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bc616a63a..33cbebe69 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -504,6 +504,9 @@ importers: lodash-es: specifier: 4.17.21 version: 4.17.21 + lottie-react: + specifier: 2.4.0 + version: 2.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nanoid: specifier: 5.0.7 version: 5.0.7 @@ -6173,6 +6176,15 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lottie-react@2.4.0: + resolution: {integrity: sha512-pDJGj+AQlnlyHvOHFK7vLdsDcvbuqvwPZdMlJ360wrzGFurXeKPr8SiRCjLf3LrNYKANQtSsh5dz9UYQHuqx4w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + lottie-web@5.12.2: + resolution: {integrity: sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==} + loupe@3.1.1: resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} @@ -15527,6 +15539,14 @@ snapshots: dependencies: js-tokens: 4.0.0 + lottie-react@2.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + lottie-web: 5.12.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + lottie-web@5.12.2: {} + loupe@3.1.1: dependencies: get-func-name: 2.0.2 From 78bcc5562baa12cece51da6564b77c6f37a1596c Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sat, 21 Sep 2024 23:37:58 +0800 Subject: [PATCH 22/47] feat: tiny styles --- apps/renderer/src/lib/parsers.ts | 2 +- .../src/modules/entry-column/Items/social-media-item.tsx | 6 +++--- apps/renderer/src/modules/feed-column/header.tsx | 2 +- apps/renderer/src/modules/feed-column/item.tsx | 2 +- apps/renderer/src/modules/settings/tabs/lists.tsx | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/renderer/src/lib/parsers.ts b/apps/renderer/src/lib/parsers.ts index dc779180c..6a405527e 100644 --- a/apps/renderer/src/lib/parsers.ts +++ b/apps/renderer/src/lib/parsers.ts @@ -6,7 +6,7 @@ export const parseSocialMedia = (entry: EntryModel) => { const { authorUrl, url, guid } = entry const parsedUrl = authorUrl || url || guid - const isX = isXUrl(parsedUrl) || isTwitterUrl(parsedUrl) + const isX = isXUrl(parsedUrl).validate || isTwitterUrl(parsedUrl).validate if (isX) { return { diff --git a/apps/renderer/src/modules/entry-column/Items/social-media-item.tsx b/apps/renderer/src/modules/entry-column/Items/social-media-item.tsx index f7415ea1f..ce1bad9b4 100644 --- a/apps/renderer/src/modules/entry-column/Items/social-media-item.tsx +++ b/apps/renderer/src/modules/entry-column/Items/social-media-item.tsx @@ -58,10 +58,10 @@ export const SocialMediaItem: EntryListItemFC = ({ entryId, entryPreview, transl
- - {entry.entries.author} + + {entry.entries.author || feed.title} {parsed?.type === "x" && ( - + )} diff --git a/apps/renderer/src/modules/feed-column/header.tsx b/apps/renderer/src/modules/feed-column/header.tsx index bb48a516d..f6a03a73a 100644 --- a/apps/renderer/src/modules/feed-column/header.tsx +++ b/apps/renderer/src/modules/feed-column/header.tsx @@ -63,7 +63,7 @@ export const FeedColumnHeader = memo(() => {
- + diff --git a/apps/renderer/src/modules/feed-column/item.tsx b/apps/renderer/src/modules/feed-column/item.tsx index 67fa32ec7..92b391e21 100644 --- a/apps/renderer/src/modules/feed-column/item.tsx +++ b/apps/renderer/src/modules/feed-column/item.tsx @@ -73,7 +73,7 @@ const FeedItemImpl = ({ view, feedId, className, showUnreadCount = true }: FeedI
{ {t.settings("lists.title")} - + {t.settings("lists.view")} From 2385d1530c62d7adada3923832d8f57a13268b6e Mon Sep 17 00:00:00 2001 From: Innei Date: Sun, 22 Sep 2024 00:05:29 +0800 Subject: [PATCH 23/47] feat: use dotlottie and add confetti Signed-off-by: Innei --- apps/renderer/package.json | 2 +- apps/renderer/src/components/feed-summary.tsx | 9 +- apps/renderer/src/lottie/achievement.json | 2123 ----------------- apps/renderer/src/lottie/achievement.lottie | Bin 0 -> 3754 bytes apps/renderer/src/lottie/confetti.lottie | Bin 0 -> 15349 bytes .../src/modules/achievement/hooks.tsx | 24 +- .../renderer/src/modules/feed-column/item.tsx | 16 +- .../src/pages/(external)/invitation.tsx | 45 +- pnpm-lock.yaml | 40 +- 9 files changed, 90 insertions(+), 2169 deletions(-) delete mode 100644 apps/renderer/src/lottie/achievement.json create mode 100644 apps/renderer/src/lottie/achievement.lottie create mode 100644 apps/renderer/src/lottie/confetti.lottie diff --git a/apps/renderer/package.json b/apps/renderer/package.json index 3ac640927..55b3817f1 100644 --- a/apps/renderer/package.json +++ b/apps/renderer/package.json @@ -18,6 +18,7 @@ "@hono/auth-js": "1.0.10", "@hookform/resolvers": "3.9.0", "@iconify/tools": "4.0.6", + "@lottiefiles/dotlottie-react": "0.8.12", "@microflash/remark-callout-directives": "4.3.1", "@mozilla/readability": "^0.5.0", "@radix-ui/react-alert-dialog": "1.1.1", @@ -70,7 +71,6 @@ "lethargy": "1.0.9", "linkedom": "^0.18.5", "lodash-es": "4.17.21", - "lottie-react": "2.4.0", "nanoid": "5.0.7", "ofetch": "1.4.0", "path-to-regexp": "8.1.0", diff --git a/apps/renderer/src/components/feed-summary.tsx b/apps/renderer/src/components/feed-summary.tsx index ef5550533..30fd10edd 100644 --- a/apps/renderer/src/components/feed-summary.tsx +++ b/apps/renderer/src/components/feed-summary.tsx @@ -16,10 +16,11 @@ export function FollowSummary({ docs?: string className?: string }) { + const isList = feed.type === "list" return ( diff --git a/apps/renderer/src/lottie/achievement.json b/apps/renderer/src/lottie/achievement.json deleted file mode 100644 index 3889e0bce..000000000 --- a/apps/renderer/src/lottie/achievement.json +++ /dev/null @@ -1,2123 +0,0 @@ -{ - "v": "5.5.8", - "fr": 29.9700012207031, - "ip": 0, - "op": 150.000006109625, - "w": 144, - "h": 144, - "nm": "Plan Complete 2021", - "ddd": 0, - "assets": [], - "layers": [ - { - "ddd": 0, - "ind": 1, - "ty": 4, - "nm": "Layer 6", - "parent": 10, - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { "x": [0.833], "y": [0.833] }, - "o": { "x": [0.167], "y": [0.167] }, - "t": 90, - "s": [0] - }, - { "t": 100.000004073084, "s": [100] } - ], - "ix": 11 - }, - "r": { "a": 0, "k": 0, "ix": 10 }, - "p": { "a": 0, "k": [41.998, -3.5, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [-0.002, 0.001], - [-0.002, 0.001] - ], - "o": [ - [0.002, -0.001], - [0.002, -0.001], - [0, 0] - ], - "v": [ - [-3.657, 2.133], - [0, 0], - [3.657, -2.133] - ], - "c": false - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "st", - "c": { "a": 0, "k": [1, 0.764705896378, 0.466666668653, 1], "ix": 3 }, - "o": { "a": 0, "k": 100, "ix": 4 }, - "w": { "a": 0, "k": 4, "ix": 5 }, - "lc": 2, - "lj": 2, - "bm": 0, - "nm": "Stroke 1", - "mn": "ADBE Vector Graphic - Stroke", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Group 1", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "tm", - "s": { - "a": 1, - "k": [ - { "i": { "x": [0], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 90, "s": [0] }, - { "t": 130.000005295009, "s": [100] } - ], - "ix": 1 - }, - "e": { "a": 0, "k": 1, "ix": 2 }, - "o": { "a": 0, "k": 0, "ix": 3 }, - "m": 1, - "ix": 2, - "nm": "Trim Paths 1", - "mn": "ADBE Vector Filter - Trim", - "hd": false - } - ], - "ip": 90.0000036657751, - "op": 150.000006109625, - "st": 30.0000012219251, - "bm": 0 - }, - { - "ddd": 0, - "ind": 2, - "ty": 4, - "nm": "Layer 5", - "parent": 10, - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { "x": [0.833], "y": [0.833] }, - "o": { "x": [0.167], "y": [0.167] }, - "t": 100, - "s": [0] - }, - { "t": 110.000004480392, "s": [100] } - ], - "ix": 11 - }, - "r": { "a": 0, "k": 0, "ix": 10 }, - "p": { "a": 0, "k": [-41.998, -3.5, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0.002, 0.001], - [0.002, 0.001] - ], - "o": [ - [-0.002, -0.001], - [-0.002, -0.001], - [0, 0] - ], - "v": [ - [3.657, 2.133], - [0, 0], - [-3.657, -2.133] - ], - "c": false - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "st", - "c": { "a": 0, "k": [1, 0.686274528503, 0.313725501299, 1], "ix": 3 }, - "o": { "a": 0, "k": 100, "ix": 4 }, - "w": { "a": 0, "k": 4, "ix": 5 }, - "lc": 2, - "lj": 2, - "bm": 0, - "nm": "Stroke 1", - "mn": "ADBE Vector Graphic - Stroke", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Group 1", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "tm", - "s": { - "a": 1, - "k": [ - { "i": { "x": [0], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 100, "s": [0] }, - { "t": 140.000005702317, "s": [100] } - ], - "ix": 1 - }, - "e": { "a": 0, "k": 1, "ix": 2 }, - "o": { "a": 0, "k": 0, "ix": 3 }, - "m": 1, - "ix": 2, - "nm": "Trim Paths 1", - "mn": "ADBE Vector Filter - Trim", - "hd": false - } - ], - "ip": 100.000004073084, - "op": 160.000006516934, - "st": 40.0000016292334, - "bm": 0 - }, - { - "ddd": 0, - "ind": 3, - "ty": 4, - "nm": "Layer 4", - "parent": 10, - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { "x": [0.833], "y": [0.833] }, - "o": { "x": [0.167], "y": [0.167] }, - "t": 90, - "s": [0] - }, - { "t": 100.000004073084, "s": [100] } - ], - "ix": 11 - }, - "r": { "a": 0, "k": 0, "ix": 10 }, - "p": { "a": 0, "k": [-40.001, -16.001, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0] - ], - "o": [ - [0, 0], - [0, 0] - ], - "v": [ - [5.743, 5.744], - [-5.743, -5.744] - ], - "c": false - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "st", - "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 3 }, - "o": { "a": 0, "k": 100, "ix": 4 }, - "w": { "a": 0, "k": 4, "ix": 5 }, - "lc": 2, - "lj": 2, - "bm": 0, - "nm": "Stroke 1", - "mn": "ADBE Vector Graphic - Stroke", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Group 1", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "tm", - "s": { - "a": 1, - "k": [ - { "i": { "x": [0], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 90, "s": [0] }, - { "t": 130.000005295009, "s": [100] } - ], - "ix": 1 - }, - "e": { "a": 0, "k": 1, "ix": 2 }, - "o": { "a": 0, "k": 0, "ix": 3 }, - "m": 1, - "ix": 2, - "nm": "Trim Paths 1", - "mn": "ADBE Vector Filter - Trim", - "hd": false - } - ], - "ip": 90.0000036657751, - "op": 150.000006109625, - "st": 30.0000012219251, - "bm": 0 - }, - { - "ddd": 0, - "ind": 4, - "ty": 4, - "nm": "Layer 3", - "parent": 10, - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { "x": [0.833], "y": [0.833] }, - "o": { "x": [0.167], "y": [0.167] }, - "t": 100, - "s": [0] - }, - { "t": 110.000004480392, "s": [100] } - ], - "ix": 11 - }, - "r": { "a": 0, "k": 0, "ix": 10 }, - "p": { "a": 0, "k": [40.002, -16.001, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0] - ], - "o": [ - [0, 0], - [0, 0] - ], - "v": [ - [-5.744, 5.744], - [5.744, -5.744] - ], - "c": false - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "st", - "c": { "a": 0, "k": [1, 0.686274528503, 0.313725501299, 1], "ix": 3 }, - "o": { "a": 0, "k": 100, "ix": 4 }, - "w": { "a": 0, "k": 4, "ix": 5 }, - "lc": 2, - "lj": 2, - "bm": 0, - "nm": "Stroke 1", - "mn": "ADBE Vector Graphic - Stroke", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Group 1", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "tm", - "s": { - "a": 1, - "k": [ - { "i": { "x": [0], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 100, "s": [0] }, - { "t": 140.000005702317, "s": [100] } - ], - "ix": 1 - }, - "e": { "a": 0, "k": 1, "ix": 2 }, - "o": { "a": 0, "k": 0, "ix": 3 }, - "m": 1, - "ix": 2, - "nm": "Trim Paths 1", - "mn": "ADBE Vector Filter - Trim", - "hd": false - } - ], - "ip": 100.000004073084, - "op": 160.000006516934, - "st": 40.0000016292334, - "bm": 0 - }, - { - "ddd": 0, - "ind": 5, - "ty": 4, - "nm": "Path 15295", - "parent": 10, - "sr": 1, - "ks": { - "o": { "a": 0, "k": 100, "ix": 11 }, - "r": { "a": 0, "k": 0, "ix": 10 }, - "p": { "a": 0, "k": [-29.994, 5.999, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, - "t": 70, - "s": [0, 0, 100] - }, - { "t": 90.0000036657751, "s": [100, 100, 100] } - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [2.178, 0.916], - [-0.152, 0.387], - [-0.195, 0.076], - [-0.918, 2.177], - [-0.387, -0.15], - [-0.076, -0.196], - [-2.177, -0.917], - [0.152, -0.387], - [0.195, -0.076], - [0.916, -2.177], - [0.387, 0.152], - [0.076, 0.195] - ], - "o": [ - [-0.918, -2.177], - [-0.387, -0.152], - [0.076, -0.195], - [2.177, -0.918], - [0.15, -0.387], - [0.196, 0.076], - [0.917, 2.177], - [0.387, 0.152], - [-0.076, 0.195], - [-2.177, 0.916], - [-0.152, 0.387], - [-0.195, -0.076], - [0, 0] - ], - "v": [ - [-0.699, 5.527], - [-5.527, 0.702], - [-5.952, -0.273], - [-5.527, -0.698], - [-0.699, -5.525], - [0.273, -5.953], - [0.701, -5.525], - [5.527, -0.698], - [5.952, 0.277], - [5.527, 0.702], - [0.702, 5.527], - [-0.273, 5.952], - [-0.698, 5.527] - ], - "c": false - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "fl", - "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 4 }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Path 15295", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ], - "ip": 70.0000028511585, - "op": 150.000006109625, - "st": 40.0000016292334, - "bm": 0 - }, - { - "ddd": 0, - "ind": 6, - "ty": 4, - "nm": "Path 15297", - "parent": 10, - "sr": 1, - "ks": { - "o": { "a": 0, "k": 100, "ix": 11 }, - "r": { "a": 0, "k": 0, "ix": 10 }, - "p": { "a": 0, "k": [25, -19, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, - "t": 50, - "s": [0, 0, 100] - }, - { "t": 70.0000028511585, "s": [100, 100, 100] } - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [2.904, 1.221], - [-0.2, 0.515], - [-0.261, 0.102], - [-1.224, 2.903], - [-0.515, -0.2], - [-0.102, -0.261], - [-2.903, -1.224], - [0.2, -0.515], - [0.261, -0.102], - [1.221, -2.903], - [0.515, 0.2], - [0.102, 0.261] - ], - "o": [ - [-1.222, -2.904], - [-0.515, -0.2], - [0.102, -0.261], - [2.903, -1.224], - [0.2, -0.515], - [0.261, 0.102], - [1.223, 2.903], - [0.515, 0.2], - [-0.102, 0.261], - [-2.903, 1.221], - [-0.2, 0.515], - [-0.261, -0.102], - [0, 0] - ], - "v": [ - [-0.931, 7.367], - [-7.368, 0.934], - [-7.938, -0.361], - [-7.368, -0.93], - [-0.931, -7.367], - [0.363, -7.937], - [0.933, -7.367], - [7.368, -0.93], - [7.938, 0.364], - [7.368, 0.934], - [0.934, 7.367], - [-0.36, 7.937], - [-0.93, 7.367] - ], - "c": false - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "fl", - "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 4 }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Path 15297", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ], - "ip": 50.0000020365418, - "op": 150.000006109625, - "st": 20.0000008146167, - "bm": 0 - }, - { - "ddd": 0, - "ind": 7, - "ty": 4, - "nm": "Path 15294", - "parent": 10, - "sr": 1, - "ks": { - "o": { "a": 0, "k": 100, "ix": 11 }, - "r": { "a": 0, "k": 0, "ix": 10 }, - "p": { "a": 0, "k": [17, 32, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, - "t": 60, - "s": [0, 0, 100] - }, - { "t": 80.0000032584668, "s": [100, 100, 100] } - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [2.904, 1.221], - [-0.2, 0.515], - [-0.261, 0.102], - [-1.224, 2.903], - [-0.515, -0.2], - [-0.102, -0.261], - [-2.903, -1.224], - [0.2, -0.515], - [0.261, -0.102], - [1.221, -2.903], - [0.515, 0.2], - [0.102, 0.261] - ], - "o": [ - [-1.222, -2.904], - [-0.515, -0.2], - [0.102, -0.261], - [2.903, -1.224], - [0.2, -0.515], - [0.261, 0.102], - [1.223, 2.903], - [0.515, 0.2], - [-0.102, 0.261], - [-2.903, 1.221], - [-0.2, 0.515], - [-0.261, -0.102], - [0, 0] - ], - "v": [ - [-0.931, 7.367], - [-7.368, 0.934], - [-7.938, -0.361], - [-7.368, -0.93], - [-0.931, -7.367], - [0.363, -7.937], - [0.933, -7.367], - [7.368, -0.93], - [7.938, 0.364], - [7.368, 0.934], - [0.934, 7.367], - [-0.36, 7.937], - [-0.93, 7.367] - ], - "c": false - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "fl", - "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 4 }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Path 15294", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ], - "ip": 60.0000024438501, - "op": 150.000006109625, - "st": 30.0000012219251, - "bm": 0 - }, - { - "ddd": 0, - "ind": 8, - "ty": 4, - "nm": "Layer 2", - "parent": 10, - "td": 1, - "sr": 1, - "ks": { - "o": { "a": 0, "k": 100, "ix": 11 }, - "r": { "a": 0, "k": 0, "ix": 10 }, - "p": { "a": 0, "k": [0, 0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [-2.349, -6.785], - [0, 0], - [-6.796, 0.004], - [0, 0], - [-2.227, 6.42], - [0, 0], - [5.936, 4.041], - [0, 0], - [5.428, -3.699] - ], - "o": [ - [0, 0], - [-5.935, 4.041], - [0, 0], - [2.227, 6.42], - [0, 0], - [6.796, 0.004], - [0, 0], - [2.349, -6.786], - [0, 0], - [-5.428, -3.699], - [0, 0] - ], - "v": [ - [-8.998, -61.226], - [-59.048, -27.1], - [-65.124, -8.756], - [-46.418, 45.28], - [-31.344, 56], - [31.342, 56], - [46.416, 45.281], - [65.124, -8.755], - [59.046, -27.1], - [8.997, -61.226], - [-8.998, -61.226] - ], - "c": false - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "fl", - "c": { "a": 0, "k": [1, 0.878431379795, 0.729411780834, 1], "ix": 4 }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Path 15226", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Group 7235", - "np": 1, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [6.549, 0.101], - [0, 0], - [2.452, 6.073], - [0, 0], - [-0.264, 2.244], - [0, 0], - [0, 0], - [0, 0], - [-5.364, -3.302], - [0, 0], - [0, 0], - [0, 0], - [0.802, -2.112] - ], - "o": [ - [0, 0], - [-2.452, 6.074], - [0, 0], - [-6.549, 0.101], - [0, 0], - [-0.801, -2.112], - [0, 0], - [0, 0], - [0, 0], - [5.364, -3.302], - [0, 0], - [0, 0], - [0, 0], - [0.262, 2.244], - [0, 0] - ], - "v": [ - [65.083, 5.185], - [46.559, 54.085], - [31.621, 63.996], - [-31.619, 63.996], - [-46.557, 54.085], - [-65.082, 5.185], - [-65.9, -1.445], - [-65.9, -13.491], - [-53.944, -15.356], - [-8.744, -43.523], - [8.75, -43.523], - [53.95, -15.356], - [65.9, -13.491], - [65.9, -1.445], - [65.078, 5.184] - ], - "c": false - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [0.976470589638, 0.803921580315, 0.423529416323, 1], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Path 15225", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Group 7232", - "np": 1, - "cix": 2, - "bm": 0, - "ix": 2, - "mn": "ADBE Vector Group", - "hd": false - } - ], - "ip": 0, - "op": 150.000006109625, - "st": 0, - "bm": 0 - }, - { - "ddd": 0, - "ind": 9, - "ty": 4, - "nm": "Group 61797", - "parent": 10, - "tt": 1, - "sr": 1, - "ks": { - "o": { "a": 0, "k": 100, "ix": 11 }, - "r": { - "a": 1, - "k": [ - { "i": { "x": [0], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 10, "s": [45] }, - { "t": 70.0000028511585, "s": [0] } - ], - "ix": 10 - }, - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0, "y": 1 }, - "o": { "x": 0.333, "y": 0 }, - "t": 10, - "s": [-1.341, -105.613, 0], - "to": [0.223, 17.602, 0], - "ti": [-0.223, -17.602, 0] - }, - { "t": 70.0000028511585, "s": [0, 0, 0] } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ty": "gr", - "it": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [0.47, -0.237], - [0, 0], - [0.399, 0.789], - [-0.067, 0.348], - [0, 0], - [0.371, 0.375], - [0, 0], - [-0.626, 0.623], - [-0.352, 0.044], - [0, 0], - [-0.243, 0.468], - [0, 0], - [-0.787, -0.403], - [-0.151, -0.322], - [0, 0], - [-0.521, -0.086], - [0, 0], - [0.141, -0.872], - [0.26, -0.242], - [0, 0], - [-0.08, -0.521], - [0, 0], - [0.874, -0.132], - [0.309, 0.17] - ], - "o": [ - [0, 0], - [-0.462, -0.253], - [0, 0], - [-0.789, 0.399], - [-0.16, -0.316], - [0, 0], - [0.099, -0.518], - [0, 0], - [-0.623, -0.626], - [0.251, -0.25], - [0, 0], - [0.523, -0.065], - [0, 0], - [0.403, -0.787], - [0.316, 0.162], - [0, 0], - [0.224, 0.478], - [0, 0], - [0.872, 0.141], - [-0.057, 0.351], - [0, 0], - [-0.384, 0.361], - [0, 0], - [0.132, 0.874], - [-0.349, 0.053], - [0, 0] - ], - "v": [ - [6.309, 19.713], - [0.6, 16.572], - [-0.888, 16.545], - [-6.715, 19.469], - [-8.865, 18.763], - [-9.009, 17.738], - [-7.787, 11.339], - [-8.221, 9.912], - [-12.795, 5.278], - [-12.79, 3.015], - [-11.859, 2.562], - [-5.396, 1.746], - [-4.172, 0.895], - [-1.181, -4.892], - [0.973, -5.587], - [1.693, -4.841], - [4.466, 1.052], - [5.655, 1.952], - [12.083, 3.009], - [13.407, 4.844], - [12.918, 5.759], - [8.17, 10.218], - [7.683, 11.627], - [8.665, 18.068], - [7.323, 19.89], - [6.309, 19.709] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "fl", - "c": { "a": 0, "k": [1, 0.686274528503, 0.313725501299, 1], "ix": 4 }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Path 279286", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Group 61793", - "np": 1, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [-13.255, 0], - [0, -13.255], - [13.255, 0], - [0, 13.255] - ], - "o": [ - [13.255, 0], - [0, 13.255], - [-13.255, 0], - [0, -13.255] - ], - "v": [ - [0, -16], - [24, 8], - [0, 32], - [-24, 8] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "fl", - "c": { "a": 0, "k": [1, 0.870588243008, 0.517647087574, 1], "ix": 4 }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 4722", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 2, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [-17.673, 0], - [0, -17.673], - [17.673, 0], - [0, 17.673] - ], - "o": [ - [17.673, 0], - [0, 17.673], - [-17.673, 0], - [0, -17.673] - ], - "v": [ - [0, -24], - [32, 8], - [0, 40], - [-32, 8] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [0.976470589638, 0.803921580315, 0.423529416323, 1], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 4721", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 3, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Group 61794", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [-0.134, 3.171], - [0, 0], - [-3.17, 0.147], - [0, 0], - [0.134, -3.171], - [0, 0], - [3.169, -0.147] - ], - "o": [ - [0, 0], - [-3.17, -0.147], - [0, 0], - [-0.134, -3.171], - [0, 0], - [3.17, 0.147], - [0, 0], - [0.135, 3.17], - [0, 0] - ], - "v": [ - [14.511, -18], - [-14.51, -18], - [-20, -24], - [-20, -24], - [-14.51, -30], - [14.511, -30], - [20.001, -24], - [20.001, -24], - [14.513, -18] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [0.615686297417, 0.776470601559, 0.890196084976, 1], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Path 279283", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Group 61792", - "np": 1, - "cix": 2, - "bm": 0, - "ix": 2, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [0, 0], - [0, 0] - ], - "o": [ - [0, 0], - [0, 0], - [0, 0], - [0, 0] - ], - "v": [ - [-8, -70], - [8, -70], - [8, -30], - [-8, -30] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "fl", - "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 4 }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Rectangle 9679", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0.002, 0], - [0, 0], - [-0.009, 2.198], - [0, 0.001], - [0, 0], - [0, 0], - [-2.199, 0.011], - [-0.001, 0], - [0, 0], - [0.01, -2.199], - [0, 0], - [2.199, -0.01] - ], - "o": [ - [0, 0], - [-2.198, -0.009], - [0, -0.001], - [0, 0], - [0, 0], - [-0.01, -2.199], - [0.001, 0], - [0, 0], - [2.199, 0.01], - [0, 0], - [0.01, 2.199], - [-0.002, 0] - ], - "v": [ - [32.035, -70], - [-32.036, -70], - [-36, -73.996], - [-36, -74], - [-36, -74], - [-36, -74], - [-32.038, -78], - [-32.036, -78], - [32.042, -78], - [36.005, -74], - [36.005, -74], - [32.041, -70] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [0.615686297417, 0.776470601559, 0.890196084976, 1], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Path 279282", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 2, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [3.001, -1.534], - [0, 0], - [0, 0], - [0, 0], - [0, 2.928], - [0, 0], - [0, 0], - [0, 0] - ], - "o": [ - [0, 0], - [0, 0], - [0, 0], - [-3.143, -1.509], - [0, 0], - [0, 0], - [0, 0], - [-0.003, 2.848] - ], - "v": [ - [22.548, -34.07], - [14.584, -30], - [-14.686, -30], - [-23.227, -34.1], - [-28.292, -41.25], - [-27.948, -70.001], - [27.708, -70.001], - [27.367, -41.101] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [0.929411768913, 0.486274510622, 0.533333361149, 1], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Path 279281", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 3, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Group 61791", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 3, - "mn": "ADBE Vector Group", - "hd": false - } - ], - "ip": 0, - "op": 150.000006109625, - "st": 0, - "bm": 0 - }, - { - "ddd": 0, - "ind": 10, - "ty": 4, - "nm": "Layer 1", - "sr": 1, - "ks": { - "o": { "a": 0, "k": 100, "ix": 11 }, - "r": { - "a": 1, - "k": [ - { "i": { "x": [0], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 0, "s": [15] }, - { "t": 60.0000024438501, "s": [0] } - ], - "ix": 10 - }, - "p": { "a": 0, "k": [72, 72, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0, 0, 0.667], "y": [1, 1, 1] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, - "t": 0, - "s": [0, 0, 100] - }, - { "t": 60.0000024438501, "s": [100, 100, 100] } - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [-2.349, -6.785], - [0, 0], - [-6.796, 0.004], - [0, 0], - [-2.227, 6.42], - [0, 0], - [5.936, 4.041], - [0, 0], - [5.428, -3.699] - ], - "o": [ - [0, 0], - [-5.935, 4.041], - [0, 0], - [2.227, 6.42], - [0, 0], - [6.796, 0.004], - [0, 0], - [2.349, -6.786], - [0, 0], - [-5.428, -3.699], - [0, 0] - ], - "v": [ - [-8.998, -61.226], - [-59.048, -27.1], - [-65.124, -8.756], - [-46.418, 45.28], - [-31.344, 56], - [31.342, 56], - [46.416, 45.281], - [65.124, -8.755], - [59.046, -27.1], - [8.997, -61.226], - [-8.998, -61.226] - ], - "c": false - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "fl", - "c": { "a": 0, "k": [1, 0.878431379795, 0.729411780834, 1], "ix": 4 }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Path 15226", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Group 7235", - "np": 1, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [6.549, 0.101], - [0, 0], - [2.452, 6.073], - [0, 0], - [-0.264, 2.244], - [0, 0], - [0, 0], - [0, 0], - [-5.364, -3.302], - [0, 0], - [0, 0], - [0, 0], - [0.802, -2.112] - ], - "o": [ - [0, 0], - [-2.452, 6.074], - [0, 0], - [-6.549, 0.101], - [0, 0], - [-0.801, -2.112], - [0, 0], - [0, 0], - [0, 0], - [5.364, -3.302], - [0, 0], - [0, 0], - [0, 0], - [0.262, 2.244], - [0, 0] - ], - "v": [ - [65.083, 5.185], - [46.559, 54.085], - [31.621, 63.996], - [-31.619, 63.996], - [-46.557, 54.085], - [-65.082, 5.185], - [-65.9, -1.445], - [-65.9, -13.491], - [-53.944, -15.356], - [-8.744, -43.523], - [8.75, -43.523], - [53.95, -15.356], - [65.9, -13.491], - [65.9, -1.445], - [65.078, 5.184] - ], - "c": false - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [0.976470589638, 0.803921580315, 0.423529416323, 1], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Path 15225", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Group 7232", - "np": 1, - "cix": 2, - "bm": 0, - "ix": 2, - "mn": "ADBE Vector Group", - "hd": false - } - ], - "ip": 0, - "op": 150.000006109625, - "st": 0, - "bm": 0 - } - ], - "markers": [] -} diff --git a/apps/renderer/src/lottie/achievement.lottie b/apps/renderer/src/lottie/achievement.lottie new file mode 100644 index 0000000000000000000000000000000000000000..02b252135ebf8d6b37762bc6ff43d95b938e274c GIT binary patch literal 3754 zcmbVPcQ71W*SA{qRTH8Hk=1*!h`u69^j)csJNKOP&z+yKJ{dVH$?x$BDr@6U%~U}S zAR+m^=!rH@7cYb>+z&0`?uYUU;SYfO`XNwW{9t}*2`PRteqVS1;%|er7{3QRI1uFv z^CO}}$i*M+hVmtz4Nzz_0uDhS;eJH(L%0{**9H9-0z;wy2F2ZfL&T>%UC_kv#0YjF z{0JD443k!b!eyjn#a-p)q{ZcA;IiV1x1lcLP^he{tGtW?TwWGNq{0xs@CU!C{9s}t ze%^36kxV>!BVB?GQ7||$k{8O?(*;TNMWRsN{9soXq#yjREK$Fm{%vqW5o`SS4dI1` z`+6e${;p9f)FIUPf7(U$SG$hnzrh0NNJzqABqVagcKuU=sa*o4PCrd4zFL&pZ7aKqAOrOvFTsjzmcGz6J zoIf~wF!?w%0hQSL%QFmjdXWc{1qz*1?VJSwNsV{;#HrK@e!V&6R-8~mR6^zOw)CmY;6W~ zELSej?%oUa(7X)&s`%F0tNLcmI@yYDDG^2bmJ)jkz$dQR$j^!U*EXE^51tK>A1;&E zTAplGI9B>y9$pn`C%`IrH#y`c>e`@Wu>)sF45Oi=X_7+1+nfFc*M6G!@)O=v6r_U@ z{3CT#cMAF{+uHkPU(?b$faVM2w5#n1_l!I8oZ6i{13ZRBsz9~%?=Rg6{{DUm6VEQs z)_7fiId;x{@qDP}Gu^nl{bpxQ@`SIsN1G*~BzBJHz4Pp(U>Q?8eQA|DN;9VDc>n%t zo{f4CQ`gG-Np$ID>0lA{m{vJ;RWv;VJ!fM1{;|{P8L*6mIeYN_`OaMI@elj3+1lMd zYrjBm-KXocd z#iu*sLa}cd(K65&X<^(XRI{F+whK^*RwnlfG+M~8nCZMJBJir_o|#tP+KrQgw&>kE zzR7?<%|pt{*i{L1@{PdALloH@34*(N5-&<056Ldb>wQ$SMcsO9ohM?Ksi2OdP3t+9 zMv}b^_}Zk~>skG0VJFVBiY&`~{6Xt9rfGS`lTi1$L!>-JxYanJ^x)v)q9Cwue%(3H zgBhS$NJL9O}TJq1r$y&Aw;T?+a0!Y!2x!PDSy%;1!`}*aq52| zMcyh8j9eVt2rZkWo!MRTetZv+norsv<$n~@0TS4ek0>E5pRp|{x>B_R`(l1(e~4*@ zU-5`a!KodBarH~K)WOdSjHb2hrDCV0#Iq=i4ttb@?+Og@X?(IhWv}XTST+|iu#K0G zl-1!d^{5fSh-$i1aFB5hl`87)nO4Wxu3Oi#4GL_{2w&|62c+@~rWC~PB~_Q|(=|S6 zJX*)tfD9&!MGZgS8s!_2r8c|ia@LR%E*eh`hY0GW4ckw0@me`4zo|X#?df^ckHcLx zZE@aiPj{*NqqqU>3_sNMC-H5q#C-R)k<(_paD02C(k@b`S2H>}{Z^#fm8R zL4}38Dh?agc{+=UBdh>c3gn-XOv=9?=^I%a7DHU7Kwid9jWsn6c14qWdRL_TvLSnW zlP=BZ6T`c@qSH9p@3xvtPBb+8y!EZPM8Rw}CnU@xxa}jE4f^0_g{rD3w(%tGt8sRj zqyd^j3z_P2n6dGjni2!v`ZKpQc{v4^2NVJ{Oeo8r#w7}T8My6>HQ-FseB{kC2qfni z*bkO&HO+DjaJVrsOKBEj03Vs6d|3j)Xn^RhO|7P0gHB?H`4>nr%vGQy=A2S9nay>v zros8(;ekp7HG1ZK~^#oq;scqp=2oJz@I%wakZ*pUoW44=8ooXoR`mUBVzjvNGAY z!NlC&M8@P~7{u3E-_C<^Np+}&?A_kptOgJ{aHq_f=SwCH|%TyB3FJb%4)zy6~#hIE4;8^ZRPg#8+(if(-f@OUI5hV zQP|tAr)%T@VcuL+Pb}__08#O))$oN5j?(<0XiAG;UA)IFSi!!RE~?G@mWE2Ldqa59 zTz2E!tsL~HJz{@W*ey*9YCP764-jELjv-SV&)ZtM&LA7%p*WA&k5A&wdtlvN))4z9 z>GB$2L@s}Ep|N7Ug@2{yh|%%$4dpsjA(kb}fy^E$JwS-cSX5e= zM1PI(!Ie#Y4)x8&fe@H_&@e|ki${$=xr4%0>jgX(Iw1=oK{|EpeZ02?}S%*b~ zG<(I#Iy<3n_u63?_D=wU%A?44dhqpKJq8S=a$Pw(c!oV3Dy|%WA%DT~R%K!W@RX^j zha}_^o3l#2AZvaE{q)4acwFJ5k5g(As6?OF(V-L4;&=8e8T|a|s!PDVD_6FSo3AZK zG-^{~@r}C%%>6o2&!nA+lMByJK)k>V713wS4z4MTHC_ z=B|5EHn1y_^^T5Gm$a|WGV}$p3#Mp1;?}1I7KVJdpsFib_kyZLA$8LQzfT_PfZP-7 z`g`{*p%Yprdd?iv1KpvAURQwcIYhS%**@VW{XS~qYT|f-^Jco%e%a;UEHxFXqsxlg z*>SxA?boTT4=@4WSdKKoA1hLCaWT(llR6qX>G;{m)ye zL@1drNV8*%yePljv(QsgQY`QleCar4$rhA=DqQFfYWX(fm1+Zu#D$7V)Jd@Nc%-d! zfORlQiXr-?^_>BG&M$@)Gp?0^9(Xffh$tdky^91}OJ=a5&Bo)(y(1aIgjre&HLAd# zBCc!N+zuXRkx@uC9or5JmE}Mh8}FpDfxxP~I!!BjQOD2|YmJ-90NZT0 z$YJd_(=?hS%rxR2h zlG1tu(6NTGwpNqV=lZI*!I0s_JN@(LwDgj%ph2dor-r3*OrHLgBd%`MSZ{fPaFmQk zoR8F%an?Aj-M#&GV-ufeR^2PhAd4g{Y|Dz`%CfRXzwp%yV9v<#g_mlh#u|1=(Ne{; z*f-q**hcx_j}MjU&6{oSpTD#@7Vxw`evk{Uax_w1Z0@r_^}og~omyV7&IjowcP*b@ z&gd9@_3g9&x@@|>){m)#Z@DhIR=xZ9whr_;Z`UgWJu$&tv;y~o40R{n4=O3^c8j$q zK>YaMI~SLTRr5x%_*C_nN~|Z^=T&Jt56A}MBTIy&R}32*H3rzn6eVYaSDSBCM6toi zHPn(-*}pr^I^YK|Z$fUU_fzj0wJQyH?Y>a@!TdrQqH;3j_90~1XODsSXWXRcQ;o;x zp(22{7nX9{o(Oktn0x$q_O5U9``XAO%X4Gi{l)OnN~{`mGNFUtIEKYG*ntY4=Ty6~ zvI3%3%B(!aaRw{2U`q*R^Fqpy`R@4r_q$`cO|ybaoLb&emBmpE%?t#j&SnB`~4`I1G5>2PY+>A2|k6+ceDKpEZ)YxM&okv)2^q+2=pju9|} zXDVw^cY;a3Z~<-aFT@}(ILOO$?3%N}l%b7`z)ZoW^3O`(#h=1#-iFC101941R|PA@ zhN0wgf(A+BSGoyl!4hB~#~RO|SW$FSj{fz1xsDa8Pg!Kxv@1W4NW)R%zL} zZ1=v(kBS5hP1UFi)uUYqLpEfL(rlwv@<0t*&feq7qX7Y3I)?J{AItb2+~^Tk{&%I^ zC7{zX?qLn~4R3x~(?huR-Ge?2$nAcxhXlosK|2{kk$#thQ-SBK8<6Fcw6$E_V6(XN zu`n&SpA?1r&sEnb3WYl#4@o{dc-tvJCbgP*|8&(X>@?l!4tH1BT9({uX1LYqDqn|< zr&`~yqvetEF92hG04XcU|1bQ03&MZK|B`|KQ2%cc^bbvvs3QLxNo1@~LHRohDRJfz K_mkgJl;mGVdCDUI literal 0 HcmV?d00001 diff --git a/apps/renderer/src/lottie/confetti.lottie b/apps/renderer/src/lottie/confetti.lottie new file mode 100644 index 0000000000000000000000000000000000000000..490ceaa5b58ef6dc531b5323320a76f8c0a016b0 GIT binary patch literal 15349 zcmbWe18`+s7ls*I9oy*GNhclKb~?6g+qP}nwr$%+$C-40|Ns3nRWnmlb8p?c`|P#W z-Uqkpea?ICmJtUAK?eBqf_7(CebyRd1_1;B`167N>a)huMyPU2u<|AikX>pSPk^)n5Y>T=;^4L z=$V+P+1LzpsSW52S%0w7v*{WzGJcino7fuY{V646|Jo5dYXgI?;;)vqxsHpZmA=8( zNS0Q%7CPo%x#m_@)`aYaI_7o;fA`YrPtv~~##Ud)`0tj9rM-czg^Ari$4KX);UV*% z(*^PObdf6eZ}hMM0ATk40Wf`?uKyhZ?f;iO|9e(1GSuVNL}oKTLvyQEV0K}~Go0R^ z+iaJ=?N!r~vLLTs;6}C28s`=~9EF5DUwLkhQy_v2lPg$X z+5Gmp@@yVk8fa}--*|ts|IOd1y5aG5aS8tM(yImQ^*OWw{}9;a1?k1j!Lj@fuhqrn z`Re++Pufd;!{g=pbuaGYedzIVNbCK|s%!4_^m1wH{$7jQ{r&MtK>2fjh5NGeI12u8 zp8NT3Y5@n?zLH1aY*d;JdEcOxCaiYl!>ZvKOZrykbz~y+^Q_gOp)GTo@9E0Q>y){8 z8PC2%*7M!4>l1F}1ypAwt8DTZ5l;hG==WX|yz~_-M&Ij2-`rl+X7`7P3qRA>p~#|r zWDWmXQUwDyA$!A0J-6vfi(h!G{FvC#dbVkLjxgF9;%?dV+PtB|Nt(_-nZ{RkigHb3 z{hY2~|CEmqkiyF~t|RBq8d;gYo_yU0AQ8>p?-U~<|1BEJ8k26Qx8HAa8KcKhLvx`; zZ5!@u9puGEF8n-8VyIzts@S<1PhQr4BDN$NS7~20V%qi+(dk)wZ!AY_qDd^8z{DYY zttmI}qFF#CV6}sVY=x$gHkaX$VmQKHrsT3&K3Bi4l?zVF4_i4#y%wj4==qy8@NA8H zEw0|lh#F4oE!O+>*e3@|O|Es*_+$RqicB!>%a5k}9^uTn zYISx$@TO4RG0wel>C-!_vc)X>$`p2c9MIo$(!W((XiD`Rw#vtd4-P%lDkzbMJZdd5 z-w%CiCzS@+rOi4XquTI1Kdw*C@*r4uKCbXO-*0IGa;MY`K2Nwm54JYnr-r=TUvKX( zg<+33-rKyqUT&+lE}4!SZP9JfS6a!L0?p;a4$~b*ukclMk(GoL&f<#*e+DTLKIOmXZ_q0LQD*1f& zxva(8#^v#Rw6_EJ_Bt1|<@x*sAGj@jF?cOmR(1y~YA3)>tL&0kQTD6!l87%J_s!ow zE%)TwiI@X_VE)yQB2i&cSsivG$#!FfjC7rR*Zd=@2)@hn{dsKesEwPT zhvt3lDoShX^IvNCh^K?Wj>MU7;PIKX0B;k@K41wqUD!`Awyn1s1b9P$l;f=g8d zF;kTR_NEhP%=}q7jeSE5)kYCj1mb)4&=ZGUjw%`GY$2J1-ZA9hXaLoOZ?}ir%Tit; zf2uWWBcT=>Z$}NA52ePv6kJ5b!*n9xt6msRafF?)GGi;BaujT3eCIvcsvqM!OF!nY zo0+zfyBcZ_TNps@)-2)h%=aL0*674O|CKXsbWW#5ieST+4~pf~W4FWS#o2pBZ_o`@ z&^z6ENh&|Y00}Gyi&~ayhGSa4Vwlyj?9LE_Yh9s@egGXM)x)|YAu-PxDi9NZnH07|PX)0i0EX~y{#$OSt z)$Q6N z;i*e*Zaa>qaY=Ht5Cg^4co6Nf4ux?_8cc!{FGT`!Z9aLGi@6y*`8a=vP{(XKpKZTj!G$itqj z5b2j;+sy&6zeUeq&AacZ;9jI$CwrqVQy#{s=P6I|QPf8oS~)J)M!Ruebxt^b|4Rn? zU-E&`f0Lo%oG786eJ45Uwx{}!-1T{{+%Cucc#*OmYDheMb}bDE@E%5FpFV%GK)^=1Y18sAK4 zSizy##m%n9K^8T|MSls!)dx!mk@uxp~b28gBdSv^7DM$SP`eNP&WnHOlKhg`ysZ>Bq~fRnz*p7cbte@%(jid%Y~h;~vF zo=R4tqvpkGVb!TuMbnoIPrboUfp7DrI`@iv7fvjNH6JVM2baS!R7B}CoGgV=%cz@f+)Kc% z4f~jHC0r@Ow8^5-OZ3`_r?^9Js&zylA$f`7?n2gXz$P{lC?a(l%R!)tk^w$8bv zmfteu>~h3$#-RfRz_-8N+zm-b`GJ4K{+>o-Lk&4d?{U5>hI5~wpxPp?2OSh*LH~|Q z2prEPd!=G5-X`QOc4BXWPTc-I9{?FIT8tYZmMA6i_nd=VQD3~u=VMAxR>{X!^;ynJbCgG5MZLgldf+7;Q zxSUDcwaUJztgVnMEqF%Uh1-i8$jP&wv4zGcHA8lG!@9$;%p?rF%;(}{O5-E}(2Z}e z4wFu-o)0xP5Y&5TmRp8hfek$Q(W*$Z+`N=G#90sa8Ea15%P`9nu<8AnvrSwasug$b zY9oZfRZjdd+5O0H`6}s}5E{2-_Vs6t#5hecx~hfmsZ@}=^NS9xZKQF+)S<`*>yKqp zkRSyh6oMYZK&6zJ19T;}4bgMpSGFD20pjlRgcfSksVnlTK8*u`CASWm$)X8*^%UP+ zCeUr&LMS08;;E*h@7jJHrRgfpy3<8$Yt)sBp_5zYL>dGpL=#B%$=FT$-&HJ(JM5C3 zIp_-gQsP5G>V`0bcMf-)W0okmIK}&MSWU6mk5g$Yq+!ZpL^$E~e0%-+TGi$5>^z@M zGIu-xtp*dT`^bm5*C-;g-6lsGqkYpRQePlUIQ=b)-*=GNg1On)CDrN5NQDRrX?=u7 zW1-}pXGRW=^wnHy8Mj_!V(A=!V2j11km5X4Na6gLEx#Pjlv$qlAQQ^gU;xh6E4Y!G zSJ1vbL`c&#qKnI*aCl!6dfbC;Zh$cy(A0a8D8^asoU+1l6l999w3rc7Kj+KiN|+*bdIN|@vy{OF0h!E$uIfpCU%%x z(^nEq_%n+nL*6c=i4$b!YM9scr${{%|c8QB5}Ll zqd?DY`{rIFpbXz0cTR4U)etfU^D-;e7~Xkx^L(s6H(5U|?ocjIx7w(A;D?x<$D4rA z38;U%T1m^X8vYzgVdI&Ji5Qj@V+YX4?uKlxnic8skTXxEZmlf|4{wHp7pTD-s(+0+ zx6rK5T_O4=NFZV15cO?dA73UWmx;g07Ff^NPqpN1EC2DEZ9QqNbeO7IkqhXivC~6K zn=rpV!{lf!)oA+&()m2K7gkUNyDbsmoG?s9OksZDG||+#xbj<92iY%CoMR^|F?TOq zr<1mml{QcFQl+5E*4 zrK;2J-n=H@yb_wtHt=V;O;*x-zR#5&ZXkGI>s8{(H3PQQyla*d`@lvnf*&s@V@pFp zAx5Ynlsd{I15;3PKPhEUGkPeEU9cEHgUa9rNmbFNKc^ON0IS&LaK<4y6bcHN8yET2 z!Oo+o9jlcK4*QQyg_@`p7_Do%??Rm(7Q4%z>ZyF|OkFxE1nEZDefE~Z^1BLt?JwtH zb-A0nU@7`1oz^5RfE`#Mf77h*325lCm`C_(7&P!MP~$K${)eip&)uQNv}eH37Qr@v z_!;&7a2TYqpXEeO3jHZ*V$ahm0Bz8JdC5EbpH?-?F)C#$#(!YT8n`XMpxW4P%oKRH z%~IzNW%aIV^L`t`+jv^-cDJGaXsNbZ~|)U)+u`T1t4S|zu2zW2q%0wk+N=U4%|;kV$j&S z+QVk3mKkrz@l+?>J_P>B(`UP4hyQP0`x!YC{D*}5>`=m8ruy{1$y_}DOMV;wJ7~;7 z`_TsDzsZzS|0JtVqG4Yuq27XK*c*O<*3|PD=zF&CBnsl5)11hKQ4%I8?Z-~L>^0Ir zd|a30(UqMTR)PC1k~HRmLt}6PCCeeh(z2`Ktjlvc%3;!CiTaM!dYPmD>_n5P;uEY~ zUTk~RP}!irC^JRu&-bJG8^hQnc+OYPeH$rtK7>8r;zV@8U7UWk2I2szeZ5qPD~$@(G?kmF`c8%cdMW zDo`K)X#BuYE0-?x=U?G>)dz0)EBA9{8d>ds<-Sz&;sxb&2EMt^WwRh7ODFC zA|T3Hz58XJ_#++H?e;EJ) z`+Fjd4s}Q$y~TO2*uz}{vTDni7IYA#8T|!nE>Jw{7Xv7Ww=uYj_1K@F?YDg={s@H? zDZmLHj1d@mJz+1I(}61UdL8eZihr|8dflRN>*D7Tpt|UyJlKLv+V;u#_1(TF{=5;_ zON{el<7Ib|d02)cHYR6ajYvSQy6ab8?;KFj0D@7Jh4RkO)K&jORnSVL=JVqd$kxO5 z!0C!G3L_3^o$4L^)L6LHr2G9Cih_79;pOlf`%xSg_fs;fYUggBWtKr#U=B}kGzOv^ z7ca>TvDW<;1CVhiLno7eF#y7>(H{n|Q;G=pd2(e1gA|ik;|U!&3P>jD5)*E-6pyvW zB2QFbtr`i&=dsWzYBQ^KoX-`J&9vw`jpvaO^OsWyq{?p1l{Js0P=;pnxTaZxUTOqk z(ectAnMqBNQ}rnwaR18y%n5o`6z|UeX9hU=F9TGE{>uPi20mX5!1=`hxrlcaJ>w4P zmZuK7kLv$r0Q+##Ip*^GKMb(^#Q-4K|1S)X3LUH4$ov1u02d6+#w#gb43JD13jc=z zY;+~01;yEt&+BM)jHU^hwd$Vz+}E;FN~}x zGnHHbq&-?yDJ@FpqA<=+^kxmh6bk`hE}LwOQUpdBq*)8e^;<@<(y~Gq>Kv72H9SM9 zM%^8Sde2>q?g$KpL1}9#cE*Ili$883XTm~*!rk^Y?g+}3EQOpjTcZutR1}=PU;T*wW)Q+f3!+n0DYf$RHe)G!C$L1iHG!q* z2KIeY02t9wgN3R=f+|hAy@6@lWP!}rB{!#scE@U5c_r7Y=-az4_Ht~OySp>Ky}H7O z&F|~&)){-^##m?QX}t6CKQ>ot!WI_?=ZBbj?sD@2qpP|)!1S{5@mkmKCcs8;Xs3s( z4W;a$15BYqbzg=b1TXF97m}sD<;OpS!N0TD60nJhf*0690f{(i6~y@3iu2XcBkr1V zAoP1;&s~DoHa$;68N!29_am{S`KB@e6!VBvP=<{;fI0_thZvf8%3)W(Pt2PoE}Ce5 z%dlj9=xJM;0Fy7)M@v)?T=foh7@YrxEt=e^TO7eeLgtU_VyN7@`*}gVBlg16<;J+v zcGoPtH8HyRpvPFxZa>hNcr!&*M-Jp9P65%W5rV~H!~2B+9YhmHDi@R$;Tu`6hi{t> zpZz-JsBl*aAs!6fVr7F=o=p)h+51@X-Y6KWZs-=y9y@8uuzom&UU}F6ld7GMlHj2= z8gdh+htM#5KOr=4dn4Rb&^jXAFww@HEY^vh=(YnhXk8-c6N%;;w^B#YCK*EC{_%K_ zrpOVMdn>)evXJr}rLynY{Lm(ES@fadl##IWBH zjmNy-YX;yRL+8@bH71T5A56e#zBy|?6mDWBqhuutS}WP+G&Mkws^VI|F~oFpizf`% z2(x<5s1V!rP^6yr8_SatqNg3?5(Ld@9ZRThB?LVRqQqS8|IX#Z< zfHbDxTee>%LLG(Iy-nT%F^9J8_u24 z@DEblGyqDuH2rmI>@kcH$D{x*&pK{sE*AH9j&Lc6SzuKi#?_~#p=;2yqf=Rv%rmvr zL-|dA%A61G=i}T?8^e}9OgjQzMwPDh+~wT@p06_omZv=N2^XeV8>c*7IcTOr29avA z+pOEBa2gf-V|3W6u4fv}ay&8Kh~g<_UX;1YRxqoT>GxmfZH&WKU&6j*@GeJK} zxQ`Ac-c_>B{FAIY*;dK_zhub&B_scvT%yMimaetA@gM7h>WFhI^S?d`?T__}^1U&a zi}8PF$z}XIix$mM(3?$VG(uMzpDB0UJRRf>{86}XhJwJz$VTDZZ?=MPInw74vhdSZ zwf;~Pth*#L^A?JYcI-(gJF&C*vTN2$MMl1mLv?0~H!v635xR*lm!md+6wt_x*+PZE*x~O!*QvlZ2ZD8D}|a`crcZ< zZ^rH3V*(|4WKugSzK~&5XoSd_-RfhI!Icw4P_W>;li=IW9z>4nIA~CsV%@?#Z5Ff61DBMWk(4OU z7GG0Qg-)Clts{4vz2CTJq+`nNOBZG5OVvma2n;{@M#+kaGxz;6EA3u)!OZ|E3w+|1 zd0$3@$jTftl_^(%ZXPT_5aW{@eUPCip}&cHCPX@JB<^pq$Wc|*YsJCxIA6rPfeA01(0Qr66j3Nt{a6=6n?zq^if%qV zy5HT5)-EG^#5E)NIWb|nAB3)VH4i&)z#f*;r0oS9j=4OPc_*+eT{bCoB1Pm*tCQpH zH%NZ-i?Nkp+xe?vB}wd${Q$r39)i_Z!MjS2*%AKeY)3nU*5o zU#c}u>v*{qA~N4_EOKR0F3lN^~^w2?6q{7 zQnHtVz3rg`>q-_CaIS4DJqlb$Px5?)Mj@Q-igV(hr0Y)2f2%Od=$zL^d}j}qym@>G z)Y&h?cF=3o1T-V4ET5(|gYh<8Qd+Ukx}cg|Fep> z4^}?Qp3*{U59=i(1dMpN)m+6iMTI5H*vzDRu2dT2&OdtUF9S4uI$_Sx4*F0(j|~NZ z12qNY{L27Fvb)q?0irIhZ&9?;pKmXo@?k4@nYdmLU>aVysS|Kz&9fB%{6VMJ*kL zV6I60InGHKVMTsQENwgt+EFg=y=XEqr#!EKpB`Xl2kkI#D!>N&sfB|{`VRQw-j%~) z{H`9QzQ^Jh9Yy7vhnn4w070;l_qBK)gx0Mi)X>=wP%!P2LK`rQ2vzYe0vgb@xjF{A zhbhc7@({TZwXDW2hpxx)(9hY2!Wa4ea!FO zK>C!xoFW{nzF+3xFCiyALgU2jGq&k-e#&mf-Lo9jXoXIY?Pu^D+&Lg|vb$Uz16vFU zUA9ldtW^$zS_i@7DE8{T%zcXTSnDNI9myIE`f|i<$6yGEN=zuPF;cBm z0X}RN?!i&@z_T>?>mW@#)}>4Io}-KL&^I06G2`e#4BLQS^%l65mPrvp!z3#$9A37N zf~QpnI#1KgGzGE>H)jA~&6(!+>vheHlwTxLpJ&Xkn+|{Cx}UeBnSN_TLM9%1>j z0?TY>cM^JjeYk5*R&SN4ZPydPsJ2cD6ZPpYit z(w|q?iCv)H)`%!NaIe3)Aao%Vn#;VdyrVbS5;Nd`;QNLw^&+iC4|flXPjU!crDzy+ zRMOB3oo9q{-k{>Ps0}GX$Fa?rB-K>F{mi(qMGn9a(EshqM(5LaKc`NCc2d-z%HhQU zT!|R|dKSzV(ugUEntJ2Elg)GtM|R^;FZZ*9G&|wil&Ag{dDBCb(=GmB2yO8O?lq`$ z69e2YPejIg*G0*jro<@dvcCiyyUUcZ%q?-bsTq#3uK3D#r}MdRdhiq zkyVz&Z0v;i;-IOYVOacvo>%R7N)f$f}Av`H+-iy2;a!{dh^Q425bWMB^I0u zod78JnKuE0=!|=k_Enhy7{BE+Bf+d%BkoOx$UDr8BfZE#1Wtx|^NW`>`5fcEj5~cm zyijqEu=;bcZku)2z^NH#CmnLj$Z4*4oym}3SNmkJboT>{0A7Nsfsiq3M+)Dd&F_et zix!1?cRGglYofbLBBUNs4;WJ}P}0ac`X>X{`?_EPl#}{XpjlMMS-z2NQys~B>(RH- ziTdV*-0=#>!hTxjj+ID_0Yts$Lj{3cLb1RxjTFTKZ3kXq;E!Q+rsFj=*Qp^i7ZcG4 zXELrE!Oo$~QdzFJ#LqN*g zrSJn;lfUh5%mPSM1F>n3iZVI-l}@)@dk#f9ltN9gn5<2X=}RwZl0LoPIgM@}6Oe}p)Ib1}HG<@geD0Hn1iN%xwGm3IMKC66dN z%G)?>XyaV`9-ZB@Sn_kc)=B~Os~y*=pZ7Sn>Ht&oQsacZDI&wwFN}>&sA25w(J;U9 zjsjbP=x4V<#(YpOYT0gKeGXM)AtbQQ=OLa$ewrFa;1ubd7eC)|6?*>5wl1T@p;clb z4L3pJ1GmVKKpr`E@#9^QQIR2SS$Hi-V_aD!x-ntI#Nx0he2U|}Z#{=dcib?`9NBao z)5sbM`?-X)`Gnv=X~MBFjUntB3(ejWd43b+Qy$eR&{Mt>RHa1Pb=v8yz%0PnKxBS1 zpx~=uOfoSSsH*@nMKTCcRk3Gs- z67X-m>$M0Fo;y9|V89}2iP$ zAmO%hSg`Jn-QkZAQbE&TCqfiW?*g*pp#5gpMiF{$6PnNtNGj5yN^DY8mtG1;z*jCn z1c}$$(g~j^YRPXC@TXk;qD^FRXMflY<)f>e*ifVQnMc~jVZsJHN0s%c-Rxnb<@o{> zHKPI?r)X9nAElxC7WiCui~hu}xr?8cErDAxlVvO{Rbf1a5Do zKw&;IKtZ51A1UfwI4*f_<%&u!h@4uI~DvSrmz?V_Y;D$mZxN}c+Mx-rD`uobG1h{b-N)FVBJW<_&UT$w?2}3bvzz~K$K1B zn)6$!r$WK9*&;Nrd`HoumfscoSZRkQB^FgNx7 zgdIw^$JCx2C3P?}a7jw57>mDKb3Nm(?;JBt2nNeMLTES1fMIi3hd>k^ID5l&BU2H3 z4p^WM4hRQ{c7^P=0MHo==|XTbHO66Y-lB>{(3FII?JN6|`=F3Mj(~OVay&yI@yo}Q zb=UywY|JPd7pEU~$vu1PDsH3Op>;;&R8WPM=Uey4i-VMWr_rsZO)8(l)Q=+arC8tE zD}JXAi_;&r)=zJPx7)0D+@fqKEsV#aqap~y#@*N1)ngb4Y6?xt{189Oj%Fcr6uOj! zA*#qp_6P#@aI&#c;)?@?Ie6IUfA?W$!+aN^W#U4+Xf_@iGamAplompaY1CoYm}pMV z3itFxv>iO3lxA1eb3Gyh8Ny-XCf}TXhD>H$#&5}j@n0~3lBqTw!MZOK!SG{FAYTF0 z;9s}T-T?>oO-b-v!B=NkSn2ar0i1-+hj2V4zvY-=Qsyr;bV*GL1*QvEia@X9TO`lO zfw*FZ!J&d%UvA&5Pf@-y8U0!<}N4`F-J`cVERESw>c1IC7o%X9i)nHVGaQ=>?7n;x4v|e}L57tTjS5`51<>p)g$Hiv&2h_PXaU zqE9>V-E)j0RY*rQ&=>64JLhBH2o-VW*r z6pX15?(qVo(RgK+2=94%5x*m!^$EPqqdwcZ0R^jZehGsKnDY3!!KH#uR!qHcH<|Ba z9X#e!IDO;jp;Ms1p*|zjPT>W%HF3Pv`ag>Ri&(Z^uj3#YjNENtOUoycsns!h9j^JS zG7&?b05ht|#qiT%m`5if_PpdxA&)t_XXl)QBdqO6UVK7uh4_tmNCT0#j|;M3Df+^_ zpPe^ziOtKANEM$qIjquZ-$mMYz}Uk1R+;5k!`!8Ge|Znf910`A;QJqZze>M_g}P_` zn5&Yz+dzV-xiJvw3dwM=$*-x=!{pR7jt|*iIU&uRBhCEyF<~?MAY@YFFx+)Agr8_A zFHKI4!=cXr?|1iH-t%ntD?5;fM0Hk)NE_s=QAX)QzUL*0zO2e;3cOGgJ?qL1Py-_K zGjj*#hhln_7Gx%w%auy3%xSYTwk&?^Il6$>1a2-j$|Do;<9Et@H#%n$0$neLS=`rj zdlkQ3nJuEOs-c|L7(TS193eSrSx7DL{GlWRD$yBIYpNfo#pMD99Jn%Gx-a0o1UCB^ zf~<|5?O~q3?)L=m_vq+6!uvZ~rLYwRCKtk>CAe86rf%2yPYPzT1W#JLKnl*I*Mx+WCd0>d{yI z%!XnykGAoDhg}7?wkK95fbA}sw!+XV$K8d?T5`J`O~`Vis`*al(lgLQzUi&KQ>1AE zBy1#JoGEgJu2NZlNXQL>o*c*7UD8yvYa&Dq4)ekF(W}&JqdpTHx;30ExvDGbH=BYJSeeiu;g0`@kgcjI|L9s&ndV3WBz zeCKl#P=Gj1EHWK;5m)vwTI>z3mq01W4je!sEapN*+Rn1O4O2s-42%9$+b1 zp%*%jLw;Z3Vv^HLRG4RbuqXD{TxZcH3g6h2X=%Jqm%S;(_3>m5dh5I?WTAus6n$8& zKxIfcLqg&9$jy?8KRmz)+4}?W$@P4)N24i-0S^>V!=gWdhY`x>5O|}1x`+%h#AeR% z9pFrO#ioPX`t?`MilL42svw{ZSiKi=@UH;2h2?KPxRV_2mE0cjLG!~Ip@=jhQ@@Z1 zE8m@x)U~!zkBQ0;uxvCm-e6NYcewJQvQ3q0Hy;n(sC35hxXz@hcvD*D1R{;fF5CIg zaV#eLHQORJipB18!K+SfsAAz6eleF%UkZS9S!&fn^kZ!tOL(^gzF|vk>_oo?TZT`J zSFT^8zYW;Yg^=JhKPjAI<2^A!;`Fa-Y8N%_#sdqqa+3pL&M?S#V2?fCGs}GMn*0?d zW{2O=il?^xT{vZ+;56~ZgK>Q_Ez7g7$d|RyRbNkle@r3g6Eg!X;LIpBSlo(wcc|G$ zysu6=YwazD`7oFErhAOGOlf1O(dJSN~pjJ{L z=g-de5}&i1CxeJ5`BFFYm9>V(cXCWJE65e~_})I+8wZ8ZRFL%blJR||a%}1%4qq*G zQ9FJA7qtf9isDld2v1#u`K6NF74C0c2z;D!-zMtZVFUS!hhjlECI%5f zDLXvTb27cYO_-sAD|E!fFu?WK`Y&y1X2wYw$$%WTI_$Q7+@c9<3sE3BF<|Pb_`81n zWXUrbQ4#GFlyVtx;d45L61r=ouGF+P1-WTnZU|p&@cmuO<=bQh_kVRXcGhhfepgCj(C$oW zseq!eZ&vgR)5~+2r*f`I5>n_j^Jx!+2gVv}QOc`Jr!*S89B%6GBAZwkU^r$4&S8ct7kVyW?N>CaK9!53d2W=P@OD*@Uy zi)!^h_uu%s&qM-9W;T?8G$E_d#Sz8k4}av!#4a77U$cMq#x7AM4$%`2bPInY1j-y- zVHOm0!jI=38G-%*3K}aMLW} z@yyEPKFnwJQo%P(QG#$Jk`r7N>dXDHW*49G(Mw=TE%`eTmMUqVs1N?G^35DK`Y=E- zjPpHZE^sc>(kP>I0_ZxFA|gm$>x#i#q(-yMd>H=B5sD0B4T?Sn>Am?AX+{p|J1j&h zi1B*9c!CL^^ib+H{ynbFTW2_cO3o{o7@{WN&cMX9p$0d!FmkZ#!b9-RtJbppv8P~4 zv`ShK>Q!WTJ@LwIkhHK0muiM679tLV5`WdqeUEBE?GiLo2t5 zVEzIHZq)esb>1|v{`XC1ONzb9K%ql%$WV#lV8I;fL}H`P9NAC(_wc~T@ZZI0nfTD& zzceZAc*w_l*M?Ys>PJSU<}dHv8Xw)%b@0&VSC{PMjYZzKAdD#+BCa2|>{VA;n|gfisME#u`=F0){U zBB>)c9k?yVnhEg?xdFTHFr94D(<+>^q`>w?J36kKTFPJR0ab1ec+lq@lG z`5b9seLk+bu1;v7?k0BRnRL7~88$RZ;x%`6;TEcn!zQq%?vS)GSaZPM7!kJhy9`Tt zw9oJZRWprm#=8^~@wVz&!xBsjKH>XgTT*Sg<{^ePQ6h>aiU4Jy_j$9azk^7()(AM# z7R+d$`31%J115J|d2T5~%K{TW#f%2BVkB!YSIy1Znp^GfZEYb*nBJ>ccYE}t#!4^( zeUY(K1m1TO)>x@2b*9Qm73d~29g+y3y_(C#dCa>sbfs1^skR!fC4=)a;1Ox7e(zp0 zR4eUjRzzT7U<&?r#{D#_Tm;_F*4l#J5-O6OIyTC(dFxm-MIP~{ti_HYS7}(os{S`F z4Y{aTFOxnK1inC~bhvNxS(Z%^Sy}Zw7a^e5ZD2@g3?wC;x>6w_ZID_(v4~+?jU)Re zSHdGYwrgh>Eas#rp~=M)_5iVjy+-B|r-l}!389LGG0D)}RJ4yVSR_3l4zWGDxQNKW|pN>VNNV3yEhP8wJ`@_Z`s5dQ@6PiA#Uk zH~Oxoq?RlGHPgLE>ksF39!lJ=(1wVMenP(+E5Os$ghrQN7Pj*<8JI^otsQU1b$|!`)CgURz@3?bIhf@c(e8&avBM@U?E(oe zo?}FpY-Lm$xLC!`XKJRn_F79@MoZ?@yW%LEsM12W`dcB#x}>3PLCbPuFW%i1hZTNcsram}>$Dt* z8IUbf)NNi8hlaZZd#1?q4oqe{OfuDsD!+ZQ%g+(sD5t>lHm z)7-(-C&P^29$?gwUxH>DI0keYd{Lh!&dOZ@_BRU5=;E zF#Xh)wR6+5&(qYh*At4I!~h3$uUL=EMQSAD!M_obbOEp->U z*A;$fx~}rm`fE}g(61B@{l;d2v&+jv>t^{Mt5-9Q>DysNA=rWOym11!geBY~k+it! z)ztaU&b3xcT!bN(>o~uR+Pu~}ztgf+AO&sJI|yKO=@VO@G%BxIpbLl8UqGH6i)bAUm5M! cg53W { ] } export const AchievementModalContent: FC = () => { - const lottieRef: LottieRef = useRef(null) - useEffect(() => { - lottieRef.current?.setSpeed(2) - }, []) - const jotaiStore = useStore() const queryClient = useQueryClient() @@ -131,7 +127,13 @@ export const AchievementModalContent: FC = () => { return (
- +
{t("words.achievement")}
@@ -141,7 +143,7 @@ export const AchievementModalContent: FC = () => { components={{ power: ( - {t("words.power")} + {t("words.power")} ), diff --git a/apps/renderer/src/modules/feed-column/item.tsx b/apps/renderer/src/modules/feed-column/item.tsx index 92b391e21..3196d6c6f 100644 --- a/apps/renderer/src/modules/feed-column/item.tsx +++ b/apps/renderer/src/modules/feed-column/item.tsx @@ -68,6 +68,8 @@ const FeedItemImpl = ({ view, feedId, className, showUnreadCount = true }: FeedI }) if (!feed) return null + const isFeed = feed.type === "feed" || !feed.type + const isList = feed.type === "list" return ( <>
{ setIsContextMenuOpen(true) const nextItems = items.concat() - if (feed.type === "feed" && feed.errorAt && feed.errorMessage) { + if (isFeed && feed.errorAt && feed.errorMessage) { nextItems.push( { type: "separator", @@ -114,10 +116,10 @@ const FeedItemImpl = ({ view, feedId, className, showUnreadCount = true }: FeedI
- +
{getPreferredTitle(feed)}
- {feed.type === "feed" && } - {feed.type === "feed" && feed.errorAt && ( + {isFeed && } + {isFeed && feed.errorAt && ( @@ -162,7 +164,7 @@ const FeedItemImpl = ({ view, feedId, className, showUnreadCount = true }: FeedI )}
- +
) diff --git a/apps/renderer/src/pages/(external)/invitation.tsx b/apps/renderer/src/pages/(external)/invitation.tsx index f7833a06a..d27e48191 100644 --- a/apps/renderer/src/pages/(external)/invitation.tsx +++ b/apps/renderer/src/pages/(external)/invitation.tsx @@ -1,5 +1,8 @@ import { zodResolver } from "@hookform/resolvers/zod" -import { useEffect } from "react" +import type { DotLottie } from "@lottiefiles/dotlottie-react" +import { DotLottieReact } from "@lottiefiles/dotlottie-react" +import type { RefCallback } from "react" +import { useEffect, useState } from "react" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import { useNavigate } from "react-router-dom" @@ -19,8 +22,11 @@ import { import { Input } from "~/components/ui/input" import { SocialMediaLinks } from "~/constants/social" import { getFetchErrorMessage } from "~/lib/error-parser" +import confettiUrl from "~/lottie/confetti.lottie?url" import { useInvitationMutation } from "~/queries/invitations" +const absoluteConfettiUrl = new URL(confettiUrl, import.meta.url).href + const formSchema = z.object({ code: z.string().min(1), }) @@ -42,15 +48,39 @@ export function Component() { invitationMutation.mutate(values.code) } + const [showConfetti, setShowConfetti] = useState(false) + useEffect(() => { if (invitationMutation.isSuccess) { + setShowConfetti(true) + } + }, [invitationMutation.isSuccess]) + const [dotLottie, setDotLottie] = useState(null) + + useEffect(() => { + function onComplete() { navigate("/") } - }, [invitationMutation.isSuccess, navigate]) + + if (dotLottie) { + dotLottie.addEventListener("complete", onComplete) + } + + return () => { + if (dotLottie) { + dotLottie.removeEventListener("complete", onComplete) + } + } + }, [dotLottie, navigate]) + + const dotLottieRefCallback: RefCallback = (dotLottie) => { + setDotLottie(dotLottie) + } return (
+
)} /> -
+
+ {showConfetti && ( + + )}
From 0e4640fe3c6f43e25e9354d444500ae32257f355 Mon Sep 17 00:00:00 2001 From: Innei Date: Sun, 22 Sep 2024 11:39:21 +0800 Subject: [PATCH 28/47] chore(release): release v0.0.1-alpha.14 --- CHANGELOG.md | 2477 ++++++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 1296 insertions(+), 1183 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3e94e3c9..a61a8926a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,1218 +1,1331 @@ # CHANGELOG -## [0.0.1-alpha.13](https://github.com/RSSNext/follow/compare/v0.0.1-alpha.3...v0.0.1-alpha.13) (2024-09-16) +## [0.0.1-alpha.14](https://github.com/RSSNext/follow/compare/v0.0.1-alpha.3...v0.0.1-alpha.14) (2024-09-22) + ### Bug Fixes -- [@unixzii](https://github.com/unixzii) feature request ([b41a78d](https://github.com/RSSNext/follow/commit/b41a78d5c66d5846d1fec33cfa29b9864ddfe20f)) -- `` show fallback ([ca0fd18](https://github.com/RSSNext/follow/commit/ca0fd1802c2f48e4d2a5697f71988df00096fd89)) -- `i18nProvider` condition ([0f654b9](https://github.com/RSSNext/follow/commit/0f654b9e61233319787726d3fa3557307efa1b0c)) -- `IconButton` props ([f33598b](https://github.com/RSSNext/follow/commit/f33598bb9acf870f9c07475e75b4ed5e78ed6a85)) -- `scrollHideDelay` for scroll bar ([5300803](https://github.com/RSSNext/follow/commit/5300803d395daa485ae8ac04e7eaf2f405c7beb4)) -- accent color ([918d85a](https://github.com/RSSNext/follow/commit/918d85a591cdfc8c6c12261004a6a463516eaf5c)) -- accept import opml ([39ecc82](https://github.com/RSSNext/follow/commit/39ecc82a8ceecd77139ffccb31a33904082a3d1b)) -- add app version on posthog ([9933463](https://github.com/RSSNext/follow/commit/99334639e28b2a2a17b9c3fdd64f0d6d37bdd181)) -- 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)) -- add download app fab ([0f8309b](https://github.com/RSSNext/follow/commit/0f8309b2031d53a17eb74ed36f2a0f504c54c431)) -- add environment in error report issue template ([232c24d](https://github.com/RSSNext/follow/commit/232c24de3dbc135f4064c17680fbe6e429c92697)) -- add feed should validate feed id first ([767710d](https://github.com/RSSNext/follow/commit/767710deda41af1842179ef03f9b6b1b79208f9e)) -- add feed temp store use nonce ([6e36232](https://github.com/RSSNext/follow/commit/6e36232b41f1b6d877caf74e1ad7be50da716381)) -- add feed when site url not match ([1a2190c](https://github.com/RSSNext/follow/commit/1a2190c1aa834a33932788e65269a1128fd3a7e2)) -- add language selector loading lock map ([2d14c1e](https://github.com/RSSNext/follow/commit/2d14c1e5b5ad086b3556dd9a8862a6ce00368c4d)) -- add link ([d9168c0](https://github.com/RSSNext/follow/commit/d9168c01b3f2a16fbfeadb722173e819dd3feb80)) -- 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 show readability tip condition ([208e404](https://github.com/RSSNext/follow/commit/208e4040cea5d3485acf5750e7120fb5f715e30f)) -- add some polyfills for old browser, fixed [#236](https://github.com/RSSNext/follow/issues/236) ([b1fbfbd](https://github.com/RSSNext/follow/commit/b1fbfbd7e38a6a10430f7ed2d4b0644c2d5bbf22)) -- adjust card style ([bec6d1a](https://github.com/RSSNext/follow/commit/bec6d1a259560261d06c9ed1f4ac56549f1eaae7)) -- adjust code block padding ([3a164e6](https://github.com/RSSNext/follow/commit/3a164e6aa893b9c6be10b87ac981c2a4ccca4bee)) -- adjust responsive breakpoint for entry content ([d9235f4](https://github.com/RSSNext/follow/commit/d9235f4e68b71c143b2c404c925a3602378a3cda)) -- after webview fullscreen force repaint ([4187b52](https://github.com/RSSNext/follow/commit/4187b52ae213d9b00f70aac4a6c0dacbb2339e50)) -- 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 logout on login page ([#244](https://github.com/RSSNext/follow/issues/244)) ([8b679d1](https://github.com/RSSNext/follow/commit/8b679d1abdb7db2515bd1acb013adb7d1870312f)) -- allow toggle switch by clicking label ([#185](https://github.com/RSSNext/follow/issues/185)) ([5d98eb4](https://github.com/RSSNext/follow/commit/5d98eb42303e4ba6bbe0bfd37d8a17b31f66658a)) -- alpha typo ([961a75c](https://github.com/RSSNext/follow/commit/961a75cd46227c7bb11bae3743b970b2884ccc44)) -- audio player async logic and auto pause logic ([ba40b44](https://github.com/RSSNext/follow/commit/ba40b44ce91bb8acd118b9c6d846ed8d5b9b022c)) -- 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 setting ([55b7868](https://github.com/RSSNext/follow/commit/55b7868f2e2aa3c01468e1268e3436485491ee1a)) -- border color in dark mode ([472fbb2](https://github.com/RSSNext/follow/commit/472fbb2a6b41d9953bbfbda5452558621f71c8d5)) -- button align ([456b6f2](https://github.com/RSSNext/follow/commit/456b6f2c0c41734d771b9677971430178c0cd20a)) -- button styles, fixed [#202](https://github.com/RSSNext/follow/issues/202) ([6649577](https://github.com/RSSNext/follow/commit/66495777798cb4775ccc440a0c6354dcebe6cd9e)) -- calc toc scroller range when entry content changed ([66035fe](https://github.com/RSSNext/follow/commit/66035fea72e3ce0c6fbcd8380fbdef612e052cb4)) -- can use under window blur ([9b2656e](https://github.com/RSSNext/follow/commit/9b2656ec53f3865378b7f2392d59a6828b31149c)) -- category in route should encodeURLComponent ([d5b79cb](https://github.com/RSSNext/follow/commit/d5b79cba8a5d6d8fe18efee5d58da5610fc3ce68)) -- check undefined view ([71712f4](https://github.com/RSSNext/follow/commit/71712f464d2ab3043b602d4d2c311e4cc851e046)) -- ci and tootip portal ([3729917](https://github.com/RSSNext/follow/commit/37299173c8fcaf88d44b1a54baf7ddc03aa20ca6)) -- 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)) -- clean local async data ([ae26dd7](https://github.com/RSSNext/follow/commit/ae26dd7763fe32990086e76fa896ec09dec170cd)) -- config `__dirname` resolve ([f3f3cac](https://github.com/RSSNext/follow/commit/f3f3cac2b4ff0865f863b848397f0e27caa435b3)) -- 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)) -- corner player tooltip bg color ([16b91f9](https://github.com/RSSNext/follow/commit/16b91f9a7d3267f34f525c2e820efff6e1cbc049)) -- correct follower word ([#438](https://github.com/RSSNext/follow/issues/438)) ([e31e343](https://github.com/RSSNext/follow/commit/e31e3433dfdafcab2276f2794065af81ca1f75fe)) -- custom modal ([8d03308](https://github.com/RSSNext/follow/commit/8d03308091a57745489bb48617b7e11134bb89c3)) -- daily report animation ([ff16272](https://github.com/RSSNext/follow/commit/ff162722a927d3708f3d857626e6412ae35d3880)) -- daily report link title ([0a58159](https://github.com/RSSNext/follow/commit/0a58159acd4fbc12e970f745f27e6488904a99d9)) -- dark mode entry content color in electron ([06073d5](https://github.com/RSSNext/follow/commit/06073d53bc6e69867b3e6102c755e6bd1f9be9bf)) -- date item layout animation ([e2fec9c](https://github.com/RSSNext/follow/commit/e2fec9c250b9641a645d0f24ec3f038a5b630cfd)) -- **db:** remove remaining data if unfollow feed ([1edf560](https://github.com/RSSNext/follow/commit/1edf5605e9621219e6cdfc732f12e6464113f765)) -- debug proxy inject env ([6b80cdc](https://github.com/RSSNext/follow/commit/6b80cdc6e7141913643f77a0b9a089333b86278d)) -- deeplink navigate ([00d41ce](https://github.com/RSSNext/follow/commit/00d41cee5632dab86f7a93b1bc965cb3a896417a)) -- default extra window size ([5688eff](https://github.com/RSSNext/follow/commit/5688eff6a70ab9abc3e94d9dce861726df8d9123)) -- disable window blur material lower than windows 11 ([3735390](https://github.com/RSSNext/follow/commit/3735390af80671a4bf954f70062f3838206b8890)) -- 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)) -- 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)) -- 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)) -- 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)) -- electron exit webview fullscreen sidebar color ([bc7914f](https://github.com/RSSNext/follow/commit/bc7914f803939897d817080972e5307cf58f8caf)) -- electron external window size option ([399d5d7](https://github.com/RSSNext/follow/commit/399d5d7a2cda5c7a7f9ce91ae9b9125f9ece7c54)) -- electron search ([63bea18](https://github.com/RSSNext/follow/commit/63bea180f545e2f64cdc7e379f807333fee0ded6)) -- electron title bar drag-region ([29ab323](https://github.com/RSSNext/follow/commit/29ab32344fafda613b0c9d49b587786eaa40b00a)) -- electron window frame and `backgroundMaterial` ([e18ec75](https://github.com/RSSNext/follow/commit/e18ec754a05231fb82a7cbdb80632d79a6232872)) -- electron window type ([909d692](https://github.com/RSSNext/follow/commit/909d6929da5bd3930a6e1d8aa3342c46d00e5c7d)) -- 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)) -- entries hasNext ([4cb5678](https://github.com/RSSNext/follow/commit/4cb56784acfb46516a4320f0088c294eafb32fcf)) -- entry bar action ([ba23dcf](https://github.com/RSSNext/follow/commit/ba23dcf46ff7569562d0a786ab85d46093b8abe8)) -- entry column padding top and filter unread/read in tweet view ([d181771](https://github.com/RSSNext/follow/commit/d181771a7bf314cdb30f2fdd76294c5cded524ab)) -- entry item overlay flash ([687e039](https://github.com/RSSNext/follow/commit/687e039ca2ad43eed2b4b48a29df96595dcdbc0f)) -- 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)) -- 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-page:** feed list overlay style ([1dcffc6](https://github.com/RSSNext/follow/commit/1dcffc60d26596065bc024653d69a109a1941578)) -- extract constants ([f48b589](https://github.com/RSSNext/follow/commit/f48b58941344a4a5e547a402e02f56bb5f9f5abf)) -- 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)) -- feed column height ([0d4c70d](https://github.com/RSSNext/follow/commit/0d4c70d06eda97316b360740b9aa8ef08e9539c3)) -- feed column layout ([8a31463](https://github.com/RSSNext/follow/commit/8a31463e4ef82811e0f7d5fd40cb3281202a24e3)) -- feed column resize perf ([a09f55a](https://github.com/RSSNext/follow/commit/a09f55af080714d0b0022983421e942d14ceb562)) -- feed column vertical align ([63139f2](https://github.com/RSSNext/follow/commit/63139f25b2b771480de4c04d91967067897c94fc)) -- feed icon in player cover ([c6a8613](https://github.com/RSSNext/follow/commit/c6a8613b29cec24bb61eec2196f1827ae9a759fa)) -- feed icon style ([3f04f14](https://github.com/RSSNext/follow/commit/3f04f148f5a34d47da8dab1a4fc4b00f9a2fadba)) -- feed icon style ([03c202e](https://github.com/RSSNext/follow/commit/03c202eb568c684e9645003b65f48cad6099071b)) -- feed list can switch view, fix [#278](https://github.com/RSSNext/follow/issues/278) ([76a33b6](https://github.com/RSSNext/follow/commit/76a33b6f905bac61f6390b01b13c6a43b94f535f)) -- feed list overflow ([4941cf7](https://github.com/RSSNext/follow/commit/4941cf7b93a751f585ab5032974fe6eb191f7968)) -- **feed-icon:** re-render loop ([b6f78bb](https://github.com/RSSNext/follow/commit/b6f78bbbf89b804fc4a0ad89b524f0a24673c19a)) -- fill relative url in entry title link, fix [#372](https://github.com/RSSNext/follow/issues/372) ([7c3aab6](https://github.com/RSSNext/follow/commit/7c3aab6f042a710aaa99d8fb7a774fce89af2b08)) -- fix the fixed misalignment when image is empty and name is also empty ([#179](https://github.com/RSSNext/follow/issues/179)) ([f6b62c8](https://github.com/RSSNext/follow/commit/f6b62c8ce0908772c394d653857197c9302e332b)) -- flat ([6bada5e](https://github.com/RSSNext/follow/commit/6bada5e986ff77ef5de42d18734ea92f872ca818)) -- font name duplicated if installed default font ([1efdd40](https://github.com/RSSNext/follow/commit/1efdd40f99cb1ad52f048bd53648f32b4cfbbae8)) -- format time locale fallback ([6b1009e](https://github.com/RSSNext/follow/commit/6b1009ecfde47d68859a202a2be8a1cde901f2fc)) -- 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)) -- group header extra action button for wider mode ([213b4a5](https://github.com/RSSNext/follow/commit/213b4a5864c78716648b2319f5d6f0dfcb531e3a)) -- grouped list data item render ([da486bc](https://github.com/RSSNext/follow/commit/da486bce3eeafc84aeb3e560ff368c41771688cf)) -- handle empty title in entry translation ([#362](https://github.com/RSSNext/follow/issues/362)) ([a2457a7](https://github.com/RSSNext/follow/commit/a2457a7789aff5928714cbe55e3e7863bb51719b)) -- 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)) -- 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)) -- i18n dispatcher ([c038c79](https://github.com/RSSNext/follow/commit/c038c791af14418ee641af08e689a619b99a1735)) -- **i18n:** dup key ([d90964e](https://github.com/RSSNext/follow/commit/d90964ea9e32d5d7b162d6d7525df213ac732e12)) -- icon button transition ([596538b](https://github.com/RSSNext/follow/commit/596538ba10b6b70d12ccc4efdd9f206d9ba11817)) -- icon fallback line height ([02cd98d](https://github.com/RSSNext/follow/commit/02cd98d9cc9c09006a91277a5b976d753054738d)) -- image url replacement ([8e75a8c](https://github.com/RSSNext/follow/commit/8e75a8cc6931b354e3206ea22917842c991d4c45)) -- improve code block parser ([e72cb2d](https://github.com/RSSNext/follow/commit/e72cb2df3f1f5cd314feeb4a9bcc20e30204bca5)) -- 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)) -- intelligence ([8b889d1](https://github.com/RSSNext/follow/commit/8b889d1307186d07c4672879d77f77e1d8fead7b)) -- invitation code wrap ([4b48202](https://github.com/RSSNext/follow/commit/4b48202ea70ed80b858312d35cf04d1d66515865)) -- invitation page error display area ([5915357](https://github.com/RSSNext/follow/commit/59153573d8a5d368adfe41b0f5cebc4d6d44a9f3)) -- **item:** center content if no desc ([18e26a4](https://github.com/RSSNext/follow/commit/18e26a41c3cf80316bc97c44a1239e6ec45c5db9)) -- kbd cls and set home scope in shortcuts guideline ([d9999a3](https://github.com/RSSNext/follow/commit/d9999a3fc6cfeae0f3b45b6390cf79d9135566b7)) -- language setting syncing ([fa1dc5d](https://github.com/RSSNext/follow/commit/fa1dc5df35a2225bb22320a8fc049d3c0b75fa5b)) -- link underline style when selected ([781b120](https://github.com/RSSNext/follow/commit/781b1200f8eae3f61b39dc53151c5a688fa36d1b)) -- lint ([ef0d80d](https://github.com/RSSNext/follow/commit/ef0d80d8546c804b1b52c58fca7640d2f541188a)) -- list item overlay style ([20ef773](https://github.com/RSSNext/follow/commit/20ef77342e73d205409644386c162dc164da009e)) -- loadFile options hash ([b41fa66](https://github.com/RSSNext/follow/commit/b41fa665fa334f0037de294d8e0585a5cf94c649)) -- loading style ([61ee2cc](https://github.com/RSSNext/follow/commit/61ee2ccb3e30d3ab82de0bfe6aca35df38794dca)) -- login page style ([094a668](https://github.com/RSSNext/follow/commit/094a6684b62de69748f20011f5bd0f68833c30e1)) -- mark all as read in feed action ([cbb5022](https://github.com/RSSNext/follow/commit/cbb502223fd82212f8534eb578786cb138813474)) -- mark read tooltip and shortcut optional ([d4d72dd](https://github.com/RSSNext/follow/commit/d4d72ddf933c89d246585c77b22f8f498b2a98a1)) -- markdown link populate relative link ([bad5869](https://github.com/RSSNext/follow/commit/bad5869f3f974b96fa5513b99574f60fb8aba963)) -- masonry layout cls ([9428368](https://github.com/RSSNext/follow/commit/9428368cfc4a00afb1c72f9ca3a4267b311c5b2b)) -- **media:** if no src then return null ([183009a](https://github.com/RSSNext/follow/commit/183009adee6d5674923a72ae0f5a10b85d4c7ba6)) -- missing feed caused by parsing domain error ([1385876](https://github.com/RSSNext/follow/commit/13858762b4fed592ab7e5040ae6a59a9f3872747)) -- modal max height, fixed [#230](https://github.com/RSSNext/follow/issues/230) ([fbf4727](https://github.com/RSSNext/follow/commit/fbf4727608ada80ba0f42349f2dace0543e22f9e)) -- modal overlay zindex, fixed [#271](https://github.com/RSSNext/follow/issues/271) ([7a5000f](https://github.com/RSSNext/follow/commit/7a5000f20503ade15033822d9ad1c11303424728)) -- modal prevent dimiss when mouse select text ([d99dfbc](https://github.com/RSSNext/follow/commit/d99dfbc79a2d6adb19eb7086fbc3aff8e860fb7b)) -- more highlighted player thumb ([a17ea00](https://github.com/RSSNext/follow/commit/a17ea00c23604312b09283ef89946140b61b2be9)) -- new invitation button zindex ([0d79392](https://github.com/RSSNext/follow/commit/0d79392cde4c282cbc3faf69fd697b3726638279)) -- 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)) -- optimize invitation page ([5f93e4b](https://github.com/RSSNext/follow/commit/5f93e4baac340998b08aaa273e2185893fe88e92)) -- optional response data for check new, fixed [#195](https://github.com/RSSNext/follow/issues/195) ([2c650b0](https://github.com/RSSNext/follow/commit/2c650b08ae031e18dbe4b25d9c124c3eb7ff4f9a)) -- panel resize cursor style alway in `ew-reisze` ([41416d2](https://github.com/RSSNext/follow/commit/41416d21c8ce33029cba45dfe820a7cb04b0adc3)) -- panel split color in dark mode ([3a0cfa1](https://github.com/RSSNext/follow/commit/3a0cfa1ebf794351d7f7b1132c0068a55ff2e9a6)) -- peek modal header background color and copywrite ([b8be81b](https://github.com/RSSNext/follow/commit/b8be81b2105d2c229955a433af91c43f5286194a)) -- player holder size ([78cb08c](https://github.com/RSSNext/follow/commit/78cb08c7dc98aeab9cb5575296470106dbeb4e84)) -- player marquee mask ([aa9ca62](https://github.com/RSSNext/follow/commit/aa9ca624a8d0304838bc05c330a8165a41430d3e)) -- posthog capture app info ([8cf7ae2](https://github.com/RSSNext/follow/commit/8cf7ae26f47d6cbc58322978d915c699d16f95a3)) -- posthog tracker ([f4790da](https://github.com/RSSNext/follow/commit/f4790da8b1f27937b47b27d127497742684e9cc1)) -- power icon color ([a765cd2](https://github.com/RSSNext/follow/commit/a765cd2853ff4fdc267db94600725e5c7dabbaae)) -- preview image and video size ([e4e4700](https://github.com/RSSNext/follow/commit/e4e47006ee55aa59db5fdb76f565a5ec929f3d95)) -- preview image fallback ([7410ca2](https://github.com/RSSNext/follow/commit/7410ca229afdb6fafb01f5ebe370d01dc33a4500)) -- preview image size ([af474c1](https://github.com/RSSNext/follow/commit/af474c1592b5cf92c114936ccb3e6686ea737e37)) -- previous feed should not be preserved when switching feeds ([f1a2ecb](https://github.com/RSSNext/follow/commit/f1a2ecb7d2e517d45ca75dd6371f3570787f5c5f)) -- 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)) -- provide a default ctx value for modal ([38ab5bf](https://github.com/RSSNext/follow/commit/38ab5bffafad32f97ac11a743a35be0a6012403d)) -- read history always show ([#413](https://github.com/RSSNext/follow/issues/413)) ([c3675b2](https://github.com/RSSNext/follow/commit/c3675b25886ddd33f232f0c146208cb8f42c0b36)) -- 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)) -- 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)) -- remove button leading ([84835c5](https://github.com/RSSNext/follow/commit/84835c5ed9df6ac1370b532980929049e8c0d245)) -- remove comment ([5343ab2](https://github.com/RSSNext/follow/commit/5343ab2dbe3549a740509e150ebb27cad8b770a4)) -- remove duplicated shortcuts ([bc3ecde](https://github.com/RSSNext/follow/commit/bc3ecde2e22f22d12894a89d5e671a3e143d17d4)) -- remove electron's default user-agent keep browser user agent ([#356](https://github.com/RSSNext/follow/issues/356)) ([adb39bc](https://github.com/RSSNext/follow/commit/adb39bcc056971698de9cf49f9934a575ef2ab3b)) -- rename category input composition and style ([1ab3770](https://github.com/RSSNext/follow/commit/1ab3770f0279eb043f7a37a1b5251e5ead0ef0b6)) -- resizeable panel ([e2664c2](https://github.com/RSSNext/follow/commit/e2664c2dda663343fa8f53536d6b625daaba6103)) -- Respect app light/dark mode over OS preference [#228](https://github.com/RSSNext/follow/issues/228) ([ecef3e9](https://github.com/RSSNext/follow/commit/ecef3e961a79ac9c99bf9a419fa7573433148da0)) -- rewrite ([3a8cbf2](https://github.com/RSSNext/follow/commit/3a8cbf243903f08392dd1d3eab723b31ff86143a)) -- safari entry colmun styles ([f36cfd3](https://github.com/RSSNext/follow/commit/f36cfd36103016d4d8afffd471a218e435096e43)) -- scroll to top when switch to other entry ([4ec1c93](https://github.com/RSSNext/follow/commit/4ec1c93e95d79daa84018b9bb0f84f03ba0f4dee)) -- search entries ([4cbe2a2](https://github.com/RSSNext/follow/commit/4cbe2a2d816e1a56bd89206d1026fc19d86d47b1)) -- sentry config ([779236e](https://github.com/RSSNext/follow/commit/779236e0827af3981bce29e3c1ac9a527aec3fd5)) -- 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 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)) -- shadow dom font default ([dcb62a5](https://github.com/RSSNext/follow/commit/dcb62a56cbfa47fc6dd58711f019de8511fa7e6c)) -- shadow dom style injected in prod build ([3f1c588](https://github.com/RSSNext/follow/commit/3f1c5881287ce11217766d876cded7635e1bb2b6)) -- shadow dom style injection in prod ([#270](https://github.com/RSSNext/follow/issues/270)) ([c05d95d](https://github.com/RSSNext/follow/commit/c05d95d495393f1957de609c1ba4de5e707b5a81)) -- shiki block style ([75908d4](https://github.com/RSSNext/follow/commit/75908d4a6f43847539accd4bad876983902bd5d8)) -- shortcut modal overlay and id ([c210dc9](https://github.com/RSSNext/follow/commit/c210dc900eda2b30e05a9a5434f06810c1a6cd14)) -- 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)) -- show add feed error message ([7763129](https://github.com/RSSNext/follow/commit/77631299438b4fe6b575a9de5881cebfea6e4ba4)) -- show episode cover for podcast ([#315](https://github.com/RSSNext/follow/issues/315)) ([4ef7f8c](https://github.com/RSSNext/follow/commit/4ef7f8cbd38dd0a148c053e5ee0468e282efe5fb)) -- show filtered button only if no next page ([6fb46e7](https://github.com/RSSNext/follow/commit/6fb46e7887409f735df99f7aa08cd0ef61976981)) -- show owned feed icon ([f29e09c](https://github.com/RSSNext/follow/commit/f29e09c15ab16e9b48d412d628caf196d686eaa2)) -- sidebar layout browser wrong calculation ([e2df38f](https://github.com/RSSNext/follow/commit/e2df38f57e101fea85ce3377a8937b336ef46656)) -- slot icon in action button group ([79b26a0](https://github.com/RSSNext/follow/commit/79b26a0748f9e4f2eeac1726c7602b0a894ced24)) -- social media feed icon style ([841f445](https://github.com/RSSNext/follow/commit/841f445403aef7acc01e30345be963257eea5e14)) -- social media typesetting ([664b70d](https://github.com/RSSNext/follow/commit/664b70d00871ed7f3a3f327bff8aca24c7b4a9a5)) -- social media typography ([5d27d29](https://github.com/RSSNext/follow/commit/5d27d29e4bd2791248d6a907a889a4907f0e0d20)) -- sort by preferred title, fix [#390](https://github.com/RSSNext/follow/issues/390) ([cc25c67](https://github.com/RSSNext/follow/commit/cc25c6785e98f7a200904bdac2b36ff03cf358dd)) -- sort shortcut ([1f8e4a3](https://github.com/RSSNext/follow/commit/1f8e4a3b966891787f05d9b6d0ec0fe327260e49)) -- 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)) -- 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)) -- **style:** button align center and ([38a5cb6](https://github.com/RSSNext/follow/commit/38a5cb682dc0c3082664a2192686ad16f68ecec3)) -- **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)) -- 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)) -- swap show all and unread only copy, fixed [#307](https://github.com/RSSNext/follow/issues/307) ([2b366d1](https://github.com/RSSNext/follow/commit/2b366d1e28e78649e1a7ed6d221d704bcbe4c520)) -- threshold for sidebar temp show ([7d62ea6](https://github.com/RSSNext/follow/commit/7d62ea6801713e2b43b116c5ddfea0b1a96a6fe8)) -- tip modal styles ([3154c4f](https://github.com/RSSNext/follow/commit/3154c4f95b47d7fbce6142f49b211799408bc5aa)) -- toc active logic ([13ba679](https://github.com/RSSNext/follow/commit/13ba679ed879920798e434ee10c3fb407395dcb1)) -- toc hover panel position on small dwidth ([8100277](https://github.com/RSSNext/follow/commit/81002775c0d48a5cce227f773b8bdb418d6a55fb)) -- toc item rounded corner when range is small ([1708533](https://github.com/RSSNext/follow/commit/1708533f7952a79ff99a6f2ae55b080926b81093)) -- toc not appear when the entry first rendered ([5dc4fb5](https://github.com/RSSNext/follow/commit/5dc4fb55333a0e6f5c698869bae7b253447e6b45)) -- 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)) -- 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)) -- translation markdown tooltip wrapper style ([639bace](https://github.com/RSSNext/follow/commit/639bace313311db6319fb1fe168b68af7aa1e8e0)) -- try fix vercel config ([968dea9](https://github.com/RSSNext/follow/commit/968dea91f474a76298091de6a23f3ba7a11fb22f)) -- try to fix some sentry error ([0b31c1e](https://github.com/RSSNext/follow/commit/0b31c1e998212900dda0044acda8a3d4d5df1189)) -- try vercel conf ([309db21](https://github.com/RSSNext/follow/commit/309db219e8bc1f0d37acc64e699116403b2d5ebb)) -- tts should hide in web ([30721c8](https://github.com/RSSNext/follow/commit/30721c8170baf131a457d97a2a723e96b7b7fc94)) -- 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)) -- type error ([5cd41ad](https://github.com/RSSNext/follow/commit/5cd41ad10ccbd241083d6f951509eb0bafe6e25f)) -- type error ([60f8347](https://github.com/RSSNext/follow/commit/60f8347eec118176681a9ad7fcab7f45e383fc1b)) -- types ([a116dd4](https://github.com/RSSNext/follow/commit/a116dd4018f90886239f7583cbc82b511ff2a902)) -- types ([3c5b224](https://github.com/RSSNext/follow/commit/3c5b224904e8db1c8ba6b78cfb87d09cd81de98c)) -- types ([7f5bb1e](https://github.com/RSSNext/follow/commit/7f5bb1e9343243f5259f9fde8ee3ac44bf993913)) -- types ([4287b5d](https://github.com/RSSNext/follow/commit/4287b5d986e74fbb2f96c2f322f09f921f773d7a)) -- types ([d9458a1](https://github.com/RSSNext/follow/commit/d9458a1850b3e83e9bbb9374d4fc3b6884a24837)) -- typing ([a386fd6](https://github.com/RSSNext/follow/commit/a386fd6e97fb98c42b3eedf156c5b167ff67bd34)) -- typo ([deb96c5](https://github.com/RSSNext/follow/commit/deb96c538258c939c60762c723d58955899031cf)) -- undo kbd color in dark mode ([2a106ae](https://github.com/RSSNext/follow/commit/2a106ae632e0641d58d0d45b88f61a1c5c6eafa5)) -- unfollow ([613fdf8](https://github.com/RSSNext/follow/commit/613fdf85b7dc7148f4ade612805f9f3bd98f2268)) -- unify date item mark read styles ([9f5cbab](https://github.com/RSSNext/follow/commit/9f5cbabfafc905046258ceb5fe2c0bdd6993b830)) -- unify player actions icons ([7d2382d](https://github.com/RSSNext/follow/commit/7d2382d56bf4b4186e566191cbbb1662a6a15d30)) -- unify setting tab icon color, fix [#303](https://github.com/RSSNext/follow/issues/303) ([33a049a](https://github.com/RSSNext/follow/commit/33a049a8513f5c3cab9ce8a6adefadf7399164f8)) -- update cmdk high contrast, [@unixzii](https://github.com/unixzii) advice ([cbd7593](https://github.com/RSSNext/follow/commit/cbd75932433ad056b257c5934e6aefc3c0d829dd)) -- update invitation fab ([0cd1837](https://github.com/RSSNext/follow/commit/0cd183780f299b94a800cd86342484afa7f716bd)) -- update unread dot style ([e2fef01](https://github.com/RSSNext/follow/commit/e2fef01d2c374f720a6ff4b265344c828f8b80ba)) -- updater should closes all window first ([7cb1a94](https://github.com/RSSNext/follow/commit/7cb1a94a15383e3190c37d3fea9ff0ff5a97dfd5)) -- upgrade tip when player open ([033831b](https://github.com/RSSNext/follow/commit/033831bdab0a85a2f1f02af85c6da2278e40de5e)) -- upload sentry sourcemap ([b23365f](https://github.com/RSSNext/follow/commit/b23365faad9927826140948b642c0caca542f135)) -- use feed enabled condition ([9726d43](https://github.com/RSSNext/follow/commit/9726d4396673e2be02c60ce049ed07c5bf978380)) -- use official embed player in bilibili video when use web ([#219](https://github.com/RSSNext/follow/issues/219)) ([9177a34](https://github.com/RSSNext/follow/commit/9177a349e087cdc60b22e2338146caaefd377694)) -- user button color in dark mode ([04e3c38](https://github.com/RSSNext/follow/commit/04e3c386c5699e6b0907de2a98701668fc7f278b)) -- 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)) -- video preview ([e38820c](https://github.com/RSSNext/follow/commit/e38820c1aa2294f45e05d331bf4bce0e4d8efb44)) -- view icon color in dark mode ([991bff7](https://github.com/RSSNext/follow/commit/991bff7660e93b872f1398c89c0fe4316f4327d9)) -- virtuosoitem height zero issue ([3c5c7ba](https://github.com/RSSNext/follow/commit/3c5c7babc9b3f83ef89ef1007f25d7b3ccb8f6a1)) -- wait language load then switch to target language ([bbe4ea6](https://github.com/RSSNext/follow/commit/bbe4ea66e75a8911e9ef39764d02d22251ba743e)) -- wallet table latyout ([6c60dd2](https://github.com/RSSNext/follow/commit/6c60dd265245d08d622c59d035d2124285ff68f1)) -- **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 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)) -- 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)) -- zero tipUsers ([7f994d7](https://github.com/RSSNext/follow/commit/7f994d7a21080468cb07908b4b8fc694ebfeba37)) +* [@unixzii](https://github.com/unixzii) feature request ([b41a78d](https://github.com/RSSNext/follow/commit/b41a78d5c66d5846d1fec33cfa29b9864ddfe20f)) +* `` show fallback ([ca0fd18](https://github.com/RSSNext/follow/commit/ca0fd1802c2f48e4d2a5697f71988df00096fd89)) +* `i18nProvider` condition ([0f654b9](https://github.com/RSSNext/follow/commit/0f654b9e61233319787726d3fa3557307efa1b0c)) +* `IconButton` props ([f33598b](https://github.com/RSSNext/follow/commit/f33598bb9acf870f9c07475e75b4ed5e78ed6a85)) +* `scrollHideDelay` for scroll bar ([5300803](https://github.com/RSSNext/follow/commit/5300803d395daa485ae8ac04e7eaf2f405c7beb4)) +* accent color ([918d85a](https://github.com/RSSNext/follow/commit/918d85a591cdfc8c6c12261004a6a463516eaf5c)) +* accept import opml ([39ecc82](https://github.com/RSSNext/follow/commit/39ecc82a8ceecd77139ffccb31a33904082a3d1b)) +* add app version on posthog ([9933463](https://github.com/RSSNext/follow/commit/99334639e28b2a2a17b9c3fdd64f0d6d37bdd181)) +* 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)) +* add download app fab ([0f8309b](https://github.com/RSSNext/follow/commit/0f8309b2031d53a17eb74ed36f2a0f504c54c431)) +* add environment in error report issue template ([232c24d](https://github.com/RSSNext/follow/commit/232c24de3dbc135f4064c17680fbe6e429c92697)) +* add feed should validate feed id first ([767710d](https://github.com/RSSNext/follow/commit/767710deda41af1842179ef03f9b6b1b79208f9e)) +* add feed temp store use nonce ([6e36232](https://github.com/RSSNext/follow/commit/6e36232b41f1b6d877caf74e1ad7be50da716381)) +* add feed when site url not match ([1a2190c](https://github.com/RSSNext/follow/commit/1a2190c1aa834a33932788e65269a1128fd3a7e2)) +* add hover bg color when context menu opened ([6ceb263](https://github.com/RSSNext/follow/commit/6ceb263b777ccc9681cd086a28e019ce9bda3a43)) +* add language selector loading lock map ([2d14c1e](https://github.com/RSSNext/follow/commit/2d14c1e5b5ad086b3556dd9a8862a6ce00368c4d)) +* add link ([d9168c0](https://github.com/RSSNext/follow/commit/d9168c01b3f2a16fbfeadb722173e819dd3feb80)) +* 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 show readability tip condition ([208e404](https://github.com/RSSNext/follow/commit/208e4040cea5d3485acf5750e7120fb5f715e30f)) +* add some polyfills for old browser, fixed [#236](https://github.com/RSSNext/follow/issues/236) ([b1fbfbd](https://github.com/RSSNext/follow/commit/b1fbfbd7e38a6a10430f7ed2d4b0644c2d5bbf22)) +* add tooltip for resize panel ([cdec351](https://github.com/RSSNext/follow/commit/cdec3510352cc7281e75ef1957e32bc6e712cf04)) +* adjust card style ([bec6d1a](https://github.com/RSSNext/follow/commit/bec6d1a259560261d06c9ed1f4ac56549f1eaae7)) +* adjust claim modal style ([ea3c96f](https://github.com/RSSNext/follow/commit/ea3c96f8f3745440108255980e3b66e38d83af4c)) +* adjust code block padding ([3a164e6](https://github.com/RSSNext/follow/commit/3a164e6aa893b9c6be10b87ac981c2a4ccca4bee)) +* adjust layout ([cf9285b](https://github.com/RSSNext/follow/commit/cf9285b40e6fc8b027588fe01a0f50b29dd202dc)) +* adjust responsive breakpoint for entry content ([d9235f4](https://github.com/RSSNext/follow/commit/d9235f4e68b71c143b2c404c925a3602378a3cda)) +* after webview fullscreen force repaint ([4187b52](https://github.com/RSSNext/follow/commit/4187b52ae213d9b00f70aac4a6c0dacbb2339e50)) +* 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 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)) +* alpha typo ([961a75c](https://github.com/RSSNext/follow/commit/961a75cd46227c7bb11bae3743b970b2884ccc44)) +* audio player async logic and auto pause logic ([ba40b44](https://github.com/RSSNext/follow/commit/ba40b44ce91bb8acd118b9c6d846ed8d5b9b022c)) +* 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 setting ([55b7868](https://github.com/RSSNext/follow/commit/55b7868f2e2aa3c01468e1268e3436485491ee1a)) +* border color in dark mode ([472fbb2](https://github.com/RSSNext/follow/commit/472fbb2a6b41d9953bbfbda5452558621f71c8d5)) +* button align ([456b6f2](https://github.com/RSSNext/follow/commit/456b6f2c0c41734d771b9677971430178c0cd20a)) +* button styles, fixed [#202](https://github.com/RSSNext/follow/issues/202) ([6649577](https://github.com/RSSNext/follow/commit/66495777798cb4775ccc440a0c6354dcebe6cd9e)) +* button transition ([f731d1e](https://github.com/RSSNext/follow/commit/f731d1e34e151828b6fa9553361f476da9d7e39b)) +* calc toc scroller range when entry content changed ([66035fe](https://github.com/RSSNext/follow/commit/66035fea72e3ce0c6fbcd8380fbdef612e052cb4)) +* can use under window blur ([9b2656e](https://github.com/RSSNext/follow/commit/9b2656ec53f3865378b7f2392d59a6828b31149c)) +* catch access stylesheet error ([16a6231](https://github.com/RSSNext/follow/commit/16a62310e3e0e2a79c5392cec0e7658b97d0ee21)) +* category in route should encodeURLComponent ([d5b79cb](https://github.com/RSSNext/follow/commit/d5b79cba8a5d6d8fe18efee5d58da5610fc3ce68)) +* check undefined view ([71712f4](https://github.com/RSSNext/follow/commit/71712f464d2ab3043b602d4d2c311e4cc851e046)) +* ci and tootip portal ([3729917](https://github.com/RSSNext/follow/commit/37299173c8fcaf88d44b1a54baf7ddc03aa20ca6)) +* 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)) +* clean local async data ([ae26dd7](https://github.com/RSSNext/follow/commit/ae26dd7763fe32990086e76fa896ec09dec170cd)) +* config `__dirname` resolve ([f3f3cac](https://github.com/RSSNext/follow/commit/f3f3cac2b4ff0865f863b848397f0e27caa435b3)) +* 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)) +* corner player tooltip bg color ([16b91f9](https://github.com/RSSNext/follow/commit/16b91f9a7d3267f34f525c2e820efff6e1cbc049)) +* correct follower word ([#438](https://github.com/RSSNext/follow/issues/438)) ([e31e343](https://github.com/RSSNext/follow/commit/e31e3433dfdafcab2276f2794065af81ca1f75fe)) +* crashes when docs appear in the discover result ([#494](https://github.com/RSSNext/follow/issues/494)) ([0c470be](https://github.com/RSSNext/follow/commit/0c470bed3eed1533d36e2eff60f9a1aa0ff0d861)) +* custom modal ([8d03308](https://github.com/RSSNext/follow/commit/8d03308091a57745489bb48617b7e11134bb89c3)) +* daily report animation ([ff16272](https://github.com/RSSNext/follow/commit/ff162722a927d3708f3d857626e6412ae35d3880)) +* daily report link title ([0a58159](https://github.com/RSSNext/follow/commit/0a58159acd4fbc12e970f745f27e6488904a99d9)) +* dark mode entry content color in electron ([06073d5](https://github.com/RSSNext/follow/commit/06073d53bc6e69867b3e6102c755e6bd1f9be9bf)) +* date item layout animation ([e2fec9c](https://github.com/RSSNext/follow/commit/e2fec9c250b9641a645d0f24ec3f038a5b630cfd)) +* **db:** remove remaining data if unfollow feed ([1edf560](https://github.com/RSSNext/follow/commit/1edf5605e9621219e6cdfc732f12e6464113f765)) +* debug proxy inject env ([6b80cdc](https://github.com/RSSNext/follow/commit/6b80cdc6e7141913643f77a0b9a089333b86278d)) +* deeplink navigate ([00d41ce](https://github.com/RSSNext/follow/commit/00d41cee5632dab86f7a93b1bc965cb3a896417a)) +* default extra window size ([5688eff](https://github.com/RSSNext/follow/commit/5688eff6a70ab9abc3e94d9dce861726df8d9123)) +* 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:** update follow status after add feed, closes [#269](https://github.com/RSSNext/follow/issues/269), closes ([32a55ec](https://github.com/RSSNext/follow/commit/32a55ece6440f80f837adc6d558029ea5fbd6982)) +* 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)) +* downgarde vitest ([dee089e](https://github.com/RSSNext/follow/commit/dee089e1c75bf9031663b682aff9cee33b60db76)) +* 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)) +* 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)) +* electron context menu i18n ([1a1d8ab](https://github.com/RSSNext/follow/commit/1a1d8ab5c1ff4917d3b3368059eff0b4cdf57520)) +* electron exit webview fullscreen sidebar color ([bc7914f](https://github.com/RSSNext/follow/commit/bc7914f803939897d817080972e5307cf58f8caf)) +* electron external window size option ([399d5d7](https://github.com/RSSNext/follow/commit/399d5d7a2cda5c7a7f9ce91ae9b9125f9ece7c54)) +* electron search ([63bea18](https://github.com/RSSNext/follow/commit/63bea180f545e2f64cdc7e379f807333fee0ded6)) +* electron title bar drag-region ([29ab323](https://github.com/RSSNext/follow/commit/29ab32344fafda613b0c9d49b587786eaa40b00a)) +* electron window frame and `backgroundMaterial` ([e18ec75](https://github.com/RSSNext/follow/commit/e18ec754a05231fb82a7cbdb80632d79a6232872)) +* electron window type ([909d692](https://github.com/RSSNext/follow/commit/909d6929da5bd3930a6e1d8aa3342c46d00e5c7d)) +* 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)) +* 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)) +* entry column padding top and filter unread/read in tweet view ([d181771](https://github.com/RSSNext/follow/commit/d181771a7bf314cdb30f2fdd76294c5cded524ab)) +* entry item overlay flash ([687e039](https://github.com/RSSNext/follow/commit/687e039ca2ad43eed2b4b48a29df96595dcdbc0f)) +* 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)) +* 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-page:** feed list overlay style ([1dcffc6](https://github.com/RSSNext/follow/commit/1dcffc60d26596065bc024653d69a109a1941578)) +* extract constants ([f48b589](https://github.com/RSSNext/follow/commit/f48b58941344a4a5e547a402e02f56bb5f9f5abf)) +* 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)) +* feed column height ([0d4c70d](https://github.com/RSSNext/follow/commit/0d4c70d06eda97316b360740b9aa8ef08e9539c3)) +* feed column layout ([8a31463](https://github.com/RSSNext/follow/commit/8a31463e4ef82811e0f7d5fd40cb3281202a24e3)) +* feed column resize perf ([a09f55a](https://github.com/RSSNext/follow/commit/a09f55af080714d0b0022983421e942d14ceb562)) +* feed column vertical align ([63139f2](https://github.com/RSSNext/follow/commit/63139f25b2b771480de4c04d91967067897c94fc)) +* feed form view type radio text wrap ([d9e89e2](https://github.com/RSSNext/follow/commit/d9e89e213c57908c18dc1391bb7c07d35f7b02ca)) +* feed icon in player cover ([c6a8613](https://github.com/RSSNext/follow/commit/c6a8613b29cec24bb61eec2196f1827ae9a759fa)) +* feed icon style ([3f04f14](https://github.com/RSSNext/follow/commit/3f04f148f5a34d47da8dab1a4fc4b00f9a2fadba)) +* feed icon style ([03c202e](https://github.com/RSSNext/follow/commit/03c202eb568c684e9645003b65f48cad6099071b)) +* feed list can switch view, fix [#278](https://github.com/RSSNext/follow/issues/278) ([76a33b6](https://github.com/RSSNext/follow/commit/76a33b6f905bac61f6390b01b13c6a43b94f535f)) +* feed list overflow ([4941cf7](https://github.com/RSSNext/follow/commit/4941cf7b93a751f585ab5032974fe6eb191f7968)) +* **feed-icon:** re-render loop ([b6f78bb](https://github.com/RSSNext/follow/commit/b6f78bbbf89b804fc4a0ad89b524f0a24673c19a)) +* fill relative url in entry title link, fix [#372](https://github.com/RSSNext/follow/issues/372) ([7c3aab6](https://github.com/RSSNext/follow/commit/7c3aab6f042a710aaa99d8fb7a774fce89af2b08)) +* fix the fixed misalignment when image is empty and name is also empty ([#179](https://github.com/RSSNext/follow/issues/179)) ([f6b62c8](https://github.com/RSSNext/follow/commit/f6b62c8ce0908772c394d653857197c9302e332b)) +* fixed text overlap issues caused by style ([#527](https://github.com/RSSNext/follow/issues/527)) ([103bd6a](https://github.com/RSSNext/follow/commit/103bd6a414beb9a808a9ad661348ff416626bc18)) +* flat ([6bada5e](https://github.com/RSSNext/follow/commit/6bada5e986ff77ef5de42d18734ea92f872ca818)) +* font name duplicated if installed default font ([1efdd40](https://github.com/RSSNext/follow/commit/1efdd40f99cb1ad52f048bd53648f32b4cfbbae8)) +* 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)) +* 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)) +* group header extra action button for wider mode ([213b4a5](https://github.com/RSSNext/follow/commit/213b4a5864c78716648b2319f5d6f0dfcb531e3a)) +* grouped list data item render ([da486bc](https://github.com/RSSNext/follow/commit/da486bce3eeafc84aeb3e560ff368c41771688cf)) +* handle empty title in entry translation ([#362](https://github.com/RSSNext/follow/issues/362)) ([a2457a7](https://github.com/RSSNext/follow/commit/a2457a7789aff5928714cbe55e3e7863bb51719b)) +* 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)) +* 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 persist ([18e0353](https://github.com/RSSNext/follow/commit/18e035394b8d1a77f8454f47e0049359e69d750a)) +* **i18n:** dup key ([d90964e](https://github.com/RSSNext/follow/commit/d90964ea9e32d5d7b162d6d7525df213ac732e12)) +* **i18n:** give star ([#502](https://github.com/RSSNext/follow/issues/502)) ([9ead475](https://github.com/RSSNext/follow/commit/9ead4754d31fee3a1c14a3ef9210a621c2dd039f)) +* icon button transition ([596538b](https://github.com/RSSNext/follow/commit/596538ba10b6b70d12ccc4efdd9f206d9ba11817)) +* icon fallback line height ([02cd98d](https://github.com/RSSNext/follow/commit/02cd98d9cc9c09006a91277a5b976d753054738d)) +* image url replacement ([8e75a8c](https://github.com/RSSNext/follow/commit/8e75a8cc6931b354e3206ea22917842c991d4c45)) +* import circular and copywrite i18n ([725f9f5](https://github.com/RSSNext/follow/commit/725f9f5509c3b34079923fad47096b108568ccd6)) +* improve code block parser ([e72cb2d](https://github.com/RSSNext/follow/commit/e72cb2df3f1f5cd314feeb4a9bcc20e30204bca5)) +* 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 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)) +* invitation page error display area ([5915357](https://github.com/RSSNext/follow/commit/59153573d8a5d368adfe41b0f5cebc4d6d44a9f3)) +* **item:** center content if no desc ([18e26a4](https://github.com/RSSNext/follow/commit/18e26a41c3cf80316bc97c44a1239e6ec45c5db9)) +* 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)) +* link underline style when selected ([781b120](https://github.com/RSSNext/follow/commit/781b1200f8eae3f61b39dc53151c5a688fa36d1b)) +* lint ([ef0d80d](https://github.com/RSSNext/follow/commit/ef0d80d8546c804b1b52c58fca7640d2f541188a)) +* list item overlay style ([20ef773](https://github.com/RSSNext/follow/commit/20ef77342e73d205409644386c162dc164da009e)) +* 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)) +* login page style ([094a668](https://github.com/RSSNext/follow/commit/094a6684b62de69748f20011f5bd0f68833c30e1)) +* 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)) +* markdown link populate relative link ([bad5869](https://github.com/RSSNext/follow/commit/bad5869f3f974b96fa5513b99574f60fb8aba963)) +* masonry layout cls ([9428368](https://github.com/RSSNext/follow/commit/9428368cfc4a00afb1c72f9ca3a4267b311c5b2b)) +* **media:** if no src then return null ([183009a](https://github.com/RSSNext/follow/commit/183009adee6d5674923a72ae0f5a10b85d4c7ba6)) +* missing feed caused by parsing domain error ([1385876](https://github.com/RSSNext/follow/commit/13858762b4fed592ab7e5040ae6a59a9f3872747)) +* modal max height ([f9dc545](https://github.com/RSSNext/follow/commit/f9dc5458ab18af0a683834115324bba615323636)) +* modal max height, fixed [#230](https://github.com/RSSNext/follow/issues/230) ([fbf4727](https://github.com/RSSNext/follow/commit/fbf4727608ada80ba0f42349f2dace0543e22f9e)) +* modal overlay zindex, fixed [#271](https://github.com/RSSNext/follow/issues/271) ([7a5000f](https://github.com/RSSNext/follow/commit/7a5000f20503ade15033822d9ad1c11303424728)) +* modal prevent dimiss when mouse select text ([d99dfbc](https://github.com/RSSNext/follow/commit/d99dfbc79a2d6adb19eb7086fbc3aff8e860fb7b)) +* more highlighted player thumb ([a17ea00](https://github.com/RSSNext/follow/commit/a17ea00c23604312b09283ef89946140b61b2be9)) +* new invitation button zindex ([0d79392](https://github.com/RSSNext/follow/commit/0d79392cde4c282cbc3faf69fd697b3726638279)) +* 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)) +* optimize invitation page ([5f93e4b](https://github.com/RSSNext/follow/commit/5f93e4baac340998b08aaa273e2185893fe88e92)) +* optional response data for check new, fixed [#195](https://github.com/RSSNext/follow/issues/195) ([2c650b0](https://github.com/RSSNext/follow/commit/2c650b08ae031e18dbe4b25d9c124c3eb7ff4f9a)) +* overflow text in setting modal layout ([b34aa57](https://github.com/RSSNext/follow/commit/b34aa579f07af9dd3feca036b8996e561204d850)) +* panel resize cursor style alway in `ew-reisze` ([41416d2](https://github.com/RSSNext/follow/commit/41416d21c8ce33029cba45dfe820a7cb04b0adc3)) +* 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)) +* player holder size ([78cb08c](https://github.com/RSSNext/follow/commit/78cb08c7dc98aeab9cb5575296470106dbeb4e84)) +* player marquee mask ([aa9ca62](https://github.com/RSSNext/follow/commit/aa9ca624a8d0304838bc05c330a8165a41430d3e)) +* position of swiper navigation buttons ([#541](https://github.com/RSSNext/follow/issues/541)) ([0d760e7](https://github.com/RSSNext/follow/commit/0d760e7bf9e4e74f823c715237c300773865650a)) +* posthog capture app info ([8cf7ae2](https://github.com/RSSNext/follow/commit/8cf7ae26f47d6cbc58322978d915c699d16f95a3)) +* posthog tracker ([f4790da](https://github.com/RSSNext/follow/commit/f4790da8b1f27937b47b27d127497742684e9cc1)) +* power balance align center ([972ff76](https://github.com/RSSNext/follow/commit/972ff7675e75014270764ba8b69372ae0d7dd3a8)) +* power icon color ([a765cd2](https://github.com/RSSNext/follow/commit/a765cd2853ff4fdc267db94600725e5c7dabbaae)) +* preview image and video size ([e4e4700](https://github.com/RSSNext/follow/commit/e4e47006ee55aa59db5fdb76f565a5ec929f3d95)) +* preview image fallback ([7410ca2](https://github.com/RSSNext/follow/commit/7410ca229afdb6fafb01f5ebe370d01dc33a4500)) +* preview image size ([af474c1](https://github.com/RSSNext/follow/commit/af474c1592b5cf92c114936ccb3e6686ea737e37)) +* previous feed should not be preserved when switching feeds ([f1a2ecb](https://github.com/RSSNext/follow/commit/f1a2ecb7d2e517d45ca75dd6371f3570787f5c5f)) +* 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)) +* provide a default ctx value for modal ([38ab5bf](https://github.com/RSSNext/follow/commit/38ab5bffafad32f97ac11a743a35be0a6012403d)) +* radix auto focus issue ([b3d05b4](https://github.com/RSSNext/follow/commit/b3d05b42e9b0afd8b4e828bdf57eb564a53e613f)) +* read history always show ([#413](https://github.com/RSSNext/follow/issues/413)) ([c3675b2](https://github.com/RSSNext/follow/commit/c3675b25886ddd33f232f0c146208cb8f42c0b36)) +* 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)) +* 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)) +* remove `src` ([9aa16b6](https://github.com/RSSNext/follow/commit/9aa16b62d84f40c90334396d219ee9ab2a371750)) +* remove button leading ([84835c5](https://github.com/RSSNext/follow/commit/84835c5ed9df6ac1370b532980929049e8c0d245)) +* remove comment ([5343ab2](https://github.com/RSSNext/follow/commit/5343ab2dbe3549a740509e150ebb27cad8b770a4)) +* remove debug `zh_CN` args ([d650b47](https://github.com/RSSNext/follow/commit/d650b473b966471105c06841876183bc79fad714)) +* remove duplicated en and tweak lang sort ([#547](https://github.com/RSSNext/follow/issues/547)) ([2bd3d0b](https://github.com/RSSNext/follow/commit/2bd3d0b4c8c68014771375d97d75e491bfd28385)) +* remove duplicated shortcuts ([bc3ecde](https://github.com/RSSNext/follow/commit/bc3ecde2e22f22d12894a89d5e671a3e143d17d4)) +* remove electron's default user-agent keep browser user agent ([#356](https://github.com/RSSNext/follow/issues/356)) ([adb39bc](https://github.com/RSSNext/follow/commit/adb39bcc056971698de9cf49f9934a575ef2ab3b)) +* remove windows under blur and ensure main window in the screen bounds ([d772343](https://github.com/RSSNext/follow/commit/d7723435a1527e5f9c065c36bf1d1d81b3b43ec4)) +* rename category input composition and style ([1ab3770](https://github.com/RSSNext/follow/commit/1ab3770f0279eb043f7a37a1b5251e5ead0ef0b6)) +* reorganize package.json ([b2c48a4](https://github.com/RSSNext/follow/commit/b2c48a49e3789cb3dfd9e9170f5371fc6b25c4b1)) +* reset is archived state on reset ([b701dd6](https://github.com/RSSNext/follow/commit/b701dd6e1badeaf0d0470bcff28abc3fb4057893)) +* resizeable panel ([e2664c2](https://github.com/RSSNext/follow/commit/e2664c2dda663343fa8f53536d6b625daaba6103)) +* Respect app light/dark mode over OS preference [#228](https://github.com/RSSNext/follow/issues/228) ([ecef3e9](https://github.com/RSSNext/follow/commit/ecef3e961a79ac9c99bf9a419fa7573433148da0)) +* rewrite ([3a8cbf2](https://github.com/RSSNext/follow/commit/3a8cbf243903f08392dd1d3eab723b31ff86143a)) +* round left only in electron ([2d10811](https://github.com/RSSNext/follow/commit/2d10811273d2053b889b2688189b4212b6e9d6a1)) +* safari entry colmun styles ([f36cfd3](https://github.com/RSSNext/follow/commit/f36cfd36103016d4d8afffd471a218e435096e43)) +* scroll to top when switch to other entry ([4ec1c93](https://github.com/RSSNext/follow/commit/4ec1c93e95d79daa84018b9bb0f84f03ba0f4dee)) +* search entries ([4cbe2a2](https://github.com/RSSNext/follow/commit/4cbe2a2d816e1a56bd89206d1026fc19d86d47b1)) +* sentry config ([779236e](https://github.com/RSSNext/follow/commit/779236e0827af3981bce29e3c1ac9a527aec3fd5)) +* set auth config first ([a281f58](https://github.com/RSSNext/follow/commit/a281f58a811213d933585280238fec4088ad7749)) +* 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 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)) +* shadow dom font default ([dcb62a5](https://github.com/RSSNext/follow/commit/dcb62a56cbfa47fc6dd58711f019de8511fa7e6c)) +* shadow dom style injected in prod build ([3f1c588](https://github.com/RSSNext/follow/commit/3f1c5881287ce11217766d876cded7635e1bb2b6)) +* shadow dom style injection in prod ([#270](https://github.com/RSSNext/follow/issues/270)) ([c05d95d](https://github.com/RSSNext/follow/commit/c05d95d495393f1957de609c1ba4de5e707b5a81)) +* shiki block style ([75908d4](https://github.com/RSSNext/follow/commit/75908d4a6f43847539accd4bad876983902bd5d8)) +* shortcut modal overlay and id ([c210dc9](https://github.com/RSSNext/follow/commit/c210dc900eda2b30e05a9a5434f06810c1a6cd14)) +* 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 episode cover for podcast ([#315](https://github.com/RSSNext/follow/issues/315)) ([4ef7f8c](https://github.com/RSSNext/follow/commit/4ef7f8cbd38dd0a148c053e5ee0468e282efe5fb)) +* show filtered button only if no next page ([6fb46e7](https://github.com/RSSNext/follow/commit/6fb46e7887409f735df99f7aa08cd0ef61976981)) +* show owned feed icon ([f29e09c](https://github.com/RSSNext/follow/commit/f29e09c15ab16e9b48d412d628caf196d686eaa2)) +* sidebar layout browser wrong calculation ([e2df38f](https://github.com/RSSNext/follow/commit/e2df38f57e101fea85ce3377a8937b336ef46656)) +* slot icon in action button group ([79b26a0](https://github.com/RSSNext/follow/commit/79b26a0748f9e4f2eeac1726c7602b0a894ced24)) +* social media feed icon style ([841f445](https://github.com/RSSNext/follow/commit/841f445403aef7acc01e30345be963257eea5e14)) +* social media typesetting ([664b70d](https://github.com/RSSNext/follow/commit/664b70d00871ed7f3a3f327bff8aca24c7b4a9a5)) +* social media typography ([5d27d29](https://github.com/RSSNext/follow/commit/5d27d29e4bd2791248d6a907a889a4907f0e0d20)) +* sort by preferred title, fix [#390](https://github.com/RSSNext/follow/issues/390) ([cc25c67](https://github.com/RSSNext/follow/commit/cc25c6785e98f7a200904bdac2b36ff03cf358dd)) +* sort shortcut ([1f8e4a3](https://github.com/RSSNext/follow/commit/1f8e4a3b966891787f05d9b6d0ec0fe327260e49)) +* split entry history api and accurate count ([8f3acd6](https://github.com/RSSNext/follow/commit/8f3acd648eab7f44f61c1685b996f02cfe8cc443)) +* 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)) +* 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)) +* style center ([a5e3311](https://github.com/RSSNext/follow/commit/a5e33112ff2782cdbca316ff1d4dd6fd78116a1c)) +* **style:** button align center and ([38a5cb6](https://github.com/RSSNext/follow/commit/38a5cb682dc0c3082664a2192686ad16f68ecec3)) +* **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)) +* 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)) +* swap show all and unread only copy, fixed [#307](https://github.com/RSSNext/follow/issues/307) ([2b366d1](https://github.com/RSSNext/follow/commit/2b366d1e28e78649e1a7ed6d221d704bcbe4c520)) +* the filename case issue with generate-i18n-locale add zh-hk ([#463](https://github.com/RSSNext/follow/issues/463)) ([a2eeb25](https://github.com/RSSNext/follow/commit/a2eeb253b3d8acb87d0d2f54914a19a9c75eb7ce)) +* The problem with the display of the right content area ([#501](https://github.com/RSSNext/follow/issues/501)) ([4692ebd](https://github.com/RSSNext/follow/commit/4692ebd11ecf9b05a57e49270f920a33bbd9a5c3)) +* threshold for sidebar temp show ([7d62ea6](https://github.com/RSSNext/follow/commit/7d62ea6801713e2b43b116c5ddfea0b1a96a6fe8)) +* tip modal styles ([3154c4f](https://github.com/RSSNext/follow/commit/3154c4f95b47d7fbce6142f49b211799408bc5aa)) +* toc active logic ([13ba679](https://github.com/RSSNext/follow/commit/13ba679ed879920798e434ee10c3fb407395dcb1)) +* toc hover panel position on small dwidth ([8100277](https://github.com/RSSNext/follow/commit/81002775c0d48a5cce227f773b8bdb418d6a55fb)) +* toc item rounded corner when range is small ([1708533](https://github.com/RSSNext/follow/commit/1708533f7952a79ff99a6f2ae55b080926b81093)) +* toc not appear when the entry first rendered ([5dc4fb5](https://github.com/RSSNext/follow/commit/5dc4fb55333a0e6f5c698869bae7b253447e6b45)) +* 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)) +* 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)) +* translation markdown tooltip wrapper style ([639bace](https://github.com/RSSNext/follow/commit/639bace313311db6319fb1fe168b68af7aa1e8e0)) +* try fix vercel config ([968dea9](https://github.com/RSSNext/follow/commit/968dea91f474a76298091de6a23f3ba7a11fb22f)) +* try to fix some sentry error ([0b31c1e](https://github.com/RSSNext/follow/commit/0b31c1e998212900dda0044acda8a3d4d5df1189)) +* try vercel conf ([309db21](https://github.com/RSSNext/follow/commit/309db219e8bc1f0d37acc64e699116403b2d5ebb)) +* tts should hide in web ([30721c8](https://github.com/RSSNext/follow/commit/30721c8170baf131a457d97a2a723e96b7b7fc94)) +* 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)) +* type error ([5cd41ad](https://github.com/RSSNext/follow/commit/5cd41ad10ccbd241083d6f951509eb0bafe6e25f)) +* type error ([60f8347](https://github.com/RSSNext/follow/commit/60f8347eec118176681a9ad7fcab7f45e383fc1b)) +* types ([a116dd4](https://github.com/RSSNext/follow/commit/a116dd4018f90886239f7583cbc82b511ff2a902)) +* types ([3c5b224](https://github.com/RSSNext/follow/commit/3c5b224904e8db1c8ba6b78cfb87d09cd81de98c)) +* types ([7f5bb1e](https://github.com/RSSNext/follow/commit/7f5bb1e9343243f5259f9fde8ee3ac44bf993913)) +* types ([4287b5d](https://github.com/RSSNext/follow/commit/4287b5d986e74fbb2f96c2f322f09f921f773d7a)) +* types ([d9458a1](https://github.com/RSSNext/follow/commit/d9458a1850b3e83e9bbb9374d4fc3b6884a24837)) +* typing ([a386fd6](https://github.com/RSSNext/follow/commit/a386fd6e97fb98c42b3eedf156c5b167ff67bd34)) +* typo ([deb96c5](https://github.com/RSSNext/follow/commit/deb96c538258c939c60762c723d58955899031cf)) +* **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)) +* unfollow ([613fdf8](https://github.com/RSSNext/follow/commit/613fdf85b7dc7148f4ade612805f9f3bd98f2268)) +* unify date item mark read styles ([9f5cbab](https://github.com/RSSNext/follow/commit/9f5cbabfafc905046258ceb5fe2c0bdd6993b830)) +* unify player actions icons ([7d2382d](https://github.com/RSSNext/follow/commit/7d2382d56bf4b4186e566191cbbb1662a6a15d30)) +* 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 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)) +* update unread dot style ([e2fef01](https://github.com/RSSNext/follow/commit/e2fef01d2c374f720a6ff4b265344c828f8b80ba)) +* updater should closes all window first ([7cb1a94](https://github.com/RSSNext/follow/commit/7cb1a94a15383e3190c37d3fea9ff0ff5a97dfd5)) +* upgrade tip when player open ([033831b](https://github.com/RSSNext/follow/commit/033831bdab0a85a2f1f02af85c6da2278e40de5e)) +* upload sentry sourcemap ([b23365f](https://github.com/RSSNext/follow/commit/b23365faad9927826140948b642c0caca542f135)) +* use feed enabled condition ([9726d43](https://github.com/RSSNext/follow/commit/9726d4396673e2be02c60ce049ed07c5bf978380)) +* use official embed player in bilibili video when use web ([#219](https://github.com/RSSNext/follow/issues/219)) ([9177a34](https://github.com/RSSNext/follow/commit/9177a349e087cdc60b22e2338146caaefd377694)) +* user button color in dark mode ([04e3c38](https://github.com/RSSNext/follow/commit/04e3c386c5699e6b0907de2a98701668fc7f278b)) +* 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)) +* video preview ([e38820c](https://github.com/RSSNext/follow/commit/e38820c1aa2294f45e05d331bf4bce0e4d8efb44)) +* view icon color in dark mode ([991bff7](https://github.com/RSSNext/follow/commit/991bff7660e93b872f1398c89c0fe4316f4327d9)) +* virtuosoitem height zero issue ([3c5c7ba](https://github.com/RSSNext/follow/commit/3c5c7babc9b3f83ef89ef1007f25d7b3ccb8f6a1)) +* wait language load then switch to target language ([bbe4ea6](https://github.com/RSSNext/follow/commit/bbe4ea66e75a8911e9ef39764d02d22251ba743e)) +* wallet table latyout ([6c60dd2](https://github.com/RSSNext/follow/commit/6c60dd265245d08d622c59d035d2124285ff68f1)) +* **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 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)) +* 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)) +* zero tipUsers ([7f994d7](https://github.com/RSSNext/follow/commit/7f994d7a21080468cb07908b4b8fc694ebfeba37)) + ### Features -- 10x token ([#354](https://github.com/RSSNext/follow/issues/354)) ([9088aea](https://github.com/RSSNext/follow/commit/9088aea6517b71fcd2ed387358fb9e8e97a962a9)) -- active entry when the entry modal is present ([1dc6160](https://github.com/RSSNext/follow/commit/1dc6160b972ba9baa7fdd2a5e90882a9cdd92b48)) -- add biz user info on sentry tracker ([e3e52ab](https://github.com/RSSNext/follow/commit/e3e52abedeb5507ca71d663faa7ef050b661cf0a)) -- 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)) -- add fallback action when add feed failed ([5ad8acf](https://github.com/RSSNext/follow/commit/5ad8acf4c0253a6a924c5a37bb00828e118ad8c5)) -- add fallback image tip ([c244aab](https://github.com/RSSNext/follow/commit/c244aab0b77b2a143c4802552de486526e96f513)) -- add guess code lang option ([cbd8a72](https://github.com/RSSNext/follow/commit/cbd8a722b2940c4ad9092bfe4e08f850b8bc7c5d)) -- add i18n detector ([7eb8a32](https://github.com/RSSNext/follow/commit/7eb8a322c78c7e075ed842036971e9aa5f094341)) -- add link parser for audio timestamp navigate ([1478fa5](https://github.com/RSSNext/follow/commit/1478fa5a9343384f45a57431d029480a96b8441c)) -- add manual setting lang lock keyu ([b9c6a8b](https://github.com/RSSNext/follow/commit/b9c6a8b58099c86a178494ffe4c875f7c31760a3)) -- add og image, fixed [#242](https://github.com/RSSNext/follow/issues/242) ([5d4e958](https://github.com/RSSNext/follow/commit/5d4e9586569e4afe212138d2001ed9007ce9950b)) -- add player download src ([fc50751](https://github.com/RSSNext/follow/commit/fc5075139f2f82a66c703349a719927c35b11b09)) -- add preview image bottom indicator ([bbc1591](https://github.com/RSSNext/follow/commit/bbc15913e8a1afd148c4c70a8056c64d46587791)) -- add readability action rules ([5e8fb17](https://github.com/RSSNext/follow/commit/5e8fb17f4a849abd755d92d32d3e5e1a76a2d2ab)) -- add reason debug for response error toast ([7d4260a](https://github.com/RSSNext/follow/commit/7d4260a614e678ae40c04630840e870db1298830)) -- add setting user profile avatar preview ([2412d59](https://github.com/RSSNext/follow/commit/2412d59e3e91b327af102cc9f006e1022fa3b69e)) -- add show all when filtered media mode ([38c21da](https://github.com/RSSNext/follow/commit/38c21dae11b84d1cb493078f999c7dac9b72d348)) -- add theme in user dropmemu ([f254e14](https://github.com/RSSNext/follow/commit/f254e144ed6172f11250f3fd9bcbca3fbfc02add)) -- add tts ([#215](https://github.com/RSSNext/follow/issues/215)) ([b9fecc4](https://github.com/RSSNext/follow/commit/b9fecc46bf523a0ad07a9a9dc26adf40287f7653)) -- add view feed url on exteral feed url ([0a61fa3](https://github.com/RSSNext/follow/commit/0a61fa37c3df29b686c937f802202534ba79d602)) -- ai daily in article content column ([a625d04](https://github.com/RSSNext/follow/commit/a625d04328ea209ead68ce0391a7108cbb2c4e6a)) -- ai daily modal ([67d9559](https://github.com/RSSNext/follow/commit/67d9559229baca34aa3328ba711d0e29def5bb8e)) -- apm ([602f50a](https://github.com/RSSNext/follow/commit/602f50aa1a2b1ad9559ae22c92c599907df0b8cc)) -- auto claim daily `POWER`, and update table style ([ca381ce](https://github.com/RSSNext/follow/commit/ca381cebf81cc745e56fe35811004d89b55609ba)) -- auto enable readability if no content ([27ecfc4](https://github.com/RSSNext/follow/commit/27ecfc4a86f3e35f245c1bca2d1dba57ff7364f2)) -- cache i18n resource to speed up loading time ([b3748cc](https://github.com/RSSNext/follow/commit/b3748ccfe07964c0b7c45f6e29a8225883d1dfa4)) -- cache tips for feed claim ([b307553](https://github.com/RSSNext/follow/commit/b3075535d67438cd78ffbe8209da216d8a57f433)) -- cancel hover read when mouse leave quickly ([c5d5fc2](https://github.com/RSSNext/follow/commit/c5d5fc23193ad5faa30903113f1df1056c508fc4)) -- clear autocompletion ([1118870](https://github.com/RSSNext/follow/commit/1118870c9e288d868b7a98fb085da1915043101d)) -- clickable entry id in ai daily ([0ffe1e5](https://github.com/RSSNext/follow/commit/0ffe1e5b6d74f9ad09775b9100fef2e53d3a6595)) -- compatible with feeds without siteURL ([87dc225](https://github.com/RSSNext/follow/commit/87dc2251b42a96628bdcb9cdcd36c998a8829c5e)) -- context sub menu ([2d18c53](https://github.com/RSSNext/follow/commit/2d18c53de0cb8c99336d0e915941b1fdee36df98)) -- copy logo svg ([512699c](https://github.com/RSSNext/follow/commit/512699c07080f3064f984f23a21e28356ef9fcc0)) -- 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)) -- display a tip button and tip users at the bottom of the entry content. ([971f81d](https://github.com/RSSNext/follow/commit/971f81d25d5745748884dcc96a1a072aee3d3dbb)) -- display claimed feed list in settings ([d9ae277](https://github.com/RSSNext/follow/commit/d9ae277cfa861c4e558542820896bde821341dc4)) -- display feed certification in discover result ([425b8c3](https://github.com/RSSNext/follow/commit/425b8c3003b552215350d534640e18512e9d819b)) -- display power purchase and tx ([dbe7aee](https://github.com/RSSNext/follow/commit/dbe7aee9151ee04147edbce7d34e1275edfc1254)) -- double click to video fullscreen ([c066820](https://github.com/RSSNext/follow/commit/c066820ce8baeed808b788e9c780f75c53ba8909)) -- dynamic update relative time ([744422f](https://github.com/RSSNext/follow/commit/744422fc12050e09d3cb147c2affe5e95af2056b)) -- electron about redirect to app setting about, and add some other action ([159a11d](https://github.com/RSSNext/follow/commit/159a11da67affde5dcd220ed4ea192d34d0c0884)) -- 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)) -- external page i18n ([8d8aa09](https://github.com/RSSNext/follow/commit/8d8aa09230eb5ddd55dffe074b20c9ed81e84a99)) -- extract i18n text ([8454691](https://github.com/RSSNext/follow/commit/8454691e221d2f8544b2b741dbaeaf95303abc51)) -- fade in when image loaded ([8ba0498](https://github.com/RSSNext/follow/commit/8ba0498b5ca408e713db8e9fb186276537581f45)) -- feed action add mark all as read ([7b72ef2](https://github.com/RSSNext/follow/commit/7b72ef211b962fc112647a34b10b815cf1b611ae)) -- feed claim indicator ([85d8e22](https://github.com/RSSNext/follow/commit/85d8e226fbc7abe56d135cbf3afb2beffe076f13)) -- feed form data prefetch from store ([7525130](https://github.com/RSSNext/follow/commit/75251307827c07c697c6c39b7485280759db25af)) -- flip for power claim toast ([7469ed2](https://github.com/RSSNext/follow/commit/7469ed243376a13d9bcb463d6d6af445293d7b97)) -- follow feed by feed id ([30d1851](https://github.com/RSSNext/follow/commit/30d1851e3aefcc2da06981537627ccd415bb082c)) -- guess code language ([03ba85a](https://github.com/RSSNext/follow/commit/03ba85a37302d41f3403d629849b1b4d3db915ba)) -- hoverable translation design, fixes [#268](https://github.com/RSSNext/follow/issues/268) ([3ff11dc](https://github.com/RSSNext/follow/commit/3ff11dce35061de2b784621519eee79f87a93993)) -- i18n for user profile ([d81c2b5](https://github.com/RSSNext/follow/commit/d81c2b5791fcf1284809b68dd68b4067581cdb44)) -- i18n generator ([d20ef05](https://github.com/RSSNext/follow/commit/d20ef05794dd6872cf553c11948172655275818a)) -- **i18n:** add French language support ([#409](https://github.com/RSSNext/follow/issues/409)) ([4197824](https://github.com/RSSNext/follow/commit/4197824a25f6b77a5d1f22489b6d9c76587eb392)) -- **i18n:** add Japanese language support ([#404](https://github.com/RSSNext/follow/issues/404)) ([6a8b243](https://github.com/RSSNext/follow/commit/6a8b243c3338a7c866383afb9e4ff845d7d2389a)) -- **i18n:** add Portuguese language support ([#406](https://github.com/RSSNext/follow/issues/406)) ([d624c43](https://github.com/RSSNext/follow/commit/d624c43d1b9efabd927db4ff9af79afe009cf9a0)) -- **i18n:** add zh-CN i18n for external page ([#399](https://github.com/RSSNext/follow/issues/399)) ([49a5c50](https://github.com/RSSNext/follow/commit/49a5c50236d51c3c728bb51cd19f34915291e59a)) -- **i18n:** fill out and optimized partial Chinese translations ([#431](https://github.com/RSSNext/follow/issues/431)) ([5f87190](https://github.com/RSSNext/follow/commit/5f87190f018fea7f34c3ccbfad081fd8b855f5b8)) -- **i18n:** improve zh-CN ([#410](https://github.com/RSSNext/follow/issues/410)) ([0b0304e](https://github.com/RSSNext/follow/commit/0b0304eaa1dfa8396e78612a9a6a50653ce9669e)) -- **i18n:** Simplified Chinese (partial) ([#353](https://github.com/RSSNext/follow/issues/353)) ([140d01a](https://github.com/RSSNext/follow/commit/140d01a521a472b56f420585f57b577727dee996)) -- ignore feed errors within 9 hours ([b71926e](https://github.com/RSSNext/follow/commit/b71926ec286b77dd1b9fc25df459176063b194da)) -- 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)) -- improve shiki code block renderer and show language ([590d9cb](https://github.com/RSSNext/follow/commit/590d9cbb94a63f843d00bf54848bba40157d2452)) -- integration settings page ([f9f1938](https://github.com/RSSNext/follow/commit/f9f19386b28e853eb03b3ca5bae629d4f6542cb3)) -- invitation limitation message ([fa37a0c](https://github.com/RSSNext/follow/commit/fa37a0ca2c8235fb5fd47f96c26de7fdcd762ad8)) -- invitations page ([0fc1110](https://github.com/RSSNext/follow/commit/0fc1110e3b1e067a02a65ba7afe5b1456bb76815)) -- invitations page tips ([18de381](https://github.com/RSSNext/follow/commit/18de381343d58f19a36fa6e681711fe06c07b1c1)) -- invitations tips and confirm modal ([c919e59](https://github.com/RSSNext/follow/commit/c919e5907bae4303b667d6cff39c19ebbf6a4dc6)) -- kbd and shoutcuts modal ([4fcacbf](https://github.com/RSSNext/follow/commit/4fcacbfd66affbe0bbd9c0fbf02dfe135adf2994)) -- kbd interactive when user keydown ([b0bf5a1](https://github.com/RSSNext/follow/commit/b0bf5a1438fbf1feb67c655b41b5bdf26a7b0537)) -- **kbd:** simulate key press ([db2cd99](https://github.com/RSSNext/follow/commit/db2cd99f7135cef3d43483cd6e6aa91d7faa7280)) -- language indicator ([bf7da04](https://github.com/RSSNext/follow/commit/bf7da0431fdffc45cf0136b9e5709bb1952f1036)) -- larger text for date item ([c1ea43f](https://github.com/RSSNext/follow/commit/c1ea43fee280bf539d61b1f3c439a7031cf4ed3e)) -- lighter unread number ([e7dba4f](https://github.com/RSSNext/follow/commit/e7dba4f18e8a078889e7923d1760cb08c29873fc)) -- load archived entries ([d7f4bb6](https://github.com/RSSNext/follow/commit/d7f4bb6b9f388849565a7d8fc21d2eafc0610d08)) -- loading component new design ([91d0d76](https://github.com/RSSNext/follow/commit/91d0d76efecab753f1c0ff574c0982d45e29eece)) -- loading indicator in external pages ([a931e85](https://github.com/RSSNext/follow/commit/a931e8509126c62f206ffe286b4b592cf4fb9035)) -- make social media text can selectable ([72c4d6b](https://github.com/RSSNext/follow/commit/72c4d6b83f7a7fe95b2cb505790cb75b38080b93)) -- mark all as read new design ([11577dd](https://github.com/RSSNext/follow/commit/11577dd74040164ab7cd5190778cbe32022852ac)) -- mark all flat button ([0611470](https://github.com/RSSNext/follow/commit/0611470551bde66bcc1fca6feae6e0005f0640cd)) -- mark read doesn't require manual confirmation if hotkey called, fixed [#293](https://github.com/RSSNext/follow/issues/293) ([6ce06be](https://github.com/RSSNext/follow/commit/6ce06be58d9c5017c77b774cc53fa6076167d563)) -- mark read for cateogry in ctx menu ([da79f1c](https://github.com/RSSNext/follow/commit/da79f1c2783fa65f164aaf4942ebfa2156b4bf26)) -- markdown heading render ([f3ac1ac](https://github.com/RSSNext/follow/commit/f3ac1ac3c6e2c36203288921f0ea8c3635eec539)) -- modal resize and draggable to absolute position ([aad5eba](https://github.com/RSSNext/follow/commit/aad5eba2edb66039d123e9e60e484b55d9a037df)) -- more i18n text ([6f8acce](https://github.com/RSSNext/follow/commit/6f8acced7bc51d2bb22325506e1c9bc97ee963f7)) -- navigator bar ([56750fd](https://github.com/RSSNext/follow/commit/56750fd1722eaca7416e5c8617fb501fcf055cac)) -- new design for mark read in date item ([e5b0583](https://github.com/RSSNext/follow/commit/e5b0583d38e41d81663bec1ee16e0c24cb385d7a)) -- new platform icons ([7513130](https://github.com/RSSNext/follow/commit/7513130c17c501f3e2d7c29fc13e2315edb4dc8c)) -- 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)) -- 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)) -- optimize daily report and report modal for social media ([252962c](https://github.com/RSSNext/follow/commit/252962c188e29293f4b6baca2e99568a064f79f4)) -- optimize the style of the profile to maximize the presentation of the content ([96769fb](https://github.com/RSSNext/follow/commit/96769fbe49eb68ea09f1307ac27d0c0d904d0abf)) -- parse newsletter embedded `