@djangocfg/ui-core 2.1.107 → 2.1.109

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@djangocfg/ui-core",
3
- "version": "2.1.107",
3
+ "version": "2.1.109",
4
4
  "description": "Pure React UI component library without Next.js dependencies - for Electron, Vite, CRA apps",
5
5
  "keywords": [
6
6
  "ui-components",
@@ -69,7 +69,7 @@
69
69
  "moment": "^2.30.1",
70
70
  "react": "^19.0.0",
71
71
  "react-dom": "^19.0.0",
72
- "react-hook-form": "^7.65.0",
72
+ "react-hook-form": "^7.69.0",
73
73
  "tailwindcss": "^4.0.0",
74
74
  "zod": "^4.0.0",
75
75
  "zustand": "^5.0.0",
@@ -122,7 +122,7 @@
122
122
  "vaul": "1.1.2"
123
123
  },
124
124
  "devDependencies": {
125
- "@djangocfg/typescript-config": "^2.1.107",
125
+ "@djangocfg/typescript-config": "^2.1.109",
126
126
  "@types/node": "^24.7.2",
127
127
  "@types/react": "^19.1.0",
128
128
  "@types/react-dom": "^19.1.0",
@@ -47,6 +47,7 @@ export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent,
47
47
  export { Popover, PopoverContent, PopoverTrigger } from './popover';
48
48
  export { Sheet, SheetTrigger, SheetClose, SheetContent, SheetHeader, SheetFooter, SheetTitle, SheetDescription } from './sheet';
49
49
  export { Drawer, DrawerTrigger, DrawerClose, DrawerContent, DrawerHeader, DrawerFooter, DrawerTitle, DrawerDescription } from './drawer';
50
+ export { ResponsiveSheet, ResponsiveSheetContent, ResponsiveSheetHeader, ResponsiveSheetTitle, ResponsiveSheetDescription, ResponsiveSheetFooter } from './responsive-sheet';
50
51
  export { HoverCard, HoverCardContent, HoverCardTrigger } from './hover-card';
51
52
  export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip';
52
53
 
@@ -0,0 +1,172 @@
1
+ "use client"
2
+
3
+ /**
4
+ * Responsive Sheet
5
+ *
6
+ * Dialog on desktop, Drawer (pull-down) on mobile.
7
+ * Automatically switches based on screen width using useIsMobile hook.
8
+ */
9
+
10
+ import * as React from 'react';
11
+
12
+ import { useIsMobile } from '../hooks/useMobile';
13
+
14
+ import {
15
+ Dialog,
16
+ DialogContent,
17
+ DialogDescription,
18
+ DialogFooter,
19
+ DialogHeader,
20
+ DialogTitle,
21
+ } from './dialog';
22
+
23
+ import {
24
+ Drawer,
25
+ DrawerContent,
26
+ DrawerDescription,
27
+ DrawerFooter,
28
+ DrawerHeader,
29
+ DrawerTitle,
30
+ } from './drawer';
31
+
32
+ // ─────────────────────────────────────────────────────────────────────────────
33
+ // Context
34
+ // ─────────────────────────────────────────────────────────────────────────────
35
+
36
+ const ResponsiveSheetContext = React.createContext<{ isMobile: boolean }>({
37
+ isMobile: false,
38
+ });
39
+
40
+ // ─────────────────────────────────────────────────────────────────────────────
41
+ // Root
42
+ // ─────────────────────────────────────────────────────────────────────────────
43
+
44
+ interface ResponsiveSheetProps {
45
+ open: boolean;
46
+ onOpenChange: (open: boolean) => void;
47
+ children: React.ReactNode;
48
+ }
49
+
50
+ function ResponsiveSheet({ open, onOpenChange, children }: ResponsiveSheetProps) {
51
+ const isMobile = useIsMobile();
52
+
53
+ if (isMobile) {
54
+ return (
55
+ <ResponsiveSheetContext.Provider value={{ isMobile: true }}>
56
+ <Drawer open={open} onOpenChange={onOpenChange}>
57
+ {children}
58
+ </Drawer>
59
+ </ResponsiveSheetContext.Provider>
60
+ );
61
+ }
62
+
63
+ return (
64
+ <ResponsiveSheetContext.Provider value={{ isMobile: false }}>
65
+ <Dialog open={open} onOpenChange={onOpenChange}>
66
+ {children}
67
+ </Dialog>
68
+ </ResponsiveSheetContext.Provider>
69
+ );
70
+ }
71
+ ResponsiveSheet.displayName = "ResponsiveSheet"
72
+
73
+ // ─────────────────────────────────────────────────────────────────────────────
74
+ // Content
75
+ // ─────────────────────────────────────────────────────────────────────────────
76
+
77
+ interface ResponsiveSheetContentProps {
78
+ children: React.ReactNode;
79
+ className?: string;
80
+ }
81
+
82
+ function ResponsiveSheetContent({ children, className }: ResponsiveSheetContentProps) {
83
+ const { isMobile } = React.useContext(ResponsiveSheetContext);
84
+
85
+ if (isMobile) {
86
+ return <DrawerContent className={className}>{children}</DrawerContent>;
87
+ }
88
+
89
+ return <DialogContent className={className}>{children}</DialogContent>;
90
+ }
91
+ ResponsiveSheetContent.displayName = "ResponsiveSheetContent"
92
+
93
+ // ─────────────────────────────────────────────────────────────────────────────
94
+ // Header
95
+ // ─────────────────────────────────────────────────────────────────────────────
96
+
97
+ interface ResponsiveSheetHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}
98
+
99
+ function ResponsiveSheetHeader({ className, ...props }: ResponsiveSheetHeaderProps) {
100
+ const { isMobile } = React.useContext(ResponsiveSheetContext);
101
+
102
+ if (isMobile) {
103
+ return <DrawerHeader className={className} {...props} />;
104
+ }
105
+
106
+ return <DialogHeader className={className} {...props} />;
107
+ }
108
+ ResponsiveSheetHeader.displayName = "ResponsiveSheetHeader"
109
+
110
+ // ─────────────────────────────────────────────────────────────────────────────
111
+ // Title
112
+ // ─────────────────────────────────────────────────────────────────────────────
113
+
114
+ interface ResponsiveSheetTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}
115
+
116
+ function ResponsiveSheetTitle({ className, ...props }: ResponsiveSheetTitleProps) {
117
+ const { isMobile } = React.useContext(ResponsiveSheetContext);
118
+
119
+ if (isMobile) {
120
+ return <DrawerTitle className={className} {...props} />;
121
+ }
122
+
123
+ return <DialogTitle className={className} {...props} />;
124
+ }
125
+ ResponsiveSheetTitle.displayName = "ResponsiveSheetTitle"
126
+
127
+ // ─────────────────────────────────────────────────────────────────────────────
128
+ // Description
129
+ // ─────────────────────────────────────────────────────────────────────────────
130
+
131
+ interface ResponsiveSheetDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}
132
+
133
+ function ResponsiveSheetDescription({ className, ...props }: ResponsiveSheetDescriptionProps) {
134
+ const { isMobile } = React.useContext(ResponsiveSheetContext);
135
+
136
+ if (isMobile) {
137
+ return <DrawerDescription className={className} {...props} />;
138
+ }
139
+
140
+ return <DialogDescription className={className} {...props} />;
141
+ }
142
+ ResponsiveSheetDescription.displayName = "ResponsiveSheetDescription"
143
+
144
+ // ─────────────────────────────────────────────────────────────────────────────
145
+ // Footer
146
+ // ─────────────────────────────────────────────────────────────────────────────
147
+
148
+ interface ResponsiveSheetFooterProps extends React.HTMLAttributes<HTMLDivElement> {}
149
+
150
+ function ResponsiveSheetFooter({ className, ...props }: ResponsiveSheetFooterProps) {
151
+ const { isMobile } = React.useContext(ResponsiveSheetContext);
152
+
153
+ if (isMobile) {
154
+ return <DrawerFooter className={className} {...props} />;
155
+ }
156
+
157
+ return <DialogFooter className={className} {...props} />;
158
+ }
159
+ ResponsiveSheetFooter.displayName = "ResponsiveSheetFooter"
160
+
161
+ // ─────────────────────────────────────────────────────────────────────────────
162
+ // Exports
163
+ // ─────────────────────────────────────────────────────────────────────────────
164
+
165
+ export {
166
+ ResponsiveSheet,
167
+ ResponsiveSheetContent,
168
+ ResponsiveSheetHeader,
169
+ ResponsiveSheetTitle,
170
+ ResponsiveSheetDescription,
171
+ ResponsiveSheetFooter,
172
+ };