Repository navigation
feat(story): browse main and event stories as chapter cards - #100
Merged
Merged
Conversation
The main and event lists showed every chapter as a full-width banner with its episodes, so a long event list took many screens to scan. They now show one compact card per chapter, and the chapter's existing view moved to its own page. - add /story/:category/:id (category = main | event) with breadcrumbs, entity SEO, sitemap entries and a markdown representation - event cards show the event's end date: normalizeStories fills endAt from MasterEvent, so the status badge reads ongoing/ended instead of permanent - chapter summaries aggregate the earliest start, the main cast (another episodes no longer replace it), the episode count and the total length - the event filter searches and sorts chapters
The event story filter offered search and sort but not the band, which is how readers browse events. It now has the same band icon row the event list uses, plus a mixed option for chapters without a band. - event cards label a chapter without a band as mixed - reset clears the band selection with the other event filters
The filter built its band row from the chapters on screen, so bands without an event in the build did not appear. The story page now hands the explorer the build's bands instead. - StoryServerPage loads the band list for the event section and passes it to the explorer - the mixed option stays, and event cards still label a chapter without a band as mixed
The list page already names the category, so the chip on every banner repeated it and covered the artwork.
- an event-number pill and the band's icon sit above the title - the title is larger and the chapter blurb follows it - the date row gets a calendar icon and long-form dates The day-only range helper is gone: cards show full dates now.
The band chip is now a pill with the icon and the band name. The card grid follows the content column rather than the window, so the docked filter sheet switches to two columns and the name is not cut off.
The content-column grid goes back to the window breakpoints; the column behavior will be handled separately.
Follows the reference site's layout: the event page caps its content at 1280px and the card grid uses four columns from the xl breakpoint, three from md and two from sm. The event card is compacted for the narrower column: smaller padding, id and title, no episode count (the chapter page keeps it), and the band pill stays beside the number.
The shell keeps its full width (the navigation drawer stays where it is); the page content inside main is now centred in a max-w-7xl column, as the reference site's container does. The footer panel aligns to the same column.
The event filter now shows the characters the event chapters feature, in the story table's order; picking one keeps the chapters whose cast includes it. The event list also drops to three cards per row, filling the content column.
The character section lists every band of the build. Picking one shows that band's characters among the event chapters; no band picked means no character row. Selecting another band drops characters that no longer fit.
The face row only held characters that appear in the loaded event chapters, so a band with no event in the build (MyGO, Ave Mujica) looked empty. The row now comes from the build's character table, so every band lists its members.
The event story tables do not mark a lead character; the chapter description only names one in prose. Filtering by the whole cast picked up characters who are not the event's protagonist, so the character section, its state, the character list loading and the story.ui.characters strings are gone.
The chapter path parser decoded an already-decoded pathname, so a stray percent (e.g. /story/event/100%25) threw a URIError and answered 500 instead of 404. The registry matching already decodes parameters; the id check rejects the rest.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
The main and event story lists used to render every chapter as a full-width banner followed by its episodes, so a long event list took many screens to scan. They now show one compact card per chapter, and clicking a card opens the chapter on its own page, which holds the previous chapter view (banner, copy, cast, main/another/extra episode runs).
Routes and data
/story/:category/:id(main|event) with breadcrumbs, entity SEO, sitemap entries and a Markdown representation. A chapter under the other section 404s.src/lib/story/chapters.tsaggregates each chapter: earliest start, main-run cast (another episodes no longer replace it), episode count and total length.normalizeStoriesnow takes a story'sendAtfrom its event, so event cards read ongoing/ended instead of permanent.UI
max-w-7xl) inside the area right of the navigation drawer; the footer panel aligns to the same column.Verification
bun run lint,bun run check,bun run check:search-seopass.bun test tests/: 1001 pass, 1 skip, 1 failure. The failure is the Haneoka compiled-WASM test against a stale local.haneoka/dist; it is environmental and unrelated./story/event/:id.md, sitemap entries, 375 / 1024 / 1280 / 1920 widths.Not included