Skip to content

Cartoon UI polish: detail sheet, friends, profile + ./start local dev launcher - #5

Merged
Osyna merged 9 commits into
mainfrom
feature/cartoon-ui-skin
Aug 9, 2026
Merged

Osyna merged 9 commits into
mainfrom
feature/cartoon-ui-skin

Conversation

@Osyna

@Osyna Osyna commented Aug 9, 2026

Copy link
Copy Markdown
Owner

Fixes the visual bugs reported from the live deployment (reviewed & fixed against live data using the new local workflow):

Place detail sheet

  • Desktop: full 3px ink border + 28px radius all around — removes the dark lip at the top (old bottom-sheet border + upward shadow) and the square bottom corners; all shadows removed
  • Info rows: inner padding so the icon chip no longer clips through the rounded border; icon chips restyled (lavender, 2px ink border, rounded); consistent row spacing; restored the last row's border (a base :last-child divider rule was out-specifying 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 compacted inside the input pill (no more border collision) + proper cartoon disabled state

Profile

  • Stats double-card dissolved (base glass wrapper + stray shadow gone) → three standalone stat pills, correct spacing from the hero
  • Hero gets the design's decorative corner blobs + side margins
  • Avatar bug: broken <img> is no longer painted over the initial-letter fallback (v-show until loaded)

Dev workflow — ./start local

New start launcher: runs Vite (:5173) + API (:3001) with .env.local pointing DATABASE_URL at the Dokploy Postgres external port — test against live data locally. ./start dev uses .env. Never pushes schema on start. .env.local is 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).

Osyna added 2 commits August 9, 2026 23:41
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.
@Osyna

Osyna commented Aug 9, 2026

Copy link
Copy Markdown
Owner Author

Added: icons + colors across Discover / My Places / detail hero

  • Discover type chips: colored icons (incl. new pharmacy cross), and chip rows now scroll with the mouse wheel on desktop — nothing gets cut off anymore
  • My Places: chips + cards use tinted ink-bordered category icon chips instead of naked color dots
  • Detail sheet hero: big category icon chip beside the name; icon inside the category pill

Verified locally against the live DB (./start local).

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
@Osyna

Osyna commented Aug 9, 2026

Copy link
Copy Markdown
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:

  • Pin types panel: yellow layers button next to the map search bar opens a soft 2-column legend; each chip (icon + name + count) toggles that category's visibility on the map
  • Friends: Add button outside the input, plus the 'Places are better shared' copy-your-ID card
  • Marker discs, clusters and all controls softened to match

Verified on live data (./start local): map, legend, Discover, My Places, Friends, Profile, detail sheet, modals.

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.
@Osyna

Osyna commented Aug 9, 2026

Copy link
Copy Markdown
Owner Author

Added: header Edit/Delete + recoverable deletes

  • Detail sheet: Edit + Delete moved up next to the close button as round icon buttons; Delete asks Yes / No inline (bottom action row gone)
  • Deletes are now soft: places land in a new Recently Deleted section at the bottom of My Places, where they can be restored or deleted forever (with its own Yes/No confirm). Trash auto-purges after 30 days.
  • Backend: Place.deletedAt (additive column, already applied to the live DB via prisma db push), trash/restore/permanent routes

Tested end-to-end on live data: delete → confirm → trash → restore ✔, purge forever ✔.

Osyna added 5 commits August 10, 2026 00:40
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
@Osyna
Osyna merged commit d6f5cce into main Aug 9, 2026
1 check passed
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