compote-ui 0.46.0 → 0.46.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.
@@ -6,23 +6,58 @@
6
6
 
7
7
  interface Props extends DrawerContentBaseProps {
8
8
  class?: ClassValue;
9
- }
10
-
11
- let { class: className, children, draggable = false, ...rest }: Props = $props();
9
+ backdropClass?: ClassValue;
10
+ positionerClass?: ClassValue;
11
+ maxWidth?: string;
12
+ maxHeight?: string;
13
+ }
14
+
15
+ let {
16
+ class: className,
17
+ backdropClass,
18
+ positionerClass,
19
+ maxWidth,
20
+ maxHeight,
21
+ children,
22
+ draggable = false,
23
+ ...rest
24
+ }: Props = $props();
12
25
  </script>
13
26
 
14
- <Drawer.Content
15
- {...rest}
16
- {draggable}
27
+ <Drawer.Backdrop
17
28
  class={cn(
18
- 'pointer-events-auto relative flex h-full max-h-[96svh] w-full flex-col bg-surface-1 shadow-xl outline-none',
19
- 'data-[swipe-direction=left]:max-h-none data-[swipe-direction=left]:max-w-100',
20
- 'data-[swipe-direction=right]:max-h-none data-[swipe-direction=right]:max-w-100',
21
- className
29
+ 'fixed inset-0 z-50 bg-black/50',
30
+ 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0',
31
+ 'data-[state=open]:animate-in data-[state=open]:fade-in-0',
32
+ backdropClass
33
+ )}
34
+ />
35
+ <Drawer.Positioner
36
+ class={cn(
37
+ 'fixed inset-0 z-50 flex items-end justify-center',
38
+ 'data-[swipe-direction=left]:items-stretch data-[swipe-direction=left]:justify-start',
39
+ 'data-[swipe-direction=right]:items-stretch data-[swipe-direction=right]:justify-end',
40
+ 'data-[swipe-direction=up]:items-start',
41
+ positionerClass
22
42
  )}
23
43
  >
24
- {@render children?.()}
25
- </Drawer.Content>
44
+ <Drawer.Content
45
+ {...rest}
46
+ {draggable}
47
+ style={[
48
+ maxWidth && `--drawer-max-width:${maxWidth}`,
49
+ maxHeight && `--drawer-max-height:${maxHeight}`
50
+ ]
51
+ .filter(Boolean)
52
+ .join(';')}
53
+ class={cn(
54
+ 'pointer-events-auto relative flex h-full w-full flex-col bg-surface-1 shadow-xl outline-none',
55
+ className
56
+ )}
57
+ >
58
+ {@render children?.()}
59
+ </Drawer.Content>
60
+ </Drawer.Positioner>
26
61
 
27
62
  <style>
28
63
  /* Side drawers: grabber becomes an absolutely-positioned vertical strip on the open edge */
@@ -64,6 +99,24 @@
64
99
  height: 2.5rem;
65
100
  }
66
101
 
102
+ /* Bottom/top drawers: cap height, overridable via --drawer-max-height */
103
+ :global(
104
+ [data-scope='drawer'][data-part='content']:not([data-swipe-direction]),
105
+ [data-scope='drawer'][data-part='content'][data-swipe-direction='down'],
106
+ [data-scope='drawer'][data-part='content'][data-swipe-direction='up']
107
+ ) {
108
+ max-height: var(--drawer-max-height, 96svh);
109
+ }
110
+
111
+ /* Side drawers: constrain width, remove height cap — overridable via --drawer-max-width */
112
+ :global(
113
+ [data-scope='drawer'][data-part='content'][data-swipe-direction='left'],
114
+ [data-scope='drawer'][data-part='content'][data-swipe-direction='right']
115
+ ) {
116
+ max-width: var(--drawer-max-width, 25rem);
117
+ max-height: none;
118
+ }
119
+
67
120
  /* Bleed pseudo-element so background extends past rounded corners on the open edge */
68
121
  :global([data-scope='drawer'][data-part='content'])::after {
69
122
  content: '';
@@ -99,129 +152,60 @@
99
152
  height: auto;
100
153
  }
101
154
 
102
- /* Slide animations for bottom drawer (default) */
155
+ :global([data-scope='drawer'][data-part='content'][data-state='open']) {
156
+ animation-name: enter;
157
+ animation-duration: 500ms;
158
+ animation-fill-mode: both;
159
+ }
160
+ :global([data-scope='drawer'][data-part='content'][data-state='closed']) {
161
+ animation-name: exit;
162
+ animation-duration: 300ms;
163
+ animation-fill-mode: both;
164
+ }
165
+
103
166
  :global(
104
167
  [data-scope='drawer'][data-part='content']:not([data-swipe-direction])[data-state='open'],
105
168
  [data-scope='drawer'][data-part='content'][data-swipe-direction='down'][data-state='open']
106
169
  ) {
107
- animation: slide-in-bottom 0.5s cubic-bezier(0.32, 0.72, 0, 1);
170
+ --tw-enter-translate-y: 100%;
108
171
  }
