Compare commits
3 Commits
be919c7aff
...
b97c4a0508
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b97c4a0508 | ||
|
|
3932b17256 | ||
|
|
17c4518944 |
@@ -16,6 +16,12 @@ steps:
|
|||||||
DATABASE_URL: postgresql://postgres:postgres@postgres/python_tdd_test
|
DATABASE_URL: postgresql://postgres:postgres@postgres/python_tdd_test
|
||||||
CELERY_BROKER_URL: redis://redis:6379/0
|
CELERY_BROKER_URL: redis://redis:6379/0
|
||||||
REDIS_URL: redis://redis:6379/1
|
REDIS_URL: redis://redis:6379/1
|
||||||
|
# Workspace-shared pip cache — Woodpecker mounts the workspace across
|
||||||
|
# all steps in a run, so the wheels populated here are reused by
|
||||||
|
# test-two-browser-FTs + test-FTs (saves ~30-60s × 2 = ~1-2 min per
|
||||||
|
# run). Cache lives only inside one run; cross-run caching would
|
||||||
|
# need a volume plugin.
|
||||||
|
PIP_CACHE_DIR: .pip-cache
|
||||||
commands:
|
commands:
|
||||||
- pip install -r requirements.txt
|
- pip install -r requirements.txt
|
||||||
- cd ./src
|
- cd ./src
|
||||||
@@ -37,6 +43,7 @@ steps:
|
|||||||
from_secret: stripe_secret_key
|
from_secret: stripe_secret_key
|
||||||
STRIPE_PUBLISHABLE_KEY:
|
STRIPE_PUBLISHABLE_KEY:
|
||||||
from_secret: stripe_publishable_key
|
from_secret: stripe_publishable_key
|
||||||
|
PIP_CACHE_DIR: .pip-cache
|
||||||
commands:
|
commands:
|
||||||
- pip install -r requirements.txt
|
- pip install -r requirements.txt
|
||||||
- cd ./src
|
- cd ./src
|
||||||
@@ -61,6 +68,7 @@ steps:
|
|||||||
from_secret: stripe_secret_key
|
from_secret: stripe_secret_key
|
||||||
STRIPE_PUBLISHABLE_KEY:
|
STRIPE_PUBLISHABLE_KEY:
|
||||||
from_secret: stripe_publishable_key
|
from_secret: stripe_publishable_key
|
||||||
|
PIP_CACHE_DIR: .pip-cache
|
||||||
commands:
|
commands:
|
||||||
- pip install -r requirements.txt
|
- pip install -r requirements.txt
|
||||||
- cd ./src
|
- cd ./src
|
||||||
|
|||||||
@@ -55,6 +55,12 @@ class MyBudsPageTest(FunctionalTest):
|
|||||||
self.wait_for(lambda: self.assertIn(
|
self.wait_for(lambda: self.assertIn(
|
||||||
self.alice, list(self.gamer.buds.all())
|
self.alice, list(self.gamer.buds.all())
|
||||||
))
|
))
|
||||||
|
# "No buds yet" empty-state row dismisses async as the first bud lands
|
||||||
|
# (shell partial renders w. .applet-list-entry--empty, not .bud-entry--empty)
|
||||||
|
self.wait_for(lambda: self.assertEqual(
|
||||||
|
self.browser.find_elements(By.CSS_SELECTOR, ".applet-list-entry--empty"),
|
||||||
|
[],
|
||||||
|
))
|
||||||
|
|
||||||
def test_no_autocomplete_suggestions_on_my_buds_page(self):
|
def test_no_autocomplete_suggestions_on_my_buds_page(self):
|
||||||
"""The bud-autocomplete pool is request.user.buds — surfacing buds
|
"""The bud-autocomplete pool is request.user.buds — surfacing buds
|
||||||
|
|||||||
@@ -7,6 +7,13 @@
|
|||||||
// 2.4vmin hits 16px (browser default) at vmin=667 (iPhone SE landscape).
|
// 2.4vmin hits 16px (browser default) at vmin=667 (iPhone SE landscape).
|
||||||
html {
|
html {
|
||||||
font-size: clamp(14px, 2.4vmin, 22px);
|
font-size: clamp(14px, 2.4vmin, 22px);
|
||||||
|
// Aperture foundation — locks the document viewport so content lives
|
||||||
|
// between/behind the fixed navbar + footer sidebars instead of leaking
|
||||||
|
// into a page-level scroll. Was opt-in per-page via body.page-X classes
|
||||||
|
// (duplicated 5× across SCSS files); now universal. Pages that need a
|
||||||
|
// narrower override (e.g. body.page-gameboard .container { overflow:
|
||||||
|
// clip; }) live in their per-page SCSS.
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Layout custom properties — single source of truth for the landscape
|
// Layout custom properties — single source of truth for the landscape
|
||||||
@@ -25,6 +32,7 @@ body {
|
|||||||
color: rgba(var(--secUser), 1);
|
color: rgba(var(--secUser), 1);
|
||||||
font-family: Georgia, serif;
|
font-family: Georgia, serif;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
a {
|
a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
@@ -43,6 +51,14 @@ body {
|
|||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
// padding: 0 1rem;
|
// padding: 0 1rem;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
// Aperture container — flex-column so navbar + h2 row + page content
|
||||||
|
// stack vertically, min-height: 0 + overflow: hidden contain the
|
||||||
|
// content within the aperture so applet borders / titles can't
|
||||||
|
// leak past the navbar / footer sidebars at narrow viewports.
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
min-height: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
.navbar {
|
.navbar {
|
||||||
padding: 0.75rem 0;
|
padding: 0.75rem 0;
|
||||||
@@ -183,6 +199,10 @@ body {
|
|||||||
|
|
||||||
.row {
|
.row {
|
||||||
padding: 2rem 0;
|
padding: 2rem 0;
|
||||||
|
// Aperture: the h2-row mustn't shrink when the page-content
|
||||||
|
// child fills the remaining vertical space. Universal — was
|
||||||
|
// duplicated in every body.page-X { .row { flex-shrink: 0 } }.
|
||||||
|
flex-shrink: 0;
|
||||||
|
|
||||||
.col-md-12 {
|
.col-md-12 {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|||||||
@@ -24,6 +24,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ── Shared aperture fill for both billboard pages ──────────────────────────
|
// ── Shared aperture fill for both billboard pages ──────────────────────────
|
||||||
|
//
|
||||||
|
// Aperture foundation (html/body/.container overflow + flex-column +
|
||||||
|
// .row flex-shrink: 0) now lives universally in _base.scss. Only the
|
||||||
|
// page-specific `.row { margin-bottom: -1rem }` pull (tightening the
|
||||||
|
// h2 row against subsequent applet content) stays here, since wallet
|
||||||
|
// + sky pages deliberately don't carry that pull.
|
||||||
|
|
||||||
%billboard-page-base {
|
%billboard-page-base {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
@@ -33,31 +39,12 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
html:has(body.page-billboard),
|
|
||||||
html:has(body.page-billscroll),
|
|
||||||
html:has(body.page-billpost),
|
|
||||||
html:has(body.page-billbuds),
|
|
||||||
html:has(body.page-billposts) {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
body.page-billboard,
|
body.page-billboard,
|
||||||
body.page-billscroll,
|
body.page-billscroll,
|
||||||
body.page-billpost,
|
body.page-billpost,
|
||||||
body.page-billbuds,
|
body.page-billbuds,
|
||||||
body.page-billposts {
|
body.page-billposts {
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.container {
|
|
||||||
overflow: hidden;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
flex: 1;
|
|
||||||
min-height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.row {
|
.row {
|
||||||
flex-shrink: 0;
|
|
||||||
margin-bottom: -1rem;
|
margin-bottom: -1rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,8 @@
|
|||||||
html:has(body.page-dashboard) {
|
// Aperture foundation now lives in _base.scss; only the dashboard-specific
|
||||||
overflow: hidden;
|
// `.row { margin-bottom: -1rem }` pull stays here.
|
||||||
}
|
|
||||||
|
|
||||||
body.page-dashboard {
|
body.page-dashboard .row {
|
||||||
overflow: hidden;
|
margin-bottom: -1rem;
|
||||||
|
|
||||||
.container {
|
|
||||||
overflow: hidden;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
flex: 1;
|
|
||||||
min-height: 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.row {
|
|
||||||
flex-shrink: 0;
|
|
||||||
margin-bottom: -1rem;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#id_dash_content {
|
#id_dash_content {
|
||||||
|
|||||||
@@ -1,21 +1,16 @@
|
|||||||
html:has(body.page-gameboard) {
|
// Aperture foundation (html/body/.container overflow + flex-column) lives
|
||||||
overflow: hidden;
|
// universally in _base.scss. Gameboard's only divergence: `overflow: clip`
|
||||||
}
|
// on .container instead of `hidden` — `clip` prevents the seat tooltip
|
||||||
|
// scroll-anchoring quirk Firefox triggers under overflow:hidden. The
|
||||||
|
// `.row { margin-bottom: -1rem }` pull mirrors the billboard/dashboard
|
||||||
|
// h2-row tightening.
|
||||||
|
|
||||||
body.page-gameboard {
|
body.page-gameboard {
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
overflow: clip;
|
overflow: clip;
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
flex: 1;
|
|
||||||
min-height: 0;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.row {
|
.row {
|
||||||
flex-shrink: 0;
|
|
||||||
margin-bottom: -1rem;
|
margin-bottom: -1rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -935,27 +935,10 @@ body[class*="-light"] #id_sky_tooltip_2 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Sky full page (aperture + column layout) ──────────────────────────────────
|
// ── Sky full page (column layout) ─────────────────────────────────────────
|
||||||
|
//
|
||||||
html:has(body.page-sky) {
|
// Aperture foundation lives universally in _base.scss; nothing sky-specific
|
||||||
overflow: hidden;
|
// here besides the .sky-page block below.
|
||||||
}
|
|
||||||
|
|
||||||
body.page-sky {
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.container {
|
|
||||||
overflow: hidden;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
flex: 1;
|
|
||||||
min-height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.row {
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sky page fills the aperture; its content can scroll past the bottom edge.
|
// Sky page fills the aperture; its content can scroll past the bottom edge.
|
||||||
// overflow-x: hidden clips any horizontal overflow that would otherwise create
|
// overflow-x: hidden clips any horizontal overflow that would otherwise create
|
||||||
|
|||||||
@@ -22,25 +22,8 @@
|
|||||||
> i { opacity: 0.4; }
|
> i { opacity: 0.4; }
|
||||||
}
|
}
|
||||||
|
|
||||||
html:has(body.page-wallet) {
|
// Aperture foundation lives universally in _base.scss; nothing
|
||||||
overflow: hidden;
|
// wallet-specific to override.
|
||||||
}
|
|
||||||
|
|
||||||
body.page-wallet {
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.container {
|
|
||||||
overflow: hidden;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
flex: 1;
|
|
||||||
min-height: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.row {
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.wallet-page {
|
.wallet-page {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|||||||
@@ -35,8 +35,10 @@
|
|||||||
// Skip if already in DOM (server-side dedup ensures M2M idempotence;
|
// Skip if already in DOM (server-side dedup ensures M2M idempotence;
|
||||||
// this guards a fast double-click that races the post-add refresh).
|
// this guards a fast double-click that races the post-add refresh).
|
||||||
if (list.querySelector('[data-bud-id="' + bud.id + '"]')) return;
|
if (list.querySelector('[data-bud-id="' + bud.id + '"]')) return;
|
||||||
// Drop the empty-state row if present
|
// Drop the empty-state row if present — _applet-list-shell renders
|
||||||
var empty = list.querySelector('.bud-entry--empty');
|
// it w. `.applet-list-entry--empty` (NOT `.bud-entry--empty`); the
|
||||||
|
// shell sets the family-agnostic class.
|
||||||
|
var empty = list.querySelector('.applet-list-entry--empty');
|
||||||
if (empty) empty.remove();
|
if (empty) empty.remove();
|
||||||
|
|
||||||
var li = document.createElement('li');
|
var li = document.createElement('li');
|
||||||
|
|||||||
Reference in New Issue
Block a user