ReelShield / docs /wireframes /wireframes.md
abigailkeegan's picture
Deploy ReelShield to Hugging Face Space
8af1084
|
Raw
History Blame Contribute Delete
31.8 kB

ReelShield β€” Wireframes & Design Documentation

High-fidelity mockups: every numbered screen below has a matching standalone HTML render under mockups/ β€” open any of those files in a browser for a production-quality view of the same screen described here. The ASCII below conveys structural intent; the HTML conveys finished fidelity.

Screen 1: Home / Search

Mockup: mockups/01-home.html

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  [Skip to content]                                 β”‚
β”‚                                                    β”‚
β”‚                  🎬 ReelShield                     β”‚
β”‚         AI-powered analysis β€” Gemini + TMDB    [βš™] β”‚
β”‚                                                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ Search for a movie                           β”‚  β”‚
β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚  β”‚
β”‚  β”‚ β”‚  e.g. Interstellar, The Dark Knight...   β”‚ β”‚  β”‚
β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚  β”‚
β”‚  β”‚  3 results found                             β”‚  β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”                 β”‚  β”‚
β”‚  β”‚  β”‚posterβ”‚ β”‚posterβ”‚ β”‚posterβ”‚                 β”‚  β”‚
β”‚  β”‚  β”‚      β”‚ β”‚      β”‚ β”‚      β”‚                 β”‚  β”‚
β”‚  β”‚  β”‚Title β”‚ β”‚Title β”‚ β”‚Title β”‚                 β”‚  β”‚
β”‚  β”‚  β”‚ 1997 β”‚ β”‚ 2023 β”‚ β”‚ 2018 β”‚                 β”‚  β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜                 β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                    β”‚
β”‚        β—‹ Generating content warnings...            β”‚
β”‚                                                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Design decisions:

  • Search is full-width and immediately visible β€” primary action
  • Poster grid for results: visual recognition faster than text lists
  • Spinner with status messages prevents perceived abandonment during AI call
  • βš™ button top-right: discoverable but not distracting for primary users

Screen 2: Movie Loaded (Desktop β€” 2-column)

Mockup: mockups/02-movie-loaded.html

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ ⚠️ PHOTOSENSITIVE EPILEPSY WARNING                           β”‚
β”‚ This film contains flashing lights... [specific notes]       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 🚫 Content Warnings      β”‚  β”‚ πŸ’¬ Ask Questions               β”‚
β”‚                          β”‚  β”‚                                β”‚
β”‚ Titanic (1997)           β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚ [PG-13] [⚠️ Predicts     β”‚  β”‚ β”‚ Ask me anything about    β”‚   β”‚
β”‚  R/NC-17 Β· 87%]          β”‚  β”‚ β”‚ this film.               β”‚   β”‚
β”‚ [194 min] [Drama]        β”‚  β”‚                            β”‚   β”‚
β”‚                          β”‚  β”‚    [You: Who is Rose?]     β”‚   β”‚
β”‚ Our ML classifier        β”‚  β”‚                            β”‚   β”‚
β”‚ estimates this film's    β”‚  β”‚  [AI: Rose is a young...]  β”‚   β”‚
β”‚ profile better matches   β”‚  β”‚                            β”‚   β”‚
β”‚ R/NC-17 than its PG-13   β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚ rating.                  β”‚  β”‚                              β”‚   β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” [Send] β”‚   β”‚
β”‚ β”‚ Overview blurb text  β”‚ β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚   β”‚
β”‚ β”‚ from TMDB...         β”‚ β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                          β”‚
β”‚ Spoiler mode: Off  [β—‹]   β”‚
β”‚                          β”‚
β”‚ ⚠️ Flashing Lights  Mild β”‚
β”‚    βœ“ Confirmed           β”‚
β”‚    Brief flashing...     β”‚
β”‚                          β”‚
β”‚ Violence & Gore  Moderateβ”‚
β”‚    βœ“ Confirmed           β”‚
β”‚    Drowning, injuries... β”‚
β”‚                          β”‚
β”‚ Sexual Content  Moderate β”‚
β”‚    βœ“ Confirmed           β”‚
β”‚                          β”‚
β”‚ Language  Mild           β”‚
β”‚    βœ“ Confirmed           β”‚
β”‚                          β”‚
β”‚ Self-Harm  None          β”‚
β”‚    βœ“ Confirmed absent    β”‚
β”‚                          β”‚
β”‚ 🎬 Content twins         β”‚
β”‚   (Adult drama cluster)  β”‚
β”‚  β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”    β”‚
β”‚  β”‚ B  β”‚ β”‚ C  β”‚ β”‚ D  β”‚    β”‚
β”‚  β”‚Ξ”.42β”‚ β”‚Ξ”.51β”‚ β”‚Ξ”.63β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Design decisions:

  • Epilepsy banner always renders above everything else β€” critical safety info
  • 2-column layout: warnings left, chat right β€” parallel use without scrolling
  • Warnings sorted by severity descending (most severe first)
  • Color-coded left border: red=severe, orange=moderate, green=mild, grey=none
  • βœ“ Confirmed in green builds trust; ~% in grey signals uncertainty
  • Spoiler toggle above warnings: visible but default off
  • MPA-disagreement badge sits next to the TMDB cert badge in amber when the LR classifier disagrees β‰₯70% confident; rendered in the same row as the cert so the comparison is the headline, not a footnote
  • Content twins (K-Means neighbors) render below warnings as a small grid; Ξ” = Euclidean distance in 9-dim severity space, so smaller Ξ” = closer content-profile match