109
-
110
172
  :global(
111
173
  [data-scope='drawer'][data-part='content']:not([data-swipe-direction])[data-state='closed'],
112
174
  [data-scope='drawer'][data-part='content'][data-swipe-direction='down'][data-state='closed']
113
175
  ) {
114
- animation: slide-out-bottom 0.3s cubic-bezier(0.4, 0, 0.2, 1);
176
+ --tw-exit-translate-y: 100%;
115
177
  }
116
178
 
117
- /* Slide animations for top drawer */
118
179
  :global(
119
180
  [data-scope='drawer'][data-part='content'][data-swipe-direction='up'][data-state='open']
120
181
  ) {
121
- animation: slide-in-top 0.5s cubic-bezier(0.32, 0.72, 0, 1);
182
+ --tw-enter-translate-y: -100%;
122
183
  }
123
-
124
184
  :global(
125
185
  [data-scope='drawer'][data-part='content'][data-swipe-direction='up'][data-state='closed']
126
186
  ) {
127
- animation: slide-out-top 0.3s cubic-bezier(0.4, 0, 0.2, 1);
187
+ --tw-exit-translate-y: -100%;
128
188
  }
129
189
 
130
- /* Slide animations for left drawer */
131
190
  :global(
132
191
  [data-scope='drawer'][data-part='content'][data-swipe-direction='left'][data-state='open']
133
192
  ) {
134
- animation: slide-in-left 0.5s cubic-bezier(0.32, 0.72, 0, 1);
193
+ --tw-enter-translate-x: -100%;
135
194
  }
136
-
137
195
  :global(
138
196
  [data-scope='drawer'][data-part='content'][data-swipe-direction='left'][data-state='closed']
139
197
  ) {
140
- animation: slide-out-left 0.3s cubic-bezier(0.4, 0, 0.2, 1);
198
+ --tw-exit-translate-x: -100%;
141
199
  }
142
200
 
143
- /* Slide animations for right drawer */
144
201
  :global(
145
202
  [data-scope='drawer'][data-part='content'][data-swipe-direction='right'][data-state='open']
146
203
  ) {
147
- animation: slide-in-right 0.5s cubic-bezier(0.32, 0.72, 0, 1);
204
+ --tw-enter-translate-x: 100%;
148
205
  }
149
-
150
206
  :global(
151
207
  [data-scope='drawer'][data-part='content'][data-swipe-direction='right'][data-state='closed']
152
208
  ) {
153
- animation: slide-out-right 0.3s cubic-bezier(0.4, 0, 0.2, 1);
154
- }
155
-
156
- @keyframes slide-in-bottom {
157
- from {
158
- transform: translate3d(0, 100%, 0);
159
- }
160
- to {
161
- transform: translate3d(var(--drawer-translate-x, 0), var(--drawer-translate-y, 0), 0);
162
- }
163
- }
164
-
165
- @keyframes slide-out-bottom {
166
- from {
167
- transform: translate3d(var(--drawer-translate-x, 0), var(--drawer-translate-y, 0), 0);
168
- }
169
- to {
170
- transform: translate3d(0, 100%, 0);
171
- }
172
- }
173
-
174
- @keyframes slide-in-top {
175
- from {
176
- transform: translate3d(0, -100%, 0);
177
- }
178
- to {
179
- transform: translate3d(var(--drawer-translate-x, 0), var(--drawer-translate-y, 0), 0);
180
- }
181
- }
182
-
183
- @keyframes slide-out-top {
184
- from {
185
- transform: translate3d(var(--drawer-translate-x, 0), var(--drawer-translate-y, 0), 0);
186
- }
187
- to {
188
- transform: translate3d(0, -100%, 0);
189
- }
190
- }
191
-
192
- @keyframes slide-in-left {
193
- from {
194
- transform: translate3d(-100%, 0, 0);
195
- }
196
- to {
197
- transform: translate3d(var(--drawer-translate-x, 0), var(--drawer-translate-y, 0), 0);
198
- }
199
- }
200
-
201
- @keyframes slide-out-left {
202
- from {
203
- transform: translate3d(var(--drawer-translate-x, 0), var(--drawer-translate-y, 0), 0);
204
- }
205
- to {
206
- transform: translate3d(-100%, 0, 0);
207
- }
208
- }
209
-
210
- @keyframes slide-in-right {
211
- from {
212
- transform: translate3d(100%, 0, 0);
213
- }
214
- to {
215
- transform: translate3d(var(--drawer-translate-x, 0), var(--drawer-translate-y, 0), 0);
216
- }
217
- }
218
-
219
- @keyframes slide-out-right {
220
- from {
221
- transform: translate3d(var(--drawer-translate-x, 0), var(--drawer-translate-y, 0), 0);
222
- }
223
- to {
224
- transform: translate3d(100%, 0, 0);
225
- }
209
+ --tw-exit-translate-x: 100%;
226
210
  }
