281 lines
7.7 KiB
CSS
281 lines
7.7 KiB
CSS
@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)];
|
|
} |