Screen 3: Mobile (Single Column)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 🎬 ReelShield           β”‚
β”‚                      [βš™]β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ ⚠️ EPILEPSY WARNING      β”‚
β”‚ Brief flashing lights   β”‚
β”‚ during sinking sequence β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Search for a movie      β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ e.g. Titanic...     β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 🚫 Content Warnings     β”‚
β”‚ Titanic (1997)          β”‚
β”‚ [PG-13][194 min][Drama] β”‚
β”‚ Overview blurb...       β”‚
β”‚                         β”‚
β”‚ ⚠️ Flashing Lights Mild  β”‚
β”‚   βœ“ Confirmed           β”‚
β”‚                         β”‚
β”‚ Violence & Gore Moderateβ”‚
β”‚   βœ“ Confirmed           β”‚
β”‚ ...                     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ πŸ’¬ Ask Questions        β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Chat history...     β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”[Send] β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Responsive behavior: At <768px, columns stack. Epilepsy banner stays pinned to top. Chat moves below warnings.


Screen 4: Prompt Editor Modal

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  ✏️ Edit AI Prompt                                    β”‚
β”‚                                                      β”‚
β”‚  Customize how Gemini generates content warnings.    β”‚
β”‚  Required placeholders: {title} {year} {rating}      β”‚
β”‚  {genres} {overview} {keywords}                      β”‚
β”‚                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ You are a film content expert...               β”‚  β”‚
β”‚  β”‚                                                β”‚  β”‚
β”‚  β”‚ Movie: "{title}" ({year})                      β”‚  β”‚
β”‚  β”‚ MPA Rating: {rating}                           β”‚  β”‚
β”‚  β”‚ ...                                            β”‚  β”‚
β”‚  β”‚ Return ONLY valid JSON...                      β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                      β”‚
β”‚  [Save Prompt]  [Reset to Default]  [Cancel]         β”‚
β”‚                                                      β”‚
β”‚  βœ“ Prompt updated. New searches will use this.       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Screen 5: Find Movies (Discover)

