UNPKG

goobs-frontend

Version:

A comprehensive React-based libary for building modern web applications

316 lines (298 loc) 7.75 kB
// -------------------------------------------------------------------------- // BREADCRUMB THEME SYSTEM // -------------------------------------------------------------------------- import React from 'react' import { SHADOWS, TRANSITIONS } from './shared' // -------------------------------------------------------------------------- // TYPE DEFINITIONS // -------------------------------------------------------------------------- /** * Breadcrumb theme type definition */ export interface BreadcrumbTheme { container: React.CSSProperties list: React.CSSProperties listItem: React.CSSProperties item: React.CSSProperties itemHover: React.CSSProperties activeItem: React.CSSProperties separator: React.CSSProperties ellipsis: React.CSSProperties // Sacred theme specific styles sacred?: { shimmer: React.CSSProperties glyph: React.CSSProperties } transition: string } /** * Breadcrumb styles configuration interface */ export interface BreadcrumbStyles { /** Theme variant */ theme?: 'light' | 'dark' | 'sacred' /** Custom container styles */ container?: React.CSSProperties /** Custom item styles */ item?: React.CSSProperties /** Custom separator styles */ separator?: React.CSSProperties /** Custom active item styles */ activeItem?: React.CSSProperties /** Custom hover styles */ itemHover?: React.CSSProperties } // -------------------------------------------------------------------------- // THEME DEFINITIONS // -------------------------------------------------------------------------- const lightTheme: BreadcrumbTheme = { container: { display: 'flex', alignItems: 'center', padding: '8px 0', position: 'relative', }, list: { display: 'flex', alignItems: 'center', listStyle: 'none', margin: 0, padding: 0, flexWrap: 'wrap', }, listItem: { display: 'flex', alignItems: 'center', }, item: { color: 'rgba(0, 0, 0, 0.6)', textDecoration: 'none', fontSize: '14px', fontFamily: 'Inter, system-ui, sans-serif', fontWeight: '400', padding: '4px 8px', borderRadius: '4px', transition: TRANSITIONS.medium, cursor: 'pointer', position: 'relative', }, itemHover: { color: 'rgba(25, 118, 210, 1)', backgroundColor: 'rgba(25, 118, 210, 0.04)', }, activeItem: { color: 'rgba(0, 0, 0, 0.87)', fontWeight: '500', cursor: 'default', }, separator: { color: 'rgba(0, 0, 0, 0.38)', fontSize: '14px', margin: '0 8px', userSelect: 'none', }, ellipsis: { color: 'rgba(0, 0, 0, 0.38)', fontSize: '14px', padding: '4px 8px', userSelect: 'none', }, transition: TRANSITIONS.medium, } const darkTheme: BreadcrumbTheme = { container: { display: 'flex', alignItems: 'center', padding: '8px 0', position: 'relative', }, list: { display: 'flex', alignItems: 'center', listStyle: 'none', margin: 0, padding: 0, flexWrap: 'wrap', }, listItem: { display: 'flex', alignItems: 'center', }, item: { color: 'rgba(255, 255, 255, 0.7)', textDecoration: 'none', fontSize: '14px', fontFamily: 'Inter, system-ui, sans-serif', fontWeight: '400', padding: '4px 8px', borderRadius: '4px', transition: TRANSITIONS.medium, cursor: 'pointer', position: 'relative', }, itemHover: { color: 'rgba(96, 165, 250, 1)', backgroundColor: 'rgba(96, 165, 250, 0.1)', }, activeItem: { color: 'rgba(255, 255, 255, 0.95)', fontWeight: '500', cursor: 'default', }, separator: { color: 'rgba(255, 255, 255, 0.5)', fontSize: '14px', margin: '0 8px', userSelect: 'none', }, ellipsis: { color: 'rgba(255, 255, 255, 0.5)', fontSize: '14px', padding: '4px 8px', userSelect: 'none', }, transition: TRANSITIONS.medium, } const sacredTheme: BreadcrumbTheme = { container: { display: 'flex', alignItems: 'center', padding: '12px 16px', position: 'relative', backgroundColor: 'rgba(10, 10, 10, 0.9)', border: '1px solid rgba(255, 215, 0, 0.3)', borderRadius: '8px', boxShadow: SHADOWS.sacred.small, backdropFilter: 'blur(8px)', backgroundImage: ` radial-gradient(circle at 20% 30%, rgba(255, 215, 0, 0.05) 0%, transparent 50%), radial-gradient(circle at 80% 70%, rgba(255, 215, 0, 0.03) 0%, transparent 50%) `, overflow: 'hidden', }, list: { display: 'flex', alignItems: 'center', listStyle: 'none', margin: 0, padding: 0, flexWrap: 'wrap', position: 'relative', zIndex: 2, }, listItem: { display: 'flex', alignItems: 'center', }, item: { color: 'rgba(255, 215, 0, 0.8)', textDecoration: 'none', fontSize: '14px', fontFamily: '"Cinzel", serif', fontWeight: '400', padding: '6px 12px', borderRadius: '6px', transition: TRANSITIONS.premium, cursor: 'pointer', position: 'relative', letterSpacing: '0.025em', textShadow: '0 0 2px rgba(255, 215, 0, 0.3)', }, itemHover: { color: '#FFD700', backgroundColor: 'rgba(255, 215, 0, 0.1)', transform: 'translateY(-1px)', textShadow: '0 0 8px rgba(255, 215, 0, 0.6)', boxShadow: '0 4px 12px rgba(255, 215, 0, 0.2)', }, activeItem: { color: '#FFD700', fontWeight: '600', cursor: 'default', textShadow: '0 0 10px rgba(255, 215, 0, 0.8)', backgroundColor: 'rgba(255, 215, 0, 0.05)', }, separator: { color: 'rgba(255, 215, 0, 0.6)', fontSize: '16px', margin: '0 12px', userSelect: 'none', filter: 'drop-shadow(0 0 4px rgba(255, 215, 0, 0.4))', }, ellipsis: { color: 'rgba(255, 215, 0, 0.5)', fontSize: '14px', padding: '6px 12px', userSelect: 'none', fontFamily: '"Cinzel", serif', }, sacred: { shimmer: { position: 'absolute', top: '0', left: '-100%', width: '100%', height: '100%', background: 'linear-gradient(90deg, transparent, rgba(255, 215, 0, 0.1), transparent)', animation: 'sacredShimmer 3s ease-in-out infinite', pointerEvents: 'none', zIndex: 1, }, glyph: { position: 'absolute', fontSize: '12px', color: 'rgba(255, 215, 0, 0.3)', transition: 'all 0.3s ease', pointerEvents: 'none', }, }, transition: TRANSITIONS.premium, } // -------------------------------------------------------------------------- // THEME MAPPING // -------------------------------------------------------------------------- export const breadcrumbThemes = { light: lightTheme, dark: darkTheme, sacred: sacredTheme, } // -------------------------------------------------------------------------- // THEME GETTER FUNCTION // -------------------------------------------------------------------------- export const getBreadcrumbTheme = ( theme: 'light' | 'dark' | 'sacred' = 'light' ): BreadcrumbTheme => { return breadcrumbThemes[theme] } // -------------------------------------------------------------------------- // STYLES COMPUTATION FUNCTION // -------------------------------------------------------------------------- export const getBreadcrumbStyles = ( styles?: BreadcrumbStyles ): BreadcrumbTheme => { const theme = getBreadcrumbTheme(styles?.theme || 'light') return { ...theme, container: { ...theme.container, ...styles?.container, }, item: { ...theme.item, ...styles?.item, }, separator: { ...theme.separator, ...styles?.separator, }, activeItem: { ...theme.activeItem, ...styles?.activeItem, }, itemHover: { ...theme.itemHover, ...styles?.itemHover, }, } }