# Changelog

## 0.3.0 — Spaces Update

### Added

- **Personal display and comfort preferences:** adjustable glass opacity,
  stronger contrast, larger text, reduced motion, a default window distance,
  a preferred launcher view, optional native popups and popup duration.
- **Spaces:** save up to six personal rooms with app windows, nearby widgets
  and an environment. Use portable layouts wherever you go or anchored layouts
  near their saved location. Update and delete saved rooms explicitly.
- **Destinations:** save up to twelve favorite places from your current position
  or a map waypoint. Follow an AR direction indicator with straight-line
  distance alongside the GTA waypoint.
- **Meeting points:** invite a friend to a destination. Sharing requires
  acceptance, expires after 45 seconds and sends a single location rather than
  continuously tracking the sender.
- **Launcher favorites and history:** pin up to six apps and quickly reopen
  the four most recently used apps, including custom SDK apps.
- **Native notifications:** timer, valet and invitation cards can open their
  related app. Do Not Disturb silences popups while retaining the cards.
- **Persistent session timers:** close the Clock window without stopping its
  timer. Pause, resume and reset it, with one notification on completion.
  Taking off the headset resets the timer.
- **Beat rematches:** challenge the previous opponent again with the same song
  and difficulty through a fresh invitation.
- **Clock widget designs:** choose Studio or Midnight analogue faces, or a wide
  Flip clock. Each design has its own case, date display and proportions.
  Existing clocks without a saved design keep an analogue face.
- **Replace a wall widget:** choose another widget directly from its editor.
  Replacement keeps the wall position and existing slot, including at the
  twelve-widget limit, and adjusts the shape for the selected widget.
- **Software Update in Settings:** see the installed version, available version,
  release notes and check status. Automatic and manual checks read public
  version metadata; installation remains a server-owner action.
- **Profile picture gallery:** choose a photo from the supported RoadPhone
  camera roll or enter an image URL in Friends. Preview the selection before
  saving; cancelling discards the draft.
- **Spanish and Italian:** interface translations and Lua notifications join
  English and German. Players choose their interface language in Settings;
  server notifications use `Config.Locale`.

### Improved

- The widget menu is now a floating glass library with larger live previews,
  readable labels, a clear capacity indicator and responsive page buttons
  instead of scrolling. Choosing content collapses the library into a compact
  toolbar so the editor and placement controls stay visible.
- A refined material system gives windows layered glass surfaces,
  soft highlights, rounded groups and consistent pill controls in both themes.
- Notes uses subtle neutral selection and focus indicators; writing fields
  show a fine underline instead of a bright blue focus rectangle.
- Launcher icons and app controls no longer retain white or blue focus frames
  after keyboard input or selecting a field, including the language selector.
- Settings has dedicated categories for appearance, glass and text, windows,
  home view, comfort, notifications, general settings and software updates.
  Display controls include live previews and save feedback; the preferences
  layout fits at both supported text sizes.
- Vehicles, Notes, Friends, Spaces and Destinations have redesigned layouts,
  clearer visual hierarchy and grouped actions.
- The launcher spreads apps across up to three wide rows without scrolling.
  Extra custom apps use previous/next buttons. Saved launchers adopt the new
  proportions while preserving placement and the chosen scale within the
  supported resize limits.
- Beat duels use normal speed and matching failure rules for both players.
  A forfeit lets the opponent finish; the shared deadline follows the track
  duration instead of cutting a longer song short after the first finish.
- Valet orders show preparation, delivery and failure states, including a
  delivery failure after payment. Timeouts handle stalled or missing drivers.
- Room switches check app access and available capacity before applying a
  layout, preserve distant widget walls and leave saved templates unchanged.
- The Weather widget is now an illustrated station with day, night, cloud,
  rain, storm, snow and fog states. It shows temperature, wind speed and
  direction, daylight progress and the next sunrise or sunset using game-world
  readings and configured daylight times, with fallbacks for missing values.
- The Calendar gains ring binding, layered paper, month and year, and a weekday
  marker. Sticky notes gain tape and a folded corner while keeping their paper
  colours and square, wide or tall formats.
- Basketball includes a bundled portable hoop with matching board and rim
  collision and an open visual net. The app places it on detected ground and
  provides ball-return and hoop-placement controls.
- Basketball offers timing, flick and power-meter controls with clearer charge,
  aim and release feedback. Shot planning accounts for distance and height;
  misses distinguish short, long, left and right.
- Fixed widgets reuse their transforms and resting panels retain stable world
  positions while the camera moves. Arrangement changes request their own
  movement animation. Reduced Motion disables window glide, and gaze changes
  no longer trigger decorative transitions.
