import { createMemo, createSignal, For, Show } from "solid-js"; import { StackCard } from "./StackCard"; import type { CardId, StackBodies, StackCardSpec } from "./types"; interface StackDeckProps { active: CardId; onActiveChange: (id: CardId) => void; onBack: () => void; cards: readonly StackCardSpec[]; bodies: StackBodies; } const EXPANDED_H = 248; const FOCUS_H = 420; const TAB_H = 46; const TAB_OVERLAP = 14; export function StackDeck(props: StackDeckProps) { const [deckOpen, setDeckOpen] = createSignal(true); const activeIndex = createMemo(() => { const idx = props.cards.findIndex((card) => card.id === props.active); return idx >= 0 ? idx : 0; }); return (
Settings
{activeIndex() + 1} / {props.cards.length}
{(card, index) => { const active = () => card.id === props.active; const concealed = () => !deckOpen() && !active(); const distance = createMemo(() => { const ai = activeIndex(); const ci = index(); if (ci === ai) return -1; if (ci > ai) return ci - ai - 1; return props.cards.length - ai + ci - 1; }); const top = () => { if (active()) return 0; if (!deckOpen()) return FOCUS_H + 44 + distance() * 8; return EXPANDED_H + distance() * (TAB_H - TAB_OVERLAP); }; const zIndex = () => (active() ? 99 : 50 - distance()); return ( { if (active()) return; props.onActiveChange(card.id); setDeckOpen(false); }} > {props.bodies[card.id]} ); }}
); }