Mockup: mockups/03-discover.html

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Find Movies                                                          β”‚
β”‚  Choose your mood and the warnings you want to avoid β€” we'll find     β”‚
β”‚  the best matches from our movie cache.                               β”‚
β”‚                                                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  How are you feeling? (optional) β”‚  β”‚  Warnings to avoid     β”‚   β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚  (pick up to 3)        β”‚   β”‚
β”‚  β”‚  [ Light and easy            ]   β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€   β”‚
β”‚  β”‚  [ Some emotion, nothing heavy]  β”‚  β”‚  ☐ Violence & Gore     β”‚   β”‚
β”‚  β”‚  [ Can handle intense        ]   β”‚  β”‚  ☐ Self-Harm & Suicide β”‚   β”‚
β”‚  β”‚  [ Feel something deep       ]   β”‚  β”‚  ☐ Miscarriage         β”‚   β”‚
β”‚  β”‚  [ Comfort and familiarity   ]   β”‚  β”‚  ☐ Sexual Content      β”‚   β”‚
β”‚  β”‚  (one selected = highlighted;    β”‚  β”‚  ☐ Animal Abuse        β”‚   β”‚
β”‚  β”‚   click again to deselect)       β”‚  β”‚  ☐ Substance Use       β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  ☐ Language            β”‚   β”‚
β”‚                                        β”‚  ☐ Horror / Intensity  β”‚   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚  ☐ Flashing Lights     β”‚   β”‚
β”‚  β”‚ πŸ’­ You're feeling X β€” we'll      β”‚  β”‚  β“˜ "Pick up to 3"      β”‚   β”‚
β”‚  β”‚    look for Y                    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚  β”‚ Tones that fit:  [whimsical]…    β”‚                               β”‚
β”‚  β”‚ Tones to skip:   [grim]…         β”‚                               β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                               β”‚
β”‚                                                                       β”‚
β”‚  [ Find Movies ]                                                      β”‚
β”‚                                                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”                       β”‚
β”‚  β”‚ Safe β”‚ β”‚ Safe β”‚ β”‚ Safe β”‚ β”‚ Safe β”‚ β”‚ Safe β”‚   ← color-coded badge β”‚
β”‚  β”‚ 100  β”‚ β”‚  92  β”‚ β”‚  88  β”‚ β”‚  80  β”‚ β”‚  72  β”‚   per match quality   β”‚
β”‚  β”‚posterβ”‚ β”‚posterβ”‚ β”‚posterβ”‚ β”‚posterβ”‚ β”‚posterβ”‚                       β”‚
β”‚  β”‚Title β”‚ β”‚Title β”‚ β”‚Title β”‚ β”‚Title β”‚ β”‚Title β”‚                       β”‚
β”‚  β”‚ Mood β”‚ β”‚ Mood β”‚ β”‚ Mood β”‚ β”‚ Mood β”‚ β”‚ Mood β”‚   ← mood fit %        β”‚
β”‚  β”‚  …   β”‚ β”‚  …   β”‚ β”‚  …   β”‚ β”‚  …   β”‚ β”‚  …   β”‚                       β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜                       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Design decisions:

  • Two-column layout puts emotional state and content rules side-by-side β€” neither is more important
  • Mood is optional; warnings-to-avoid is the load-bearing filter
  • Cap of 3 avoid categories is a soft constraint announced via aria-live, not a disabled checkbox β€” keeps the UI accessible
  • Live mood-profile box updates as the user picks moods, so they understand what's about to be searched
  • Results are scored 0–100 (safer = higher) with mood-fit shown separately

Screen 6: Group Watch Finder

Mockup: mockups/04-group-watch.html

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  πŸ‘₯ Group Watch Finder                                                 β”‚
β”‚  Add everyone in your group, merge their sensitivities, and find       β”‚
β”‚  movies safe for all.                                                  β”‚
β”‚                                                                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚  Group Members                  β”‚  β”‚  Group Profile              β”‚ β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚
β”‚  β”‚  β€’ Sarah  βœ•                     β”‚  β”‚  This group needs movies    β”‚ β”‚
β”‚  β”‚    Violence, Animal abuse       β”‚  β”‚  free of violence, animal   β”‚ β”‚
β”‚  β”‚  β€’ Leo  βœ•                       β”‚  β”‚  abuse, and miscarriage.    β”‚ β”‚
β”‚  β”‚    Miscarriage, Self-harm       β”‚  β”‚                             β”‚ β”‚
β”‚  β”‚                                 β”‚  β”‚  All sensitivities:         β”‚ β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚  β”‚  [Violence] [Animal abuse]  β”‚ β”‚
β”‚  β”‚  β”‚ Member name…              β”‚  β”‚  β”‚  [Miscarriage] [Self-harm]  β”‚ β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  β”‚                             β”‚ β”‚
β”‚  β”‚  Their sensitivities:           β”‚  β”‚  Avoid genres:              β”‚ β”‚
β”‚  β”‚  ☐ Violence  ☐ Self-Harm        β”‚  β”‚  [Horror] [War]             β”‚ β”‚
β”‚  β”‚  ☐ Animal    ☐ Sexual           β”‚  β”‚                             β”‚ β”‚
β”‚  β”‚  ☐ Substance ☐ Language         β”‚  β”‚  Suggested genres:          β”‚ β”‚
β”‚  β”‚  ☐ Horror    ☐ Flashing         β”‚  β”‚  [Family] [Comedy] [Animation] β”‚
β”‚  β”‚  ☐ Miscarriage                  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚  β”‚  [+ Add Member]                 β”‚                                  β”‚
β”‚  β”‚                                 β”‚  Find Movies                     β”‚
β”‚  β”‚  [βš™ Merge Profiles]             β”‚  Mood: [Any mood       β–Ό]        β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  Platform (optional): [____]     β”‚
β”‚                                                                        β”‚
β”‚                                       [ Find Movies ]                  β”‚
β”‚                                                                        β”‚
β”‚  3 movie(s) safe for everyone in the group:                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                   β”‚
β”‚  β”‚  100/100     β”‚ β”‚   95/100     β”‚ β”‚   88/100     β”‚                   β”‚
β”‚  β”‚  poster      β”‚ β”‚   poster     β”‚ β”‚   poster     β”‚                   β”‚
β”‚  β”‚  Title       β”‚ β”‚   Title      β”‚ β”‚   Title      β”‚                   β”‚
β”‚  β”‚  Why safe…   β”‚ β”‚   Why safe…  β”‚ β”‚   Why safe…  β”‚                   β”‚
β”‚  β”‚  One concern β”‚ β”‚  One concern β”‚ β”‚  One concern β”‚                   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Design decisions:

  • Member-builder on the left, profile-and-results on the right β€” read left-to-right
  • Merge button stays disabled until β‰₯1 member is added (prevents empty-state confusion)
  • Privacy: rejection messages refer to "the group", never name the individual member who triggered them
  • Each result card includes both why_safe and one_concern so the group can debate trade-offs

