diff --git a/package.json b/package.json
index 797091b..b784d68 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,11 @@
"@radix-ui/react-dropdown-menu": "^2.1.14",
"@radix-ui/react-hover-card": "^1.1.13",
"@radix-ui/react-label": "^2.1.6",
+ "@radix-ui/react-scroll-area": "^1.2.8",
+ "@radix-ui/react-select": "^2.2.4",
+ "@radix-ui/react-separator": "^1.1.6",
"@radix-ui/react-slot": "^1.2.2",
+ "@radix-ui/react-switch": "^1.2.4",
"@radix-ui/react-tabs": "^1.1.11",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx
index 8d31232..d371912 100644
--- a/src/app/settings/page.tsx
+++ b/src/app/settings/page.tsx
@@ -1,10 +1,486 @@
-import { RedirectButton } from '@/components/user/redirect-button';
+//import { RedirectButton } from '@/components/user/redirect-button';
+import { Button } from '@/components/ui/button';
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from '@/components/ui/card';
+import { Input } from '@/components/ui/input';
+import { Label } from '@/components/ui/label';
+import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
+import { ScrollableSettingsWrapper } from '@/components/wrappers/settings-scroll'; // Adjust path as needed
+import { Switch } from '@/components/ui/switch'; // Assuming you have this or will create/import it
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from '@/components/ui/select'; // Assuming you have this
-export default function Home() {
+/*export default function Settings() {
return (
Settings
);
+}*/
+
+export default function SettingsPage() {
+ return (
+
+
+
+
+ Account
+ Notifications
+ Calendar
+ Privacy
+ Appearance
+
+
+
+
+
+
+ Account Settings
+
+ Manage your account details and preferences.
+
+
+
+
+ Display Name
+
+
+
+
Email Address
+
+
+ Email is managed by your SSO provider.
+
+
+
+
Profile Picture
+
+
+ Upload a new profile picture.
+
+
+
+ Timezone
+
+
+
+
+ Language
+
+
+
+
+
+ English
+ German
+
+
+
+
+
Delete Account
+
+ Permanently delete your account and all associated data.
+
+
+
+
+
+ Exit
+ Save Changes
+
+
+
+
+
+
+
+
+ Notification Preferences
+
+ Choose how you want to be notified.
+
+
+
+
+
+ Enable All Email Notifications
+
+
+
+
+
+
+ New Meeting Bookings
+
+
+
+
+
+ Meeting Confirmations/Cancellations
+
+
+
+
+
+ Meeting Reminders
+
+
+
+
+ Remind me before
+
+
+
+
+
+ 15 minutes
+ 30 minutes
+ 1 hour
+ 1 day
+
+
+
+
+
+ Friend Requests
+
+
+
+
+
+ Group Invitations/Updates
+
+
+
+
+
+
+
+ Exit
+ Save Changes
+
+
+
+
+
+
+
+
+ Calendar & Availability
+
+ Manage your calendar display, default availability, and iCal
+ integrations.
+
+
+
+
+
+ Display
+
+
+
+ Default Calendar View
+
+
+
+
+
+
+ Day
+ Week
+ Month
+
+
+
+
+ Week Starts On
+
+
+
+
+
+ Sunday
+ Monday
+
+
+
+
+
+ Show Weekends
+
+
+
+
+
+
+
+ Availability
+
+
+
Working Hours
+
+ Define your typical available hours (e.g.,
+ Monday-Friday, 9 AM - 5 PM).
+
+
+ Set Working Hours
+
+
+
+
+ Minimum Notice for Bookings
+
+
+ Min time before a booking can be made.
+
+
+
+
+
+
+
+ Booking Window (days in advance)
+
+
+ Max time in advance a booking can be made.
+
+
+
+
+
+
+
+ iCalendar Integration
+
+
+ Import iCal Feed URL
+
+
+ Add Feed
+
+
+
+ Export Your Calendar
+
+ Get iCal Export URL
+
+
+ Download .ics File
+
+
+
+
+
+
+ Exit
+ Save Changes
+
+
+
+
+
+
+
+
+ Sharing & Privacy
+
+ Control who can see your calendar and book time with you.
+
+
+
+
+
+ Default Calendar Visibility
+
+
+
+
+
+
+
+ Private (Only You)
+
+
+ Free/Busy for Friends
+
+
+ Full Details for Friends
+
+
+
+
+
+
+ Who Can See Your Full Calendar Details?
+
+
+ (Override for Default Visibility)
+
+
+ This setting will override the default visibility for
+ your calendar. You can set specific friends or groups to
+ see your full calendar details.
+
+
+
+
+
+
+
+ Only Me
+ My Friends
+
+ Specific Friends/Groups (manage separately)
+
+
+
+
+
+
+ Who Can Book Time With You?
+
+
+
+
+
+
+ No One
+ My Friends
+
+ Specific Friends/Groups (manage separately)
+
+
+
+
+
+
Blocked Users
+
Manage Blocked Users
+
+ Prevent specific users from seeing your calendar or
+ booking time.
+
+
+
+
+
+ Exit
+ Save Changes
+
+
+
+
+
+
+
+
+ Appearance
+
+ Customize the look and feel of the application.
+
+
+
+
+ Theme
+
+
+
+
+
+ Light
+ Dark
+ System Default
+
+
+
+
+ Date Format
+
+
+
+
+
+ DD/MM/YYYY
+ MM/DD/YYYY
+ YYYY-MM-DD
+
+
+
+
+ Time Format
+
+
+
+
+
+ 24-hour
+ 12-hour
+
+
+
+
+
+
+ Exit
+ Save Changes
+
+
+
+
+
+
+ );
}
diff --git a/src/components/ui/select.tsx b/src/components/ui/select.tsx
new file mode 100644
index 0000000..90f7ef0
--- /dev/null
+++ b/src/components/ui/select.tsx
@@ -0,0 +1,185 @@
+'use client';
+
+import * as React from 'react';
+import * as SelectPrimitive from '@radix-ui/react-select';
+import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react';
+
+import { cn } from '@/lib/utils';
+
+function Select({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+function SelectGroup({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+function SelectValue({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+function SelectTrigger({
+ className,
+ size = 'default',
+ children,
+ ...props
+}: React.ComponentProps & {
+ size?: 'sm' | 'default';
+}) {
+ return (
+
+ {children}
+
+
+
+
+ );
+}
+
+function SelectContent({
+ className,
+ children,
+ position = 'popper',
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+
+ {children}
+
+
+
+
+ );
+}
+
+function SelectLabel({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function SelectItem({
+ className,
+ children,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+
+
+
+ {children}
+
+ );
+}
+
+function SelectSeparator({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function SelectScrollUpButton({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+ );
+}
+
+function SelectScrollDownButton({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+ );
+}
+
+export {
+ Select,
+ SelectContent,
+ SelectGroup,
+ SelectItem,
+ SelectLabel,
+ SelectScrollDownButton,
+ SelectScrollUpButton,
+ SelectSeparator,
+ SelectTrigger,
+ SelectValue,
+};
diff --git a/src/components/ui/separator.tsx b/src/components/ui/separator.tsx
new file mode 100644
index 0000000..39eb020
--- /dev/null
+++ b/src/components/ui/separator.tsx
@@ -0,0 +1,28 @@
+'use client';
+
+import * as React from 'react';
+import * as SeparatorPrimitive from '@radix-ui/react-separator';
+
+import { cn } from '@/lib/utils';
+
+function Separator({
+ className,
+ orientation = 'horizontal',
+ decorative = true,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+export { Separator };
diff --git a/src/components/ui/switch.tsx b/src/components/ui/switch.tsx
new file mode 100644
index 0000000..39e25af
--- /dev/null
+++ b/src/components/ui/switch.tsx
@@ -0,0 +1,31 @@
+'use client';
+
+import * as React from 'react';
+import * as SwitchPrimitive from '@radix-ui/react-switch';
+
+import { cn } from '@/lib/utils';
+
+function Switch({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+ );
+}
+
+export { Switch };
diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx
index 497ba5e..4a9fbd0 100644
--- a/src/components/ui/tabs.tsx
+++ b/src/components/ui/tabs.tsx
@@ -1,9 +1,9 @@
-"use client"
+'use client';
-import * as React from "react"
-import * as TabsPrimitive from "@radix-ui/react-tabs"
+import * as React from 'react';
+import * as TabsPrimitive from '@radix-ui/react-tabs';
-import { cn } from "@/lib/utils"
+import { cn } from '@/lib/utils';
function Tabs({
className,
@@ -11,11 +11,11 @@ function Tabs({
}: React.ComponentProps) {
return (
- )
+ );
}
function TabsList({
@@ -24,14 +24,14 @@ function TabsList({
}: React.ComponentProps) {
return (
- )
+ );
}
function TabsTrigger({
@@ -40,14 +40,14 @@ function TabsTrigger({
}: React.ComponentProps) {
return (
- )
+ );
}
function TabsContent({
@@ -56,11 +56,11 @@ function TabsContent({
}: React.ComponentProps) {
return (
- )
+ );
}
-export { Tabs, TabsList, TabsTrigger, TabsContent }
+export { Tabs, TabsList, TabsTrigger, TabsContent };
diff --git a/src/components/wrappers/settings-scroll.tsx b/src/components/wrappers/settings-scroll.tsx
new file mode 100644
index 0000000..e0f7251
--- /dev/null
+++ b/src/components/wrappers/settings-scroll.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+
+interface ScrollableContentWrapperProps {
+ children: React.ReactNode;
+ className?: string;
+}
+
+export const ScrollableSettingsWrapper: React.FC<
+ ScrollableContentWrapperProps
+> = ({ children, className = '' }) => {
+ return (
+
+ {children}
+
+ );
+};
diff --git a/yarn.lock b/yarn.lock
index 1835d49..6f8396b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -940,6 +940,13 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/number@npm:1.1.1":
+ version: 1.1.1
+ resolution: "@radix-ui/number@npm:1.1.1"
+ checksum: 10c0/0570ad92287398e8a7910786d7cee0a998174cdd6637ba61571992897c13204adf70b9ed02d0da2af554119411128e701d9c6b893420612897b438dc91db712b
+ languageName: node
+ linkType: hard
+
"@radix-ui/primitive@npm:1.1.2":
version: 1.1.2
resolution: "@radix-ui/primitive@npm:1.1.2"
@@ -1320,6 +1327,91 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-scroll-area@npm:^1.2.8":
+ version: 1.2.8
+ resolution: "@radix-ui/react-scroll-area@npm:1.2.8"
+ dependencies:
+ "@radix-ui/number": "npm:1.1.1"
+ "@radix-ui/primitive": "npm:1.1.2"
+ "@radix-ui/react-compose-refs": "npm:1.1.2"
+ "@radix-ui/react-context": "npm:1.1.2"
+ "@radix-ui/react-direction": "npm:1.1.1"
+ "@radix-ui/react-presence": "npm:1.1.4"
+ "@radix-ui/react-primitive": "npm:2.1.2"
+ "@radix-ui/react-use-callback-ref": "npm:1.1.1"
+ "@radix-ui/react-use-layout-effect": "npm:1.1.1"
+ 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
+ checksum: 10c0/4f7f7ab06fbb138b50d4aeecf70d482b990833a4e4a5dab394b0bea72a298a83b25aaf1609d754932018a71e1fdb34a7f3443bc28d40c720814a1bf37835e6cd
+ languageName: node
+ linkType: hard
+
+"@radix-ui/react-select@npm:^2.2.4":
+ version: 2.2.4
+ resolution: "@radix-ui/react-select@npm:2.2.4"
+ dependencies:
+ "@radix-ui/number": "npm:1.1.1"
+ "@radix-ui/primitive": "npm:1.1.2"
+ "@radix-ui/react-collection": "npm:1.1.6"
+ "@radix-ui/react-compose-refs": "npm:1.1.2"
+ "@radix-ui/react-context": "npm:1.1.2"
+ "@radix-ui/react-direction": "npm:1.1.1"
+ "@radix-ui/react-dismissable-layer": "npm:1.1.9"
+ "@radix-ui/react-focus-guards": "npm:1.1.2"
+ "@radix-ui/react-focus-scope": "npm:1.1.6"
+ "@radix-ui/react-id": "npm:1.1.1"
+ "@radix-ui/react-popper": "npm:1.2.6"
+ "@radix-ui/react-portal": "npm:1.1.8"
+ "@radix-ui/react-primitive": "npm:2.1.2"
+ "@radix-ui/react-slot": "npm:1.2.2"
+ "@radix-ui/react-use-callback-ref": "npm:1.1.1"
+ "@radix-ui/react-use-controllable-state": "npm:1.2.2"
+ "@radix-ui/react-use-layout-effect": "npm:1.1.1"
+ "@radix-ui/react-use-previous": "npm:1.1.1"
+ "@radix-ui/react-visually-hidden": "npm:1.2.2"
+ aria-hidden: "npm:^1.2.4"
+ react-remove-scroll: "npm:^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
+ checksum: 10c0/96b64414abd6dab5f12cdc27bec21b08af2089a89226e84f7fef657e40a46e13465dac2338bc818ff7883b2ef2027efb644759f5be48d955655b059bd0363ff2
+ languageName: node
+ linkType: hard
+
+"@radix-ui/react-separator@npm:^1.1.6":
+ version: 1.1.6
+ resolution: "@radix-ui/react-separator@npm:1.1.6"
+ dependencies:
+ "@radix-ui/react-primitive": "npm:2.1.2"
+ 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
+ checksum: 10c0/498c581d6f712a1a2a5f956fd415c41e85769b0891cf8253fcc84bacb3e344dc4c0b8fa416283b46d04d5d7511044bc41bc448591b2bb39338864f277d915d16
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-slot@npm:1.2.2, @radix-ui/react-slot@npm:^1.2.2":
version: 1.2.2
resolution: "@radix-ui/react-slot@npm:1.2.2"
@@ -1335,6 +1427,31 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-switch@npm:^1.2.4":
+ version: 1.2.4
+ resolution: "@radix-ui/react-switch@npm:1.2.4"
+ dependencies:
+ "@radix-ui/primitive": "npm:1.1.2"
+ "@radix-ui/react-compose-refs": "npm:1.1.2"
+ "@radix-ui/react-context": "npm:1.1.2"
+ "@radix-ui/react-primitive": "npm:2.1.2"
+ "@radix-ui/react-use-controllable-state": "npm:1.2.2"
+ "@radix-ui/react-use-previous": "npm:1.1.1"
+ "@radix-ui/react-use-size": "npm:1.1.1"
+ 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
+ checksum: 10c0/53f1f985dd0ed7b28b108b8075078912fed1496313f23270f0be3234fedebb5df4b4b33f2cb1a9c5670d48a38200fc4e1f09db2608c3e94d1de61339ac2d2c53
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-tabs@npm:^1.1.11":
version: 1.1.11
resolution: "@radix-ui/react-tabs@npm:1.1.11"
@@ -1433,6 +1550,19 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-use-previous@npm:1.1.1":
+ version: 1.1.1
+ resolution: "@radix-ui/react-use-previous@npm:1.1.1"
+ peerDependencies:
+ "@types/react": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ checksum: 10c0/52f1089d941491cd59b7f52a5679a14e9381711419a0557ce0f3bc9a4c117078224efec54dcced41a3653a13a386a7b6ec75435d61a273e8b9f5d00235f2b182
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-use-rect@npm:1.1.1":
version: 1.1.1
resolution: "@radix-ui/react-use-rect@npm:1.1.1"
@@ -1463,6 +1593,25 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-visually-hidden@npm:1.2.2":
+ version: 1.2.2
+ resolution: "@radix-ui/react-visually-hidden@npm:1.2.2"
+ dependencies:
+ "@radix-ui/react-primitive": "npm:2.1.2"
+ 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
+ checksum: 10c0/464b955cbe66ae5de819af5b7c2796eba77f84ab677eade0aa57e98ea588ef5d189c822e7bee0e18608864d5d262a1c70b5dda487269219f147a2a7cea625292
+ languageName: node
+ linkType: hard
+
"@radix-ui/rect@npm:1.1.1":
version: 1.1.1
resolution: "@radix-ui/rect@npm:1.1.1"
@@ -4433,7 +4582,11 @@ __metadata:
"@radix-ui/react-dropdown-menu": "npm:^2.1.14"
"@radix-ui/react-hover-card": "npm:^1.1.13"
"@radix-ui/react-label": "npm:^2.1.6"
+ "@radix-ui/react-scroll-area": "npm:^1.2.8"
+ "@radix-ui/react-select": "npm:^2.2.4"
+ "@radix-ui/react-separator": "npm:^1.1.6"
"@radix-ui/react-slot": "npm:^1.2.2"
+ "@radix-ui/react-switch": "npm:^1.2.4"
"@radix-ui/react-tabs": "npm:^1.1.11"
"@tailwindcss/postcss": "npm:4.1.6"
"@types/node": "npm:22.15.17"