ui_storybook/stories/
recorder_audio.rs1use 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#[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}