toes/src/client/styles/layout.ts
Claude a91f400100
Add dashboard landing page with clickable logo navigation
The Toes logo now links to a system-wide dashboard view that shows
app and tool counts. This is the default view when first opening
the web app.

https://claude.ai/code/session_013L9HKHxMEoub76B1zuKive
2026-02-13 16:41:20 +00:00

253 lines
5.3 KiB
TypeScript

import { define } from '@because/forge'
import { theme } from '../themes'
export const Layout = define('Layout', {
display: 'flex',
height: '100vh',
fontFamily: theme('fonts-sans'),
background: theme('colors-bg'),
color: theme('colors-text'),
})
export const Sidebar = define('Sidebar', {
width: 220,
borderRight: `1px solid ${theme('colors-border')}`,
display: 'flex',
flexDirection: 'column',
flexShrink: 0,
})
export const Logo = define('Logo', {
height: 64,
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
padding: '0 16px',
fontSize: 20,
fontWeight: 'bold',
borderBottom: `1px solid ${theme('colors-border')}`,
})
export const LogoLink = define('LogoLink', {
cursor: 'pointer',
borderRadius: theme('radius-md'),
padding: '4px 8px',
margin: '-4px -8px',
selectors: {
'&:hover': {
background: theme('colors-bgHover'),
},
},
})
export const HamburgerButton = define('HamburgerButton', {
base: 'button',
background: 'none',
border: 'none',
cursor: 'pointer',
padding: 4,
display: 'flex',
flexDirection: 'column',
justifyContent: 'center',
gap: 4,
selectors: {
'&:hover span': { background: theme('colors-text') },
},
})
export const HamburgerLine = define('HamburgerLine', {
width: 18,
height: 2,
background: theme('colors-textMuted'),
borderRadius: 1,
transition: 'background 0.15s',
})
export const SectionLabel = define('SectionLabel', {
padding: '16px 16px 8px',
fontSize: 12,
fontWeight: 600,
color: theme('colors-textFaint'),
textTransform: 'uppercase',
letterSpacing: '0.05em',
})
export const SectionSwitcher = define('SectionSwitcher', {
display: 'flex',
gap: 0,
padding: '12px 16px',
borderBottom: `1px solid ${theme('colors-border')}`,
})
export const SectionTab = define('SectionTab', {
base: 'button',
flex: 1,
padding: '6px 12px',
background: 'none',
border: 'none',
cursor: 'pointer',
fontSize: 12,
fontWeight: 600,
color: theme('colors-textMuted'),
textTransform: 'uppercase',
letterSpacing: '0.05em',
borderRadius: theme('radius-md'),
selectors: {
'&:hover': {
background: theme('colors-bgHover'),
color: theme('colors-text'),
},
},
variants: {
active: {
background: theme('colors-bgSelected'),
color: theme('colors-text'),
},
},
})
export const AppList = define('AppList', {
flex: 1,
overflow: 'auto',
})
export const AppItem = define('AppItem', {
display: 'flex',
flexDirection: 'row',
alignItems: 'center',
gap: 8,
padding: '8px 16px',
color: theme('colors-textMuted'),
textDecoration: 'none',
fontSize: 14,
cursor: 'pointer',
selectors: {
'&:hover': { background: theme('colors-bgHover'), color: theme('colors-text') },
},
variants: {
selected: { background: theme('colors-bgSelected'), color: theme('colors-text'), fontWeight: 500 },
},
})
export const SidebarFooter = define('SidebarFooter', {
padding: 16,
borderTop: `1px solid ${theme('colors-border')}`,
})
export const Main = define('Main', {
flex: 1,
display: 'flex',
flexDirection: 'column',
overflow: 'hidden',
})
export const MainHeader = define('MainHeader', {
height: 64,
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
padding: '0 24px',
borderBottom: `1px solid ${theme('colors-border')}`,
})
export const MainTitle = define('MainTitle', {
display: 'flex',
alignItems: 'center',
gap: 8,
fontSize: 20,
fontWeight: 600,
margin: 0,
})
export const AppSelectorChevron = define('AppSelectorChevron', {
base: 'button',
background: 'none',
border: 'none',
cursor: 'pointer',
padding: '4px 8px',
marginLeft: 4,
fontSize: 14,
color: theme('colors-textMuted'),
selectors: {
'&:hover': { color: theme('colors-text') },
},
})
export const ClickableAppName = define('ClickableAppName', {
cursor: 'pointer',
borderRadius: theme('radius-md'),
padding: '2px 6px',
margin: '-2px -6px',
selectors: {
'&:hover': {
background: theme('colors-bgHover'),
},
},
})
export const HeaderActions = define('HeaderActions', {
display: 'flex',
gap: 8,
})
export const MainContent = define('MainContent', {
flex: 1,
padding: '10px 24px',
overflow: 'auto',
})
export const DashboardContainer = define('DashboardContainer', {
flex: 1,
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
padding: 40,
gap: 40,
})
export const DashboardHeader = define('DashboardHeader', {
textAlign: 'center',
})
export const DashboardTitle = define('DashboardTitle', {
fontSize: 48,
fontWeight: 'bold',
margin: 0,
marginBottom: 8,
})
export const DashboardSubtitle = define('DashboardSubtitle', {
fontSize: 16,
color: theme('colors-textMuted'),
margin: 0,
})
export const StatsGrid = define('StatsGrid', {
display: 'flex',
gap: 24,
})
export const StatCard = define('StatCard', {
background: theme('colors-bgElement'),
border: `1px solid ${theme('colors-border')}`,
borderRadius: theme('radius-md'),
padding: '24px 40px',
textAlign: 'center',
minWidth: 120,
})
export const StatValue = define('StatValue', {
fontSize: 36,
fontWeight: 'bold',
color: theme('colors-text'),
marginBottom: 4,
})
export const StatLabel = define('StatLabel', {
fontSize: 14,
color: theme('colors-textMuted'),
textTransform: 'uppercase',
letterSpacing: '0.05em',
})