toes/src/client/styles/dashboard.ts
2026-02-28 12:58:21 -08:00

287 lines
5.9 KiB
TypeScript

import { define } from '@because/forge'
import { theme } from '../themes'
// Vitals Section
export const VitalsSection = define('VitalsSection', {
display: 'grid',
gridTemplateColumns: 'repeat(3, 1fr)',
gap: 24,
width: '100%',
maxWidth: 800,
variants: {
narrow: {
gap: 12,
},
},
})
export const VitalCard = define('VitalCard', {
background: theme('colors-bgElement'),
border: `1px solid ${theme('colors-border')}`,
borderRadius: theme('radius-md'),
padding: 24,
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
gap: 16,
variants: {
narrow: {
padding: 12,
gap: 8,
},
},
})
export const VitalLabel = define('VitalLabel', {
fontSize: 12,
fontWeight: 600,
color: theme('colors-textFaint'),
textTransform: 'uppercase',
letterSpacing: '0.05em',
})
export const GaugeContainer = define('GaugeContainer', {
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
})
export const GaugeSvg = define('GaugeSvg', {
base: 'svg',
width: 120,
height: 70,
overflow: 'visible',
})
export const GaugeValue = define('GaugeValue', {
fontSize: 20,
fontWeight: 'bold',
fontFamily: theme('fonts-mono'),
color: theme('colors-text'),
marginTop: 20,
marginLeft: 5,
})
// Unified Logs Section
export const LogsSection = define('LogsSection', {
width: '100%',
flex: 1,
minHeight: 0,
display: 'flex',
flexDirection: 'column',
background: theme('colors-bgElement'),
border: `1px solid ${theme('colors-border')}`,
borderRadius: theme('radius-md'),
overflow: 'hidden',
})
export const LogsHeader = define('LogsHeader', {
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
padding: '12px 16px',
borderBottom: `1px solid ${theme('colors-border')}`,
flexShrink: 0,
})
export const LogsTitle = define('LogsTitle', {
fontSize: 12,
fontWeight: 600,
color: theme('colors-textFaint'),
textTransform: 'uppercase',
letterSpacing: '0.05em',
})
export const LogsClearButton = define('LogsClearButton', {
base: 'button',
background: theme('colors-border'),
border: 'none',
borderRadius: 4,
padding: '4px 10px',
fontSize: 11,
fontWeight: 600,
color: theme('colors-textMuted'),
cursor: 'pointer',
textTransform: 'uppercase',
letterSpacing: '0.03em',
selectors: {
'&:hover': {
background: theme('colors-bgHover'),
color: theme('colors-text'),
},
},
})
export const LogsTabs = define('LogsTabs', {
display: 'flex',
gap: 0,
})
export const LogsTab = define('LogsTab', {
base: 'button',
background: 'none',
border: 'none',
borderBottom: '2px solid transparent',
padding: '0 8px 8px',
fontSize: 11,
fontWeight: 600,
color: theme('colors-textFaint'),
cursor: 'pointer',
textTransform: 'uppercase',
letterSpacing: '0.05em',
selectors: {
'&:hover': {
color: theme('colors-text'),
},
},
variants: {
active: {
color: theme('colors-text'),
borderBottomColor: theme('colors-text'),
},
},
})
export const LogsBody = define('LogsBody', {
flex: 1,
minHeight: 0,
overflow: 'auto',
fontFamily: theme('fonts-mono'),
fontSize: 12,
lineHeight: 1.5,
})
export const LogEntry = define('LogEntry', {
display: 'flex',
gap: 8,
padding: '2px 16px',
selectors: {
'&:hover': {
background: theme('colors-bgHover'),
},
},
variants: {
narrow: {
padding: '2px 8px',
},
},
})
export const LogTimestamp = define('LogTimestamp', {
color: theme('colors-textFaint'),
flexShrink: 0,
variants: {
narrow: {
display: 'none',
},
},
})
export const LogApp = define('LogApp', {
color: theme('colors-textMuted'),
flexShrink: 0,
minWidth: 80,
variants: {
narrow: {
minWidth: 50,
},
},
})
export const LogText = define('LogText', {
color: theme('colors-text'),
whiteSpace: 'pre-wrap',
wordBreak: 'break-all',
})
export const LogStatus = define('LogStatus', {
variants: {
success: { color: '#22c55e' },
error: { color: '#ef4444' },
warning: { color: '#f59e0b' },
},
})
// App Tiles Grid
export const TileGrid = define('TileGrid', {
width: '100%',
maxWidth: 900,
margin: '0 auto',
display: 'grid',
gridTemplateColumns: 'repeat(auto-fill, minmax(240px, 1fr))',
gap: 20,
variants: {
narrow: { gridTemplateColumns: '1fr' },
},
})
export const Tile = define('Tile', {
base: 'a',
position: 'relative',
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
gap: 8,
padding: '28px 20px 24px',
background: theme('colors-bgElement'),
border: `1px solid ${theme('colors-border')}`,
borderRadius: theme('radius-md'),
textDecoration: 'none',
cursor: 'pointer',
selectors: {
'&:hover': {
background: theme('colors-bgHover'),
borderColor: theme('colors-textFaint'),
},
},
variants: {
narrow: {
flexDirection: 'row',
alignItems: 'center',
padding: '16px 20px',
gap: 16,
},
},
})
export const TileIcon = define('TileIcon', {
fontSize: 48,
lineHeight: 1,
userSelect: 'none',
})
export const TileName = define('TileName', {
fontSize: 15,
fontWeight: 600,
color: theme('colors-text'),
textAlign: 'center',
})
export const TilePort = define('TilePort', {
fontFamily: theme('fonts-mono'),
fontSize: 13,
color: theme('colors-textFaint'),
})
export const TileStatus = define('TileStatus', {
position: 'absolute',
top: 8,
right: 8,
width: 2,
height: 2,
borderRadius: '50%',
cursor: 'pointer',
padding: 4,
backgroundClip: 'content-box',
variants: {
state: {
error: { background: theme('colors-statusInvalid') },
invalid: { background: theme('colors-statusInvalid') },
stopped: { background: theme('colors-statusStopped') },
starting: { background: theme('colors-statusStarting') },
running: { background: theme('colors-statusRunning') },
stopping: { background: theme('colors-statusStarting') },
},
},
})