Repository navigation
feat: design system, accounts, adding cards and the collection grid (004) - #5
Merged
Merged
Conversation
…collection Phase 0: Doc-first commit and routing spec Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 0: Doc-first commit and routing spec Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 1: Install the design system Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pp shell body Phase 1: Install the design system Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 2: Users, sessions and sign-in Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 2: Users, sessions and sign-in Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 2: Users, sessions and sign-in Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ions Phase 2: Users, sessions and sign-in Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ruling: renumber unreleased 004 migrations after 002 — keeps migration history ordered — cost if wrong: one renamed file Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fault setting Phase 3: First run, sign-up and the sign-up setting Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 3: First run, sign-up and the sign-up setting Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 3: First run, sign-up and the sign-up setting Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 4: App shell and navigation Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 4: App shell and navigation Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ruling: follow Rack 3.2's status name — removes deprecation noise — cost if wrong: none (same 422) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 5: Lots, collecting vocabulary and currency Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 5: Lots, collecting vocabulary and currency Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ty index Phase 5: Lots, collecting vocabulary and currency Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 6: User administration and the command-line user command Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 6: User administration and the command-line user command Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 6: User administration and the command-line user command Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…de notes Phase 6: User administration and the command-line user command Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ruling: AC-3.6 closes sign-up only on first run — creating a later admin must not undo an admin's setting — cost if wrong: one line Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 7: Search in the design system, with owned counts and quick add Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 7: Search in the design system, with owned counts and quick add Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ruling: headless Firefox's 500px minimum window width means phone widths are tested in a fixed-width same-origin iframe — cost if wrong: tests slightly further from a real phone browser Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 8: The card page Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 8: The card page Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 8: The card page Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 8: The card page Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 11: Design-system docs, 360px sweep and README Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ruling: FR-12 / Form pattern — invalid fields reference their messages — cost if wrong: none Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…4 v2.1.2) Review round 1: spec patch Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Turbo submits the sign-in form with fetch, so a visit straight after the click could abort the POST before its session cookie landed. The helper now waits for the avatar that every signed-in page renders. Review round 1: WU-1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 1: WU-2 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 1: WU-9 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 1: WU-3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 1: WU-4 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 1: WU-5 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 1: WU-6 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 1: WU-7 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 1: WU-8 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Split the 390px card page example into header/actions and AC-8.10 (centred image, folded copy rows) examples sharing a setup helper, and move the collection filter example's records into a helper, so both fit RSpec/ExampleLength without weakening any assertion. Review round 2: WU-10 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Assert that a printing with no usable image renders the c-tile__missing fallback (name on the sunken surface, no <img>) on search results, the collection grid and the card page. Review round 2: WU-11 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Walkthrough: B Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Multi-face layouts whose faces share one image (adventure, split, prepare) showed the same image twice; show each distinct image once. Walkthrough: A Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
English printings can carry a stylized printed name ("SERRA ANGEL");
tiles now use Catalog::Entry#display_name, which shows the printed name
only when the printing isn't English (AC-6.2, AC-11.2).
Walkthrough: B
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At 390px the SET · number link in the Printings list wrapped mid-code beside a long set name; the code no longer wraps, the set name still can. Walkthrough: C Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lot and admin user forms sat flush under .c-pagehead, so the first label touched the stats line; a form directly after a page head now gets the section spacing (space-6). Other page-head pages are unchanged. Walkthrough: E Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Captured from the dev server against the full English catalog, at 1280px in light and dark, and at 390px in a fixed-width frame. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pre-commit PreToolUse hook ran before the Bash command, so it saw an empty index for 'git add X && git commit'. It now also lints changed and untracked Ruby files when the command runs git add, and changed tracked files when the commit uses -a/--all. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review follow-up: shared face image alt text Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Turbo restores the previous page on Back from a snapshot that keeps the typed field values, so the results reverted but the search box still showed the old query. A url-sync Stimulus controller on the search and collection filter forms resets each field from the URL after every Turbo load (spec 004 AC-6.1, AC-11.4). Without JS the server already renders the right values. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Hardening for an intermittent CI failure (run 36748308952) that never reproduced locally; hypothesis: go_back landed mid-navigation. Ruling: wait for Turbo idle — cost if wrong: none; the flake may persist and needs further diagnosis. Before go_forward only <html> is checked: Turbo 8.0.23 snapshots the page while the frame-targeting form submission still marks the results frame busy, so after Back the restored frame keeps a stale busy attribute. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3 tasks done
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.
Summary
Implements spec 004 Design System, Accounts, Adding Cards and the Collection Grid (v2.1.3) per its plan and data model.
c-*components, self-hosted fonts, logos, docs and previews from the Collector design-system export are inapp/assets/stylesheets/collector/,app/assets/fonts/collector/,app/assets/images/collector/anddocs/design-system/, plus thecollector-design-systemClaude Code skill and theCLAUDE.mdUI section.collector/additions.css, so a future re-export can replace the export's files wholesale.docs/design-system/components/(16 new: StatusMessage, Form, AuthPage, TileAdd, FinishBadge, …)./up.COLLECTOR_TRUSTED_PROXIES). The session cookie is secure over HTTPS (COLLECTOR_HTTPS).bin/rails "collector:user[email]"creates an admin or resets a password.Lot(core, tenant-scoped byaccount_id) merges copies with the same printing, finish, condition and price paid. A uniquelot_keyindex enforces this, and a lot holds at most 9,999 copies.MTG::Collectingthrough aCatalog.collectingregistry, so the core stays collectible-agnostic.COLLECTOR_CURRENCY(default USD), and an unknown code fails boot.Addupdates the page in place through a Turbo morph refresh, with no reload and the scroll position kept. It works without JavaScript through a 303 redirect. All 002 search behaviours are kept except the ones AC-6.5 supersedes.Screenshots
Captured from a development server against the full English Scryfall catalog (106,636 printings) and a seeded collection, using headless Firefox. Phone shots are 390px: they're rendered in a fixed-width frame because headless Firefox won't open a window narrower than 500px.
Verification
bin/cipassed (it's the pre-push hook): RuboCop, Brakeman (0 warnings), bundler-audit, importmap audit, and RSpec with 329 examples, 0 failures. The system specs were stable over repeated runs.schema.rbis unchanged afterwards.zeitwerk:checkpasses, and production boots with USD;COLLECTOR_CURRENCY=XYZfails boot as intended.printed_nameon tiles/collectiontook 54–106 ms, and search took 177–255 ms warm (425 ms cold).collector:userwas checked against a real database: after it created the first admin, the first-run redirect stopped.Notes for review
Ruling:lines).git addin the same command, and tracked changes forcommit -a.🤖 Generated with Claude Code