refactor(lib): relocate cardGridLayout → lib/util (store-free)

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.
This commit is contained in:
Psychotoxical
2026-06-30 21:28:03 +02:00
parent c37d5f7389
commit 10d948db61
7 changed files with 23 additions and 16 deletions
+1 -1
View File
@@ -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). */
+1 -1
View File
@@ -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';
+1 -1
View File
@@ -6,7 +6,7 @@ import {
computeCardGridColumnCount,
computeCellWidthPx,
estimateRowHeightPx,
} from '../utils/cardGridLayout';
} from '@/lib/util/cardGridLayout';
/**
* ResizeObserver-driven column count (capped by Settings → Library) and
@@ -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', () => {
@@ -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 {
+10 -4
View File
@@ -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';
+1 -1
View File
@@ -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<T> = {
items: readonly T[];