@@ -3,21 +3,30 @@ import { userEvent, within } from "@storybook/testing-library";
33import DxcDropdown from "./Dropdown" ;
44import Title from "../../.storybook/components/Title" ;
55import ExampleContainer from "../../.storybook/components/ExampleContainer" ;
6+ import DropdownMenu from "./DropdownMenu" ;
7+ import DxcCheckbox from "../checkbox/Checkbox" ;
8+ import DxcTextInput from "../text-input/TextInput" ;
9+ import { Option } from "./types" ;
10+
611
712export default {
813 title : "Dropdown" ,
914 component : DxcDropdown ,
1015} ;
1116
17+ const hamburguerIcon = (
18+ < svg xmlns = "http://www.w3.org/2000/svg" height = "20" width = "20" >
19+ < path d = "M3 14.5V13h14v1.5Zm0-3.75v-1.5h14v1.5ZM3 7V5.5h14V7Z" />
20+ </ svg >
21+ ) ;
1222const iconSVG = (
1323 < svg viewBox = "0 0 24 24" fill = "currentColor" >
1424 < path d = "M0 0h24v24H0z" fill = "none" />
1525 < path d = "M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" />
1626 </ svg >
1727) ;
18-
1928const iconSVGLarge = (
20- < svg enableBackground = "new 0 0 24 24" height = "48px " viewBox = "0 0 24 24" width = "48px " fill = "currentColor" >
29+ < svg enableBackground = "new 0 0 24 24" height = "48 " viewBox = "0 0 24 24" width = "48 " fill = "currentColor" >
2130 < g >
2231 < path d = "M0,0h24v24H0V0z" fill = "none" />
2332 < path d = "M0,0h24v24H0V0z" fill = "none" />
@@ -27,11 +36,13 @@ const iconSVGLarge = (
2736 </ g >
2837 </ svg >
2938) ;
39+ const iconUrl = "https://iconape.com/wp-content/files/yd/367773/svg/logo-linkedin-logo-icon-png-svg.png" ;
40+ const icons = [ iconSVG , iconSVGLarge , iconUrl ] ;
3041
31- const options : any = [
42+ const defaultOptions : Option [ ] = [
3243 {
3344 value : "1" ,
34- label : "Amazon with a very long text " ,
45+ label : "Amazon" ,
3546 } ,
3647 {
3748 value : "2" ,
@@ -41,19 +52,35 @@ const options: any = [
4152 value : "3" ,
4253 label : "Apple" ,
4354 } ,
55+ {
56+ value : "4" ,
57+ label : "Wallapop" ,
58+ } ,
59+ {
60+ value : "5" ,
61+ label : "Aliexpress" ,
62+ } ,
4463] ;
45-
46- const option : any = [
64+ const options : Option [ ] = [
4765 {
4866 value : "1" ,
67+ label : "Amazon with a very long text" ,
68+ } ,
69+ {
70+ value : "2" ,
4971 label : "Ebay" ,
5072 } ,
73+ {
74+ value : "3" ,
75+ label : "Apple" ,
76+ } ,
5177] ;
52-
53- const icons = [
54- iconSVG ,
55- iconSVGLarge ,
56- "https://iconape.com/wp-content/files/yd/367773/svg/logo-linkedin-logo-icon-png-svg.png" ,
78+ const optionWithIcon : Option [ ] = [
79+ {
80+ value : "1" ,
81+ label : "Ebay" ,
82+ icon : iconUrl ,
83+ } ,
5784] ;
5885
5986const optionsIcon : any = options . map ( ( op , i ) => ( { ...op , icon : icons [ i ] } ) ) ;
@@ -68,7 +95,7 @@ export const Chromatic = () => (
6895 < Title title = "Hovered" theme = "light" level = { 4 } />
6996 < DxcDropdown label = "Hovered" options = { options } onSelectOption = { ( value ) => { } } />
7097 </ ExampleContainer >
71- < ExampleContainer pseudoState = "pseudo-focus-visible " >
98+ < ExampleContainer pseudoState = "pseudo-focus" >
7299 < Title title = "Focused" theme = "light" level = { 4 } />
73100 < DxcDropdown label = "Focused" options = { options } onSelectOption = { ( value ) => { } } />
74101 </ ExampleContainer >
@@ -102,6 +129,10 @@ export const Chromatic = () => (
102129 < Title title = "Only icon" theme = "light" level = { 4 } />
103130 < DxcDropdown options = { options } onSelectOption = { ( value ) => { } } icon = { iconSVG } />
104131 </ ExampleContainer >
132+ < ExampleContainer >
133+ < Title title = "Only icon without caret" theme = "light" level = { 4 } />
134+ < DxcDropdown options = { options } onSelectOption = { ( value ) => { } } icon = { hamburguerIcon } caretHidden />
135+ </ ExampleContainer >
105136 < ExampleContainer >
106137 < Title title = "Large icon" theme = "light" level = { 4 } />
107138 < DxcDropdown label = "Large icon" options = { options } onSelectOption = { ( value ) => { } } icon = { iconSVGLarge } />
@@ -191,59 +222,91 @@ export const Chromatic = () => (
191222 </ >
192223) ;
193224
194- const DropdownWithOptions = ( ) => (
195- < ExampleContainer expanded >
196- < Title title = "Options" theme = "light" level = { 4 } />
197- < DxcDropdown label = "Options with icon" options = { optionsIcon } onSelectOption = { ( value ) => { } } />
198- </ ExampleContainer >
199- ) ;
200-
201- const DropdownHoverOption = ( ) => (
202- < ExampleContainer pseudoState = "pseudo-hover" expanded >
203- < Title title = "Hovered option" theme = "light" level = { 4 } />
204- < DxcDropdown label = "Hovered options" options = { option } onSelectOption = { ( value ) => { } } />
205- </ ExampleContainer >
206- ) ;
207-
208- const DropdownActiveOption = ( ) => (
209- < ExampleContainer pseudoState = "pseudo-active" expanded >
210- < Title title = "Actived option" theme = "light" level = { 4 } />
211- < DxcDropdown label = "Actived options" options = { option } onSelectOption = { ( value ) => { } } />
212- </ ExampleContainer >
213- ) ;
214-
215- const DropdownWithOptionsIconAfter = ( ) => (
216- < ExampleContainer expanded >
217- < Title title = "Icon after options" theme = "light" level = { 4 } />
218- < DxcDropdown
219- label = "Icon after options"
220- options = { optionsIcon }
221- onSelectOption = { ( value ) => { } }
222- optionsIconPosition = "after"
223- />
224- </ ExampleContainer >
225+ const DropdownListStates = ( ) => (
226+ < >
227+ < Title title = "Dropdown Menu" theme = "light" level = { 2 } />
228+ < Title title = "Default with opened menu" theme = "light" level = { 3 } />
229+ < ExampleContainer >
230+ < div style = { { display : "flex" , gap : "30px" , flexDirection : "column" , marginBottom : "80px" } } >
231+ < DxcDropdown label = "Select a platform" options = { defaultOptions } onSelectOption = { ( option ) => { } } size = "medium" />
232+ < DxcTextInput label = "Your name" onChange = { ( ) => { } } />
233+ < DxcCheckbox
234+ label = "You understand the selection and give your consent"
235+ onChange = { ( ) => { } }
236+ labelPosition = "after"
237+ />
238+ </ div >
239+ </ ExampleContainer >
240+ < Title title = "Option states" theme = "light" level = { 3 } />
241+ < ExampleContainer pseudoState = "pseudo-hover" >
242+ < Title title = "Hovered option" theme = "light" level = { 4 } />
243+ < DropdownMenu
244+ id = "x"
245+ dropdownId = "dX"
246+ iconsPosition = "before"
247+ visualFocusIndex = { - 1 }
248+ optionOnClick = { ( option ) => { } }
249+ onKeyDown = { ( e ) => { } }
250+ options = { optionWithIcon }
251+ styles = { { width : 240 } }
252+ />
253+ </ ExampleContainer >
254+ < ExampleContainer pseudoState = "pseudo-active" >
255+ < Title title = "Active option" theme = "light" level = { 4 } />
256+ < DropdownMenu
257+ id = "x"
258+ dropdownId = "dX"
259+ iconsPosition = "before"
260+ visualFocusIndex = { - 1 }
261+ optionOnClick = { ( option ) => { } }
262+ onKeyDown = { ( e ) => { } }
263+ options = { optionWithIcon }
264+ styles = { { width : 240 } }
265+ />
266+ </ ExampleContainer >
267+ < ExampleContainer >
268+ < Title title = "Focused option" theme = "light" level = { 4 } />
269+ < DropdownMenu
270+ id = "x"
271+ dropdownId = "dX"
272+ iconsPosition = "before"
273+ visualFocusIndex = { 0 }
274+ optionOnClick = { ( option ) => { } }
275+ onKeyDown = { ( e ) => { } }
276+ options = { options }
277+ styles = { { width : 240 } }
278+ />
279+ </ ExampleContainer >
280+ < Title title = "Icons" theme = "light" level = { 3 } />
281+ < ExampleContainer >
282+ < Title title = "Before" theme = "light" level = { 4 } />
283+ < DropdownMenu
284+ id = "x"
285+ dropdownId = "dX"
286+ iconsPosition = "before"
287+ visualFocusIndex = { - 1 }
288+ optionOnClick = { ( option ) => { } }
289+ onKeyDown = { ( e ) => { } }
290+ options = { optionsIcon }
291+ styles = { { width : 240 } }
292+ />
293+ < Title title = "After" theme = "light" level = { 4 } />
294+ < DropdownMenu
295+ id = "x"
296+ dropdownId = "dX"
297+ iconsPosition = "after"
298+ visualFocusIndex = { - 1 }
299+ optionOnClick = { ( option ) => { } }
300+ onKeyDown = { ( e ) => { } }
301+ options = { optionsIcon }
302+ styles = { { width : 240 } }
303+ />
304+ </ ExampleContainer >
305+ </ >
225306) ;
226307
227- export const DropdownOptions = DropdownWithOptions . bind ( { } ) ;
228- DropdownOptions . play = async ( { canvasElement } ) => {
229- const canvas = within ( canvasElement ) ;
230- await userEvent . click ( canvas . getByRole ( "button" ) ) ;
231- } ;
232-
233- export const DropdownHoveredOption = DropdownHoverOption . bind ( { } ) ;
234- DropdownHoveredOption . play = async ( { canvasElement } ) => {
235- const canvas = within ( canvasElement ) ;
236- await userEvent . click ( canvas . getByRole ( "button" ) ) ;
237- } ;
238-
239- export const DropdownActivedOption = DropdownActiveOption . bind ( { } ) ;
240- DropdownActivedOption . play = async ( { canvasElement } ) => {
241- const canvas = within ( canvasElement ) ;
242- await userEvent . click ( canvas . getByRole ( "button" ) ) ;
243- } ;
244-
245- export const DropdownOptionsIconAfter = DropdownWithOptionsIconAfter . bind ( { } ) ;
246- DropdownOptionsIconAfter . play = async ( { canvasElement } ) => {
308+ export const DropdownMenuStates = DropdownListStates . bind ( { } ) ;
309+ DropdownMenuStates . play = async ( { canvasElement } ) => {
247310 const canvas = within ( canvasElement ) ;
248311 await userEvent . click ( canvas . getByRole ( "button" ) ) ;
249312} ;
0 commit comments