@@ -21,51 +21,37 @@ qwik-ui add modal
21
21
```
22
22
23
23
``` tsx
24
- import {
25
- PropsOf ,
26
- Signal ,
27
- Slot ,
28
- component$ ,
29
- createContextId ,
30
- useContextProvider ,
31
- useSignal ,
32
- } from ' @builder.io/qwik' ;
24
+ import { PropsOf , Slot , component$ } from ' @builder.io/qwik' ;
33
25
import { Modal as HeadlessModal } from ' @qwik-ui/headless' ;
34
26
import { cn } from ' @qwik-ui/utils' ;
35
27
36
- const Context = createContextId < Signal < boolean >>( ' modal-context ' ) ;
28
+ const Root = HeadlessModal . Root ;
37
29
38
- const Root = component$ <PropsOf <typeof HeadlessModal .Root >>(({ ... props }) => {
39
- const showSig = useSignal (false );
40
- useContextProvider (Context , showSig );
41
- return (
42
- <HeadlessModal.Root bind :show = { showSig } { ... props } >
43
- <Slot />
44
- </HeadlessModal.Root >
45
- );
46
- });
30
+ const Trigger = HeadlessModal .Trigger ;
47
31
48
- const Panel = component$ (() => {
32
+ const Close = HeadlessModal .Close ;
33
+
34
+ const Panel = component$ <PropsOf <typeof HeadlessModal .Panel >>((props ) => {
49
35
return (
50
- <HeadlessModal.Panel class = " max-w-sm rounded-base border border-white bg-background p-6 text-foreground shadow-md transition-all duration-300 backdrop:brightness-50 backdrop:backdrop-blur-sm backdrop:transition-all backdrop:duration-300 data-[state=open]:appear data-[state=closed]:disappear backdrop:data-[state=open]:appear backdrop:data-[state=closed]:disappear" >
36
+ <HeadlessModal.Panel
37
+ { ... props }
38
+ class = { cn (
39
+ ' max-w-sm rounded-base border bg-background p-6 text-foreground shadow-md backdrop:brightness-50 backdrop:backdrop-blur-sm' ,
40
+ ' data-[closed]:duration-300 data-[open]:duration-300 data-[open]:animate-in data-[closing]:animate-out data-[closing]:fade-out data-[open]:fade-in' ,
41
+ ' backdrop:data-[closed]:duration-300 backdrop:data-[open]:duration-300 backdrop:data-[open]:animate-in backdrop:data-[closing]:animate-out backdrop:data-[closing]:fade-out backdrop:data-[open]:fade-in' ,
42
+ props .class ,
43
+ )}
44
+ >
51
45
<Slot />
52
46
</HeadlessModal.Panel >
53
47
);
54
48
});
55
49
56
- const Trigger = component$ <PropsOf <typeof HeadlessModal .Trigger >>(({ ... props }) => {
57
- return (
58
- <HeadlessModal.Trigger >
59
- <Slot { ... props } />
60
- </HeadlessModal.Trigger >
61
- );
62
- });
63
-
64
50
const Title = component$ <PropsOf <' h2' >>(({ ... props }) => {
65
51
return (
66
52
<HeadlessModal.Title
67
53
{ ... props }
68
- class = { cn (' flex flex-col space-y-1.5 text-center sm:text-left ' , props .class )}
54
+ class = { cn (' text-lg font-semibold tracking-tight ' , props .class )}
69
55
>
70
56
<Slot />
71
57
</HeadlessModal.Title >
@@ -74,60 +60,46 @@ const Title = component$<PropsOf<'h2'>>(({ ...props }) => {
74
60
75
61
const Description = component$ <PropsOf <' p' >>(({ ... props }) => {
76
62
return (
77
- <HeadlessModal.Description { ... props } class = { cn (' text-sm font-light' , props .class )} >
63
+ <HeadlessModal.Description
64
+ { ... props }
65
+ class = { cn (' text-sm text-muted-foreground' , props .class )}
66
+ >
78
67
<Slot />
79
68
</HeadlessModal.Description >
80
69
);
81
70
});
82
71
83
72
export const Modal = {
84
73
Root ,
85
- Panel ,
86
74
Trigger ,
75
+ Close ,
76
+ Panel ,
87
77
Title ,
88
78
Description ,
89
- Context ,
90
79
};
91
80
```
92
81
93
82
## Usage
94
83
95
84
``` tsx
96
- import { Button , Input , Label , Modal } from ' ~/components/ui' ;
85
+ import { Button , Modal } from ' ~/components/ui' ;
97
86
```
98
87
99
88
``` tsx
100
89
<Modal.Root bind :show = { show } >
101
90
<Modal.Trigger >Open modal</Modal.Trigger >
102
91
<Modal.Panel >
103
- <Modal.Title class = " text-lg font-bold" >Edit Profile</Modal.Title >
104
- <Modal.Description class = " text-sm font-light" >
105
- Make changes to your profile here. Click save when you're done.
106
- </Modal.Description >
107
- <div class = " grid gap-4 py-4" >
108
- <div class = " grid grid-cols-4 items-center gap-4" >
109
- <Label for = " name" class = " text-right" >
110
- Name
111
- </Label >
112
- <Input name = " name" id = " name" defaultValue = " Pedro Duarte" class = " col-span-3" />
113
- </div >
114
- <div class = " grid grid-cols-4 items-center gap-4" >
115
- <Label for = " username" class = " text-right" >
116
- Username
117
- </Label >
118
- <Input
119
- name = " username"
120
- id = " username"
121
- defaultValue = " @peduarte"
122
- class = " col-span-3"
123
- />
124
- </div >
125
- </div >
92
+ <Modal.Title >Title</Modal.Title >
93
+ <Modal.Description >Description</Modal.Description >
94
+ <div >...</div >
126
95
<footer >
127
- <Button onClick$ = { () => (show .value = false )} type = " submit " >
128
- Save changes
96
+ <Button look = " primary " onClick$ = { () => (show .value = false )} >
97
+ Save
129
98
</Button >
130
99
</footer >
100
+ <Modal.Close >
101
+ <LuX class = " h-5 w-5" />
102
+ </Modal.Close >
131
103
</Modal.Panel >
132
104
</Modal.Root >
133
105
```
0 commit comments