blob: bc0f8fb0e1e41ca4e128d5f17cda246a5a27c0cb [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
@tailwind base;
@tailwind components;
@tailwind utilities;
/* Linear-style design tokens — expose colors and elevations as CSS variables
so both Tailwind and MUI reach for the same values. */
:root {
--lin-bg-base: #ffffff;
--lin-bg-subtle: #fbfbfc;
--lin-bg-muted: #f4f5f8;
--lin-bg-hover: #eeeff2;
--lin-bg-active: #e6e7eb;
--lin-border-subtle: #e6e7eb;
--lin-border-strong: #d0d3d9;
--lin-text-primary: #0d0e10;
--lin-text-secondary: #4b4f57;
--lin-text-muted: #6b7280;
--lin-accent: #5e6ad2;
--lin-accent-hover: #4f5abd;
--lin-accent-muted: rgba(94, 106, 210, 0.12);
--lin-danger: #eb5757;
--lin-success: #4cb782;
--lin-warning: #f2c94c;
--lin-shadow-card: 0 1px 2px 0 rgba(15, 17, 22, 0.04);
--lin-shadow-popover: 0 4px 12px -2px rgba(15, 17, 22, 0.08), 0 0 0 1px rgba(15, 17, 22, 0.06);
--lin-shadow-overlay: 0 8px 32px -8px rgba(15, 17, 22, 0.16), 0 0 0 1px rgba(15, 17, 22, 0.08);
--lin-topbar-height: 56px;
--lin-sidebar-width: 260px;
--lin-content-max: 1360px;
--lin-content-pad-x: 32px;
--lin-content-pad-y: 28px;
--lin-section-gap: 24px;
}
.dark {
--lin-bg-base: #08090a;
--lin-bg-subtle: #101113;
--lin-bg-muted: #181a1f;
--lin-bg-hover: #22262f;
--lin-bg-active: #2a2e37;
--lin-border-subtle: #23252a;
--lin-border-strong: #33363d;
--lin-text-primary: #f7f8f8;
--lin-text-secondary: #b4b8c0;
--lin-text-muted: #8a8f98;
--lin-accent: #7079e0;
--lin-accent-hover: #8d95f2;
--lin-accent-muted: rgba(112, 121, 224, 0.18);
--lin-shadow-card: 0 1px 2px 0 rgba(0, 0, 0, 0.35);
--lin-shadow-popover: 0 4px 12px -2px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.06);
--lin-shadow-overlay: 0 8px 32px -8px rgba(0, 0, 0, 0.55), 0 0 0 1px rgba(255, 255, 255, 0.08);
}
html {
color-scheme: light;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
font-feature-settings:
"cv02" on,
"cv03" on,
"cv04" on,
"cv11" on;
}
html.dark {
color-scheme: dark;
}
body {
background-color: var(--lin-bg-base);
color: var(--lin-text-primary);
font-size: 15px;
line-height: 1.55;
letter-spacing: -0.006em;
}
::selection {
background-color: var(--lin-accent-muted);
color: var(--lin-text-primary);
}
@layer components {
.lin-surface {
background-color: var(--lin-bg-base);
border: 1px solid var(--lin-border-subtle);
border-radius: 8px;
}
.lin-surface-muted {
background-color: var(--lin-bg-subtle);
border: 1px solid var(--lin-border-subtle);
border-radius: 8px;
}
.lin-row-hover {
transition:
background-color 120ms ease,
border-color 120ms ease;
}
.lin-row-hover:hover {
background-color: var(--lin-bg-hover);
}
.lin-eyebrow {
font-size: 11px;
font-weight: 500;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--lin-text-muted);
}
.lin-divider {
border-color: var(--lin-border-subtle);
}
.lin-input {
@apply w-full border bg-transparent px-3 py-2 text-sm text-text-primary transition-colors focus:outline-none dark:text-text-dark-primary;
border-color: var(--lin-border-subtle);
border-radius: 6px;
}
.lin-input:hover {
border-color: var(--lin-border-strong);
}
.lin-input:focus,
.lin-input:focus-visible {
border-color: var(--lin-accent);
box-shadow: 0 0 0 2px rgba(94, 106, 210, 0.2);
}
}
/* Custom scrollbar — thin, neutral, no track */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: rgba(15, 17, 22, 0.14);
border-radius: 8px;
}
::-webkit-scrollbar-thumb:hover {
background: rgba(15, 17, 22, 0.24);
}
.dark ::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.1);
}
.dark ::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.18);
}
.no-scrollbar {
scrollbar-width: none;
-ms-overflow-style: none;
}
.no-scrollbar::-webkit-scrollbar {
display: none;
}
/* MUI overrides — strip the drop-shadows and easing MUI applies by default so
components respect Linear's flatter surface treatment. */
.MuiAppBar-root {
background-color: var(--lin-bg-base) !important;
color: var(--lin-text-primary) !important;
box-shadow: none !important;
border-bottom: 1px solid var(--lin-border-subtle) !important;
transition: none !important;
}
.MuiButton-root {
text-transform: none !important;
letter-spacing: -0.006em !important;
transition:
background-color 120ms ease,
border-color 120ms ease,
color 120ms ease !important;
}
.MuiButton-root:hover {
transform: none !important;
box-shadow: none !important;
}
.MuiButton-root:focus-visible {
outline: none;
box-shadow: 0 0 0 2px rgba(94, 106, 210, 0.35);
}
.MuiIconButton-root {
transition:
background-color 120ms ease,
color 120ms ease !important;
}
.MuiIconButton-root:focus-visible {
outline: none;
box-shadow: 0 0 0 2px rgba(94, 106, 210, 0.35);
}
/* Keyboard hint chip */
kbd {
display: inline-flex;
align-items: center;
justify-content: center;
height: 18px;
min-width: 18px;
padding: 0 5px;
font-family:
ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
font-size: 10px;
font-weight: 500;
line-height: 1;
color: var(--lin-text-muted);
background: var(--lin-bg-muted);
border: 1px solid var(--lin-border-subtle);
border-radius: 4px;
}
/* Focus-visible ring for native elements */
button:focus-visible,
a:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
outline: 2px solid rgba(94, 106, 210, 0.35);
outline-offset: 1px;
border-radius: 4px;
}
/* Subtle fade for route transitions / initial mount */
@keyframes lin-fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.lin-fade-in {
animation: lin-fade-in 200ms ease-out both;
}