{/* A narrow table drops Channel and its funnel with it: the cue keeps its filter named. */}
{/* table-fixed, not auto: every column but the title has a declared width, so the
title absorbs the rest and its `truncate` works. Auto layout sizes columns from
min-content, and a nowrap title cell's min-content is the entire title. */}
v.id)}
strategy={verticalListSortingStrategy}
>
{/* The rows are a keyboard list: `j`/`k` and the arrows walk them, Enter plays. The grip
keeps Space/Enter, and during a keyboard drag the arrows too (listNav leaves a key
dnd-kit has handled). */}
{
const v = shownRef.current[i];
if (v) void removeItem(v);
}
: undefined
}
selection={
canEdit
? {
toggle: (i) => {
const v = shownRef.current[i];
if (v) selection.toggle(v.id);
},
clear: () => {
leaveBand();
return selection.clear();
},
removeSelected: () => {
if (!bandUp) return false;
// Nothing happens to a row the reader cannot see, and neither to the
// row under the keyboard, which no one selected.
if (selection.shownSelected.length) removeSelected();
else
notify({
level: "warning",
message: msg("playlists.removeAllHidden"),
});
return true;
},
}
: undefined
}
>
{shown.map((v, i) => (
))}
{shown.length === 0 && (
{t("playlists.noneMatchFilter")}
)}
{/* On : the page's scroller contains anything fixed, and the rail lies outside it.
Above every layer (the tooltip's level, by its token: dnd-kit's `zIndex` takes a number
only, and its `style` comes after it), and no way back to fly: it drops or stays. Out of
the pointer's way: lying under it, it kept the rail's tab from peeking open. */}