Chat layout: history in the main sidebar, consistent header, cleaner icon

- Desktop: on /chat the main sidebar shows the chat list (search, New chat,
  items with rename/delete, active highlight) in place of the deck
  navigation; the separate second column is gone and the chat uses the full
  width. The expand/collapse chevron sits outside the swappable section and
  a collapsed rail stays clean (the highlighted Chat row already opens a
  new chat). Active conversation travels via a tiny store (lib/chat-active)
  so the sidebar needs no useSearchParams and pages stay static.
- Header (phones): history, theme and New chat are now identical chips -
  same 44px hit area, rounded-2xl, border/surface tokens, size-5 icons,
  even spacing; the title block truncates cleanly. ThemeToggle gained a
  'plain' variant so the header styles it without touching other pages.
- ChatIcon redrawn (clean message-circle, no inner lines) and the empty
  state uses the app's icon-chip pattern (size-12 chip, accent-600/200)
  instead of the bare oversized glyph; the model chip icon follows.
- Also fixed a pre-existing dev-only breakage found while verifying: the
  tab-bar bounce animated three keyframes with a spring, which framer
  motion's dev build throws on - breaking client updates in the dev
  instance (library tab switching, sheet Escape). It now uses a tween.
- Dev metadata keeps the Apple icons in both branches.
- SW -> freezmo-v35.
This commit is contained in:
Martin Dvořák 2026-10-11 20:11:11 +00:00
commit 8a3bef0add
9 changed files with 192 additions and 75 deletions

View file

@ -36,18 +36,16 @@ export const metadata: Metadata = {
{ url: "/icons/splash-1668x2388.png", media: "(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2)" },
],
},
icons: IS_DEV_INSTANCE
? {
// Dev wears its own favicon so the two instances are never confused.
icon: [{ url: "/icons/dev-favicon.svg", type: "image/svg+xml" }],
}
: {
icon: [
// ?v=2 busts browser favicon caches after the icon redesign.
{ url: "/icons/favicon-32.png?v=2", sizes: "32x32", type: "image/png" },
{ url: "/icons/icon-192.png?v=2", sizes: "192x192", type: "image/png" },
{ url: "/icons/icon-512.png?v=2", sizes: "512x512", type: "image/png" },
],
icons: {
icon: IS_DEV_INSTANCE
? // Dev wears its own favicon so the two instances are never confused.
[{ url: "/icons/dev-favicon.svg", type: "image/svg+xml" }]
: [
// ?v=2 busts browser favicon caches after the icon redesign.
{ url: "/icons/favicon-32.png?v=2", sizes: "32x32", type: "image/png" },
{ url: "/icons/icon-192.png?v=2", sizes: "192x192", type: "image/png" },
{ url: "/icons/icon-512.png?v=2", sizes: "512x512", type: "image/png" },
],
apple: [
{ url: "/icons/apple-touch-icon.png?v=2", sizes: "180x180" },
{ url: "/icons/apple-touch-icon-167.png?v=2", sizes: "167x167" },