game-views: replace CHAT with YARN (.fa-route) between SCROLL & POST; ATLAS timestamps match their source views

CHAT conceptually overlapped POST, so it's gone — replaced by a distinct YARN view (fa-route) shifted one slot left, between SCROLL and POST. Reelhouse order is now ATLAS | SCROLL | YARN | POST | PULSE. YARN is a stub (the shared [Feature forthcoming] partial in its .applet-scroll, like PULSE).

Touched: the carousel + strip partials, the h2 reel words, the _base.scss data-active-view translateX reindex (yarn=-200%, post now -300%), room-views.js VIEW_ORDER, the Jasmine spec VIEWS, and the FT/IT order + stub assertions. The horizontal-wheel FT now expects scroll's neighbour to be YARN.

ATLAS timestamps: the merged rows carry the ORIGINAL <time> from their source (.drama-event-time from SCROLL, .post-line-time from POST), but those source rules are feed/thread-scoped so the atlas copies rendered full-size inline. Made .atlas-row a flex row and restated the shared small / dim / right-aligned look on both source time classes so each timestamp reads the same as in the view it came from.

Verified: 8 carousel FTs + carousel ITs + Jasmine (atlas merge + swipe machine) green.

[[project-room-game-views-carousel]]
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Disco DeDisco
2026-06-02 14:45:25 -04:00
parent 6f5927083c
commit ced324081f
10 changed files with 53 additions and 32 deletions

View File

@@ -3438,20 +3438,21 @@ class RoomViewsCarouselTest(TestCase):
def test_renders_five_view_panes_in_order(self):
content = self.client.get(self.url).content.decode()
self.assertIn("id_room_views", content)
for view in ("atlas", "scroll", "post", "chat", "pulse"):
for view in ("atlas", "scroll", "yarn", "post", "pulse"):
self.assertIn(f'data-view="{view}"', content)
# Order: atlas precedes scroll precedes post precedes chat precedes pulse.
# Order: atlas precedes scroll precedes yarn precedes post precedes pulse.
positions = [content.index(f'room-view--{v}')
for v in ("atlas", "scroll", "post", "chat", "pulse")]
for v in ("atlas", "scroll", "yarn", "post", "pulse")]
self.assertEqual(positions, sorted(positions))
def test_renders_root_level_icon_strip(self):
content = self.client.get(self.url).content.decode()
self.assertIn("id_room_views_strip", content)
for view in ("atlas", "scroll", "post", "chat", "pulse"):
for view in ("atlas", "scroll", "yarn", "post", "pulse"):
self.assertIn(f'data-view="{view}"', content)
self.assertIn("fa-scroll", content)
self.assertIn("fa-book-atlas", content)
self.assertIn("fa-route", content)
def test_scroll_view_still_wraps_the_provenance_feed(self):
content = self.client.get(self.url).content.decode()
@@ -3472,7 +3473,7 @@ class RoomViewsCarouselTest(TestCase):
content = self.client.get(self.url).content.decode()
self.assertIn("opening move", content)
def test_chat_and_pulse_render_stubs(self):
def test_yarn_and_pulse_render_stubs(self):
content = self.client.get(self.url).content.decode()
self.assertIn("room-view-stub", content)