From 171c60d1fcdafd886ab45ec2677ad94fa4c8e487 Mon Sep 17 00:00:00 2001 From: Kasper24 Date: Wed, 6 Aug 2025 00:20:06 +0300 Subject: [PATCH 1/9] chore: cancel previous workflow runs for same branch or PR - Added GitHub Actions concurrency group to CI workflow - Ensures only the latest run for a branch or pull request is executed --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 409822e..483fa59 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,10 @@ on: pull_request: branches: [main] +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: lint-build-test: name: Lint, Build, and Test From 1abc61c2581ee27198b30b41256424f19349ca83 Mon Sep 17 00:00:00 2001 From: Kasper24 Date: Wed, 6 Aug 2025 06:43:17 +0300 Subject: [PATCH 2/9] refactor: integrate react-virtualized for performant wallpaper grid rendering - Added `react-virtualized` and corresponding types for virtualized list rendering - Replaced CSS-based infinite scroll with `Grid` from `react-virtualized` for better performance - Implemented dynamic column/row calculation based on container size - Added auto-resize and lazy-loading via `fetchNextPage` on scroll - Updated styles to improve scrollbar appearance and grid responsiveness - Removed `infiniteScrollRef` logic in favor of `onSectionRendered` --- package-lock.json | 70 ++++++++++-- package.json | 2 + packaging/nix/package.nix | 2 +- src/renderer/components/ui/tabs.tsx | 3 +- .../wallpapers-grid/content-components.tsx | 105 +++++++++++++----- .../components/wallpapers-grid/index.tsx | 8 +- src/renderer/styles/globals.css | 24 +++- 7 files changed, 177 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 67666f2..19e3c17 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,6 +38,7 @@ "react": "^19.1.1", "react-dom": "^19.1.1", "react-intersection-observer": "^9.13.0", + "react-virtualized": "^9.22.6", "sonner": "^2.0.6", "tailwind-merge": "^3.3.1", "tailwindcss": "^4.1.11", @@ -61,6 +62,7 @@ "@types/quantize": "^1.0.2", "@types/react": "^19.1.9", "@types/react-dom": "^19.1.7", + "@types/react-virtualized": "^9.22.2", "@vitejs/plugin-react": "^4.7.0", "electron": "~37.2.5", "eslint": "^9.32.0", @@ -472,7 +474,6 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -3789,6 +3790,13 @@ "undici-types": "~7.10.0" } }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/quantize": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/quantize/-/quantize-1.0.2.tgz", @@ -3816,6 +3824,17 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/react-virtualized": { + "version": "9.22.2", + "resolved": "https://registry.npmjs.org/@types/react-virtualized/-/react-virtualized-9.22.2.tgz", + "integrity": "sha512-0Eg/ME3OHYWGxs+/n4VelfYrhXssireZaa1Uqj5SEkTpSaBu5ctFGOCVxcOqpGXRiEdrk/7uho9tlZaryCIjHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/react": "*" + } + }, "node_modules/@types/responselike": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", @@ -5673,7 +5692,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true, "license": "MIT" }, "node_modules/data-view-buffer": { @@ -5909,6 +5927,16 @@ "node": ">=0.10.0" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dot-prop": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", @@ -8802,7 +8830,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -9589,7 +9616,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -10142,7 +10168,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -10892,7 +10917,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -11032,7 +11056,12 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, + "license": "MIT" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", "license": "MIT" }, "node_modules/react-refresh": { @@ -11114,6 +11143,33 @@ } } }, + "node_modules/react-virtualized": { + "version": "9.22.6", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.6.tgz", + "integrity": "sha512-U5j7KuUQt3AaMatlMJ0UJddqSiX+Km0YJxSqbAzIiGw5EmNz0khMyqP2hzgu4+QUtm+QPIrxzUX4raJxmVJnHg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "clsx": "^1.0.4", + "dom-helpers": "^5.1.3", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-virtualized/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/read-binary-file-arch": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", diff --git a/package.json b/package.json index 4138bc7..180cd77 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "@types/quantize": "^1.0.2", "@types/react": "^19.1.9", "@types/react-dom": "^19.1.7", + "@types/react-virtualized": "^9.22.2", "@vitejs/plugin-react": "^4.7.0", "electron": "~37.2.5", "eslint": "^9.32.0", @@ -98,6 +99,7 @@ "react": "^19.1.1", "react-dom": "^19.1.1", "react-intersection-observer": "^9.13.0", + "react-virtualized": "^9.22.6", "sonner": "^2.0.6", "tailwind-merge": "^3.3.1", "tailwindcss": "^4.1.11", diff --git a/packaging/nix/package.nix b/packaging/nix/package.nix index bc2cb04..b168931 100644 --- a/packaging/nix/package.nix +++ b/packaging/nix/package.nix @@ -46,7 +46,7 @@ buildNpmPackage rec { src = ../../.; - npmDepsHash = "sha256-/lKZ+TLWjKFXyH3QNt9npRMuI9qiXVoef63QdDQ5Jf4="; + npmDepsHash = "sha256-1RJDuZVHJGvvn9ozMZdRtVXpy4O4N+wMA/pW8JJaFtk="; dontNpmBuild = true; makeCacheWritable = true; diff --git a/src/renderer/components/ui/tabs.tsx b/src/renderer/components/ui/tabs.tsx index 3a339cc..40c7530 100644 --- a/src/renderer/components/ui/tabs.tsx +++ b/src/renderer/components/ui/tabs.tsx @@ -42,8 +42,9 @@ function TabsTrigger({ className, ...props }: React.ComponentProps) { return ( ); diff --git a/src/renderer/components/wallpapers-grid/content-components.tsx b/src/renderer/components/wallpapers-grid/content-components.tsx index 70e34a1..f53cd4c 100644 --- a/src/renderer/components/wallpapers-grid/content-components.tsx +++ b/src/renderer/components/wallpapers-grid/content-components.tsx @@ -10,6 +10,7 @@ import { Settings, CheckCircle2, } from "lucide-react"; +import { AutoSizer, Grid } from "react-virtualized"; import { BaseWallpaper } from "@electron/main/trpc/routes/wallpaper/index.js"; import { type SettingKey } from "@electron/main/trpc/routes/settings/index.js"; import { Dialog, DialogTrigger } from "@renderer/components/ui/dialog.js"; @@ -29,6 +30,7 @@ import { type DynamicControlDefinition } from "@renderer/components/wallpaper-di import { useCurrentTab } from "@renderer/providers/current-tab/hook.js"; import { cn } from "@renderer/lib/cn.js"; import { ConfigurationRequirement, OnWallpaperApply, OnWallpaperDownload } from "./types.js"; +import { Skeleton } from "../ui/skeleton.js"; export const ConfigurationScreen = ({ requirement, @@ -138,8 +140,6 @@ export const ConfigurationScreen = ({ ); - - return null; }; export const Wallpaper = ({ @@ -158,12 +158,12 @@ export const Wallpaper = ({ const [isOpen, setIsOpen] = React.useState(false); return ( -
+
- + {wallpaper.type !== "video" ? ( {wallpaper.name}({ ) : (
); }; diff --git a/src/renderer/components/wallpapers-grid/index.tsx b/src/renderer/components/wallpapers-grid/index.tsx index 52bc113..e3e6ca2 100644 --- a/src/renderer/components/wallpapers-grid/index.tsx +++ b/src/renderer/components/wallpapers-grid/index.tsx @@ -107,13 +107,15 @@ const WallpapersGrid = < const { isFetching, + isFetchingNextPage, + hasNextPage, + fetchNextPage, isLoading, isError, error, refetch, failureCount, allWallpapers, - infiniteScrollRef, } = useWallpaperData({ queryKeys, queryFn, @@ -163,13 +165,15 @@ const WallpapersGrid = < failureCount={failureCount} isLoading={isLoading} isFetching={isFetching} + isFetchingNextPage={isFetchingNextPage} + hasNextPage={hasNextPage} + fetchNextPage={fetchNextPage} allWallpapers={allWallpapers} debouncedInputValue={debouncedInputValue} clearSearch={clearSearch} onWallpaperApply={onWallpaperApply} onWallpaperDownload={onWallpaperDownload} scalingOptions={scalingOptions} - infiniteScrollRef={infiniteScrollRef} controlDefinitions={controlDefinitions} />
diff --git a/src/renderer/styles/globals.css b/src/renderer/styles/globals.css index c95fd66..45d9d0a 100644 --- a/src/renderer/styles/globals.css +++ b/src/renderer/styles/globals.css @@ -1,6 +1,5 @@ @import "tailwindcss"; @import "tw-animate-css"; - @custom-variant dark (&:is(.dark *)); :root { @@ -117,13 +116,36 @@ * { @apply border-border outline-ring/50; } + + ::-webkit-scrollbar { + @apply h-2.5 w-2.5; + } + + ::-webkit-scrollbar-track { + @apply bg-transparent; + } + + ::-webkit-scrollbar-thumb { + @apply bg-border rounded-full border-[1px] border-solid border-transparent bg-clip-padding; + } + + ::-webkit-scrollbar-button { + @apply h-0 w-0; + } + + ::-webkit-scrollbar:horizontal { + @apply hidden; + } + body { @apply bg-background text-foreground; } + button, [role="button"] { cursor: pointer; } + .draglayer { -webkit-app-region: drag; } From 4e25933dc529a27494a011bb37c01d4af867bfb9 Mon Sep 17 00:00:00 2001 From: Kasper24 Date: Wed, 6 Aug 2025 07:02:44 +0300 Subject: [PATCH 3/9] refactor: unify pagination and default query behavior across providers - Replaced `limit` with `perPage` in `wallpaper.search` schema for consistency - Set default `query` to "wallpaper" if empty for Pexels, Unsplash - Added default values for `perPage` in Pexels, Unsplash, and Wallpaper Engine routes - Removed redundant fallback logic in API request building - Adjusted frontend calls to omit `limit` where unnecessary --- src/electron/main/trpc/routes/api/pexels/index.ts | 13 ++++++++----- src/electron/main/trpc/routes/api/unsplash/index.ts | 9 ++++++--- .../main/trpc/routes/api/wallpaper-engine/index.ts | 6 +++--- src/electron/main/trpc/routes/wallpaper/index.ts | 4 ++-- src/renderer/tabs/library/tabs/image.tsx | 1 - src/renderer/tabs/library/tabs/video.tsx | 1 - src/renderer/tabs/library/tabs/wallpaper-engine.tsx | 1 - 7 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/electron/main/trpc/routes/api/pexels/index.ts b/src/electron/main/trpc/routes/api/pexels/index.ts index 0bc7168..79f26dc 100644 --- a/src/electron/main/trpc/routes/api/pexels/index.ts +++ b/src/electron/main/trpc/routes/api/pexels/index.ts @@ -99,9 +99,12 @@ const transformVideos = (videos: PexelsVideo[]): ApiWallpaper[] => { const pexelsSearchParamsSchema = z.object({ type: z.enum(["photos", "videos"]), apiKey: z.string().min(1, "API Key is required"), - query: z.string().optional(), + query: z + .string() + .transform((q) => (q && q.trim() !== "" ? q : "wallpaper")) + .default("wallpaper"), page: z.number().min(1), - perPage: z.number().optional(), + perPage: z.number().min(1).default(100), orientation: z.enum(["landscape", "portrait", "square"]).optional(), size: z.enum(["large", "medium", "small"]).optional(), color: z @@ -133,9 +136,9 @@ export const pexelsRouter = router({ const url = new URL(baseUrl); const params = url.searchParams; - params.set("query", input.query || "wallpaper"); + params.set("query", input.query); params.set("page", input.page.toString()); - params.set("per_page", (input.perPage || 30).toString()); + params.set("per_page", input.perPage.toString()); if (input.orientation) params.set("orientation", input.orientation); if (input.size) params.set("size", input.size); if (input.color) params.set("color", input.color); @@ -152,7 +155,7 @@ export const pexelsRouter = router({ }); const data: PexelsSearchResponse = await response.json(); - const numberOfPages = Math.ceil(data.total_results / (input.perPage || 30)); + const numberOfPages = Math.ceil(data.total_results / input.perPage); let transformedData: ApiWallpaper[] = []; if (input.type === "photos" && data.photos) { diff --git a/src/electron/main/trpc/routes/api/unsplash/index.ts b/src/electron/main/trpc/routes/api/unsplash/index.ts index e3f1c63..39518a4 100644 --- a/src/electron/main/trpc/routes/api/unsplash/index.ts +++ b/src/electron/main/trpc/routes/api/unsplash/index.ts @@ -164,9 +164,12 @@ const transformWallpapers = (photos: UnsplashPhoto[]): ApiWallpaper[] => { const unsplashSearchParamsSchema = z.object({ apiKey: z.string().min(1, "API Key is required"), - query: z.string(), + query: z + .string() + .transform((q) => (q && q.trim() !== "" ? q : "wallpaper")) + .default("wallpaper"), page: z.number().min(1), - perPage: z.number().min(1).optional().default(30), + perPage: z.number().min(1).max(30).default(30), orderBy: z.enum(["relevant", "latest"]).optional().default("relevant"), orientation: z.enum(["landscape", "portrait", "squarish"]).optional(), color: z @@ -195,7 +198,7 @@ export const unsplashRouter = router({ params.set("page", input.page.toString()); params.set("per_page", input.perPage.toString()); params.set("order_by", input.orderBy); - params.set("query", input.query || "wallpaper"); + params.set("query", input.query); if (input.orientation) params.set("orientation", input.orientation); if (input.color) params.set("color", input.color); diff --git a/src/electron/main/trpc/routes/api/wallpaper-engine/index.ts b/src/electron/main/trpc/routes/api/wallpaper-engine/index.ts index 5fead17..5ea91c5 100644 --- a/src/electron/main/trpc/routes/api/wallpaper-engine/index.ts +++ b/src/electron/main/trpc/routes/api/wallpaper-engine/index.ts @@ -82,7 +82,7 @@ const transformWallpapers = (wallpapers: WallpaperEngineWorkshopItem[]): BaseWal const searchSchema = z.object({ apiKey: z.string().min(1, "API Key is required"), page: z.number().min(1), - perPage: z.number().min(1).optional().default(100), + perPage: z.number().min(1).default(100), query: z.string().optional(), tags: z.array(z.string()).optional(), sorting: z.string().optional(), @@ -102,8 +102,8 @@ export const wallpaperEngineRouter = router({ params.set("key", input.apiKey); params.set("creator_appid", "431960"); params.set("appid", "431960"); - params.set("page", `${input.page}`); - params.set("numperpage", `${input.perPage}`); + params.set("page", input.page.toString()); + params.set("numperpage", input.perPage.toString()); params.set("format", "json"); params.set("return_tags", "true"); params.set("return_previews", "true"); diff --git a/src/electron/main/trpc/routes/wallpaper/index.ts b/src/electron/main/trpc/routes/wallpaper/index.ts index 7534301..f0ffaaf 100644 --- a/src/electron/main/trpc/routes/wallpaper/index.ts +++ b/src/electron/main/trpc/routes/wallpaper/index.ts @@ -63,7 +63,7 @@ export interface WallpaperData { const searchWallpapersSchema = z.object({ type: z.enum(["image", "video", "wallpaper-engine", "all"]), page: z.number().min(1).default(1), - limit: z.number().min(1).default(10), + perPage: z.number().min(1).default(20), query: z.string().optional(), sorting: z.enum(["name", "date_added", "id"]).default("name"), tags: z.array(z.string()).optional(), @@ -138,7 +138,7 @@ export const wallpaperRouter = router({ ); const sortedWallpapers = sortWallpapers(filteredWallpapers, input.sorting); - return paginateData(sortedWallpapers, input.page, input.limit); + return paginateData(sortedWallpapers, input.page, input.perPage); }), set: publicProcedure.input(setWallpaperSchema).mutation(async ({ input }) => { diff --git a/src/renderer/tabs/library/tabs/image.tsx b/src/renderer/tabs/library/tabs/image.tsx index aa5b3fa..5fcc6e0 100644 --- a/src/renderer/tabs/library/tabs/image.tsx +++ b/src/renderer/tabs/library/tabs/image.tsx @@ -43,7 +43,6 @@ const LibraryImageTab = () => { await client.wallpaper.search.query({ type: "image", page: pageParam, - limit: 20, query: query || "", }) } diff --git a/src/renderer/tabs/library/tabs/video.tsx b/src/renderer/tabs/library/tabs/video.tsx index 22096a9..44499d6 100644 --- a/src/renderer/tabs/library/tabs/video.tsx +++ b/src/renderer/tabs/library/tabs/video.tsx @@ -43,7 +43,6 @@ const LibraryVideoTab = () => { await client.wallpaper.search.query({ type: "video", page: pageParam, - limit: 20, query: query || "", }) } diff --git a/src/renderer/tabs/library/tabs/wallpaper-engine.tsx b/src/renderer/tabs/library/tabs/wallpaper-engine.tsx index 7b7414c..7b79c11 100644 --- a/src/renderer/tabs/library/tabs/wallpaper-engine.tsx +++ b/src/renderer/tabs/library/tabs/wallpaper-engine.tsx @@ -46,7 +46,6 @@ const LibraryWallpaperEngineTab = () => { return await client.wallpaper.search.query({ type: "wallpaper-engine", page: pageParam, - limit: 50, sorting: sorting, query, tags, From 8ca72e9d01bb9684a49270e938cbace409eaab13 Mon Sep 17 00:00:00 2001 From: Kasper24 Date: Wed, 6 Aug 2025 07:13:18 +0300 Subject: [PATCH 4/9] fix: move apply button inside scroll area for better layout behavior - Shifted `DialogFooter` inside `ScrollArea` to ensure proper spacing and consistent scroll behavior. - Adjusted padding to align content more cleanly. --- .../wallpaper-dialog/apply-dialog.tsx | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/renderer/components/wallpaper-dialog/apply-dialog.tsx b/src/renderer/components/wallpaper-dialog/apply-dialog.tsx index d5cd1c4..583e5b4 100644 --- a/src/renderer/components/wallpaper-dialog/apply-dialog.tsx +++ b/src/renderer/components/wallpaper-dialog/apply-dialog.tsx @@ -104,8 +104,8 @@ const ApplyWallpaperDialog = ({ - -
+ +
@@ -141,15 +141,15 @@ const ApplyWallpaperDialog = ({
)}
-
- - - - - + + + + + + ); }; From 28c3c39910ba0170397025634dd11110f219f652 Mon Sep 17 00:00:00 2001 From: Kasper24 Date: Wed, 6 Aug 2025 07:15:32 +0300 Subject: [PATCH 5/9] fix: update setting key for lastWallpaperCmd to use internal namespace - Changed `theme.lastWallpaperCmd` to `internal.lastWallpaperCmd` when setting wallpaper engine command --- src/electron/main/trpc/routes/wallpaper/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/electron/main/trpc/routes/wallpaper/index.ts b/src/electron/main/trpc/routes/wallpaper/index.ts index f0ffaaf..4d68d78 100644 --- a/src/electron/main/trpc/routes/wallpaper/index.ts +++ b/src/electron/main/trpc/routes/wallpaper/index.ts @@ -548,7 +548,7 @@ const setWallpaperEngineWallpaper = async ( } await caller.settings.set({ - key: "theme.lastWallpaperCmd", + key: "internal.lastWallpaperCmd", value: { command: "linux-wallpaperengine", args, From bac92ae14cc58d09c099aeaa51da648e3653f95c Mon Sep 17 00:00:00 2001 From: Kasper24 Date: Wed, 6 Aug 2025 07:29:02 +0300 Subject: [PATCH 6/9] refactor: add detached param to execute --- src/electron/main/lib/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/electron/main/lib/index.ts b/src/electron/main/lib/index.ts index 5ac8d50..80c0238 100644 --- a/src/electron/main/lib/index.ts +++ b/src/electron/main/lib/index.ts @@ -6,6 +6,7 @@ const execute = ({ args = [], env = {}, shell = false, + detached = false, logStdout = true, logStderr = true, }: { @@ -13,6 +14,7 @@ const execute = ({ args?: string[]; env?: NodeJS.ProcessEnv; shell?: boolean; + detached?: boolean; logStdout?: boolean; logStderr?: boolean; }): Promise<{ stdout: string; stderr: string }> => { @@ -24,6 +26,7 @@ const execute = ({ ...process.env, ...env, }, + detached: detached, shell, }); From 60448c79add393a4fa84a0c3379ebd9844b98968 Mon Sep 17 00:00:00 2001 From: Kasper24 Date: Wed, 6 Aug 2025 07:39:07 +0300 Subject: [PATCH 7/9] refactor(dialogs): simplify DialogContent layout and adjust DialogFooter spacing - Removed explicit max-width/height constraints from ApplyWallpaperDialog - Moved DialogFooter outside ScrollArea for cleaner layout - Updated WallpaperDialog to remove redundant width constraints --- .../wallpaper-dialog/apply-dialog.tsx | 18 +++++++++--------- .../components/wallpaper-dialog/index.tsx | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/renderer/components/wallpaper-dialog/apply-dialog.tsx b/src/renderer/components/wallpaper-dialog/apply-dialog.tsx index 583e5b4..5b607db 100644 --- a/src/renderer/components/wallpaper-dialog/apply-dialog.tsx +++ b/src/renderer/components/wallpaper-dialog/apply-dialog.tsx @@ -96,7 +96,7 @@ const ApplyWallpaperDialog = ({ } return ( - + Apply Wallpaper: {wallpaper.name} @@ -141,15 +141,15 @@ const ApplyWallpaperDialog = ({ )} - - - - - - + + + + + + ); }; diff --git a/src/renderer/components/wallpaper-dialog/index.tsx b/src/renderer/components/wallpaper-dialog/index.tsx index d01affd..a42c69e 100644 --- a/src/renderer/components/wallpaper-dialog/index.tsx +++ b/src/renderer/components/wallpaper-dialog/index.tsx @@ -71,7 +71,7 @@ const WallpaperDialog = ({ ); return ( - +
From 2ef156d82f7068b392661fee27ef921ad1f2e48f Mon Sep 17 00:00:00 2001 From: Kasper24 Date: Wed, 6 Aug 2025 07:46:12 +0300 Subject: [PATCH 8/9] fix: remove unused import --- src/renderer/components/wallpapers-grid/content-components.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/renderer/components/wallpapers-grid/content-components.tsx b/src/renderer/components/wallpapers-grid/content-components.tsx index f53cd4c..4d1d413 100644 --- a/src/renderer/components/wallpapers-grid/content-components.tsx +++ b/src/renderer/components/wallpapers-grid/content-components.tsx @@ -30,7 +30,6 @@ import { type DynamicControlDefinition } from "@renderer/components/wallpaper-di import { useCurrentTab } from "@renderer/providers/current-tab/hook.js"; import { cn } from "@renderer/lib/cn.js"; import { ConfigurationRequirement, OnWallpaperApply, OnWallpaperDownload } from "./types.js"; -import { Skeleton } from "../ui/skeleton.js"; export const ConfigurationScreen = ({ requirement, From e6ed865061bd95528b4b81b20635b28c91da1001 Mon Sep 17 00:00:00 2001 From: Kasper24 Date: Wed, 6 Aug 2025 07:57:01 +0300 Subject: [PATCH 9/9] fix:chore: remove obsolete opacity styling during infinite scroll fetch --- .../components/wallpapers-grid/content-components.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/renderer/components/wallpapers-grid/content-components.tsx b/src/renderer/components/wallpapers-grid/content-components.tsx index 4d1d413..dcc1307 100644 --- a/src/renderer/components/wallpapers-grid/content-components.tsx +++ b/src/renderer/components/wallpapers-grid/content-components.tsx @@ -28,7 +28,6 @@ import { Separator } from "@renderer/components/ui/separator.js"; import WallpaperDialog from "@renderer/components/wallpaper-dialog/index.js"; import { type DynamicControlDefinition } from "@renderer/components/wallpaper-dialog/types.js"; import { useCurrentTab } from "@renderer/providers/current-tab/hook.js"; -import { cn } from "@renderer/lib/cn.js"; import { ConfigurationRequirement, OnWallpaperApply, OnWallpaperDownload } from "./types.js"; export const ConfigurationScreen = ({ @@ -482,11 +481,7 @@ export const WallpaperGrid = ({ } return ( -
+
{ // Force re-render on resize to recompute grid size