@pure-ds/storybook 0.3.19 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/addons/pds-configurator/SearchTool.js +44 -44
- package/.storybook/preview.js +6 -2
- package/dist/pds-reference.json +65 -13
- package/package.json +50 -50
- package/stories/components/PdsCalendar.stories.js +266 -263
- package/stories/components/PdsDrawer.stories.js +2 -2
- package/stories/components/PdsIcon.stories.js +2 -2
- package/stories/components/PdsJsonform.stories.js +2 -2
- package/stories/components/PdsRichtext.stories.js +367 -367
- package/stories/components/PdsScrollrow.stories.js +140 -140
- package/stories/components/PdsSplitpanel.stories.js +502 -502
- package/stories/components/PdsTabstrip.stories.js +2 -2
- package/stories/components/PdsToaster.stories.js +186 -186
- package/stories/components/PdsUpload.stories.js +66 -66
- package/stories/enhancements/Dropdowns.stories.js +185 -185
- package/stories/enhancements/InteractiveStates.stories.js +625 -625
- package/stories/enhancements/MeshGradients.stories.js +321 -320
- package/stories/enhancements/OpenGroups.stories.js +227 -227
- package/stories/enhancements/RangeSliders.stories.js +232 -232
- package/stories/enhancements/RequiredFields.stories.js +189 -189
- package/stories/enhancements/Toggles.stories.js +167 -167
- package/stories/foundations/Colors.stories.js +2 -1
- package/stories/foundations/Icons.stories.js +4 -0
- package/stories/foundations/SmartSurfaces.stories.js +485 -367
- package/stories/foundations/Spacing.stories.js +5 -1
- package/stories/foundations/Typography.stories.js +4 -0
- package/stories/foundations/ZIndex.stories.js +329 -325
- package/stories/layout/LayoutOverview.stories.js +247 -0
- package/stories/layout/LayoutSystem.stories.js +852 -0
- package/stories/patterns/BorderEffects.stories.js +74 -72
- package/stories/primitives/Accordion.stories.js +5 -3
- package/stories/primitives/Alerts.stories.js +261 -46
- package/stories/primitives/Badges.stories.js +4 -0
- package/stories/primitives/Buttons.stories.js +2 -2
- package/stories/primitives/Cards.stories.js +98 -170
- package/stories/primitives/Media.stories.js +442 -203
- package/stories/primitives/Tables.stories.js +358 -232
- package/stories/utilities/Backdrop.stories.js +197 -0
- package/stories/patterns/Layout.stories.js +0 -99
- package/stories/utilities/GridSystem.stories.js +0 -208
|
@@ -1,232 +1,232 @@
|
|
|
1
|
-
import { html } from 'lit';
|
|
2
|
-
|
|
3
|
-
const rangeSliderStoryStyles = html`
|
|
4
|
-
<style>
|
|
5
|
-
.range-slider-section {
|
|
6
|
-
max-width: 400px;
|
|
7
|
-
display: grid;
|
|
8
|
-
gap: var(--spacing-4);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
.range-slider-section--wide {
|
|
12
|
-
max-width: 500px;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
.range-slider-section--comparison {
|
|
16
|
-
display: grid;
|
|
17
|
-
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
18
|
-
gap: var(--spacing-6);
|
|
19
|
-
max-width: 1000px;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
.range-slider-description {
|
|
23
|
-
color: var(--color-text-secondary);
|
|
24
|
-
font-size: 0.875rem;
|
|
25
|
-
margin: 0 0 var(--spacing-4);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
.range-slider-form {
|
|
29
|
-
display: flex;
|
|
30
|
-
flex-direction: column;
|
|
31
|
-
gap: var(--spacing-4);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
.range-slider-actions {
|
|
35
|
-
margin-top: var(--spacing-2);
|
|
36
|
-
align-self: flex-start;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
.range-slider-card {
|
|
40
|
-
display: grid;
|
|
41
|
-
gap: var(--spacing-4);
|
|
42
|
-
}
|
|
43
|
-
</style>
|
|
44
|
-
`;
|
|
45
|
-
|
|
46
|
-
export default {
|
|
47
|
-
title: 'Enhancements/Range Sliders',
|
|
48
|
-
tags: ['forms', 'interaction'],
|
|
49
|
-
parameters: {
|
|
50
|
-
pds: {
|
|
51
|
-
tags: ['forms', 'interaction']
|
|
52
|
-
},
|
|
53
|
-
docs: {
|
|
54
|
-
description: {
|
|
55
|
-
component: `Enhanced range inputs with two display modes:
|
|
56
|
-
|
|
57
|
-
**Standard Mode** (default): Floating bubble that appears on interaction.
|
|
58
|
-
|
|
59
|
-
**Inline Output Mode**: Add \`range-output\` class to the label for persistent inline value display using semantic \`<output>\` element.
|
|
60
|
-
|
|
61
|
-
Both modes automatically generate proper ARIA attributes and use the \`<output>\` tag for accessibility.`
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
export const StandardFloatingBubble = () => html`
|
|
68
|
-
${rangeSliderStoryStyles}
|
|
69
|
-
<section class="range-slider-section">
|
|
70
|
-
<p class="range-slider-description">
|
|
71
|
-
Default behavior: A floating bubble appears when you interact with the slider.
|
|
72
|
-
</p>
|
|
73
|
-
<label>
|
|
74
|
-
<span>Volume</span>
|
|
75
|
-
<input type="range" min="0" max="100" value="50">
|
|
76
|
-
</label>
|
|
77
|
-
</section>
|
|
78
|
-
`;
|
|
79
|
-
|
|
80
|
-
StandardFloatingBubble.storyName = 'Standard (Floating Bubble)';
|
|
81
|
-
|
|
82
|
-
export const MultipleRanges = () => html`
|
|
83
|
-
${rangeSliderStoryStyles}
|
|
84
|
-
<form
|
|
85
|
-
class="range-slider-section range-slider-form"
|
|
86
|
-
@submit="${(event) => {
|
|
87
|
-
event.preventDefault();
|
|
88
|
-
toastFormData(new FormData(event.target));
|
|
89
|
-
}}"
|
|
90
|
-
>
|
|
91
|
-
<label>
|
|
92
|
-
<span>Brightness</span>
|
|
93
|
-
<input type="range" name="brightness" min="0" max="100" value="75">
|
|
94
|
-
</label>
|
|
95
|
-
<label>
|
|
96
|
-
<span>Contrast</span>
|
|
97
|
-
<input type="range" name="contrast" min="0" max="100" value="50">
|
|
98
|
-
</label>
|
|
99
|
-
<label>
|
|
100
|
-
<span>Saturation</span>
|
|
101
|
-
<input type="range" name="saturation" min="0" max="100" value="60">
|
|
102
|
-
</label>
|
|
103
|
-
<label>
|
|
104
|
-
<span>Temperature</span>
|
|
105
|
-
<input type="range" name="temperature" min="-100" max="100" value="0">
|
|
106
|
-
</label>
|
|
107
|
-
<button type="submit" class="btn-primary range-slider-actions">Apply Settings</button>
|
|
108
|
-
</form>
|
|
109
|
-
`;
|
|
110
|
-
|
|
111
|
-
export const CustomSteps = () => html`
|
|
112
|
-
${rangeSliderStoryStyles}
|
|
113
|
-
<form
|
|
114
|
-
class="range-slider-section range-slider-form"
|
|
115
|
-
@submit="${(event) => {
|
|
116
|
-
event.preventDefault();
|
|
117
|
-
toastFormData(new FormData(event.target));
|
|
118
|
-
}}"
|
|
119
|
-
>
|
|
120
|
-
<label>
|
|
121
|
-
<span>Opacity (10% steps)</span>
|
|
122
|
-
<input type="range" name="opacity" min="0" max="100" value="100" step="10">
|
|
123
|
-
</label>
|
|
124
|
-
<label>
|
|
125
|
-
<span>Font Size (0.25rem steps)</span>
|
|
126
|
-
<input type="range" name="fontSize" min="0.5" max="3" value="1" step="0.25">
|
|
127
|
-
</label>
|
|
128
|
-
<button type="submit" class="btn-primary range-slider-actions">Apply Settings</button>
|
|
129
|
-
</form>
|
|
130
|
-
`;
|
|
131
|
-
|
|
132
|
-
export const InlineOutputMode = () => html`
|
|
133
|
-
${rangeSliderStoryStyles}
|
|
134
|
-
<section class="range-slider-section range-slider-section--wide">
|
|
135
|
-
<p class="range-slider-description">
|
|
136
|
-
Add the <code>range-output</code> class to automatically create an inline output display.
|
|
137
|
-
</p>
|
|
138
|
-
<div class="range-slider-form">
|
|
139
|
-
<label class="range-output">
|
|
140
|
-
<span>Master Volume</span>
|
|
141
|
-
<input type="range" min="0" max="100" value="75">
|
|
142
|
-
</label>
|
|
143
|
-
<label class="range-output">
|
|
144
|
-
<span>Bass</span>
|
|
145
|
-
<input type="range" min="0" max="100" value="50">
|
|
146
|
-
</label>
|
|
147
|
-
<label class="range-output">
|
|
148
|
-
<span>Treble</span>
|
|
149
|
-
<input type="range" min="0" max="100" value="60">
|
|
150
|
-
</label>
|
|
151
|
-
</div>
|
|
152
|
-
</section>
|
|
153
|
-
`;
|
|
154
|
-
|
|
155
|
-
InlineOutputMode.storyName = 'Inline Output (range-output class)';
|
|
156
|
-
|
|
157
|
-
export const AudioControlsExample = () => html`
|
|
158
|
-
${rangeSliderStoryStyles}
|
|
159
|
-
<article class="card range-slider-section range-slider-section--wide range-slider-card">
|
|
160
|
-
<div>
|
|
161
|
-
<h3>Audio Controls</h3>
|
|
162
|
-
<p class="range-slider-description">
|
|
163
|
-
Complete example using <code>range-output</code> class for a real-world audio control interface.
|
|
164
|
-
</p>
|
|
165
|
-
</div>
|
|
166
|
-
<div class="range-slider-form">
|
|
167
|
-
<label class="range-output">
|
|
168
|
-
<span>Master Volume</span>
|
|
169
|
-
<input type="range" min="0" max="100" value="75">
|
|
170
|
-
</label>
|
|
171
|
-
<label class="range-output">
|
|
172
|
-
<span>Bass</span>
|
|
173
|
-
<input type="range" min="0" max="100" value="50">
|
|
174
|
-
</label>
|
|
175
|
-
<label class="range-output">
|
|
176
|
-
<span>Treble</span>
|
|
177
|
-
<input type="range" min="0" max="100" value="60">
|
|
178
|
-
</label>
|
|
179
|
-
<label class="range-output">
|
|
180
|
-
<span>Balance</span>
|
|
181
|
-
<input type="range" min="-50" max="50" value="0">
|
|
182
|
-
</label>
|
|
183
|
-
</div>
|
|
184
|
-
</article>
|
|
185
|
-
`;
|
|
186
|
-
|
|
187
|
-
AudioControlsExample.storyName = 'Real-world Example (Audio Controls)';
|
|
188
|
-
|
|
189
|
-
export const ComparisonView = () => html`
|
|
190
|
-
${rangeSliderStoryStyles}
|
|
191
|
-
<div class="range-slider-section range-slider-section--comparison">
|
|
192
|
-
<article class="card range-slider-card">
|
|
193
|
-
<div>
|
|
194
|
-
<h3>Standard Mode</h3>
|
|
195
|
-
<p class="range-slider-description">
|
|
196
|
-
Floating bubble appears on hover/focus. Best for simple forms.
|
|
197
|
-
</p>
|
|
198
|
-
</div>
|
|
199
|
-
<div class="range-slider-form">
|
|
200
|
-
<label>
|
|
201
|
-
<span>Volume</span>
|
|
202
|
-
<input type="range" min="0" max="100" value="75">
|
|
203
|
-
</label>
|
|
204
|
-
<label>
|
|
205
|
-
<span>Brightness</span>
|
|
206
|
-
<input type="range" min="0" max="100" value="50">
|
|
207
|
-
</label>
|
|
208
|
-
</div>
|
|
209
|
-
</article>
|
|
210
|
-
|
|
211
|
-
<article class="card range-slider-card">
|
|
212
|
-
<div>
|
|
213
|
-
<h3>Inline Output Mode</h3>
|
|
214
|
-
<p class="range-slider-description">
|
|
215
|
-
Persistent value display. Best for settings and controls.
|
|
216
|
-
</p>
|
|
217
|
-
</div>
|
|
218
|
-
<div class="range-slider-form">
|
|
219
|
-
<label class="range-output">
|
|
220
|
-
<span>Volume</span>
|
|
221
|
-
<input type="range" min="0" max="100" value="75">
|
|
222
|
-
</label>
|
|
223
|
-
<label class="range-output">
|
|
224
|
-
<span>Brightness</span>
|
|
225
|
-
<input type="range" min="0" max="100" value="50">
|
|
226
|
-
</label>
|
|
227
|
-
</div>
|
|
228
|
-
</article>
|
|
229
|
-
</div>
|
|
230
|
-
`;
|
|
231
|
-
|
|
232
|
-
ComparisonView.storyName = 'Side-by-side Comparison';
|
|
1
|
+
import { html } from 'lit';
|
|
2
|
+
|
|
3
|
+
const rangeSliderStoryStyles = html`
|
|
4
|
+
<style>
|
|
5
|
+
.range-slider-section {
|
|
6
|
+
max-width: 400px;
|
|
7
|
+
display: grid;
|
|
8
|
+
gap: var(--spacing-4);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.range-slider-section--wide {
|
|
12
|
+
max-width: 500px;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.range-slider-section--comparison {
|
|
16
|
+
display: grid;
|
|
17
|
+
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
18
|
+
gap: var(--spacing-6);
|
|
19
|
+
max-width: 1000px;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.range-slider-description {
|
|
23
|
+
color: var(--color-text-secondary);
|
|
24
|
+
font-size: 0.875rem;
|
|
25
|
+
margin: 0 0 var(--spacing-4);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.range-slider-form {
|
|
29
|
+
display: flex;
|
|
30
|
+
flex-direction: column;
|
|
31
|
+
gap: var(--spacing-4);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.range-slider-actions {
|
|
35
|
+
margin-top: var(--spacing-2);
|
|
36
|
+
align-self: flex-start;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.range-slider-card {
|
|
40
|
+
display: grid;
|
|
41
|
+
gap: var(--spacing-4);
|
|
42
|
+
}
|
|
43
|
+
</style>
|
|
44
|
+
`;
|
|
45
|
+
|
|
46
|
+
export default {
|
|
47
|
+
title: 'Enhancements/Range Sliders',
|
|
48
|
+
tags: ['range', 'slider', 'input', 'forms', 'interaction'],
|
|
49
|
+
parameters: {
|
|
50
|
+
pds: {
|
|
51
|
+
tags: ['range', 'slider', 'input', 'forms', 'interaction', 'enhancement']
|
|
52
|
+
},
|
|
53
|
+
docs: {
|
|
54
|
+
description: {
|
|
55
|
+
component: `Enhanced range inputs with two display modes:
|
|
56
|
+
|
|
57
|
+
**Standard Mode** (default): Floating bubble that appears on interaction.
|
|
58
|
+
|
|
59
|
+
**Inline Output Mode**: Add \`range-output\` class to the label for persistent inline value display using semantic \`<output>\` element.
|
|
60
|
+
|
|
61
|
+
Both modes automatically generate proper ARIA attributes and use the \`<output>\` tag for accessibility.`
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export const StandardFloatingBubble = () => html`
|
|
68
|
+
${rangeSliderStoryStyles}
|
|
69
|
+
<section class="range-slider-section">
|
|
70
|
+
<p class="range-slider-description">
|
|
71
|
+
Default behavior: A floating bubble appears when you interact with the slider.
|
|
72
|
+
</p>
|
|
73
|
+
<label>
|
|
74
|
+
<span>Volume</span>
|
|
75
|
+
<input type="range" min="0" max="100" value="50">
|
|
76
|
+
</label>
|
|
77
|
+
</section>
|
|
78
|
+
`;
|
|
79
|
+
|
|
80
|
+
StandardFloatingBubble.storyName = 'Standard (Floating Bubble)';
|
|
81
|
+
|
|
82
|
+
export const MultipleRanges = () => html`
|
|
83
|
+
${rangeSliderStoryStyles}
|
|
84
|
+
<form
|
|
85
|
+
class="range-slider-section range-slider-form"
|
|
86
|
+
@submit="${(event) => {
|
|
87
|
+
event.preventDefault();
|
|
88
|
+
toastFormData(new FormData(event.target));
|
|
89
|
+
}}"
|
|
90
|
+
>
|
|
91
|
+
<label>
|
|
92
|
+
<span>Brightness</span>
|
|
93
|
+
<input type="range" name="brightness" min="0" max="100" value="75">
|
|
94
|
+
</label>
|
|
95
|
+
<label>
|
|
96
|
+
<span>Contrast</span>
|
|
97
|
+
<input type="range" name="contrast" min="0" max="100" value="50">
|
|
98
|
+
</label>
|
|
99
|
+
<label>
|
|
100
|
+
<span>Saturation</span>
|
|
101
|
+
<input type="range" name="saturation" min="0" max="100" value="60">
|
|
102
|
+
</label>
|
|
103
|
+
<label>
|
|
104
|
+
<span>Temperature</span>
|
|
105
|
+
<input type="range" name="temperature" min="-100" max="100" value="0">
|
|
106
|
+
</label>
|
|
107
|
+
<button type="submit" class="btn-primary range-slider-actions">Apply Settings</button>
|
|
108
|
+
</form>
|
|
109
|
+
`;
|
|
110
|
+
|
|
111
|
+
export const CustomSteps = () => html`
|
|
112
|
+
${rangeSliderStoryStyles}
|
|
113
|
+
<form
|
|
114
|
+
class="range-slider-section range-slider-form"
|
|
115
|
+
@submit="${(event) => {
|
|
116
|
+
event.preventDefault();
|
|
117
|
+
toastFormData(new FormData(event.target));
|
|
118
|
+
}}"
|
|
119
|
+
>
|
|
120
|
+
<label>
|
|
121
|
+
<span>Opacity (10% steps)</span>
|
|
122
|
+
<input type="range" name="opacity" min="0" max="100" value="100" step="10">
|
|
123
|
+
</label>
|
|
124
|
+
<label>
|
|
125
|
+
<span>Font Size (0.25rem steps)</span>
|
|
126
|
+
<input type="range" name="fontSize" min="0.5" max="3" value="1" step="0.25">
|
|
127
|
+
</label>
|
|
128
|
+
<button type="submit" class="btn-primary range-slider-actions">Apply Settings</button>
|
|
129
|
+
</form>
|
|
130
|
+
`;
|
|
131
|
+
|
|
132
|
+
export const InlineOutputMode = () => html`
|
|
133
|
+
${rangeSliderStoryStyles}
|
|
134
|
+
<section class="range-slider-section range-slider-section--wide">
|
|
135
|
+
<p class="range-slider-description">
|
|
136
|
+
Add the <code>range-output</code> class to automatically create an inline output display.
|
|
137
|
+
</p>
|
|
138
|
+
<div class="range-slider-form">
|
|
139
|
+
<label class="range-output">
|
|
140
|
+
<span>Master Volume</span>
|
|
141
|
+
<input type="range" min="0" max="100" value="75">
|
|
142
|
+
</label>
|
|
143
|
+
<label class="range-output">
|
|
144
|
+
<span>Bass</span>
|
|
145
|
+
<input type="range" min="0" max="100" value="50">
|
|
146
|
+
</label>
|
|
147
|
+
<label class="range-output">
|
|
148
|
+
<span>Treble</span>
|
|
149
|
+
<input type="range" min="0" max="100" value="60">
|
|
150
|
+
</label>
|
|
151
|
+
</div>
|
|
152
|
+
</section>
|
|
153
|
+
`;
|
|
154
|
+
|
|
155
|
+
InlineOutputMode.storyName = 'Inline Output (range-output class)';
|
|
156
|
+
|
|
157
|
+
export const AudioControlsExample = () => html`
|
|
158
|
+
${rangeSliderStoryStyles}
|
|
159
|
+
<article class="card range-slider-section range-slider-section--wide range-slider-card">
|
|
160
|
+
<div>
|
|
161
|
+
<h3>Audio Controls</h3>
|
|
162
|
+
<p class="range-slider-description">
|
|
163
|
+
Complete example using <code>range-output</code> class for a real-world audio control interface.
|
|
164
|
+
</p>
|
|
165
|
+
</div>
|
|
166
|
+
<div class="range-slider-form">
|
|
167
|
+
<label class="range-output">
|
|
168
|
+
<span>Master Volume</span>
|
|
169
|
+
<input type="range" min="0" max="100" value="75">
|
|
170
|
+
</label>
|
|
171
|
+
<label class="range-output">
|
|
172
|
+
<span>Bass</span>
|
|
173
|
+
<input type="range" min="0" max="100" value="50">
|
|
174
|
+
</label>
|
|
175
|
+
<label class="range-output">
|
|
176
|
+
<span>Treble</span>
|
|
177
|
+
<input type="range" min="0" max="100" value="60">
|
|
178
|
+
</label>
|
|
179
|
+
<label class="range-output">
|
|
180
|
+
<span>Balance</span>
|
|
181
|
+
<input type="range" min="-50" max="50" value="0">
|
|
182
|
+
</label>
|
|
183
|
+
</div>
|
|
184
|
+
</article>
|
|
185
|
+
`;
|
|
186
|
+
|
|
187
|
+
AudioControlsExample.storyName = 'Real-world Example (Audio Controls)';
|
|
188
|
+
|
|
189
|
+
export const ComparisonView = () => html`
|
|
190
|
+
${rangeSliderStoryStyles}
|
|
191
|
+
<div class="range-slider-section range-slider-section--comparison">
|
|
192
|
+
<article class="card range-slider-card">
|
|
193
|
+
<div>
|
|
194
|
+
<h3>Standard Mode</h3>
|
|
195
|
+
<p class="range-slider-description">
|
|
196
|
+
Floating bubble appears on hover/focus. Best for simple forms.
|
|
197
|
+
</p>
|
|
198
|
+
</div>
|
|
199
|
+
<div class="range-slider-form">
|
|
200
|
+
<label>
|
|
201
|
+
<span>Volume</span>
|
|
202
|
+
<input type="range" min="0" max="100" value="75">
|
|
203
|
+
</label>
|
|
204
|
+
<label>
|
|
205
|
+
<span>Brightness</span>
|
|
206
|
+
<input type="range" min="0" max="100" value="50">
|
|
207
|
+
</label>
|
|
208
|
+
</div>
|
|
209
|
+
</article>
|
|
210
|
+
|
|
211
|
+
<article class="card range-slider-card">
|
|
212
|
+
<div>
|
|
213
|
+
<h3>Inline Output Mode</h3>
|
|
214
|
+
<p class="range-slider-description">
|
|
215
|
+
Persistent value display. Best for settings and controls.
|
|
216
|
+
</p>
|
|
217
|
+
</div>
|
|
218
|
+
<div class="range-slider-form">
|
|
219
|
+
<label class="range-output">
|
|
220
|
+
<span>Volume</span>
|
|
221
|
+
<input type="range" min="0" max="100" value="75">
|
|
222
|
+
</label>
|
|
223
|
+
<label class="range-output">
|
|
224
|
+
<span>Brightness</span>
|
|
225
|
+
<input type="range" min="0" max="100" value="50">
|
|
226
|
+
</label>
|
|
227
|
+
</div>
|
|
228
|
+
</article>
|
|
229
|
+
</div>
|
|
230
|
+
`;
|
|
231
|
+
|
|
232
|
+
ComparisonView.storyName = 'Side-by-side Comparison';
|