shadcn-glass-ui 2.0.11 → 2.1.0
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/CHANGELOG.md +109 -5
- package/README.md +132 -43
- package/context7.json +2 -1
- package/dist/cli/index.cjs +1 -1
- package/dist/components.cjs +4 -4
- package/dist/components.d.ts +103 -29
- package/dist/components.js +1 -1
- package/dist/demo-screenshot-aurora.png +0 -0
- package/dist/demo-screenshot.png +0 -0
- package/dist/demo-screenshot.png.zip +0 -0
- package/dist/hooks.cjs +2 -2
- package/dist/index.cjs +5 -5
- package/dist/index.js +28 -28
- package/dist/index.js.map +1 -1
- package/dist/r/ai-card-glass.json +1 -1
- package/dist/r/avatar-glass.json +1 -1
- package/dist/r/badge-glass.json +1 -1
- package/dist/r/button-glass.json +1 -1
- package/dist/r/combobox-glass.json +1 -1
- package/dist/r/registry.json +2 -2
- package/dist/r/repository-card-glass.json +2 -1
- package/dist/r/slider-glass.json +4 -5
- package/dist/r/toggle-glass.json +2 -2
- package/dist/r/year-card-glass.json +1 -1
- package/dist/shadcn-glass-ui.css +1 -1
- package/dist/{theme-context-DNe_2vWJ.cjs → theme-context-BHXYJ4RE.cjs} +2 -2
- package/dist/{theme-context-DNe_2vWJ.cjs.map → theme-context-BHXYJ4RE.cjs.map} +1 -1
- package/dist/themes.cjs +1 -1
- package/dist/{trust-score-card-glass-Dgu46oWI.cjs → trust-score-card-glass-CGXmOIfq.cjs} +850 -150
- package/dist/trust-score-card-glass-CGXmOIfq.cjs.map +1 -0
- package/dist/{trust-score-card-glass-A7kas5OS.js → trust-score-card-glass-L9g0qamo.js} +1182 -482
- package/dist/trust-score-card-glass-L9g0qamo.js.map +1 -0
- package/dist/{use-focus-BRkQtQCj.cjs → use-focus-CeNHOiBa.cjs} +2 -2
- package/dist/{use-focus-BRkQtQCj.cjs.map → use-focus-CeNHOiBa.cjs.map} +1 -1
- package/dist/{use-wallpaper-tint-CfShPBo2.cjs → use-wallpaper-tint-Bt2G3g1v.cjs} +2 -2
- package/dist/{use-wallpaper-tint-CfShPBo2.cjs.map → use-wallpaper-tint-Bt2G3g1v.cjs.map} +1 -1
- package/dist/{utils-BXN7AcRu.cjs → utils-LYxxWvUn.cjs} +2 -2
- package/dist/{utils-BXN7AcRu.cjs.map → utils-LYxxWvUn.cjs.map} +1 -1
- package/dist/utils.cjs +1 -1
- package/docs/ADVANCED_PATTERNS.md +584 -0
- package/docs/AI_USAGE.md +135 -611
- package/docs/BEST_PRACTICES.md +2 -2
- package/docs/BREAKING_CHANGES.md +239 -0
- package/docs/COMPONENTS_CATALOG.md +8 -8
- package/docs/EXPORTS_STRUCTURE.md +3 -3
- package/docs/GETTING_STARTED.md +13 -8
- package/docs/PUBLISHING.md +1 -1
- package/docs/REGISTRY_SUMMARY.md +2 -2
- package/docs/REGISTRY_USAGE.md +1 -1
- package/docs/api/README.md +11 -11
- package/docs/api/interfaces/BadgeGlassProps.md +21 -14
- package/docs/api/interfaces/ButtonGlassProps.md +37 -30
- package/package.json +4 -3
- package/dist/trust-score-card-glass-A7kas5OS.js.map +0 -1
- package/dist/trust-score-card-glass-Dgu46oWI.cjs.map +0 -1
- package/dist/vite.svg +0 -1
- package/docs/migration/modal-glass-compound-api.md +0 -458
- package/docs/migration/select-to-combobox.md +0 -386
- package/docs/migration/tabs-glass-compound-api.md +0 -579
package/dist/vite.svg
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
|
@@ -1,458 +0,0 @@
|
|
|
1
|
-
# ModalGlass Compound API Migration Guide
|
|
2
|
-
|
|
3
|
-
**Version:** v1.0.0
|
|
4
|
-
**Status:** ⚠️ Legacy API removed - Compound API only
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Why Migrate?
|
|
9
|
-
|
|
10
|
-
The new **Compound Component API** provides:
|
|
11
|
-
|
|
12
|
-
✅ **Better composition** - Build complex modals with fine-grained control
|
|
13
|
-
✅ **Radix UI patterns** - Follows industry-standard component architecture
|
|
14
|
-
✅ **More control** - Customize each part independently
|
|
15
|
-
✅ **Easier styling** - Target specific sections without prop drilling
|
|
16
|
-
✅ **Type safety** - Better TypeScript inference for each sub-component
|
|
17
|
-
✅ **Accessibility** - Enhanced ARIA attributes and keyboard navigation
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## API Comparison
|
|
22
|
-
|
|
23
|
-
### Legacy API (Removed in v1.0.0)
|
|
24
|
-
|
|
25
|
-
```tsx
|
|
26
|
-
<ModalGlass
|
|
27
|
-
isOpen={open}
|
|
28
|
-
onClose={() => setOpen(false)}
|
|
29
|
-
title="Confirm Action"
|
|
30
|
-
description="Are you sure you want to proceed?"
|
|
31
|
-
size="md"
|
|
32
|
-
>
|
|
33
|
-
<p>Modal body content goes here</p>
|
|
34
|
-
<div className="flex gap-2">
|
|
35
|
-
<ButtonGlass variant="outline" onClick={() => setOpen(false)}>
|
|
36
|
-
Cancel
|
|
37
|
-
</ButtonGlass>
|
|
38
|
-
<ButtonGlass onClick={handleConfirm}>
|
|
39
|
-
Confirm
|
|
40
|
-
</ButtonGlass>
|
|
41
|
-
</div>
|
|
42
|
-
</ModalGlass>
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### Compound API (Recommended)
|
|
46
|
-
|
|
47
|
-
```tsx
|
|
48
|
-
<ModalGlass.Root open={open} onOpenChange={setOpen}>
|
|
49
|
-
<ModalGlass.Overlay />
|
|
50
|
-
<ModalGlass.Content size="md">
|
|
51
|
-
<ModalGlass.Header>
|
|
52
|
-
<ModalGlass.Title>Confirm Action</ModalGlass.Title>
|
|
53
|
-
<ModalGlass.Description>
|
|
54
|
-
Are you sure you want to proceed?
|
|
55
|
-
</ModalGlass.Description>
|
|
56
|
-
<ModalGlass.Close />
|
|
57
|
-
</ModalGlass.Header>
|
|
58
|
-
|
|
59
|
-
<ModalGlass.Body>
|
|
60
|
-
<p>Modal body content goes here</p>
|
|
61
|
-
</ModalGlass.Body>
|
|
62
|
-
|
|
63
|
-
<ModalGlass.Footer>
|
|
64
|
-
<ButtonGlass variant="outline" onClick={() => setOpen(false)}>
|
|
65
|
-
Cancel
|
|
66
|
-
</ButtonGlass>
|
|
67
|
-
<ButtonGlass onClick={handleConfirm}>
|
|
68
|
-
Confirm
|
|
69
|
-
</ButtonGlass>
|
|
70
|
-
</ModalGlass.Footer>
|
|
71
|
-
</ModalGlass.Content>
|
|
72
|
-
</ModalGlass.Root>
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
---
|
|
76
|
-
|
|
77
|
-
## Migration Examples
|
|
78
|
-
|
|
79
|
-
### Example 1: Basic Modal
|
|
80
|
-
|
|
81
|
-
**Before (Legacy):**
|
|
82
|
-
```tsx
|
|
83
|
-
import { ModalGlass } from '@/components/glass/ui/modal-glass';
|
|
84
|
-
|
|
85
|
-
function MyComponent() {
|
|
86
|
-
const [open, setOpen] = useState(false);
|
|
87
|
-
|
|
88
|
-
return (
|
|
89
|
-
<ModalGlass
|
|
90
|
-
isOpen={open}
|
|
91
|
-
onClose={() => setOpen(false)}
|
|
92
|
-
title="Welcome"
|
|
93
|
-
>
|
|
94
|
-
<p>Welcome to our application!</p>
|
|
95
|
-
</ModalGlass>
|
|
96
|
-
);
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
**After (Compound):**
|
|
101
|
-
```tsx
|
|
102
|
-
import { ModalGlass } from '@/components/glass/ui/modal-glass';
|
|
103
|
-
|
|
104
|
-
function MyComponent() {
|
|
105
|
-
const [open, setOpen] = useState(false);
|
|
106
|
-
|
|
107
|
-
return (
|
|
108
|
-
<ModalGlass.Root open={open} onOpenChange={setOpen}>
|
|
109
|
-
<ModalGlass.Overlay />
|
|
110
|
-
<ModalGlass.Content>
|
|
111
|
-
<ModalGlass.Header>
|
|
112
|
-
<ModalGlass.Title>Welcome</ModalGlass.Title>
|
|
113
|
-
<ModalGlass.Close />
|
|
114
|
-
</ModalGlass.Header>
|
|
115
|
-
<ModalGlass.Body>
|
|
116
|
-
<p>Welcome to our application!</p>
|
|
117
|
-
</ModalGlass.Body>
|
|
118
|
-
</ModalGlass.Content>
|
|
119
|
-
</ModalGlass.Root>
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
### Example 2: Modal with Footer Actions
|
|
127
|
-
|
|
128
|
-
**Before (Legacy):**
|
|
129
|
-
```tsx
|
|
130
|
-
<ModalGlass
|
|
131
|
-
isOpen={isDeleteOpen}
|
|
132
|
-
onClose={() => setIsDeleteOpen(false)}
|
|
133
|
-
title="Delete Item"
|
|
134
|
-
description="This action cannot be undone."
|
|
135
|
-
>
|
|
136
|
-
<div className="space-y-4">
|
|
137
|
-
<p>Are you sure you want to delete this item?</p>
|
|
138
|
-
<div className="flex justify-end gap-2">
|
|
139
|
-
<ButtonGlass
|
|
140
|
-
variant="outline"
|
|
141
|
-
onClick={() => setIsDeleteOpen(false)}
|
|
142
|
-
>
|
|
143
|
-
Cancel
|
|
144
|
-
</ButtonGlass>
|
|
145
|
-
<ButtonGlass
|
|
146
|
-
variant="destructive"
|
|
147
|
-
onClick={handleDelete}
|
|
148
|
-
>
|
|
149
|
-
Delete
|
|
150
|
-
</ButtonGlass>
|
|
151
|
-
</div>
|
|
152
|
-
</div>
|
|
153
|
-
</ModalGlass>
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
**After (Compound):**
|
|
157
|
-
```tsx
|
|
158
|
-
<ModalGlass.Root open={isDeleteOpen} onOpenChange={setIsDeleteOpen}>
|
|
159
|
-
<ModalGlass.Overlay />
|
|
160
|
-
<ModalGlass.Content>
|
|
161
|
-
<ModalGlass.Header>
|
|
162
|
-
<ModalGlass.Title>Delete Item</ModalGlass.Title>
|
|
163
|
-
<ModalGlass.Description>
|
|
164
|
-
This action cannot be undone.
|
|
165
|
-
</ModalGlass.Description>
|
|
166
|
-
<ModalGlass.Close />
|
|
167
|
-
</ModalGlass.Header>
|
|
168
|
-
|
|
169
|
-
<ModalGlass.Body>
|
|
170
|
-
<p>Are you sure you want to delete this item?</p>
|
|
171
|
-
</ModalGlass.Body>
|
|
172
|
-
|
|
173
|
-
<ModalGlass.Footer className="justify-end">
|
|
174
|
-
<ButtonGlass
|
|
175
|
-
variant="outline"
|
|
176
|
-
onClick={() => setIsDeleteOpen(false)}
|
|
177
|
-
>
|
|
178
|
-
Cancel
|
|
179
|
-
</ButtonGlass>
|
|
180
|
-
<ButtonGlass
|
|
181
|
-
variant="destructive"
|
|
182
|
-
onClick={handleDelete}
|
|
183
|
-
>
|
|
184
|
-
Delete
|
|
185
|
-
</ButtonGlass>
|
|
186
|
-
</ModalGlass.Footer>
|
|
187
|
-
</ModalGlass.Content>
|
|
188
|
-
</ModalGlass.Root>
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
---
|
|
192
|
-
|
|
193
|
-
### Example 3: Modal with Custom Styling
|
|
194
|
-
|
|
195
|
-
**Before (Legacy):**
|
|
196
|
-
```tsx
|
|
197
|
-
<ModalGlass
|
|
198
|
-
isOpen={open}
|
|
199
|
-
onClose={() => setOpen(false)}
|
|
200
|
-
title="Settings"
|
|
201
|
-
className="max-w-2xl"
|
|
202
|
-
>
|
|
203
|
-
<div className="p-6">
|
|
204
|
-
<SettingsForm />
|
|
205
|
-
</div>
|
|
206
|
-
</ModalGlass>
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
**After (Compound - More Control):**
|
|
210
|
-
```tsx
|
|
211
|
-
<ModalGlass.Root open={open} onOpenChange={setOpen}>
|
|
212
|
-
<ModalGlass.Overlay className="bg-black/60" />
|
|
213
|
-
<ModalGlass.Content size="lg" className="max-w-2xl">
|
|
214
|
-
<ModalGlass.Header className="border-b border-white/10">
|
|
215
|
-
<ModalGlass.Title className="text-2xl">Settings</ModalGlass.Title>
|
|
216
|
-
<ModalGlass.Close />
|
|
217
|
-
</ModalGlass.Header>
|
|
218
|
-
|
|
219
|
-
<ModalGlass.Body className="p-6">
|
|
220
|
-
<SettingsForm />
|
|
221
|
-
</ModalGlass.Body>
|
|
222
|
-
</ModalGlass.Content>
|
|
223
|
-
</ModalGlass.Root>
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
---
|
|
227
|
-
|
|
228
|
-
### Example 4: Modal Without Header/Footer
|
|
229
|
-
|
|
230
|
-
**Before (Legacy):**
|
|
231
|
-
```tsx
|
|
232
|
-
<ModalGlass
|
|
233
|
-
isOpen={open}
|
|
234
|
-
onClose={() => setOpen(false)}
|
|
235
|
-
>
|
|
236
|
-
<ImageGallery images={images} />
|
|
237
|
-
</ModalGlass>
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
**After (Compound - Flexible):**
|
|
241
|
-
```tsx
|
|
242
|
-
<ModalGlass.Root open={open} onOpenChange={setOpen}>
|
|
243
|
-
<ModalGlass.Overlay />
|
|
244
|
-
<ModalGlass.Content size="xl">
|
|
245
|
-
{/* No header - just body */}
|
|
246
|
-
<ModalGlass.Body className="p-0">
|
|
247
|
-
<ImageGallery images={images} />
|
|
248
|
-
{/* Optional: Add close button in top-right corner */}
|
|
249
|
-
<button
|
|
250
|
-
onClick={() => setOpen(false)}
|
|
251
|
-
className="absolute top-4 right-4 p-2 rounded-lg bg-black/50"
|
|
252
|
-
>
|
|
253
|
-
<X className="w-4 h-4" />
|
|
254
|
-
</button>
|
|
255
|
-
</ModalGlass.Body>
|
|
256
|
-
</ModalGlass.Content>
|
|
257
|
-
</ModalGlass.Root>
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
---
|
|
261
|
-
|
|
262
|
-
## Component API Reference
|
|
263
|
-
|
|
264
|
-
### ModalGlass.Root
|
|
265
|
-
|
|
266
|
-
**Props:**
|
|
267
|
-
- `open: boolean` - Controlled open state
|
|
268
|
-
- `onOpenChange: (open: boolean) => void` - Called when modal should open/close
|
|
269
|
-
- `children: ReactNode` - Must contain `ModalGlass.Content`
|
|
270
|
-
|
|
271
|
-
### ModalGlass.Overlay
|
|
272
|
-
|
|
273
|
-
**Props:**
|
|
274
|
-
- `className?: string` - Custom classes for overlay
|
|
275
|
-
- Standard HTML div attributes
|
|
276
|
-
|
|
277
|
-
**Default behavior:**
|
|
278
|
-
- Click to close
|
|
279
|
-
- Backdrop blur effect
|
|
280
|
-
|
|
281
|
-
### ModalGlass.Content
|
|
282
|
-
|
|
283
|
-
**Props:**
|
|
284
|
-
- `size?: 'sm' | 'md' | 'lg' | 'xl' | 'full'` - Modal size
|
|
285
|
-
- `className?: string` - Custom classes
|
|
286
|
-
- `children: ReactNode` - Modal content
|
|
287
|
-
- Standard HTML div attributes
|
|
288
|
-
|
|
289
|
-
### ModalGlass.Header
|
|
290
|
-
|
|
291
|
-
**Props:**
|
|
292
|
-
- `className?: string` - Custom classes
|
|
293
|
-
- `children: ReactNode` - Header content
|
|
294
|
-
- Standard HTML div attributes
|
|
295
|
-
|
|
296
|
-
**Typical children:** `Title`, `Description`, `Close`
|
|
297
|
-
|
|
298
|
-
### ModalGlass.Title
|
|
299
|
-
|
|
300
|
-
**Props:**
|
|
301
|
-
- `className?: string` - Custom classes
|
|
302
|
-
- `children: ReactNode` - Title text
|
|
303
|
-
- Standard HTML heading attributes
|
|
304
|
-
|
|
305
|
-
### ModalGlass.Description
|
|
306
|
-
|
|
307
|
-
**Props:**
|
|
308
|
-
- `className?: string` - Custom classes
|
|
309
|
-
- `children: ReactNode` - Description text
|
|
310
|
-
- Standard HTML paragraph attributes
|
|
311
|
-
|
|
312
|
-
### ModalGlass.Body
|
|
313
|
-
|
|
314
|
-
**Props:**
|
|
315
|
-
- `className?: string` - Custom classes
|
|
316
|
-
- `children: ReactNode` - Body content
|
|
317
|
-
- Standard HTML div attributes
|
|
318
|
-
|
|
319
|
-
### ModalGlass.Footer
|
|
320
|
-
|
|
321
|
-
**Props:**
|
|
322
|
-
- `className?: string` - Custom classes
|
|
323
|
-
- `children: ReactNode` - Footer content (typically buttons)
|
|
324
|
-
- Standard HTML div attributes
|
|
325
|
-
|
|
326
|
-
### ModalGlass.Close
|
|
327
|
-
|
|
328
|
-
**Props:**
|
|
329
|
-
- `className?: string` - Custom classes
|
|
330
|
-
- Standard HTML button attributes
|
|
331
|
-
|
|
332
|
-
**Default:** Renders X icon button
|
|
333
|
-
|
|
334
|
-
---
|
|
335
|
-
|
|
336
|
-
## Benefits by Use Case
|
|
337
|
-
|
|
338
|
-
### 1. **Complex Forms**
|
|
339
|
-
Compound API makes it easier to add custom headers, sections, and footers:
|
|
340
|
-
```tsx
|
|
341
|
-
<ModalGlass.Root>
|
|
342
|
-
<ModalGlass.Content>
|
|
343
|
-
<ModalGlass.Header>
|
|
344
|
-
<ModalGlass.Title>Multi-Step Form</ModalGlass.Title>
|
|
345
|
-
<div className="flex gap-2">
|
|
346
|
-
<Badge>Step {step}/3</Badge>
|
|
347
|
-
</div>
|
|
348
|
-
</ModalGlass.Header>
|
|
349
|
-
{/* ... */}
|
|
350
|
-
</ModalGlass.Content>
|
|
351
|
-
</ModalGlass.Root>
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
### 2. **Custom Layouts**
|
|
355
|
-
Skip header/footer when you don't need them:
|
|
356
|
-
```tsx
|
|
357
|
-
<ModalGlass.Root>
|
|
358
|
-
<ModalGlass.Content>
|
|
359
|
-
<ModalGlass.Body className="p-0">
|
|
360
|
-
<VideoPlayer />
|
|
361
|
-
</ModalGlass.Body>
|
|
362
|
-
</ModalGlass.Content>
|
|
363
|
-
</ModalGlass.Root>
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
### 3. **Advanced Styling**
|
|
367
|
-
Target specific parts independently:
|
|
368
|
-
```tsx
|
|
369
|
-
<ModalGlass.Root>
|
|
370
|
-
<ModalGlass.Overlay className="bg-gradient-to-br from-purple-900/50" />
|
|
371
|
-
<ModalGlass.Content className="shadow-2xl">
|
|
372
|
-
<ModalGlass.Header className="bg-gradient-to-r from-purple-500">
|
|
373
|
-
{/* ... */}
|
|
374
|
-
</ModalGlass.Header>
|
|
375
|
-
</ModalGlass.Content>
|
|
376
|
-
</ModalGlass.Root>
|
|
377
|
-
```
|
|
378
|
-
|
|
379
|
-
---
|
|
380
|
-
|
|
381
|
-
## Migration Timeline
|
|
382
|
-
|
|
383
|
-
| Version | Status | Notes |
|
|
384
|
-
|---------|--------|-------|
|
|
385
|
-
| **v0.x** | ✅ Both APIs supported | Legacy API fully functional |
|
|
386
|
-
| **v1.0.0** | 🔥 Legacy removed | Only Compound API available |
|
|
387
|
-
|
|
388
|
-
**Note:** Legacy API was removed in v1.0.0. Use the Compound API as shown above.
|
|
389
|
-
|
|
390
|
-
---
|
|
391
|
-
|
|
392
|
-
## Performance Notes
|
|
393
|
-
|
|
394
|
-
- ✅ **No performance difference** - Both APIs render the same DOM structure
|
|
395
|
-
- ✅ **Bundle size** - Compound API adds ~200 bytes (negligible)
|
|
396
|
-
- ✅ **Tree shaking** - Unused sub-components are removed in production builds
|
|
397
|
-
|
|
398
|
-
---
|
|
399
|
-
|
|
400
|
-
## Accessibility
|
|
401
|
-
|
|
402
|
-
The Compound API enhances accessibility:
|
|
403
|
-
|
|
404
|
-
- ✅ `ModalGlass.Title` automatically sets `aria-labelledby`
|
|
405
|
-
- ✅ `ModalGlass.Description` automatically sets `aria-describedby`
|
|
406
|
-
- ✅ `ModalGlass.Close` has proper `aria-label="Close modal"`
|
|
407
|
-
- ✅ Keyboard navigation (Escape, Tab) works identically
|
|
408
|
-
|
|
409
|
-
---
|
|
410
|
-
|
|
411
|
-
## Common Pitfalls
|
|
412
|
-
|
|
413
|
-
### ❌ Forgetting ModalGlass.Root
|
|
414
|
-
```tsx
|
|
415
|
-
// Wrong - will not work
|
|
416
|
-
<ModalGlass.Content>
|
|
417
|
-
{/* ... */}
|
|
418
|
-
</ModalGlass.Content>
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
```tsx
|
|
422
|
-
// Correct
|
|
423
|
-
<ModalGlass.Root open={open} onOpenChange={setOpen}>
|
|
424
|
-
<ModalGlass.Content>
|
|
425
|
-
{/* ... */}
|
|
426
|
-
</ModalGlass.Content>
|
|
427
|
-
</ModalGlass.Root>
|
|
428
|
-
```
|
|
429
|
-
|
|
430
|
-
### ❌ Missing Overlay
|
|
431
|
-
```tsx
|
|
432
|
-
// Works but no backdrop
|
|
433
|
-
<ModalGlass.Root>
|
|
434
|
-
<ModalGlass.Content>{/* ... */}</ModalGlass.Content>
|
|
435
|
-
</ModalGlass.Root>
|
|
436
|
-
```
|
|
437
|
-
|
|
438
|
-
```tsx
|
|
439
|
-
// Add overlay for backdrop
|
|
440
|
-
<ModalGlass.Root>
|
|
441
|
-
<ModalGlass.Overlay />
|
|
442
|
-
<ModalGlass.Content>{/* ... */}</ModalGlass.Content>
|
|
443
|
-
</ModalGlass.Root>
|
|
444
|
-
```
|
|
445
|
-
|
|
446
|
-
---
|
|
447
|
-
|
|
448
|
-
## Need Help?
|
|
449
|
-
|
|
450
|
-
- 📖 See [Storybook examples](http://localhost:6006/?path=/story/components-modalglass--compound-api)
|
|
451
|
-
- 💬 Ask in [GitHub Discussions](https://github.com/your-org/shadcn-glass-ui-library/discussions)
|
|
452
|
-
- 🐛 Report issues in [GitHub Issues](https://github.com/your-org/shadcn-glass-ui-library/issues)
|
|
453
|
-
|
|
454
|
-
---
|
|
455
|
-
|
|
456
|
-
**Last updated:** 2025-12-05
|
|
457
|
-
**Status:** ✅ Ready for migration
|
|
458
|
-
**Backward compatibility:** Maintained until v5.0
|