227
211
  </style>
@@ -2,6 +2,10 @@ import type { DrawerContentBaseProps } from '@ark-ui/svelte/drawer';
2
2
  import type { ClassValue } from 'svelte/elements';
3
3
  interface Props extends DrawerContentBaseProps {
4
4
  class?: ClassValue;
5
+ backdropClass?: ClassValue;
6
+ positionerClass?: ClassValue;
7
+ maxWidth?: string;
8
+ maxHeight?: string;
5
9
  }
6
10
  declare const DrawerContent: import("svelte").Component<Props, {}, "">;
7
11
  type DrawerContent = ReturnType<typeof DrawerContent>;
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ import { Drawer } from '@ark-ui/svelte/drawer';
3
+ import type { DrawerDescriptionBaseProps } from '@ark-ui/svelte/drawer';
4
+ import type { ClassValue } from 'svelte/elements';
5
+ import { cn } from 'tailwind-variants';
6
+
7
+ interface Props extends DrawerDescriptionBaseProps {
8
+ class?: ClassValue;
9
+ }
10
+
11
+ let { class: className, children, ...rest }: Props = $props();
12
+ </script>
13
+
14
+ <Drawer.Description {...rest} class={cn('text-sm text-ink-dim', className)}>
15
+ {@render children?.()}
16
+ </Drawer.Description>
@@ -0,0 +1,8 @@
1
+ import type { DrawerDescriptionBaseProps } from '@ark-ui/svelte/drawer';
2
+ import type { ClassValue } from 'svelte/elements';
3
+ interface Props extends DrawerDescriptionBaseProps {
4
+ class?: ClassValue;
5
+ }
6
+ declare const DrawerDescription: import("svelte").Component<Props, {}, "">;
7
+ type DrawerDescription = ReturnType<typeof DrawerDescription>;
8
+ export default DrawerDescription;
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import type { ClassValue } from 'svelte/elements';
4
+ import { cn } from 'tailwind-variants';
5
+
6
+ interface Props {
7
+ class?: ClassValue;
8
+ children: Snippet;
9
+ }
10
+
11
+ let { class: className, children }: Props = $props();
12
+ </script>
13
+
14
+ <div class={cn('flex flex-col p-4 pr-11', className)}>
15
+ {@render children()}
16
+ </div>
@@ -0,0 +1,9 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { ClassValue } from 'svelte/elements';
3
+ interface Props {
4
+ class?: ClassValue;
5
+ children: Snippet;
6
+ }
7
+ declare const DrawerHeader: import("svelte").Component<Props, {}, "">;
8
+ type DrawerHeader = ReturnType<typeof DrawerHeader>;
9
+ export default DrawerHeader;
@@ -5,5 +5,7 @@ export { default as Positioner } from './drawer-positioner.svelte';
5
5
  export { default as Content } from './drawer-content.svelte';
6
6
  export { default as Grabber } from './drawer-grabber.svelte';
7
7
  export { default as GrabberIndicator } from './drawer-grabber-indicator.svelte';
8
+ export { default as Header } from './drawer-header.svelte';
8
9
  export { default as Title } from './drawer-title.svelte';
10
+ export { default as Description } from './drawer-description.svelte';
9
11
  export { default as CloseTrigger } from './drawer-close-trigger.svelte';
@@ -5,5 +5,7 @@ export { default as Positioner } from './drawer-positioner.svelte';
5
5
  export { default as Content } from './drawer-content.svelte';
6
6
  export { default as Grabber } from './drawer-grabber.svelte';
7
7
  export { default as GrabberIndicator } from './drawer-grabber-indicator.svelte';
8
+ export { default as Header } from './drawer-header.svelte';
8
9
  export { default as Title } from './drawer-title.svelte';
10
+ export { default as Description } from './drawer-description.svelte';
9
11
  export { default as CloseTrigger } from './drawer-close-trigger.svelte';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "compote-ui",
3
- "version": "0.46.0",
3
+ "version": "0.46.1",
4
4
  "license": "MIT",
5
5
  "scripts": {
6
6
  "dev": "vite dev --open",