Baltimorean Note unlock loop — full UX from bawlmorese pronoun pick → Brief banner → DON → palette modal → dashboard swatch ; rootvars.scss adds the Baltimorean (Blt) hue family (red 200,16,46 / yellow 255,212,0 / white 255,255,255 / black 0,0,0 / purple 26,25,95 / orange 221,73,38 — Maryland-flag-derived plus a --sixBlt: 162,170,173 neutral) + two .palette-baltimore / .palette-maryland palette classes wiring those hues into the standard --priUser…--decUser slots; companion section-header rename "/* X Palette */" → "/* X Hues */" across rootvars to disambiguate raw hue families (Precious Metal / Cosmic Metal / Chroma / Earthman / Technoman / Inferno) from actual palette classes — section-comment-only, no rule-level change ; baltimorean entry added in 3 registries that drive the loop: _NOTE_DISPLAY (drama/models.py) — {"greeting": "Ayo,", "title": "Ard!"} so DON flips navbar Welcome, Earthman → Ayo, Ard!; _NOTE_TITLES (dashboard/views.py, user-pre-staged) — drives the "recognized via Baltimorean" copy on dashboard palette swatches; _NOTE_META (billboard/views.py) — Baltimorean title + the literal description "Aaron earned an iron urn." + palette_options [palette-baltimore, palette-maryland] feeding the my-notes swatch modal ; set_pronouns view rewired (dashboard/views.py) — first-time pronouns = bawlmorese selection calls Note.grant_if_new(user, "baltimorean") + returns {"brief": brief.to_banner_dict()} JSON @ 200; idempotent on repeat (the grant_if_new returns brief=None on second call so the 204 path resumes naturally); non-bawlmorese choices stay on the original 204 contract ; client wiring: game-kit.js pronouns commit() handles the 200 JSON path — resp.json().then(data => Brief.showBanner(data.brief)) instead of reload (reload would lose the just-fired banner); 204 still reloads to update active pronoun card; game_kit.html pulls in apps/dashboard/note.js so Brief is in scope on the Game Kit page (it wasn't before) ; Brief banner placement fix — note.js showBanner() now measures the .row .col-lg-6 h2 at render-time + sets inline top so the banner portals SQUARELY OVER the page h2 letter-spread wordmark instead of parking at the SCSS-default top: 0.5rem (which had it lurking above the wordmark area on every page); portrait-only (gated if window.innerWidth > window.innerHeight return) — landscape h2 lives in a writing-mode: vertical-rl fixed sidebar column + would need a full banner reorientation (writing-mode + flex-direction restyle of banner contents) to "overlay" sensibly, deferred to a follow-up sprint ; tests: drama/tests/unit/test_models.py (new file) — 5 UTs for _NOTE_DISPLAY[baltimorean] greeting/title/name + stargazer smoke tests; dashboard/tests/integrated/test_views.py — SetPronounsBawlmoreseUnlockTest (9 ITs covering first-bawlmorese-returns-200-w-brief / Note granted / title Ard! / square_url to /billboard/my-notes/ / idempotent on repeat / non-bawlmorese unaffected / bawlmorese-after-other still grants); existing SetPronounsViewTest.test_post_each_valid_choice docstring updated to flag the bawlmorese 200 branch ; functional_tests/test_bill_baltimorean.py (new file) — 6 FTs walking the full UX: T1 Game-Kit pronouns click → Brief banner w. Ard! title + Look! prose + ?-square + FYI nav; T2 idempotent repeat-click (no re-fire); T3 my-notes Baltimorean item carries the Aaron quote verbatim; T4 DON flips navbar greeting Welcome, Earthman → Ayo, Ard!; T5 palette modal offers Baltimore + Maryland swatches (and not Bardo/Sheol); T6 Baltimore swatch click previews → OK commits → dashboard Palette applet shows the swatch unlocked w. data-description carrying Baltimorean + non-empty data-unlocked-date + Note.palette = palette-baltimore in DB — all 6 green in 51s; full IT/UT sweep 997 → green in 45s — TDD
Code architected by Disco DeDisco <discodedisco@outlook.com> Git commit message Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -212,6 +212,7 @@ _NOTE_DISPLAY = {
|
||||
"nomad": {"greeting": "Welcome,", "title": "Nomad"},
|
||||
"super-schizo": {"greeting": "21<span class='ord'>st</span> Century", "title": "Schizoid Man"},
|
||||
"super-nomad": {"greeting": "Howdy,", "title": "Stranger"},
|
||||
"baltimorean": {"greeting": "Ayo,", "title": "Ard!"},
|
||||
}
|
||||
|
||||
# Note slugs whose grant prose uses the long admin format ("The administration
|
||||
|
||||
0
src/apps/drama/tests/unit/__init__.py
Normal file
0
src/apps/drama/tests/unit/__init__.py
Normal file
39
src/apps/drama/tests/unit/test_models.py
Normal file
39
src/apps/drama/tests/unit/test_models.py
Normal file
@@ -0,0 +1,39 @@
|
||||
from django.test import SimpleTestCase
|
||||
|
||||
from apps.drama.models import Note
|
||||
|
||||
|
||||
def _note(slug):
|
||||
n = Note()
|
||||
n.slug = slug
|
||||
return n
|
||||
|
||||
|
||||
class NoteDisplayBaltimoreanTest(SimpleTestCase):
|
||||
"""`_NOTE_DISPLAY['baltimorean']` — greeting/title combo "Ayo, Ard!" replaces
|
||||
"Welcome, Earthman" once the user dons the Baltimorean Note (unlocked by
|
||||
first-time `pronouns = bawlmorese` selection)."""
|
||||
|
||||
def test_baltimorean_display_title_is_ard(self):
|
||||
self.assertEqual(_note("baltimorean").display_title, "Ard!")
|
||||
|
||||
def test_baltimorean_display_greeting_is_ayo(self):
|
||||
self.assertEqual(_note("baltimorean").display_greeting, "Ayo,")
|
||||
|
||||
def test_baltimorean_display_name_is_baltimorean(self):
|
||||
"""The my-notes heading label — `.title()` of the slug recovers the
|
||||
proper rendering for any slug without a `name` override in
|
||||
`_NOTE_DISPLAY`. Baltimorean has no override, so this should fall
|
||||
through to `slug.title()` → 'Baltimorean'."""
|
||||
self.assertEqual(_note("baltimorean").display_name, "Baltimorean")
|
||||
|
||||
|
||||
class NoteDisplayStargazerTest(SimpleTestCase):
|
||||
"""Smoke tests for the existing stargazer entry — pins the contract that
|
||||
new entries follow."""
|
||||
|
||||
def test_stargazer_display_title_is_stargazer(self):
|
||||
self.assertEqual(_note("stargazer").display_title, "Stargazer")
|
||||
|
||||
def test_stargazer_display_greeting_is_welcome(self):
|
||||
self.assertEqual(_note("stargazer").display_greeting, "Welcome,")
|
||||
Reference in New Issue
Block a user