Repository navigation
Cartoon UI polish: detail sheet, friends, profile + ./start local dev launcher - #5
Merged
Merged
Conversation
Fixes from live-data review: Place detail sheet - Desktop: full 3px ink border + full 28px radius (was: bottom-sheet top border + upward shadow leaking as a dark lip, square bottom corners); all shadows removed - Info rows: proper inner padding so the icon chip no longer clips through the rounded border; icon chips restyled (lavender, 2px ink, rounded); row spacing via info-sections gap; restore the last row's bottom border (base :last-child divider rule outspecified the skin) Friends - Tab track no longer runs edge-to-edge (base padding-as-gutter moved to margin); active pill contained, underline artifact removed - Add button (inside the input pill) compacted with margin so it stops colliding with the input border; proper cartoon disabled state Profile - Stats: dissolve the base glass wrapper (double-card + stray shadow), three standalone stat pills with proper spacing from the hero - Hero: decorative corner blobs from the design mock, side margins - Avatar: broken <img> no longer painted over the initial fallback (v-show until loaded) Dev workflow - New ./start launcher: './start local' runs Vite + API with .env.local (Dokploy Postgres via its external port) for testing against live data; './start dev' uses .env; never pushes schema on start. .env.local is gitignored — credentials stay out of the repo.
- Discover type filters (Restaurant/Cafe/Bar/Hotel/Shop/Museum/Park/ Pharmacy) each get a colored category icon; new 'cross' icon for pharmacy in categoryIcons.js - Chip rows (.sv-filters, .pv-cats) now scroll with the mouse wheel on desktop (vertical wheel -> horizontal scroll), so nothing is cut off - My Places: category filter chips show colored icons; place cards replace the naked color dot with a tinted, ink-bordered category icon chip; active category chip uses the category tint - Place detail hero: big tinted category icon chip beside the place name and an icon inside the category pill (replacing the plain dot) Category identity is now icon+color everywhere a category appears.
Owner
Author
|
Added: icons + colors across Discover / My Places / detail hero
Verified locally against the live DB ( |
Global restyle (cartoon.scss rewritten): the chunky ink outlines are gone — soft white/tinted surfaces, gentle shadows, tinted chips. Thin outlines remain only as accents (legend chips, tags, dashed cards). Category identity stays icon+color everywhere. - Tab bar: floating pills — beige icon squircles, purple active pill with label, soft top shadow, no border - Map: borderless white search bar; NEW yellow 'Pin types' legend button (top right) opening a soft panel with tinted per-category chips (icon + name + count) that TOGGLE category visibility on the map (markers filter live); old left-edge legend rail removed; cluster bubbles borderless; marker discs soft (drop shadow + gentle ring instead of ink outline); zoom controls split into separate soft squircles - Discover / My Places: borderless cards + chips with soft shadows, tinted icon chips, lavender km badges, thin-outline tags, dashed lavender empty states - Friends: Add button moved outside the input pill (soft squircle), lavender tab track, borderless cards; NEW 'Places are better shared' card with bobbing circles + copy-your-ID button - Profile: borderless stat cards, white-ring avatar, soft settings/ data cards - Detail sheet / modals / auth / toasts: borderless soft surfaces, tinted category pills, purple/soft-red action buttons - Splash: soft cream backdrop
Owner
Author
|
Soft cartoon v2 — borderless redesign, aligned to the new mocks All chunky ink borders removed; every section restyled to the updated design language (soft white/tinted surfaces, gentle shadows, tinted chips, floating pill tab bar). New UX per the mocks:
Verified on live data ( |
Place detail sheet - Edit and Delete are now round icon buttons grouped with the close button at the top of the sheet (bottom action row removed) - Delete asks for confirmation (Yes, delete / No, keep it) right under the header, and explains the place stays recoverable Soft delete + trash (backend) - Place.deletedAt column (nullable, additive); DELETE /places/:id now soft-deletes; GET /places excludes trashed places - New: GET /places/trash/list (auto-purges entries older than 30 days), PUT /places/:id/restore, DELETE /places/:id/permanent My Places - New 'Recently Deleted' section at the bottom of the list: count badge, collapsible rows with category icon, deletion date, Restore button, and Delete-forever with an inline Forever? Yes/No confirm - Trash is fetched on mount and updated optimistically by the store (removePlace/restorePlace/purgePlace) Verified end-to-end on live data: delete -> confirm -> trash -> restore, and delete-forever purge.
Owner
Author
|
Added: header Edit/Delete + recoverable deletes
Tested end-to-end on live data: delete → confirm → trash → restore ✔, purge forever ✔. |
Tier 1 quick wins (drop Ionic, DB indexes, code-split MapLibre, PWA manifest, undo-delete toast, avatar caching, a11y) through Tier 5 big bets (live shared maps, public share pages, self-hosted geo stack, native shells). Metrics measured on the current build: 1.31MB JS single chunk, 240KB CSS, Ionic used for one <ion-app> wrapper, no DB indexes on Place.userId, no manifest, no tests/CI.
…ast, a11y - Remove @ionic/vue + ionicons: the framework shipped for a single <ion-app> wrapper. App JS chunk: 1.31MB -> 169KB (+77KB vendor, maplibre split into its own 1MB cacheable chunk); CSS -44KB; the input-shims/keyboard/focus-visible side chunks are gone - vite manualChunks: maplibre + vendor - prisma: @@index([userId, deletedAt]) and @@index([userId, category]) on Place, @@index([userId]) on Category (applied to live DB) - PWA: manifest.json + generated 192/512/maskable icons + apple-touch link -> app is now installable - Toasts support an action button; deleting a place shows 'Undo' (restores from trash inline) - Avatar responses: Cache-Control private,max-age=86400 - aria-labels on all icon-only controls (tabs, map controls, legend, sheet header, search clear) - main.scss: dead dark/light theme block + Ionic overrides + Google Fonts import removed
…osted fonts - AddPlaceModal / AuthModal / FriendProfileView are now async components (own JS+CSS chunks, loaded on demand) - Service worker: network-first caching for GET /api/places, categories, friends and trash -> saved data readable offline (tiles were already cached); returns a JSON 503 marker when fully offline - Places store exposes placesVersion; MapView watches it instead of a deep watch over the whole places array; marker images for known categories are pre-generated at map load (no first-render pop-in) - Fonts self-hosted: Baloo 2 (600-800) + Nunito (600-900) latin woff2 bundled via _fonts.scss; Google Fonts request chain removed from index.html - More dead CSS removed (glass utilities, ambient orbs incl. App.vue markup, gemini animations); CSS 196KB -> 183KB
…ed logging - New /api/geo proxy (auth-gated, per-user rate limited) for Nominatim search/reverse, Overpass and OSRM with an in-memory LRU+TTL cache and a proper User-Agent; useGeocoding/useNearby/useRouting now call it — no more direct client calls to throttled public endpoints - Vitest + supertest: 10 unit tests (categoryIcons, toast actions, geo proxy incl. cache hit, input validation, upstream-down) + npm test - GitHub Actions CI: prisma generate + test + build on PRs and main - Prisma migrations: 0_init baseline generated and marked applied on the live DB; entrypoint prefers 'migrate deploy' with db-push fallback for pre-baseline databases - pino + pino-http JSON request logging (auth redaction, avatar noise ignored) and a central express error handler - Deferred (documented): refresh-token rotation/httpOnly cookie
+ db-backup tooling Features: - Map: clicking overlapping markers opens a chooser popup listing all places at that spot (icon + name) instead of a random one - My Places: Select mode (header button) with per-card checkmarks and a bulk action bar — move N places to a category or delete N (to Recently Deleted); store gains bulkDelete/bulkSetCategory - Collections: List/ListPlace tables + /api/lists CRUD & membership routes; lists chip row in My Places (create inline, filter, delete) and a Lists section in the place detail sheet (toggle membership, create-and-add) - Import: Google Maps Takeout 'Saved Places.json' now recognized by the existing importer (location/google_maps_url properties) Ops: - scripts/db-backup.sh (pg_dump, keeps 30) + docs/BACKUPS.md with scheduled-backup setup and shadow-database safety rules; backups/ gitignored - prisma/migrations/1_lists baseline for the new tables Deferred from Tier 4 (documented): web push, i18n, place photos
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.
Fixes the visual bugs reported from the live deployment (reviewed & fixed against live data using the new local workflow):
Place detail sheet
:last-childdivider rule was out-specifying the skin)Friends
Profile
<img>is no longer painted over the initial-letter fallback (v-showuntil loaded)Dev workflow —
./start localNew
startlauncher: runs Vite (:5173) + API (:3001) with.env.localpointingDATABASE_URLat the Dokploy Postgres external port — test against live data locally../start devuses.env. Never pushes schema on start..env.localis gitignored (credentials stay out of the repo; the Dokploy DB now exposes port 5433 for this).All fixes verified locally against the live DB with Playwright (mobile + desktop).