- Interface translations cover the new controls, save feedback and error states.

### Fixed

- The launcher's filter bar, favorites button and page arrows now follow the
  selected theme instead of retaining dark surfaces in light mode.
- Widget previews now inherit their typography and spacing tokens and preserve
  each widget's proportions. Widget and editor component definitions no longer
  become reactive Vue state, eliminating the associated rendering warnings.
  Mounted widgets can change type without keeping the previous face.
- Moving or replacing a widget at full capacity no longer consumes another
  slot. Cancelling a move restores its original data and position; switching
  editors keeps the correct replacement target, and failed replacements can
  be retried.
- Rapid Settings edits could finish saving out of order. Writes now preserve
  edit order across window closure, retain pending previews and reject queued
  writes from an expired headset session. Failed requests remain retryable.
- Failed or stale profile loads could allow empty settings or layouts to be
  saved. Interrupted setup could also overwrite an existing widget wall.
- Destinations shows saving, saved or failed status and offers a retry. Success
  waits for the server's database acknowledgement, with duplicate submissions
  blocked and expired-session replies ignored.
- Profile writes remain ordered even if an earlier database query outlives a
  UI timeout. Partial updates preserve destinations; pending saves are submitted
  on resource shutdown. Database errors no longer leave the write queue locked.
- Restored windows no longer collapse into a stack after rejoining or moving
  away. Nearby placements are retained; distant windows are arranged with gaps
  around existing panels. Pinned windows retain their anchor mode, and overflow
  rows preserve their height when following or opening an app from the launcher.
- Notes refreshes and delayed save responses could overwrite unsaved edits.
  Saves and deletions now check their result; oversized content is rejected
  instead of silently truncated.
- Overlapping valet requests and duplicate callbacks could repeat payment or
  spawn work. Orders now use server tokens and reject stale responses;
  locating a vehicle checks ownership before returning its position.
- Simultaneous Beat invitations, delayed replies and messages from old rooms
  could corrupt duel state. Challenges reserve participants, validate song,
  difficulty and score metadata, and reject mismatched room messages.
- Friend presence updates did not consistently reach the correct UI entry.
- Avatar saves wait for database confirmation before changing the profile card
  or cached picture. Failed previews and gallery loads have recovery states;
  stale requests and replies from another character cannot update the editor.
- Basketball scoring checks a downward crossing through the usable rim opening
  and counts it once. Upward crossings and balls overlapping the rim wire do
  not score. Charge timing uses elapsed time rather than frame count.
- Basketball cancels charging when an app panel opens, so panel clicks cannot
  release a ball. Returning a missed ball ends the streak; delayed throw
  animations cannot affect a later shot. Failed placement preserves the old
  hoop, and closing during loading prevents late props or leaked entities.
- Update checks share a server-side request and cooldown, reject invalid
  metadata and ignore late replies. Failed checks keep the last known result
  visible without claiming that an unavailable version check succeeded.
- Some UI requests could remain pending indefinitely or use the wrong resource
  name. Requests now have a timeout and resolve the running resource name.
- Late callbacks could restore obsolete UI state or leave temporary entities,
  markers and notifications behind after a session ended.

### Website

- Added a changelog archive, permanent release pages, category links and a
  Markdown download. The full 0.2-to-0.3 notes are available on the website;
  future releases can be added without changing existing release URLs.
- Expanded the product page with Spaces, Destinations, everyday improvements,
  comfort controls and server FAQs. The app catalogue lists all seventeen
  built-in apps. Existing testimonials are retained.
- Added interactive app examples and a gallery of all seven built-in widget
  types. Visitors can try clock designs, sample weather, note text, colours and
  shapes, photo styles and neon text. Widget and panel styles are sourced from
  RoadVR; website examples use local sample data.
- Removed decorative launcher corners and updated desktop and mobile layouts.
  The widget wall photo has its own section state, so the preceding video
  player no longer remains active behind it.

### Updating

- Replace client, server, shared files, streamed assets and the built NUI
  together. Profile callbacks, widget editing and Beat messages changed.
- Preserve server-specific configuration and merge the new options. Servers
  retaining an older basketball configuration should apply the bundled hoop's
  matching model and geometry settings.
- The `roadvr_spaces` database table is created automatically on startup.
- Configure automatic version checks through `Config.Updates`. The Settings
  page reports version information; it does not download or install an update.
- A confirmed valet fee can remain charged if delivery later fails; there is
  no automatic refund.
- Local regression checks and UI builds do not replace in-game acceptance.
  Game-to-NUI latency still depends on frame timing and hardware.
