Skip to main content

ui_storybook/stories/
recorder_audio.rs

1//! System-audio picker stories (M-UI.9 / AUT-129).
2
3use leptos::prelude::*;
4
5use crate::components::recorder::{AudioFilter, SystemAudioAppList, SystemAudioRow};
6use crate::fixtures::audio_apps::{
7    sample_audio_apps, sample_audio_apps_all_selected, sample_audio_apps_none_selected,
8    sample_system_audio_view,
9};
10
11use super::{Story, StoryViewport, render};
12
13/// All system-audio stories.
14#[must_use]
15pub fn stories() -> Vec<Story> {
16    vec![
17        Story {
18            id: "system-audio-collapsed",
19            category: "Recorder",
20            title: "System audio — collapsed row",
21            viewport: StoryViewport::Fixed {
22                width: 400,
23                height: 80,
24            },
25            render: render_collapsed,
26        },
27        Story {
28            id: "system-audio-expanded",
29            category: "Recorder",
30            title: "System audio — expanded app list",
31            viewport: StoryViewport::Fixed {
32                width: 400,
33                height: 360,
34            },
35            render: render_expanded,
36        },
37        Story {
38            id: "system-audio-none-selected",
39            category: "Recorder",
40            title: "System audio — no apps selected",
41            viewport: StoryViewport::Fixed {
42                width: 400,
43                height: 360,
44            },
45            render: render_none_selected,
46        },
47        Story {
48            id: "system-audio-all-selected",
49            category: "Recorder",
50            title: "System audio — every app selected",
51            viewport: StoryViewport::Fixed {
52                width: 400,
53                height: 360,
54            },
55            render: render_all_selected,
56        },
57        Story {
58            id: "audio-app-row-live",
59            category: "Recorder",
60            title: "Audio app row — live with meter + Suggested",
61            viewport: StoryViewport::Fixed {
62                width: 400,
63                height: 60,
64            },
65            render: render_live_row,
66        },
67        Story {
68            id: "audio-app-row-muted",
69            category: "Recorder",
70            title: "Audio app row — idle / unselected",
71            viewport: StoryViewport::Fixed {
72                width: 400,
73                height: 60,
74            },
75            render: render_muted_row,
76        },
77    ]
78}
79
80fn render_collapsed() -> String {
81    let apps = sample_audio_apps();
82    let total = apps.len();
83    let selected_subset: Vec<_> = apps.iter().filter(|a| a.selected).cloned().collect();
84    let view = sample_system_audio_view(true, false, &selected_subset, total);
85    render(view! {
86        <div style="padding:12px">
87            <SystemAudioRow view=view />
88        </div>
89    })
90}
91
92fn render_expanded() -> String {
93    render(view! {
94        <div style="padding:12px">
95            <SystemAudioAppList apps=sample_audio_apps() active_filter=AudioFilter::Suggested />
96        </div>
97    })
98}
99
100fn render_none_selected() -> String {
101    render(view! {
102        <div style="padding:12px">
103            <SystemAudioAppList apps=sample_audio_apps_none_selected() active_filter=AudioFilter::None />
104        </div>
105    })
106}
107
108fn render_all_selected() -> String {
109    render(view! {
110        <div style="padding:12px">
111            <SystemAudioAppList apps=sample_audio_apps_all_selected() active_filter=AudioFilter::All />
112        </div>
113    })
114}
115
116fn render_live_row() -> String {
117    let apps = sample_audio_apps();
118    let single = vec![apps[0].clone()];
119    render(view! {
120        <div style="padding:12px">
121            <SystemAudioAppList apps=single active_filter=AudioFilter::Suggested />
122        </div>
123    })
124}
125
126fn render_muted_row() -> String {
127    let apps = sample_audio_apps();
128    let single = vec![apps[3].clone()];
129    render(view! {
130        <div style="padding:12px">
131            <SystemAudioAppList apps=single active_filter=AudioFilter::All />
132        </div>
133    })
134}