diff --git a/src/app/(dashboard)/configuracoes/fontes/page.tsx b/src/app/(dashboard)/configuracoes/fontes/page.tsx new file mode 100644 index 0000000..61cb28a --- /dev/null +++ b/src/app/(dashboard)/configuracoes/fontes/page.tsx @@ -0,0 +1,17 @@ +import type { Metadata } from 'next' + +import { SettingsContainer } from '@/modules/settings/layout/settings-container' + +import { FontSizeCards } from '../../../../modules/settings/cards/fontsize/fontsize-cards' + +export const metadata: Metadata = { + title: 'Tamanho da fonte', +} + +export default function Page() { + return ( + + + + ) +} diff --git a/src/app/(dashboard)/configuracoes/layout.tsx b/src/app/(dashboard)/configuracoes/layout.tsx new file mode 100644 index 0000000..76276c3 --- /dev/null +++ b/src/app/(dashboard)/configuracoes/layout.tsx @@ -0,0 +1,14 @@ +import { SettingsSidebar } from '@/modules/settings/layout' + +import { SettingsContent } from '../../../modules/settings/layout/settings-content' + +export default async function Layout({ + children, +}: Readonly<{ children: React.ReactNode }>) { + return ( +
+ + {children} +
+ ) +} diff --git a/src/app/(dashboard)/configuracoes/page.tsx b/src/app/(dashboard)/configuracoes/page.tsx index 0bdd6fd..d8833cc 100644 --- a/src/app/(dashboard)/configuracoes/page.tsx +++ b/src/app/(dashboard)/configuracoes/page.tsx @@ -1,15 +1,16 @@ import type { Metadata } from 'next' +import { NotificationPreferences } from '@/modules/settings/cards/notifications/notifications-cards' +import { SettingsContainer } from '@/modules/settings/layout/settings-container' + export const metadata: Metadata = { title: 'Configurações', } -import { DashboardContainer } from '@/components/dashboard/container' - export default function Page() { return ( - - Configurações - + + + ) } diff --git a/src/components/ui/switch.tsx b/src/components/ui/switch.tsx new file mode 100644 index 0000000..260a559 --- /dev/null +++ b/src/components/ui/switch.tsx @@ -0,0 +1,13 @@ +'use client' +import { Switch as BaseSwitch } from '@base-ui-components/react/switch' + +export function Switch() { + return ( + + + + ) +} diff --git a/src/constants/routes.ts b/src/constants/routes.ts index 5a405f5..5ea7ae7 100644 --- a/src/constants/routes.ts +++ b/src/constants/routes.ts @@ -43,6 +43,7 @@ export const ROUTES = { }, settings: { main: '/configuracoes', + fontSize: '/configuracoes/fontes', }, support: { main: '/suporte', diff --git a/src/modules/settings/cards/fontsize/fontsize-cards.tsx b/src/modules/settings/cards/fontsize/fontsize-cards.tsx new file mode 100644 index 0000000..5e614dc --- /dev/null +++ b/src/modules/settings/cards/fontsize/fontsize-cards.tsx @@ -0,0 +1,33 @@ +'use client' + +import { useState } from 'react' + +import { FontSizeCard } from '@/modules/settings/cards/fontsize' + +type FontSize = 'small' | 'medium' | 'large' + +export function FontSizeCards() { + const [selectedSize, setSelectedSize] = useState('medium') + + return ( +
+ setSelectedSize('small')} + /> + setSelectedSize('medium')} + /> + setSelectedSize('large')} + /> +
+ ) +} diff --git a/src/modules/settings/cards/fontsize/index.tsx b/src/modules/settings/cards/fontsize/index.tsx new file mode 100644 index 0000000..2e4a97c --- /dev/null +++ b/src/modules/settings/cards/fontsize/index.tsx @@ -0,0 +1,58 @@ +'use client' +import { twMerge } from 'tailwind-merge' + +import { Button } from '@/components/ui/button' +import { Card } from '@/components/ui/card' + +interface FontSizeCardProps { + sizeLabel: string + textDisplayClass?: string + isSelected?: boolean + onClick?: () => void + className?: string +} + +export function FontSizeCard({ + sizeLabel, + textDisplayClass, + isSelected = false, + onClick, + className, +}: FontSizeCardProps) { + return ( + + ) +} diff --git a/src/modules/settings/cards/notifications/index.tsx b/src/modules/settings/cards/notifications/index.tsx new file mode 100644 index 0000000..9cb7d17 --- /dev/null +++ b/src/modules/settings/cards/notifications/index.tsx @@ -0,0 +1,15 @@ +import { Card } from '@/components/ui/card' +import { Switch } from '@/components/ui/switch' + +interface NotificationCardProps { + label: string +} + +export function NotificationCard({ label }: NotificationCardProps) { + return ( + +

{label}

+ +
+ ) +} diff --git a/src/modules/settings/cards/notifications/notifications-cards.tsx b/src/modules/settings/cards/notifications/notifications-cards.tsx new file mode 100644 index 0000000..091b435 --- /dev/null +++ b/src/modules/settings/cards/notifications/notifications-cards.tsx @@ -0,0 +1,12 @@ +import { NotificationCard } from './index' + +export function NotificationPreferences() { + return ( +
+ + + + +
+ ) +} diff --git a/src/modules/settings/layout/index.tsx b/src/modules/settings/layout/index.tsx new file mode 100644 index 0000000..6f684a3 --- /dev/null +++ b/src/modules/settings/layout/index.tsx @@ -0,0 +1,32 @@ +import { ALargeSmall, BellDot } from 'lucide-react' + +import { ROUTES } from '@/constants/routes' + +import { SettingsMenuSection } from './settings-menu-section' +import { SettingsSidebarContainer } from './settings-sidebar-container' + +export function SettingsSidebar() { + return ( + + + + ) +} + +const SETTINGS_SIDEBAR_SECTIONS = [ + { + id: 'common', + links: [ + { + label: 'Notificações', + icon: , + path: ROUTES.dashboard.settings.main, + }, + { + label: 'Tamanho da fonte', + icon: , + path: ROUTES.dashboard.settings.fontSize, + }, + ], + }, +] diff --git a/src/modules/settings/layout/settings-container.tsx b/src/modules/settings/layout/settings-container.tsx new file mode 100644 index 0000000..fc6e6a5 --- /dev/null +++ b/src/modules/settings/layout/settings-container.tsx @@ -0,0 +1,8 @@ +import { cn } from '@/utils/class-name-merge' + +export function SettingsContainer({ + className, + ...props +}: Readonly>) { + return
+} diff --git a/src/modules/settings/layout/settings-content.tsx b/src/modules/settings/layout/settings-content.tsx new file mode 100644 index 0000000..6173afe --- /dev/null +++ b/src/modules/settings/layout/settings-content.tsx @@ -0,0 +1,39 @@ +'use client' + +import { usePathname } from 'next/navigation' +import { type ReactNode } from 'react' + +import { SettingsHeader } from '@/modules/settings/layout/settings-header' + +const HEADERS_TEXT = { + notificacoes: { + title: 'Notificações', + description: 'Gerencie quais notificações deseja receber.', + }, + fontes: { + title: 'Tamanho da fonte', + description: 'Selecione o tamanho da fonte', + }, + policies: { + title: 'Políticas de privacidade e termos de uso', + description: 'Revise nossas políticas de privacidade e termos de uso.', + }, +} + +export function SettingsContent({ children }: { children: ReactNode }) { + const pathname = usePathname() + const pathSegments = pathname.split('/') + const lastSegment = pathSegments[pathSegments.length - 1] + + const pageKey = lastSegment === 'configuracoes' ? 'notificacoes' : lastSegment + + const { title, description } = + HEADERS_TEXT[pageKey as keyof typeof HEADERS_TEXT] + + return ( +
+ + {children} +
+ ) +} diff --git a/src/modules/settings/layout/settings-header.tsx b/src/modules/settings/layout/settings-header.tsx new file mode 100644 index 0000000..6ea2385 --- /dev/null +++ b/src/modules/settings/layout/settings-header.tsx @@ -0,0 +1,18 @@ +import { Divider } from '@/components/ui/divider' + +interface SettingsHeaderProps { + title: string + description: string +} + +export function SettingsHeader({ title, description }: SettingsHeaderProps) { + return ( + <> +
+

{title}

+

{description}

+
+ + + ) +} diff --git a/src/modules/settings/layout/settings-menu-section.tsx b/src/modules/settings/layout/settings-menu-section.tsx new file mode 100644 index 0000000..2a92966 --- /dev/null +++ b/src/modules/settings/layout/settings-menu-section.tsx @@ -0,0 +1,51 @@ +'use client' +import { usePathname } from 'next/navigation' + +import { NavButton } from '@/components/ui/nav-button' +import { cn } from '@/utils/class-name-merge' + +interface SettingsMenuSectionProps { + sections: { + id: string + links: { + label: string + icon: React.ReactNode + path: string + }[] + }[] +} + +export function SettingsMenuSection({ + sections, +}: Readonly) { + const pathname = usePathname() + + return ( +
+ {sections.map((section) => ( +
+ +
+ ))} +
+ ) +} diff --git a/src/modules/settings/layout/settings-sidebar-container.tsx b/src/modules/settings/layout/settings-sidebar-container.tsx new file mode 100644 index 0000000..1fbc5f1 --- /dev/null +++ b/src/modules/settings/layout/settings-sidebar-container.tsx @@ -0,0 +1,14 @@ +export function SettingsSidebarContainer({ + ...props +}: Readonly>) { + return ( +
+
+ ) +}