rename: Note→Post/Line (dashboard); Recognition→Note (drama); new-post/my-posts to billboard
- dashboard: Note→Post, Item→Line across models, forms, views, API, urls & tests
- new-post (9×3) & my-posts (3×3) applets migrate from dashboard→billboard context; billboard view passes form & recent_posts
- drama: Recognition→Note, related_name notes; billboard URL /recognition/→/my-notes/, set-palette at /note/<slug>/set-palette
- recognition.js→note.js (module Note, data.note key); recognition-page.js→note-page.js; .recog-*→.note-*
- _recognition.scss→_note.scss; BillNotes page header; applet slug billboard-recognition→billboard-notes (My Notes)
- NoteSpec.js replaces RecognitionSpec.js; test_recognition.py→test_applet_my_notes.py
- 4 migrations applied: dashboard 0004, applets 0011+0012, drama 0005; 683 ITs green
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:32:34 -04:00
|
|
|
// ── My Posts applet ────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
#id_applet_my_posts {
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
|
|
|
|
.my-posts-container {
|
|
|
|
|
flex: 1;
|
|
|
|
|
min-height: 0;
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
-webkit-overflow-scrolling: touch;
|
|
|
|
|
scrollbar-width: none;
|
|
|
|
|
&::-webkit-scrollbar { display: none; }
|
|
|
|
|
mask-origin: padding-box;
|
|
|
|
|
mask-clip: padding-box;
|
|
|
|
|
mask-image: linear-gradient(
|
|
|
|
|
to bottom,
|
|
|
|
|
transparent 0%,
|
|
|
|
|
black 5%,
|
|
|
|
|
black 85%,
|
|
|
|
|
transparent 100%
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-24 16:46:46 -04:00
|
|
|
// ── Shared aperture fill for both billboard pages ──────────────────────────
|
|
|
|
|
|
|
|
|
|
%billboard-page-base {
|
|
|
|
|
flex: 1;
|
|
|
|
|
min-width: 0;
|
|
|
|
|
min-height: 0;
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
position: relative;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
html:has(body.page-billboard),
|
post 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
- schema: billboard/0004 adds Post.title (CharField 35) + Line.author (PROTECT FK, related_name=authored_lines) + Line.created_at (auto_now_add); RunPython backfill stamps existing rows (note_unlock → "Notes & recognitions" + author=adman; user_post → first-line glean + author=Post.owner).
- lyric/0003 seeds adman User (system author for note unlock + share invite Lines); apps.lyric.models gains RESERVED_USERNAMES = {"adman"}, is_reserved_username() guard in dashboard.set_profile, get_or_create_adman() lazy fetch (TransactionTestCase flushes the seed).
- drama: Note.grant_if_new dispatches via _ADMIN_NOTE_SLUGS = {"super-schizo","super-nomad"} — admin slugs use "The administration recognizes…" prose; everyone else uses "Look!—new Note unlocked." Both wrap Note name in `<a class="note-ref">`. Header Line dropped (test_two_different_grants_share_one_post asserts 2 lines, not 3). Note.display_name property added (slug.title() default — "super-schizo" → "Super-Schizo"). User.active_title_display returns donned recognition title or "Earthman" default.
- billboard models: Post.name property removed → my_posts.html, _applet-my-posts.html, PostSerializer switched to Post.title. LineForm.save(for_post, author) + ExistingPostLineForm.save(author) signature + all callers (api.views, billboard.views.new_post + view_post + share_post). billboard.views.share_post authors via get_or_create_adman; new_post truncates first line for Post.title via _truncate_post_title.
- post.html: <h3> post title heading; .post-shared-recipients (commas only) + .post-shared-self lines ("just me, X the Earthman" / "& me, X the Y" 0/≥1 split); #id_post_table is now a <ul> w. justify-content: flex-end + per-Line 3-col grid (author/text/time); adman Lines render |safe + .post-line--system italic; #id_text → #id_post_line_text rename (post.html only — /billboard/ new-post applet keeps #id_text); page_class page-billpost (joins billboard+billscroll body-class trio).
- SCSS _billboard.scss: .post-page extends %billboard-page-base, adds bottom-anchored flex-column scroll + 3-col .post-line grid + .post-line-form pinned at bottom. _note.scss: a.note-banner__image picks up .note-item__image-box dashed-? styling for the Brief square.
- _buddy_panel.html JS rewired for new layout: _appendLine builds <li class="post-line post-line--system"> w. adman+timestamp; _appendRecipientChip handles 0→1+ transition (rewrites "just me," → "& me,", inserts .post-shared-recipients line above self).
- FT post_page.py: get_table_rows queries .post-line; wait_for_row_in_post_table matches by text containment (line_number arg ignored — kept for backwards compat); get_line_input_box probes #id_post_line_text first, falls back to #id_text; get_post_owner reads textContent (hidden span). test_applet_new_post_line_validation switched to input[name="text"]:invalid/:valid for cross-page selectors.
- rootvars.scss: minor plutonium + fuschia tweaks (pre-existing).
- 818 ITs + 35 FTs (buddy/new-post/sharing/validation/layout/jasmine/my-notes/my-posts) green.
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 21:29:21 -04:00
|
|
|
html:has(body.page-billscroll),
|
|
|
|
|
html:has(body.page-billpost) {
|
2026-03-23 01:06:14 -04:00
|
|
|
overflow: hidden;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-24 16:46:46 -04:00
|
|
|
body.page-billboard,
|
post 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
- schema: billboard/0004 adds Post.title (CharField 35) + Line.author (PROTECT FK, related_name=authored_lines) + Line.created_at (auto_now_add); RunPython backfill stamps existing rows (note_unlock → "Notes & recognitions" + author=adman; user_post → first-line glean + author=Post.owner).
- lyric/0003 seeds adman User (system author for note unlock + share invite Lines); apps.lyric.models gains RESERVED_USERNAMES = {"adman"}, is_reserved_username() guard in dashboard.set_profile, get_or_create_adman() lazy fetch (TransactionTestCase flushes the seed).
- drama: Note.grant_if_new dispatches via _ADMIN_NOTE_SLUGS = {"super-schizo","super-nomad"} — admin slugs use "The administration recognizes…" prose; everyone else uses "Look!—new Note unlocked." Both wrap Note name in `<a class="note-ref">`. Header Line dropped (test_two_different_grants_share_one_post asserts 2 lines, not 3). Note.display_name property added (slug.title() default — "super-schizo" → "Super-Schizo"). User.active_title_display returns donned recognition title or "Earthman" default.
- billboard models: Post.name property removed → my_posts.html, _applet-my-posts.html, PostSerializer switched to Post.title. LineForm.save(for_post, author) + ExistingPostLineForm.save(author) signature + all callers (api.views, billboard.views.new_post + view_post + share_post). billboard.views.share_post authors via get_or_create_adman; new_post truncates first line for Post.title via _truncate_post_title.
- post.html: <h3> post title heading; .post-shared-recipients (commas only) + .post-shared-self lines ("just me, X the Earthman" / "& me, X the Y" 0/≥1 split); #id_post_table is now a <ul> w. justify-content: flex-end + per-Line 3-col grid (author/text/time); adman Lines render |safe + .post-line--system italic; #id_text → #id_post_line_text rename (post.html only — /billboard/ new-post applet keeps #id_text); page_class page-billpost (joins billboard+billscroll body-class trio).
- SCSS _billboard.scss: .post-page extends %billboard-page-base, adds bottom-anchored flex-column scroll + 3-col .post-line grid + .post-line-form pinned at bottom. _note.scss: a.note-banner__image picks up .note-item__image-box dashed-? styling for the Brief square.
- _buddy_panel.html JS rewired for new layout: _appendLine builds <li class="post-line post-line--system"> w. adman+timestamp; _appendRecipientChip handles 0→1+ transition (rewrites "just me," → "& me,", inserts .post-shared-recipients line above self).
- FT post_page.py: get_table_rows queries .post-line; wait_for_row_in_post_table matches by text containment (line_number arg ignored — kept for backwards compat); get_line_input_box probes #id_post_line_text first, falls back to #id_text; get_post_owner reads textContent (hidden span). test_applet_new_post_line_validation switched to input[name="text"]:invalid/:valid for cross-page selectors.
- rootvars.scss: minor plutonium + fuschia tweaks (pre-existing).
- 818 ITs + 35 FTs (buddy/new-post/sharing/validation/layout/jasmine/my-notes/my-posts) green.
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 21:29:21 -04:00
|
|
|
body.page-billscroll,
|
|
|
|
|
body.page-billpost {
|
2026-03-23 01:06:14 -04:00
|
|
|
overflow: hidden;
|
|
|
|
|
|
|
|
|
|
.container {
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
flex: 1;
|
|
|
|
|
min-height: 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.row {
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
margin-bottom: -1rem;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-24 16:46:46 -04:00
|
|
|
// ── Billboard page (three-applet grid) ─────────────────────────────────────
|
|
|
|
|
|
2026-03-23 01:06:14 -04:00
|
|
|
.billboard-page {
|
2026-03-24 16:46:46 -04:00
|
|
|
@extend %billboard-page-base;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ── Billscroll page (single full-aperture applet) ──────────────────────────
|
|
|
|
|
|
|
|
|
|
.billscroll-page {
|
|
|
|
|
@extend %billboard-page-base;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
2026-03-23 01:06:14 -04:00
|
|
|
padding: 0.75rem;
|
2026-03-24 16:46:46 -04:00
|
|
|
|
|
|
|
|
// The single scroll applet stretches to fill the remaining aperture
|
2026-05-03 23:22:01 -04:00
|
|
|
.applet-scroll {
|
2026-03-24 17:31:51 -04:00
|
|
|
@extend %applet-box;
|
2026-03-24 16:46:46 -04:00
|
|
|
flex: 1;
|
|
|
|
|
min-height: 0;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
|
|
|
|
#id_drama_scroll {
|
|
|
|
|
flex: 1;
|
|
|
|
|
min-height: 0;
|
|
|
|
|
overflow-y: auto;
|
pronouns: per-user pronouns ideology + Pronouns applet on Game Kit; provenance prose uses actor.pronouns at render time — TDD
- User.pronouns CharField w. choices=[pluralism (default), bawlmorese, misogyny, misandry, misanthropy] + pronoun_subj/obj/poss properties; PRONOUN_TABLE single source of truth in apps.lyric.models; mig 0002_user_pronouns
- drama.GameEvent.to_prose() drops module-level PRONOUN_* constants; SIG_READY/SIG_UNREADY/ROLE_SELECTED now resolve poss/subj from self.actor.pronouns at render time, so flipping a user's preference rewrites all their existing scroll prose; default actor → "their"
- SIG_READY prose strips a leading "The " from card_name so "the The Wanderer" reads "the Wanderer" and "the Engraven The Nomad" reads "the Engraven Nomad"; minor arcana ("Maid of Brands") untouched
- new applets/0005 seeds 'pronouns' applet (3x3, game-kit, default visible); _game_kit_sections.html grows a #id_gk_pronouns block w. 5 .gk-pronoun-card items labeled by ideology slug (italic) and tagged data-pronoun + data-trio
- card click → window.showGuard(card, "Set pronoun preference?<span class='guard-pronoun-trio'>{trio}</span>", commitCb); on OK fetches POST /dashboard/set-pronouns w. CSRF cookie + reloads so .active class moves and provenance prose re-renders; NVM dismisses
- dashboard.set_pronouns view (POST-only, login_required, 204/400/405) at /dashboard/set-pronouns; rejects choices not in PRONOUN_TABLE
- _game-kit.scss extends shared card rule to .gk-pronoun-card w. .active fill state + italic ideology label; #id_guard_portal .guard-pronoun-trio styled small/dim/centered under the question
- billscroll aperture: padding-right 0.75rem on #id_drama_scroll inside .applet-scroll so the timestamp column no longer sits beneath the scrollbar
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 01:11:40 -04:00
|
|
|
padding-right: 0.75rem;
|
2026-03-24 19:02:29 -04:00
|
|
|
|
|
|
|
|
.scroll-buffer {
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
align-items: baseline;
|
|
|
|
|
padding: 2rem 0 1rem;
|
|
|
|
|
opacity: 0.4;
|
|
|
|
|
font-size: 0.8rem;
|
|
|
|
|
text-transform: uppercase;
|
|
|
|
|
|
|
|
|
|
.scroll-buffer-text {
|
|
|
|
|
letter-spacing: 0.33em;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.scroll-buffer-dots {
|
|
|
|
|
display: inline-flex;
|
|
|
|
|
letter-spacing: 0;
|
|
|
|
|
|
|
|
|
|
span {
|
|
|
|
|
display: inline-block;
|
|
|
|
|
width: 0.7em;
|
|
|
|
|
text-align: center;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-03-24 16:46:46 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
post 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
- schema: billboard/0004 adds Post.title (CharField 35) + Line.author (PROTECT FK, related_name=authored_lines) + Line.created_at (auto_now_add); RunPython backfill stamps existing rows (note_unlock → "Notes & recognitions" + author=adman; user_post → first-line glean + author=Post.owner).
- lyric/0003 seeds adman User (system author for note unlock + share invite Lines); apps.lyric.models gains RESERVED_USERNAMES = {"adman"}, is_reserved_username() guard in dashboard.set_profile, get_or_create_adman() lazy fetch (TransactionTestCase flushes the seed).
- drama: Note.grant_if_new dispatches via _ADMIN_NOTE_SLUGS = {"super-schizo","super-nomad"} — admin slugs use "The administration recognizes…" prose; everyone else uses "Look!—new Note unlocked." Both wrap Note name in `<a class="note-ref">`. Header Line dropped (test_two_different_grants_share_one_post asserts 2 lines, not 3). Note.display_name property added (slug.title() default — "super-schizo" → "Super-Schizo"). User.active_title_display returns donned recognition title or "Earthman" default.
- billboard models: Post.name property removed → my_posts.html, _applet-my-posts.html, PostSerializer switched to Post.title. LineForm.save(for_post, author) + ExistingPostLineForm.save(author) signature + all callers (api.views, billboard.views.new_post + view_post + share_post). billboard.views.share_post authors via get_or_create_adman; new_post truncates first line for Post.title via _truncate_post_title.
- post.html: <h3> post title heading; .post-shared-recipients (commas only) + .post-shared-self lines ("just me, X the Earthman" / "& me, X the Y" 0/≥1 split); #id_post_table is now a <ul> w. justify-content: flex-end + per-Line 3-col grid (author/text/time); adman Lines render |safe + .post-line--system italic; #id_text → #id_post_line_text rename (post.html only — /billboard/ new-post applet keeps #id_text); page_class page-billpost (joins billboard+billscroll body-class trio).
- SCSS _billboard.scss: .post-page extends %billboard-page-base, adds bottom-anchored flex-column scroll + 3-col .post-line grid + .post-line-form pinned at bottom. _note.scss: a.note-banner__image picks up .note-item__image-box dashed-? styling for the Brief square.
- _buddy_panel.html JS rewired for new layout: _appendLine builds <li class="post-line post-line--system"> w. adman+timestamp; _appendRecipientChip handles 0→1+ transition (rewrites "just me," → "& me,", inserts .post-shared-recipients line above self).
- FT post_page.py: get_table_rows queries .post-line; wait_for_row_in_post_table matches by text containment (line_number arg ignored — kept for backwards compat); get_line_input_box probes #id_post_line_text first, falls back to #id_text; get_post_owner reads textContent (hidden span). test_applet_new_post_line_validation switched to input[name="text"]:invalid/:valid for cross-page selectors.
- rootvars.scss: minor plutonium + fuschia tweaks (pre-existing).
- 818 ITs + 35 FTs (buddy/new-post/sharing/validation/layout/jasmine/my-notes/my-posts) green.
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 21:29:21 -04:00
|
|
|
// ── Dashpost page (bottom-anchored thread + composer) ─────────────────────
|
|
|
|
|
// Mirrors billscroll's flex-column / overflow-y / scroll-buffer pattern,
|
|
|
|
|
// with the composer pinned at the bottom (flex-shrink: 0) so the thread
|
|
|
|
|
// breathes against the viewport bottom and the input stays in reach.
|
|
|
|
|
|
|
|
|
|
.post-page {
|
|
|
|
|
@extend %billboard-page-base;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
padding: 0.75rem;
|
|
|
|
|
gap: 0.5rem;
|
|
|
|
|
|
|
|
|
|
.post-header {
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
|
|
|
|
|
.post-title {
|
|
|
|
|
margin: 0 0 0.25rem;
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.post-shared-recipients,
|
|
|
|
|
.post-shared-self {
|
|
|
|
|
margin: 0;
|
|
|
|
|
font-size: 0.85rem;
|
|
|
|
|
opacity: 0.75;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#id_post_table {
|
|
|
|
|
list-style: none;
|
|
|
|
|
margin: 0;
|
|
|
|
|
padding: 0 0.75rem 0 0;
|
|
|
|
|
flex: 1;
|
|
|
|
|
min-height: 0;
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
// Bottom-anchor: scroll buffer above the lines pushes them down
|
|
|
|
|
// until they fill from the bottom; once content exceeds the
|
|
|
|
|
// aperture, normal scrolling kicks in.
|
|
|
|
|
justify-content: flex-end;
|
|
|
|
|
|
|
|
|
|
.post-line {
|
|
|
|
|
display: grid;
|
|
|
|
|
grid-template-columns: minmax(4rem, auto) 1fr minmax(3rem, auto);
|
|
|
|
|
align-items: baseline;
|
|
|
|
|
gap: 0.5rem;
|
|
|
|
|
padding: 0.25rem 0;
|
|
|
|
|
|
|
|
|
|
.post-line-author {
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
opacity: 0.75;
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
font-size: 0.85rem;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.post-line-text {
|
|
|
|
|
min-width: 0;
|
|
|
|
|
overflow-wrap: anywhere;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.post-line-time {
|
|
|
|
|
font-size: 0.75rem;
|
|
|
|
|
opacity: 0.5;
|
|
|
|
|
text-align: right;
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// System-authored Lines (adman) get a subtler typographic key
|
|
|
|
|
// — the inline `<a class="note-ref">` carries the emphasis.
|
|
|
|
|
&.post-line--system .post-line-text {
|
|
|
|
|
font-style: italic;
|
|
|
|
|
opacity: 0.85;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.post-line-buffer {
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
height: 0.25rem;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.post-line-form {
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
margin: 0;
|
|
|
|
|
padding-top: 0.25rem;
|
|
|
|
|
|
|
|
|
|
input.form-control {
|
|
|
|
|
width: 100%;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-24 17:19:09 -04:00
|
|
|
// ── Billboard applet placement ─────────────────────────────────────────────
|
rename: Note→Post/Line (dashboard); Recognition→Note (drama); new-post/my-posts to billboard
- dashboard: Note→Post, Item→Line across models, forms, views, API, urls & tests
- new-post (9×3) & my-posts (3×3) applets migrate from dashboard→billboard context; billboard view passes form & recent_posts
- drama: Recognition→Note, related_name notes; billboard URL /recognition/→/my-notes/, set-palette at /note/<slug>/set-palette
- recognition.js→note.js (module Note, data.note key); recognition-page.js→note-page.js; .recog-*→.note-*
- _recognition.scss→_note.scss; BillNotes page header; applet slug billboard-recognition→billboard-notes (My Notes)
- NoteSpec.js replaces RecognitionSpec.js; test_recognition.py→test_applet_my_notes.py
- 4 migrations applied: dashboard 0004, applets 0011+0012, drama 0005; 683 ITs green
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:32:34 -04:00
|
|
|
// Left column (4-wide): My Scrolls → Contacts → Notes stacked.
|
2026-05-03 23:22:01 -04:00
|
|
|
// Right column (8-wide): Most Recent Scroll spans full height.
|
2026-03-24 17:19:09 -04:00
|
|
|
// Portrait override (container query) restores stacked full-width layout.
|
|
|
|
|
|
|
|
|
|
#id_billboard_applets_container {
|
2026-05-03 23:22:01 -04:00
|
|
|
#id_applet_my_scrolls { grid-column: 1 / span 4; grid-row: 1 / span 3; }
|
|
|
|
|
#id_applet_my_contacts { grid-column: 1 / span 4; grid-row: 4 / span 3; }
|
|
|
|
|
#id_applet_notes { grid-column: 1 / span 4; grid-row: 7 / span 4; }
|
|
|
|
|
#id_applet_most_recent_scroll { grid-column: 5 / span 8; grid-row: 1 / span 10; }
|
2026-03-24 17:19:09 -04:00
|
|
|
|
|
|
|
|
@container (max-width: 550px) {
|
2026-05-03 23:22:01 -04:00
|
|
|
#id_applet_my_scrolls,
|
|
|
|
|
#id_applet_my_contacts,
|
|
|
|
|
#id_applet_notes,
|
|
|
|
|
#id_applet_most_recent_scroll {
|
2026-03-24 17:19:09 -04:00
|
|
|
grid-column: 1 / span 12;
|
|
|
|
|
grid-row: span var(--applet-rows, 3);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
rename: Note→Post/Line (dashboard); Recognition→Note (drama); new-post/my-posts to billboard
- dashboard: Note→Post, Item→Line across models, forms, views, API, urls & tests
- new-post (9×3) & my-posts (3×3) applets migrate from dashboard→billboard context; billboard view passes form & recent_posts
- drama: Recognition→Note, related_name notes; billboard URL /recognition/→/my-notes/, set-palette at /note/<slug>/set-palette
- recognition.js→note.js (module Note, data.note key); recognition-page.js→note-page.js; .recog-*→.note-*
- _recognition.scss→_note.scss; BillNotes page header; applet slug billboard-recognition→billboard-notes (My Notes)
- NoteSpec.js replaces RecognitionSpec.js; test_recognition.py→test_applet_my_notes.py
- 4 migrations applied: dashboard 0004, applets 0011+0012, drama 0005; 683 ITs green
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:32:34 -04:00
|
|
|
// ── Notes applet — vertical title ─────────────────────────────────────────
|
2026-04-22 02:21:35 -04:00
|
|
|
|
2026-05-03 23:22:01 -04:00
|
|
|
#id_applet_notes {
|
2026-04-22 02:21:35 -04:00
|
|
|
h2 {
|
|
|
|
|
writing-mode: vertical-rl;
|
|
|
|
|
transform: rotate(180deg);
|
|
|
|
|
margin: 0;
|
|
|
|
|
height: 100%;
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-03 23:22:01 -04:00
|
|
|
// ── Most Recent Scroll applet — scrollable drama feed ─────────────────────
|
2026-03-24 17:19:09 -04:00
|
|
|
|
2026-05-03 23:22:01 -04:00
|
|
|
#id_applet_most_recent_scroll {
|
2026-03-24 17:19:09 -04:00
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
|
|
|
|
.most-recent-room-link {
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
margin-bottom: 0.25rem;
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#id_drama_scroll {
|
|
|
|
|
flex: 1;
|
|
|
|
|
min-height: 0;
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.most-recent-load-more {
|
|
|
|
|
display: block;
|
|
|
|
|
padding-bottom: 0.5rem;
|
|
|
|
|
font-size: 0.8rem;
|
|
|
|
|
text-align: center;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-02 14:51:08 -04:00
|
|
|
// ── Drama event entries: 90 / 10 column split ─────────────────────────────
|
|
|
|
|
|
|
|
|
|
.drama-event {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: baseline;
|
|
|
|
|
|
|
|
|
|
.drama-event-body {
|
|
|
|
|
flex: 0 0 80%;
|
2026-04-13 00:34:05 -04:00
|
|
|
|
|
|
|
|
&.struck {
|
|
|
|
|
text-decoration: line-through;
|
|
|
|
|
opacity: 0.5;
|
|
|
|
|
}
|
2026-04-02 14:51:08 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.drama-event-time {
|
|
|
|
|
flex: 0 0 20%;
|
|
|
|
|
font-size: 0.75rem;
|
|
|
|
|
opacity: 0.5;
|
|
|
|
|
text-align: right;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-24 16:46:46 -04:00
|
|
|
// ── My Scrolls list ────────────────────────────────────────────────────────
|
|
|
|
|
|
2026-05-03 23:22:01 -04:00
|
|
|
#id_applet_my_scrolls {
|
2026-03-24 16:46:46 -04:00
|
|
|
.scroll-list {
|
|
|
|
|
list-style: none;
|
|
|
|
|
padding: 0;
|
|
|
|
|
margin: 0;
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
|
|
|
|
|
li {
|
|
|
|
|
padding: 0.25rem 0;
|
|
|
|
|
border-bottom: 1px solid rgba(var(--priUser), 0.15);
|
|
|
|
|
|
|
|
|
|
&:last-child { border-bottom: none; }
|
|
|
|
|
|
|
|
|
|
a { text-decoration: none; }
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-03-23 01:06:14 -04:00
|
|
|
}
|