# moalier screen atlas — 2026-10-28

Open `index.html`, then choose the mobile or tablet map. The HTML maps work
offline from this folder. Keep the image subfolders beside the HTML files.
`mobile-map.png` and `tablet-map.png` are static, full-resolution overviews.

## Reading the map

- Left capture: populated data, or a filled form.
- Right capture: empty data, or a blank form.
- Guest authentication is a separate screen/state, not an empty library.
- A missing detail is explicitly labeled; it is not the same as an empty list.
- A missing counterpart means that route requires existing data, or there is no
  separate UI for that combination. No empty page was invented.
- Lines group screens into areas. The path above each capture identifies the
  entry relationship; the taxonomy does not assert every group is a tab.
- Search, zoom, fit, section navigation, drag to pan, and original-image dialogs
  are available in the HTML maps.

## Capture method

These are PNG captures of the actual checked-out Flutter widgets, not design
mockups, and not screenshots of a whole Android emulator. The existing app shell
and feature screens are used. Providers are overridden with isolated sample
data; SQLite is in memory. No real account, device library, server content,
purchase, or credential is changed.

| Variant | Logical viewport | Theme | Locale |
| --- | --- | --- | --- |
| Mobile | 412 × 915 | Light | Korean |
| Tablet | 1280 × 800, landscape | Light | Korean |

Korean glyphs are loaded from Windows Malgun Gothic in the Flutter test renderer;
system fonts and text rasterization may differ on an Android device. Tabler's
actual icon font is loaded. The background photo is an existing public moalier
catalog entry by Nadin Nandin on Pexels, stored locally for deterministic capture;
its credit remains in the app UI. No image was generated. Network thumbnails
without a fixture use the app's actual fallback UI.

## Included

- Home, recent links, local/public/no-match search.
- Bookmarks and available favorites, collection list/detail, populated and empty
  folder contents, folder input/picker, bookmark editing and
  available action sheets.
- Curation home, available topic views, reading page, lower links, curator profile.
- Inbox reading list, updates, guest update gate.
- Account and device settings, lower settings and app information, backgrounds,
  account security and sessions, password dialog, feedback, deletion confirmation,
  email sign-in form, Android Pro page, guest account card.
- Phone's published curation list.
- Tablet's curator posts, series and series editor, link-page editor,
  curation composer and its available next step.
- Manual link entry, new-save confirmation and duplicate-save confirmation.

## Boundaries

The atlas covers the app-owned screens and representative sheets listed in the
manifests. It is not an exhaustive capture of every scroll offset, validation
message, destructive confirmation, loading spinner, network error, plan, locale,
theme, orientation, or responsive breakpoint.

Android/iOS share targets, launchers, widgets, Spotlight, Safari extension,
notification permission sheets, OAuth browsers, native Apple sign-in, store
checkout, and external web pages require their native environments and are not
included. The app screenshots exclude Android status/navigation bars and the
system keyboard. Authentication, billing, publish, feedback submission, and
account deletion were not executed. Fixture-populated server screens demonstrate
implemented UI, not the availability of a live API.

`collection-detail` in the empty scenario is the app's missing-collection UI.
The blank bookmark editor is mounted directly for field comparison and is not a
new-link route. Share confirmation in the empty scenario is captured after saving
one sample link into that scenario's isolated database. Settings/Pro and guest
screens may legitimately have identical content in both columns.

## Regenerate

From the repository root, on Windows with the pinned Flutter SDK:

```powershell
flutter test test/app/screen_map_capture_test.dart --update-goldens --reporter expanded
node tool/build_screen_map.mjs
powershell -NoProfile -ExecutionPolicy Bypass -File tool/render_screen_map.ps1
```

The capture suite is opt-in: an ordinary `flutter test` skips it. Its fixture
photo lives at `output/screen-map/fixtures/scene.jpg`. Per-scenario JSON files and
the device manifests are the source of truth for the captures actually produced.
