/* Copyright (C) 2025 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ /** `darkMode: 'class'` 与 ThemeProvider 一致:实际主题由 document.documentElement 的 `dark` 类控制 */ export default { darkMode: 'class', content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}'], theme: { extend: { colors: { transparent: 'transparent', current: 'currentColor', black: '#000', white: '#fff', // ---- shadcn/ui CSS variable tokens (TokenDance 风格) ---- background: 'hsl(var(--background))', foreground: 'hsl(var(--foreground))', card: 'hsl(var(--card))', 'card-foreground': 'hsl(var(--card-foreground))', popover: 'hsl(var(--popover))', 'popover-foreground': 'hsl(var(--popover-foreground))', primary: { DEFAULT: 'hsl(var(--primary))', foreground: 'hsl(var(--primary-foreground))', }, secondary: { DEFAULT: 'hsl(var(--secondary))', foreground: 'hsl(var(--secondary-foreground))', }, muted: { DEFAULT: 'hsl(var(--muted))', foreground: 'hsl(var(--muted-foreground))', }, accent: { DEFAULT: 'hsl(var(--accent))', foreground: 'hsl(var(--accent-foreground))', }, destructive: { DEFAULT: 'hsl(var(--destructive))', foreground: 'hsl(var(--destructive-foreground))', }, border: 'hsl(var(--border))', input: 'hsl(var(--input))', ring: 'hsl(var(--ring))', // ---- Semi Design CSS variable tokens (向后兼容) ---- 'semi-color-white': 'var(--semi-color-white)', 'semi-color-black': 'var(--semi-color-black)', 'semi-color-primary': 'var(--semi-color-primary)', 'semi-color-primary-hover': 'var(--semi-color-primary-hover)', 'semi-color-primary-active': 'var(--semi-color-primary-active)', 'semi-color-primary-disabled': 'var(--semi-color-primary-disabled)', 'semi-color-primary-light-default': 'var(--semi-color-primary-light-default)', 'semi-color-primary-light-hover': 'var(--semi-color-primary-light-hover)', 'semi-color-primary-light-active': 'var(--semi-color-primary-light-active)', 'semi-color-secondary': 'var(--semi-color-secondary)', 'semi-color-secondary-hover': 'var(--semi-color-secondary-hover)', 'semi-color-secondary-active': 'var(--semi-color-secondary-active)', 'semi-color-secondary-disabled': 'var(--semi-color-secondary-disabled)', 'semi-color-secondary-light-default': 'var(--semi-color-secondary-light-default)', 'semi-color-secondary-light-hover': 'var(--semi-color-secondary-light-hover)', 'semi-color-secondary-light-active': 'var(--semi-color-secondary-light-active)', 'semi-color-tertiary': 'var(--semi-color-tertiary)', 'semi-color-tertiary-hover': 'var(--semi-color-tertiary-hover)', 'semi-color-tertiary-active': 'var(--semi-color-tertiary-active)', 'semi-color-tertiary-light-default': 'var(--semi-color-tertiary-light-default)', 'semi-color-tertiary-light-hover': 'var(--semi-color-tertiary-light-hover)', 'semi-color-tertiary-light-active': 'var(--semi-color-tertiary-light-active)', 'semi-color-default': 'var(--semi-color-default)', 'semi-color-default-hover': 'var(--semi-color-default-hover)', 'semi-color-default-active': 'var(--semi-color-default-active)', 'semi-color-info': 'var(--semi-color-info)', 'semi-color-info-hover': 'var(--semi-color-info-hover)', 'semi-color-info-active': 'var(--semi-color-info-active)', 'semi-color-info-disabled': 'var(--semi-color-info-disabled)', 'semi-color-info-light-default': 'var(--semi-color-info-light-default)', 'semi-color-info-light-hover': 'var(--semi-color-info-light-hover)', 'semi-color-info-light-active': 'var(--semi-color-info-light-active)', 'semi-color-success': 'var(--semi-color-success)', 'semi-color-success-hover': 'var(--semi-color-success-hover)', 'semi-color-success-active': 'var(--semi-color-success-active)', 'semi-color-success-disabled': 'var(--semi-color-success-disabled)', 'semi-color-success-light-default': 'var(--semi-color-success-light-default)', 'semi-color-success-light-hover': 'var(--semi-color-success-light-hover)', 'semi-color-success-light-active': 'var(--semi-color-success-light-active)', 'semi-color-danger': 'var(--semi-color-danger)', 'semi-color-danger-hover': 'var(--semi-color-danger-hover)', 'semi-color-danger-active': 'var(--semi-color-danger-active)', 'semi-color-danger-light-default': 'var(--semi-color-danger-light-default)', 'semi-color-danger-light-hover': 'var(--semi-color-danger-light-hover)', 'semi-color-danger-light-active': 'var(--semi-color-danger-light-active)', 'semi-color-warning': 'var(--semi-color-warning)', 'semi-color-warning-hover': 'var(--semi-color-warning-hover)', 'semi-color-warning-active': 'var(--semi-color-warning-active)', 'semi-color-warning-light-default': 'var(--semi-color-warning-light-default)', 'semi-color-warning-light-hover': 'var(--semi-color-warning-light-hover)', 'semi-color-warning-light-active': 'var(--semi-color-warning-light-active)', 'semi-color-focus-border': 'var(--semi-color-focus-border)', 'semi-color-disabled-text': 'var(--semi-color-disabled-text)', 'semi-color-disabled-border': 'var(--semi-color-disabled-border)', 'semi-color-disabled-bg': 'var(--semi-color-disabled-bg)', 'semi-color-disabled-fill': 'var(--semi-color-disabled-fill)', 'semi-color-shadow': 'var(--semi-color-shadow)', 'semi-color-link': 'var(--semi-color-link)', 'semi-color-link-hover': 'var(--semi-color-link-hover)', 'semi-color-link-active': 'var(--semi-color-link-active)', 'semi-color-link-visited': 'var(--semi-color-link-visited)', 'semi-color-border': 'var(--semi-color-border)', 'semi-color-nav-bg': 'var(--semi-color-nav-bg)', 'semi-color-overlay-bg': 'var(--semi-color-overlay-bg)', 'semi-color-fill-0': 'var(--semi-color-fill-0)', 'semi-color-fill-1': 'var(--semi-color-fill-1)', 'semi-color-fill-2': 'var(--semi-color-fill-2)', 'semi-color-bg-0': 'var(--semi-color-bg-0)', 'semi-color-bg-1': 'var(--semi-color-bg-1)', 'semi-color-bg-2': 'var(--semi-color-bg-2)', 'semi-color-bg-3': 'var(--semi-color-bg-3)', 'semi-color-bg-4': 'var(--semi-color-bg-4)', 'semi-color-text-0': 'var(--semi-color-text-0)', 'semi-color-text-1': 'var(--semi-color-text-1)', 'semi-color-text-2': 'var(--semi-color-text-2)', 'semi-color-text-3': 'var(--semi-color-text-3)', 'semi-color-highlight-bg': 'var(--semi-color-highlight-bg)', 'semi-color-highlight': 'var(--semi-color-highlight)', 'semi-color-data-0': 'var(--semi-color-data-0)', 'semi-color-data-1': 'var(--semi-color-data-1)', 'semi-color-data-2': 'var(--semi-color-data-2)', 'semi-color-data-3': 'var(--semi-color-data-3)', 'semi-color-data-4': 'var(--semi-color-data-4)', 'semi-color-data-5': 'var(--semi-color-data-5)', 'semi-color-data-6': 'var(--semi-color-data-6)', 'semi-color-data-7': 'var(--semi-color-data-7)', 'semi-color-data-8': 'var(--semi-color-data-8)', 'semi-color-data-9': 'var(--semi-color-data-9)', 'semi-color-data-10': 'var(--semi-color-data-10)', 'semi-color-data-11': 'var(--semi-color-data-11)', 'semi-color-data-12': 'var(--semi-color-data-12)', 'semi-color-data-13': 'var(--semi-color-data-13)', 'semi-color-data-14': 'var(--semi-color-data-14)', 'semi-color-data-15': 'var(--semi-color-data-15)', 'semi-color-data-16': 'var(--semi-color-data-16)', 'semi-color-data-17': 'var(--semi-color-data-17)', 'semi-color-data-18': 'var(--semi-color-data-18)', 'semi-color-data-19': 'var(--semi-color-data-19)', }, fontFamily: { heading: ['"Source Serif 4"', '"Noto Serif SC"', 'Georgia', 'serif'], serif: ['"Playfair Display"', '"Noto Serif SC"', 'serif'], mono: ['"JetBrains Mono"', 'monospace'], display: ['"Bebas Neue"', 'sans-serif'], body: ['system-ui', '-apple-system', 'BlinkMacSystemFont', '"Segoe UI"', 'Roboto', 'sans-serif'], }, borderRadius: { 'semi-border-radius-extra-small': 'var(--semi-border-radius-extra-small)', 'semi-border-radius-small': 'var(--semi-border-radius-small)', 'semi-border-radius-medium': 'var(--semi-border-radius-medium)', 'semi-border-radius-large': 'var(--semi-border-radius-large)', 'semi-border-radius-circle': 'var(--semi-border-radius-circle)', 'semi-border-radius-full': 'var(--semi-border-radius-full)', // shadcn/ui radius token DEFAULT: 'var(--radius)', sm: 'calc(var(--radius) - 2px)', md: 'calc(var(--radius) + 2px)', lg: 'calc(var(--radius) + 4px)', xl: 'calc(var(--radius) + 8px)', }, borderColor: { DEFAULT: 'hsl(var(--border))', }, ringColor: { DEFAULT: 'hsl(var(--ring))', }, ringOffsetColor: { DEFAULT: 'hsl(var(--background))', }, backgroundColor: { DEFAULT: 'hsl(var(--background))', }, textColor: { DEFAULT: 'hsl(var(--foreground))', }, boxShadow: { 'td-sm': '0 1px 2px 0 rgb(0 0 0 / 0.05)', 'td-md': '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)', 'td-lg': '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)', }, animation: { 'fade-in': 'fadeIn 0.2s ease-in-out', 'slide-up': 'slideUp 0.2s ease-out', 'float': 'float linear infinite', 'confetti': 'confettiFall ease-out forwards', 'shimmer': 'shimmer 2s infinite', }, keyframes: { fadeIn: { '0%': { opacity: '0' }, '100%': { opacity: '1' }, }, slideUp: { '0%': { opacity: '0', transform: 'translateY(8px)' }, '100%': { opacity: '1', transform: 'translateY(0)' }, }, float: { '0%, 100%': { transform: 'translateY(0) rotate(0deg)', opacity: '0.2' }, '25%': { transform: 'translateY(-20px) rotate(5deg)', opacity: '0.35' }, '50%': { transform: 'translateY(-10px) rotate(-3deg)', opacity: '0.25' }, '75%': { transform: 'translateY(-25px) rotate(2deg)', opacity: '0.3' }, }, confettiFall: { '0%': { transform: 'translateY(-10px) rotate(0deg) scale(1)', opacity: '1' }, '100%': { transform: 'translateY(400px) rotate(720deg) scale(0.3)', opacity: '0' }, }, shimmer: { '0%': { transform: 'translateX(-100%)' }, '100%': { transform: 'translateX(100%)' }, }, }, }, }, safelist: [ 'home-fade-in', 'home-fade-in-delay-1', 'home-fade-in-delay-2', 'home-marquee', 'font-heading', 'font-body', 'home-page', ], plugins: [], };