Discovery UI
The website and app use green and cream, dark green primary text, and restrained
borders. Website semantic tokens live in assets/css/style.css; native equivalents
live in the app theme. Token changes require a side-by-side review of home,
navigation, cards, and details in EN/PT. Green-dark #1a3a2a, cream #f7f9f4, text
#1a2e1a, muted text #557555, borders #c8dcc8, radius 12 px, spacing 12 px.
Titles identify the event; attendance dates/time, venue, and published price follow. Descriptions, complete addresses, source, map, booking, reporting, and sharing live in details. Event cards work without artwork. Controls have a 44 px minimum target, visible keyboard focus, text labels, and meaningful selected/expanded states. Content wraps at enlarged text sizes. Reduced motion disables animated transitions.
Website data states
The static website contains its dataset at publication. Event details do not fetch another dataset. Publication time is labelled as a site build time, not organizer verification. A filter with no matches offers reset/all dates. No published events provides weekly browsing. Missing IDs show unavailable, ended records show ended, and absent prices/times remain unknown. The website does not promise offline availability.
Accessibility verification checklist
Automated: Azores midnight/DST/device timezone date predicates; exact-ID uniqueness and preservation; combined facets; navigation and locale visibility; semantic controls. Manual required: EN/PT 390 px and desktop reflow, 200/400% zoom, keyboard navigation, visible wrapping navigation, details, suggestion dialog, image failures, VoiceOver. Native VoiceOver/TalkBack and enlarged system text require real platform runs. A component test does not establish WCAG conformance.
Measured website token contrast against cream #f7f9f4: primary text 13.67:1,
muted text 4.88:1, dark green 11.77:1 (sRGB relative-luminance calculation).
These measurements cover those token pairs, not every inherited badge or image.
Open verification/content items: curator locality coverage; permission-cleared artwork sample; canonical per-event social metadata (the static detail shell has page-level metadata); mobile screen-reader and zoom audits; offline website use. No native Android/iOS device is covered by the website tests.
Locality controls list only localities present in curated metadata and remain absent
when that metadata is unavailable. The live page filter delegates its full
predicate to EventDiscovery.matches; page-level tests cover facet conjunction,
accented search, locality, date/type URL round trips, locale links, and reset.
Detail DOM tests execute the actual renderer for EN/PT fields and share URLs.
Details embed the full published dataset, including ended records.
The uncompressed detail HTML measured 535,876 bytes on 12 October 2026. This allows exact ended-event details without another request;
per-event generated documents are a possible future payload improvement. A map
action requires map_url; source and booking actions also require published URLs.
Component inventory and synchronization
The machine-readable color inventory records every color custom property in the website CSS and each native theme color. Hardcoded component color literals are outside this check; reviewing their contrast requires component measurements. The palettes share green/cream intent while retaining distinct values: website dark green #1a3a2a, cream #f7f9f4, body #1a2e1a, muted #557555; native primary #2d5016, background #faf8f0, body #2c2c2c, muted/inactive #666666, card white. Native primary dark is #1a3009; it is not the website dark green token. Website display headings use Playfair Display and body uses Source Sans 3 with system fallbacks. Native typography uses the platform font with 12/14/16/18/22/28-point roles and system scaling.
| Component | Website | Native | Required state and sizing |
|---|---|---|---|
| Discovery heading/card | Name, attendance range/time, venue, published admission | Same field order; detail title spans card width | Long EN/PT text wraps; unknown time/admission remains explicit |
| Detail actions | Share and reporting buttons; source, booking, map and full-artwork links | Touchable actions; Save/reminder expose accessible selected/disabled state | At least 44 px/points; state is expressed with text/semantics as well as color |
| Search/input/select | Native HTML controls, visible global focus ring | Platform input/picker and text labels | Keyboard/system-text support; label remains associated with control |
| Facet/type selector | Checkboxes/selects with preserved query state | Selected facet uses border-colored background and accessibility state | Selected, reset and unavailable choices remain distinguishable |
| Navigation | Wrapping links and visible language control | Five tabs, two scalable label lines and safe-area space | Active location, every destination reachable; route and large-text checks remain platform-specific |
| Feedback | Status/error paragraph and available action | Polite status/result announcement and Retry | Loading, no matches, absent data and failure use distinct language |
| Poster | Contain sizing, full-size link, failure paragraph | Contain sizing and full-size link | Alt/provenance and failure policy require cross-platform checks; permission-cleared sample remains open |
Pressed feedback follows the browser/platform control. Website keyboard focus is a 3 px --focus outline with 3 px offset. Native touchables use their platform pressed feedback; there is no claim that every native control supplies a desktop keyboard focus treatment. Disabled actions retain an accessible disabled state and an explanation; native Saved/reminder read failure must not become a false unselected state. Loading feedback must not prevent usable cached content being read. Website reduced-motion overrides animations, transitions and smooth scrolling. Native navigation animations and reduced-motion behavior need an actual system-setting audit.
Run node scripts/check_discovery_tokens.mjs to check website token drift and the six declared body/action contrast pairs. Run node scripts/check_discovery_tokens.mjs /absolute/path/to/TerceiraEventsApp/src/utils/theme.js to check both source palettes. The optional source is deliberately explicit: CI checks website source and the documented native pairs, and does not fetch another repository at runtime. Run node --test scripts/tests/test_discovery_tokens.mjs to exercise drift and insufficient-contrast failures. The checker exports contrast(foreground, background) for six-digit sRGB WCAG ratios and checkTokens(manifest, css, nativeTheme) for inventory equality and minimum-contrast validation; the optional native source must be supplied explicitly. This is a synchronization check, not a visual regression or whole-product contrast audit. Token changes update the inventory and require side-by-side EN/PT home/navigation/card/detail screenshots, 320/390 px and desktop, plus Android/iOS enlarged-text checks. The checklist records the devices actually run.
State and copy inventory
Data-state inventory specifies the actual EN/PT feedback, recovery actions, timestamp meaning and unsupported states. It distinguishes the static website publication from native fetch/cache behavior. No new runtime dependency is needed for tokens or state documentation. Primary navigation lists Home, Weekly, Events, Venues, Blog, Contribute and Resources in both languages, followed by the language switch. The single row scrolls horizontally on narrow screens; links retain at least 44 px targets. Events exposes dated events and exhibitions through its in-page kind choice. Get the app is a footer link.
Tags and the optional More filters locality control use keyboard-accessible dropdowns. Tags combine all selected categories with AND; the closed label shows the selected topic, Free and Family, plus a count for additional topics. The locality control includes unknown localities under All places and explains that within the open menu. Escape closes a menu and returns focus to its summary. URL and locale links preserve selected filters; Reset appears when filters differ from the page defaults and restores those defaults. Open menus stay within the viewport after a selected label wraps or the window resizes.
Event cards show a date badge, exact-event title link, attendance or exhibition status, venue, and published address, summary, tags, organizer and features. Direct Maps, verified source and Suggest an edit actions have 44 px targets. Valid artwork uses an uncropped reserved frame; image failure keeps the information and actions readable.