diff --git a/.github/labels.yml b/.github/labels.yml index 07acb8f..bbbc305 100644 --- a/.github/labels.yml +++ b/.github/labels.yml @@ -109,4 +109,4 @@ - name: 'size: XL' color: 'FAEAEA' - description: 'Diff 500+ lines — consider splitting' \ No newline at end of file + description: 'Diff 500+ lines — consider splitting' diff --git a/CHANGELOG.md b/CHANGELOG.md index b807e08..d10c511 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,52 +5,69 @@ All notable changes to Attyre will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Current Version [v2026.04.26] - 2026-04-26 *(automated fixes by Claude Code)* +## Current Version [v2026.05.11] -### Fixed (v2026.04.26) +### Fixed -- **Category validation error now visible**: `add-item` and `item-detail` forms were missing the `category-error` element, so the "Category is required" message was silently swallowed — error paragraph now rendered correctly under the category select. -- **Crop button re-usable after first crop**: After applying a crop in the add-item form, the replacement preview button had no event listener attached, making subsequent crops impossible — listener is now re-wired via a recursive helper after each crop. -- **localStorage quota errors surfaced**: `saveItems` was catching `QuotaExceededError` silently; it now re-throws so callers can alert the user when storage is full. +- **Mobile app shell invisible on older phones**: `.app-shell` used `height: 100dvh` with no fallback — `dvh` is unsupported on iOS < 16 and Chrome < 108, causing the shell to collapse to zero height and render nothing. Added `height: 100vh` fallback immediately before the `dvh` line. +- **Initial page never renders on slow mobile connections**: `app.js` registered a `DOMContentLoaded` listener unconditionally, but ES modules are fetched asynchronously — on real phones the event can fire before the module loads, leaving `#app` permanently empty. Now guards with a `document.readyState` check so `renderPage()` always runs. +- **PWA `start_url` mismatch on iOS**: `manifest.json` had `"start_url": "/"` while the app uses hash routing — launching from the iOS home screen landed on a bare static file. Changed to `"/index.html#/"`. -### Changed (v2026.04.26) +### Added -- **PWA manifest colours corrected**: `theme_color` was a leftover placeholder purple (`#6C63FF`) — updated to the app's actual gold (`#C9A96E`); `background_color` updated to match light-mode page background (`#F5F0E8`); placeholder screenshot SVGs updated to match; `start_url` corrected from `/index.html` to `/`. +- **Skip-to-content link**: Keyboard/switch-access users can now press Tab on any page to reveal a "Skip to main content" link that jumps focus directly to the `#app` region. +- **Global `:focus-visible` ring**: All interactive elements (buttons, links, item cards, calendar days) now show a visible gold focus outline when navigated by keyboard. Accessibility mode uses a thicker blue outline. +- **`prefers-reduced-motion` support**: All CSS transitions and animations are suppressed when the OS "Reduce Motion" setting is enabled. +- **Screen reader page announcements**: A hidden `aria-live` region announces the page title on every navigation and announces when accessibility mode is toggled on/off. +- **Wardrobe filter result announcements**: Screen readers are told how many items match the current filters (or "No items match your filters") whenever filters change. +- **Calendar date announcements**: Selecting a calendar day announces the date and whether an outfit is planned for that day. +- **Calendar keyboard navigation**: Calendar day cells now have `tabindex="0"` and respond to Enter/Space for selection, plus full ARIA grid semantics (`role="grid"`, `role="gridcell"`, `aria-selected`). +- **Item cards are focusable buttons**: Item cards changed from `
` to `
diff --git a/README.md b/README.md index 424a803..cc8055e 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # Attyre -[![Version](https://img.shields.io/badge/version-2026.04.26-C9A96E)](CHANGELOG.md) -[![License: GPL v3](https://img.shields.io/badge/license-GPLv3-blue.svg)](LICENSE) +[![Version](https://img.shields.io/badge/version-2026.05.11-C9A96E)](CHANGELOG.md) +[![License: AGPL v3](https://img.shields.io/badge/license-AGPLv3-blue.svg)](LICENSE) [![Privacy Policy](https://img.shields.io/badge/privacy-policy-16a34a)](Privacy-Policy.html) Smart wardrobe manager with weather-based suggestions, planning tools, and local-first privacy. -Current app version: 2026.04.26 +Current app version: 2026.05.11 ## What Attyre Does @@ -73,8 +73,13 @@ Current app version: 2026.04.26 ### Accessibility and Theming - Dark mode toggle. -- Accessibility mode toggle with safe high-contrast palette and icon support. -- Accessibility mode also switches favicon variant. +- Accessibility mode toggle with safe high-contrast blue palette, larger font, stronger borders, thicker nav icon strokes, and colorblind-friendly favicon variant. +- Skip-to-content link visible on keyboard focus. +- Global focus ring on all interactive elements; thicker in accessibility mode. +- `prefers-reduced-motion` support: all transitions and animations are suppressed when the OS setting is enabled. +- Screen reader announcements via hidden `aria-live` region for page navigation, filter results, and calendar date selection. +- Item cards are `