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[];