@import "tailwindcss"; @plugin "@tailwindcss/typography"; @theme { --font-sans: 'Noto Sans TC', ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* Map Tailwind colors to CSS variables */ --color-background: var(--background); --color-foreground: var(--foreground); --color-card: var(--card); --color-card-foreground: var(--card-foreground); --color-popover: var(--popover); --color-popover-foreground: var(--popover-foreground); --color-primary: var(--primary); --color-primary-foreground: var(--primary-foreground); --color-secondary: var(--secondary); --color-secondary-foreground: var(--secondary-foreground); --color-muted: var(--muted); --color-muted-foreground: var(--muted-foreground); --color-accent: var(--accent); --color-accent-foreground: var(--accent-foreground); --color-destructive: var(--destructive); --color-destructive-foreground: var(--destructive-foreground); --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); --color-background-light: var(--background-light); --color-background-light-grey: var(--background-light-grey); --color-grey-0: var(--grey-0); --color-grey-1: var(--grey-1); --color-grey-2: var(--grey-2); --color-grey-3: var(--grey-3); --color-grey-4: var(--grey-4); --color-grey-5: var(--grey-5); --color-primary-main: var(--primary-main); --color-primary-dark: var(--primary-dark); --color-primary-light: var(--primary-light); --color-primary-lighter: var(--primary-lighter); --color-primary-lightest: var(--primary-lightest); --radius-lg: var(--radius-card); --radius-md: var(--radius-button); --radius-sm: var(--radius-xs); } @layer base { :root { /* Typography */ --font-h1: 40px; --line-h1: 48px; --font-h2: 32px; --line-h2: 40px; --font-h3: 28px; --line-h3: 36px; --font-h4: 24px; --line-h4: 32px; --font-h5: 20px; --line-h5: 28px; --font-body: 16px; --line-body: 24px; --weight-regular: 400; --weight-medium: 500; --weight-semibold: 600; --weight-bold: 700; --weight-extrabold: 800; /* Colors */ --grey-0: #1a1a1a; --grey-1: #4a4a4a; --grey-2: #6b6b6b; --grey-3: #9e9e9e; --grey-4: #e0e0e0; --grey-5: #fff; --primary-main: #01ab83; --primary-dark: #018a6a; --primary-light: #33bc9a; --primary-lightest: #e6f7f3; --background-light: #f8fdfb; --background-light-grey: #f5f5f5; --background-white: #fff; /* Shadcn Semantic Mapping */ --background: var(--background-light); --foreground: var(--grey-0); --card: var(--background-white); --card-foreground: var(--grey-0); --popover: var(--background-white); --popover-foreground: var(--grey-0); --primary: var(--primary-main); --primary-foreground: var(--grey-5); --secondary: var(--background-light-grey); --secondary-foreground: var(--grey-0); --muted: var(--grey-4); --muted-foreground: var(--grey-2); --accent: var(--primary-light); --accent-foreground: var(--grey-5); --destructive: #dc2626; --destructive-foreground: var(--grey-5); --border: var(--grey-4); --input: transparent; --ring: var(--primary-main); --radius: 8px; --radius-button: 8px; --radius-card: 12px; /* Other State Colors */ --other-success: #01ab83; --other-error: #dc2626; --other-warning: #f59e0b; --other-info: #3b82f6; /* Button Colors */ --button-success-normal: #01ab83; --button-success-hover: #33bc9a; --button-success-active: #018a6a; --button-info-normal: #3b82f6; --button-info-hover: #60a5fa; --button-info-active: #2563eb; --button-warning-normal: #f59e0b; --button-warning-hover: #fbbf24; --button-warning-active: #d97706; --button-err-normal: #dc2626; --button-err-hover: #ef4444; --button-err-active: #b91c1c; --button-main-normal: #018a6a; --button-main-disable: #b3e5d9; --button-main-hover: #01ab83; --button-main-active: #016b54; } * { @apply border-border; } body { @apply bg-background text-foreground; font-family: 'Noto Sans TC', sans-serif; } /* Exact typography logic modified to check the element itself, not parent/siblings */ h1:where(:not([class*=" text-"]):not([class^="text-"])) { font-size: var(--font-h1); font-weight: var(--weight-bold); line-height: var(--line-h1); } h2:where(:not([class*=" text-"]):not([class^="text-"])) { font-size: var(--font-h2); font-weight: var(--weight-semibold); line-height: var(--line-h2); } h3:where(:not([class*=" text-"]):not([class^="text-"])) { font-size: var(--font-h3); font-weight: var(--weight-semibold); line-height: var(--line-h3); } p:where(:not([class*=" text-"]):not([class^="text-"])) { font-size: var(--font-body); font-weight: var(--weight-regular); line-height: var(--line-body); } } .button-filled-primary { @apply bg-[var(--primary-main)] text-[var(--grey-5)] border-transparent transition-colors shadow-sm disabled:bg-[var(--button-main-disable)] disabled:text-[var(--grey-5)] disabled:cursor-not-allowed; } .button-filled-primary:hover { @apply bg-[var(--primary-dark)]; } .button-filled-primary:active { @apply bg-[var(--button-main-active)]; } .button-outlined-primary { @apply border-2 text-[var(--grey-0)] bg-transparent transition-colors disabled:border-[var(--grey-4)] disabled:text-[var(--grey-3)] disabled:cursor-not-allowed; border-color: var(--primary-main); } .button-outlined-primary:hover { @apply bg-[var(--primary-lightest)] text-[var(--grey-0)]; border-color: var(--primary-main); } .button-filled-success { @apply bg-[var(--button-success-normal)] text-[var(--grey-5)] border-transparent transition-colors shadow-sm; } .button-filled-success:hover { @apply bg-[var(--button-success-hover)]; } .button-filled-success:active { @apply bg-[var(--button-success-active)]; } .button-outlined-success { @apply border-2 text-[var(--grey-0)] bg-transparent transition-colors; border-color: var(--other-success); } .button-filled-info { @apply bg-[var(--button-info-normal)] text-[var(--grey-5)] border-transparent transition-colors shadow-sm; } .button-filled-info:hover { @apply bg-[var(--button-info-hover)]; } .button-filled-info:active { @apply bg-[var(--button-info-active)]; } .button-outlined-info { @apply border-2 text-[var(--grey-0)] bg-transparent transition-colors; border-color: var(--other-info); } .button-filled-warning { @apply bg-[var(--button-warning-normal)] text-[var(--grey-5)] border-transparent transition-colors shadow-sm; } .button-filled-warning:hover { @apply bg-[var(--button-warning-hover)]; } .button-filled-warning:active { @apply bg-[var(--button-warning-active)]; } .button-outlined-warning { @apply border-2 text-[var(--grey-0)] bg-transparent transition-colors; border-color: var(--other-warning); } .button-filled-error { @apply bg-[var(--button-err-normal)] text-[var(--grey-5)] border-transparent transition-colors shadow-sm; } .button-filled-error:hover { @apply bg-[var(--button-err-hover)]; } .button-filled-error:active { @apply bg-[var(--button-err-active)]; } .button-outlined-error { @apply border-2 text-[var(--grey-0)] bg-transparent transition-colors disabled:border-[var(--grey-4)] disabled:text-[var(--grey-3)] disabled:cursor-not-allowed; border-color: var(--other-error); } .button-outlined-error:hover { @apply bg-red-50 text-[var(--grey-0)]; border-color: var(--other-error); } .button-text-primary { @apply text-[var(--primary-main)] bg-transparent border-none transition-colors; } .button-text-primary:hover { @apply bg-[var(--background-light)] text-[var(--primary-main)]; }