# Aether UI/UX — Future Ideas > Collection of concrete UX improvements for the Aether frontend. Each entry includes > the rationale, current behavior, proposed change, and implementation notes. > **Date:** 2026-05-17 --- ## IDAA Recovery Meetings ### 1. Guided empty state with active filters — ✅ Implemented 2026-05-18 **Current behavior:** When filters return 0 results, the page shows: "No recovery meetings found matching your criteria." The member has no indication whether this is a bug, genuinely no data, or just overly narrow filters. **Proposed change:** When filters are active AND the result count is 0, show a helpful prompt instead of the bare message: ``` No meetings found for these filters. Try broadening your search or [Clear all filters →] ``` **Implementation notes:** - Add a `has_active_filters` derived in `+page.svelte` that checks whether any of `qry__physical`, `qry__virtual`, `qry__type`, or `qry__fulltext_str` is set. - In the template's `{:else}` block (line ~443), branch on `has_active_filters`: - `true` → show the guided message + "Clear Filters" button - `false` → show the existing escape-hatch flow (timed "Refresh Meeting Cache" button after 8 seconds, since zero unfiltered results always indicates a problem) - The "Clear Filters" button resets all four filter fields to `null`/`''` and bumps `search_version` to trigger a fresh unfiltered search. - Distinct from the `error` state — this is a successful search (`qry__status === 'done'`) with an empty result set. **Implemented:** `src/routes/idaa/(idaa)/recovery_meetings/+page.svelte`. `has_active_filters` derived checks `qry__physical`, `qry__virtual`, `qry__type`, and `qry__fulltext_str`. Empty state branches on `has_active_filters`: active filters → guided message + "Clear Filters" button; no active filters → existing escape-hatch flow (timed "Refresh Meeting Cache" after 8 seconds). --- ### 2. Quick-filter chips below the search bar — ✅ Implemented 2026-05-18 **Current behavior:** Members toggle filters via small checkboxes (Virtual, In-person) and radio buttons (All, IDAA, Caduceus, Family Recovery). These require precise mouse/tap targeting and scanning several lines of filter UI to discover and use. **Proposed change:** Add a row of preset chip buttons directly below the search input: ``` [🖥 Virtual] [🏠 In-Person] [🩺 IDAA] [Caduceus] [Family Recovery] [All Types] ``` - Each chip toggles the corresponding filter (`qry__virtual`, `qry__physical`, `qry__type`) and triggers an immediate search. - Selected chips get a filled/pressed style; unselected chips are outlined. - "All Types" is the default selected state (no type filter). Clicking another type chip deselects "All Types" (radio behavior for the type dimension). Virtual and In-person are independent toggles (checkbox behavior — can select both). - The existing checkboxes/radio buttons remain as the underlying state storage (`$idaa_loc.recovery_meetings.*`). The chips are a convenience layer — they write to the same store fields and call `handle_search_trigger()`. **Implementation notes:** - Place in `ae_idaa_comp__event_obj_qry.svelte` between the search input row and the current filter rows. - Optionally hide the existing checkbox/radio filter rows when the chips are present (or keep both — the checkboxes serve as accessible form controls; the chips are the primary visual interaction). - On mobile, chips wrap to a second row naturally with `flex-wrap`. **Implemented:** `ae_idaa_comp__event_obj_qry.svelte`. Chips replaced the old checkbox/radio/select UI entirely rather than layering on top. Two chip rows: Row 1 — My Meetings (first), Virtual, In-Person. Row 2 — All / IDAA / Caduceus / Family Recovery type chips. Cycling sort button replaces separate sort options (see item below). Max Results uses a +/− stepper. Sort and max are in a third row below the chips, inside the same `