Screen 7: My Watchlist

Mockup: mockups/05-watchlist.html

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  πŸ“‹ My Watchlist                                                       β”‚
β”‚  Movies are ranked safest-to-most-triggering based on your             β”‚
β”‚  sensitivity profile.                                                  β”‚
β”‚                                                                        β”‚
β”‚  [ ⭐ Rank by My Sensitivities ]                                       β”‚
β”‚                                                                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  β”‚
β”‚  β”‚ β‘  βœ•      β”‚ β”‚ β‘‘ βœ•      β”‚ β”‚ β‘’ βœ•      β”‚ β”‚ β‘£ βœ•      β”‚                  β”‚
β”‚  β”‚  poster  β”‚ β”‚  poster  β”‚ β”‚  poster  β”‚ β”‚  poster  β”‚                  β”‚
β”‚  β”‚  Title   β”‚ β”‚  Title   β”‚ β”‚  Title   β”‚ β”‚  Title   β”‚                  β”‚
β”‚  β”‚  1997    β”‚ β”‚  2019    β”‚ β”‚  2023    β”‚ β”‚  2017    β”‚                  β”‚
β”‚  β”‚ 🟒 Safe  β”‚ β”‚πŸŸ‘ Mild   β”‚ β”‚πŸŸ‘ Mild   β”‚ β”‚πŸ”΄ Strong β”‚                  β”‚
β”‚  β”‚ No trig… β”‚ β”‚Brief…    β”‚ β”‚Some…     β”‚ β”‚Heavy…    β”‚                  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  β”‚
β”‚                                                                        β”‚
β”‚  (Rank β‘  in top-left, βœ• in top-right to remove)                       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Design decisions:

  • Rank badge (top-left) is the headline β€” at a glance the user sees what's safest tonight
  • Color-coded watchlist badge (🟒 / 🟑 / πŸ”΄) mirrors the severity scale used on the warning cards
  • Remove (βœ•) is one click but lives in the top-right corner so it isn't fat-fingered while scanning
  • Re-ranking is explicit, not automatic β€” running Gemini on the whole list is costly, so the user opts in

