Import source: src/app/globals

Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality.
This commit is contained in:
arsam
2026-09-18 23:10:26 +03:30
parent adccdeddd3
commit 58eb0f50fe
+547
View File
@@ -0,0 +1,547 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
:root {
/* Porcelain light theme */
--background: 220 20% 96%;
--foreground: 224 18% 12%;
--card: 0 0% 100%;
--card-foreground: 224 18% 12%;
--primary: 224 88% 53%;
--primary-foreground: 0 0% 100%;
--secondary: 220 14% 92%;
--secondary-foreground: 224 18% 14%;
--muted: 220 14% 93%;
--muted-foreground: 224 8% 44%;
--accent: 30 100% 48%;
--accent-foreground: 224 18% 12%;
--destructive: 4 74% 49%;
--destructive-foreground: 0 0% 100%;
--success: 154 84% 30%;
--warning: 31 95% 42%;
--border: 220 12% 86%;
--input: 220 12% 86%;
--ring: 224 88% 53%;
/* Aurora companions (hue triplets) */
--aurora-a: 224 88% 60%;
--aurora-b: 200 80% 55%;
--aurora-c: 0 0% 70%;
--aurora-opacity: 0.18;
/* Liquid glass */
--glass-alpha: 0.78;
--glass-blur: 3px;
--glass-saturate: 112%;
--glass-edge-alpha: 0.7;
--radius: 12px;
--sidebar-width: 256px;
--header-height: 56px;
}
/* Pitch-black dark theme — strictly neutral grays, zero hue cast.
* Color enters only through the user-selected accent. */
.dark {
--background: 0 0% 0%;
--foreground: 0 0% 96%;
--card: 0 0% 10%;
--card-foreground: 0 0% 95%;
--primary: 222 95% 63%;
--primary-foreground: 0 0% 100%;
--secondary: 0 0% 14%;
--secondary-foreground: 0 0% 95%;
--muted: 0 0% 12%;
--muted-foreground: 0 0% 64%;
--accent: 31 100% 54%;
--accent-foreground: 0 0% 0%;
--destructive: 4 78% 56%;
--destructive-foreground: 0 0% 100%;
--success: 154 70% 44%;
--warning: 36 95% 56%;
--border: 0 0% 17%;
--input: 0 0% 17%;
--ring: 222 95% 63%;
--aurora-opacity: 0.16;
--glass-alpha: 0.62;
--glass-edge-alpha: 0.14;
}
/* ---------------------------------------------------------------------------
* Accent presets — applied as data-accent on <html>.
* ------------------------------------------------------------------------- */
[data-accent="violet"] {
--primary: 261 78% 56%;
--ring: 261 78% 56%;
--aurora-a: 261 80% 62%;
}
.dark[data-accent="violet"] {
--primary: 260 90% 67%;
--ring: 260 90% 67%;
}
[data-accent="emerald"] {
--primary: 161 92% 30%;
--ring: 161 92% 30%;
--aurora-a: 160 80% 45%;
}
.dark[data-accent="emerald"] {
--primary: 158 68% 44%;
--ring: 158 68% 44%;
}
[data-accent="sunset"] {
--primary: 24 94% 50%;
--primary-foreground: 24 90% 98%;
--ring: 24 94% 50%;
--aurora-a: 24 94% 55%;
}
.dark[data-accent="sunset"] {
--primary: 26 96% 56%;
--primary-foreground: 24 95% 7%;
--ring: 26 96% 56%;
}
[data-accent="rose"] {
--primary: 345 82% 51%;
--ring: 345 82% 51%;
--aurora-a: 345 85% 60%;
}
.dark[data-accent="rose"] {
--primary: 347 90% 64%;
--ring: 347 90% 64%;
}
[data-accent="cyan"] {
--primary: 196 95% 38%;
--ring: 196 95% 38%;
--aurora-a: 196 95% 50%;
}
.dark[data-accent="cyan"] {
--primary: 194 92% 52%;
--primary-foreground: 200 95% 6%;
--ring: 194 92% 52%;
}
/* In dark mode the ambient companions are strictly monochrome — only the
* primary blob carries the accent hue. Declared after the accent presets so
* it wins regardless of the selected accent. */
.dark {
--aurora-b: 0 0% 55%;
--aurora-c: 0 0% 35%;
}
/* ---------------------------------------------------------------------------
* Glass intensity — applied as data-glass on <html>.
* ------------------------------------------------------------------------- */
[data-glass="off"] {
--glass-alpha: 1;
--glass-blur: 0px;
--glass-saturate: 100%;
}
[data-glass="subtle"] {
--glass-alpha: 0.86;
--glass-blur: 2px;
--glass-saturate: 108%;
}
[data-glass="heavy"] {
--glass-alpha: 0.54;
--glass-blur: 10px;
--glass-saturate: 135%;
}
.dark[data-glass="subtle"] {
--glass-alpha: 0.76;
}
.dark[data-glass="heavy"] {
--glass-alpha: 0.34;
}
/* ---------------------------------------------------------------------------
* Corner radius — applied as data-radius on <html>.
* ------------------------------------------------------------------------- */
[data-radius="sharp"] {
--radius: 6px;
}
[data-radius="soft"] {
--radius: 18px;
}
/* ---------------------------------------------------------------------------
* Base
* ------------------------------------------------------------------------- */
* {
border-color: hsl(var(--border));
}
* {
scrollbar-width: thin;
scrollbar-color: hsl(var(--border)) transparent;
}
::-webkit-scrollbar {
width: 9px;
height: 9px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: hsl(var(--border));
border: 3px solid transparent;
border-radius: 999px;
background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover {
background: hsl(var(--muted-foreground) / 0.55);
border: 3px solid transparent;
background-clip: content-box;
}
html {
min-height: 100%;
}
body {
min-height: 100%;
background: hsl(var(--background));
color: hsl(var(--foreground));
font-feature-settings:
"rlig" 1,
"calt" 1;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
button,
input,
select,
textarea {
font: inherit;
}
::selection {
background: hsl(var(--primary) / 0.22);
}
kbd {
display: inline-flex;
align-items: center;
gap: 2px;
border: 1px solid hsl(var(--border));
border-bottom-width: 2px;
border-radius: 6px;
background: hsl(var(--muted) / 0.8);
padding: 1px 6px;
font-family: var(--font-mono), ui-monospace, monospace;
font-size: 11px;
color: hsl(var(--muted-foreground));
}
@media (prefers-reduced-motion: reduce) {
*,
::before,
::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
scroll-behavior: auto !important;
transition-duration: 0.01ms !important;
}
}
.focus-ring {
@apply outline-none ring-offset-2 ring-offset-background focus-visible:ring-2 focus-visible:ring-ring;
}
.density-compact {
--header-height: 56px;
}
.density-comfortable {
--header-height: 64px;
}
/* ---------------------------------------------------------------------------
* Liquid glass surfaces — iOS-style: translucent fill, saturated backdrop
* blur, and a refraction ring made of four inset specular edges (bright top,
* faint sides and bottom).
* ------------------------------------------------------------------------- */
@layer components {
.glass-panel {
position: relative;
background:
linear-gradient(
180deg,
hsl(0 0% 100% / 0.09),
hsl(0 0% 100% / 0.02) 38%,
transparent 70%
),
hsl(var(--card) / var(--glass-alpha));
-webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate));
backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate));
border: 1px solid hsl(var(--border) / 0.7);
box-shadow:
inset 0 1px 0 0 hsl(0 0% 100% / var(--glass-edge-alpha)),
inset 0 -1px 0 0 hsl(0 0% 100% / calc(var(--glass-edge-alpha) * 0.3)),
inset 1px 0 0 0 hsl(0 0% 100% / calc(var(--glass-edge-alpha) * 0.2)),
inset -1px 0 0 0 hsl(0 0% 100% / calc(var(--glass-edge-alpha) * 0.2)),
0 1px 2px rgb(0 0 0 / 0.06),
0 16px 40px -24px rgb(0 0 0 / 0.3);
}
.dark .glass-panel {
border-color: hsl(0 0% 100% / 0.1);
box-shadow:
inset 0 1px 0 0 hsl(0 0% 100% / var(--glass-edge-alpha)),
inset 0 -1px 0 0 hsl(0 0% 100% / calc(var(--glass-edge-alpha) * 0.3)),
inset 1px 0 0 0 hsl(0 0% 100% / calc(var(--glass-edge-alpha) * 0.2)),
inset -1px 0 0 0 hsl(0 0% 100% / calc(var(--glass-edge-alpha) * 0.2)),
0 1px 2px rgb(0 0 0 / 0.5),
0 20px 48px -28px rgb(0 0 0 / 0.85);
}
/* Chrome surfaces: floating header + sidebar rails. */
.glass-bar {
background:
linear-gradient(
180deg,
hsl(0 0% 100% / 0.08),
hsl(0 0% 100% / 0.02) 45%,
transparent 75%
),
hsl(var(--card) / min(calc(var(--glass-alpha) + 0.12), 0.96));
-webkit-backdrop-filter: blur(calc(var(--glass-blur) + 1px)) saturate(var(--glass-saturate));
backdrop-filter: blur(calc(var(--glass-blur) + 1px)) saturate(var(--glass-saturate));
box-shadow:
inset 0 1px 0 0 hsl(0 0% 100% / var(--glass-edge-alpha)),
inset 0 -1px 0 0 hsl(0 0% 100% / calc(var(--glass-edge-alpha) * 0.25)),
0 12px 32px -20px rgb(0 0 0 / 0.45);
}
.dark .glass-bar {
box-shadow:
inset 0 1px 0 0 hsl(0 0% 100% / var(--glass-edge-alpha)),
inset 0 -1px 0 0 hsl(0 0% 100% / calc(var(--glass-edge-alpha) * 0.25)),
0 12px 36px -18px rgb(0 0 0 / 0.9);
}
/* Floating surfaces: dialogs, popovers, menus. Most opaque. */
.glass-modal {
background:
linear-gradient(180deg, hsl(0 0% 100% / 0.08), transparent 40%),
hsl(var(--card) / min(calc(var(--glass-alpha) + 0.28), 1));
-webkit-backdrop-filter: blur(calc(var(--glass-blur) + 2px)) saturate(var(--glass-saturate));
backdrop-filter: blur(calc(var(--glass-blur) + 2px)) saturate(var(--glass-saturate));
border: 1px solid hsl(var(--border) / 0.75);
box-shadow:
inset 0 1px 0 0 hsl(0 0% 100% / var(--glass-edge-alpha)),
inset 0 -1px 0 0 hsl(0 0% 100% / calc(var(--glass-edge-alpha) * 0.3)),
0 24px 64px -24px rgb(0 0 0 / 0.5);
}
.dark .glass-modal {
border-color: hsl(0 0% 100% / 0.12);
box-shadow:
inset 0 1px 0 0 hsl(0 0% 100% / var(--glass-edge-alpha)),
inset 0 -1px 0 0 hsl(0 0% 100% / calc(var(--glass-edge-alpha) * 0.3)),
0 24px 72px -20px rgb(0 0 0 / 0.95);
}
.text-gradient {
background: linear-gradient(100deg, hsl(var(--foreground)) 35%, hsl(var(--primary)) 140%);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.skeleton {
position: relative;
overflow: hidden;
background: hsl(var(--muted) / 0.7);
}
.skeleton::after {
content: "";
position: absolute;
inset: 0;
transform: translateX(-100%);
background: linear-gradient(90deg, transparent, hsl(var(--foreground) / 0.07), transparent);
animation: shimmer 1.6s infinite;
}
}
/* Legacy shadow helpers, softened to match the glass language. */
.dark .shadow-panel {
box-shadow: 0 1px 0 hsl(var(--border) / 0.7);
}
.dark .shadow-raised {
box-shadow: 0 18px 48px rgba(0, 0, 0, 0.72);
}
/* ---------------------------------------------------------------------------
* Ambient background: aurora blobs + grid + grain.
* Hidden entirely when data-ambiance="off".
* ------------------------------------------------------------------------- */
.aurora {
position: absolute;
border-radius: 9999px;
filter: blur(52px);
opacity: var(--aurora-opacity);
}
.aurora-1 {
top: -22vh;
left: -12vw;
height: 60vh;
width: 46vw;
min-width: 420px;
min-height: 420px;
background: radial-gradient(closest-side, hsl(var(--aurora-a) / 0.7), transparent 70%);
animation: aurora-drift-1 48s ease-in-out infinite alternate;
}
.aurora-2 {
top: 4vh;
right: -16vw;
height: 56vh;
width: 42vw;
min-width: 380px;
min-height: 380px;
background: radial-gradient(closest-side, hsl(var(--aurora-b) / 0.4), transparent 70%);
animation: aurora-drift-2 58s ease-in-out infinite alternate;
}
.aurora-3 {
bottom: -26vh;
left: 24vw;
height: 54vh;
width: 44vw;
min-width: 380px;
min-height: 380px;
background: radial-gradient(closest-side, hsl(var(--aurora-c) / 0.3), transparent 70%);
animation: aurora-drift-3 64s ease-in-out infinite alternate;
}
.ambient-grid {
position: absolute;
inset: 0;
background-image:
linear-gradient(hsl(var(--foreground) / 0.04) 1px, transparent 1px),
linear-gradient(90deg, hsl(var(--foreground) / 0.04) 1px, transparent 1px);
background-size: 56px 56px;
-webkit-mask-image: radial-gradient(ellipse 90% 64% at 50% 0%, black 30%, transparent 75%);
mask-image: radial-gradient(ellipse 90% 64% at 50% 0%, black 30%, transparent 75%);
}
.grain {
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160' viewBox='0 0 160 160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='1'/%3E%3C/svg%3E");
background-size: 160px 160px;
opacity: 0.028;
mix-blend-mode: overlay;
}
.dark .grain {
opacity: 0.06;
}
[data-ambiance="off"] .aurora,
[data-ambiance="off"] .ambient-grid,
[data-ambiance="off"] .grain {
display: none;
}
@keyframes aurora-drift-1 {
from {
transform: translate3d(0, 0, 0) scale(1);
}
to {
transform: translate3d(10vw, 8vh, 0) scale(1.15);
}
}
@keyframes aurora-drift-2 {
from {
transform: translate3d(0, 0, 0) scale(1.1) rotate(0deg);
}
to {
transform: translate3d(-8vw, 12vh, 0) scale(0.95) rotate(20deg);
}
}
@keyframes aurora-drift-3 {
from {
transform: translate3d(0, 0, 0) scale(1);
}
to {
transform: translate3d(-10vw, -8vh, 0) scale(1.2);
}
}
/* ---------------------------------------------------------------------------
* Motion: entrance choreography
* ------------------------------------------------------------------------- */
@keyframes rise {
from {
opacity: 0;
transform: translateY(6px);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes shimmer {
100% {
transform: translateX(100%);
}
}
.anim-rise {
animation: rise 0.16s cubic-bezier(0.22, 0.61, 0.36, 1) both;
}
.stagger > * {
animation: rise 0.16s cubic-bezier(0.22, 0.61, 0.36, 1) both;
}
.stagger > *:nth-child(1) {
animation-delay: 0.02s;
}
.stagger > *:nth-child(2) {
animation-delay: 0.03s;
}
.stagger > *:nth-child(3) {
animation-delay: 0.05s;
}
.stagger > *:nth-child(4) {
animation-delay: 0.07s;
}
.stagger > *:nth-child(5) {
animation-delay: 0.08s;
}
.stagger > *:nth-child(6) {
animation-delay: 0.09s;
}
.stagger > *:nth-child(7) {
animation-delay: 0.1s;
}
.stagger > *:nth-child(8) {
animation-delay: 0.11s;
}
.stagger > *:nth-child(9) {
animation-delay: 0.12s;
}
.stagger > *:nth-child(10) {
animation-delay: 0.13s;
}
.stagger > *:nth-child(n + 11) {
animation-delay: 0.14s;
}