diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 610a0d9..d0c5638 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,6 +8,7 @@ "name": "frontend", "version": "0.0.0", "dependencies": { + "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-popover": "^1.1.15", "@tailwindcss/vite": "^4.1.12", "lucide-react": "^0.554.0", @@ -1114,6 +1115,42 @@ } } }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-dismissable-layer": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", diff --git a/frontend/package.json b/frontend/package.json index 578da49..b797348 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-popover": "^1.1.15", "@tailwindcss/vite": "^4.1.12", "lucide-react": "^0.554.0", @@ -29,4 +30,4 @@ "globals": "^16.3.0", "vite": "^7.1.2" } -} +} \ No newline at end of file diff --git a/frontend/src/components/Modal.jsx b/frontend/src/components/Modal.jsx new file mode 100644 index 0000000..f542262 --- /dev/null +++ b/frontend/src/components/Modal.jsx @@ -0,0 +1,46 @@ +import * as Dialog from '@radix-ui/react-dialog'; +import { X } from 'lucide-react'; + +export default function Modal({ open, onOpenChange, trigger, title, children, isProtected = false }) { + return ( + + {trigger && {trigger}} + + + { + if (isProtected) e.preventDefault(); + }} + onEscapeKeyDown={(e) => { + if (isProtected) { + if (!window.confirm("Are you sure you want to close this?")) { + e.preventDefault(); + } + } + }} + className="fixed left-[50%] top-[50%] max-h-[85vh] w-[90vw] max-w-[450px] translate-x-[-50%] translate-y-[-50%] rounded-lg bg-[#141414] border border-[#2B2B2B] shadow-xl focus:outline-none z-50 overflow-hidden"> +
+ + {title} + + { + if (isProtected) { + if (!window.confirm("Are you sure you want to close this?")) { + e.preventDefault(); + } + } + }} + className="text-gray-400 hover:text-white transition-colors cursor-pointer outline-none"> + + +
+
+ {children} +
+
+
+
+ ); +} + diff --git a/frontend/src/gallery/components/AlbumCreateModal.jsx b/frontend/src/gallery/components/AlbumCreateModal.jsx new file mode 100644 index 0000000..b88a13c --- /dev/null +++ b/frontend/src/gallery/components/AlbumCreateModal.jsx @@ -0,0 +1,12 @@ +import Modal from '../../components/Modal' +export default function AlbumCreateModal({ open, onOpenChange, trigger }) { + return ( + +
+ +