Files
python-tdd/src/static_src/scss/_base.scss
Disco DeDisco e2cc38686f XL landscape: revert tray to landscape style; fix sig-stage stretch
- Remove _tray.scss XL (≥1800px) portrait override block entirely
- _isLandscape() no longer returns false at ≥1800px — tray uses
  landscape slide-from-top at all wide landscape widths
- sig-stage: align-self: stretch (was center) so JS sizeSigCard()
  measures correct stage width; card size no longer collapses
- Position strip: horizontal row at top (was vertical column-reverse)
- sig-overlay/sig-stage/sig-deck-grid layout polish at 1100px/1800px

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 20:11:24 -04:00

589 lines
15 KiB
SCSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

body {
display: flex;
flex-direction: column;
background-color: rgba(var(--priUser), 1);
color: rgba(var(--secUser), 1);
font-family: Georgia, serif;
height: 100vh;
a {
text-decoration: none;
font-weight: 700;
color: rgba(var(--terUser), 1);
&:hover {
color: rgba(var(--ninUser), 1);
text-shadow: 0 0 0.5rem rgba(var(--terUser), 1);
}
}
.container {
max-width: 960px;
width: 100%;
margin: 0 auto;
// padding: 0 1rem;
flex: 1;
.navbar {
padding: 0.75rem 0;
border-bottom: 0.1rem solid rgba(var(--secUser), 0.4);
.navbar-brand {
margin-left: 1rem;
h1 {
font-size: 2rem;
}
}
.container-fluid {
display: flex;
align-items: center;
gap: 1rem;
margin-right: 0.5rem;
.navbar-user {
flex: 1;
min-width: 0;
display: flex;
align-items: center;
justify-content: center;
gap: 0.25rem;
.navbar-text { flex: none; } // prevent expansion; BYE abuts the spans
> form { flex-shrink: 0; order: -1; } // BYE left of spans
}
> #id_cont_game { flex-shrink: 0; }
}
.navbar-text,
.navbar-link {
flex: 1;
min-width: 0;
text-align: center;
.navbar-label {
display: block;
color: rgba(var(--secUser), 0.7);
font-size: 0.75rem;
}
.navbar-identity {
display: block;
color: rgba(var(--quaUser), 1);
font-size: 0.875rem;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
.input-group {
position: fixed;
left: 0;
right: 0;
top: 50%;
transform: translateY(-50%);
display: flex;
flex-direction: column;
align-items: center;
gap: 0.5rem;
z-index: 50;
.form-control {
width: 24rem;
text-align: center;
}
}
.form-control {
background-color: rgba(var(--priUser), 1);
color: rgba(var(--secUser), 1);
border: 0.1rem solid rgba(var(--secUser), 0.5);
--_pad-v: 0.5rem;
padding: var(--_pad-v) 0.75rem;
border-radius: calc((var(--_pad-v) * 2 + 1em) / 3);
width: 100%;
font-family: inherit;
&.is-invalid {
border-color: rgba(var(--priRd), 1);
}
&.form-control-lg {
--_pad-v: 0.75rem;
padding: var(--_pad-v) 1rem;
font-size: 1.125rem;
}
&.is-invalid ~ .invalid-feedback {
display: block;
}
&:focus {
border-color: rgba(var(--terUser), 0.75);
box-shadow: 0 0 0.75rem rgba(var(--terUser), 0.5);
}
}
.invalid-feedback {
display: none;
color: rgba(var(--priRd), 1);
font-size: 0.875rem;
margin-top: 0.25rem;
}
.alert {
padding: 0.75rem 1rem;
margin: 0.75rem;
border-radius: 0.5rem;
border: 0.1rem solid rgba(var(--priYl), 0.5);
color: rgba(var(--priYl), 1);
&.alert-success {
border-color: rgba(var(--priGn), 0.5);
color: rgba(var(--priGn), 1);
}
&.alert-warning {
border-color: rgba(var(--priOr), 0.5);
color: rgba(var(--priOr), 1);
}
}
.row {
padding: 2rem 0;
.col-md-12 {
width: 100%;
justify-content: center;
}
.col-lg-6 {
max-width: inherit;
margin: 0 1rem;
h2 {
font-size: 3rem;
color: rgba(var(--secUser), 0.75);
margin-bottom: 1rem;
text-align: justify;
text-align-last: justify;
text-justify: inter-character;
text-transform: uppercase;
text-shadow:
// 1px 1px 0 rgba(255, 255, 255, 0.125), // highlight (up-left)
var(--title-shadow-offset) var(--title-shadow-offset) 0 rgba(0, 0, 0, 0.8) // shadow (down-right)
;
span {
color: rgba(var(--quaUser), 0.75);
}
}
}
}
}
}
@media (min-width: 1200px) {
body .container {
max-width: 1200px;
}
}
@media (orientation: landscape) and (max-width: 1100px) {
body .container {
.navbar {
h1 {
font-size: 1rem !important;
}
}
}
}
@media (orientation: landscape) {
$sidebar-w: 5rem;
// ── Sidebar layout: navbar ← left, footer → right ────────────────────────────
body {
flex-direction: row;
}
// Navbar → fixed left sidebar
body .container .navbar {
position: fixed;
left: 0;
top: 0;
height: 100vh;
width: $sidebar-w;
padding: 0.5rem 0;
border-bottom: none;
border-right: 0.1rem solid rgba(var(--secUser), 0.4);
background-color: rgba(var(--priUser), 1);
z-index: 100;
overflow: hidden;
.container-fluid {
flex-direction: column;
height: 100%;
max-height: 700px;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 0 0.25rem;
margin: 0; // reset portrait margin-right: 0.5rem so container fills full sidebar width
> #id_cont_game { flex-shrink: 0; order: -1; } // cont-game above brand
.navbar-user {
flex-direction: column;
align-items: center;
gap: 0.25rem;
.navbar-text { margin: 0; } // cancel landscape margin:auto so BYE abuts
> form { order: 0; .btn { margin-top: 0; } } // abut spans
}
}
.navbar-brand h1 {
writing-mode: vertical-rl;
transform: rotate(180deg);
font-size: 1.2rem;
line-height: 1.2;
white-space: nowrap;
// margin-right: 3.25rem;
}
.navbar-brand {
order: 1; // brand at bottom
width: 100%;
margin-left: 0; // reset portrait margin-left: 1rem
display: flex;
justify-content: center;
}
.navbar-link { display: none; }
.navbar-text {
writing-mode: vertical-rl;
transform: rotate(180deg);
font-size: 0.65rem;
white-space: nowrap;
margin: auto 0;
.navbar-label { opacity: 0.7; }
}
// .btn-primary {
// width: 4rem;
// height: 4rem;
// font-size: 0.875rem;
// border-width: 0.21rem;
// }
// Login form: offset from fixed sidebars in landscape
.input-group {
left: $sidebar-w;
right: $sidebar-w;
.navbar-text {
writing-mode: horizontal-tb;
transform: none;
font-size: 0.75rem;
white-space: normal;
margin: 0 0 0.25rem;
text-align: center;
}
}
}
// Container: fill center, compensate for fixed sidebars on both sides.
// max-width: none overrides the @media (min-width: 1200px) rule above so the
// container fills all available space between the two sidebars on wide screens.
body .container {
flex: 1;
min-width: 0;
max-width: none;
margin-left: $sidebar-w;
margin-right: $sidebar-w;
padding: 0 0.5rem;
}
// Header row: h2 rotates into the left gutter (just right of the navbar border).
// position:fixed takes h2 out of flow; .row collapses to zero height automatically.
body .container .row {
padding: 0;
margin: 0;
}
body .container .row .col-lg-6 h2 {
position: fixed;
left: 5rem; // $sidebar-w — flush with the navbar right border
top: 50%;
transform: translateY(-50%) rotate(180deg);
writing-mode: vertical-rl;
font-size: 1.5rem;
letter-spacing: 0.4em;
margin: 0;
z-index: 85;
pointer-events: none;
}
// Footer → fixed right sidebar (mirrors navbar approach — explicit right boundary)
// Use body #id_footer (specificity 0,1,0,1) to beat base #id_footer (0,1,0,0)
// which compiles later in the output and would otherwise override height: 100vh.
body #id_footer {
position: fixed;
right: 0;
top: 0;
width: $sidebar-w;
height: 100vh;
flex-direction: column;
justify-content: center;
align-items: center;
border-top: none;
border-left: 0.1rem solid rgba(var(--secUser), 0.3);
background-color: rgba(var(--priUser), 1); // opaque: masks tray sliding behind it
padding: 1rem 0;
gap: 0;
z-index: 100;
#id_footer_nav {
flex-direction: column-reverse;
width: auto;
max-width: none;
gap: 1.5rem !important;
margin-bottom: 4rem;
a {
font-size: 1.75rem;
display: flex;
justify-content: center;
align-items: center;
}
}
.footer-container {
position: absolute;
top: 0.25rem;
text-align: center;
line-height: 0.75 !important;
color: rgba(var(--secUser), 1);
br { display: block; }
small {
font-size: 0.75rem !important;
}
}
}
}
@media (orientation: landscape) and (min-width: 700px) {
body .container .row .col-lg-6 h2 {
@media (min-height: 400px) {
font-size: 2.5rem;
}
@media (min-height: 500px) {
font-size: 3rem;
}
}
body #id_footer {
#id_footer_nav {
gap: 3rem !important;
a {
font-size: 1.75rem;
display: flex;
justify-content: center;
align-items: center;
}
}
.footer-container {
line-height: 1;
margin-top: 0.5rem;
small {
font-size: 1rem;
}
}
}
}
// ── XL landscape (≥1800px): double sidebar widths and scale content ────────────
@media (orientation: landscape) and (min-width: 1800px) {
$sidebar-xl: 8rem;
body .container .navbar {
width: $sidebar-xl;
.container-fluid {
gap: 2rem;
padding: 0 0.5rem;
}
.navbar-brand h1 { font-size: 2.4rem; }
.navbar-text { font-size: 0.78rem; } // 0.65rem × 1.2
// .btn-primary { width: 4rem; height: 4rem; font-size: 0.875rem; }
.input-group {
left: $sidebar-xl;
right: $sidebar-xl;
}
}
body .container {
margin-left: $sidebar-xl;
margin-right: $sidebar-xl;
}
// h2 page title: keep vertical rotation; shift left to clear the wider XL navbar.
body .container .row .col-lg-6 h2 {
left: 8rem; // $sidebar-xl
@media (min-height: 800px) {
font-size: 4.5rem;
}
}
body #id_footer {
width: $sidebar-xl;
#id_footer_nav {
gap: 8rem !important;
a { font-size: 3rem; }
}
.footer-container {
font-size: 0.85rem;
margin-top: 1rem;
small {
font-size: 1.2rem;
}
}
}
}
@media (orientation: portrait) and (max-width: 500px) {
body .container {
.navbar {
padding: 0 0 0.25rem 0;
.navbar-brand h1 {
font-size: 1.2rem;
}
}
.row .col-lg-6 h2 {
text-align: center;
text-align-last: center;
letter-spacing: 0.33em;
margin: 0;
font-size: 2rem;
&#id_dash_wallet {
letter-spacing: 0.25em;
}
}
}
}
#id_footer {
flex-shrink: 0;
height: 6rem;
display: flex;
flex-direction: column;
gap: 0.5rem;
align-items: center;
padding: 1rem 1rem;
border-top: 0.1rem solid rgba(var(--secUser), 0.3);
// background: linear-gradient(
// to top,
// rgba(var(--priUser), 1) 25%,
// transparent 100%
// );
#id_footer_nav {
display: flex;
justify-content: space-evenly;
width: 80%;
max-width: 500px;
a {
font-size: 1.75rem;
color: rgba(var(--secUser), 0.6);
text-shadow:
0 0 0.25rem rgba(0, 0, 0, 0.25),
;
&.active {
color: rgba(var(--quaUser), 1);
text-shadow:
0 0 0.5rem rgba(0, 0, 0, 0.5),
;
}
&:hover {
color: rgba(var(--quaUser), 1);
text-shadow:
0 0 1rem rgba(0, 0, 0, 0.25),
0 0 0.5rem rgba(var(--ninUser), 0.25)
;
}
}
}
.footer-container {
br { display: none; }
small {
font-size: 0.75rem;
opacity: 1;
}
}
}
.forthcoming {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
text-align: center;
font-style: italic;
opacity: 0.6;
}
#id_guard_portal {
display: none;
position: fixed;
z-index: 10000;
padding: 0.75rem 1rem;
border-radius: 0.5rem;
background-color: rgba(var(--tooltip-bg), 0.5);
backdrop-filter: blur(6px);
border: 0.1rem solid rgba(var(--secUser), 0.4);
box-shadow: 0 0.25rem 1rem rgba(0, 0, 0, 0.4);
&.active {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.5rem;
}
.guard-message {
font-size: 0.85rem;
color: rgba(var(--secUser), 0.9);
text-align: center;
white-space: nowrap;
}
.guard-actions {
display: flex;
gap: 0.5rem;
}
}