Trip dashboard#56
Draft
rawcomposition wants to merge 20 commits into
Draft
Conversation
- Single blue: replace all sky-* accents with primary/primary-hover - Global link color now uses the link token (blue-600 for AA contrast) - Add destructive-hover token; button danger variant uses destructive tokens - ui/button, ui/input, ui/tabs no longer use raw palette classes - Default border compat color reads var(--border) instead of gray-200 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Map, targets, species detail, and itinerary now render as children of a TripLayout that owns Header, TripNav, the 404 guard, and a flex main, replacing per-page chrome and h-[calc(100%-60px-55px)] layout math. TripNav derives its active tab and border from the route instead of props. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- New PATCH /v1/trips/:tripId/privacy endpoint (editor-gated) exposing the previously unreachable isPublic field - Share modal: public/private toggle with optimistic update, copy view-only link, participant summary with invite/manage entry points - New ui/switch primitive (Base UI) - Header Share button now visible at all screen sizes and opens the modal instead of navigating to /participants Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…leton, spinner, checkbox) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Card/Alert/Badge/Tooltip/Input consumers now use components/ui equivalents; ui/input gains a compact sm size; SlideOver rewritten without @headlessui. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Days render as ui/card with dnd-kit drag reorder (new reorder-locations endpoint replacing up/down moves), trip dates can be set inline via new PATCH /trips/:id/dates, and the page prints as a clean day sheet. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New /:tripId/overview with cover hero, stats, top-targets teaser, participants, and an editable trip description (new Trip.description + PATCH /trips/:id/description). Viewers land on Overview; editors keep landing on the map. Overview added to trip nav. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…grid Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…sses Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… API Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tokenize targets/overview/toolbar Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…okens, tall inputs Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ntact; retire .input class Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- /:tripId now renders Overview for everyone; map moves to /:tripId/map (old /overview URLs redirect, map bounces non-editors to the index) - Every card is an entry point into trip data: hotspot/marker rows open their detail sheets, itinerary day rows and target rows deep-link, counts live in card headers (Stat cards removed) - Notes edit via modal instead of edit-in-place - Documents: per-doc visibility (private/trip/public) and category with type icons, edit modal, server-side visibility filtering, public docs shown to trip viewers, cascade delete with the trip - Fix modal-close bug: page click-to-close handler dismissed modals opened from portaled dropdown menus (zustand flushes synchronously mid-event); ignore clicks whose DOM target is outside the container Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Fix modal flicker: close() left a 500ms timer that nulled modalId even after a newer open(); cancel it on open and reschedule on close - Modal footers follow app convention (right-aligned, Cancel before primary); prevent textarea focus ring clipping in Trip notes - Share: round copy button (shrink-0), participants as avatar stack with dashed invite circle instead of a button competing with Done, semantic tokens - Hero avatars: ring hugs the avatar, per-avatar name tooltips, stack links to participants - Itinerary rows: date replaces "Day N" heading (tile keeps the number) - Target thumbnails keep their 4:3 aspect ratio - TripNav kebab gains a "More" label on sm+ - Trip cover images now render at 1280x640@2x (was 300x185@2x); add backfill-trip-images script (dry-run by default, --apply to run) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.
To Do
No new bucket needed. The presigned PUT already targets your existing bucket; the browser is blocked purely because the bucket has no CORS policy (the preflight gets no Access-Control-Allow-Origin). In Cloudflare → R2 → your birdplan bucket → Settings → CORS policy:
[
{
"AllowedOrigins": ["http://localhost:5280", "https://birdplan.app"],
"AllowedMethods": ["PUT"],
"AllowedHeaders": ["content-type"],
"MaxAgeSeconds": 3600
}
]
Step 3
Share story shipped and verified end-to-end (commit faafc8b on concepts).
Verification: Share modal + trip privacy toggle
Verdict: PASS
Method: Logged in as your account via the dev OTP flow (dev mode logs codes instead of emailing), drove the real app headlessly against your dev backend, restored all state afterward.
Steps
What shipped
Findings worth your attention
Step 4
Step 4 is done and verified — five commits on concepts, all typecheck/lint clean.
Verification: ui primitives + itinerary redesign
Verdict: PASS
Method: Ran the real app (Vite + Hono dev servers), minted a session for your account, drove it headlessly with Playwright on a scratch trip I created and deleted afterward. Session invalidated at the end — no orphans this time.
Steps
What shipped (commits 13b605d → 8ae525f)
Findings
the plan since they work and ui/commam opportunistically.
Next per the roadmap: step 5, the aude — editors keep landing on the map,public viewers/invitees get the overview. Ready to start on that whenever you are.
✻ Cooked for 24m 34s
❯ Continue
Step 5: the audience-aware trip Overview page. Let me first check the data sources available — trip provider, participants access for logets are fetched:
Searched for 5 patterns, read 5 files
⏺ Update(shared/types.ts)
Step 5
Step 5 is done — the trip Overview page is live on concepts (commits 17f9c57 + 3d7078b), verified end-to-end.
Verification: audience-aware trip Overview
Verdict: PASS
Method: Real dev servers + Playwright, on a scratch trip (created, exercised, deleted; verification session invalidated afterward — no leftovers).
Steps
Design decisions worth knowing
One confession: I stopped the dev servers with pkill -f vite / pkill -f "tsx watch" — if you had another
Vite project running it could have belan ports are released. I'll usetracked background tasks next time.
That completes steps 1–5 of the roadmap. Next up is step 6, the H3 custom-area feature — the OpenBirding POST /api/v1/targets/h3 endpoint (on rule) plus BirdPlan's click-to-placepolygon draw UX with live hex preview. It's the biggest remaining piece; say the word.
Step 6
Step 6 is done — the H3 custom-area feature is live end-to-end, and your notes file is at plans/worth-knowing.md (kept local since plans/ is gitignored, alongside fable-notes.md; it now covers everything from the token work through H3, and I corrected one earlier claim — the OpenBirding region response is frequency-sorted server-side; my "unsorted" observation was wrong).
Verification: custom-area targets (H3)
Verdict: PASS
Method: Both apps running locally (BirdPlan pointed at the local OpenBirding API via env override, CORS opened for :5280), real browser drive with Playwright on a scratch trip, plus direct API probes against the real 142.9M-row targets.db.
OpenBirding — POST /api/v1/targets/h3 (commit bf04efa on new branch h3-targets)
BirdPlan — draw UX (commits 07de0a3, 5e9db31 on concepts)
this time.
Before this ships
Cleanup
Fixes
Guardrails
De-Google
Component system