17c4518944my_buds: dismiss "No buds yet" empty-state row async on first-bud add — _appendBudEntry queried .bud-entry--empty but _applet-list-shell renders it w. the family-agnostic .applet-list-entry--empty class; the selector never matched, so first-bud appends landed alongside the empty row instead of replacing it; existing test_add_bud_via_bud_btn_appends_entry extended to also assert the empty row dismisses post-add (caught the bug — TDD)
Disco DeDisco
2026-05-12 16:47:13 -04:00
be919c7affbud panels duplicate-add guard: server-side already_present flag + client-side error Brief w. FYI flash highlight on the existing entry — for each of the three #id_bud_btn panels (My Buds / post-share / gatekeeper-invite), the JSON response from add_bud / share_post / invite_gamer now carries {already_present, recipient_display, recipient_user_id}; bud-btn.js branches on already_present → calls new Brief.showDuplicateBanner({display_name, target_selector}) instead of the normal onSuccess append; banner title reads @<username> is already present, NVM dismisses, FYI dismisses AND eases in the .bud-duplicate-flash class (color: var(--terUser); text-shadow: 0 0 .5em var(--ninUser); transition: 600ms) onto the existing element (.bud-entry .bud-name / .post-recipient[data-user-id=…] / .gate-slot.filled[data-user-id=…]); gatekeeper "already present" = recipient is either GateSlot.FILLED + gamer OR has TableSeat OR has a pending RoomInvite (highlight target only set when seated — pending invites have no visible slot); .post-recipient chips + .gate-slot.filled cells gain data-user-id so the FYI selector can find them; my_buds.html now loads note.js via the {% block scripts %} pattern (Brief module is required by the duplicate banner path); bonus: latent test_jasmine.py bug fixed — "0 failures" in result.text matched "10 failures" / "20 failures" / etc, silently passing up to 99 failed specs; replaced w. re.search(r"(?<!\d)0 failures\b", …) (caught my new red specs, would've caught any prior Jasmine regression); 18 new ITs + 10 new Jasmine specs + 3 new FTs (one per panel) — TDD
Disco DeDisco
2026-05-12 16:40:15 -04:00
264ed5968ebud panels DRY refactor: extract shared skeleton into bud-btn.js — the three #id_bud_btn partials (_bud_panel post-share, _bud_invite_panel gatekeeper, _bud_add_panel My Buds) duplicated ~70% of their JS (csrf/open/close, btn click, Escape, click-outside w. optional suggestions excl., Enter handler, OK POST + JSON routing); collapse into bindBudBtn({submitUrl, autocompleteUrl?, onSuccess(data)}) so each panel keeps only its markup + an onSuccess callback (post-share: _appendLine + _appendRecipientChip + Brief.showBanner; gatekeeper: Brief.showBanner only; my-buds: _appendBudEntry); autocomplete binding folded into bud-btn.js (drives bindBudAutocomplete when autocompleteUrl is passed) so callers stop repeating the bindBudAutocomplete(...) boilerplate; dead data-share-url/data-invite-url/data-add-url attrs dropped since bindBudBtn takes the URL directly; behavior-preserving — all 21 existing FTs (test_my_buds + test_bud_btn) + 49 ITs (test_buds + test_share_post + test_brief) green
Disco DeDisco
2026-05-12 15:52:09 -04:00
7015ddd534my_buds: strip bud-autocomplete bindings from _bud_add_panel.html — the autocomplete pool is request.user.buds (per search_buds view), so on the page where you ADD new buds the suggestions are the precise set you can't usefully re-add; post-share + gatekeeper-invite panels keep the binding (re-sharing w. an existing bud is a real flow); test_autocomplete_suggests_buds_by_username_prefix → test_no_autocomplete_suggestions_on_my_buds_page (asserts #id_bud_suggestions absent — deterministic, no debounce-window race); dead id_bud_suggestions click-outside guard + unused {% load static %} dropped — TDD
Disco DeDisco
2026-05-12 15:42:41 -04:00
880408285apost.html line timestamps mirror scroll's relative_ts buckets: swap date:'g:i A' for the existing lyric_extras.relative_ts filter so same-day Lines render as 11:46 p.m., then collapse to weekday (Sat) past 24h, 07 Mar past a week, 07 Mar 2025 past a year — DRYs onto the single filter scroll already uses (no duplicated bucketing logic); same-day rendering shifts from 11:46 PM to 11:46 p.m. as a side effect of reusing the lowercase g:i a format relative_ts already standardised on — TDD
Disco DeDisco
2026-05-12 15:13:49 -04:00
df99cad984mobile h2 + sky wheel landscape fit: per-letter flex spread (justify-content: space-between via base.html JS letter-splitter) replaces text-justify: inter-character — iOS Safari + Firefox silently fall back to inter-word for Latin text, leaving letters clustered at the slot start; flex layout works everywhere; viewport-fluid font clamp(1.3rem, 5vw, 2rem) portrait + clamp(1.2rem, 4.4vh, 2.75rem) landscape so glyphs scale w. viewport instead of a fixed-rem ceiling that overflowed the 45/55 slot at the rem-clamp floor; portrait <500px gets padding-inline 0.4em→0.6em on the word-spans so H-B don't run together at the cramped font-size; .sky-page post-save scroll-snap sections pinned to height: 100% (was: min-height: 100%) + .sky-svg max-height: 100% so the wheel fits exactly one aperture on landscape mobile (was: 480px max blew past ~350px aperture, leaving an intermediate scroll position)
Disco DeDisco
2026-05-09 14:01:16 -04:00
22d0507c3fpost.html header prose branches on viewer-vs-owner: invitees see "shared with me, @viewer the {title}" + "created by @owner the {title}" instead of the owner-centric "just me / shared between" lines; owner view unchanged — TDD
Disco DeDisco
2026-05-09 01:14:11 -04:00
419e022140gatekeeper invite ports to #id_bud_btn slide-out: drop the inline #id_invite_email form, add bud-invite panel for room owner during gate phase, async POST to invite_gamer w. autocomplete + symmetric buds auto-add + slide-down Brief banner — TDD
Disco DeDisco
2026-05-09 00:59:54 -04:00
4010e452a6recentered copyright on landscape
Disco DeDisco
2026-05-09 00:38:51 -04:00
47871b5b4aalign #id_kit_btn / #id_gear_btn / #id_bud_btn under the unified centre formula — drop the legacy right: 2.5rem ≥1800px override on kit-btn that left it outboard of gear-btn after the rem-fluid sidebar refactor
Disco DeDisco
2026-05-09 00:23:53 -04:00
ad9f7b43edh2 padding-inline boundary between the two spans (BILL | BOARD natural gap) + landscape inherits portrait flex split (45/55 vertical, with padding-inline-end on first span = visual break between rotated words)
Disco DeDisco
2026-05-09 00:18:57 -04:00
3ab60c67b6fluid root rem + landscape aperture: html font-size = clamp(14px, 2.4vmin, 22px) so 1rem scales w. viewport (rotation-invariant via vmin); --sidebar-w + --h2-col-w CSS vars unify navbar/footer/h2 sizing; container margin-left = sidebar + h2-col-w in landscape so applets clip cleanly under the rotated wordmark; h2 markup splits into two spans (45/55 horizontal title); drop the disparate min-height font-size jumps + 1800px sidebar-doubling overrides
Disco DeDisco
2026-05-09 00:14:14 -04:00
c426ca69faNote.grant_if_new admin prose: 'comes with the customary title of' → 'bestows the honorary title of'; 'additional benefits' → 'additional corporate benefits'
Disco DeDisco
2026-05-08 23:44:46 -04:00
e0ace01670post.html attribution palette: usernames render w. @-prefix (bare emails left as-is); .post-attribution spans wrap username+title combos for the --quaUser colour key — line author col, self/shared header lines, Note.grant_if_new prose
Disco DeDisco
2026-05-08 23:42:51 -04:00
eb0369f0b7buds Phase 2: top-3 username|email autocomplete on #id_recipient (post share + my_buds add); implicit symmetric auto-add on share_post (sharer ↔ recipient buds graph); recipient field accepts username OR email — TDD
Disco DeDisco
2026-05-08 23:34:35 -04:00
11ff109d1emy_posts: titles → @{handle}'s Posts + Posts by Others (view-side string build); applet-list link colour --terUser w. hover/active shifting to --ninUser + --terUser glow halo
Disco DeDisco
2026-05-08 23:16:31 -04:00
246e45e55dbuds rename + applet-list shell — Buddies → Buds everywhere (model field, slug, URL, view, DOM, CSS); my_buds.html + my_posts.html share new _applet-list-shell.html partial — vertical-title applet-scroll card; my_posts hosts two side-by-side in landscape, stacked in portrait — TDD
Disco DeDisco
2026-05-08 23:08:33 -04:00
5f6002aa70buddies sprint phase 1: User.buddies M2M(self,symm=False) + my_buddies aperture page + add_buddy JSON endpoint + buddy btn slide-out — TDD; My Contacts applet renamed → My Buddies (slug + name + partial)
Disco DeDisco
2026-05-08 22:31:42 -04:00
6f76f6c176post aperture refactor (May-8b): Post.title field; Line.author PROTECT FK + created_at; Note.grant_if_new admin-vs-Look! format dispatch w. note-ref anchor; bottom-anchored aperture w. shared-between header + per-Line user/timestamp; dotted-? Brief square; reserved adman seed — TDD
Disco DeDisco
2026-05-08 21:29:21 -04:00
ba5f6556c0buddy btn sprint: banner-anchor + window.Brief fix lands the last red FT — 16/16 buddy + 12 share/jasmine/my_notes + 818 IT regression — TDD
Disco DeDisco
2026-05-08 19:14:50 -04:00
fa53bf561abrief sprint C3.a: Note unlock spawns Line + Brief on the user's per-category Post; banner JS consumes the new brief payload (FYI → post detail, square → my-notes) — TDD
Disco DeDisco
2026-05-08 18:00:01 -04:00
7f9ff36d1dbrief sprint C2: introduce billboard.Brief notification model + view_post marks-read on GET — TDD
Disco DeDisco
2026-05-08 17:35:46 -04:00
d192b1522dbrief sprint C1: relocate Post + Line from dashboard → billboard (no behavior change) — TDD
Disco DeDisco
2026-05-08 17:20:06 -04:00
f659a64b91some tweaks to portrait media query .btn-primary responsive sizing
Disco DeDisco
2026-05-08 16:18:29 -04:00
a319318740sky/sea modal titles: PICK SKY/SEA → SKY/SEA SELECT (titles only — table-hex .btn-primary instances stay PICK SKY/SEA where SELECT wouldn't fit)
Disco DeDisco
2026-05-08 15:49:58 -04:00
d58fd1db15small changes to .sky-field styling
Disco DeDisco
2026-05-08 15:41:24 -04:00
846f9ff461PICK SKY DEL: server purge of seat Character + race guards stop the btn from re-injecting; readonly opacity bump (0.6 → 0.85) — TDD
Disco DeDisco
2026-05-08 15:39:07 -04:00
1111df8465sky form TZ: render-readonly + drop #id_nf_tz_hint; placeholder absorbs the auto-detected hint copy — TDD
Disco DeDisco
2026-05-08 15:27:09 -04:00
8a8d1536b1PICK SKY DEL btn: JS-inject after wheel paints so a blank modal carries no DEL action — TDD
Disco DeDisco
2026-05-08 14:56:43 -04:00
301b4e8201applet-box: hide inner-applet scrollbars so they match the page-aperture treatment
Disco DeDisco
2026-05-08 14:50:28 -04:00
097a5dd437my-sky applet DEL btn: shift left by half the applet's padding asymmetry so it re-aligns w. the SVG center
Disco DeDisco
2026-05-08 14:44:54 -04:00
e9bceaab62sky wheel: ubiquitous DEL btn — applet & PICK SKY parity w. Dashsky; PICK SKY clears client-only state (no User-model touch) — TDD
Disco DeDisco
2026-05-08 14:34:41 -04:00
283b417341sky.html: tame iOS Firefox date/time native widgets w. appearance:none + max-width; mirror small-landscape btn-primary scaling onto portrait & narrow form-col gap on both
Disco DeDisco
2026-05-08 14:04:15 -04:00
c8d7b055d7sky.html: clip horizontal overflow on iOS Firefox — .sky-page overflow-x:hidden + min-width:0 on .sky-field input
Disco DeDisco
2026-05-08 13:18:30 -04:00
9ff437012asky.html: DEL btn at wheel center; async SAVE SKY transitions into saved state without reload; pre-save hides wheel-col so form+SAVE SKY stay centered — TDD
Disco DeDisco
2026-05-08 13:07:56 -04:00
bbd1b22bb0sky.html post-save: reset (max-width:600px) form-main height cap & btn align-self so flex-column flip lands the SAVE SKY beneath the fields
Disco DeDisco
2026-05-08 12:30:01 -04:00
05c9f9c079sky.html post-save: stack SAVE SKY beneath form fields & vertically center the pair, parity w. wheel
Disco DeDisco
2026-05-08 12:27:47 -04:00
319b787109sky.html: snap-binary aperture scroll (wheel ↔ form, full aperture each); SAVE SKY animates scrollTop back to 0 — TDD
Disco DeDisco
2026-05-08 12:24:11 -04:00
3beedc3f0asky form: flip label margins so each label hugs its own input below; zero geo-btn vertical margin so birth place doesn't drift
Disco DeDisco
2026-05-08 12:00:03 -04:00
4f2c7d9577sky form: clear timezone field on new place pick so TZ auto-redetects from coords — TDD
Disco DeDisco
2026-05-08 11:40:37 -04:00
cc2a3f3526rename natus → sky across the codebase — natal chart abstraction is now sky throughout, since chart inputs aren't birthday-gated
Disco DeDisco
2026-05-04 20:36:15 -04:00
19b7828ea9ignore .vscode/ in git & docker contexts; workspace tasks/settings are local-only (Windows paths + per-machine venv layout)
Disco DeDisco
2026-05-04 18:17:54 -04:00
a97cd8dcfftest_clicking_pick_sea_btn_opens_sea_overlay: poll click+sea-open assertion to absorb DOM-vs-script race on slow CI — TDD
Disco DeDisco
2026-05-04 02:23:47 -04:00
5413e63585billboard Most Recent Scroll: fix SQLite NULL drop on SIG_READY exclude; pronouns flow FT; Blades middle reversal Nervous → Fickle — TDD
Disco DeDisco
2026-05-04 01:27:17 -04:00
29493c4f74pronouns: per-user pronouns ideology + Pronouns applet on Game Kit; provenance prose uses actor.pronouns at render time — TDD
Disco DeDisco
2026-05-04 01:11:40 -04:00
599d40decdauth urls: mount apps.lyric.urls under /dashboard/ to mirror gameboard/epic & billboard/drama convention
Disco DeDisco
2026-05-04 00:18:36 -04:00
2dc68c41a7billboard applets: drop billboard- prefix from partials & ids; Most Recent → Most Recent Scroll; room_scroll → scroll — TDD
Disco DeDisco
2026-05-03 23:22:01 -04:00
b1a11504f5game kit + role icons + tarot fan: in-use mini-portal label, FLIP cue polarity reset, role icon redraws
Disco DeDisco
2026-05-03 22:28:32 -04:00
f78177778fSIG SELECT exit: 2s hang after tray closes; suppress waiting msg if PICK SKY already up — TDD
Disco DeDisco
2026-05-03 22:11:07 -04:00
480cb4aed6tray: Tray.placeSig analogue of placeCard for SIG SELECT exit; rename arc-in → fade-in — TDD
Disco DeDisco
2026-05-03 21:58:44 -04:00
9b93b9d31btray tooltips: tilt persists while portal is open; PRV|NXT pinned to corners — TDD
Disco DeDisco
2026-05-03 21:18:09 -04:00
b29bcf5c38tray sig-card tooltip: portal w. PRV|NXT pager — TDD
Disco DeDisco
2026-05-03 21:07:33 -04:00
08243d109dtray cards: shadow, hover-tilt w. focus persistence, role-card tooltip — TDD
Disco DeDisco
2026-05-03 18:40:10 -04:00
75fcc5b34dbillboard applets: single-root wrapper for HTMX swap; full context on toggle — TDD
Disco DeDisco
2026-05-03 17:15:26 -04:00
536a558f26PICK SEA: gate PRV|NXT on .fyi-open like sig + fan
Disco DeDisco
2026-05-01 02:36:50 -04:00
08aa4dc819PICK SEA Sprint C: sea stage card viewer — FLIP in, SPIN/FYI, deposit/re-expand — TDD
Disco DeDisco
2026-04-29 01:12:06 -04:00
2af59b3a7ftarot card icons + ranks; sig fallback for pre-sync Characters; DECKS label sizing — TDD
Disco DeDisco
2026-04-29 00:20:55 -04:00
6d75b9541fPICK SEA styling: deck backs, card rank+icon display, fa-hand-dots Major Arcana — TDD
Disco DeDisco
2026-04-28 23:30:07 -04:00
132e60864ePICK SEA Sprint B: deck stacks, OK btn, card draw, LOCK HAND/DEL — TDD
Disco DeDisco
2026-04-28 23:02:49 -04:00
ff3e4d295cPICK SEA Sprint B FTs: deck stacks, OK btn, card draw, LOCK HAND/DEL — red — TDD
Disco DeDisco
2026-04-28 22:50:39 -04:00
39e12d6a3dPICK SEA Sprint A: async sky→sea transition via WS room:sky_confirmed — TDD
Disco DeDisco
2026-04-28 22:16:38 -04:00
379e0ab80ccharacter: significator field populated from seat on natus_save; my_tray_sig from Character when confirmed — TDD
Disco DeDisco
2026-04-28 21:46:21 -04:00
b5fbc3d354SIG SELECT: fix major arcana reversed face slot order — title first, qualifier second after spin — TDD
Disco DeDisco
2026-04-28 20:48:47 -04:00
759ce8d3e4fix CI FT regressions: deck contribution, ROLE SELECT no-deck guard, sig qualifiers, Carte Blanche multi-slot
Disco DeDisco
2026-04-28 16:29:51 -04:00
9eb1c1523enatus wheel: element tooltips — Space/Air-Capacitor subtitle; score badge under square
Disco DeDisco
2026-04-28 12:01:36 -04:00
c399afa26drole select channels FTs: get_or_create DeckVariant in _equip_earthman_deck — fixes CI flush wipe
Disco DeDisco
2026-04-28 11:46:47 -04:00
4b8e02b698role select channels FTs: equip Earthman deck in setUp — fixes no-deck guard block
Disco DeDisco
2026-04-28 02:33:15 -04:00
478e845ecftest_game_invite: guard BillPost import with skipUnless — fixes CI loader error
Disco DeDisco
2026-04-28 02:18:06 -04:00
d79380faa5fix stale test assertions after note-page interaction changes — TDD
Disco DeDisco
2026-04-28 02:00:22 -04:00