/* ========================================================================== scroll-to-top.css — floating "back to top" control Loaded by assets/js/scroll-to-top.js on www and sibling *.sillylaird.ca hosts. Self-contained so sibling pages that do not load site.css still look right. Selectors are more specific than site.css's `a:hover` so the global link glow / scale does not leak onto the control. ========================================================================== */ a.scroll-to-top { --stt-bg: var(--bg, #000000); --stt-ink: var(--gold, #8b0000); --stt-border: var(--border, #3a0000); --stt-hover: var(--accent-cyan, #8b0000); position: fixed; right: max(0.85rem, env(safe-area-inset-right, 0px)); bottom: max(1.1rem, env(safe-area-inset-bottom, 0px)); z-index: 10050; box-sizing: border-box; width: 2.75rem; height: 2.75rem; margin: 0; padding: 0.2rem 0 0.15rem; display: inline-flex; flex-direction: column; align-items: center; justify-content: center; gap: 0.05rem; border: 1px solid var(--stt-border); border-radius: 6px; background: var(--stt-bg); color: var(--stt-ink); font-family: "JetBrains Mono", "IBM Plex Mono", "Source Code Pro", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.58rem; font-weight: 700; letter-spacing: 0.14em; line-height: 1; text-decoration: none; text-transform: uppercase; text-shadow: none; box-shadow: 0 0 0 1px rgba(160, 0, 0, .18), 0 0 14px -2px rgba(160, 0, 0, .4), inset 0 0 10px rgba(160, 0, 0, .12); opacity: 0; visibility: hidden; pointer-events: none; transform: translateY(10px); transition: opacity .2s ease, visibility .2s ease, transform .2s ease, color .15s ease, border-color .15s ease, box-shadow .25s ease, background-color .15s ease; touch-action: manipulation; -webkit-tap-highlight-color: transparent; } a.scroll-to-top.is-visible { opacity: 1; visibility: visible; pointer-events: auto; transform: none; } a.scroll-to-top .scroll-to-top-caret { font-size: 0.85rem; letter-spacing: 0; line-height: 1; transform: translateY(1px); } a.scroll-to-top .scroll-to-top-label { font-size: 0.52rem; letter-spacing: 0.16em; } a.scroll-to-top:hover, a.scroll-to-top:focus-visible { background: var(--stt-bg); color: var(--stt-hover); text-decoration: none; text-shadow: 0 0 6px rgba(255, 0, 0, .85), 0 0 14px rgba(139, 0, 0, .45); border-color: rgba(255, 0, 0, .75); border-radius: 6px; transform: none; box-shadow: 0 0 0 1px rgba(255, 0, 0, .45), 0 0 16px rgba(139, 0, 0, .4), 0 0 32px -6px rgba(139, 0, 0, .35), inset 0 0 10px rgba(139, 0, 0, .08); } a.scroll-to-top:focus-visible { outline: 2px solid var(--stt-hover); outline-offset: 2px; } a.scroll-to-top:active { transform: translateY(1px); } /* Light theme — www uses body.light-mode; blog uses data-blog-theme */ body.light-mode a.scroll-to-top, html[data-blog-theme="light"] a.scroll-to-top { --stt-bg: #fff8f1; --stt-ink: #8b0000; --stt-border: #e8c8c8; --stt-hover: #5a0000; box-shadow: 0 1px 0 rgba(255, 255, 255, .95) inset, 0 8px 22px rgba(139, 0, 0, .16); } body.light-mode a.scroll-to-top:hover, body.light-mode a.scroll-to-top:focus-visible, html[data-blog-theme="light"] a.scroll-to-top:hover, html[data-blog-theme="light"] a.scroll-to-top:focus-visible { background: #ffffff; color: #5a0000; text-shadow: none; border-color: #8b0000; box-shadow: 0 0 0 1px rgba(139, 0, 0, .35), 0 8px 22px rgba(139, 0, 0, .22); } /* When the visit-counter has no footer to live in, it docks bottom-right. Lift it so the two chips do not sit on top of each other. */ body.has-scroll-to-top #site-visit-counter[data-stt-docked="1"] { bottom: 4.65rem; } @media (max-width: 520px) { a.scroll-to-top { width: 2.55rem; height: 2.55rem; right: max(0.65rem, env(safe-area-inset-right, 0px)); bottom: max(0.85rem, env(safe-area-inset-bottom, 0px)); } } @media (prefers-reduced-motion: reduce) { a.scroll-to-top, a.scroll-to-top.is-visible, a.scroll-to-top:hover, a.scroll-to-top:focus-visible, a.scroll-to-top:active { transition: none; transform: none; } } @media print { a.scroll-to-top, .footer-back-to-top { display: none !important; } }