Files
Lumotia/src/app.css
2026-03-21 10:28:24 +00:00

308 lines
7.4 KiB
CSS

@import url('https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,300..700;1,9..40,300..700&family=Instrument+Serif:ital@0;1&display=swap');
@import "tailwindcss";
/* === Kon Design Tokens === */
@theme {
/* Surfaces — warm layered depth */
--color-bg: #0f0e0c;
--color-bg-elevated: #171614;
--color-bg-card: #1b1a17;
--color-bg-input: #151412;
--color-border: #2c2923;
--color-border-subtle: #221f1b;
/* Text — warm hierarchy */
--color-text: #f0ece4;
--color-text-secondary: #9a9486;
--color-text-tertiary: #716b60;
/* Accent — warm amber/copper */
--color-accent: #e8a87c;
--color-accent-hover: #d4976a;
--color-accent-subtle: #e8a87c10;
--color-accent-glow: #e8a87c25;
/* Semantic */
--color-success: #7ec89a;
--color-danger: #e87171;
--color-warning: #e8c86e;
/* Layout */
--color-sidebar: #13120f;
--color-nav-active: #201e1a;
--color-hover: #1e1c18;
/* === Layout Tokens === */
--radius-sm: 6px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-xl: 16px;
--title-size: 26px;
}
/* === Button Component Classes === */
.btn-sm { @apply px-2.5 py-1 text-[11px]; }
.btn-md { @apply px-3 py-1.5 text-[12px]; }
.btn-lg { @apply px-4 py-2 text-[13px]; }
/* === Light theme overrides === */
html.light {
--color-bg: #faf8f5;
--color-bg-elevated: #f3f0eb;
--color-bg-card: #ffffff;
--color-bg-input: #f0ede8;
--color-border: #ddd8d0;
--color-border-subtle: #e6e2da;
--color-text: #1a1816;
--color-text-secondary: #5c574d;
--color-text-tertiary: #8a8578;
--color-accent: #d4956a;
--color-accent-hover: #c48a60;
--color-accent-subtle: #d4956a10;
--color-accent-glow: #d4956a25;
--color-success: #4a9e6a;
--color-danger: #d45454;
--color-warning: #c9a84e;
--color-sidebar: #f5f2ed;
--color-nav-active: #eae6e0;
--color-hover: #ede9e3;
}
html.light ::-webkit-scrollbar-thumb {
background: #d0ccc4;
}
html.light ::-webkit-scrollbar-thumb:hover {
background: #b8b3aa;
}
html.light .grain::after {
opacity: 0.015;
}
/* === Base === */
html, body {
margin: 0;
padding: 0;
height: 100%;
overflow: hidden;
background: var(--color-bg);
color: var(--color-text);
font-family: "DM Sans", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
font-size: 14px;
line-height: 1.5;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
user-select: none;
}
/* === Display font === */
.font-display {
font-family: "Instrument Serif", Georgia, "Times New Roman", serif;
}
/* === Transcript font — optimised for reading === */
.font-transcript {
font-family: "DM Sans", system-ui, sans-serif;
font-size: var(--font-size-transcript, 15px);
line-height: 1.85;
letter-spacing: 0.01em;
font-feature-settings: "liga" 1, "kern" 1;
}
/* === Grain texture overlay === */
.grain::after {
content: "";
position: fixed;
inset: 0;
pointer-events: none;
opacity: 0.025;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
z-index: 50;
pointer-events: none !important;
}
/* === Scrollbar — thin, appears on hover === */
::-webkit-scrollbar {
width: 5px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: #2c2923;
border-radius: 999px;
}
::-webkit-scrollbar-thumb:hover {
background: #3d3830;
}
/* === Smooth transitions (global) === */
* {
transition-property: background-color, border-color, color, opacity, box-shadow;
transition-duration: 150ms;
transition-timing-function: cubic-bezier(0.2, 0.8, 0.2, 1);
}
/* Opt out for inputs */
textarea, input, [data-no-transition] {
transition: none;
}
/* === Focus ring — consistent, accessible === */
:focus-visible {
outline: 2px solid var(--color-accent);
outline-offset: 3px;
border-radius: var(--radius-md);
}
/* === Selection colour === */
::selection {
background: var(--color-accent-glow);
color: var(--color-text);
}
/* === Animations === */
@keyframes fade-in {
from { opacity: 0; transform: translateY(4px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes pulse-soft {
0%, 100% { opacity: 1; }
50% { opacity: 0.4; }
}
@keyframes pulse-warm {
0%, 100% { box-shadow: 0 0 24px rgba(232, 168, 124, 0.25), 0 0 48px rgba(232, 168, 124, 0.08); }
50% { box-shadow: 0 0 32px rgba(232, 168, 124, 0.4), 0 0 64px rgba(232, 168, 124, 0.15); }
}
@keyframes slide-up {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes breathe {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.04); }
}
.animate-fade-in {
animation: fade-in 200ms ease-out;
}
.animate-pulse-soft {
animation: pulse-soft 1.5s ease-in-out infinite;
}
.animate-pulse-warm {
animation: pulse-warm 2s ease-in-out infinite;
}
.animate-slide-up {
animation: slide-up 250ms ease-out;
}
.animate-breathe {
animation: breathe 3s ease-in-out infinite;
}
/* === Task sidebar slide === */
@keyframes slide-in-right {
from { transform: translateX(100%); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
@keyframes slide-out-right {
from { transform: translateX(0); opacity: 1; }
to { transform: translateX(100%); opacity: 0; }
}
/* Task extraction highlight */
@keyframes highlight-warm {
0% { border-left-color: var(--color-accent); }
100% { border-left-color: transparent; }
}
/* Checkbox pop */
@keyframes scale-pop {
0% { transform: scale(0.95); }
100% { transform: scale(1); }
}
.animate-slide-in-right {
animation: slide-in-right 200ms ease-out;
}
.animate-highlight-warm {
border-left: 3px solid transparent;
animation: highlight-warm 2s ease-out;
}
.animate-scale-pop {
animation: scale-pop 50ms ease-out;
}
/* Window focus glow */
@keyframes glow-pulse {
0% { box-shadow: 0 0 0 0 rgba(232, 168, 124, 0); }
30% { box-shadow: 0 0 20px 4px rgba(232, 168, 124, 0.35), inset 0 0 12px rgba(232, 168, 124, 0.08); }
100% { box-shadow: 0 0 0 0 rgba(232, 168, 124, 0); }
}
.animate-glow-pulse {
animation: glow-pulse 700ms ease-out;
}
html.light .animate-glow-pulse {
animation: glow-pulse-light 700ms ease-out;
}
@keyframes glow-pulse-light {
0% { box-shadow: 0 0 0 0 rgba(212, 149, 106, 0); }
30% { box-shadow: 0 0 20px 4px rgba(212, 149, 106, 0.3), inset 0 0 12px rgba(212, 149, 106, 0.06); }
100% { box-shadow: 0 0 0 0 rgba(212, 149, 106, 0); }
}
/* Float window entrance */
@keyframes float-enter {
from { opacity: 0; transform: scale(0.97); }
to { opacity: 1; transform: scale(1); }
}
.animate-float-enter {
animation: float-enter 200ms ease-out;
}
/* === Custom titlebar buttons === */
.titlebar-btn {
display: flex;
align-items: center;
justify-content: center;
width: 46px;
height: 32px;
color: var(--color-text-secondary);
}
/* Sinhala character spin (decorative, during recording) */
@keyframes sinhala-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.animate-sinhala-spin {
animation: sinhala-spin 2s linear infinite;
}
/* Recording indicator dot (follows mouse via JS, see +layout.svelte) */
/* === Reduced Motion === */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}