Screen 8: Reviews & Ratings (inline on movie page)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  ⭐ Reviews & Ratings                                                 β”‚
β”‚                                                                       β”‚
β”‚  From critics & aggregators:                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                          β”‚
β”‚  β”‚ IMDb   β”‚  β”‚ Rotten      β”‚  β”‚ Metacritic β”‚                          β”‚
β”‚  β”‚ 7.8/10 β”‚  β”‚ Tomatoes 89%β”‚  β”‚ 74/100     β”‚                          β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                          β”‚
β”‚  ─────────────────────────────────────────────────────────────────    β”‚
β”‚                                                                       β”‚
β”‚  Critic Reviews                                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ A. Critic β€” "An absorbing, careful film…"                       β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚  ─────────────────────────────────────────────────────────────────    β”‚
β”‚                                                                       β”‚
β”‚  User Reviews                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ Your rating                                                     β”‚   β”‚
β”‚  β”‚ β˜… β˜… β˜… β˜… β˜†                                                       β”‚   β”‚
β”‚  β”‚ Your review                                                     β”‚   β”‚
β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚   β”‚
β”‚  β”‚ β”‚ Share your thoughts...                                      β”‚ β”‚   β”‚
β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚   β”‚
β”‚  β”‚ [ Post Review ]                                                 β”‚   β”‚
β”‚  β”‚ (or: "Log in to post a review." if not authenticated)           β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ @maria Β· β˜…β˜…β˜…β˜…β˜… Β· 2 days ago                                    β”‚   β”‚
β”‚  β”‚ Watched with my kids and felt prepared for every scene…         β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ @jordan Β· β˜…β˜…β˜…β˜†β˜† Β· 1 week ago                                   β”‚   β”‚
β”‚  β”‚ Flashing-lights warning was spot-on, missed a couple of cuts…   β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Design decisions:

  • Three trust layers stacked: external aggregators β†’ critic reviews β†’ user reviews β€” heaviest signal at top
  • Star widget is keyboard-accessible (each star is a button with aria-label)
  • Login gate is in-place: an inline note replaces the form, so the user isn't surprised by a redirect
  • User reviews show username + star rating + relative timestamp β€” matches conventions users already know

Screen 9: Sensitivity Profile Editor (Modal)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  πŸ›‘οΈ My Sensitivity Profile                            β”‚
β”‚                                                       β”‚
β”‚  Select the content categories you want to be warned β”‚
β”‚  about. This personalizes your watchlist ranking     β”‚
β”‚  and badges.                                          β”‚
β”‚                                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚ β˜‘ Violence & Gore   β”‚  β”‚ ☐ Substance Use     β”‚    β”‚
β”‚  β”‚ β˜‘ Self-Harm/Suicide β”‚  β”‚ ☐ Language          β”‚    β”‚
β”‚  β”‚ ☐ Miscarriage       β”‚  β”‚ β˜‘ Horror / Intensityβ”‚    β”‚
β”‚  β”‚ ☐ Sexual Content    β”‚  β”‚ β˜‘ Flashing Lights   β”‚    β”‚
β”‚  β”‚ ☐ Animal Abuse      β”‚  β”‚                     β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                       β”‚
β”‚  [ Save Profile ]   [ Cancel ]                        β”‚
β”‚                                                       β”‚
β”‚  βœ“ Profile saved.                                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Design decisions:

  • Modal carries role="dialog" and aria-modal="true" β€” screen readers announce it as an interrupting layer
  • Two-column grid keeps all 9 categories on one screen without scrolling on desktop
  • "Save" is the primary button (filled), "Cancel" is the ghost button β€” visual weight matches intent
  • Saved state announced via aria-live="polite" so assistive tech users get confirmation without focus shift

Style Guide

Colors

Token Hex Usage
--bg #0f1117 Page background
--surf #1a1d27 Card/panel surface
--surf2 #242736 Input fields, nested surfaces
--bdr #2e3347 Borders
--text #e8eaf0 Primary text
--muted #8891a8 Secondary text, labels
--accent #6c8eff Primary interactive elements
--mild #4caf50 Mild severity, confirmed absent
--moderate #ff9800 Moderate severity
--severe #f44336 Severe severity
--epi-bdr #ff2222 Epilepsy banner border

Typography

  • Font: 'Segoe UI', system-ui, sans-serif
  • Heading: 800 weight
  • Body: 400 weight, 1.6 line-height
  • Code/prompt: 'Courier New', monospace

Spacing

  • Base unit: 8px
  • Card padding: 24px
  • Gap between cards: 20px
  • Border radius: 8-12px

Accessibility Rationale

  • Dark theme chosen: reduces eye strain for photosensitive users (Persona 2)
  • 3px focus outlines: clearly visible on dark backgrounds
  • aria-live="polite" on search results and warnings: non-disruptive announcements
  • role="alert" on epilepsy banner: immediate announcement, highest priority
  • Color contrast targets WCAG AA (4.5:1 normal text, 3:1 UI components)

Audit evidence

A Lighthouse accessibility audit run against the live container on 2026-05-15 scores 100 / 100 β€” all 26 audits pass, zero element findings. The full report (raw JSON + HTML + a remediation-history README documenting the four fixes that took the page from an initial 89/100 to 100/100) is committed under accessibility/ so the run is reproducible.