diff --git a/src/index.css b/src/index.css index a2bb45d..86a3842 100644 --- a/src/index.css +++ b/src/index.css @@ -103,51 +103,60 @@ html.dark .busy-overlay{background:rgba(15,23,42,.7);color:#cbd5e1} @media (prefers-reduced-motion:reduce){.busy-spinner{animation-duration:2.4s}} - /* - * Horizontally pinned catalog columns (Use + Ticker). Sticky positioning is - * applied directly to the pinned / cells (see .catalog-sticky-col - * below) -- never to a wrapper nested inside an otherwise-static cell. A - * sticky element can't move past the bounds of its own containing block; if - * that block were a static parent cell instead of the cell itself, the pin - * would silently vanish once the row scrolled past the viewport edge. Verify - * by actually scrolling all the way to the right, not just by reading this - * CSS. + * Horizontal pinning for the catalog table: the Use checkbox and the + * Ticker stay visible while the remaining columns (including the row + * number) move horizontally. `position:sticky` is applied directly to the + * `th`/`td` — NOT to a nested wrapper. A sticky element can never move + * past the bounds of its own containing block, so a sticky *child* inside + * a plain `position:static` cell stops being visible the moment that + * cell's own (unscrolled) position scrolls past the viewport edge: the pin + * silently stops working exactly when it matters most. The same direct-cell + * rule pins the Watchlist Ticker column at the left edge. + * + * The colors are this repo's own Tailwind tokens, pre-blended to solid + * values: a sticky cell repaints on top of whatever column has scrolled + * behind it, so a translucent fill (this repo's `.selected-row` uses + * rgba(30,64,175,.22) in dark mode) would let that column's text show + * through. Base #172033 = slate-800/50 over slate-900, hover #1f2a3d = + * slate-700/30 over that, selected #19274e = rgba(30,64,175,.22) over + * that; light-mode #f8fafc / #eff6ff are already opaque. */ - #table-scroll table{min-width:max-content;border-collapse:separate;border-spacing:0;isolation:isolate} + #table-scroll table{border-collapse:separate;border-spacing:0;isolation:isolate} #table-scroll tbody{position:relative;z-index:0} #table-scroll tbody tr{position:relative;z-index:0} #table-scroll .catalog-sticky-col{position:sticky;background:#fff;background-clip:padding-box} #table-scroll thead .catalog-sticky-col{top:0;z-index:30;background:#f8fafc} #table-scroll tbody .catalog-sticky-col{z-index:20} #table-scroll .catalog-sticky-use{left:0;width:5rem;min-width:5rem} - #table-scroll .catalog-sticky-ticker{left:5rem;width:7rem;min-width:7rem;box-shadow:4px 0 6px -6px rgba(15,23,42,.7)} - .dark #table-scroll .catalog-sticky-col{background:#162032} - .dark #table-scroll thead .catalog-sticky-col{background:#0f172a} - #table-scroll tbody tr:hover .catalog-sticky-col{background:#f8fafc} - #table-scroll tbody tr.selected-row .catalog-sticky-col{background:#eff6ff} - .dark #table-scroll tbody tr:hover .catalog-sticky-col{background:#1f2a3c} - .dark #table-scroll tbody tr.selected-row .catalog-sticky-col{background:#18274e} - - /* Horizontally pinned Watchlist Ticker column at the left edge. - Same opaque-background + z-index discipline as the catalog pins so - scrolled cells never bleed through while scrolling horizontally. */ + #table-scroll .catalog-sticky-ticker{left:5rem;width:6rem;min-width:6rem;box-shadow:4px 0 6px -6px rgba(15,23,42,.7)} + /* + * Watchlist Ticker: the first data column there holds an exchange ticker + * for equities but a CUSIP/ISIN (or, for a few private/crypto positions, + * a longer provider code) for bonds and cash, so the pin gets a fixed + * width with defensive truncation instead of a ticker-sized column. + */ #table-scroll .watchlist-sticky-col{position:sticky;background:#fff;background-clip:padding-box} #table-scroll thead .watchlist-sticky-col{top:0;z-index:30;background:#f8fafc} #table-scroll tbody .watchlist-sticky-col{z-index:20} - #table-scroll .watchlist-sticky-ticker{left:0;min-width:6rem;box-shadow:4px 0 6px -6px rgba(15,23,42,.7)} - .dark #table-scroll .watchlist-sticky-col{background:#162032} - .dark #table-scroll thead .watchlist-sticky-col{background:#0f172a} - #table-scroll tbody tr:hover .watchlist-sticky-col{background:#f8fafc} - .dark #table-scroll tbody tr:hover .watchlist-sticky-col{background:#1f2a3c} + #table-scroll .watchlist-sticky-ticker{left:0;width:10rem;min-width:10rem;max-width:10rem;overflow:hidden;text-overflow:ellipsis;box-shadow:4px 0 6px -6px rgba(15,23,42,.7)} + .dark #table-scroll .catalog-sticky-col,.dark #table-scroll .watchlist-sticky-col{background:#172033} + .dark #table-scroll thead .catalog-sticky-col,.dark #table-scroll thead .watchlist-sticky-col{background:#0f172a} + #table-scroll tbody tr:hover .catalog-sticky-col,#table-scroll tbody tr:hover .watchlist-sticky-col{background:#f8fafc} + #table-scroll tbody tr.selected-row .catalog-sticky-col{background:#eff6ff} + .dark #table-scroll tbody tr:hover .catalog-sticky-col,.dark #table-scroll tbody tr:hover .watchlist-sticky-col{background:#1f2a3d} + .dark #table-scroll tbody tr.selected-row .catalog-sticky-col{background:#19274e} /* Detail navigation expands into place after an ETF is selected. */ main.space-y-6 > #selected-tabs-panel{margin-top:1.5rem;padding-top:1rem;padding-bottom:1rem;border-color:rgb(226 232 240)} .dark main.space-y-6 > #selected-tabs-panel{border-color:rgb(51 65 85)} - /* Blacklist manager panel: same smooth expand/collapse contract as the - detail nav above (max-height is set inline by JS from scrollHeight - since the chip list, unlike the detail tabs, has no bounded height). */ + /* + * Blacklist manager: same smooth expand/collapse contract as the detail + * nav above. Its max-height is set inline by JS from scrollHeight, not by + * a fixed rem value, because the chip list (unlike the detail tabs) has no + * bounded height. + */ main.space-y-6 > #blacklist-panel{max-height:0;margin-top:0;overflow:hidden;opacity:0;transform:translateY(-10px);padding-top:0;padding-bottom:0;border-color:transparent;transition:max-height .32s ease,margin-top .32s ease,padding .32s ease,opacity .22s ease,transform .32s ease,border-color .22s ease} main.space-y-6 > #blacklist-panel.is-visible{margin-top:1.5rem;padding-top:1rem;padding-bottom:1rem;opacity:1;transform:translateY(0);border-color:rgb(226 232 240)} .dark main.space-y-6 > #blacklist-panel.is-visible{border-color:rgb(51 65 85)} @@ -297,3 +306,6 @@ box-shadow: 0 12px 30px rgb(15 23 42 / .2); } .dark #app-summary { background: #0f172a; color: #cbd5e1; border-color: #475569; } + +/* WisdomTree only: 24 columns must keep their content width (the table scrolls horizontally) */ +#table-scroll table{min-width:max-content}