'use client'; import { cva, VariantProps } from 'class-variance-authority'; import * as React from 'react'; import { __AppSidebarContext } from '.'; import { cn, ComponentAnatomy, defineStyleAnatomy } from '../core/styling'; /* ------------------------------------------------------------------------------------------------- * Anatomy * -----------------------------------------------------------------------------------------------*/ export const AppLayoutAnatomy = defineStyleAnatomy({ root: cva(['UI-AppLayout__root appLayout', 'flex w-full group/appLayout'], { variants: { withSidebar: { true: 'flex-row with-sidebar', false: 'flex-col', }, sidebarSize: { slim: 'sidebar-slim', sm: 'sidebar-sm', md: 'sidebar-md', lg: 'sidebar-lg', xl: 'sidebar-xl', }, }, defaultVariants: { withSidebar: false, sidebarSize: 'md', }, compoundVariants: [ { withSidebar: true, sidebarSize: 'slim', className: 'lg:[&>.appLayout]:pl-20', }, { withSidebar: true, sidebarSize: 'sm', className: 'lg:[&>.appLayout]:pl-48', }, { withSidebar: true, sidebarSize: 'md', className: 'lg:[&>.appLayout]:pl-64', }, { withSidebar: true, sidebarSize: 'lg', className: 'lg:[&>.appLayout]:pl-[20rem]', }, { withSidebar: true, sidebarSize: 'xl', className: 'lg:[&>.appLayout]:pl-[25rem]', }, ], }), }); export const AppLayoutHeaderAnatomy = defineStyleAnatomy({ root: cva(['UI-AppLayoutHeader__root', 'relative w-full']), }); export const AppLayoutSidebarAnatomy = defineStyleAnatomy({ root: cva([ 'UI-AppLayoutSidebar__root z-50', 'hidden lg:fixed lg:inset-y-0 lg:flex lg:flex-col grow-0 shrink-0 basis-0', 'group-[.sidebar-slim]/appLayout:w-20', 'group-[.sidebar-sm]/appLayout:w-48', 'group-[.sidebar-md]/appLayout:w-64', 'group-[.sidebar-lg]/appLayout:w-[20rem]', 'group-[.sidebar-xl]/appLayout:w-[25rem]', ]), }); export const AppLayoutContentAnatomy = defineStyleAnatomy({ root: cva(['UI-AppLayoutContent__root', 'relative']), }); export const AppLayoutFooterAnatomy = defineStyleAnatomy({ root: cva(['UI-AppLayoutFooter__root', 'relative']), }); export const AppLayoutStackAnatomy = defineStyleAnatomy({ root: cva(['UI-AppLayoutStack__root', 'relative'], { variants: { spacing: { sm: 'space-y-2', md: 'space-y-4', lg: 'space-y-8', xl: 'space-y-10', }, }, defaultVariants: { spacing: 'md', }, }), }); export const AppLayoutGridAnatomy = defineStyleAnatomy({ root: cva(['UI-AppLayoutGrid__root', 'relative flex flex-col'], { variants: { breakBelow: { sm: 'sm:grid sm:space-y-0', md: 'md:grid md:space-y-0', lg: 'lg:grid lg:space-y-0', xl: 'xl:grid xl:space-y-0', }, spacing: { sm: 'gap-2', md: 'gap-4', lg: 'gap-8', xl: 'gap-10', }, cols: { 1: null, 2: null, 3: null, 4: null, 5: null, 6: null }, }, defaultVariants: { breakBelow: 'xl', spacing: 'md', cols: 3, }, compoundVariants: [ { breakBelow: 'sm', cols: 1, className: 'sm:grid-cols-1' }, { breakBelow: 'sm', cols: 2, className: 'sm:grid-cols-2' }, { breakBelow: 'sm', cols: 3, className: 'sm:grid-cols-3' }, { breakBelow: 'sm', cols: 4, className: 'sm:grid-cols-4' }, { breakBelow: 'sm', cols: 5, className: 'sm:grid-cols-5' }, { breakBelow: 'sm', cols: 6, className: 'sm:grid-cols-6' }, { breakBelow: 'md', cols: 1, className: 'md:grid-cols-1' }, { breakBelow: 'md', cols: 2, className: 'md:grid-cols-2' }, { breakBelow: 'md', cols: 3, className: 'md:grid-cols-3' }, { breakBelow: 'md', cols: 4, className: 'md:grid-cols-4' }, { breakBelow: 'md', cols: 5, className: 'md:grid-cols-5' }, { breakBelow: 'md', cols: 6, className: 'md:grid-cols-6' }, { breakBelow: 'lg', cols: 1, className: 'lg:grid-cols-1' }, { breakBelow: 'lg', cols: 2, className: 'lg:grid-cols-2' }, { breakBelow: 'lg', cols: 3, className: 'lg:grid-cols-3' }, { breakBelow: 'lg', cols: 4, className: 'lg:grid-cols-4' }, { breakBelow: 'lg', cols: 5, className: 'lg:grid-cols-5' }, { breakBelow: 'lg', cols: 6, className: 'lg:grid-cols-6' }, { breakBelow: 'xl', cols: 1, className: 'xl:grid-cols-1' }, { breakBelow: 'xl', cols: 2, className: 'xl:grid-cols-2' }, { breakBelow: 'xl', cols: 3, className: 'xl:grid-cols-3' }, { breakBelow: 'xl', cols: 4, className: 'xl:grid-cols-4' }, { breakBelow: 'xl', cols: 5, className: 'xl:grid-cols-5' }, { breakBelow: 'xl', cols: 6, className: 'xl:grid-cols-6' }, ], }), }); /* ------------------------------------------------------------------------------------------------- * AppLayout * -----------------------------------------------------------------------------------------------*/ export type AppLayoutProps = React.ComponentPropsWithRef<'div'> & ComponentAnatomy & VariantProps; export const AppLayout = React.forwardRef( (props, ref) => { const { children, className, withSidebar = false, sidebarSize, ...rest } = props; const ctx = React.useContext(__AppSidebarContext); return (
{children}
); } ); AppLayout.displayName = 'AppLayout'; /* ------------------------------------------------------------------------------------------------- * AppLayoutHeader * -----------------------------------------------------------------------------------------------*/ export type AppLayoutHeaderProps = React.ComponentPropsWithRef<'header'>; export const AppLayoutHeader = React.forwardRef< HTMLElement, AppLayoutHeaderProps >((props, ref) => { const { children, className, ...rest } = props; return (
{children}
); }); AppLayoutHeader.displayName = 'AppLayoutHeader'; /* ------------------------------------------------------------------------------------------------- * AppLayoutSidebar * -----------------------------------------------------------------------------------------------*/ export type AppLayoutSidebarProps = React.ComponentPropsWithRef<'aside'>; export const AppLayoutSidebar = React.forwardRef< HTMLElement, AppLayoutSidebarProps >((props, ref) => { const { children, className, ...rest } = props; return ( ); }); AppLayoutSidebar.displayName = 'AppLayoutSidebar'; /* ------------------------------------------------------------------------------------------------- * AppLayoutContent * -----------------------------------------------------------------------------------------------*/ export type AppLayoutContentProps = React.ComponentPropsWithRef<'main'>; export const AppLayoutContent = React.forwardRef< HTMLElement, AppLayoutContentProps >((props, ref) => { const { children, className, ...rest } = props; return (
{children}
); }); AppLayoutContent.displayName = 'AppLayoutContent'; /* ------------------------------------------------------------------------------------------------- * AppLayoutGrid * -----------------------------------------------------------------------------------------------*/ export type AppLayoutGridProps = React.ComponentPropsWithRef<'section'> & VariantProps; export const AppLayoutGrid = React.forwardRef( (props, ref) => { const { children, className, breakBelow, cols, spacing, ...rest } = props; return (
{children}
); } ); AppLayoutGrid.displayName = 'AppLayoutGrid'; /* ------------------------------------------------------------------------------------------------- * AppLayoutFooter * -----------------------------------------------------------------------------------------------*/ export type AppLayoutFooterProps = React.ComponentPropsWithRef<'footer'>; export const AppLayoutFooter = React.forwardRef< HTMLElement, AppLayoutFooterProps >((props, ref) => { const { children, className, ...rest } = props; return (
{children}
); }); AppLayoutFooter.displayName = 'AppLayoutFooter'; /* ------------------------------------------------------------------------------------------------- * AppLayoutStack * -----------------------------------------------------------------------------------------------*/ export type AppLayoutStackProps = React.ComponentPropsWithRef<'div'> & VariantProps; export const AppLayoutStack = React.forwardRef< HTMLDivElement, AppLayoutStackProps >((props, ref) => { const { children, className, spacing, ...rest } = props; return (
{children}
); }); AppLayoutStack.displayName = 'AppLayoutStack';