{#each $lq__event_presentation_obj_li as event_presentation_obj (event_presentation_obj.event_presentation_id)}
+ /**
+ * menu_session_list.svelte — Aether Launcher: Session Selector
+ *
+ * PURPOSE:
+ * This is the primary navigation control for conference operators using
+ * the Aether Events Launcher. It lists all sessions in the selected room
+ * (event_location) and lets the operator switch the room's active session.
+ *
+ * ENVIRONMENT:
+ * The Launcher runs on operator laptops, dedicated podium/kiosk tablets,
+ * projector-connected desktops, and occasionally phones in breakout rooms.
+ * Users range from tech-savvy AV staff to volunteers with limited computer
+ * experience. Some users have motor impairments or shaky hands (e.g. older
+ * members common at IDAA and similar events).
+ *
+ * KEY DESIGN CONSTRAINTS:
+ * - Must show 0–20 sessions without scrolling (compact fixed-height rows)
+ * - Session names can be extremely long (~300 chars) — must truncate at
+ * rest but reveal fully on hover without pushing other rows around
+ * - Hover-to-switch fires after a delay timer (not instantly) to prevent
+ * accidental session changes from casual cursor movement
+ * - Strongly prefer click-to-confirm over hair-trigger hover activation
+ * - Works in light and dark mode; projector-safe high-contrast overlay
+ *
+ * DATA FLOW:
+ * lq__event_session_obj_li (Dexie liveQuery, passed from launcher/+layout.svelte)
+ * → rendered here as buttons
+ * → click / hover-timer sets trigger_reload__event_session_obj_id
+ * → $effect fires load + URL navigation + optional WS remote-control push
+ *
+ * SESSION VISIBILITY (operator toggle — show_content__hidden_sessions):
+ * Normal sessions: always visible
+ * hide_event_launcher = true: hidden from list by default (launcher-specific
+ * suppression, e.g. overflow/backup sessions)
+ * hide = true: globally hidden across all views (draft/cancelled)
+ *
+ * Both hidden states are fetched into Dexie with hidden:'all' by the background
+ * sync so the operator can reveal them via the "All Sessions" menu toggle.
+ * When revealed they appear dimmed (opacity-40) with an eye-slash indicator.
+ */
+
interface Props {
slct__event_session_id?: null | boolean | string;
loading__session_id_status?: null | boolean | string;
@@ -60,7 +101,14 @@
slct__event_presentation_li: null
});
- let hover_timer_wait = 750; // Optimized from 1250ms for better responsiveness
+ // WHY 1200ms: Aether Launcher is used at conferences by operators of all ages and
+ // motor abilities — shaky hands, imprecise trackpads, and fat-finger tablet taps are
+ // routine. 750ms (the previous value) triggered accidental session changes when the
+ // cursor drifted across the list. 1200ms means the operator must deliberately hold
+ // focus on a row for over a second before it fires — still fast for intentional use.
+ // NOTE: hover-timer only triggers a data PRE-LOAD (preview). The session does not
+ // actually switch until the operator clicks. See onclick handler below.
+ let hover_timer_wait = 1200;
let hover_timer: any = $state(null);
// Navigation Shield Pattern (Refactored 2026-02-11)
@@ -71,7 +119,7 @@
if (trigger_reload__event_session_obj_id) {
const start = performance.now();
const event_session_id = String(trigger_reload__event_session_obj_id);
-
+
if (log_lvl) {
console.log(`[UI Trace] trigger_reload changed to: ${event_session_id}`);
}
@@ -179,22 +227,21 @@
{#each $lq__event_session_obj_li as event_session_obj (event_session_obj.event_session_id)}