2647 Commits

Author SHA1 Message Date
alexsparkes
59ea0718be feat(background): add Mue photo stats, attribution links, and map fix
- Show views, downloads and hearts in the metadata grid (in line with
  other metadata items) instead of a separate stats widget
- Report downloads to the API when a Mue photo is downloaded
- Photographer name links to mue.photos/:handle; falls back to
  constructing the handle from the credit name for cached backgrounds
- Photo attribution now reads "on Mue" linking to mue.photos, matching
  the Unsplash pattern
- Fix hasCoordinates bug where null lat/lng resolved to 0 via Number()
  and incorrectly rendered an empty map

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 10:54:31 +01:00
alexsparkes
a1f232d482 refactor(Favourite, PhotoInformation, BackgroundOptions): update icon imports and improve resolution handling 2026-05-06 14:32:42 +01:00
alexsparkes
214e742996 refactor(Overview): remove unused news state and fetching logic; simplify component 2026-05-06 14:16:15 +01:00
alexsparkes
390474d670 feat: update project documentation and configuration files; enhance permissions and layout styles 2026-05-06 14:14:32 +01:00
alexsparkes
3762ce11f8 feat: add crosshair marker option to location map and update related components
- Introduced a crosshair marker feature in the LocationMap component, allowing users to toggle its visibility.
- Updated PhotoInformation component to pass crosshair state to LocationMap.
- Added a checkbox in DisplaySettings for users to enable or disable the crosshair marker.
- Enhanced styling for the crosshair marker in the associated SCSS file.
- Updated various localization files to include translations for the new crosshair marker option.
2026-05-06 10:30:24 +01:00
alexsparkes
6801f9eb6f refactor(LocationMap): remove unused marker styles and functions; update location map container styles 2026-05-06 10:28:09 +01:00
alexsparkes
6180bb4eb1 chore(.gitignore): add .claude/worktrees/ to ignore list 2026-05-05 22:02:36 +01:00
alexsparkes
d15ce2abbb chore(worktrees): remove obsolete worktree subprojects 2026-05-05 22:02:32 +01:00
alexsparkes
731456d683 fix(background): enhance fetchAPIImageData and getAPIBackground functions with improved exclusion handling and forced API support 2026-05-05 21:57:52 +01:00
alexsparkes
449b7839c2 fix(photoPackAPI): improve latitude and longitude handling with numeric validation
fix(PhotoInformation): refactor coordinate checks for map display logic
2026-05-05 21:50:31 +01:00
alexsparkes
ed3c67816a fix(marketplace): fix photo pack install/uninstall and settings bugs
- Fix field.id → field.key in photoPackHandler so API pack settings
  save under the correct keys after install
- Add missing useT() to ItemSettingsModal and remove getTypeTranslationKey
  which violated React Rules of Hooks
- Debounce text/password field changes in ItemSettingsModal (500ms) to
  avoid flooding API with 5 requests per keystroke
- Fix uninstall.js: capture packId before splice so enabledPacks is
  always cleaned up; delete photopack_settings_<id> on uninstall
- Fix getTotalPhotoCount to read api_pack_cache for API-enabled packs
- Fix marketplaceEnabled check to use installed[] instead of photo_packs
- Fix attribution_config forwarding to photoInfo in backgroundLoader
- Spread all optional metadata fields for static pool photos
- Reduce parallel cache refresh requests from 20 to 5
- Reduce SuggestedPacks localStorage cache from 24h to 1h
- Remove debug console.log calls from install.js and photoPackAPI.js

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-05 19:44:55 +01:00
alexsparkes
6d93138a05 feat(LocationMap): enhance map functionality with theme support and compact mode 2026-05-04 21:20:46 +01:00
alexsparkes
4d508b8ae3 fix(background): fix api pack cache cycling and stuck empty packs
- Increase concurrent fetches from 8 to 20 per cache refresh for
  a larger, more varied photo pool
- Deduplicate photos by URL before storing so concurrent random
  fetches don't fill the cache with the same image
- On fetch failure, still update timestamps and add pack to
  api_packs_ready so checkAndRefreshAPIPacks retries it on the
  next cycle instead of leaving it stuck at photos:[] forever
- checkAndRefreshAPIPacks now also picks up packs in api_pack_cache
  with 0 photos that were never added to api_packs_ready (covers
  packs that failed their initial install-time fetch)
- Raise the low-water refresh threshold from 3 to 5 photos to
  match the new queue size

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 19:18:10 +01:00
alexsparkes
fbc957e2a4 fix(background): fix exclude param name, increase queue size, cap exclude list
- Fix 'excludes' -> 'exclude' query param so excluded photos are
  actually filtered server-side (was silently ignored by the API)
