@import 'tailwindcss'; @import 'tw-animate-css'; @source '../views'; @source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; @custom-variant dark (&:is(.dark *)); @theme { --font-sans: 'Inter', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; --radius-lg: var(--radius); --radius-md: calc(var(--radius) - 2px); --radius-sm: calc(var(--radius) - 4px); --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-chart-1: var(--chart-1); --color-chart-2: var(--chart-2); --color-chart-3: var(--chart-3); --color-chart-4: var(--chart-4); --color-chart-5: var(--chart-5); --color-sidebar: var(--sidebar); --color-sidebar-foreground: var(--sidebar-foreground); --color-sidebar-primary: var(--sidebar-primary); --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); --color-sidebar-accent: var(--sidebar-accent); --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); --color-sidebar-border: var(--sidebar-border); --color-sidebar-ring: var(--sidebar-ring); } :root { --background: oklch(1 0 0); --foreground: oklch(0.145 0 0); --card: oklch(1 0 0); --card-foreground: oklch(0.145 0 0); --popover: oklch(1 0 0); --popover-foreground: oklch(0.145 0 0); --primary: oklch(0.205 0 0); --primary-foreground: oklch(0.985 0 0); --secondary: oklch(0.97 0 0); --secondary-foreground: oklch(0.205 0 0); --muted: oklch(0.97 0 0); --muted-foreground: oklch(0.556 0 0); --accent: oklch(0.97 0 0); --accent-foreground: oklch(0.205 0 0); --destructive: oklch(0.577 0.245 27.325); --destructive-foreground: oklch(0.577 0.245 27.325); --border: oklch(0.922 0 0); --input: oklch(0.922 0 0); --ring: oklch(0.87 0 0); --chart-1: oklch(0.646 0.222 41.116); --chart-2: oklch(0.6 0.118 184.704); --chart-3: oklch(0.398 0.07 227.392); --chart-4: oklch(0.828 0.189 84.429); --chart-5: oklch(0.769 0.188 70.08); --radius: 0.625rem; --sidebar: oklch(0.985 0 0); --sidebar-foreground: oklch(0.145 0 0); --sidebar-primary: oklch(0.205 0 0); --sidebar-primary-foreground: oklch(0.985 0 0); --sidebar-accent: oklch(0.97 0 0); --sidebar-accent-foreground: oklch(0.205 0 0); --sidebar-border: oklch(0.922 0 0); --sidebar-ring: oklch(0.87 0 0); --app-bg: #fafbff; --app-sidebar-bg: #ffffff; --app-surface: #ffffff; --app-surface-soft: #eef4ff; --app-surface-muted: rgba(217, 217, 217, 0.32); --app-border: rgba(0, 0, 0, 0.14); --app-border-soft: rgba(0, 0, 0, 0.08); --app-border-strong: #739af1; --app-text: #0a0a0a; --app-muted: #737373; --app-primary: #2764eb; --app-primary-soft: #ccdcff; --app-primary-foreground: #ffffff; --app-danger: #ef4444; --app-success: var(--app-primary); --app-placeholder: rgba(115, 115, 115, 0.42); --app-toggle-bg: rgba(255, 255, 255, 0.9); --app-shadow: 1px 1px 4.5px rgba(39, 100, 235, 0.36); --app-composer-shadow: 0 10px 24px rgba(39, 100, 235, 0.28); --welcome-shell-bg: var(--app-bg); --welcome-title: var(--app-text); --welcome-subtitle: var(--app-muted); --welcome-accent: var(--app-primary); --welcome-accent-foreground: var(--app-primary-foreground); --welcome-accent-soft: var(--app-primary-soft); --welcome-toggle-bg: var(--app-toggle-bg); --welcome-card-bg: var(--app-surface); --welcome-card-border: var(--app-border); --welcome-card-active-border: var(--app-border-strong); --welcome-card-active-shadow: var(--app-shadow); --welcome-icon-muted-bg: var(--app-surface-muted); --welcome-icon-muted-border: var(--app-border-soft); --welcome-icon-active-border: color-mix( in oklab, var(--app-primary) 26%, transparent ); --register-shell-bg: var(--welcome-shell-bg); --register-card-bg: var(--welcome-card-bg); --register-card-border: var(--welcome-card-active-border); --register-card-shadow: var(--welcome-card-active-shadow); --register-input-bg: color-mix( in oklab, var(--app-primary) 13%, var(--app-surface) ); --register-input-border: var(--app-border-soft); --register-button-border: var(--app-border-soft); --register-placeholder: var(--welcome-subtitle); --register-danger: var(--app-danger); --student-bg: var(--app-bg); --student-sidebar-bg: var(--app-sidebar-bg); --student-surface: var(--app-surface); --student-surface-soft: var(--app-surface-soft); --student-border: var(--app-border); --student-border-strong: var(--app-border-strong); --student-text: var(--app-text); --student-muted: var(--app-muted); --student-primary: var(--app-primary); --student-primary-soft: var(--app-primary-soft); --student-primary-foreground: var(--app-primary-foreground); --student-danger: var(--app-danger); --student-success: var(--app-success); --student-placeholder: var(--app-placeholder); --student-shadow: 0 24px 70px rgba(15, 23, 42, 0.08); --student-sidebar-shadow: 1px 0 0 rgba(15, 23, 42, 0.08); --student-composer-shadow: var(--app-composer-shadow); --lecturer-bg: var(--app-bg); --lecturer-sidebar-bg: var(--app-sidebar-bg); --lecturer-surface: var(--app-surface); --lecturer-surface-soft: var(--app-surface-soft); --lecturer-border: var(--app-border); --lecturer-border-soft: var(--app-border-soft); --lecturer-border-strong: var(--app-border-strong); --lecturer-text: var(--app-text); --lecturer-muted: var(--app-muted); --lecturer-primary: var(--app-primary); --lecturer-primary-soft: var(--app-primary-soft); --lecturer-primary-foreground: var(--app-primary-foreground); --lecturer-danger: var(--app-danger); --lecturer-success: var(--app-success); --lecturer-shadow: 0 18px 42px rgba(15, 23, 42, 0.08); --lecturer-sidebar-shadow: 1px 0 0 rgba(15, 23, 42, 0.08); } .dark { --background: #1f1f1f; --foreground: #f4f4f5; --card: #171717; --card-foreground: #f4f4f5; --popover: #171717; --popover-foreground: #f4f4f5; --primary: #3478ff; --primary-foreground: #ffffff; --secondary: #262626; --secondary-foreground: #f4f4f5; --muted: #262626; --muted-foreground: #737373; --accent: #262626; --accent-foreground: #f4f4f5; --destructive: oklch(0.396 0.141 25.723); --destructive-foreground: oklch(0.637 0.237 25.331); --border: rgba(255, 255, 255, 0.12); --input: rgba(255, 255, 255, 0.12); --ring: #3478ff; --chart-1: oklch(0.488 0.243 264.376); --chart-2: oklch(0.696 0.17 162.48); --chart-3: oklch(0.769 0.188 70.08); --chart-4: oklch(0.627 0.265 303.9); --chart-5: oklch(0.645 0.246 16.439); --sidebar: #171717; --sidebar-foreground: #f4f4f5; --sidebar-primary: #3478ff; --sidebar-primary-foreground: #ffffff; --sidebar-accent: #262626; --sidebar-accent-foreground: #f4f4f5; --sidebar-border: rgba(255, 255, 255, 0.12); --sidebar-ring: #3478ff; --app-bg: #1f1f1f; --app-sidebar-bg: #171717; --app-surface: #171717; --app-surface-soft: #262626; --app-surface-muted: rgba(255, 255, 255, 0.08); --app-border: rgba(255, 255, 255, 0.12); --app-border-soft: rgba(255, 255, 255, 0.1); --app-border-strong: #3478ff; --app-text: #f4f4f5; --app-muted: #737373; --app-primary: #3478ff; --app-primary-soft: #c8d7ff; --app-primary-foreground: #ffffff; --app-danger: #ff4545; --app-success: var(--app-primary); --app-placeholder: rgba(244, 244, 245, 0.42); --app-toggle-bg: #171717; --app-shadow: 0 0 20px rgba(52, 120, 255, 0.34); --app-composer-shadow: 0 0 28px rgba(52, 120, 255, 0.36); --welcome-shell-bg: var(--app-bg); --welcome-title: var(--app-text); --welcome-subtitle: var(--app-muted); --welcome-accent: var(--app-primary); --welcome-accent-foreground: var(--app-primary-foreground); --welcome-accent-soft: var(--app-primary-soft); --welcome-toggle-bg: var(--app-toggle-bg); --welcome-card-bg: var(--app-surface); --welcome-card-border: var(--app-border); --welcome-card-active-border: var(--app-border-strong); --welcome-card-active-shadow: var(--app-shadow); --welcome-icon-muted-bg: var(--app-surface-muted); --welcome-icon-muted-border: var(--app-border-soft); --welcome-icon-active-border: color-mix( in oklab, var(--app-primary) 42%, transparent ); --register-shell-bg: var(--welcome-shell-bg); --register-card-bg: var(--welcome-card-bg); --register-card-border: var(--welcome-card-active-border); --register-card-shadow: var(--welcome-card-active-shadow); --register-input-bg: var(--app-surface); --register-input-border: var(--app-border); --register-button-border: var(--app-border); --register-placeholder: var(--welcome-subtitle); --register-danger: var(--app-danger); --student-bg: var(--app-bg); --student-sidebar-bg: var(--app-sidebar-bg); --student-surface: var(--app-surface); --student-surface-soft: var(--app-surface-soft); --student-border: var(--app-border); --student-border-strong: var(--app-border-strong); --student-text: var(--app-text); --student-muted: var(--app-muted); --student-primary: var(--app-primary); --student-primary-soft: var(--app-primary-soft); --student-primary-foreground: var(--app-primary-foreground); --student-danger: var(--app-danger); --student-success: var(--app-success); --student-placeholder: var(--app-placeholder); --student-shadow: 0 24px 70px rgba(0, 0, 0, 0.18); --student-sidebar-shadow: 1px 0 0 var(--app-border); --student-composer-shadow: var(--app-composer-shadow); --lecturer-bg: var(--app-bg); --lecturer-sidebar-bg: var(--app-sidebar-bg); --lecturer-surface: var(--app-surface); --lecturer-surface-soft: var(--app-surface-soft); --lecturer-border: var(--app-border); --lecturer-border-soft: var(--app-border-soft); --lecturer-border-strong: var(--app-border-strong); --lecturer-text: var(--app-text); --lecturer-muted: var(--app-muted); --lecturer-primary: var(--app-primary); --lecturer-primary-soft: color-mix( in oklab, var(--app-primary) 22%, var(--app-surface) ); --lecturer-primary-foreground: var(--app-primary-foreground); --lecturer-danger: var(--app-danger); --lecturer-success: var(--app-success); --lecturer-shadow: 0 18px 42px rgba(0, 0, 0, 0.2); --lecturer-sidebar-shadow: 1px 0 0 var(--app-border); } @layer base { * { @apply border-border; } body { @apply bg-background text-foreground; } button:not(:disabled), [role='button']:not([aria-disabled='true']), [data-slot='button']:not([aria-disabled='true']) { @apply cursor-pointer; } button:disabled, [aria-disabled='true'] { @apply cursor-not-allowed; } } @keyframes app-loading-dot { 0%, 80%, 100% { opacity: 0.24; transform: translateY(0); } 40% { opacity: 1; transform: translateY(-0.12rem); } } @media (prefers-reduced-motion: reduce) { .app-loading-dot { animation: none !important; opacity: 1; transform: none; } } @layer components { .app-loading-indicator { @apply inline-flex items-center justify-center gap-2 whitespace-nowrap; } .app-loading-spinner { @apply shrink-0; } .app-loading-dots { @apply inline-flex min-w-[1.05em] items-center justify-start; } .app-loading-dot { animation: app-loading-dot 1.2s infinite ease-in-out both; line-height: 1; } .app-loading-dot:nth-child(2) { animation-delay: 0.16s; } .app-loading-dot:nth-child(3) { animation-delay: 0.32s; } .welcome-shell { @apply relative flex min-h-svh items-center justify-center px-4 py-8 sm:px-6; background-color: var(--welcome-shell-bg); } .welcome-content { @apply w-full max-w-[561px] space-y-7; } .welcome-theme-toggle { @apply absolute top-4 right-4 h-10 w-10 rounded-[10px] shadow-none backdrop-blur sm:top-8 sm:right-8; background-color: var(--welcome-toggle-bg); border-color: var(--welcome-card-active-border); color: var(--welcome-accent); } .welcome-logo { @apply mx-auto flex h-[77px] w-[77px] items-center justify-center rounded-[15px] border border-white; background-color: var(--welcome-accent); color: var(--welcome-accent-foreground); } .welcome-title { @apply text-center text-[34px] leading-tight font-bold tracking-[0.01em] sm:text-[40px]; color: var(--welcome-title); } .welcome-subtitle { @apply text-center text-[15px] leading-normal sm:text-[20px]; color: var(--welcome-subtitle); } .welcome-entries { @apply space-y-3; } .welcome-entry-card { @apply gap-0 overflow-hidden rounded-[17px] border py-0 transition-[border-color,box-shadow]; background-color: var(--welcome-card-bg); border-color: var(--welcome-card-border); box-shadow: none; } .welcome-entry-card:hover, .welcome-entry-card:focus-within { border-color: var(--welcome-card-active-border); box-shadow: var(--welcome-card-active-shadow); } .welcome-entry-link { @apply flex h-[90px] items-center justify-between gap-3 px-3.5 py-2.5 outline-none focus-visible:ring-2 sm:px-4; --tw-ring-color: color-mix( in oklab, var(--welcome-accent) 35%, transparent ); } .welcome-entry-icon { @apply flex h-[52px] w-[52px] shrink-0 items-center justify-center rounded-[10px] border transition-colors; background-color: var(--welcome-icon-muted-bg); border-color: var(--welcome-icon-muted-border); color: var(--welcome-subtitle); } .welcome-entry-card:hover .welcome-entry-icon, .welcome-entry-card:focus-within .welcome-entry-icon { background-color: var(--welcome-accent-soft); border-color: var(--welcome-icon-active-border); color: var(--welcome-accent); } .welcome-entry-title { @apply truncate text-left text-lg leading-tight font-semibold; color: var(--welcome-title); } .welcome-entry-description { @apply mt-1 truncate text-left text-[13px] leading-tight; color: var(--welcome-subtitle); } .welcome-entry-arrow { @apply h-4 w-4 shrink-0 transition-transform group-hover:translate-x-0.5; color: var(--welcome-title); } .welcome-register { @apply text-center text-[13px]; color: var(--welcome-subtitle); } .welcome-register-link { @apply font-medium underline-offset-4 hover:underline focus-visible:ring-2 focus-visible:outline-none; color: var(--welcome-accent); --tw-ring-color: color-mix( in oklab, var(--welcome-accent) 35%, transparent ); } .register-shell { @apply relative flex min-h-svh items-center justify-center px-4 py-8 sm:px-6; background-color: var(--register-shell-bg); } .register-choice-content { @apply w-full max-w-[561px]; } .register-choice-back { @apply mb-3; } .register-choice-options { @apply space-y-3; } .register-choice-card[data-highlighted='true'] { border-color: var(--welcome-card-active-border); box-shadow: var(--welcome-card-active-shadow); } .register-choice-card[data-highlighted='true'] .welcome-entry-icon { background-color: var(--welcome-accent-soft); border-color: var(--welcome-icon-active-border); color: var(--welcome-accent); } .register-card { @apply w-full max-w-[460px] gap-0 rounded-[17px] border py-0; background-color: var(--register-card-bg) !important; border-color: var(--register-card-border) !important; box-shadow: var(--register-card-shadow) !important; } .register-card-content { @apply px-5 py-6 sm:px-[38px] sm:py-7; } .register-back-link { @apply inline-flex text-sm font-semibold underline-offset-4 transition-colors hover:underline focus-visible:ring-2 focus-visible:outline-none; color: var(--welcome-subtitle); --tw-ring-color: color-mix( in oklab, var(--welcome-accent) 35%, transparent ); } .register-heading { @apply mt-2 text-center text-2xl leading-tight font-semibold; color: var(--welcome-title); } .register-form { @apply mt-7 flex flex-col gap-4; } .register-field { @apply grid gap-1.5; } .register-label { @apply text-base leading-none font-medium; color: var(--welcome-title); } .register-input { @apply h-[43px] rounded-[6px] px-3.5 text-sm shadow-none; background-color: var(--register-input-bg) !important; border-color: var(--register-input-border) !important; color: var(--welcome-title) !important; } .register-input::placeholder { color: var(--register-placeholder); opacity: 1; } .register-input:focus-visible { border-color: var(--register-card-border) !important; --tw-ring-color: color-mix( in oklab, var(--welcome-accent) 35%, transparent ); } .register-input[aria-invalid='true'] { border-color: var(--register-danger) !important; --tw-ring-color: color-mix( in oklab, var(--register-danger) 28%, transparent ); } .register-error { @apply text-xs leading-snug; color: var(--register-danger); } .register-submit { @apply mt-1 h-[43px] w-full rounded-[6px] border text-base font-semibold shadow-none; background-color: var(--welcome-accent) !important; border-color: var(--register-button-border) !important; color: var(--welcome-accent-foreground) !important; } .register-submit:hover { background-color: color-mix( in oklab, var(--welcome-accent) 88%, var(--register-card-bg) ) !important; } .login-card { @apply max-w-[460px]; } .login-card-content { @apply px-5 py-7 sm:px-[38px] sm:py-8; } .login-heading { @apply mt-2; } .login-form { @apply mt-8 flex flex-col gap-4; } .login-remember { @apply flex items-center gap-3; } .login-remember-label { @apply text-sm leading-none font-normal; color: var(--welcome-subtitle); } .login-submit { @apply mt-2; } .login-register-text { @apply mt-4; } .login-status { @apply mt-4 text-center text-sm font-medium; color: var(--app-success); } .login-error { color: var(--register-danger); } .student-dashboard-shell { @apply h-svh min-h-svh overflow-hidden; background-color: var(--student-bg); color: var(--student-text); } .student-sidebar { border-color: var(--student-border) !important; } .student-sidebar [data-sidebar='sidebar'] { background-color: var(--student-sidebar-bg); border-color: var(--student-border); box-shadow: var(--student-sidebar-shadow); } .student-sidebar-top { @apply border-b; border-color: var(--student-border); display: flex !important; height: 72px !important; flex-direction: row !important; align-items: center !important; justify-content: space-between !important; gap: 0 !important; padding: 0 20px !important; } .student-logo-action { @apply flex size-8 shrink-0 items-center justify-center rounded-[8px] transition-transform outline-none focus-visible:ring-2; --tw-ring-color: color-mix( in oklab, var(--student-primary) 45%, transparent ); } .student-logo-action:hover { @apply scale-[1.03]; } .student-logo-mark { @apply flex size-8 items-center justify-center rounded-[8px]; background-color: var(--student-primary); color: var(--student-primary-foreground); } .student-sidebar-trigger { @apply rounded-[8px] shadow-none; color: var(--student-text); width: 32px !important; height: 32px !important; } .student-sidebar-trigger:hover { background-color: var(--student-surface-soft); color: var(--student-text); } .student-sidebar-content { gap: 0 !important; } .student-history-group { padding: 0 !important; } .student-history-label { @apply border-b text-xs font-medium; border-color: var(--student-border); color: var(--student-text); display: flex !important; height: 44px !important; align-items: center !important; gap: 6px !important; border-radius: 0 !important; padding: 0 20px !important; margin: 0 !important; width: 100% !important; background-color: transparent !important; cursor: pointer; } .student-history-label:hover { background-color: var(--student-surface-soft) !important; } .student-history-chevron { @apply ml-auto size-3 transition-transform; } .student-history-label[aria-expanded='false'] .student-history-chevron { transform: rotate(-90deg); } .student-history-list { gap: 4px !important; padding: 12px 20px !important; } .student-history-menu-item { @apply relative; } .student-history-menu-button { @apply rounded-[8px] text-left shadow-none; color: var(--student-muted); height: auto !important; min-height: 42px !important; padding: 8px 34px 8px 4px !important; align-items: flex-start !important; } .student-history-menu-button:hover, .student-history-menu-button[data-active='true'] { background-color: var(--student-surface-soft); color: var(--student-text); } .student-history-delete { @apply absolute top-1/2 right-2 flex size-6 -translate-y-1/2 items-center justify-center rounded-[6px] opacity-0 transition-opacity; color: var(--student-danger); } .student-history-menu-item:hover .student-history-delete, .student-history-menu-button[data-active='true'] + .student-history-delete { @apply opacity-100; } .student-history-delete:hover { background-color: color-mix( in oklab, var(--student-danger) 12%, transparent ); } .student-delete-dialog { @apply gap-5 rounded-[16px] border p-6 shadow-none sm:max-w-[440px]; background-color: var(--student-surface); border-color: var(--student-border); box-shadow: var(--student-shadow); color: var(--student-text); } .student-delete-dialog-body { @apply flex flex-col gap-3; } .student-delete-copy { @apply text-sm leading-relaxed; color: var(--student-muted); } .student-delete-copy strong { color: var(--student-text); } .student-delete-error { @apply rounded-[10px] border px-4 py-3 text-sm font-medium; background-color: color-mix( in oklab, var(--student-danger) 8%, var(--student-surface) ); border-color: color-mix( in oklab, var(--student-danger) 24%, transparent ); color: var(--student-danger); } .student-delete-dialog-footer { @apply gap-3 pt-1; } .student-delete-cancel { @apply h-10 rounded-[8px] px-5 text-sm font-semibold shadow-none; background-color: var(--student-surface) !important; border-color: var(--student-border) !important; color: var(--student-text) !important; } .student-delete-cancel:hover { background-color: var(--student-surface-soft) !important; } .student-delete-confirm { @apply h-10 rounded-[8px] px-5 text-sm font-semibold shadow-none; background-color: var(--student-danger) !important; color: var(--student-primary-foreground) !important; } .student-delete-confirm:hover { background-color: color-mix( in oklab, var(--student-danger) 86%, #000 ) !important; } .student-history-menu-icon { @apply hidden; color: var(--student-text); } .student-history-copy, .student-user-copy { @apply min-w-0; } .student-history-title { @apply block truncate text-sm leading-tight font-medium; color: var(--student-text); } .student-history-meta { @apply mt-1 block truncate text-xs leading-tight; color: var(--student-muted); } .student-sidebar-footer { @apply mt-auto border-t; border-color: var(--student-border); padding: 16px 20px !important; } .student-user-menu-button { @apply mb-2 w-fit gap-2 rounded-[6px] shadow-none cursor-default; background-color: var(--student-surface-soft); color: var(--student-text); height: auto !important; padding: 6px 8px !important; } .student-user-menu-button:hover { background-color: var(--student-surface-soft); color: var(--student-text); } .student-user-avatar { @apply size-6 text-[8px]; background-color: var(--student-surface); color: var(--student-text); } .student-user-name { @apply block truncate text-xs leading-tight font-semibold; color: var(--student-text); } .student-user-role { @apply block truncate text-[11px] leading-tight; color: var(--student-muted); } .student-logout-button { @apply justify-start gap-1 rounded-none text-[11px] font-normal shadow-none; color: var(--student-danger); height: auto !important; padding: 10px 16px !important; } .student-logout-button:hover { background-color: transparent; color: var(--student-danger); } .group[data-collapsible='icon'] .student-sidebar-top { justify-content: center !important; padding: 0 !important; } .group[data-collapsible='icon'] .student-sidebar-trigger { display: none !important; } .group[data-collapsible='icon'] .student-history-list { padding: 12px 8px !important; } .group[data-collapsible='icon'] .student-history-label { display: none !important; } .group[data-collapsible='icon'] .student-history-menu-button, .group[data-collapsible='icon'] .student-user-menu-button, .group[data-collapsible='icon'] .student-logout-button { @apply mx-auto flex items-center justify-center rounded-[8px]; background-color: transparent; width: 32px !important; height: 32px !important; min-height: 32px !important; padding: 0 !important; } .group[data-collapsible='icon'] .student-history-menu-icon { @apply block; } .group[data-collapsible='icon'] .student-history-copy, .group[data-collapsible='icon'] .student-user-copy, .group[data-collapsible='icon'] .student-logout-button span { @apply hidden; } .group[data-collapsible='icon'] .student-sidebar-footer { @apply px-2; } .student-workspace { @apply flex h-svh min-w-0 flex-1 flex-col overflow-hidden; background-color: var(--student-bg); color: var(--student-text); } .student-topbar { @apply sticky top-0 z-20 flex h-[72px] shrink-0 items-center justify-between border-b px-5 sm:px-6; background-color: var(--student-surface); border-color: var(--student-border); } .student-brand-title { @apply text-base font-bold; color: var(--student-text); } .student-topbar-actions { @apply flex items-center gap-3; } .student-theme-toggle { @apply static size-8 rounded-[8px] shadow-none sm:static; background-color: var(--student-surface) !important; border-color: var(--student-border-strong) !important; color: var(--student-primary) !important; } .student-new-session-button { @apply h-8 rounded-[8px] px-4 text-xs font-semibold shadow-none; background-color: var(--student-primary) !important; color: var(--student-primary-foreground) !important; } .student-chat-stage { @apply flex min-h-0 flex-1 items-center justify-center px-4 py-10; } .student-empty-state { @apply flex w-full max-w-[610px] -translate-y-8 flex-col items-center; } .student-empty-icon { @apply mb-5 flex size-[52px] items-center justify-center rounded-[12px]; background-color: var(--student-primary-soft); color: var(--student-primary); } .student-empty-icon--thinking { @apply animate-pulse; background-color: var(--student-primary); color: var(--student-primary-foreground); } .student-greeting { @apply mb-9 text-center; } .student-greeting h2 { @apply text-3xl leading-tight font-bold tracking-[-0.02em]; color: var(--student-text); } .student-greeting p { @apply mt-2 text-sm; color: var(--student-muted); } .student-composer-card { @apply w-full gap-0 rounded-[14px] border py-0 shadow-none; background-color: var(--student-surface); border-color: var(--student-border-strong); box-shadow: var(--student-composer-shadow); } .student-composer-content { @apply relative min-h-[225px] px-5 py-4; } .student-composer-form { display: contents; } .student-status { @apply -mt-5 mb-5 text-center text-xs font-medium; color: var(--student-danger); } .student-status--success { color: var(--student-success); } .student-course-row { @apply flex flex-wrap items-center gap-2 text-[11px] font-medium; color: var(--student-text); } .student-course-icon, .student-question-icon { color: var(--student-primary); } .student-course-label { @apply whitespace-nowrap; } .student-course-select { @apply h-6 w-[180px] rounded-[5px] px-2 text-[10px] shadow-none; background-color: var(--student-surface) !important; border-color: var(--student-border-strong) !important; color: var(--student-text) !important; } .student-course-select svg { @apply size-3; } .student-composer-divider { @apply my-4 h-px w-full; background-color: var(--student-border); } .student-question-row { @apply flex items-start gap-3; } .student-question-row textarea { @apply min-h-[118px] flex-1 resize-none bg-transparent pt-0 text-[11px] outline-none; color: var(--student-text); } .student-question-row textarea::placeholder { color: var(--student-placeholder); } .student-floating-send { @apply absolute right-5 bottom-4 size-8 rounded-[8px] shadow-none; background-color: var(--student-primary) !important; color: var(--student-primary-foreground) !important; } .student-chat-stage--session { @apply relative min-h-0 flex-col items-stretch justify-between overflow-hidden px-0 py-0; } .student-chat-thread { @apply min-h-0 w-full flex-1 overflow-y-auto overscroll-contain px-5 pt-8; padding-bottom: 12.5rem; } .student-chat-messages { @apply flex min-h-full w-full flex-col gap-6; } .student-chat-loading { @apply mt-24 text-center text-sm; color: var(--student-muted); } .student-chat-status { @apply mt-0 mb-4; } .student-message { @apply flex w-full items-start gap-3.5; } .student-message--assistant { @apply justify-start; } .student-message--user { @apply justify-end; } .student-message-avatar { @apply flex size-9 shrink-0 items-center justify-center rounded-[10px]; } .student-message-avatar--assistant { background-color: var(--student-primary); color: var(--student-primary-foreground); } .student-message-avatar--user { background-color: var(--student-primary-soft); color: var(--student-primary); } .student-message-bubble { @apply max-w-[min(760px,88%)] rounded-[10px] border px-4 py-3.5 text-base shadow-none; background-color: var(--student-surface); border-color: var(--student-border-strong); color: var(--student-primary); } .student-message--assistant .student-message-bubble { color: var(--student-text); } .student-message--user .student-message-bubble { background-color: var(--student-primary); border-color: var(--student-primary); color: var(--student-primary-foreground); } .student-message-content { @apply text-base leading-relaxed whitespace-pre-wrap; } .student-message-caret { @apply ml-0.5 inline-block h-3 w-px animate-pulse align-[-2px]; background-color: currentColor; } .student-message-time { @apply mt-2 block text-[10px]; color: color-mix(in oklab, currentColor 72%, transparent); } .student-message-sources { @apply mt-3 flex flex-wrap gap-2; } .student-message-source { @apply rounded-full border px-2 py-1 text-[10px]; border-color: color-mix( in oklab, var(--student-primary) 24%, transparent ); color: inherit; } .student-message-bubble--typing { @apply text-[11px]; color: var(--student-muted); } .student-chat-scroll-anchor { scroll-margin-bottom: 13.5rem; } .student-chat-composer { @apply pointer-events-none absolute right-5 bottom-8 left-5 z-10 w-auto pb-0; } .student-composer-card--dock { @apply pointer-events-auto w-full; -webkit-backdrop-filter: blur(18px) saturate(1.25); backdrop-filter: blur(18px) saturate(1.25); background-color: color-mix( in oklab, var(--student-surface) 76%, transparent ) !important; } .student-composer-card--dock .student-composer-content { @apply min-h-[116px]; } .student-composer-card--dock .student-question-row textarea { @apply min-h-[38px]; } .student-chat-updated-at { @apply mt-3 text-center text-[11px]; color: var(--student-muted); } .embed-shell { @apply relative flex h-svh flex-col overflow-hidden px-6 py-5; background-color: var(--embed-bg); color: var(--embed-text); } .embed-toolbar { @apply relative z-20 flex shrink-0 items-start justify-between gap-4; } .embed-tabs { @apply flex h-8 items-center gap-1 rounded-full p-1 shadow-sm; background-color: color-mix( in oklab, var(--embed-muted) 20%, transparent ); } .embed-tabs button { @apply h-6 rounded-full px-6 text-sm font-medium transition; color: var(--embed-text); } .embed-tabs button[aria-selected='true'] { @apply shadow-sm; background-color: var(--embed-surface); } .embed-actions { @apply flex items-center gap-5; } .embed-icon-button { @apply flex size-8 items-center justify-center rounded-[5px] transition; color: var(--embed-text); } .embed-icon-button:hover { background-color: color-mix( in oklab, var(--embed-muted) 14%, transparent ); } .embed-icon-button--primary { background-color: var(--embed-primary); color: #ffffff; } .embed-icon-button--primary:hover { background-color: color-mix( in oklab, var(--embed-primary) 88%, #ffffff ); } .embed-chat { @apply relative flex min-h-0 flex-1 flex-col items-center justify-center; } .embed-chat--session { @apply items-stretch justify-start; } .embed-empty-state { @apply mx-auto flex w-full max-w-[620px] -translate-y-5 flex-col items-center text-center; } .embed-empty-icon { @apply mb-5 flex size-[52px] items-center justify-center rounded-[14px]; background-color: var(--embed-primary-soft); color: var(--embed-primary); } .embed-empty-state h1 { @apply text-2xl leading-tight font-bold tracking-[-0.02em]; color: var(--embed-text); } .embed-empty-state p { @apply mt-2 text-sm; color: var(--embed-muted); } .embed-status { @apply mt-4 text-center text-sm font-medium; color: var(--embed-danger); } .embed-thread { @apply min-h-0 flex-1 space-y-5 overflow-y-auto overscroll-contain px-0 pt-10; margin-right: -1.5rem; padding-right: 1.5rem; padding-bottom: 11rem; } .embed-message { @apply flex w-full items-start gap-3; } .embed-message--assistant { @apply justify-start; } .embed-message--user { @apply justify-end; } .embed-message-avatar { @apply flex size-8 shrink-0 items-center justify-center rounded-[9px]; } .embed-message-avatar--assistant { background-color: var(--embed-primary); color: #ffffff; } .embed-message-avatar--user { background-color: var(--embed-primary-soft); color: var(--embed-primary); } .embed-message-bubble { @apply max-w-[min(290px,75%)] rounded-[10px] border px-4 py-3 text-sm shadow-none; background-color: var(--embed-surface); border-color: var(--embed-border); color: var(--embed-text); } .embed-message--assistant .embed-message-bubble { color: var(--embed-text); } .embed-message--user .embed-message-bubble { background-color: var(--embed-primary); border-color: var(--embed-primary); color: #ffffff; } .embed-message-content { @apply leading-relaxed whitespace-pre-wrap; } .embed-message-time { @apply mt-2 block text-xs; color: color-mix(in oklab, currentColor 68%, transparent); } .embed-message-caret { @apply ml-0.5 inline-block h-3 w-px animate-pulse align-[-2px]; background-color: currentColor; } .embed-message-bubble--typing { color: var(--embed-muted); } .embed-composer-dock { @apply absolute right-0 bottom-0 left-0 z-10; } .embed-composer { @apply relative w-full rounded-[var(--embed-radius)] border px-4 py-3; -webkit-backdrop-filter: blur(16px) saturate(1.25); backdrop-filter: blur(16px) saturate(1.25); background-color: color-mix( in oklab, var(--embed-surface) 82%, transparent ); border-color: var(--embed-border); box-shadow: 0 18px 40px color-mix(in oklab, var(--embed-primary) 24%, transparent); } .embed-course-row { @apply flex flex-wrap items-center gap-2 text-sm font-bold; color: var(--embed-text); } .embed-course-row svg, .embed-question-row svg { color: var(--embed-primary); } .embed-course-row select { @apply h-6 max-w-[210px] rounded-[5px] border px-2 text-xs outline-none; background-color: var(--embed-surface); border-color: var(--embed-border); color: var(--embed-text); } .embed-course-row select:disabled { @apply opacity-70; } .embed-composer-divider { @apply my-3 h-px w-full; background-color: color-mix( in oklab, var(--embed-muted) 24%, transparent ); } .embed-question-row { @apply flex items-start gap-3; } .embed-question-row textarea { @apply min-h-[72px] flex-1 resize-none bg-transparent text-sm outline-none; color: var(--embed-text); } .embed-question-row textarea::placeholder { color: color-mix(in oklab, var(--embed-muted) 48%, transparent); } .embed-send-button { @apply absolute right-4 bottom-3 flex size-8 items-center justify-center rounded-[8px] transition disabled:opacity-55; background-color: var(--embed-primary); color: #ffffff; } .embed-updated-at { @apply mt-2 text-center text-xs; color: var(--embed-muted); } .embed-history { @apply flex min-h-0 flex-1 flex-col gap-1 overflow-y-auto overscroll-contain pt-7; margin-right: -1.5rem; padding-right: 1.5rem; } .embed-history-item { @apply flex w-full items-center justify-between gap-4 rounded-[7px] px-6 py-3 text-left transition; color: var(--embed-text); } .embed-history-item[data-active='true'], .embed-history-item:hover { background-color: color-mix( in oklab, var(--embed-muted) 18%, transparent ); } .embed-history-item strong { @apply block text-base font-semibold; } .embed-history-item small { @apply mt-1 block text-xs; color: var(--embed-text); } .embed-history-delete { @apply shrink-0 opacity-30 transition; color: var(--embed-danger); } .embed-history-item[data-active='true'] .embed-history-delete, .embed-history-item:hover .embed-history-delete { @apply opacity-100; } .embed-empty-copy { @apply mt-16 text-center text-sm; color: var(--embed-muted); } .embed-modal-backdrop { @apply absolute inset-0 z-50 flex items-center justify-center p-6; background-color: color-mix(in oklab, var(--embed-text) 30%, transparent); } .embed-modal { @apply w-full max-w-xs rounded-2xl p-5 shadow-xl; background-color: var(--embed-surface); color: var(--embed-text); } .embed-modal-title { @apply mb-1 text-sm font-semibold; } .embed-modal-body { @apply mb-4 text-sm; color: var(--embed-muted); } .embed-modal-actions { @apply flex justify-end gap-2; } .embed-modal-btn { @apply rounded-full px-4 py-1.5 text-xs font-medium transition; } .embed-modal-btn--cancel { background-color: color-mix(in oklab, var(--embed-muted) 15%, transparent); color: var(--embed-text); } .embed-modal-btn--cancel:hover { background-color: color-mix(in oklab, var(--embed-muted) 25%, transparent); } .embed-modal-btn--danger { background-color: var(--embed-danger); color: #fff; } .embed-modal-btn--danger:hover { opacity: 0.88; } .lecturer-dashboard-shell { @apply min-h-svh; background-color: var(--lecturer-bg); color: var(--lecturer-text); } .lecturer-sidebar { border-color: var(--lecturer-border) !important; } .lecturer-sidebar [data-sidebar='sidebar'] { background-color: var(--lecturer-sidebar-bg); border-color: var(--lecturer-border); box-shadow: var(--lecturer-sidebar-shadow); } .lecturer-sidebar-header { @apply border-b; border-color: var(--lecturer-border); display: flex !important; height: 72px !important; flex-direction: row !important; align-items: center !important; justify-content: space-between !important; gap: 0 !important; padding: 0 20px !important; } .lecturer-brand { @apply flex min-w-0 items-center gap-3 rounded-[10px] text-left outline-none focus-visible:ring-2; color: var(--lecturer-text); flex: 1 1 auto; --tw-ring-color: color-mix( in oklab, var(--lecturer-primary) 45%, transparent ); } .lecturer-brand-mark { @apply flex size-8 shrink-0 items-center justify-center rounded-[8px]; background-color: var(--lecturer-primary); color: var(--lecturer-primary-foreground); } .lecturer-brand-copy { @apply truncate text-base font-bold; } .lecturer-sidebar-trigger { @apply rounded-[8px] shadow-none; color: var(--lecturer-text); width: 32px !important; height: 32px !important; } .lecturer-sidebar-trigger:hover { background-color: var(--lecturer-surface-soft); color: var(--lecturer-text); } .lecturer-sidebar-content { gap: 0 !important; } .lecturer-nav-group { padding: 16px 20px !important; } .lecturer-nav-list { gap: 8px !important; } .lecturer-nav-button { @apply justify-start gap-2 rounded-[8px] text-xs font-semibold shadow-none; color: var(--lecturer-muted); height: 34px !important; padding: 0 10px !important; } .lecturer-nav-button:hover { background-color: var(--lecturer-primary-soft); color: var(--lecturer-primary); } .lecturer-nav-button[data-active='true'] { background-color: var(--lecturer-primary); color: var(--lecturer-primary-foreground); } .lecturer-sidebar-footer { @apply mt-auto border-t; border-color: var(--lecturer-border); padding: 16px 20px !important; } .lecturer-user-button { @apply mb-3 w-fit gap-2 rounded-[6px] shadow-none cursor-default; background-color: var(--lecturer-surface-soft); color: var(--lecturer-text); height: auto !important; padding: 6px 8px !important; } .lecturer-user-button:hover { background-color: var(--lecturer-surface-soft); color: var(--lecturer-text); } .lecturer-user-avatar { @apply size-6 text-[8px]; background-color: var(--lecturer-surface); color: var(--lecturer-text); } .lecturer-user-copy { @apply min-w-0; } .lecturer-user-name { @apply block truncate text-[11px] leading-tight font-semibold; color: var(--lecturer-text); } .lecturer-user-role { @apply block truncate text-[10px] leading-tight; color: var(--lecturer-muted); } .lecturer-logout-button { @apply justify-start gap-1 rounded-none text-[11px] font-normal shadow-none; color: var(--lecturer-danger); height: auto !important; padding: 10px 16px !important; } .lecturer-logout-button:hover { background-color: transparent; color: var(--lecturer-danger); } .lecturer-confirm-dialog { @apply gap-5 rounded-[16px] border p-6 shadow-none sm:max-w-[440px]; background-color: var(--lecturer-surface); border-color: var(--lecturer-border); box-shadow: var(--lecturer-shadow); color: var(--lecturer-text); } .lecturer-confirm-dialog-footer { @apply gap-3 pt-1; } .lecturer-danger-button { @apply h-10 rounded-[8px] px-5 text-sm font-semibold shadow-none; background-color: var(--lecturer-danger) !important; color: var(--lecturer-primary-foreground) !important; } .lecturer-danger-button:hover { background-color: color-mix( in oklab, var(--lecturer-danger) 86%, #000 ) !important; } .group[data-collapsible='icon'] .lecturer-sidebar-header { justify-content: center !important; padding: 0 !important; } .group[data-collapsible='icon'] .lecturer-brand-copy, .group[data-collapsible='icon'] .lecturer-nav-button span, .group[data-collapsible='icon'] .lecturer-user-copy, .group[data-collapsible='icon'] .lecturer-logout-button span { @apply hidden; } .group[data-collapsible='icon'] .lecturer-brand { flex: 0 0 auto; justify-content: center; } .group[data-collapsible='icon'] .lecturer-sidebar-trigger { display: none !important; } .group[data-collapsible='icon'] .lecturer-nav-group { padding: 20px 12px !important; } .group[data-collapsible='icon'] .lecturer-nav-button, .group[data-collapsible='icon'] .lecturer-user-button, .group[data-collapsible='icon'] .lecturer-logout-button { @apply mx-auto flex items-center justify-center rounded-[9px]; width: 32px !important; height: 32px !important; padding: 0 !important; } .group[data-collapsible='icon'] .lecturer-sidebar-footer { @apply px-3; } .lecturer-workspace { @apply flex min-w-0 flex-1 flex-col; background-color: var(--lecturer-bg); color: var(--lecturer-text); } .lecturer-page { @apply w-full px-5 py-8 sm:px-8 lg:px-10; } .lecturer-page input:not([type='checkbox']), .lecturer-page textarea, .lecturer-page select { background-color: color-mix( in oklab, var(--lecturer-primary) 10%, var(--lecturer-surface) ) !important; } .lecturer-page-header { @apply flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between; } .lecturer-page-header h1 { @apply text-3xl leading-tight font-bold tracking-[-0.03em]; color: var(--lecturer-text); } .lecturer-page-header p { @apply mt-1 text-sm leading-relaxed; color: var(--lecturer-muted); } .lecturer-header-actions { @apply flex items-center gap-3; } .lecturer-theme-toggle { @apply static size-9 rounded-[9px] shadow-none sm:static; background-color: var(--lecturer-surface) !important; border-color: var(--lecturer-border-strong) !important; color: var(--lecturer-primary) !important; } .lecturer-create-button { @apply h-9 rounded-[8px] px-4 text-xs font-semibold shadow-none; background-color: var(--lecturer-primary) !important; color: var(--lecturer-primary-foreground) !important; } .lecturer-cancel-button { @apply h-10 rounded-[8px] px-5 text-sm font-semibold shadow-none; background-color: var(--lecturer-surface) !important; border-color: var(--lecturer-border) !important; color: var(--lecturer-text) !important; } .lecturer-cancel-button:hover { background-color: var(--lecturer-surface-soft) !important; } .lecturer-course-dialog { @apply gap-6 rounded-[16px] border p-6 shadow-none sm:max-w-[460px]; background-color: var(--lecturer-surface); border-color: var(--lecturer-border-strong); box-shadow: var(--lecturer-shadow); color: var(--lecturer-text); } .lecturer-course-form { @apply flex flex-col gap-5; } .lecturer-form-field { @apply flex flex-col gap-2; } .lecturer-form-label { color: var(--lecturer-text); } .lecturer-form-input, .lecturer-form-textarea { @apply w-full rounded-[8px] border px-4 text-sm shadow-none transition-[border-color,box-shadow] outline-none; background-color: color-mix( in oklab, var(--lecturer-primary) 6%, var(--lecturer-surface) ); border-color: var(--lecturer-border); color: var(--lecturer-text); } .lecturer-form-input { @apply h-11; } .lecturer-form-textarea { @apply min-h-28 resize-none py-3; } .lecturer-form-input::placeholder, .lecturer-form-textarea::placeholder { color: var(--app-placeholder); } .lecturer-form-input:focus, .lecturer-form-textarea:focus { border-color: var(--lecturer-primary); box-shadow: 0 0 0 3px color-mix(in oklab, var(--lecturer-primary) 18%, transparent); } .lecturer-course-form .lecturer-status { @apply mx-0 mt-0; } .lecturer-course-footer { @apply gap-3 pt-1; } .lecturer-metric-grid { @apply mt-8 grid grid-cols-1 gap-5 md:grid-cols-3; } .lecturer-metric-card { @apply gap-0 rounded-[14px] border py-0 shadow-none; background-color: var(--lecturer-surface); border-color: var(--lecturer-border-soft); box-shadow: var(--lecturer-shadow); } .lecturer-metric-content { @apply flex items-center gap-5 px-6 py-6; } .lecturer-metric-icon { @apply flex size-12 shrink-0 items-center justify-center rounded-[12px]; background-color: var(--lecturer-primary-soft); color: var(--lecturer-primary); } .lecturer-metric-icon[data-tone='danger'] { background-color: color-mix( in oklab, var(--lecturer-danger) 12%, var(--lecturer-surface) ); color: var(--lecturer-danger); } .lecturer-metric-copy p { @apply text-sm; color: var(--lecturer-muted); } .lecturer-metric-value-row { @apply mt-1 flex items-end gap-2; } .lecturer-metric-value-row strong { @apply text-3xl leading-none font-bold; color: var(--lecturer-text); } .lecturer-metric-icon[data-tone='danger'] + .lecturer-metric-copy .lecturer-metric-value-row strong { color: var(--lecturer-danger); } .lecturer-metric-value-row span { @apply pb-1 text-xs; color: var(--lecturer-muted); } .lecturer-table-card { @apply mt-8 gap-0 overflow-hidden rounded-[14px] border py-0 shadow-none; background-color: var(--lecturer-surface); border-color: var(--lecturer-border); box-shadow: var(--lecturer-shadow); } .lecturer-table-content { @apply px-0; } .lecturer-table-heading { @apply flex flex-col gap-4 border-b px-6 py-5 sm:flex-row sm:items-center sm:justify-between; border-color: var(--lecturer-border); } .lecturer-table-heading h2 { @apply text-base font-semibold; color: var(--lecturer-text); } .lecturer-search-field { @apply relative w-full sm:max-w-[320px]; } .lecturer-search-field svg { @apply pointer-events-none absolute top-1/2 left-3 -translate-y-1/2; color: var(--lecturer-muted); z-index: 1; } .lecturer-search-input { @apply h-10 rounded-[9px] border text-sm shadow-none transition-[border-color,box-shadow] outline-none; background-color: color-mix( in oklab, var(--lecturer-primary) 5%, var(--lecturer-surface) ); border-color: var(--lecturer-border); color: var(--lecturer-text); padding-right: 0.75rem !important; padding-left: 2.5rem !important; } .lecturer-search-input::placeholder { color: var(--app-placeholder); } .lecturer-search-input:focus { border-color: var(--lecturer-primary); box-shadow: 0 0 0 3px color-mix(in oklab, var(--lecturer-primary) 16%, transparent); } .lecturer-status { @apply mx-6 mt-4 rounded-[10px] border px-4 py-3 text-sm font-medium; background-color: color-mix( in oklab, var(--lecturer-danger) 8%, var(--lecturer-surface) ); border-color: color-mix( in oklab, var(--lecturer-danger) 24%, transparent ); color: var(--lecturer-danger); } .lecturer-status--success { background-color: color-mix( in oklab, var(--lecturer-success) 8%, var(--lecturer-surface) ); border-color: color-mix( in oklab, var(--lecturer-success) 24%, transparent ); color: var(--lecturer-success); } .lecturer-table-wrap { @apply w-full overflow-x-auto; } .lecturer-table { @apply w-full min-w-[620px] border-collapse text-left; } .lecturer-table th { @apply px-6 py-4 text-xs font-semibold; color: var(--lecturer-muted); } .lecturer-table td { @apply border-t px-6 py-4 text-sm; border-color: var(--lecturer-border); color: var(--lecturer-muted); } .lecturer-table tbody tr:hover { background-color: color-mix( in oklab, var(--lecturer-primary) 5%, transparent ); } .lecturer-kb-name { @apply block max-w-[260px] font-semibold; color: var(--lecturer-text); } .lecturer-doc-pill { @apply inline-flex items-center gap-1.5 rounded-[7px] px-2.5 py-1 text-xs font-semibold; background-color: var(--lecturer-surface-soft); color: var(--lecturer-text); } .lecturer-doc-pill svg { color: var(--lecturer-primary); } .lecturer-doc-error { @apply size-1.5 rounded-full; background-color: var(--lecturer-danger); } .lecturer-table-empty { @apply py-10 text-center text-sm; color: var(--lecturer-muted) !important; } .lecturer-manage-button { @apply inline-flex items-center justify-center gap-1 rounded-[7px] px-3 py-1.5 text-sm font-semibold transition-colors outline-none focus-visible:ring-2; background-color: color-mix( in oklab, var(--lecturer-primary) 10%, var(--lecturer-surface) ); color: var(--lecturer-primary); --tw-ring-color: color-mix( in oklab, var(--lecturer-primary) 45%, transparent ); } .lecturer-manage-button:hover { background-color: color-mix( in oklab, var(--lecturer-primary) 16%, var(--lecturer-surface) ); } .lecturer-detail-page { @apply min-h-svh w-full; background-color: var(--lecturer-bg); color: var(--lecturer-text); } .lecturer-detail-header { @apply flex flex-col gap-5 px-5 py-8 sm:flex-row sm:items-start sm:px-8 lg:px-10; background-color: var(--lecturer-surface-soft); border-bottom: 1px solid var(--lecturer-border-soft); } .lecturer-detail-back { @apply mt-1 inline-flex size-9 shrink-0 items-center justify-center rounded-full transition-colors outline-none focus-visible:ring-2; color: var(--lecturer-muted); --tw-ring-color: color-mix( in oklab, var(--lecturer-primary) 45%, transparent ); } .lecturer-detail-back:hover { background-color: var(--lecturer-surface); color: var(--lecturer-text); } .lecturer-detail-heading { @apply min-w-0 flex-1; } .lecturer-detail-title-row { @apply flex flex-wrap items-center gap-4; } .lecturer-detail-title-row h1 { @apply text-3xl leading-tight font-bold tracking-[-0.03em]; color: var(--lecturer-text); } .lecturer-detail-heading p { @apply mt-1 text-base leading-relaxed italic; color: var(--lecturer-muted); } .lecturer-detail-actions { @apply flex items-center gap-3 sm:ml-auto; } .lecturer-edit-button { @apply h-12 rounded-[8px] px-5 text-base font-semibold shadow-none; background-color: var(--lecturer-surface) !important; border-color: var(--lecturer-border) !important; color: var(--lecturer-text) !important; } .lecturer-edit-button:hover { background-color: color-mix( in oklab, var(--lecturer-primary) 8%, var(--lecturer-surface) ) !important; } .lecturer-delete-button { @apply size-12 rounded-[8px] shadow-none; background-color: color-mix( in oklab, var(--lecturer-danger) 10%, var(--lecturer-surface) ) !important; color: var(--lecturer-danger) !important; } .lecturer-delete-button:hover { background-color: color-mix( in oklab, var(--lecturer-danger) 16%, var(--lecturer-surface) ) !important; } .lecturer-delete-copy { @apply text-sm leading-relaxed; color: var(--lecturer-muted); } .lecturer-delete-copy strong { color: var(--lecturer-text); } .lecturer-danger-action-button { @apply h-10 rounded-[8px] px-5 text-sm font-semibold shadow-none; background-color: var(--lecturer-danger) !important; color: var(--lecturer-primary-foreground) !important; } .lecturer-danger-action-button:hover { background-color: color-mix( in oklab, var(--lecturer-danger) 86%, #000 ) !important; } .lecturer-detail-content { @apply mx-auto flex w-full max-w-[920px] flex-col gap-6 px-5 py-10 sm:px-8; } .lecturer-upload-input { @apply sr-only; } .lecturer-upload-card { @apply flex min-h-[185px] w-full flex-col items-center justify-center gap-3 rounded-[14px] border border-dashed px-6 py-8 text-center transition-colors outline-none focus-visible:ring-2; background-color: color-mix( in oklab, var(--lecturer-primary) 6%, var(--lecturer-surface) ); border-color: color-mix( in oklab, var(--lecturer-primary) 28%, var(--lecturer-border) ); color: var(--lecturer-text); --tw-ring-color: color-mix( in oklab, var(--lecturer-primary) 45%, transparent ); } .lecturer-upload-card:hover { background-color: color-mix( in oklab, var(--lecturer-primary) 10%, var(--lecturer-surface) ); border-color: var(--lecturer-primary); } .lecturer-upload-card[data-uploading='true'] { opacity: 0.78; } .lecturer-upload-icon { @apply flex size-12 items-center justify-center rounded-full; background-color: var(--lecturer-surface); color: var(--lecturer-primary); } .lecturer-upload-title { @apply text-base font-medium; color: var(--lecturer-text); } .lecturer-upload-description { @apply max-w-[560px] text-sm leading-relaxed; color: var(--lecturer-muted); } .lecturer-document-section { @apply mt-1; } .lecturer-document-heading { @apply flex items-center gap-2 text-sm font-bold; color: var(--lecturer-text); } .lecturer-document-list { @apply mt-5 flex flex-col gap-3; } .lecturer-document-card { @apply relative gap-0 rounded-[10px] border py-0 shadow-none; background-color: color-mix( in oklab, var(--lecturer-primary) 3%, var(--lecturer-surface) ); border-color: color-mix( in oklab, var(--lecturer-primary) 18%, var(--lecturer-border) ); } .lecturer-document-card[data-status='failed'] { background-color: color-mix( in oklab, var(--lecturer-danger) 5%, var(--lecturer-surface) ); border-color: color-mix( in oklab, var(--lecturer-danger) 25%, var(--lecturer-border) ); } .lecturer-document-content { @apply flex items-start gap-4 px-5 py-5; } .lecturer-document-delete { @apply absolute top-3 right-3 rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive; @media (hover: hover) { @apply opacity-0; } } @media (hover: hover) { .lecturer-document-card:hover .lecturer-document-delete, .lecturer-document-card:focus-within .lecturer-document-delete { @apply opacity-100; } } .lecturer-document-icon { @apply flex size-10 shrink-0 items-center justify-center rounded-[8px]; background-color: color-mix( in oklab, var(--lecturer-primary) 12%, var(--lecturer-surface) ); color: var(--lecturer-primary); } .lecturer-document-icon[data-status='failed'] { background-color: color-mix( in oklab, var(--lecturer-danger) 12%, var(--lecturer-surface) ); color: var(--lecturer-danger); } .lecturer-document-copy { @apply min-w-0 flex-1; } .lecturer-document-copy h3 { @apply truncate text-sm font-bold; color: var(--lecturer-text); } .lecturer-document-meta { @apply mt-2 flex flex-wrap items-center gap-3 text-xs; color: var(--lecturer-muted); } .lecturer-document-status { @apply mt-3 flex items-center gap-1.5 text-xs font-semibold; color: var(--lecturer-success); } .lecturer-document-status[data-status='failed'] { color: var(--lecturer-danger); } .lecturer-document-status[data-status='processing'] { color: var(--lecturer-primary); } .lecturer-detail-empty { @apply rounded-[10px] border px-5 py-8 text-center text-sm; background-color: var(--lecturer-surface); border-color: var(--lecturer-border); color: var(--lecturer-muted); } @media (max-width: 640px) { .student-chat-stage--session { @apply px-0; } .student-chat-thread { @apply px-3; padding-bottom: 11rem; } .student-chat-scroll-anchor { scroll-margin-bottom: 12rem; } .student-message-bubble { @apply max-w-[calc(100vw_-_7rem)]; } .student-chat-composer { @apply right-3 bottom-4 left-3 pb-0; } .lecturer-page { @apply px-4 py-6; } .lecturer-page-header h1 { @apply text-2xl; } .lecturer-header-actions { @apply w-full; } .lecturer-create-button { @apply flex-1; } .lecturer-detail-title-row h1 { @apply text-2xl; } .lecturer-detail-actions { @apply w-full; } .lecturer-edit-button { @apply flex-1; } .lecturer-detail-content { @apply px-4 py-6; } .lecturer-document-content { @apply flex-col; } } } .lecturer-dashboard-shell { --primary: var(--lecturer-primary); --primary-foreground: var(--lecturer-primary-foreground); --ring: color-mix(in oklab, var(--lecturer-primary) 40%, transparent); } /* Error page */ .error-shell { @apply relative flex min-h-screen items-center justify-center bg-background px-4; } .error-toggle { @apply absolute top-4 right-4; } .error-content { @apply flex flex-col items-center gap-4 text-center max-w-sm w-full; } .error-icon { @apply flex size-16 items-center justify-center rounded-full bg-muted text-muted-foreground; } .error-code { @apply text-6xl font-bold text-muted-foreground; } .error-title { @apply text-2xl font-semibold text-foreground; } .error-description { @apply text-sm text-muted-foreground; } /* Markdown rendering in chat messages */ .student-message-markdown { @apply text-sm leading-relaxed; } .student-message-markdown p { @apply mb-2 last:mb-0; } .student-message-markdown strong, .student-message-markdown b { @apply font-semibold; } .student-message-markdown em, .student-message-markdown i { @apply italic; } .student-message-markdown ul { @apply mb-2 list-disc pl-5; } .student-message-markdown ol { @apply mb-2 list-decimal pl-5; } .student-message-markdown li { @apply mb-0.5; } .student-message-markdown code { @apply rounded bg-muted px-1 py-0.5 font-mono text-xs; } .student-message-markdown pre { @apply mb-2 overflow-x-auto rounded-md bg-muted p-3; } .student-message-markdown pre code { @apply bg-transparent p-0; } .student-message-markdown h1, .student-message-markdown h2, .student-message-markdown h3 { @apply mb-1 font-semibold; } .student-message-markdown blockquote { @apply border-l-2 border-muted-foreground pl-3 italic text-muted-foreground; }