Skip to content

Start a new project with three tabs and a card in each - #107

Merged
rayzhou-bit merged 1 commit into
masterfrom
fixture/new-project-starter
Oct 7, 2026
Merged

rayzhou-bit merged 1 commit into
masterfrom
fixture/new-project-starter

Conversation

@rayzhou-bit

Copy link
Copy Markdown
Owner

A new project opened on a single empty tab called "Title" — a blank canvas and a tool menu to guess at. It now starts as Campaign / Bestiary / Players, each holding one card:

Tab Card Type
Campaign "Opening scene" — It was a dark and stormy night... freeform
Bestiary Goblin (SRD) stat
Players The Hero — description plus Bond and Goal note

That happens to be one card per type, so every type is one click from being copied rather than built from scratch, and a new user sees the shape the app expects instead of an empty grid.

BLANK_PROJECT is what gets written to Firestore on "new project" as well as what the offline blank project loads, so both paths pick this up without further change.

Authored under the same rule as the intro fixture: loadBlankProject doesn't merge DEFAULT_CARD over these, so every field the app reads is written out explicitly, and the three cards carry distinct timestamps — otherwise the Library's Newest/Oldest sort has nothing to order them by.

Verification

847 tests pass (3 new on the starter's shape: tab titles and order, each card placed on the tab that lists it, distinct titles and timestamps). Build clean. The blank project isn't reachable in offline mode, so I temporarily pointed the loader at it to see what a new user actually gets — all three tabs render with their card and no console errors.

🤖 Generated with Claude Code

A new project opened on one empty tab called "Title" - a blank canvas and a
tool menu to guess at. It now starts as Campaign / Bestiary / Players, each
holding one card: an opening-scene freeform card, the SRD goblin, and a
player sheet.

That's also one card per type, so every type is one click from being copied
rather than built from scratch.

BLANK_PROJECT is what Firestore gets on "new project" as well as what the
offline blank project loads, so both paths pick this up. Same authoring rule
as the intro fixture: loadBlankProject doesn't merge DEFAULT_CARD over these,
so every field the app reads is written out, and the cards carry distinct
timestamps or the Library's Newest/Oldest sort has nothing to order them by.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown

Visit the preview URL for this PR (updated for commit c5c5eb1):

https://dmkit-e7e99--pr107-fixture-new-project-432a1bzu.web.app

(expires Wed, 14 Oct 2026 01:46:22 GMT)

🔥 via Firebase Hosting GitHub Action 🌎

Sign: 310a7f1d940a0f8f9346804f5fc60f8ba2a4f18d

@rayzhou-bit
rayzhou-bit merged commit 31c8e33 into master Oct 7, 2026
2 checks passed
rayzhou-bit added a commit that referenced this pull request Oct 27, 2026
blankTs called Date.now() fresh for every card and added a small offset, so
if the clock ticked while the module evaluated, card A's `now + 2` and card
B's `now + 1` landed on the same millisecond and two starter cards shared a
timestamp. One clock reading for all three makes them distinct by
construction.

Mine, from #107. It passed locally because the three cards happened to
evaluate inside one millisecond; CI's clock ticked and the test I wrote for
exactly this caught it there. Ran the affected file 20x after the fix.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant