kepler-chat/src/app.css
Aidan Bleser 7b9595e571
Post Hackathon Stuff (#40)
Co-authored-by: Thomas G. Lopes <26071571+TGlide@users.noreply.github.com>
2025-07-10 04:45:02 -07:00

601 lines
17 KiB
CSS

@import 'tailwindcss';
@import '@fontsource-variable/inter';
@import '@fontsource-variable/geist-mono';
@import '@fontsource-variable/nunito-sans';
@import '@fontsource/instrument-serif';
@import 'tw-animate-css';
@custom-variant dark (&:is(.dark *));
:root {
/* Improved light theme with better harmony */
--background: oklch(0.99 0.005 280);
--foreground: oklch(0.15 0.02 280);
--card: oklch(0.98 0.008 280);
--card-foreground: oklch(0.15 0.02 280);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.15 0.02 280);
--primary: oklch(0.5797 0.1194 237.7893);
--heading: oklch(0.5797 0.1194 237.7893);
--primary-foreground: oklch(1 0 0);
--secondary: oklch(0.92 0.015 280);
--secondary-foreground: oklch(0.25 0.03 280);
--muted: oklch(0.94 0.012 280);
--muted-foreground: oklch(0.45 0.025 280);
--accent: oklch(0.92 0.015 280);
--accent-foreground: oklch(0.25 0.03 280);
--destructive: oklch(0.5248 0.1368 20.8317);
--destructive-foreground: oklch(1 0 0);
--border: oklch(0.88 0.02 280);
--input: oklch(0.96 0.01 280);
--ring: oklch(0.5797 0.1194 237.7893);
--chart-1: oklch(0.6038 0.2363 344.4657);
--chart-2: oklch(0.4445 0.2251 300.6246);
--chart-3: oklch(0.379 0.0438 226.1538);
--chart-4: oklch(0.833 0.1185 88.3461);
--chart-5: oklch(0.7843 0.1256 58.9964);
/* Harmonized sidebar colors for light mode */
--sidebar: oklch(0.97 0.008 280);
--sidebar-foreground: oklch(0.2 0.025 280);
--sidebar-primary: oklch(0.5797 0.1194 237.7893);
--sidebar-primary-foreground: oklch(1 0 0);
--sidebar-accent: oklch(0.94 0.012 280);
--sidebar-accent-foreground: oklch(0.25 0.03 280);
--sidebar-border: oklch(0.9 0.015 280);
--sidebar-ring: oklch(0.5797 0.1194 237.7893);
--radius: 0.5rem;
--shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
--shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
--shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
--shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
--shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);
--shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);
--shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);
--shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);
}
.dark {
--background: oklch(0.2409 0.0201 267.5346);
--foreground: oklch(0.8398 0.0387 309.5391);
--card: oklch(0.2803 0.0232 307.5413);
--card-foreground: oklch(0.8456 0.0302 341.4597);
--popover: oklch(0.1548 0.0132 338.9015);
--popover-foreground: oklch(0.9647 0.0091 341.8035);
--primary: oklch(0.5797 0.1194 237.7893);
--heading: oklch(0.85 0.1194 237.7893);
--primary-foreground: oklch(1 0 0);
--secondary: oklch(0.3137 0.0306 310.061);
--secondary-foreground: oklch(0.8483 0.0382 307.9613);
--muted: oklch(0.3234 0.0419 257.4748);
--muted-foreground: oklch(0.794 0.0372 307.1032);
--accent: oklch(0.3649 0.0408 290.4911);
--accent-foreground: oklch(0.9647 0.0091 341.8035);
--destructive: oklch(0.5248 0.1368 20.8317);
--destructive-foreground: oklch(1 0 0);
--border: oklch(0.3286 0.0154 343.4461);
--input: oklch(0.3387 0.0195 332.8347);
--ring: oklch(0.5797 0.1194 237.7893);
--chart-1: oklch(0.5316 0.1409 355.1999);
--chart-2: oklch(0.5633 0.1912 306.8561);
--chart-3: oklch(0.7227 0.1502 60.5799);
--chart-4: oklch(0.6193 0.2029 312.7422);
--chart-5: oklch(0.6118 0.2093 6.1387);
/* Subtle blue shift for sidebar colors in dark mode */
--sidebar: oklch(0.1693 0.0143 280);
--sidebar-foreground: oklch(0.8607 0.0293 265);
--sidebar-primary: oklch(0.4882 0.2172 250);
--sidebar-primary-foreground: oklch(1 0 0);
--sidebar-accent: oklch(0.2337 0.0261 260);
--sidebar-accent-foreground: oklch(0.9674 0.0013 250);
--sidebar-border: oklch(0.3297 0.0294 237.7893);
--sidebar-ring: oklch(0.5797 0.1194 237.7893);
--radius: 0.5rem;
--shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
--shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
--shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
--shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
--shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);
--shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);
--shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);
--shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);
}
@theme inline {
--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-heading: var(--heading);
--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);
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--shadow-2xs: var(--shadow-2xs);
--shadow-xs: var(--shadow-xs);
--shadow-sm: var(--shadow-sm);
--shadow: var(--shadow);
--shadow-md: var(--shadow-md);
--shadow-lg: var(--shadow-lg);
--shadow-xl: var(--shadow-xl);
--shadow-2xl: var(--shadow-2xl);
/* For shiny text */
--animate-shimmer: shimmer 1.5s infinite;
}
@theme inline {
--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);
--font-sans:
'Inter Variable', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
'Segoe UI Symbol', 'Noto Color Emoji';
--font-fake-proxima:
'Nunito Sans Variable', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
'Segoe UI Symbol', 'Noto Color Emoji';
--font-serif: 'Instrument Serif', ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif;
--font-mono:
'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono',
'Courier New', monospace;
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--shadow-2xs: var(--shadow-2xs);
--shadow-xs: var(--shadow-xs);
--shadow-sm: var(--shadow-sm);
--shadow: var(--shadow);
--shadow-md: var(--shadow-md);
--shadow-lg: var(--shadow-lg);
--shadow-xl: var(--shadow-xl);
--shadow-2xl: var(--shadow-2xl);
}
@utility fill-device-height {
height: 100svh;
/* min-height: calc(100vh - env(safe-area-inset-top) - env(safe-area-inset-bottom)); */
}
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground bg-noise fill-device-height w-full;
}
}
/* For components that need horizontal scrolling */
.scrollbar-hide {
-ms-overflow-style: none; /* Internet Explorer and Edge */
scrollbar-width: none; /* Firefox */
}
.scrollbar-hide::-webkit-scrollbar {
display: none; /* Chrome, Safari, and Opera */
}
.animation-delay-0 {
animation-delay: 0s;
}
.animation-delay-100 {
animation-delay: 0.1s;
}
.animation-delay-200 {
animation-delay: 0.2s;
}
@layer components {
/* Modal is from DaisyUI */
.modal {
@apply pointer-events-none invisible fixed inset-0 m-0 grid h-full max-h-none w-full max-w-none items-center justify-items-center bg-transparent p-0 text-[inherit];
overflow-x: hidden;
transition:
translate 0.3s ease-out,
visibility 0.3s allow-discrete,
background-color 0.3s ease-out,
opacity 0.1s ease-out;
overflow-y: hidden;
overscroll-behavior: contain;
z-index: 999;
&::backdrop {
@apply hidden;
}
&.modal-open,
&[open],
&:target {
@apply pointer-events-auto visible opacity-100;
background-color: oklch(0% 0 0/ 0.4);
/* this cause glitch on Chrome */
/* transition:
translate 0.3s ease-out,
background-color 0.3s ease-out,
opacity 0.1s ease-out; */
.modal-box {
translate: 0 0;
scale: 1;
opacity: 1;
}
}
@starting-style {
&.modal-open,
&[open],
&:target {
@apply invisible opacity-0;
}
}
}
.modal-action {
@apply mt-6 flex justify-end gap-2;
}
.modal-toggle {
@apply fixed h-0 w-0 appearance-none opacity-0;
&:checked + .modal {
@apply pointer-events-auto visible opacity-100;
background-color: oklch(0% 0 0/ 0.4);
.modal-box {
translate: 0 0;
scale: 1;
opacity: 1;
}
}
@starting-style {
&:checked + .modal {
@apply invisible opacity-0;
}
}
}
.modal-backdrop {
@apply col-start-1 row-start-1 grid self-stretch justify-self-stretch text-transparent;
z-index: -1;
button {
@apply cursor-pointer;
}
}
.modal-box {
@apply bg-background border-border col-start-1 row-start-1 max-h-screen w-11/12 max-w-[32rem] border p-6;
transition:
translate 0.3s ease-out,
scale 0.3s ease-out,
opacity 0.2s ease-out 0.05s,
box-shadow 0.3s ease-out;
border-radius: var(--radius);
scale: 95%;
opacity: 0;
box-shadow: oklch(0% 0 0/ 0.25) 0px 25px 50px -12px;
overflow-y: auto;
overscroll-behavior: contain;
}
.modal-top {
@apply place-items-start;
:where(.modal-box) {
@apply h-auto w-full max-w-none;
max-height: calc(100vh - 5em);
translate: 0 -100%;
scale: 1;
--modal-tl: 0;
--modal-tr: 0;
--modal-bl: var(--radius-box);
--modal-br: var(--radius-box);
}
}
.modal-middle {
@apply place-items-center;
:where(.modal-box) {
@apply h-auto w-11/12 max-w-[32rem];
max-height: calc(100vh - 5em);
translate: 0 2%;
scale: 98%;
--modal-tl: var(--radius-box);
--modal-tr: var(--radius-box);
--modal-bl: var(--radius-box);
--modal-br: var(--radius-box);
}
}
.modal-bottom {
@apply place-items-end;
:where(.modal-box) {
@apply h-auto w-full max-w-none;
max-height: calc(100vh - 5em);
translate: 0 100%;
scale: 1;
--modal-tl: var(--radius-box);
--modal-tr: var(--radius-box);
--modal-bl: 0;
--modal-br: 0;
}
}
.modal-start {
@apply place-items-start;
:where(.modal-box) {
@apply h-screen max-h-none w-auto max-w-none;
translate: -100% 0;
scale: 1;
--modal-tl: 0;
--modal-tr: var(--radius-box);
--modal-bl: 0;
--modal-br: var(--radius-box);
}
}
.modal-end {
@apply place-items-end;
:where(.modal-box) {
@apply h-screen max-h-none w-auto max-w-none;
translate: 100% 0;
scale: 1;
--modal-tl: var(--radius-box);
--modal-tr: 0;
--modal-bl: var(--radius-box);
--modal-br: 0;
}
}
/* Border reflect from t3 */
.button-reflect {
/* Derived from dark primary: oklch(0.5797 0.1194 237.7893) */
--min: oklch(0.5797 0.1194 237.7893 / 0.25) !important; /* Lighter, more transparent */
--max: oklch(0.5797 0.1194 237.7893 / 0.7) !important; /* Slightly more saturated */
--start: #000000d9 !important;
}
.border-reflect {
/* Derived from dark primary: oklch(0.5797 0.1194 237.7893) */
--c: 237.7893 11.94% 57.97%; /* Using the hue, chroma, and lightness from dark primary */
--min: hsl(from var(--primary) h c l / 0.2);
--max: hsl(from var(--primary) h c l / 1);
--gradientBorder-gradient:
linear-gradient(180deg, var(--min), var(--max), var(--min)),
linear-gradient(15deg, var(--min) 50%, var(--max));
--opacity: 1;
--start: rgba(0, 0, 0, 0.85);
position: relative;
}
.boring-dark .border-reflect,
.dark .border-reflect {
/* Derived from dark primary: oklch(0.5797 0.1194 237.7893) */
--gradientBorder-gradient:
linear-gradient(
180deg,
oklch(0.5797 0.1194 237.7893 / 0),
oklch(0.5797 0.1194 237.7893 / 0.74),
oklch(0.5797 0.1194 237.7893 / 0.09)
),
linear-gradient(
15deg,
oklch(0.5797 0.1194 237.7893 / 0.12),
oklch(0.5797 0.1194 237.7893 / 0.74)
);
--start: rgba(0, 0, 0, 0.92);
}
.border-reflect:before {
content: '';
pointer-events: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
position: absolute;
inset: 0;
border-radius: inherit;
padding: var(--gradientBorder-size, 1px);
background: var(--gradientBorder-gradient);
-webkit-mask:
linear-gradient(var(--start), #000) content-box,
linear-gradient(var(--start), #000);
mask:
linear-gradient(var(--start), #000) content-box,
linear-gradient(var(--start), #000);
-webkit-mask-composite: xor;
mask-composite: exclude;
opacity: var(--opacity, 1);
}
}
@utility abs-y-center {
top: 50%;
transform: translateY(-50%);
}
@utility abs-x-center {
left: 50%;
transform: translateX(-50%);
}
@utility bg-noise {
background-image: url(/images/noise.png);
background-size: auto;
background-repeat: repeat;
background-size: 96px 96px;
}
/* Copy button */
pre:has(code) {
position: relative;
}
pre button.copy {
position: absolute;
right: 12px;
top: 12px;
height: 32px;
width: 32px;
padding: 0;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
@apply bg-background/80 hover:bg-background border-border hover:border-border/60 hover:text-foreground rounded-md border shadow-sm hover:shadow-md;
/* Improved hover and focus states */
&:hover {
transform: translateY(-1px);
@apply bg-background;
}
&:active {
transform: translateY(0px);
transition: all 0.1s cubic-bezier(0.4, 0, 0.2, 1);
}
&:focus-visible {
@apply ring-ring ring-offset-background ring-2 ring-offset-2 outline-none;
}
& span {
width: 16px;
height: 16px;
background-repeat: no-repeat;
background-position: center;
background-size: contain;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
background-color: transparent !important;
}
& svg {
width: 16px;
height: 16px;
}
& .ready {
background-image: url(/icons/copy.svg);
}
& .success {
display: none;
background-image: url(/icons/copy-success.svg);
transform: scale(1.1);
}
&.copied {
/* Light mode success state (dark blue text on light background) */
@apply bg-primary/10 border-primary/30 text-primary;
& .success {
display: block;
animation: copySuccess 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
& .ready {
display: none;
}
}
}
/* Dark mode adjustments for copy button success state */
.dark pre button.copy.copied {
/* Dark mode success state (light blue text on dark background) */
@apply bg-primary/20 border-primary/40 text-primary-foreground;
/* Using primary-foreground which is white/light for better visibility */
}
/* Copy success animation */
@keyframes copySuccess {
0% {
transform: scale(0.8);
opacity: 0;
}
50% {
transform: scale(1.2);
}
100% {
transform: scale(1.1);
opacity: 1;
}
}
/* For shiny text */
@keyframes shimmer {
0% {
background-position: calc(-100% - var(--shimmer-width)) 0;
}
100% {
background-position: calc(100% + var(--shimmer-width)) 0;
}
}