1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
use AiLeftOutlined;
use AiRightOutlined;
use *;
use ;
use component_doc;
use inject_style;
use crateIcon;
use carousel_styles;
/// `CarouselStepper` adds prev/next controls and slide indicators to a parent [`Carousel`].
/// Place it inside the carousel tree; choose `layout=Bottom` for a row under slides or
/// `layout=Inline` to overlay the viewport. Override dots and arrows with custom `children`
/// when defaults do not match your design.
///
/// # When to use
///
/// - Default stepping UI when you do not need custom carousel chrome - Bottom-aligned controls under the viewport (default layout) - Overlay arrows on the viewport sides and dot indicators along the bottom via `layout=CarouselStepperLayout::Inline`
///
/// # Usage
///
/// 1. Place inside a [`Carousel`] after [`CarouselViewport`]. 2. Choose `layout` for bottom or inline overlay positioning. 3. Override with custom children only when you need fully bespoke controls.
///
/// # Best Practices
///
/// ## Do's
///
/// * Pair with [`CarouselViewport`] and [`CarouselSlide`] children in the same [`Carousel`] root * Use inline layout when the viewport should remain full-bleed with overlay arrows * Rely on the built-in indicators so users can jump directly to a slide
///
/// ## Don'ts
///
/// * Do not mount outside a [`Carousel`] — it requires [`CarouselStateInjection`] * Do not duplicate prev/next buttons elsewhere unless you disable the stepper
///
/// # Examples
///
/// ## Default stepper
/// Bottom layout with previous/next buttons and page indicators.
/// <!-- preview -->
/// ```rust
/// use crate::{Carousel, CarouselSlide, CarouselStepper, CarouselViewport};
/// view! {
/// <div data-testid="carousel-stepper-preview">
/// <Carousel default_active_index=0 wrap=true>
/// <CarouselViewport>
/// <CarouselSlide>
/// <div class="orbital-carousel__slide-panel">
/// <p class="orbital-carousel__slide-eyebrow">"Featured"</p>
/// <h3 class="orbital-carousel__slide-title">"Workspace overview"</h3>
/// <p class="orbital-carousel__slide-body">"Step through highlights of the dashboard experience."</p>
/// </div>
/// </CarouselSlide>
/// <CarouselSlide>
/// <div class="orbital-carousel__slide-panel orbital-carousel__slide-panel--neutral">
/// <p class="orbital-carousel__slide-eyebrow">"Collaboration"</p>
/// <h3 class="orbital-carousel__slide-title">"Shared projects"</h3>
/// <p class="orbital-carousel__slide-body">"Keep teams aligned with a single source of truth."</p>
/// </div>
/// </CarouselSlide>
/// </CarouselViewport>
/// <CarouselStepper />
/// </Carousel>
/// </div>
/// }
/// ```
///
/// ## Inline overlay stepper
/// Arrows overlay the viewport sides; dot indicators sit along the bottom edge—useful for hero banners and image-forward carousels.
/// <!-- preview -->
/// ```rust
/// use crate::{Carousel, CarouselSlide, CarouselStepper, CarouselViewport};
/// use orbital_base_components::CarouselStepperLayout;
/// view! {
/// <div data-testid="carousel-stepper-inline">
/// <Carousel default_active_index=0 wrap=true>
/// <CarouselViewport>
/// <CarouselSlide>
/// <div class="orbital-carousel__slide-panel orbital-carousel__slide-panel--accent">
/// <p class="orbital-carousel__slide-eyebrow">"Campaign"</p>
/// <h3 class="orbital-carousel__slide-title">"Summer release"</h3>
/// <p class="orbital-carousel__slide-body">"Inline steppers keep focus on the slide artwork."</p>
/// </div>
/// </CarouselSlide>
/// <CarouselSlide>
/// <div class="orbital-carousel__slide-panel">
/// <p class="orbital-carousel__slide-eyebrow">"Update"</p>
/// <h3 class="orbital-carousel__slide-title">"What's new"</h3>
/// <p class="orbital-carousel__slide-body">"Navigate without leaving the hero canvas."</p>
/// </div>
/// </CarouselSlide>
/// </CarouselViewport>
/// <CarouselStepper layout=CarouselStepperLayout::Inline />
/// </Carousel>
/// </div>
/// }
/// ```