React + Vite + TypeScript SPA covering the full ABS feature set (library browsing, item detail, metadata/cover editing, podcasts, player with session sync, admin: users/libraries/scanner/server settings). Dev uses a dynamic CORS proxy; production is served by server/index.mjs (static + reverse proxy to ABS_URL). Includes systemd unit and installer under deploy/. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
54 lines
1.6 KiB
JavaScript
54 lines
1.6 KiB
JavaScript
/** @type {import('tailwindcss').Config} */
|
|
export default {
|
|
content: ['./index.html', './src/**/*.{ts,tsx}'],
|
|
theme: {
|
|
extend: {
|
|
colors: {
|
|
bg: 'var(--bg)',
|
|
surface: 'var(--surface)',
|
|
'surface-2': 'var(--surface-2)',
|
|
border: 'var(--border)',
|
|
text: 'var(--text)',
|
|
'text-muted': 'var(--text-muted)',
|
|
accent: 'var(--accent)',
|
|
'accent-soft': 'var(--accent-soft)',
|
|
'on-accent': 'var(--on-accent)',
|
|
destructive: 'var(--destructive)',
|
|
success: 'var(--success)',
|
|
},
|
|
fontFamily: {
|
|
heading: ['"Fraunces Variable"', 'Fraunces', 'ui-serif', 'Georgia', 'serif'],
|
|
sans: ['"Hanken Grotesk Variable"', '"Hanken Grotesk"', 'ui-sans-serif', 'system-ui', 'sans-serif'],
|
|
},
|
|
borderRadius: {
|
|
DEFAULT: 'var(--radius)',
|
|
lg: 'calc(var(--radius) + 4px)',
|
|
xl: 'calc(var(--radius) + 8px)',
|
|
},
|
|
boxShadow: {
|
|
card: '0 1px 2px rgba(0,0,0,0.4), 0 8px 24px -12px rgba(0,0,0,0.6)',
|
|
lift: '0 12px 32px -8px rgba(0,0,0,0.7)',
|
|
bar: '0 -8px 24px -12px rgba(0,0,0,0.8)',
|
|
},
|
|
keyframes: {
|
|
'slide-up': {
|
|
from: { transform: 'translateY(100%)', opacity: '0' },
|
|
to: { transform: 'translateY(0)', opacity: '1' },
|
|
},
|
|
'fade-in': {
|
|
from: { opacity: '0' },
|
|
to: { opacity: '1' },
|
|
},
|
|
shimmer: {
|
|
'100%': { transform: 'translateX(100%)' },
|
|
},
|
|
},
|
|
animation: {
|
|
'slide-up': 'slide-up 280ms cubic-bezier(0.16, 1, 0.3, 1)',
|
|
'fade-in': 'fade-in 200ms ease-out',
|
|
},
|
|
},
|
|
},
|
|
plugins: [],
|
|
}
|