- Increase prefetch queue from 3 to 5 for both API and photo pack
  backgrounds to reduce repeated photos between refreshes
- Cap backgroundExclude list at 50 entries (keeps newest) so the
  available pool never shrinks to nothing over time

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 19:14:26 +01:00
alexsparkes
9276daed17 feat(background): replace Mapbox static map with MapLibre + OpenFreeMap
Drops the Mapbox API dependency for maps. LocationMap is now a
lazily-loaded component that renders a MapLibre GL canvas using
OpenFreeMap tiles, with interactive: false to preserve the same
static appearance as before.

The /v2/map API proxy remains for older installed mue instances
and will be removed in a follow-up once this ships.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 18:47:47 +01:00
alexsparkes
29fd7181c7 feat(workflows): add auto-deploy to Chrome Web Store on release
- submit.yml: rewrite with release:[released] trigger, upgrade to BPP v3
  (no Puppeteer/Chrome setup needed), chrome-only, environment: production gate
- submit-beta.yml: new workflow, release:[prereleased] trigger, submits to
  Chrome trustedTesters channel, environment: beta gate
- both keep workflow_dispatch as manual fallback for re-runs
- hotfix releases automatically trigger submit.yml via the [released] event

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 22:51:32 +01:00
alexsparkes
55a4b31e30 fix(version-bump): adopt PR-triggered workflow from main and fix sed -i and manifest version bugs
- switch from workflow_dispatch to PR-closed trigger (aligns with main's automation approach)
- fix sed -i '' (macOS syntax) → sed -i (GNU/Linux compatible for Ubuntu runners)
- add stable_version output to strip pre-release suffix before writing to manifests
  (Chrome/Firefox/Safari extension manifests reject semver pre-release strings)
- keep token in checkout step for push permissions

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 22:07:51 +01:00
alexsparkes
a3ca7ad9e9 fix(workflows): fix IS_PRERELEASE bug, hotfix changelog, dependabot target, back-merge automation, lint gate, and manifest version mismatch
- fix version-bump.yml: IS_PRERELEASE was never defined, breaking iterative beta versioning (7.x.x-beta.1 → 7.x.x-beta.2)
- fix hotfix-release.yml: move changelog generation before merge so git log captures commits correctly
- fix dependabot.yml: was empty; now targets dev branch to keep Dependabot PRs in the normal dev→beta→main flow
- fix automerge.yml: remove continue-on-error from lint step so lint failures block Dependabot auto-merge; pin bun-version to 1.3.1
- fix production-release.yml: add automated back-merge of main→beta and main→dev after each production release
- fix manifest/chrome.json and manifest/firefox.json: version was 7.6.0, mismatched package.json 7.6.1

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 22:03:19 +01:00
David Ralph
6cb142b1b3 fix(welcome): import assets as ES modules to fix broken images in production builds
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 22:46:23 +01:00
David Ralph
69d91cc6f1 fix(date): preserve zero-padding when using MDY and YMD date formats
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 22:39:54 +01:00
alexsparkes
1ef65fb5d2 fix: resolve QA bugs across settings, reminder banner, and modal layout
- Replace all querySelector('.reminder-info') calls with EventBus.emit('showReminder')
  across 14 files — prevents crashes when the element is not mounted
- Move ReminderInfo from inside the sidebar to the top of the right content column
  so it no longer obscures sidebar navigation
- Fix reminder not showing for non-hot-reload settings (Slider hook violation where
  useT() was called inside a requestAnimationFrame callback)
- Skip reminder for LocationSearch since it already emits a hot-reload refresh event
- Suppress reminder for settings with hot-reload (no page refresh needed)
- Fix modal content overflowing right edge: replace width:100%!important on
  .modalTabContent with flex:1 + min-width:0 + overflow-x:hidden
- Fix ReminderInfo refresh button being too small
- Fix sidebar collapse animation using max-width transition instead of width:0
- Fix PhotoInformation showing 0x0 resolution and Unknown Location before image loads
- Fix Wikipedia disambiguation links for quote authors by returning null from
  getAuthorLink (Wikidata links used when available)
- Bail early in useSuggestedPacks when offline mode is enabled

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 10:19:50 +01:00
David Ralph
b98478ef68 feat(tests): add basic cypress for welcome and widgets 2026-02-08 23:59:23 +00:00
alexsparkes
031d980301 fix: Prevent duplicate installations in install function 2026-02-08 19:47:31 +00:00
alexsparkes
04e5e26141 Update background options and migrations 2026-02-08 19:41:16 +00:00
alexsparkes
6c6542c08b fix: Enhance deep link handling in Discover component and update RouterBridge for collection navigation 2026-02-07 22:56:34 +00:00
alexsparkes
8c4ea4cf6a fix: Update modal sidebar active color for improved visibility 2026-02-07 22:32:12 +00:00
alexsparkes
e938eef740 fix: Refactor event handling in LocationSearch and streamline modal navigation logic in Modals 2026-02-07 22:28:56 +00:00
alexsparkes
8a28a27282 fix: Improve location retrieval logic in WeatherWidget and enhance selection behavior in LocationSearch 2026-02-07 22:25:54 +00:00
alexsparkes
96e51c96cf fix: Enhance photo pack data structure and improve button layout in PhotoInformation component 2026-02-07 22:19:45 +00:00
alexsparkes
8758188521 fix: Prevent main modal from appearing on top of welcome modal during transitions 2026-02-07 22:01:04 +00:00
alexsparkes
ad7963f8f5 fix: Implement fallback to en_GB in translation retrieval for improved language handling 2026-02-07 21:28:55 +00:00
alexsparkes
bce58afa66 fix: Update modal prop names for consistency in CustomSettings component 2026-02-07 21:19:05 +00:00
alexsparkes
ce085b4457 fix: Correct path for achievement locale loaders and improve loader retrieval logic 2026-02-07 21:10:17 +00:00
alexsparkes
2a35b55cff fix: Correct parameter key usage in fetchFromProvider function for settings handling 2026-02-07 20:49:16 +00:00
alexsparkes
864579de84 feat: Enhance ItemSettingsModal with smoother opening and closing transitions 2026-02-07 20:33:48 +00:00
alexsparkes
9e75be2b89 feat: Enhance PhotoInformation component with metadata display and improved styling; update QuoteInfoModal navigation behavior 2026-02-07 19:33:35 +00:00
alexsparkes
59ceb40a32 feat: Update Quote component and styles for improved visibility and user experience 2026-02-07 19:04:22 +00:00
alexsparkes
348485a724 feat: Update warning message in QuoteInfoModal for improved clarity on data sourcing 2026-02-07 14:54:48 +00:00
alexsparkes
4ad799da3b feat: Add QuoteInfoModal for displaying detailed quote information and integrate it with the Quote component 2026-02-07 14:53:35 +00:00
alexsparkes
f891a16350 feat: Enhance AuthorInfo component with link support and add ErrorElement for improved error handling 2026-02-07 13:48:31 +00:00
alexsparkes
2d7e1ad97a feat: Update refresh handlers to include language and other settings for improved state management 2026-02-07 13:23:06 +00:00
alexsparkes
4d56bbb2c1 feat: Refactor install function to streamline settings and photo handling 2026-02-07 12:47:13 +00:00
alexsparkes
3af0b63a17 feat: Move useT hook initialization to ItemCard and Items components 2026-02-07 12:31:22 +00:00
alexsparkes
1b664ba23e feat: Enhance ItemCard button styles and add install counter with event listener 2026-02-07 12:28:06 +00:00
alexsparkes
eb3af777f5 feat: Implement install functionality for suggested packs and enhance state management 2026-02-07 12:19:47 +00:00
alexsparkes
bbca4b9c7b feat: Enhance item toggle functionality to support item ID retrieval 2026-02-07 12:08:02 +00:00
alexsparkes
553d5001f6 feat: Update navigation to item detail pages and enhance item ID handling 2026-02-07 12:04:24 +00:00
alexsparkes
cf3237f337 feat: Migrate to React Router v7 and refactor navigation
- Added react-router for improved routing and navigation.
- Replaced hash-based navigation with React Router's navigate function.
- Introduced RouterBridge to manage deep linking and legacy navigation.
- Updated components to utilize useNavigate and useLocation hooks.
- Refactored modal handling to integrate with React Router.
- Removed updateHash utility to prevent conflicts with React Router's history management.
- Created routes configuration for application structure and lazy loading.
- Ensured backward compatibility with existing deep link data structure.
2026-02-07 11:48:09 +00:00
alexsparkes
9e336b0582 feat: enhance deep linking functionality in MainModal and Discover components 2026-02-07 11:18:57 +00:00
alexsparkes
474b4ae237 feat(marketplace): Add suggested packs feature to marketplace
- Introduced new SuggestedPacks component to display trending quote and photo packs.
- Implemented useSuggestedPacks hook for fetching and caching suggested packs from the marketplace.
- Updated localization files for multiple languages to include new strings for suggested packs.
- Added explore all button to navigate to the marketplace category page.
2026-02-07 11:02:29 +00:00