From 94eb966d65019da602762d8f5e963251c6768fb1 Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Sat, 1 Feb 2025 14:04:55 +0800 Subject: [PATCH 01/25] feat: add tooltip component and integrate it into ServerDetailOverview --- bun.lockb | Bin 201239 -> 202629 bytes package.json | 11 ++++---- src/components/ServerDetailOverview.tsx | 32 ++++++++++++++++-------- src/components/ui/tooltip.tsx | 27 ++++++++++++++++++++ 4 files changed, 54 insertions(+), 16 deletions(-) create mode 100644 src/components/ui/tooltip.tsx diff --git a/bun.lockb b/bun.lockb index 1afa12cfafe0507cbe35eb15a8c58e7f77b6a737..495ab1bf06dd6bd40a29a298c5e689490d75880d 100755 GIT binary patch delta 35522 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 delta 34799 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 JuvV3u{{;<}L*oDd diff --git a/package.json b/package.json index 3b17f66..95a75a8 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,9 @@ "@radix-ui/react-separator": "^1.1.1", "@radix-ui/react-slot": "^1.1.1", "@radix-ui/react-switch": "^1.1.2", - "@tanstack/react-query": "^5.65.1", - "@tanstack/react-query-devtools": "^5.65.1", + "@radix-ui/react-tooltip": "^1.1.7", + "@tanstack/react-query": "^5.66.0", + "@tanstack/react-query-devtools": "^5.66.0", "@tanstack/react-table": "^8.20.6", "@trivago/prettier-plugin-sort-imports": "^5.2.2", "@types/d3-geo": "^3.1.0", @@ -46,15 +47,15 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "react-i18next": "^15.4.0", - "react-router-dom": "^7.1.3", + "react-router-dom": "^7.1.5", "recharts": "^2.15.1", - "sonner": "^1.7.3", + "sonner": "^1.7.4", "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.7" }, "devDependencies": { "@eslint/js": "^9.19.0", - "@types/node": "^22.12.0", + "@types/node": "^22.13.0", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react-swc": "^3.7.2", diff --git a/src/components/ServerDetailOverview.tsx b/src/components/ServerDetailOverview.tsx index b1ccc85..8f3d536 100644 --- a/src/components/ServerDetailOverview.tsx +++ b/src/components/ServerDetailOverview.tsx @@ -14,6 +14,7 @@ import { useTranslation } from "react-i18next" import { useNavigate } from "react-router-dom" import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "./ui/accordion" +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./ui/tooltip" export default function ServerDetailOverview({ server_id }: { server_id: string }) { const { t } = useTranslation() @@ -165,17 +166,26 @@ export default function ServerDetailOverview({ server_id }: { server_id: string ) : null} {country_code && ( - - -
-

{t("serverDetail.region")}

-
-
{countries.getName(country_code?.toUpperCase(), "en")}
- {country_code && } -
-
-
-
+ + + + + +
+

{t("serverDetail.region")}

+
+
{country_code?.toUpperCase()}
+ {country_code && } +
+
+
+
+
+ +

{countries.getName(country_code?.toUpperCase(), "en")}

+
+
+
)}
diff --git a/src/components/ui/tooltip.tsx b/src/components/ui/tooltip.tsx new file mode 100644 index 0000000..79c7188 --- /dev/null +++ b/src/components/ui/tooltip.tsx @@ -0,0 +1,27 @@ +import { cn } from "@/lib/utils" +import * as TooltipPrimitive from "@radix-ui/react-tooltip" +import * as React from "react" + +const TooltipProvider = TooltipPrimitive.Provider + +const Tooltip = TooltipPrimitive.Root + +const TooltipTrigger = TooltipPrimitive.Trigger + +const TooltipContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + +)) +TooltipContent.displayName = TooltipPrimitive.Content.displayName + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } From 0f81ef2f251271cd11815c9b35f4296018d70280 Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Sat, 1 Feb 2025 19:10:04 +0800 Subject: [PATCH 02/25] feat: enhance ServiceTracker with detailed uptime and delay visualization --- src/components/ServiceTracker.tsx | 14 ++-- src/components/ServiceTrackerClient.tsx | 90 +++++++++++++++++++++---- src/locales/en/translation.json | 1 + src/locales/zh-CN/translation.json | 5 +- src/locales/zh-TW/translation.json | 5 +- 5 files changed, 93 insertions(+), 22 deletions(-) diff --git a/src/components/ServiceTracker.tsx b/src/components/ServiceTracker.tsx index 4efbb2f..a49a4d5 100644 --- a/src/components/ServiceTracker.tsx +++ b/src/components/ServiceTracker.tsx @@ -19,10 +19,16 @@ export function ServiceTracker({ serverList }: { serverList: NezhaServer[] }) { }) const processServiceData = (serviceData: ServiceData) => { - const days = serviceData.up.map((up, index) => ({ - completed: up > serviceData.down[index], - date: new Date(Date.now() - (29 - index) * 24 * 60 * 60 * 1000), - })) + const days = serviceData.up.map((up, index) => { + const totalChecks = up + serviceData.down[index] + const dailyUptime = totalChecks > 0 ? (up / totalChecks) * 100 : 0 + return { + completed: up > serviceData.down[index], + date: new Date(Date.now() - (29 - index) * 24 * 60 * 60 * 1000), + uptime: dailyUptime, + delay: serviceData.delay[index] || 0 + } + }) const totalUp = serviceData.up.reduce((a, b) => a + b, 0) const totalChecks = serviceData.up.reduce((a, b) => a + b, 0) + serviceData.down.reduce((a, b) => a + b, 0) diff --git a/src/components/ServiceTrackerClient.tsx b/src/components/ServiceTrackerClient.tsx index dfc5376..47e2fde 100644 --- a/src/components/ServiceTrackerClient.tsx +++ b/src/components/ServiceTrackerClient.tsx @@ -1,13 +1,20 @@ import { cn } from "@/lib/utils" import React from "react" import { useTranslation } from "react-i18next" - +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip" import { Separator } from "./ui/separator" interface ServiceTrackerProps { days: Array<{ completed: boolean date?: Date + uptime: number + delay: number }> className?: string title?: string @@ -18,6 +25,25 @@ interface ServiceTrackerProps { export const ServiceTrackerClient: React.FC = ({ days, className, title, uptime = 100, avgDelay = 0 }) => { const { t } = useTranslation() const customBackgroundImage = (window.CustomBackgroundImage as string) !== "" ? window.CustomBackgroundImage : undefined + + const getUptimeColor = (uptime: number) => { + if (uptime >= 99) return "text-emerald-500" + if (uptime >= 95) return "text-amber-500" + return "text-rose-500" + } + + const getDelayColor = (delay: number) => { + if (delay < 100) return "text-emerald-500" + if (delay < 300) return "text-amber-500" + return "text-rose-500" + } + + const getStatusColor = (uptime: number) => { + if (uptime >= 99) return "bg-emerald-500" + if (uptime >= 95) return "bg-amber-500" + return "bg-rose-500" + } + return (
= ({ days, clas >
-
-
-
+
{title}
-
- {avgDelay.toFixed(0)}ms - - +
+ + {avgDelay.toFixed(0)}ms + + + {uptime.toFixed(1)}% {t("serviceTracker.uptime")}
-
+
{days.map((day, index) => ( -
+ + + +
+ + +
+

{day.date?.toLocaleDateString()}

+
+
+ {t("serviceTracker.uptime")}: + 95 ? "text-green-500" : "text-red-500")}> + {day.uptime.toFixed(1)}% + +
+
+ {t("serviceTracker.delay")}: + + {day.delay.toFixed(0)}ms + +
+
+
+
+ + ))}
diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index f88943e..f261519 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -46,6 +46,7 @@ "serviceTracker": { "noService": "No service data", "uptime": "Uptime", + "delay": "Delay", "daysAgo": "days ago", "today": "Today", "loading": "Loading..." diff --git a/src/locales/zh-CN/translation.json b/src/locales/zh-CN/translation.json index 9fd23d9..6047bd1 100644 --- a/src/locales/zh-CN/translation.json +++ b/src/locales/zh-CN/translation.json @@ -44,8 +44,9 @@ "nextUpdate": "下次更新" }, "serviceTracker": { - "noService": "没有服务监测数据", - "uptime": "可用率", + "noService": "无服务数据", + "uptime": "在线率", + "delay": "延迟", "daysAgo": "天前", "today": "今天", "loading": "加载中..." diff --git a/src/locales/zh-TW/translation.json b/src/locales/zh-TW/translation.json index 51f2ddb..c60cfb9 100644 --- a/src/locales/zh-TW/translation.json +++ b/src/locales/zh-TW/translation.json @@ -44,8 +44,9 @@ "nextUpdate": "下次更新" }, "serviceTracker": { - "noService": "沒有服務監控數據", - "uptime": "可用率", + "noService": "無服務數據", + "uptime": "在線率", + "delay": "延遲", "daysAgo": "天前", "today": "今天", "loading": "載入中..." From 48dbf85bcab3f6552509425da38e224fea61ed30 Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Sat, 1 Feb 2025 19:39:23 +0800 Subject: [PATCH 03/25] refactor: improve CycleTransferStats and ServiceTracker UI components --- src/components/CycleTransferStats.tsx | 2 +- src/components/CycleTransferStatsClient.tsx | 71 ++++++++++----------- src/components/ServiceTracker.tsx | 2 +- src/components/ServiceTrackerClient.tsx | 33 ++++------ 4 files changed, 47 insertions(+), 61 deletions(-) diff --git a/src/components/CycleTransferStats.tsx b/src/components/CycleTransferStats.tsx index 814fafb..a1ad817 100644 --- a/src/components/CycleTransferStats.tsx +++ b/src/components/CycleTransferStats.tsx @@ -17,7 +17,7 @@ export const CycleTransferStatsCard: React.FC = ({ serv const serverIdList = serverList.map((server) => server.id.toString()) return ( -
+
{Object.entries(cycleStats).map(([cycleId, cycleData]) => { if (!cycleData.server_name) { return null diff --git a/src/components/CycleTransferStatsClient.tsx b/src/components/CycleTransferStatsClient.tsx index 85419ca..476186f 100644 --- a/src/components/CycleTransferStatsClient.tsx +++ b/src/components/CycleTransferStatsClient.tsx @@ -1,11 +1,8 @@ import { formatBytes } from "@/lib/format" import { cn } from "@/lib/utils" -import { CircleStackIcon } from "@heroicons/react/24/outline" import React from "react" import { useTranslation } from "react-i18next" -import AnimatedCircularProgressBar from "./ui/animated-circular-progress-bar" - interface CycleTransferStatsClientProps { name: string from: string @@ -26,7 +23,7 @@ export const CycleTransferStatsClient: React.FC = return (
= const progress = (transfer / max) * 100 return ( -
-
-
{name}
- - {new Date(from).toLocaleDateString()} - {new Date(to).toLocaleDateString()} - -
- -
-
- - {serverName} -
-
-

{progress.toFixed(0)}%

- -
-
- -
-
+
+ {/* Header */} +
+ {serverName} +
{name}
-
- - {formatBytes(transfer)} {t("cycleTransfer.used")} - - - {formatBytes(max)} {t("cycleTransfer.total")} - -
- -
-
- {t("cycleTransfer.nextUpdate")}: {new Date(nextUpdate).toLocaleString()} + {/* Progress Section */} +
+
+
+ {formatBytes(transfer)} + / {formatBytes(max)} +
+ {progress.toFixed(1)}%
-
+ +
+
+
+
+
+ + {/* Footer */} +
+ + {new Date(from).toLocaleDateString()} - {new Date(to).toLocaleDateString()} + + + {t("cycleTransfer.nextUpdate")}: {new Date(nextUpdate).toLocaleString()} + +
) })} diff --git a/src/components/ServiceTracker.tsx b/src/components/ServiceTracker.tsx index a49a4d5..2d96695 100644 --- a/src/components/ServiceTracker.tsx +++ b/src/components/ServiceTracker.tsx @@ -26,7 +26,7 @@ export function ServiceTracker({ serverList }: { serverList: NezhaServer[] }) { completed: up > serviceData.down[index], date: new Date(Date.now() - (29 - index) * 24 * 60 * 60 * 1000), uptime: dailyUptime, - delay: serviceData.delay[index] || 0 + delay: serviceData.delay[index] || 0, } }) diff --git a/src/components/ServiceTrackerClient.tsx b/src/components/ServiceTrackerClient.tsx index 47e2fde..b18afaf 100644 --- a/src/components/ServiceTrackerClient.tsx +++ b/src/components/ServiceTrackerClient.tsx @@ -1,12 +1,8 @@ +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip" import { cn } from "@/lib/utils" import React from "react" import { useTranslation } from "react-i18next" -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from "@/components/ui/tooltip" + import { Separator } from "./ui/separator" interface ServiceTrackerProps { @@ -60,17 +56,9 @@ export const ServiceTrackerClient: React.FC = ({ days, clas {title}
- - {avgDelay.toFixed(0)}ms - + {avgDelay.toFixed(0)}ms - + {uptime.toFixed(1)}% {t("serviceTracker.uptime")}
@@ -88,7 +76,7 @@ export const ServiceTrackerClient: React.FC = ({ days, clas "after:absolute after:inset-0 after:rounded-[4px] after:shadow-[inset_0_1px_theme(colors.white/10%)]", day.completed ? "bg-gradient-to-b from-green-500/90 to-green-600 shadow-[0_1px_2px_theme(colors.green.600/30%)]" - : "bg-gradient-to-b from-red-500/80 to-red-600/90 shadow-[0_1px_2px_theme(colors.red.600/30%)]" + : "bg-gradient-to-b from-red-500/80 to-red-600/90 shadow-[0_1px_2px_theme(colors.red.600/30%)]", )} /> @@ -98,13 +86,16 @@ export const ServiceTrackerClient: React.FC = ({ days, clas
{t("serviceTracker.uptime")}: - 95 ? "text-green-500" : "text-red-500")}> - {day.uptime.toFixed(1)}% - + 95 ? "text-green-500" : "text-red-500")}>{day.uptime.toFixed(1)}%
{t("serviceTracker.delay")}: - + {day.delay.toFixed(0)}ms
From a8888b9ca6761d294ed49ca675511ae9345f675a Mon Sep 17 00:00:00 2001 From: kjch <1834423612@qq.com> Date: Mon, 3 Feb 2025 14:24:30 -0500 Subject: [PATCH 04/25] fix: update button color styles in Server Page for improved visual clarity --- src/pages/Server.tsx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/pages/Server.tsx b/src/pages/Server.tsx index db37c74..76827b4 100644 --- a/src/pages/Server.tsx +++ b/src/pages/Server.tsx @@ -214,9 +214,10 @@ export default function Servers() { setShowMap(showMap === "0" ? "1" : "0") }} className={cn( - "rounded-[50px] text-white cursor-pointer [text-shadow:_0_1px_0_rgb(0_0_0_/_20%)] bg-blue-600 p-[10px] transition-all shadow-[inset_0_1px_0_rgba(255,255,255,0.2)] ", + "rounded-[50px] cursor-pointer [text-shadow:_0_1px_0_rgb(0_0_0_/_20%)] p-[10px] transition-all shadow-[inset_0_1px_0_rgba(255,255,255,0.2)] border-2", { - "shadow-[inset_0_1px_0_rgba(0,0,0,0.2)] bg-blue-500": showMap === "1", + "text-white bg-blue-500 border-blue-500": showMap === "1", + "text-blue-700 border-blue-700 bg-gray-200": showMap === "0", }, { "bg-opacity-70": customBackgroundImage, @@ -231,9 +232,10 @@ export default function Servers() { localStorage.setItem("showServices", showServices === "0" ? "1" : "0") }} className={cn( - "rounded-[50px] text-white cursor-pointer [text-shadow:_0_1px_0_rgb(0_0_0_/_20%)] bg-blue-600 p-[10px] transition-all shadow-[inset_0_1px_0_rgba(255,255,255,0.2)] ", + "rounded-[50px] cursor-pointer [text-shadow:_0_1px_0_rgb(0_0_0_/_20%)] p-[10px] transition-all shadow-[inset_0_1px_0_rgba(255,255,255,0.2)] border-2", { - "shadow-[inset_0_1px_0_rgba(0,0,0,0.2)] bg-blue-500": showServices === "1", + "text-white bg-blue-500 border-blue-500": showServices === "1", + "text-blue-700 border-blue-700 bg-gray-200": showServices === "0", }, { "bg-opacity-70": customBackgroundImage, @@ -248,9 +250,10 @@ export default function Servers() { localStorage.setItem("inline", inline === "0" ? "1" : "0") }} className={cn( - "rounded-[50px] text-white cursor-pointer [text-shadow:_0_1px_0_rgb(0_0_0_/_20%)] bg-blue-600 p-[10px] transition-all shadow-[inset_0_1px_0_rgba(255,255,255,0.2)] ", + "rounded-[50px] cursor-pointer [text-shadow:_0_1px_0_rgb(0_0_0_/_20%)] p-[10px] transition-all shadow-[inset_0_1px_0_rgba(255,255,255,0.2)] border-2", { - "shadow-[inset_0_1px_0_rgba(0,0,0,0.2)] bg-blue-500": inline === "1", + "text-white bg-blue-500 border-blue-500": inline === "1", + "text-blue-700 border-blue-700 bg-gray-200": inline === "0", }, { "bg-opacity-70": customBackgroundImage, From 8ddf26861f8021a4d8ba29d5427dbb19d23c3b09 Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Tue, 4 Feb 2025 14:41:53 +0800 Subject: [PATCH 05/25] feat: improve Server page button styling with dark mode support --- src/pages/Server.tsx | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/pages/Server.tsx b/src/pages/Server.tsx index 76827b4..4e4bd82 100644 --- a/src/pages/Server.tsx +++ b/src/pages/Server.tsx @@ -214,17 +214,19 @@ export default function Servers() { setShowMap(showMap === "0" ? "1" : "0") }} className={cn( - "rounded-[50px] cursor-pointer [text-shadow:_0_1px_0_rgb(0_0_0_/_20%)] p-[10px] transition-all shadow-[inset_0_1px_0_rgba(255,255,255,0.2)] border-2", + "rounded-[50px] bg-white dark:bg-stone-800 cursor-pointer p-[10px] transition-all border border-stone-200 dark:border-stone-700 hover:bg-stone-100 dark:hover:bg-stone-700", { - "text-white bg-blue-500 border-blue-500": showMap === "1", - "text-blue-700 border-blue-700 bg-gray-200": showMap === "0", + "!bg-blue-500 hover:!bg-blue-600 border-blue-600 dark:border-blue-600": showMap === "1", + "text-white": showMap === "1", }, { - "bg-opacity-70": customBackgroundImage, + "bg-opacity-70 dark:bg-opacity-70": customBackgroundImage, }, )} > - +
From 3b7b5ffa8c3494350c7b5f9d28ea2d96e627b7d7 Mon Sep 17 00:00:00 2001 From: hamster1963 <71394853+hamster1963@users.noreply.github.com> Date: Tue, 4 Feb 2025 07:23:16 +0000 Subject: [PATCH 06/25] chore: auto-fix linting and formatting issues --- src/pages/Server.tsx | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/pages/Server.tsx b/src/pages/Server.tsx index 4e4bd82..e860eae 100644 --- a/src/pages/Server.tsx +++ b/src/pages/Server.tsx @@ -224,9 +224,11 @@ export default function Servers() { }, )} > - +
From ee0eee378bd04f1d0c12a2ced320d96d250582d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=93=E9=BC=A0?= <71394853+hamster1963@users.noreply.github.com> Date: Tue, 4 Feb 2025 15:29:45 +0800 Subject: [PATCH 07/25] chore: update project dependencies to latest versions (#31) * chore: update project dependencies to latest versions * test: lint * chore: auto-fix linting and formatting issues --- bun.lockb | Bin 202629 -> 202630 bytes package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lockb b/bun.lockb index 495ab1bf06dd6bd40a29a298c5e689490d75880d..9cf11c376e759e29702a7508ad50b3ae009fb0ff 100755 GIT binary patch delta 13307 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 delta 13321 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 Date: Tue, 4 Feb 2025 19:48:59 +0800 Subject: [PATCH 08/25] feat: add global configuration flags for services, card layout, and map display --- src/hooks/use-background.ts | 3 +++ src/pages/Server.tsx | 18 ++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/hooks/use-background.ts b/src/hooks/use-background.ts index addcac0..88c03d8 100644 --- a/src/hooks/use-background.ts +++ b/src/hooks/use-background.ts @@ -4,6 +4,9 @@ declare global { interface Window { CustomBackgroundImage: string CustomMobileBackgroundImage: string + ForceShowServices: boolean + ForceCardInline: boolean + ForceShowMap: boolean } } diff --git a/src/pages/Server.tsx b/src/pages/Server.tsx index e860eae..0c90eb9 100644 --- a/src/pages/Server.tsx +++ b/src/pages/Server.tsx @@ -53,18 +53,31 @@ export default function Servers() { useEffect(() => { const showServicesState = localStorage.getItem("showServices") - if (showServicesState !== null) { + if (window.ForceShowServices) { + setShowServices("1") + } else if (showServicesState !== null) { setShowServices(showServicesState) } }, []) useEffect(() => { const inlineState = localStorage.getItem("inline") - if (inlineState !== null) { + if (window.ForceCardInline) { + setInline("1") + } else if (inlineState !== null) { setInline(inlineState) } }, []) + useEffect(() => { + const showMapState = localStorage.getItem("showMap") + if (window.ForceShowMap) { + setShowMap("1") + } else if (showMapState !== null) { + setShowMap(showMapState) + } + }, []) + useEffect(() => { const savedGroup = sessionStorage.getItem("selectedGroup") || "All" setCurrentGroup(savedGroup) @@ -212,6 +225,7 @@ export default function Servers() {
From 681bcaadd57ac400dbb369458b39329d9caf887f Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Thu, 6 Feb 2025 13:41:00 +0800 Subject: [PATCH 10/25] refactor: update Server page button active state color to blue-600 --- src/pages/Server.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/Server.tsx b/src/pages/Server.tsx index 0c90eb9..a5b814f 100644 --- a/src/pages/Server.tsx +++ b/src/pages/Server.tsx @@ -230,7 +230,7 @@ export default function Servers() { className={cn( "rounded-[50px] bg-white dark:bg-stone-800 cursor-pointer p-[10px] transition-all border border-stone-200 dark:border-stone-700 hover:bg-stone-100 dark:hover:bg-stone-700", { - "!bg-blue-500 hover:!bg-blue-600 border-blue-600 dark:border-blue-600": showMap === "1", + "!bg-blue-600 hover:!bg-blue-600 border-blue-600 dark:border-blue-600": showMap === "1", "text-white": showMap === "1", }, { @@ -252,7 +252,7 @@ export default function Servers() { className={cn( "rounded-[50px] bg-white dark:bg-stone-800 cursor-pointer p-[10px] transition-all border border-stone-200 dark:border-stone-700 hover:bg-stone-100 dark:hover:bg-stone-700", { - "!bg-blue-500 hover:!bg-blue-600 border-blue-600 dark:border-blue-600": showServices === "1", + "!bg-blue-600 hover:!bg-blue-600 border-blue-600 dark:border-blue-600": showServices === "1", "text-white": showServices === "1", }, { @@ -274,7 +274,7 @@ export default function Servers() { className={cn( "rounded-[50px] bg-white dark:bg-stone-800 cursor-pointer p-[10px] transition-all border border-stone-200 dark:border-stone-700 hover:bg-stone-100 dark:hover:bg-stone-700", { - "!bg-blue-500 hover:!bg-blue-600 border-blue-600 dark:border-blue-600": inline === "1", + "!bg-blue-600 hover:!bg-blue-600 border-blue-600 dark:border-blue-600": inline === "1", "text-white": inline === "1", }, { From 69e12163ad604fc9cbe20d6d9dc0b5632e6e89d0 Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Thu, 6 Feb 2025 13:50:37 +0800 Subject: [PATCH 11/25] feat: add Radix UI Select component for improved sorting UI --- bun.lockb | Bin 202630 -> 209112 bytes package.json | 1 + src/components/ui/select.tsx | 126 +++++++++++++++++++++++++++++++++++ src/pages/Server.tsx | 76 ++++++++++----------- 4 files changed, 161 insertions(+), 42 deletions(-) create mode 100644 src/components/ui/select.tsx diff --git a/bun.lockb b/bun.lockb index 9cf11c376e759e29702a7508ad50b3ae009fb0ff..59fe87aa5cf54693c9e85fa45ec5206d1dbab3d8 100755 GIT binary patch delta 36797 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 Yu&eWhvP2Y~Q-(64&HjhJP@?<&AL&dlwEzGB diff --git a/package.json b/package.json index 6a93ff4..57e4de1 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "@radix-ui/react-label": "^2.1.1", "@radix-ui/react-popover": "^1.1.5", "@radix-ui/react-progress": "^1.1.1", + "@radix-ui/react-select": "^2.1.6", "@radix-ui/react-separator": "^1.1.1", "@radix-ui/react-slot": "^1.1.1", "@radix-ui/react-switch": "^1.1.2", diff --git a/src/components/ui/select.tsx b/src/components/ui/select.tsx new file mode 100644 index 0000000..f0e62b1 --- /dev/null +++ b/src/components/ui/select.tsx @@ -0,0 +1,126 @@ +import { cn } from "@/lib/utils" +import * as SelectPrimitive from "@radix-ui/react-select" +import { Check, ChevronDown, ChevronUp } from "lucide-react" +import * as React from "react" + +const Select = SelectPrimitive.Root + +const SelectGroup = SelectPrimitive.Group + +const SelectValue = SelectPrimitive.Value + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + span]:line-clamp-1", + className, + )} + {...props} + > + {children} + + + + +)) +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName + +const SelectScrollUpButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName + +const SelectScrollDownButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)) +SelectContent.displayName = SelectPrimitive.Content.displayName + +const SelectLabel = React.forwardRef, React.ComponentPropsWithoutRef>( + ({ className, ...props }, ref) => ( + + ), +) +SelectLabel.displayName = SelectPrimitive.Label.displayName + +const SelectItem = React.forwardRef, React.ComponentPropsWithoutRef>( + ({ className, children, ...props }, ref) => ( + + + + + + + + {children} + + ), +) +SelectItem.displayName = SelectPrimitive.Item.displayName + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ) +SelectSeparator.displayName = SelectPrimitive.Separator.displayName + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +} diff --git a/src/pages/Server.tsx b/src/pages/Server.tsx index a5b814f..891d906 100644 --- a/src/pages/Server.tsx +++ b/src/pages/Server.tsx @@ -7,6 +7,7 @@ import { ServiceTracker } from "@/components/ServiceTracker" import { Loader } from "@/components/loading/Loader" import { Label } from "@/components/ui/label" import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { SORT_ORDERS, SORT_TYPES } from "@/context/sort-context" import { useSort } from "@/hooks/use-sort" import { useStatus } from "@/hooks/use-status" @@ -294,7 +295,7 @@ export default function Servers() { - ))} -
- -
- -
- {SORT_ORDERS.map((order) => ( - - ))} -
-
+ +
+
+ + +
+
+ + +
From 52c7391d57567793b730fec44d807bc24367957e Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Thu, 6 Feb 2025 13:58:12 +0800 Subject: [PATCH 12/25] refactor: enhance Server page toggle buttons with subtle shadow and border styling --- src/pages/Server.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pages/Server.tsx b/src/pages/Server.tsx index 891d906..cc77b93 100644 --- a/src/pages/Server.tsx +++ b/src/pages/Server.tsx @@ -229,9 +229,9 @@ export default function Servers() { localStorage.setItem("showMap", showMap === "0" ? "1" : "0") }} className={cn( - "rounded-[50px] bg-white dark:bg-stone-800 cursor-pointer p-[10px] transition-all border border-stone-200 dark:border-stone-700 hover:bg-stone-100 dark:hover:bg-stone-700", + "rounded-[50px] bg-white dark:bg-stone-800 cursor-pointer p-[10px] transition-all border dark:border-none border-stone-200 dark:border-stone-700 hover:bg-stone-100 dark:hover:bg-stone-700 shadow-[inset_0_1px_0_rgba(255,255,255,0.2)]", { - "!bg-blue-600 hover:!bg-blue-600 border-blue-600 dark:border-blue-600": showMap === "1", + "shadow-[inset_0_1px_0_rgba(0,0,0,0.2)] !bg-blue-600 hover:!bg-blue-600 border-blue-600 dark:border-blue-600": showMap === "1", "text-white": showMap === "1", }, { @@ -251,9 +251,9 @@ export default function Servers() { localStorage.setItem("showServices", showServices === "0" ? "1" : "0") }} className={cn( - "rounded-[50px] bg-white dark:bg-stone-800 cursor-pointer p-[10px] transition-all border border-stone-200 dark:border-stone-700 hover:bg-stone-100 dark:hover:bg-stone-700", + "rounded-[50px] bg-white dark:bg-stone-800 cursor-pointer p-[10px] transition-all border dark:border-none border-stone-200 dark:border-stone-700 hover:bg-stone-100 dark:hover:bg-stone-700 shadow-[inset_0_1px_0_rgba(255,255,255,0.2)]", { - "!bg-blue-600 hover:!bg-blue-600 border-blue-600 dark:border-blue-600": showServices === "1", + "shadow-[inset_0_1px_0_rgba(0,0,0,0.2)] !bg-blue-600 hover:!bg-blue-600 border-blue-600 dark:border-blue-600": showServices === "1", "text-white": showServices === "1", }, { @@ -273,9 +273,9 @@ export default function Servers() { localStorage.setItem("inline", inline === "0" ? "1" : "0") }} className={cn( - "rounded-[50px] bg-white dark:bg-stone-800 cursor-pointer p-[10px] transition-all border border-stone-200 dark:border-stone-700 hover:bg-stone-100 dark:hover:bg-stone-700", + "rounded-[50px] bg-white dark:bg-stone-800 cursor-pointer p-[10px] transition-all border dark:border-none border-stone-200 dark:border-stone-700 hover:bg-stone-100 dark:hover:bg-stone-700 shadow-[inset_0_1px_0_rgba(255,255,255,0.2)]", { - "!bg-blue-600 hover:!bg-blue-600 border-blue-600 dark:border-blue-600": inline === "1", + "shadow-[inset_0_1px_0_rgba(0,0,0,0.2)] !bg-blue-600 hover:!bg-blue-600 border-blue-600 dark:border-blue-600": inline === "1", "text-white": inline === "1", }, { From b298d91aa12abb67f8845e001db42f5ae816d6f0 Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Mon, 10 Feb 2025 17:45:41 +0800 Subject: [PATCH 13/25] chore: update project dependencies to latest minor versions --- bun.lockb | Bin 209112 -> 196552 bytes package.json | 36 ++++++++++++++++++------------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/bun.lockb b/bun.lockb index 59fe87aa5cf54693c9e85fa45ec5206d1dbab3d8..5f3c945b4bb6ff2dd43667eca0c384bbbeebcd4f 100755 GIT binary patch delta 27687 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 by|CA@W1F3HO!3#5FYR?26hC&-dCLDkkWfJ^ delta 34430 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�+J>$D?Y;Tq-i@qU8Z!n3;l^W@pLUzxspF6LDvgo0aRq#L*@_rq}y0_q4^RF}6nieQ+|&( zRwJdWc%NhY2zDj}&Ym8@9*3Z*-lj533=B)tk>XL~LdAzYhAJKQBL{qL1h>VZ4i+*J!MGI-wffd{Qc#+!_|fVwBSodfV2bl5P_N zUUbn5g}}vqNI|3fdTUf_YbrAcg)WZbDjM!G)i|c=Mo|owN3~I#B@I~KA&oVl;Rs*C zA~4Llhw)+mr(=|l8Ot7qqc{F#cT+L^zwcpHKk=p`+13btbD0h>=T(i!Y}#U8XiQ{2 zm@Jmko_S|Xg9DblOL&YH!{no(C{3qdYfrf=2z8IeM7D<}p2tKs6>AS4Igz#QfR@p1 z$5)aTBx`9wD!YUkaTybF2ZvQ`k453~M7E~=pO*L+6WNK#($$SGOkq0h`SJh4`!bf; z?e>^0k`JmWBo)URM50B?<`@FDnn(?Qra~!ZCB*#b-ZB-8W`t;H0&eA zW-4m|l`CA+fnUY*{}*dF4f+4Suifl!B>HS8zH!GbZ0tVyUp$amO8YcgXmzYr&2Hcf zVG$4xW~xIQTi1=(viyf5o9qA0k!^1G|7S-wwk(FP8X-McJYd#Y!x7_KGhuY$(!*6I z?MCVPSI;5)=jRRQxn|SF1z6gzvclq!O_iGw)ii$CKgk7!(Z%3EZ3CU71xU-ooAWpRc@RiE+4y z!e@@pg~uoKE4-GjgJdj(uE|E=T8l2YOs$0Z`Y*4#6yxBj3C8Jv|EddL0ONYB5*@Zw zTPF(V=)&Eca<6!Vm@-!!ik+pI%Dr3=GL?HVAjH(br470N+hv&$Q|={|5TkxcqoA!K zOI;}UdPK-1Z91yjZ}LEC9%)-rX-CS^m~yWO1#2m)E3z93)wY(UnaaJK6Ec;187IV) zdkH4Q48~;?omm`HZLe8cj(Dky-BW+N))g|9dz~!AxWn%%FemNeS!!;UDn{Dpvoz+K zDn{A~v@{0Sw2D73YK4M^&J}M01g-kH(z2kbp)fs!FT$ifRd2hu8QiVvd>>Vev#U(n zb#-N<+~l?vZx(9c8!%5tSA1$RujScwy152rAfI6ho= zsu<_*RH1NE96#K%0?xJyb?5VIICgO*Z&P?>0Y9n|euyh(4_~=3sem8IG1INQ6MMa# z*I;KC@dm8wVtn0KxsZ2Z4Hx2zQx|rAF}|IvwwbTOGBzXSr-ghiHhUA_fOXx>4-~l< zdAtsbS;ALlR$KT_EOiiX!(MOWjac)od{s?n$Mil!*q%aIn7@@bnz^0VWOueBaluyJ z(!f78wpVeV)VQAM%(#HB%W?|&hRlBpo;>cbvw;?r5qLL^zbnU7*N z`Mh3X!=1bnCpx?@4>5z6@|Bp$R=y2;whwp3Y!>o{DBp|a&E&ON?_K;Rv7m;1phoQG zP1(JTXc(B%Vv3z;J)xa)cf;dF4|rQLl}En`7&D&iR5P%W*>Rj?Xt=P};?x2P`%&@Xk4 znclz4Zrs{WxD+jWuOCC(0y)$%^dVi87wGI)DKhb`oDz(`PYkr=0!GgSY3@k{GaY z=YLbzUrbzwlcU z)JU71yQr2#FlF&8hYkxki)WTf4Xi(hwW(D7ctK6oVeXfu#1Y@o5I;Wgx*BwdE7bqY zCvZZLrA)>eiD)_d@dcx!;0teEPK5pMoDqxq%3J=<2?peB{a4v` ujkhhE7;b2>!f$`Nq4Axs`+MRt1!=JS@2G#qVALr5JFi`M<2(O?`~LvegT9{t diff --git a/package.json b/package.json index 57e4de1..f948cf8 100644 --- a/package.json +++ b/package.json @@ -15,18 +15,18 @@ "@fontsource/inter": "^5.1.1", "@heroicons/react": "^2.2.0", "@number-flow/react": "^0.5.5", - "@radix-ui/react-accordion": "^1.2.2", - "@radix-ui/react-checkbox": "^1.1.3", - "@radix-ui/react-dialog": "^1.1.5", - "@radix-ui/react-dropdown-menu": "^2.1.5", - "@radix-ui/react-label": "^2.1.1", - "@radix-ui/react-popover": "^1.1.5", - "@radix-ui/react-progress": "^1.1.1", + "@radix-ui/react-accordion": "^1.2.3", + "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-popover": "^1.1.6", + "@radix-ui/react-progress": "^1.1.2", "@radix-ui/react-select": "^2.1.6", - "@radix-ui/react-separator": "^1.1.1", - "@radix-ui/react-slot": "^1.1.1", - "@radix-ui/react-switch": "^1.1.2", - "@radix-ui/react-tooltip": "^1.1.7", + "@radix-ui/react-separator": "^1.1.2", + "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-switch": "^1.1.3", + "@radix-ui/react-tooltip": "^1.1.8", "@tanstack/react-query": "^5.66.0", "@tanstack/react-query-devtools": "^5.66.0", "@tanstack/react-table": "^8.20.6", @@ -36,10 +36,10 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "1.0.0", - "country-flag-icons": "^1.5.14", + "country-flag-icons": "^1.5.16", "d3-geo": "^3.1.1", "dayjs": "^1.11.13", - "framer-motion": "^12.0.11", + "framer-motion": "^12.4.1", "i18n-iso-countries": "^7.13.0", "i18next": "^24.2.2", "lucide-react": "^0.460.0", @@ -55,20 +55,20 @@ "tailwindcss-animate": "^1.0.7" }, "devDependencies": { - "@eslint/js": "^9.19.0", + "@eslint/js": "^9.20.0", "@types/node": "^22.13.1", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react-swc": "^3.7.2", + "@vitejs/plugin-react-swc": "^3.8.0", "autoprefixer": "^10.4.20", - "eslint": "^9.19.0", + "eslint": "^9.20.0", "eslint-plugin-react-hooks": "^5.1.0", - "eslint-plugin-react-refresh": "^0.4.18", + "eslint-plugin-react-refresh": "^0.4.19", "globals": "^15.14.0", "postcss": "^8.5.1", "tailwindcss": "^3.4.17", "typescript": "~5.6.3", "typescript-eslint": "^8.23.0", - "vite": "^6.0.11" + "vite": "^6.1.0" } } From d4f6db436a1d0ea0a0353b4323673ea3babd5fab Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Thu, 13 Feb 2025 11:21:53 +0800 Subject: [PATCH 14/25] feat: add PWA support with manifest, icons, and theme color management --- .cert/cert.pem | 19 +++++++++++++ .cert/key.pem | 28 +++++++++++++++++++ index.html | 9 +++++++ public/android-chrome-192x192.png | Bin 0 -> 4863 bytes public/manifest.json | 17 ++++++++++++ src/components/ThemeColorManager.tsx | 39 +++++++++++++++++++++++++++ src/main.tsx | 2 ++ vite.config.ts | 5 ++++ 8 files changed, 119 insertions(+) create mode 100644 .cert/cert.pem create mode 100644 .cert/key.pem create mode 100644 public/android-chrome-192x192.png create mode 100644 public/manifest.json create mode 100644 src/components/ThemeColorManager.tsx diff --git a/.cert/cert.pem b/.cert/cert.pem new file mode 100644 index 0000000..22a7231 --- /dev/null +++ b/.cert/cert.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDCTCCAfGgAwIBAgIUQxY5HJAktPoEWU9osMraUrm/DEAwDQYJKoZIhvcNAQEL +BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTI1MDIxMzAzMTA0MVoXDTI2MDIx +MzAzMTA0MVowFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAraDt2UXkzKLRskNtVDo1iXe1tBTYTAFtl+m7JOvdYdmS +oenV3Cn/8Cd8JuusQVl9jovcMFb3pwrQzodSQ9oN70B/MSqA/Pjgpji+uu4Hjcas +VhaAHregBsV8ULl+OikPPFWcGKRZMtRyta3Sy/2E5Y44wr8vdERKDl/6ydDVioe5 +dQQS+klyzamy9ayQj8fpSTR96H+WpDd6gGuDf+XlrqlnrgatiUIJiDkeJPCIUNJi +VSw8lq3KO8O4K376smCAdngdyYg+q/Sk2r5MnHi9VqNknwmos06yPk6vTWIpZ+mK +bz9W2HW4sukU0nwRXP0p29SKoW5ZKPvrLvfNDp0P3QIDAQABo1MwUTAdBgNVHQ4E +FgQUYSHtj6LjfaQ0BmuCdlHf/EXKm5AwHwYDVR0jBBgwFoAUYSHtj6LjfaQ0BmuC +dlHf/EXKm5AwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAQnM/ +MIYunEp8ITMtllILW9TJhZVertfuux4S1rgRZ3VADmHgHftCgUKpm4kh8w2gEZ0M +DXTmnIwqaBa+lpiCcALECUQ1L2jPcwCYowmEfnKLF6Ob3Tnznz0eqr8TnvuKCX4c +ehSlfqOcUn8rveLDX91j+FJ+LSggf/kYjhE0ACtZHJyEM9csWu5chu8cCjpq5pn/ +ahiPw5eUnxsyBWdqlkMvY+lofH7SaunXrbLcIDg67wMl0FpZ39z/UAhIVNiyUIDe +k7pNzRu99r5hIqdyfx5zULG2mzJCSsJj63t4BeDwr6u+zXSlyVMqh5cXj9mk4LJ6 +DhJlnudcCV5t/RGyOw== +-----END CERTIFICATE----- diff --git a/.cert/key.pem b/.cert/key.pem new file mode 100644 index 0000000..53b20f4 --- /dev/null +++ b/.cert/key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtoO3ZReTMotGy +Q21UOjWJd7W0FNhMAW2X6bsk691h2ZKh6dXcKf/wJ3wm66xBWX2Oi9wwVvenCtDO +h1JD2g3vQH8xKoD8+OCmOL667geNxqxWFoAet6AGxXxQuX46KQ88VZwYpFky1HK1 +rdLL/YTljjjCvy90REoOX/rJ0NWKh7l1BBL6SXLNqbL1rJCPx+lJNH3of5akN3qA +a4N/5eWuqWeuBq2JQgmIOR4k8IhQ0mJVLDyWrco7w7grfvqyYIB2eB3JiD6r9KTa +vkyceL1Wo2SfCaizTrI+Tq9NYiln6YpvP1bYdbiy6RTSfBFc/Snb1Iqhblko++su +980OnQ/dAgMBAAECggEAI/6N+GI9N7AUVUaVqmWj1iL/Q/0jRwRvxhOyFIoiG6gp +dg/+IhWB5bUlz4LBc8270fqME+hfkF1VYs9aXk8c3unJxHVJhsgIeGUgoyt33Owg +K3ugJV4PWoAD0M9Xi/KZojokMVaW2EsDGcdWgSwGKjmk6jiMu6dxi8/Zc4+ryTsY +3+KMUocFyqMfYK1/sYSTPzlPWcCGMuaO36Df++cAzKLlqHRh7BLgSiCXBrV8ITFf +LTkQFDf/c+yVC6mJG/GXzqdKXS3OT97sW34tdmQPNhReCSkSEDVQt+tnFa5be1R2 +18mODkaSv4DxnMXnlfexon/pGuXukgrMTZQXq2+pIQKBgQDaNvBmJrSCU9NSDNSj +I0yTX8DUzEv1bxErbfptSlSoUcEIPcLsxt+xZFVfU8IcMvQ43gHSsRquCfZsUZ0r +/ZIfJ7pWTqbxd/EybsMiC2ZSS8NdVX3MJhKinrZXMTRAA8l5a4AFr2YKMtNqQpGY +xWu8TS7PR8N9B6vZqGC9hhID4QKBgQDLsZLrezomWTthFAOfACj/ebIEyZ30YVNw +7IaaVTkeWtYGJXasMrts1+n15dPwR6a18c65hSywJKsCEYD6z/uXxaoX1bK32oLw +49thMw+qSilA1jMQ/XQxx9TFsmrCvwSm5xIjSV+0pD1sApiivGQAU+2oHZeEwLue +v51JxnaLfQKBgQDVYUWgThbTHk8U+7DuObVGoyp3q7JXNJ1wf2GTf0zbLt54RZSX +Xj0dRMRqrAey9Wx1MzpLIZ26M8nAz+nGO3Woe3utq8l5c9TqgP7VCpqqvKU0XkXd +3Bj65gHdryKtukZIMgOFC6fXLy4mySOAZQRdpIeybzVMzLSR6SF4EmMJYQKBgGtz +xVlLrCVGtThE4pQh9X6vp+U2poigPvA3FdqcUoFc0cJ0SOIV8SE91UHOd7stURhx +8ueTBTv2W++/ZBbrWIF72HqyVJEASErjKHtiAEWI0bJOTKoNyhnonKmdsQwC0GVr +R/otXrtgWLZ9uB9A2lAB9kDVO3TgZxkbY9HjS+3RAoGBAKVKcJFErNZhQxCx5ll3 +u9wtE7duiVcS3jZhFa7tvcSc4O5+ahEQG/gy2M6kgqB/f3nMH6Rd9wsTzwPp1uZz +qiumr3ZOvpTWuLiIMQi3sE9pBGz7p+ZTeP8Z0Wez98v9MVmgsCsPqDOpa1JhnJIq +2AgG3D/RUJylOPYnMq8vdAyx +-----END PRIVATE KEY----- diff --git a/index.html b/index.html index f2114e7..e87d011 100644 --- a/index.html +++ b/index.html @@ -108,6 +108,15 @@ 哪吒监控 Nezha Monitoring + + + + + + + + + diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..0e09ce167cbee42ceed8522e2c7405dced747936 GIT binary patch literal 4863 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 D^*f { + const updateThemeColor = () => { + const currentTheme = theme + const meta = document.querySelector('meta[name="theme-color"]') + + if (!meta) { + const newMeta = document.createElement("meta") + newMeta.name = "theme-color" + document.head.appendChild(newMeta) + } + + const themeColor = + currentTheme === "dark" + ? "hsl(30 15% 8%)" // 深色模式背景色 + : "hsl(0 0% 98%)" // 浅色模式背景色 + + document.querySelector('meta[name="theme-color"]')?.setAttribute("content", themeColor) + } + + // Update on mount and theme change + updateThemeColor() + + // Listen for system theme changes + const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)") + mediaQuery.addEventListener("change", updateThemeColor) + + return () => mediaQuery.removeEventListener("change", updateThemeColor) + }, [theme]) + + return null +} diff --git a/src/main.tsx b/src/main.tsx index 1be15b4..a8048c8 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -4,6 +4,7 @@ import ReactDOM from "react-dom/client" import { Toaster } from "sonner" import App from "./App" +import { ThemeColorManager } from "./components/ThemeColorManager" import { ThemeProvider } from "./components/ThemeProvider" import { MotionProvider } from "./components/motion/motion-provider" import { SortProvider } from "./context/sort-provider" @@ -18,6 +19,7 @@ const queryClient = new QueryClient() ReactDOM.createRoot(document.getElementById("root")!).render( + diff --git a/vite.config.ts b/vite.config.ts index e9011f8..d17ebb5 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,5 +1,6 @@ import react from "@vitejs/plugin-react-swc" import { execSync } from "child_process" +import fs from "fs" import path from "path" import { defineConfig } from "vite" @@ -26,6 +27,10 @@ export default defineConfig({ }, }, server: { + https: { + key: fs.readFileSync("./.cert/key.pem"), + cert: fs.readFileSync("./.cert/cert.pem"), + }, proxy: { "/api/v1/ws/server": { target: "ws://localhost:8008", From ce693db49961363c863a254c9cdcfff33d52436f Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Thu, 13 Feb 2025 11:22:07 +0800 Subject: [PATCH 15/25] chore: bump package dependencies to latest patch versions --- bun.lockb | Bin 196552 -> 196673 bytes package.json | 12 ++++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/bun.lockb b/bun.lockb index 5f3c945b4bb6ff2dd43667eca0c384bbbeebcd4f..2f478447b0855a7c4c65f9384a8279f109be5fa6 100755 GIT binary patch delta 7038 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 delta 7038 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 b?r*#+J^he3pgrgF4m7x#@1}y=QN4cxInvy7 diff --git a/package.json b/package.json index f948cf8..e16c579 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@radix-ui/react-tooltip": "^1.1.8", "@tanstack/react-query": "^5.66.0", "@tanstack/react-query-devtools": "^5.66.0", - "@tanstack/react-table": "^8.20.6", + "@tanstack/react-table": "^8.21.2", "@trivago/prettier-plugin-sort-imports": "^5.2.2", "@types/d3-geo": "^3.1.0", "@types/luxon": "^3.4.2", @@ -39,7 +39,7 @@ "country-flag-icons": "^1.5.16", "d3-geo": "^3.1.1", "dayjs": "^1.11.13", - "framer-motion": "^12.4.1", + "framer-motion": "^12.4.2", "i18n-iso-countries": "^7.13.0", "i18next": "^24.2.2", "lucide-react": "^0.460.0", @@ -61,14 +61,14 @@ "@types/react-dom": "^19.0.3", "@vitejs/plugin-react-swc": "^3.8.0", "autoprefixer": "^10.4.20", - "eslint": "^9.20.0", + "eslint": "^9.20.1", "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.19", - "globals": "^15.14.0", - "postcss": "^8.5.1", + "globals": "^15.15.0", + "postcss": "^8.5.2", "tailwindcss": "^3.4.17", "typescript": "~5.6.3", - "typescript-eslint": "^8.23.0", + "typescript-eslint": "^8.24.0", "vite": "^6.1.0" } } From 0e184cafbb8bea499cb8e9fc94bc594f0b7f147c Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Thu, 13 Feb 2025 11:22:37 +0800 Subject: [PATCH 16/25] chore: update project name and reset version to 1.0.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e16c579..e3df14d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "nazha-dashboard-vite", + "name": "nazha-dash-v1", "private": true, - "version": "1.0.1", + "version": "1.0.0", "type": "module", "scripts": { "dev": "vite", From 296b15a7d4d891925e393a3e733081a5a74cf561 Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Thu, 13 Feb 2025 11:32:11 +0800 Subject: [PATCH 17/25] feat: add platform-specific keyboard shortcut display --- src/components/Footer.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 399b1c5..7bd3d17 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -5,6 +5,7 @@ import { useTranslation } from "react-i18next" const Footer: React.FC = () => { const { t } = useTranslation() + const isMac = /macintosh|mac os x/i.test(navigator.userAgent) const { data: settingData } = useQuery({ queryKey: ["setting"], @@ -27,7 +28,7 @@ const Footer: React.FC = () => {

- K + {isMac ? : "Ctrl "}K

From c58b79e6d2cfe702cc163ccba3b7319f53986e2c Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Sun, 16 Feb 2025 16:30:48 +0800 Subject: [PATCH 18/25] refactor: improve NetworkChart x-axis tick formatting and interval --- src/components/NetworkChart.tsx | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/components/NetworkChart.tsx b/src/components/NetworkChart.tsx index d6fba05..421eacc 100644 --- a/src/components/NetworkChart.tsx +++ b/src/components/NetworkChart.tsx @@ -4,7 +4,6 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/com import { ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartTooltip, ChartTooltipContent } from "@/components/ui/chart" import { fetchMonitor } from "@/lib/nezha-api" import { cn, formatTime } from "@/lib/utils" -import { formatRelativeTime } from "@/lib/utils" import { NezhaMonitor, ServerMonitorChart } from "@/types/nezha-api" import { useQuery } from "@tanstack/react-query" import * as React from "react" @@ -264,12 +263,22 @@ export const NetworkChartClient = React.memo(function NetworkChart({ formatRelativeTime(value)} + minTickGap={80} + interval={0} + ticks={processedData + .filter((item) => { + const date = new Date(item.created_at) + return date.getMinutes() === 0 && date.getHours() % 3 === 0 + }) + .map((item) => item.created_at)} + tickFormatter={(value) => { + const date = new Date(value) + return `${date.getHours()}:00` + }} /> `${value}ms`} /> Date: Sun, 16 Feb 2025 16:32:11 +0800 Subject: [PATCH 19/25] chore: update framer-motion and @types/node to latest patch versions --- bun.lockb | Bin 196673 -> 196673 bytes package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bun.lockb b/bun.lockb index 2f478447b0855a7c4c65f9384a8279f109be5fa6..7ca57692dc22db34d47f456f9126a7f3bb2bdac7 100755 GIT binary patch delta 289 zcmV++0p9+>fDFNa43I7$g&`sc-P5&1gES{XFrq-p_(e_9*}c^ji2+Am*wNt5(JD3c%_2(u`Y)mcEU!yY@lH*~Cx8&7E6!LUevJ&1KaRsiOGB%iT= zuzo|g%rH7xX(8gpEHQU==avyVHc$JpQz8)S1&82e;o~W@J?(g8K+6O6UqINkee%=C zg;yS5G>kj`;xFtdh!GJ9r}#5^IH9QVKo;jajgu}*49 zlQ>8)v*<|>Nt5_OFtaF=)mcELZS?KL3XD30xb0t*N(dGHlak_5e5(F)x~v=mVGfQr z>%)KLPe1KtJSXg7ci*6nW1uDYDf^C|zZ6jv&HZ$Ea04tP@Y{7400e;Yp9f%QE$-%mu~`(*7vMrd Date: Wed, 19 Feb 2025 17:47:10 +0800 Subject: [PATCH 20/25] refactor: improve NetworkChart x-axis tick display logic for better time range visualization --- src/components/NetworkChart.tsx | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/components/NetworkChart.tsx b/src/components/NetworkChart.tsx index 421eacc..a5f6c7c 100644 --- a/src/components/NetworkChart.tsx +++ b/src/components/NetworkChart.tsx @@ -268,16 +268,34 @@ export const NetworkChartClient = React.memo(function NetworkChart({ axisLine={false} tickMargin={8} minTickGap={80} - interval={0} ticks={processedData - .filter((item) => { + .filter((item, index, array) => { + if (array.length < 6) { + return index === 0 || index === array.length - 1 + } + + // 计算数据的总时间跨度(毫秒) + const timeSpan = array[array.length - 1].created_at - array[0].created_at + const hours = timeSpan / (1000 * 60 * 60) + + // 根据时间跨度调整显示间隔 + if (hours <= 12) { + // 12小时内,每60分钟显示一个刻度 + return ( + index === 0 || + index === array.length - 1 || + new Date(item.created_at).getMinutes() % 60 === 0 + ) + } + // 超过12小时,每2小时显示一个刻度 const date = new Date(item.created_at) - return date.getMinutes() === 0 && date.getHours() % 3 === 0 + return date.getMinutes() === 0 && date.getHours() % 2 === 0 }) .map((item) => item.created_at)} tickFormatter={(value) => { const date = new Date(value) - return `${date.getHours()}:00` + const minutes = date.getMinutes() + return minutes === 0 ? `${date.getHours()}:00` : `${date.getHours()}:${minutes}` }} /> `${value}ms`} /> From 579b4f8ef4ab6098e3de039e8b850e6de5cf8369 Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Wed, 19 Feb 2025 17:47:26 +0800 Subject: [PATCH 21/25] chore: bump package dependencies to latest patch and minor versions --- bun.lockb | Bin 196673 -> 196697 bytes package.json | 20 ++++++++++---------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/bun.lockb b/bun.lockb index 7ca57692dc22db34d47f456f9126a7f3bb2bdac7..b04c97ccb937c80d0db119e630be459dc4be5243 100755 GIT binary patch delta 25978 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 DI;jGj diff --git a/package.json b/package.json index ef993d4..e1ad60c 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,8 @@ "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-switch": "^1.1.3", "@radix-ui/react-tooltip": "^1.1.8", - "@tanstack/react-query": "^5.66.0", - "@tanstack/react-query-devtools": "^5.66.0", + "@tanstack/react-query": "^5.66.7", + "@tanstack/react-query-devtools": "^5.66.7", "@tanstack/react-table": "^8.21.2", "@trivago/prettier-plugin-sort-imports": "^5.2.2", "@types/d3-geo": "^3.1.0", @@ -39,16 +39,16 @@ "country-flag-icons": "^1.5.16", "d3-geo": "^3.1.1", "dayjs": "^1.11.13", - "framer-motion": "^12.4.3", - "i18n-iso-countries": "^7.13.0", + "framer-motion": "^12.4.4", + "i18n-iso-countries": "^7.14.0", "i18next": "^24.2.2", "lucide-react": "^0.460.0", "luxon": "^3.5.0", "prettier-plugin-tailwindcss": "^0.6.11", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-i18next": "^15.4.0", - "react-router-dom": "^7.1.5", + "react-i18next": "^15.4.1", + "react-router-dom": "^7.2.0", "recharts": "^2.15.1", "sonner": "^1.7.4", "tailwind-merge": "^2.6.0", @@ -57,8 +57,8 @@ "devDependencies": { "@eslint/js": "^9.20.0", "@types/node": "^22.13.4", - "@types/react": "^19.0.8", - "@types/react-dom": "^19.0.3", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", "@vitejs/plugin-react-swc": "^3.8.0", "autoprefixer": "^10.4.20", "eslint": "^9.20.1", @@ -68,7 +68,7 @@ "postcss": "^8.5.2", "tailwindcss": "^3.4.17", "typescript": "~5.6.3", - "typescript-eslint": "^8.24.0", - "vite": "^6.1.0" + "typescript-eslint": "^8.24.1", + "vite": "^6.1.1" } } From 674d348ed792a011a2c8315206e36d2c68d885c3 Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Thu, 20 Feb 2025 15:29:14 +0800 Subject: [PATCH 22/25] feat: add support for ForcePeakCutEnabled configuration in NetworkChart --- src/components/NetworkChart.tsx | 10 ++++------ src/hooks/use-background.ts | 1 + 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/components/NetworkChart.tsx b/src/components/NetworkChart.tsx index a5f6c7c..30b09ac 100644 --- a/src/components/NetworkChart.tsx +++ b/src/components/NetworkChart.tsx @@ -94,8 +94,10 @@ export const NetworkChartClient = React.memo(function NetworkChart({ const customBackgroundImage = (window.CustomBackgroundImage as string) !== "" ? window.CustomBackgroundImage : undefined + const forcePeakCutEnabled = (window.ForcePeakCutEnabled as boolean) ?? false + const [activeChart, setActiveChart] = React.useState(defaultChart) - const [isPeakEnabled, setIsPeakEnabled] = React.useState(false) + const [isPeakEnabled, setIsPeakEnabled] = React.useState(forcePeakCutEnabled) const handleButtonClick = useCallback( (chart: string) => { @@ -281,11 +283,7 @@ export const NetworkChartClient = React.memo(function NetworkChart({ // 根据时间跨度调整显示间隔 if (hours <= 12) { // 12小时内,每60分钟显示一个刻度 - return ( - index === 0 || - index === array.length - 1 || - new Date(item.created_at).getMinutes() % 60 === 0 - ) + return index === 0 || index === array.length - 1 || new Date(item.created_at).getMinutes() % 60 === 0 } // 超过12小时,每2小时显示一个刻度 const date = new Date(item.created_at) diff --git a/src/hooks/use-background.ts b/src/hooks/use-background.ts index 88c03d8..4c642d9 100644 --- a/src/hooks/use-background.ts +++ b/src/hooks/use-background.ts @@ -7,6 +7,7 @@ declare global { ForceShowServices: boolean ForceCardInline: boolean ForceShowMap: boolean + ForcePeakCutEnabled: boolean } } From 24f50950518d753c56ebb7a84a5c134530ceda8a Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Thu, 20 Feb 2025 15:29:27 +0800 Subject: [PATCH 23/25] chore: update country-flag-icons, framer-motion, and postcss to latest versions --- bun.lockb | Bin 196697 -> 197111 bytes package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lockb b/bun.lockb index b04c97ccb937c80d0db119e630be459dc4be5243..c64d421d4dbbda15e058d388c1e53f4687b3800c 100755 GIT binary patch delta 3708 zcmeH~d03Rk9mi*0AZ0lOiW&|Ffs@eu8Ic4up^Kl(@i>^%G1@9+1Sd1v1_ zc8>N!o2P4R%2nQ)yL}^vWVkh_=!#0_xhAzeUQj_^Eve7inmWJv;Ib*R=TbAm)9s4H zq4Z_L^7Xcsi?efb({pl2<$&k{i*iEj2q}C~Mu;`E7it5&B{aT*kim#Ea?;Zlq|M0) zLu`xqZRkK~1gds|F3ZZz;6G!k`+g-M3h<&TLR_G8g~mgj5s!hQ-f@MlaNGbSk}l7FduXMG5LUv}Q0kuH_WE(IZqSEYnZM+pnL zZsZubeS=1EV>2P)AVlu)R!f7+ zQ>v*>uHK|kJOB$bFy;I)=IFVpvYRqk(E@J_u$ip%P}Apfb*YAqm)lDj!%H->#{2&Lp&@rXoZ!R!2xMUWUkZqt%LBL=zA>%1UoF zJuD|zYG|Kajqjkw_R1#P0zUaX&H2nQDuw<6@o;D~l*d{TFA(uUC{O>WKSP`=_dn-jbXaT~10z^W*8U--v$tLkY85EP6d?X(H-|0wW3u{HiTzQMP3*8}fXJbR% z#{YNLf7@Bf_1(dtPyg!ko0;o86RUP7jhS+$?&OBC7mjzHaH(m@=x_+{_+ahgcV32m z@no0k2d_uxb2@KVInIjm%07GHtE=#gWoZ8&_EFsJ>XVH;#Z`*~70y-|p-!^~hGJADQL%75Kjq57E?91)Vj*v@x zT0^gX>!06xyy>)CMbanxjz3ux_4N6H+as9yr1F*Z{f=uI*xnz#r$*au*>TQ##VW7f z5e~0@7o=_UI+o?_pBIv_-l1_zZ|bzzWr-)uR_V?s{OZ61i>9x&``5x{LCKnu&72;dY0aD{_2%sB?2m4nqW0O#06 z0D7J&V<8vV3NEeeI+u&gI}UP*6>+)D+97ORJRW^F9**K*cXB}Lwvayqp{oN#F z*G@wAb@q@0T>?N{0zez9P5_9W4Db^NxAfY{R6R`o(rqAi2XnUbed=j)Vhv7z4z-ll zlri^2I)Q^hrd=_8L6&NM4lyhy@%pq}x^o7zpGJMHLa+0`HzECP%=#J~&tk7puXhI+ z5FyMkM8-90gkU-_z9jJlBGkB3lNwRZ0xX<0T%(Q!ks|9Ok;Rw8D8Xt4vjnr^^&o8* z3|la<6>NuK*geT$)50SdwtnI)%GC*mV*vRre53+{!+pL?j)ud3`(r3C#M}3lV4p(q zF)XiZp*++;Z*9ESbjS_ZIvh9@>vgiaf6QVF2+mq2DHI$z<4k5(Tjue zX~CxppGNiiiaT_My)7S2K4tinY-BxMw9M@gkPNGYmBaXiD1q_Ga+nqUh304z;PN5l zL(9jU&jnr!p9}n7!Fdbp6pRlmA4Z;jJo&|(|OvcRlfSFUb>UIs>yK7C3l>>njYM``OcyG9*L#|s)B-4YW<|g)Q!>rwy=-B2`TQQ zdQ|9QoSKEfhl}6-`tf21lvk_#R6hD?-_uklDUh&n){=|jp%3h*Ui ztT|P3rtz#jRf=={*Y~ogM^FR5gWP9fY0_xgsb82T-KDgGZJQ%GyP7T%e-50yVwOwo zc+~5|dsvNs=jwD6Fx@=*wDGe(vC*tCr^rQ-K+?t-@Op zb%AZH2nCFdiSry)ZM?QAvd5qAnq1Q)(GP=Eem*K6awL;4I+*%%nN5Ziu8+@pm9_DvPQnJssOSP=%ndG6*-XVEUWhsA@2D1ryh;>h-7Ms5T DI=N$B delta 3471 zcmd^?dsI}%9mi)bkFW}YRm>uyJW^#52ph%K;sH$L%_<~TN(@F+P^f4KS|2&eN@`RT zd0cfwMTj{Ka!gcQ<)Tz0K2bvj)L4nJw$;->Ma48x(^~ueEweG_wEeIDbxk5u4SQy+JuU-v@=15`yVa%%kdp$Cg*s=_m!*sGa3pVCOt?wKkfW8 zg;Ba%o;HH>`lajLRF?tqKf6@Qm^)*Z)6o9VMyM;aTB^RBu_1`F3g%=k$ef$iAF&(a zM`dd9fZ>_76^!W+CT(VHDAXub5A{NBc2EC z2c4nn+(#&X+hz@N|G>@KIP65QXq?Ui)mfu;YF$EUUr>{*Q*#na)v+4_Ro~$**1)9G zk!o=9L>{i@6h|qWOVpskNZt7o#@@s&oz!|i6Q8FVHbm)mZenaQ7*l%@r%%HfHxl8 zK{fiC_$jrkB#Jw$hD}krG;~>tEvG)gq&to%43RUvmF^y*afn>h`e+k>Ni~#4Ipw1Z z)76mD2&W4_cmZ1&OS7>R@KSBwMR;%9yr8Z2+|}@YZew4-d&A}#gq^K|XC|gx6l!;Q zq|RX*V-a{fQ|m{YbdiW&MKnk?qH`>2T}2dcQoC?vR)gB)R!Gyy&yg_>^@j#PV`LmF z;~W|1LMi=NUqGBM`F~Q%T7ruMbeSyoBegx>mO(Rn1q!%B*UJhUp_r(wQdaz5Dm8e! zqc5&V+wlMbJEZQETIFbcQ!W0#@1+s8PWtb?WIb}=ZbbA?b3B_5PFkHld~U&8yQccD z8g;ALxa!WeW6cNWB_E7@|BImcxe<4kE|SV~X?Ndv-tVahu<+`m>(f z)jM}vqTNq^RC^&PrL(@qDck>zwNES?cRzbvVTstIoU_2eAoN?=2=^+XCCNi z>c0K(R_FdDZ{08Y$I+)JH|oa?tMW-19~e@3EiyOxyP`civRB^x>iFJh>$mr2O&6cW z@FZR@p2YAp@i>ONiHukPtEh_w*b@uj76))xq{jjLA`ajf0Zr)Q0bJq%^5OxGh$93V z3HT%cG>M!9fcXgktptt zCCLD1#B~6ERv68Yb7DP7i})kSc`;!MYMzR!t)g-&`0qq7$t97H zg6#MdWPh51>~`^lz+(a#sQ{NnT`ItyRPLs^z0ODbW65?DDT}#2MxPpE4?2WPJDg(Gc{F@anvPAf(r`ovRx8lFJwdH0#Gd(_A%xqE7wSd zt(NVEPw7L+uHDjE>jSc&hb%w^>*Y-b z!cTxtH@8am6Zo-`9fsn^2EigFYmf{ZGn*`#CYdK#VxfeM5)J_jgHLaNL^AC1tQ$t@ zsAM<+Fzi~k)Fc^B2Mn7(qgMV_GMp^fLo|*Wc}y~I_`iWsDm)HI-8KwXO9bhJEQn(V z+hZe)HA^-eah+r*WnEgR_QB}Jr)4=`_M>_%S3bbd@zV}Pm0$3hwA#9N_T;*$>N1$bX4qC%i{tBP48GI8=g>8Xtg_Xg| zVFFeGD}~YaRswq$RsdV9`Ca2t3SXjSUgrT^tn1__`pxg`d#f9F>8<zB9zR{vl zq|v2Or_rYornyd>2IMmsjUWve<hNbsZBTk+oM6}$ zs7DVjNJ^Ga?(vZ{>BXpf-0VG`g~P|Jx2$XWxI@3RJ=lfMG)@Q&3mv1C-s28@Xc+rd z&f+Yp9O#(i5vTip8A^-`HHL<1pWNp)oQDZ>FZbeM+Pq%w!@b6^iYYF)DM;6*r~(#gG6 z)Xr8$^8?!D*~*uk&k#IY@d~$}zi)=8F3%WRH4!(&?Lv(vWs}A59XT-a z!r2<}bS|1@Khj_CUMB)7_Ow1Pa7Y-l(5%l@k(`B>w*M!X)bWQ?J7;{n{CPn|6ry0b z{ZE9?(CV(eP1q)Wc$EEbM&6Whu0;jrbL@TO#XW^)fCC+kj`qtKtD@AV)=0P;- zNVW!=@s~oRWGni9DOt2`;6$D+-py7f*EVJ=yuT&84>mtjv{UnxcoQEhT&tBHNOPVt fLU`3EyTs~qim!I9MlnniPrH>tTEe%=KG%N%vmg(i diff --git a/package.json b/package.json index e1ad60c..dc529e4 100644 --- a/package.json +++ b/package.json @@ -36,10 +36,10 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "1.0.0", - "country-flag-icons": "^1.5.16", + "country-flag-icons": "^1.5.18", "d3-geo": "^3.1.1", "dayjs": "^1.11.13", - "framer-motion": "^12.4.4", + "framer-motion": "^12.4.5", "i18n-iso-countries": "^7.14.0", "i18next": "^24.2.2", "lucide-react": "^0.460.0", @@ -65,7 +65,7 @@ "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^15.15.0", - "postcss": "^8.5.2", + "postcss": "^8.5.3", "tailwindcss": "^3.4.17", "typescript": "~5.6.3", "typescript-eslint": "^8.24.1", From 57256fcc3a5638a9252fca012dcaeb3256fb945b Mon Sep 17 00:00:00 2001 From: Yorun <547747006@qq.com> Date: Fri, 28 Feb 2025 23:53:42 +0800 Subject: [PATCH 24/25] feat: Add quarterly abbr (#33) * feat: Add quarterly abbr * chore: auto-fix linting and formatting issues --------- Co-authored-by: yorunning <25226871+yorunning@users.noreply.github.com> --- bun.lockb | Bin 197111 -> 197111 bytes src/lib/utils.ts | 2 ++ 2 files changed, 2 insertions(+) diff --git a/bun.lockb b/bun.lockb index c64d421d4dbbda15e058d388c1e53f4687b3800c..d4480dc3ea8fb0f8e138c4ed57ab1e58d0c3f683 100755 GIT binary patch delta 77 zcmV-T0J8u0gADhB41lx&5Yd+u(E%{GK+ypM9sx7AMDGFe0s%OeH}U~Z0X4UU@&Wd9 j6lHC8WpXY>cywiQZeeUwbaH8KXP1m-0x7q+W&%H(rQRN5 delta 79 zcmey~%=5jOr(p}Dz(tngqGY}40v8z#w!2(p{4dLBwB6-B<0mFYv+3ra7=0N{wzqy_ j{8lUoRF#=mT#}fRqgR}oTb5chy+4gfbNkjbCa2i|_?#bx diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 16bff0c..59248a7 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -72,6 +72,8 @@ export function getDaysBetweenDatesWithAutoRenewal({ autoRenewal, cycle, startDa months = 12 break case "季": + case "q": + case "qr": case "quarterly": cycleLabel = "季" months = 3 From a22168e0ab0c6499648a6a54ec5cdbf3909a7eea Mon Sep 17 00:00:00 2001 From: wood chen Date: Mon, 3 Mar 2025 06:00:46 +0800 Subject: [PATCH 25/25] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E5=90=8D=E7=A7=B0=E5=92=8C=E5=9B=BE=E6=A0=87=E8=B7=AF?= =?UTF-8?q?=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/android-chrome-192x192.png | Bin 4863 -> 0 bytes public/manifest.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 public/android-chrome-192x192.png diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png deleted file mode 100644 index 0e09ce167cbee42ceed8522e2c7405dced747936..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4863 zcma)Ac_5VE*MFYJ$P8hOE!oB%5|cGqW*8choh-@7PQ+JImYS5WeapU2NFuw+5{+a@ zq6NuP_AO-J<@fad@&5jK|9Jnn+jH+Z=ehTub3f;tNMpkb%#0@)0RUjuBN0vEmiD(G zkHNL+$aMy|0sTxbXaVIteDm;t=xn9ua_JHv1^1Bv814=r{w{&bNw@$29Tf!V;1>M* zjSBtmER9O{-~Qi)m(HK-0sxG=9+6;v8(gwux^CWfGMDih6XPjpg6@%N!~hj{GU=pT ztZePO=n78-sh1ihMH9S4TxkBOP>Q~>V}YUu8@u4CYoSBDip4(K<=9nv2<1j7)VZ^h zzkQ^en!NO~G3b`dc6Yb(d!w|P*#p;^{n_C=hwDa(U1vDoFEtVOqO!53l4lJH%?n?V zB9Y4u!q7{!8)w^jolKp9i05c`4(l`3)`dEVZKve3WzXwwP&-d0$`hrCd(lpNuSdFw zi048S#-F0qM5n6GM&VyNXT?KDh8?uTD%h+gp&5c?*ok*9Sg3LN<@r4`8+1*1r%p&! z<3-EEoSWUUdKQ3%GYfJH|8(_SWELI9#`Dz;T;ATl`b zh6KSr z|Gr&eG|;T>bK?{je1t++N<*CLPbLKIrbKX1dIX+?r1osngJb=XpK&k+3hdiu$5Zs# zdJd3C1A-7m)gA@W^70~)4X92%q2)AuBIT0<>ZX)ukYiLkFkTP&8Gv z0wjw6G~+t12MpY&vSGncB~2zHsFDQ{3!u=oyVkcc6o0H6f<&Qy?0uUAJf|aw;30(9 zU9MaNnICx)#9-alYgS+p`2R~p@MUhS%4VOLg|oBs)N}72udSQbx};0$>(5okB?zdk z(C94u{a>g~C1?wC?+@R2V^PuEuq~S38MwBJoq*bGiVQNoGz4ugcUC)g#0~8Ke)Hx< zU7gCnbWAjVoZ4FFK!54w3+=owZED>T*{#lhrk9eEGOZ`+=|!H@y!*Q3*)tQEhUVbTpA@D7es+Z@V=9T9LEuZu6Gr1rZ z(t5NP0iY7zmbjscjPlC&Hh-l}*j`;j!Pgk3INt3)9>!gALEsLNKX|1@a(PV59+swB z>GZAKu75hszI>)9r<6r?j>@t;;rtC&7S$>&-^?eBL9Uv$LlQFS9;{^U*P{;UzS-Yv z%9L{mT^J~{&1~F#;R#RhSRME73mEYYe`M#(XeT0m4`zL~R!pfchX1@JlWpj6g5Q`D z2FoP!Sgh_>dE>@F*J**tG90{%&Mzt<`&<2A3ohG-_@^4JZK(*4DT06Ye#!O^MU5d` z%zAUx6;Wpz=7hb=6qvkzyts1_Fh6K-*WDZq_-PGt;`{{e?l|}lSi4$(HhQv4pxHuX z#enIq6p!w79IPbo88aU+unyeSZVhLBm7k}-Br+xg0{mPR%?E226$3ZiUff!;kscMg zUKYGNowoV!$;;Qq2P-U>U$=Nd)QY&U=guEepJm->w)PsVY>9FfeUurvSk=+z+rjUu zqnR?KP4k3k;S5Zd?;Rb!vZ?cV92c+)t2)mG_EDKdY2Ax*K4bXFy=R{UpsVbF9raz8 zjLSofoiRH9)i!Qh9(D?%gU>G}aQ&n5X8GBJJjp-E+eVZrD{3^i?0`3O#0f8v$Gi`H zr02MBZGvD0ih{%E)05ICdNq&CE1I@48&=zSIW@8jSFq~)i#3~z#_215mD)R_5G^}g@b2xWmZL8`(*h?VCHm@oC;PURhR-)Cccoz+yu8X-S~_tA4#bki zq&kQ`l26*0N-`>O|5{`%1pZ*fkj|dckN{P$wQ^p~X`HpWrDb)4}~{bfglA za$l*zCe7{^kMj49F>css91sT4!W@h7D0jHdb%pTV%pF3RpAiL0W{H%E8ZF6;h@x0X`r zW#(1tj?iG&|3uFih9ID^qt~n&^yzv(Up!M!Oai?7#o3RwsT85S`+S}%HJ#)as}RL= z^j$kJC`aHwR~iDd_4G_!bIeLb(dXShVMqJl;x2`WgA6T2Wwzvy6UZ!*=AWH{hUrw> zzDHsg4T?RVPVP*`f3uY?Fc^JlmfA`m6EaBO1=8x&0|y<#dER5B+TaJH|ITdAQ;nko zzojV`;;Mkyp!vNn$)|IvK-Lmd${@WI$6D$SUVpCQg2n6Kt94|ZLUzW(+w~{`6Aw@F zeSKId9Y%TyMRDezp8vt~4!iS7oApw-_Q1~y>l$5#uET}Wit4*cNepP8QsW>LEd8Ap z%jkoY%U^LppZNFoepUE)3mqtqy0$j}N-LA;;@6kDUA36dU3irUE?_^@t6u16rImHz z%SBlW`{30uUkvq&z28U0OvLVp4eIRhplps2#&xe8i=^0potT&~z`ftoAm+7x2R+61 zvSZE7%nGgyu*247aS6-vY5)^M5s?9fbx4Bl3O@8~!*^~PC{8w7>O35XOY~u%t5Z{zn>z!rzaaPQkwpw5+qL*tzr$#DP<^Mg|UpVkqdWPW& zccw;2L$$9~Y^>Z`(T5vaf+#Z7rl5ND_Bg$IY`yPfyF!4=kz$Vs)|O z&Q7TT^__z$+?BlIQE;uroyFv|!Ar!;i6<@(tTmRI^XY+vFmd1t6FU56SF)sKelHAN z&#Y@)=Ixxtr40T2YEX(*-`I|W6J*rRAa-s*eS4%}%+yPDJiTadFVN!Z)!Z5nUdPmI zd1nHMB7=QB=GSrnv-I?qs;Z$VW<_RZ=D<8(*Im-~D2zB?M-fkn$j`F|H?%-hNl8g9 zw|m9aCe;tRjlbo{tdBXd;82Ff5%<`gJ6|s;&({aXuo{T(Ft*@szz#-9VWFsWzb0%* zmfMZDzhmh($MifJ#PAU(jyJGP;BtaGi!NmyPnF6o8KjSTY6lxZ(vPFz!9h2*5yl=d z+HFS|C3Czvs;kQ6y?v4Z-x^ZZ!S%sPf{73nTgDOCh7e|8)vZ#;a1&R#dv*qsWw>F7KZ@X8HC7EJ2c z*DSRx`(jq8#4<!4p-TWj6~W8uP} zV|>3^q0hhTqcX6iSVylFdVa5VR-HkIu4Ni(hqGA3YyPPdr$df4YV)DU4acVSe!Av` z6m=kqY@yo;mX?-M#A>{P$4~wV5=G6zinoFwca<2c#GlG9T3lTGY5BxU;ok2wktjn9 zmeB(jc+8hHKI|xh5Fz<2*Uz>W*Ur>vLFpX|6(_5F>7$)icI{tz=X?$j$(0IS-ODBc ztk0P+!E5g&7;|$~KBPZQOA6SeTE-Fztuw?#r*c$5ywivYI8!K-wh=fujxBM~P$UAX0_|xZR_2Iu zKVaw&{5>q#=JFS5_=1kzf92AX{j67-Nod4DX+{XFCVUtVs;Xfc7G#T7NH!aj$8n<) zQ2Mze52E5L=Y0Z{`29L9B1phx8E)Lq!SS$~E`h)~p-Ei0u*)-Qd?G*}_C`*&Bb_`{ z>mKNHT~*lML7(HWOcZ}}G5apYlP&_ieX!np-Y)Knyb&}NMQ!bs$nPCT#~QPv&?VE` z$-L#5$&UDMjc+P_xNL+$t(x0WYvOOKTXR%viO@rrRhF*kQKxTq0Xc#DORvt?wf24x zrR3d;HJ9T15nF@elCk0FRwaBRk*0Tr-n}CpbQPlxM`C%EbwkvOXDhRg+e&+SdRoBl zrbt>yTNGzv-pAPoI&0Mf!Oe1Ajg{vbZC`nt2=w=o8?jeF13@LWbJ{Fw5st}d0Wpua zlp*>zA`(b+KQcHDS*VRwZTspzvrVLd2ok^$^X~MJHU&``E~9v!0-(kyiRn5)u+zL% z`NV|*c9i+#Fg0$hAciLJvTqT9L@9K-*SMC1@X%muY9>FPg7Be{y7SdxRzZWNHFPi~ z%ZW(q+He3xX0`RW1;CV`2rhaHX0_;W@goZs52=tvT|NuItkkbR`~Ls<2>`q%$khh& zW#}lgxzU5S8ZrWAGLcg;G($A?oU5Wa9x+0s@*u1xU4CSE3Ma@zo_IhxRAuIhr4$xg zLR*25LX;17goXF&3LhNn>Y~Z@q@>v}=hX=OS*UpZ1A+2U_~N5C(?^k%SvWMlaSXH} zaz!s<{u?_(5LI@gywihCTo?^O#lMQz%j~w2Z)F{{g$~ZCAI%C1kI6&qg+50F&=;>O zJT7lYD#Z{!(BL$HHu)8Y+vCnR#EouO*gfXhc(dkE*GYLt|3?fG5Tfw(+9b+Eo)u#! zmj+iEIu(-Q-(5Pmh)}}=H93wtsZon|+xp@_^UhVLGSU;I9u_NiE*_A&mxFBB36j>- zPcZ!qz{t@=-U|h3@^9u-QZoOdmf&HIk2}%GFNMNqF7qjEUM zV7RfnJ-_8-i#*u-7V(^;#auEI&4`Qet*y-e48urr*dT@&HHiS+`H!@quROoGa zB8A4mguv_WY|)xP>DN2c_OhYBa*7O43C5xOL6IAr=Lm(SPU*-7y(S%fVs*b{yd2y8 z7&iQq_6jwne;#MWRe2O3_x4UKzI`F#)s_}?b5HXGL$mMchWYn@lTUg&hQx9$a_D~m D^*f