1
1
import type { Meta , StoryFn } from '@storybook/react' ;
2
- import React , { useRef , useState } from 'react' ;
2
+ import React , { useEffect } from 'react' ;
3
3
4
4
import { Button , Paragraph } from '../..' ;
5
5
@@ -17,84 +17,69 @@ export default {
17
17
} as Meta ;
18
18
19
19
export const Preview : StoryFn < typeof Popover > = ( args ) => {
20
- const buttonRef = useRef < HTMLButtonElement | null > ( null ) ;
21
- const [ open , setOpen ] = useState ( false ) ;
22
-
23
20
return (
24
- < >
25
- < Button
26
- ref = { buttonRef }
27
- onClick = { ( ) => setOpen ( ! open ) }
28
- aria-expanded = { open }
29
- >
30
- My trigger
31
- </ Button >
32
- < Popover
33
- { ...args }
34
- open = { open || args . open }
35
- onClose = { ( ) => setOpen ( false ) }
36
- anchorEl = { buttonRef . current }
37
- >
38
- < Popover . Content > popover content</ Popover . Content >
39
- </ Popover >
40
- </ >
21
+ < Popover { ...args } >
22
+ < Popover . Trigger > My trigger!</ Popover . Trigger >
23
+ < Popover . Content > popover content</ Popover . Content >
24
+ </ Popover >
41
25
) ;
42
26
} ;
43
27
44
28
Preview . args = {
45
29
placement : 'top' ,
46
30
variant : 'default' ,
47
- open : false ,
48
31
size : 'medium' ,
32
+ onOpenChange : ( ) => { } ,
49
33
} ;
50
34
51
35
Preview . decorators = [ marginDecorator ] ;
52
36
53
37
export const Variants : StoryFn < typeof Popover > = ( ) => {
54
- const buttonRef = useRef < HTMLButtonElement | null > ( null ) ;
55
- const [ open , setOpen ] = useState ( false ) ;
38
+ const [ open , setOpen ] = React . useState ( false ) ;
56
39
57
- React . useEffect ( ( ) => {
40
+ useEffect ( ( ) => {
58
41
setOpen ( true ) ;
59
42
} , [ ] ) ;
60
43
61
44
return (
62
45
< >
63
- < Button
64
- ref = { buttonRef }
65
- aria-expanded = { open }
66
- >
67
- My trigger
68
- </ Button >
69
46
< Popover
70
- anchorEl = { buttonRef . current }
71
47
open = { open }
72
48
placement = 'top'
73
49
>
50
+ < Popover . Trigger asChild >
51
+ < span > popover</ span >
52
+ </ Popover . Trigger >
74
53
< Popover . Content > default</ Popover . Content >
75
54
</ Popover >
76
55
< Popover
77
- anchorEl = { buttonRef . current }
78
56
open = { open }
79
- placement = 'right '
57
+ placement = 'bottom '
80
58
variant = 'danger'
81
59
>
60
+ < Popover . Trigger asChild >
61
+ < span > popover</ span >
62
+ </ Popover . Trigger >
82
63
< Popover . Content > danger</ Popover . Content >
83
64
</ Popover >
84
65
< Popover
85
- anchorEl = { buttonRef . current }
86
66
open = { open }
87
- placement = 'bottom '
67
+ placement = 'top '
88
68
variant = 'info'
89
69
>
70
+ < Popover . Trigger asChild >
71
+ < span > popover</ span >
72
+ </ Popover . Trigger >
90
73
< Popover . Content > info</ Popover . Content >
91
74
</ Popover >
92
75
< Popover
93
- anchorEl = { buttonRef . current }
94
76
open = { open }
95
- placement = 'left '
77
+ placement = 'bottom '
96
78
variant = 'warning'
97
79
>
80
+ < Popover . Trigger asChild >
81
+ < span > popover</ span >
82
+ </ Popover . Trigger >
98
83
< Popover . Content > warning</ Popover . Content >
99
84
</ Popover >
100
85
</ >
@@ -103,25 +88,18 @@ export const Variants: StoryFn<typeof Popover> = () => {
103
88
104
89
Variants . decorators = [ marginDecorator ] ;
105
90
106
- export const InteractiveContent : StoryFn < typeof Popover > = ( ) => {
107
- const buttonRef = useRef < HTMLButtonElement | null > ( null ) ;
108
- const [ open , setOpen ] = useState ( false ) ;
91
+ export const Controlled : StoryFn < typeof Popover > = ( ) => {
92
+ const [ open , setOpen ] = React . useState ( false ) ;
109
93
110
94
return (
111
95
< >
112
- < Button
113
- ref = { buttonRef }
114
- onClick = { ( ) => setOpen ( ! open ) }
115
- aria-expanded = { open }
116
- >
117
- My trigger
118
- </ Button >
119
96
< Popover
120
- anchorEl = { buttonRef . current }
121
- placement = 'top'
122
97
open = { open }
123
98
onClose = { ( ) => setOpen ( false ) }
124
99
>
100
+ < Popover . Trigger onClick = { ( ) => setOpen ( ! open ) } >
101
+ My trigger
102
+ </ Popover . Trigger >
125
103
< Popover . Content >
126
104
< Paragraph > Er du sikker på at du vil slette?</ Paragraph >
127
105
< Button
@@ -137,30 +115,38 @@ export const InteractiveContent: StoryFn<typeof Popover> = () => {
137
115
) ;
138
116
} ;
139
117
140
- InteractiveContent . decorators = [ marginDecorator ] ;
118
+ Controlled . decorators = [ marginDecorator ] ;
141
119
142
120
export const InPortal = ( ) => {
143
- const buttonRef = useRef < HTMLButtonElement | null > ( null ) ;
144
- const [ open , setOpen ] = useState ( false ) ;
121
+ return (
122
+ < Popover portal >
123
+ < Popover . Trigger > My trigger</ Popover . Trigger >
124
+ < Popover . Content > popover content</ Popover . Content >
125
+ </ Popover >
126
+ ) ;
127
+ } ;
128
+
129
+ export const AnchorEl = ( ) => {
130
+ const anchorEl = React . useRef < HTMLButtonElement > ( null ) ;
131
+ const [ open , setOpen ] = React . useState ( false ) ;
145
132
146
133
return (
147
134
< >
148
135
< Button
149
- ref = { buttonRef }
136
+ ref = { anchorEl }
150
137
onClick = { ( ) => setOpen ( ! open ) }
151
- aria-expanded = { open }
152
138
>
153
139
My trigger
154
140
</ Button >
155
141
< Popover
156
- anchorEl = { buttonRef . current }
157
- placement = 'top'
158
142
open = { open }
159
143
onClose = { ( ) => setOpen ( false ) }
160
- portal
144
+ anchorEl = { anchorEl . current }
161
145
>
162
146
< Popover . Content > popover content</ Popover . Content >
163
147
</ Popover >
164
148
</ >
165
149
) ;
166
150
} ;
151
+
152
+ AnchorEl . decorators = [ marginDecorator ] ;
0 commit comments