add configuration for column/row borders

This commit is contained in:
jeffvli
2026-02-09 02:11:08 -08:00
parent 7bb54f9fa0
commit 9e448f7266
2 changed files with 41 additions and 0 deletions
@@ -140,6 +140,14 @@
color: var(--theme-colors-foreground-muted); color: var(--theme-colors-foreground-muted);
} }
.row .track-cell-with-vertical-border {
border-right: 1px solid transparent;
}
.row .track-cell-vertical-border-visible {
border-right-color: var(--theme-colors-border);
}
.row .track-cell-image { .row .track-cell-image {
display: flex; display: flex;
align-self: stretch; align-self: stretch;
@@ -164,6 +172,14 @@
opacity: 0.5; opacity: 0.5;
} }
.track-row.track-row-with-horizontal-border {
border-top: 1px solid transparent;
}
.track-row.track-row-horizontal-border-visible {
border-top-color: var(--theme-colors-border);
}
.track-row.track-row-hover-highlight-enabled { .track-row.track-row-hover-highlight-enabled {
position: relative; position: relative;
} }
@@ -55,7 +55,9 @@ interface RowData {
columnWidthPercents: number[]; columnWidthPercents: number[];
controls?: ItemControls; controls?: ItemControls;
data: unknown[]; data: unknown[];
enableHorizontalBorders: boolean;
enableRowHoverHighlight: boolean; enableRowHoverHighlight: boolean;
enableVerticalBorders: boolean;
getItem?: (index: number) => unknown; getItem?: (index: number) => unknown;
internalState: ItemListStateActions; internalState: ItemListStateActions;
isMutatingFavorite: boolean; isMutatingFavorite: boolean;
@@ -68,7 +70,9 @@ interface TrackRowProps {
columns: ItemTableListColumnConfig[]; columns: ItemTableListColumnConfig[];
columnWidthPercents: number[]; columnWidthPercents: number[];
controls?: ItemControls; controls?: ItemControls;
enableHorizontalBorders: boolean;
enableRowHoverHighlight: boolean; enableRowHoverHighlight: boolean;
enableVerticalBorders: boolean;
internalState: ItemListStateActions; internalState: ItemListStateActions;
isMutatingFavorite: boolean; isMutatingFavorite: boolean;
onFavoriteClick: (song: Song) => void; onFavoriteClick: (song: Song) => void;
@@ -85,7 +89,9 @@ const TrackRow = memo(
columns, columns,
columnWidthPercents, columnWidthPercents,
controls, controls,
enableHorizontalBorders,
enableRowHoverHighlight, enableRowHoverHighlight,
enableVerticalBorders,
internalState, internalState,
isMutatingFavorite, isMutatingFavorite,
onFavoriteClick, onFavoriteClick,
@@ -189,11 +195,14 @@ const TrackRow = memo(
<div <div
className={clsx(styles.trackRow, { className={clsx(styles.trackRow, {
[styles.trackRowDragging]: isDragging, [styles.trackRowDragging]: isDragging,
[styles.trackRowHorizontalBorderVisible]:
enableHorizontalBorders && rowIndex > 0,
[styles.trackRowHoverHighlightEnabled]: enableRowHoverHighlight, [styles.trackRowHoverHighlightEnabled]: enableRowHoverHighlight,
[styles.trackRowSelected]: isSelected, [styles.trackRowSelected]: isSelected,
[styles.trackRowSizeCompact]: size === 'compact', [styles.trackRowSizeCompact]: size === 'compact',
[styles.trackRowSizeDefault]: size === 'default', [styles.trackRowSizeDefault]: size === 'default',
[styles.trackRowSizeLarge]: size === 'large', [styles.trackRowSizeLarge]: size === 'large',
[styles.trackRowWithHorizontalBorder]: rowIndex > 0,
})} })}
onClick={handleRowClick} onClick={handleRowClick}
onMouseEnter={() => setIsRowHovered(true)} onMouseEnter={() => setIsRowHovered(true)}
@@ -237,11 +246,15 @@ const TrackRow = memo(
'\u00A0' '\u00A0'
); );
const isLastColumn = colIndex === columns.length - 1;
return ( return (
<div <div
className={clsx(styles.trackCell, { className={clsx(styles.trackCell, {
[styles.trackCellImage]: isImageColumn, [styles.trackCellImage]: isImageColumn,
[styles.trackCellMuted]: !isTitleColumn, [styles.trackCellMuted]: !isTitleColumn,
[styles.trackCellVerticalBorderVisible]:
enableVerticalBorders && !isLastColumn,
[styles.trackCellWithVerticalBorder]: !isLastColumn,
})} })}
key={col.id} key={col.id}
role="cell" role="cell"
@@ -265,7 +278,9 @@ const RowContent = memo(
columnWidthPercents, columnWidthPercents,
controls, controls,
data, data,
enableHorizontalBorders,
enableRowHoverHighlight, enableRowHoverHighlight,
enableVerticalBorders,
getItem, getItem,
index, index,
internalState, internalState,
@@ -392,7 +407,9 @@ const RowContent = memo(
columns={trackColumns} columns={trackColumns}
columnWidthPercents={columnWidthPercents} columnWidthPercents={columnWidthPercents}
controls={controls} controls={controls}
enableHorizontalBorders={enableHorizontalBorders}
enableRowHoverHighlight={enableRowHoverHighlight} enableRowHoverHighlight={enableRowHoverHighlight}
enableVerticalBorders={enableVerticalBorders}
internalState={internalState} internalState={internalState}
isMutatingFavorite={isMutatingFavorite} isMutatingFavorite={isMutatingFavorite}
key={song.id} key={song.id}
@@ -411,7 +428,9 @@ const RowContent = memo(
prev.index === next.index && prev.index === next.index &&
prev.data === next.data && prev.data === next.data &&
prev.columnWidthPercents === next.columnWidthPercents && prev.columnWidthPercents === next.columnWidthPercents &&
prev.enableHorizontalBorders === next.enableHorizontalBorders &&
prev.enableRowHoverHighlight === next.enableRowHoverHighlight && prev.enableRowHoverHighlight === next.enableRowHoverHighlight &&
prev.enableVerticalBorders === next.enableVerticalBorders &&
prev.getItem === next.getItem && prev.getItem === next.getItem &&
prev.internalState === next.internalState && prev.internalState === next.internalState &&
prev.isMutatingFavorite === next.isMutatingFavorite && prev.isMutatingFavorite === next.isMutatingFavorite &&
@@ -508,6 +527,8 @@ export const ItemDetailList = ({
}, [tableConfig?.columns]); }, [tableConfig?.columns]);
const trackTableSize = tableConfig?.size ?? 'default'; const trackTableSize = tableConfig?.size ?? 'default';
const enableRowHoverHighlight = tableConfig?.enableRowHoverHighlight ?? true; const enableRowHoverHighlight = tableConfig?.enableRowHoverHighlight ?? true;
const enableHorizontalBorders = tableConfig?.enableHorizontalBorders ?? false;
const enableVerticalBorders = tableConfig?.enableVerticalBorders ?? false;
const columnWidthPercents = useMemo(() => { const columnWidthPercents = useMemo(() => {
const total = trackColumns.reduce((sum, c) => sum + c.width, 0); const total = trackColumns.reduce((sum, c) => sum + c.width, 0);
@@ -546,7 +567,9 @@ export const ItemDetailList = ({
columnWidthPercents, columnWidthPercents,
controls, controls,
data: dataSource, data: dataSource,
enableHorizontalBorders,
enableRowHoverHighlight, enableRowHoverHighlight,
enableVerticalBorders,
getItem, getItem,
internalState, internalState,
isMutatingFavorite, isMutatingFavorite,
@@ -559,7 +582,9 @@ export const ItemDetailList = ({
columnWidthPercents, columnWidthPercents,
controls, controls,
dataSource, dataSource,
enableHorizontalBorders,
enableRowHoverHighlight, enableRowHoverHighlight,
enableVerticalBorders,
getItem, getItem,
internalState, internalState,
isMutatingFavorite, isMutatingFavorite,