eutopic/model-tests/02-flutter-folder-structure.md

133 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

tests: instruction-following, feature-first structure, domain accuracy
context: DESIGN.md excerpt (screens + navigation)
version: 2
---
you are helping design the frontend of eutopic — a photo-first social app for small, invite-only communities. it runs on flutter (dart). it has five main screens: home feed, posters (bulletin board), compose (center tab), stories, and profile. it also has secondary screens for onboarding, settings, and feedback. here's specs:
---
## navigation
five-slot bottom tab bar for screens:
```
⒣ home | ⇶ posters | ◲ compose | ❣ stories | ☺ profile
```
- **home** — chronological feed
- **posters** — bulletin board (`/posters`, `is_event` posts + informational posts + fundraisers)
- **compose** — center slot, filled/distinct treatment. opens compose flow (modal or full screen — TBD)
- **stories** — dedicated tab, not a top strip. intentional destination, not ambient anxiety ring.
- **profile** — own profile. viewing others' profiles navigates within the app but doesn't change the active tab.
stories as a bottom tab (vs instagram-style top strip) is a deliberate choice: it frames stories as something you visit, not something that nags you to check.
---
## screens
### onboarding (unauthenticated)
```
invite gate
└── invite code prefilled from deep link, or entered manually
email + username entry
magic link sent / confirm screen
social handle opt-in
└── signal / telegram / custom. skippable. "re-enable anytime in settings."
follow suggestions
└── friends-of-inviter auto-suggested. skippable.
```
zero technology decisions for the user. no server picker. no handle explanation. no fediverse vocabulary.
---
### feed (`/`)
- chronological. no algorithm. no ranked content.
- posts with 110 photos (swipeable within the post card).
- reactions inline below each post.
- comments accessible via tap (flat, chronological thread).
- **survey card** injected at slot 1 when an active survey exists. GIF cover. taps to `/feedback`. disappears per-user once responded. not a real post.
- no unread indicators. no "new posts" banner. pull to refresh is fine.
---
### posters (`/posters`)
formerly "bulletin board". renamed because the scope is broader than events:
**post types** (single tag, required, choose one):
- `event` — dated gathering, auto-archives 1 day after `event_ends_at`
- `fundraiser` — community fundraising
- `current affairs` — informational, reading, things worth knowing
layout: 2-column grid (`FlatList numColumns={2}`), infinite scroll, paginated fetch.
filtering by tag: TBD (tab strip or dropdown above grid).
reactions on poster posts: visible to post author only. no public counts. no hierarchy.
RSVP interaction model: open question, not designed yet. see OPEN-QUESTIONS.md.
---
### compose (◲)
- triggered from center nav slot.
- photo picker first (up to 10 photos).
- caption optional.
- toggle: post to feed or post to posters. if posters: tag picker (single tag required) + event fields if `event`.
- toggle: saveable on/off (default off).
- toggle: reaction set — choose up to 5 emoji, or leave open (open picker only).
- upload starts in background immediately on confirm. progress shown via hand-drawn animation. bad wifi handled invisibly via tus.io resumable upload.
- no drafts, no scheduling, no queue UI.
---
### stories (❣)
- dedicated tab, not a top strip.
- 10s auto-advance per story.
- filters via swipe gesture (basic, applied at view time or capture time — TBD).
- no replies. "witnessed" metadata only: private per-viewer row, expires with story (24h).
- story author can see flat witness list (like instagram). no public count.
- story creation: camera or photo picker, then post. no drafts.
---
### profile (☺)
**own profile:**
- avatar, display name, username, bio.
- social handles (signal / telegram / custom) — shown based on `display_social_handle` setting: none / mutuals / all.
- `contact_prefs` free text ("bad texter", "weekends only").
- own posts grid.
- settings access.
**others' profiles:**
- same view, minus settings. follow/unfollow action.
- social handles visible per their `display_social_handle` setting.
---
### feedback (`/feedback`)
- always accessible (settings link or survey card tap).
- active survey renders at top if one exists (multiple choice, 36h expiry).
- permanent free text field below, always present regardless of active survey.
- no results shown to users. dev use only.
---
eutopic has no notifications, no DMs (chat), and no push alerts. do not include any notification-related files or widgets.
use feature-first structure. example:
lib/features/feed/feed_screen.dart
lib/features/feed/widgets/post_card.dart
lib/shared/models/user.dart
draw an ASCII tree diagram of the flutter frontend folder and file structure. include lib/ as the root. show actual filenames (*.dart), not just folder names.