feat(supporters): redesign Support Us as tiered Supporters page#913
Conversation
✅ Deploy Preview for btcmap ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
Warning Rate limit exceeded
To keep reviews running without waiting, you can enable usage-based add-on for your organization. This allows additional reviews beyond the hourly cap. Account admins can enable it under billing. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (4)
📝 WalkthroughWalkthroughRenames and migrates the legacy ChangesSupporters migration (single DAG)
Sequence DiagramsequenceDiagram
participant User
participant Page as Supporters Page
participant Server as Page Server
participant Geyser as Geyser GraphQL API
participant ImageCheck as Image Validator
User->>Page: Visit /supporters
Page->>Server: load() request
Server->>Geyser: Query funders & contributions
Geyser-->>Server: Return data
Server->>ImageCheck: Validate image URLs (allowlist)
alt image allowed
ImageCheck-->>Server: keep imageUrl
else
ImageCheck-->>Server: reject -> use robohash
end
Server->>Server: Build named + anon plebs, sort by sats
Server-->>Page: Return { plebs }
User->>Page: Click donation option
Page->>Page: Load qrcode module, generate QR on canvas
Page-->>User: Show QR modal / link
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Review rate limit: 0/1 reviews remaining, refill in 32 minutes and 44 seconds.Comment |
There was a problem hiding this comment.
Pull request overview
This PR redesigns the former Support Us page into a new tiered Supporters page at /supporters, updates navigation and attribution links accordingly, and migrates i18n keys from supportUs → supporters across locales.
Changes:
- Replace
/support-uswith/supportersin navigation and map attribution, and introduce a tiered supporters layout (including an Individual Supporters / “Pleb” section). - Add a sponsors/tiers config (
sponsors.tsx) and new Svelte components (SupportSection,PlebSection) to render the new page. - Update i18n locale files and various components to use the new
supporters.*keys; add new supporter logo assets.
Reviewed changes
Copilot reviewed 17 out of 23 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| tsconfig.json | Enables JSX preservation to support a .tsx config file. |
| static/images/supporters/square.svg | Adds Square logo asset (light). |
| static/images/supporters/square-dark.svg | Adds Square logo asset (dark). |
| static/images/supporters/spiral.svg | Adds Spiral logo asset. |
| static/images/supporters/plebs/nathan-day.jpg | Adds individual supporter avatar. |
| static/images/supporters/opensats.png | Adds OpenSats logo asset. |
| src/routes/supporters/sponsors.tsx | Introduces tiers + sponsors + plebs configuration. |
| src/routes/supporters/components/SupportSection.svelte | New tier card component for org sponsors. |
| src/routes/supporters/components/PlebSection.svelte | New section component for individual supporters + CTA. |
| src/routes/supporters/components/DonationOption.svelte | Updates translation keys from supportUs.* to supporters.*. |
| src/routes/supporters/+page.svelte | New Supporters page layout with pleb + tiered org sponsors + donation UI. |
| src/routes/support-us/components/SupportSection.svelte | Removes old Support Us SupportSection component. |
| src/lib/map/setup.ts | Updates Leaflet attribution support link to /supporters. |
| src/lib/i18n/locales/{en,de,fr,es,nl,pt-BR,ru,bg}.json | Renames supportUs keys to supporters and updates nav labels. |
| src/components/layout/Header.svelte | Updates nav link label/id/url to Supporters. |
| src/components/InvoicePayment.svelte | Updates error key to supporters.qrLoadError. |
Comments suppressed due to low confidence (1)
src/routes/supporters/+page.svelte:121
- These sections introduce new user-facing copy (headings, paragraphs, CTA label) as hardcoded English strings rather than i18n keys. Since the route supports multiple locales, this will cause non-English pages to show English text; consider moving this copy into the
supporterslocale entries and rendering viat(...).
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Rename route /support-us -> /supporters and nav label to 'Supporters' - Rename i18n key supportUs -> supporters across all 8 locales - Add sponsors.tsx config with Explorer/Wayfinder/Cartographer/Navigator/Pioneer tiers - Add Pleb tier with individual supporter avatars (Nathan Day) - Add new PlebSection component with circular avatar grid and always-visible CTA - Add SupportSection component with per-tier colour accents and sponsor logo cards - Add sponsor logos: Spiral, Square (black/white SVG), OpenSats - Split page into Individual Supporters (top) and Industry Sponsors (bottom) sections - Add AppDownloadModal, Modal, SaveButton components and session API routes - Remove verbose intro copy and replace with tight marketing text + button CTAs - Add JSX support to tsconfig for .tsx config files 🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
…ions@btcmap.org 🤖 Generated with [opencode](https://opencode.ai)
…pdate all locales 🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
…r tier 🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
…tiers 🤖 Generated with [opencode](https://opencode.ai)
…e in 2 columns 🤖 Generated with [opencode](https://opencode.ai)
…o overflow 🤖 Generated with [opencode](https://opencode.ai)
…yout 🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
…dividual supporters 🤖 Generated with [opencode](https://opencode.ai)
…ions 🤖 Generated with [opencode](https://opencode.ai)
… by cumulative contributions 🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
…ution 🤖 Generated with [opencode](https://opencode.ai)
Review Summary by QodoRedesign Support Us as tiered Supporters page with live Geyser leaderboard
WalkthroughsDescription• Redesign Support Us page into tiered Supporters page with org sponsors and individual supporters • Add server-side Geyser GraphQL integration to fetch live individual supporter leaderboard • Implement 5-tier sponsorship system (Explorer, Wayfinder, Cartographer, Navigator, Pioneer) with color-coded sections • Add Lightning node QR support and refactor donation modals to use common Modal component • Update all i18n keys from supportUs to supporters across 8 locales and add new individual/sponsors descriptions Diagramflowchart LR
A["Old /support-us page"] -- "301 redirect" --> B["/supporters route"]
B --> C["Individual Supporters<br/>Geyser leaderboard"]
B --> D["Tiered Org Sponsors<br/>5 sponsorship levels"]
B --> E["Donation Options<br/>On-chain, Lightning, Node"]
C -- "Server-side fetch" --> F["Geyser GraphQL API"]
D --> G["SupportSection component<br/>per-tier styling"]
C --> H["PlebSection component<br/>avatar grid + CTA"]
E --> I["Modal component<br/>QR codes"]
File Changes1. src/routes/supporters/+page.svelte
|
Code Review by Qodo
1.
|
…r avatar URLs 🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
There was a problem hiding this comment.
Actionable comments posted: 8
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/routes/.well-known/lnurlp/donations/`+server.ts:
- Around line 8-10: The route currently assumes fetch(UPSTREAM) always succeeds
and calls await res.json() directly, which can throw or hang; wrap the upstream
calls (the fetch(UPSTREAM) invocation and the other fetch block around lines
27-31) with a timeout-enabled fetch or AbortController, check res.ok before
parsing, and guard await res.json() in try/catch; on any timeout/non-OK/non-JSON
error return a controlled LNURL error payload (e.g., status/error message)
instead of throwing so the donation flow receives a proper LNURL error response.
In `@src/routes/supporters/`+page.server.ts:
- Around line 69-80: The isImageUrl function performs server-side HEAD requests
to arbitrary user-supplied URLs (SSRF risk); remove/stop using server-side fetch
in isImageUrl and any call sites (e.g., the usages around lines 119-133) and
instead validate avatar URLs locally: parse with URL to ensure scheme is http or
https, reject non-absolute URLs, disallow IPs/hostnames that resolve to
private/loopback addresses, and only accept URLs matching a configured allowlist
or pass the URL to a trusted image-proxy service for server-side fetching;
update any code that relied on isImageUrl (function name: isImageUrl) to either
rely on the local validation or the proxied/whitelisted fetch rather than
performing direct HEAD requests from the server.
- Around line 82-90: The gql function performs fetches to GEYSER_API without
timeouts; update gql to create an AbortController, pass controller.signal into
fetch, and set a timer (e.g., via setTimeout) to call controller.abort() after a
configurable timeout (e.g., 5s); ensure you clear the timer on success/failure
and handle AbortError by returning null or a clear error from gql so upstream
code can handle timeouts. Reference the gql function and GEYSER_API when adding
the AbortController and timeout logic.
In `@src/routes/supporters/`+page.svelte:
- Around line 105-115: Server and client are rendering different trees causing
hydration mismatch: change the conditional that currently checks typeof window
to use an onMount-controlled boolean (e.g., declare let mounted = false; set
mounted = true inside Svelte's onMount) so SSR outputs the same
<HeaderPlaceholder /> and the <h1> is only rendered after mounted is true on the
client; also update the Tailwind important modifier on the <h1> class from the
deprecated "!leading-tight" to the V4 postfix "leading-tight!" so replace
occurrences in the class string used by the <h1> element.
In `@src/routes/supporters/components/DonationOption.svelte`:
- Around line 49-54: The QR trigger button in DonationOption.svelte is icon-only
and missing an accessible name and explicit type; update the button (the element
that calls showQrToggle(network)) to include type="button" and provide an
accessible label (for example via aria-label="Show QR code" or a visually hidden
text node) so screen readers can announce its purpose while preserving the
existing on:click handler.
In `@src/routes/supporters/components/PlebSection.svelte`:
- Around line 16-26: The tooltip open state currently keys off pleb.name
(activeTooltip) which causes all "Anon" entries to share state; change the state
to store a unique supporter identifier (e.g., pleb.id or a generated unique key)
and update every place that reads/sets activeTooltip to use that identifier
instead of pleb.name (notably the onTouchEnd handler and the other tooltip
toggle/clear logic that compare or assign activeTooltip). If Plebs don't have a
stable id, derive one from a unique property or the list index when rendering,
ensure the same unique key is used wherever activeTooltip is compared/assigned,
and leave null behavior unchanged.
In `@src/routes/supporters/components/SupportSection.svelte`:
- Around line 28-29: The headings and CTA in SupportSection.svelte currently
concatenate raw tier.level values ("{tier.level}s" and "Become a {tier.level}")
which bypasses the app's i18n; replace these with calls to the project's
translation helper (the same function used elsewhere in the app) using
translation keys that accept the tier level as an interpolated parameter and
support pluralization where needed (e.g., a "tier.label" key for singular/plural
forms and a "support.cta.become" key that interpolates tier). Update the
references around the tier.level usage in the template so they call the
translator with the variable (not string concatenation) to ensure proper
localization.
In `@src/routes/supporters/sponsors.tsx`:
- Around line 29-43: The current sponsorshipTiers array hardcodes English
display strings in the headline property; change the data model so
SponsorshipTier uses a headlineKey (e.g., replace headline: string with
headlineKey: string) and update the sponsorshipTiers entries to provide
translation keys instead of English text, then update any Svelte components that
read sponsorshipTiers (referencing sponsorshipTiers and SponsorshipTier) to call
the i18n translator (t(...)) with tier.headlineKey when rendering; finally, add
the corresponding keys and translations to each locale file so non-English
locales show localized tier headlines.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 33c6a309-f668-4606-acfe-c489c3e30621
⛔ Files ignored due to path filters (8)
static/images/supporters/bittylicious.pngis excluded by!**/*.pngstatic/images/supporters/jan3-dark.svgis excluded by!**/*.svgstatic/images/supporters/jan3.svgis excluded by!**/*.svgstatic/images/supporters/opensats.pngis excluded by!**/*.pngstatic/images/supporters/plebs/nathan-day.jpgis excluded by!**/*.jpgstatic/images/supporters/spiral.svgis excluded by!**/*.svgstatic/images/supporters/square-dark.svgis excluded by!**/*.svgstatic/images/supporters/square.svgis excluded by!**/*.svg
📒 Files selected for processing (25)
src/components/InvoicePayment.sveltesrc/components/layout/Header.sveltesrc/lib/i18n/locales/bg.jsonsrc/lib/i18n/locales/de.jsonsrc/lib/i18n/locales/en.jsonsrc/lib/i18n/locales/es.jsonsrc/lib/i18n/locales/fr.jsonsrc/lib/i18n/locales/nl.jsonsrc/lib/i18n/locales/pt-BR.jsonsrc/lib/i18n/locales/ru.jsonsrc/lib/map/setup.tssrc/lib/store.tssrc/lib/types.tssrc/routes/.well-known/lnurlp/donations/+server.tssrc/routes/support-us/+page.server.tssrc/routes/support-us/+page.sveltesrc/routes/support-us/components/DonationOption.sveltesrc/routes/support-us/components/SupportSection.sveltesrc/routes/supporters/+page.server.tssrc/routes/supporters/+page.sveltesrc/routes/supporters/components/DonationOption.sveltesrc/routes/supporters/components/PlebSection.sveltesrc/routes/supporters/components/SupportSection.sveltesrc/routes/supporters/sponsors.tsxtsconfig.json
💤 Files with no reviewable changes (3)
- src/routes/support-us/components/SupportSection.svelte
- src/routes/support-us/components/DonationOption.svelte
- src/routes/support-us/+page.svelte
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
…wind v4 important modifier 🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
🤖 Generated with [opencode](https://opencode.ai)
…/cyan palette - Sponsor tiers (Explorer→Pioneer) now use brand teal/cyan/navy pastels instead of generic emerald/sky/amber/indigo/rose Tailwind colors - Pleb tier uses brand bitcoin orange (#F7931A) instead of generic orange-* - Remove initials fallback divs; robohash is always used when avatar is absent 🤖 Generated with [opencode](https://opencode.ai)
…fail 🤖 Generated with [opencode](https://opencode.ai)
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/lib/i18n/locales/nl.json`:
- Around line 984-985: The locale key was renamed to "supporters" but consumers
still use "media.assetNames.supportUs"; to maintain backward compatibility add
the old key back in nl.json (e.g., "supportUs": "Steun ons") or provide both
keys so src/routes/media/+page.svelte can continue using
media.assetNames.supportUs until all references are migrated to "supporters";
update nl.json's entry near "supporters"/"topCommunities" to include the legacy
"supportUs" key with identical value.
In `@src/routes/.well-known/lnurlp/donations/`+server.ts:
- Around line 33-45: The code assumes "data" is an object before reading
data.metadata, which can throw if res.json() returns null/primitive/array;
update the logic after data = await res.json() to first verify the JSON shape
(e.g., ensure data is non-null, typeof data === "object", and not
Array.isArray(data)) and if that check fails return the same 502/json error,
then proceed to the existing typeof data.metadata === "string" branch; apply
this validation around the metadata access to prevent the unhandled TypeError
and preserve the existing error response behavior.
In `@src/routes/supporters/`+page.server.ts:
- Around line 151-155: The anonPlebs mapping uses id: `anon-${c.createdAt}`
which can collide for same-timestamp contributions; update the mapping in the
anonPlebs creation to produce guaranteed-unique IDs (for example combine a
stable unique from the contribution such as c.id or the array index, or call
crypto.randomUUID()/uuidv4 if available) so each generated Pleb.id is unique and
prevents key/tooltip collisions in PlebSection.svelte; modify the map callback
that builds anonPlebs to use that combined or UUID-based id instead of only
createdAt.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: f6aa1bab-c522-4a03-8396-04bf7ef8d79c
📒 Files selected for processing (15)
src/lib/i18n/locales/bg.jsonsrc/lib/i18n/locales/de.jsonsrc/lib/i18n/locales/en.jsonsrc/lib/i18n/locales/es.jsonsrc/lib/i18n/locales/fr.jsonsrc/lib/i18n/locales/nl.jsonsrc/lib/i18n/locales/pt-BR.jsonsrc/lib/i18n/locales/ru.jsonsrc/routes/.well-known/lnurlp/donations/+server.tssrc/routes/supporters/+page.server.tssrc/routes/supporters/+page.sveltesrc/routes/supporters/components/DonationOption.sveltesrc/routes/supporters/components/PlebSection.sveltesrc/routes/supporters/components/SupportSection.sveltesrc/routes/supporters/sponsors.tsx
✅ Files skipped from review due to trivial changes (3)
- src/routes/supporters/components/DonationOption.svelte
- src/routes/supporters/components/SupportSection.svelte
- src/lib/i18n/locales/pt-BR.json
🚧 Files skipped from review as they are similar to previous changes (6)
- src/lib/i18n/locales/fr.json
- src/lib/i18n/locales/de.json
- src/lib/i18n/locales/en.json
- src/lib/i18n/locales/bg.json
- src/lib/i18n/locales/ru.json
- src/routes/supporters/+page.svelte
…palette - Explorer/Wayfinder blend with page bg, Cartographer/Navigator/Pioneer use ascending teal richness (#0099AF → #095D73) with increasing opacity - Pleb dark mode bg bumped to 8% bitcoin orange for visible warm tint 🤖 Generated with [opencode](https://opencode.ai)
Yup, bringing colours on-brand now. |
- Validate upstream JSON is a non-null, non-array object before accessing data.metadata to prevent unhandled TypeError on unexpected shapes - Append array index to anon pleb IDs to prevent collisions when multiple contributions share the same createdAt timestamp 🤖 Generated with [opencode](https://opencode.ai)
Renames legacy `supportUs` namespace to `supporters` (top-level, nav.*, media.assetNames.*) and adds Dutch translations for the new keys introduced in #913: tiers (explorer/wayfinder/cartographer/ navigator/pioneer/pleb), individual, sponsors.description, donate.lightningAddress, and node.scanOrClick. Drops obsolete supportUs.intro and supportUs.appreciate (no longer present in en.json). NL now has full key parity with EN (987 keys). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* i18n(nl): update Dutch translations Squashes the original nl.json update with subsequent JSON syntax fixes (missing commas, trailing comma) and rebases onto main, picking up the H1 hero trailing-period removals from #962. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(i18n/nl): restore HTML entities in 5 garbled strings Replace ASCII-space placeholders with the correct HTML entity encoding used elsewhere in nl.json: - backup.copyFailed: "Kopi ren" -> "Kopiëren" - errors.mapView / mapViewCachedCoords: "co rdinaten" -> "coördinaten" - addLocation.advancedHint: "co rdinaten" -> "coördinaten" - supertaggerDescription: " berhaupt" -> "überhaupt" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * i18n(nl): align nl.json keys with en.json after #913 supporters rename Renames legacy `supportUs` namespace to `supporters` (top-level, nav.*, media.assetNames.*) and adds Dutch translations for the new keys introduced in #913: tiers (explorer/wayfinder/cartographer/ navigator/pioneer/pleb), individual, sponsors.description, donate.lightningAddress, and node.scanOrClick. Drops obsolete supportUs.intro and supportUs.appreciate (no longer present in en.json). NL now has full key parity with EN (987 keys). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(i18n/nl): keep proper names and handles untranslated #956 - secondl1ght: revert "tweedelig" -> "secondl1ght" (username, not a phrase) - nathanDay: revert "Nathan Dag" -> "Nathan Day" (surname, not "day") Matches en.json and fr.json behavior. Flagged in code review. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(agents): add i18n guidelines about names, key parity, entities #956 Captures lessons from PR #956 review: - never translate proper names or handles - keep keys aligned with en.json across all locales - match the locale file's existing HTML-entity style for diacritics Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: escapedcat <github@htmlcss.de>


Summary
Redesigns the former Support Us page into a fully-featured Supporters page at
/supporters, with tiered org sponsors, a live individual supporters section, donation options, and a lightning node row.Routing & Navigation
/support-us→/supporterswith a 301 redirect from the old URL to preserve inbound linkssupportUs→supportersacross all 8 locales (en, de, fr, es, nl, pt-BR, ru, bg)Tiered Org Sponsors
sponsors.tsxconfig defines 5 tiers: Explorer, Wayfinder, Cartographer, Navigator, PioneerSupportSectioncomponent with per-tier colour schemes, sponsor logo cards, and an always-visible "Become a {tier}" CTA cardIndividual Supporters (Pleb Tier)
createdAttimestamp<div>rather than a broken<a href="#">Donation Options
donations@btcmap.org), and Lightning Node rows using a sharedDonationOptioncomponentModalcomponent (same backdrop, slide-up animation, Escape key, focus management, and scroll lock as language/apps modals)…truncation from donation values; replaced with CSStruncateLightning Address
/.well-known/lnurlp/donationsSvelteKit server route that proxiesbtcmap@rizful.comand rewrites thetext/identifiertodonations@btcmap.orgLightning Node
038f4d8a…/node/038f4d8a…i18n
supporters.individual.heading,description,ctasupporters.sponsors.descriptionsupporters.node.scanOrClickSecurity / Accessibility
target="_blank"links userel="noopener noreferrer"<div>instead of a broken<a href="#">Bug Fixes
SavedPlacetype accidentally dropped during rebase conflict resolutionSummary by CodeRabbit
New Features
Navigation & Routes
Updates