From 10d948db61034474730e1fad3522d1b5b315b1af Mon Sep 17 00:00:00 2001 From: Psychotoxical <171614930+Psychotoxical@users.noreply.github.com> Date: Tue, 30 Jun 2026 21:28:03 +0200 Subject: [PATCH] =?UTF-8?q?refactor(lib):=20relocate=20cardGridLayout=20?= =?UTF-8?q?=E2=86=92=20lib/util=20(store-free)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cardGridLayout's only store dep was three grid-column constants it imported from authStoreDefaults. Flipped ownership: the constants now live in lib/util/cardGridLayout (pure layout config) and authStoreDefaults re-exports them (store→lib), so the auth settings clamp/default and every existing consumer are unchanged. cardGridLayout is now store-free and homes in lib/util alongside the other pure helpers — consumed cleanly by ui/VirtualCardGrid + cover/layoutSizes. Resolves the documented store-free-lib block for the card-grid layout helper. Pure move + constant relocation; tests pass unmodified. --- src/cover/layoutSizes.ts | 2 +- src/features/album/pages/Albums.tsx | 2 +- src/hooks/useCardGridMetrics.ts | 2 +- src/{utils => lib/util}/cardGridLayout.test.ts | 4 ++-- src/{utils => lib/util}/cardGridLayout.ts | 13 +++++++------ src/store/authStoreDefaults.ts | 14 ++++++++++---- src/ui/VirtualCardGrid.tsx | 2 +- 7 files changed, 23 insertions(+), 16 deletions(-) rename src/{utils => lib/util}/cardGridLayout.test.ts (97%) rename src/{utils => lib/util}/cardGridLayout.ts (81%) diff --git a/src/cover/layoutSizes.ts b/src/cover/layoutSizes.ts index ffe2b9a0..ce6f074f 100644 --- a/src/cover/layoutSizes.ts +++ b/src/cover/layoutSizes.ts @@ -1,4 +1,4 @@ -import { computeCardGridColumnCount, computeCellWidthPx } from '../utils/cardGridLayout'; +import { computeCardGridColumnCount, computeCellWidthPx } from '@/lib/util/cardGridLayout'; export const COVER_DENSE_SEARCH_CSS_PX = 40; /** Artist detail top-track thumb (32×32 CSS px). */ diff --git a/src/features/album/pages/Albums.tsx b/src/features/album/pages/Albums.tsx index ca11cd1c..ff458415 100644 --- a/src/features/album/pages/Albums.tsx +++ b/src/features/album/pages/Albums.tsx @@ -7,7 +7,7 @@ import { albumGridWarmCovers, coverDisplayCssPxForAlbumGrid } from '@/cover/layo import { useLibraryCoverPrefetch } from '@/cover/useLibraryCoverPrefetch'; import { useAuthStore } from '@/store/authStore'; import { clampLibraryGridMaxColumns } from '@/store/authStoreHelpers'; -import { computeCardGridColumnCount } from '@/utils/cardGridLayout'; +import { computeCardGridColumnCount } from '@/lib/util/cardGridLayout'; import GenreFilterBar from '@/ui/GenreFilterBar'; import YearFilterButton from '@/ui/YearFilterButton'; import StarFilterButton from '@/ui/StarFilterButton'; diff --git a/src/hooks/useCardGridMetrics.ts b/src/hooks/useCardGridMetrics.ts index f7c80ae1..35271d09 100644 --- a/src/hooks/useCardGridMetrics.ts +++ b/src/hooks/useCardGridMetrics.ts @@ -6,7 +6,7 @@ import { computeCardGridColumnCount, computeCellWidthPx, estimateRowHeightPx, -} from '../utils/cardGridLayout'; +} from '@/lib/util/cardGridLayout'; /** * ResizeObserver-driven column count (capped by Settings → Library) and diff --git a/src/utils/cardGridLayout.test.ts b/src/lib/util/cardGridLayout.test.ts similarity index 97% rename from src/utils/cardGridLayout.test.ts rename to src/lib/util/cardGridLayout.test.ts index 1f2740c2..db922ff3 100644 --- a/src/utils/cardGridLayout.test.ts +++ b/src/lib/util/cardGridLayout.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { computeCardGridColumnCount, estimateRowHeightPx } from './cardGridLayout'; -import { LIBRARY_GRID_MAX_COLUMNS_MAX, LIBRARY_GRID_MAX_COLUMNS_MIN } from '../store/authStoreDefaults'; +import { computeCardGridColumnCount, estimateRowHeightPx } from '@/lib/util/cardGridLayout'; +import { LIBRARY_GRID_MAX_COLUMNS_MAX, LIBRARY_GRID_MAX_COLUMNS_MIN } from '@/store/authStoreDefaults'; describe('estimateRowHeightPx', () => { describe('composer variant', () => { diff --git a/src/utils/cardGridLayout.ts b/src/lib/util/cardGridLayout.ts similarity index 81% rename from src/utils/cardGridLayout.ts rename to src/lib/util/cardGridLayout.ts index c754b2a0..413589b4 100644 --- a/src/utils/cardGridLayout.ts +++ b/src/lib/util/cardGridLayout.ts @@ -3,16 +3,17 @@ * and row-height estimates derived from measured cell width (TanStack virtual rows). */ -import { - DEFAULT_LIBRARY_GRID_MAX_COLUMNS, - LIBRARY_GRID_MAX_COLUMNS_MAX, - LIBRARY_GRID_MAX_COLUMNS_MIN, -} from '../store/authStoreDefaults'; +// Library grid column config. Owned here (pure layout math) and re-exported by +// authStoreDefaults, which clamps/defaults the user's libraryGridMaxColumns +// setting against them — keeps this module store-free so ui/ + cover/ can use it. +export const DEFAULT_LIBRARY_GRID_MAX_COLUMNS = 6; +export const LIBRARY_GRID_MAX_COLUMNS_MIN = 4; +export const LIBRARY_GRID_MAX_COLUMNS_MAX = 12; export const CARD_GRID_GAP_PX = 16; export const CARD_GRID_MIN_TILE_PX = 140; -/** @deprecated use `DEFAULT_LIBRARY_GRID_MAX_COLUMNS` from `authStoreDefaults` */ +/** @deprecated use `DEFAULT_LIBRARY_GRID_MAX_COLUMNS` */ export const CARD_GRID_MAX_COLS = DEFAULT_LIBRARY_GRID_MAX_COLUMNS; export function computeCardGridColumnCount(containerWidthPx: number, maxColumns: number): number { diff --git a/src/store/authStoreDefaults.ts b/src/store/authStoreDefaults.ts index 96034a65..5cba2189 100644 --- a/src/store/authStoreDefaults.ts +++ b/src/store/authStoreDefaults.ts @@ -42,7 +42,13 @@ export const MIX_MIN_RATING_FILTER_MAX_STARS = 3; export const RANDOM_MIX_SIZE_OPTIONS: readonly number[] = [50, 75, 100, 125, 150]; -/** Default max columns for album/artist/playlist card grids (Settings → Library). */ -export const DEFAULT_LIBRARY_GRID_MAX_COLUMNS = 6; -export const LIBRARY_GRID_MAX_COLUMNS_MIN = 4; -export const LIBRARY_GRID_MAX_COLUMNS_MAX = 12; +/** + * Default + clamp bounds for album/artist/playlist card grids (Settings → Library). + * Defined in lib/util/cardGridLayout (store-free layout math) and re-exported here + * so the auth-store settings clamp/default and all existing consumers are unchanged. + */ +export { + DEFAULT_LIBRARY_GRID_MAX_COLUMNS, + LIBRARY_GRID_MAX_COLUMNS_MIN, + LIBRARY_GRID_MAX_COLUMNS_MAX, +} from '@/lib/util/cardGridLayout'; diff --git a/src/ui/VirtualCardGrid.tsx b/src/ui/VirtualCardGrid.tsx index c2efddd9..bd1b7a73 100644 --- a/src/ui/VirtualCardGrid.tsx +++ b/src/ui/VirtualCardGrid.tsx @@ -7,7 +7,7 @@ import { useElementClientHeightById } from '@/lib/hooks/useResizeClientHeight'; import { useCardGridMetrics } from '@/hooks/useCardGridMetrics'; import { useRemeasureGridVirtualizer } from '@/lib/hooks/useRemeasureGridVirtualizer'; import { useVirtualizerScrollMargin } from '@/lib/hooks/useVirtualizerScrollMargin'; -import type { CardGridRowHeightVariant } from '@/utils/cardGridLayout'; +import type { CardGridRowHeightVariant } from '@/lib/util/cardGridLayout'; export type VirtualCardGridProps = { items: readonly T[];