Expand characters, add starter prompts, and refactor model/character selects (#17)
## Character Roster Expansion & Chat UX Improvements
### New Characters
Adds six new characters alongside expanded and renamed existing ones, bringing the total roster to nine. Each character now has a `description` field shown as a subtitle in the character selector:
- **Yuki** (formerly unnamed Kitsune) — sly, flirty fox girl
- **Momo** (formerly unnamed Neko) — bratty, needy cat girl
- **Hana** — bouncy, loyal puppy girl
- **Suzu** — soft, cuddly bunny girl
- **Natsuki** — sharp, flustered tsundere
- **Yuri** — shy, intense dandere
- **Sayori** — sunny, clingy deredere
- **Rei** — cool, quiet kuudere
- **Monika** — polished, teasing onee-san
Character prompts are now generated via a shared `buildPrompt` helper that enforces consistent rules and response style guidelines across all characters, replacing the previous ad-hoc prompt strings.
### Starter Prompts
Replaces the static fox girl image and attribution on the new chat screen with a grid of four randomly selected conversation starters. Selecting a starter pre-fills the chat composer input. A pool of 50 prompts is defined in `lib/prompts.ts` with a Fisher-Yates shuffle for random selection.
### Model List Updates
Adds `gpt-5.5` (now first in the list) and `gpt-5.4-nano`, and reorders `gpt-5.4-mini` after `gpt-5.4`.
### Component Refactors
- `CharacterSelect` and `ModelSelect` now accept their data as props rather than fetching it internally via hooks, making them easier to control from the parent `ChatForm`.
- `ChatComposer` and `ChatForm` accept optional controlled `text`/`onTextChange` props, enabling the starter prompt selection to pre-fill the input.
- A new `Grid` layout component is added with responsive column and gap variants.
- The initial character selection on a new chat is now randomized rather than always defaulting to the first character.
- The logo link in the sidebar header now points to `/chats` instead of `/`.
authored by