ObsiViewer/src/styles.css

620 lines
16 KiB
CSS

@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap');
@import './styles-test.css';
@import './styles/themes.css';
@import './styles/markdown.css';
@import './styles/syntax.css';
@import './styles/toc.css';
@import './styles/tokens.css';
@import './styles/_overlay-scrollbar.css';
@import './styles/codemirror.css';
/* Local-only fallbacks: use installed fonts if available */
@font-face {
font-family: 'gg sans';
font-style: normal;
font-weight: 100 900;
src: local('gg sans'), local('ggsans'), local('GG Sans');
font-display: swap;
}
@font-face {
font-family: 'Whitney';
font-style: normal;
font-weight: 100 900;
src: local('Whitney'), local('Whitney Book'), local('Whitney Medium'), local('Whitney Semibold'), local('Whitney Bold');
font-display: swap;
}
/* Excalidraw CSS variables (thème sombre) */
/* .excalidraw {
--color-primary: #ffffff;
--color-secondary: #333333;
--color-background: #121212;
--color-border: #444444;
--color-text: #ffffff;
--color-ui-element: #2d2d2d;
--color-selected: #007bff;
--color-hover: #333333;
--color-error: #ff4d4f;
--color-success: #52c41a;
} */
/* .excalidraw {
--color-background: #1e1e1e !important;
--color-text: white !important;
--color-ui-element: #2d2d2d !important;
} */
.md-attachment-figure {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.25rem;
}
/* Excalidraw host sizing to ensure canvas renders full size */
excalidraw-editor {
display: block;
width: 100%;
height: 100%;
min-height: 480px;
position: relative; /* anchor absolutely-positioned children if any */
}
/* Scoped minimal layout for Excalidraw internals */
excalidraw-editor .excalidraw {
width: 100%;
height: 100%;
position: relative;
overflow: hidden;
}
excalidraw-editor .excalidraw .excalidraw__canvas-container,
excalidraw-editor .excalidraw .layer-ui__wrapper {
position: absolute;
inset: 0;
}
/* Removed global .excalidraw override to avoid conflicting with Excalidraw internal styles */
.md-attachment-figure img {
margin-bottom: 0;
}
.md-task-list {
list-style: none;
margin: 0 0 1rem 0;
padding: 0;
}
.md-task-item {
list-style: none;
margin-bottom: 0.5rem;
}
.md-task {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.95rem;
}
.md-task-checkbox {
appearance: none;
width: 1.1rem;
height: 1.1rem;
border-radius: 0.35rem;
border: 2px solid var(--task-checkbox-border, #64748b);
background-color: transparent;
position: relative;
}
.md-task-item--done .md-task-checkbox {
border-color: var(--task-checkbox-checked-border, #22c55e);
background-color: var(--task-checkbox-checked-bg, #22c55e);
}
.md-task-item--done .md-task-label-text {
text-decoration: line-through;
color: var(--task-checkbox-done-text, #94a3b8);
}
.md-task-checkbox::after {
content: '';
position: absolute;
top: 0.05rem;
left: 0.25rem;
width: 0.35rem;
height: 0.65rem;
border-right: 2px solid white;
border-bottom: 2px solid white;
transform: rotate(45deg);
opacity: 0;
}
.md-task-item--done .md-task-checkbox::after {
opacity: 1;
}
.md-external-link {
color: var(--external-link, #6366f1);
text-decoration: underline;
text-decoration-thickness: 2px;
text-underline-offset: 3px;
transition: color 0.2s ease, text-decoration-color 0.2s ease;
}
.md-external-link:hover,
.md-external-link:focus-visible {
color: var(--external-link-hover, #4338ca);
text-decoration-color: currentColor;
}
.md-external-link:focus-visible {
outline: 2px solid currentColor;
outline-offset: 2px;
}
.md-footnotes {
border-top: 1px solid color-mix(in srgb, var(--brand) 35%, rgba(148, 163, 184, 0.25));
padding-top: 1.5rem;
}
.md-footnotes header {
font-size: 0.75rem;
letter-spacing: 0.08em;
color: var(--footnotes-heading, #475569);
}
.md-footnotes ol {
counter-reset: footnote-counter;
margin: 0;
padding-left: 1.5rem;
}
.md-footnote-item {
position: relative;
color: var(--footnotes-text, color-mix(in srgb, var(--brand-800) 35%, #475569));
}
.md-footnote-item p {
margin: 0;
}
.md-footnote-ref {
font-size: 0.75rem;
margin-left: 0.15rem;
}
.md-footnote-ref a {
text-decoration: none;
}
.md-footnote-ref a:hover,
.md-footnote-ref a:focus-visible {
text-decoration: underline;
}
.md-wiki-link {
color: var(--wiki-link, #4f46e5);
text-decoration: underline;
text-decoration-thickness: 1px;
text-underline-offset: 3px;
cursor: pointer;
}
.md-wiki-link:hover,
.md-wiki-link:focus-visible {
color: var(--wiki-link-hover, #4338ca);
text-decoration-thickness: 2px;
}
.md-wiki-link.wikilink-orphan {
color: var(--wiki-link-orphan, #94a3b8);
text-decoration-style: dashed;
}
.md-wiki-link.wikilink-orphan:hover,
.md-wiki-link.wikilink-orphan:focus-visible {
color: var(--wiki-link-orphan-hover, #64748b);
}
/* Note preview overlay styles */
.note-preview-overlay {
z-index: 1000;
}
.cdk-overlay-backdrop {
background: rgba(0, 0, 0, 0.32);
}
.cdk-overlay-backdrop.cdk-overlay-backdrop-showing {
opacity: 1;
}
.md-math-inline {
font-family: "Cambria", "Times New Roman", serif;
background-color: rgba(148, 163, 184, 0.2);
padding: 0 0.25rem;
border-radius: 0.25rem;
}
.md-math-block {
font-family: "Cambria", "Times New Roman", serif;
background-color: rgba(148, 163, 184, 0.15);
padding: 1rem;
margin: 1.5rem 0;
border-radius: 0.5rem;
text-align: center;
}
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
html, body {
height: auto;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
&:root {
--external-link: #6366f1;
--external-link-hover: #4338ca;
--task-checkbox-border: #94a3b8;
--task-checkbox-checked-border: #22c55e;
--task-checkbox-checked-bg: #22c55e;
--task-checkbox-done-text: #94a3b8;
--btn-border-color: color-mix(in srgb, var(--border) 65%, transparent);
--btn-border-strong: var(--border);
--btn-hover-background: color-mix(in srgb, var(--bg-muted) 42%, transparent);
--btn-focus-ring: color-mix(in srgb, var(--border) 45%, transparent);
--btn-muted-text: var(--text-muted);
/* Scrollbar colors subtly follow theme brand/accent */
--scrollbar-thumb-color: color-mix(in oklab, var(--brand, var(--scrollbar-thumb, rgba(148, 163, 184, 0.45))) 22%, transparent);
--scrollbar-thumb-color-active: color-mix(in oklab, var(--brand, var(--scrollbar-thumb, rgba(148, 163, 184, 0.45))) 36%, transparent);
/* Theme accent + CodeMirror highlight tokens */
--color-accent: var(--primary, #3b82f6);
--cm-hl-bg: color-mix(in srgb, var(--color-accent) 28%, transparent);
--cm-hl-br: 3px;
/* Button design tokens */
--btn-radius: 0.75rem;
--btn-padding-y: .5rem;
--btn-padding-x: .75rem;
--btn-font: 500;
--btn-shadow: 0 2px 10px rgba(0,0,0,.06);
--btn-ring: 2px;
--btn-speed: 180ms;
--btn-bg: var(--color-accent);
--btn-fg: white;
--btn-bg-hover: color-mix(in srgb, var(--color-accent) 85%, white 15%);
--btn-bg-active: color-mix(in srgb, var(--color-accent) 75%, black 25%);
--btn-outline: color-mix(in srgb, var(--color-accent) 30%, transparent);
}
[data-theme="dark"],
.dark {
--external-link: #22d3ee;
--external-link-hover: #0ea5e9;
--task-checkbox-border: #64748b;
--task-checkbox-checked-border: #22c55e;
--task-checkbox-checked-bg: #15803d;
--task-checkbox-done-text: #64748b;
--btn-border-color: color-mix(in srgb, var(--border) 70%, transparent);
--btn-border-strong: color-mix(in srgb, var(--border) 88%, transparent);
--btn-hover-background: color-mix(in srgb, var(--bg-muted) 36%, transparent);
--btn-focus-ring: color-mix(in srgb, var(--border) 55%, transparent);
--btn-muted-text: var(--text-muted);
/* Dark-mode: slightly stronger mix for visibility on darker bg */
--scrollbar-thumb-color: color-mix(in oklab, var(--brand, var(--scrollbar-thumb, rgba(148, 163, 184, 0.35))) 28%, transparent);
--scrollbar-thumb-color-active: color-mix(in oklab, var(--brand, var(--scrollbar-thumb, rgba(148, 163, 184, 0.35))) 42%, transparent);
/* Dark theme adjustment */
--cm-hl-bg: color-mix(in srgb, var(--color-accent) 22%, transparent);
--btn-bg-hover: color-mix(in srgb, var(--color-accent) 80%, white 20%);
--btn-bg-active: color-mix(in srgb, var(--color-accent) 70%, black 30%);
}
@media (min-width: 1024px) {
body {
height: 100vh;
overflow: hidden;
}
}
}
/* Global native scrollbar fallback (for any container not using appScrollableOverlay) */
html, body {
scrollbar-width: thin;
scrollbar-color: var(--scrollbar-thumb-color) transparent;
}
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
background: var(--scrollbar-thumb-color);
border-radius: 9999px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--scrollbar-thumb-color-active);
}
@layer components {
/* CodeMirror markdown highlight class - theme driven */
.cm-md-highlight {
background: var(--cm-hl-bg);
border-radius: var(--cm-hl-br, 3px);
transition: background var(--btn-speed) ease;
}
/* Theme specific accent overrides */
[data-theme="nimbus"] { --color-accent: #7c3aed; }
[data-theme="emerald"] { --color-accent: #10b981; }
/* Unified Button Utilities */
.btn {
@apply inline-flex items-center justify-center gap-2 select-none;
border-radius: var(--btn-radius);
padding: var(--btn-padding-y) var(--btn-padding-x);
font-weight: var(--btn-font);
box-shadow: var(--btn-shadow);
transition: transform var(--btn-speed) ease, background var(--btn-speed) ease, color var(--btn-speed) ease, border-color var(--btn-speed) ease, box-shadow var(--btn-speed) ease;
outline: none;
}
.btn:focus-visible { box-shadow: 0 0 0 var(--btn-ring) var(--btn-outline); }
.btn:active { transform: translateY(1px) scale(0.99); }
.btn-solid { background: var(--btn-bg); color: var(--btn-fg); }
.btn-solid:hover { background: var(--btn-bg-hover); }
.btn-solid:active { background: var(--btn-bg-active); }
.btn-outline { background: transparent; color: var(--btn-bg); border: 1px solid var(--btn-outline); }
.btn-outline:hover { background: color-mix(in srgb, var(--btn-bg) 8%, transparent); }
.btn-ghost { background: transparent; color: var(--btn-bg); }
.btn-ghost:hover { background: color-mix(in srgb, var(--btn-bg) 6%, transparent); }
.btn-sm { @apply text-sm; padding: .375rem .6rem; }
.btn-md { @apply text-base; }
.btn-lg { @apply text-lg; padding: .65rem 1rem; }
/* Adaptive scrollbar states */
.adaptive-scrollbar {
position: relative;
scrollbar-width: thin;
scrollbar-gutter: stable both-edges;
--scrollbar-thumb-transition: 240ms ease;
}
.adaptive-scrollbar[data-scroll-state="idle"] {
scrollbar-width: none;
scrollbar-color: transparent transparent;
}
.adaptive-scrollbar[data-scroll-state="mini"] {
scrollbar-color: color-mix(in srgb, var(--scrollbar-thumb-color) 80%, transparent) transparent;
}
.adaptive-scrollbar[data-scroll-state="active"] {
scrollbar-color: color-mix(in srgb, var(--scrollbar-thumb-color-active) 100%, transparent) transparent;
}
.adaptive-scrollbar::-webkit-scrollbar {
width: 10px;
height: 10px;
background-color: transparent;
}
.adaptive-scrollbar::-webkit-scrollbar-thumb {
border-radius: 9999px;
background-color: transparent;
box-shadow: inset 0 0 0 1px transparent;
transition: background-color var(--scrollbar-thumb-transition), box-shadow var(--scrollbar-thumb-transition), opacity var(--scrollbar-thumb-transition);
opacity: 0;
}
.adaptive-scrollbar[data-scroll-state="mini"]::-webkit-scrollbar-thumb {
background-color: var(--scrollbar-thumb-color);
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.08);
opacity: 0.8;
}
.adaptive-scrollbar[data-scroll-state="active"]::-webkit-scrollbar-thumb {
background-color: var(--scrollbar-thumb-color-active);
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.18);
opacity: 1;
}
.adaptive-scrollbar::-webkit-scrollbar-track {
background: transparent;
}
.calendar-compact {
/* @apply flex min-h-[180px] max-h-[200px] flex-col; */
display: flex;
flex-direction: column;
min-height: 180px;
max-height: 200px;
border: 1px solid #1C2740;
border-radius: 0.25rem;
background-color: #1C2740;
}
.calendar-compact .cal-month-view {
flex: 1 1 auto;
/* border: 1px solid #1C2740; */
/* border-radius: 0.25rem; */
/* background-color: #1C2740; */
}
.calendar-compact .cal-header {
/* @apply px-2 py-1; */
padding: 0.5rem;
}
.calendar-compact .cal-header .cal-header-title {
/* @apply text-sm; */
font-size: 0.875rem;
}
.calendar-compact .cal-cell {
min-height: 36px;
padding: 0.35rem;
border: 1px solid #1C2740;
border-radius: 0.25rem;
}
.calendar-compact .cal-day-number {
/* @apply text-xs; */
font-size: 0.75rem;
}
.calendar-compact .cal-event {
/* @apply h-0.5 rounded-full mt-[2px]; */
height: 0.5rem;
border-radius: 0.5rem;
margin-top: 2px;
}
.cal-event-created {
background-color: #22c55e;
}
.cal-event-updated {
background-color: #f97316;
}
.calendar-compact .cal-open-day-events {
/* @apply hidden; */
display: none;
}
/* Standardized Button Styles - Based on "Collapse all" design */
.btn-standard,
.btn-standard-sm,
.btn-standard-xs,
.btn-standard-icon {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
border: 1px solid var(--btn-border-color);
background-color: transparent;
color: var(--text-main);
font-weight: 500;
line-height: 1.2;
text-decoration: none;
cursor: pointer;
transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease, box-shadow 0.2s ease;
outline: none;
}
.btn-standard,
.btn-standard-primary,
.btn-standard-danger {
padding: 0.75rem 1.5rem;
border-radius: 0.75rem;
}
.btn-standard-sm {
padding: 0.5rem 1rem;
border-radius: 0.75rem;
font-size: 0.85rem;
}
.btn-standard-xs {
padding: 0.375rem 0.875rem;
border-radius: 0.625rem;
font-size: 0.75rem;
}
.btn-standard-icon {
padding: 0.5rem;
border-radius: 0.625rem;
color: var(--btn-muted-text);
gap: 0.25rem;
min-width: auto;
}
.btn-standard:hover,
.btn-standard-sm:hover,
.btn-standard-xs:hover,
.btn-standard-icon:hover {
background-color: var(--btn-hover-background);
border-color: var(--btn-border-strong);
color: var(--text-main);
}
.btn-standard:focus-visible,
.btn-standard-sm:focus-visible,
.btn-standard-xs:focus-visible,
.btn-standard-icon:focus-visible {
box-shadow: 0 0 0 2px var(--btn-focus-ring);
}
.btn-standard-primary {
border: 1px solid color-mix(in srgb, var(--brand) 60%, transparent);
background-color: color-mix(in srgb, var(--brand) 15%, transparent);
color: color-mix(in srgb, var(--brand) 90%, #ffffff);
}
.btn-standard-primary:hover {
background-color: color-mix(in srgb, var(--brand) 25%, transparent);
border-color: var(--brand);
}
.btn-standard-primary:focus-visible {
box-shadow: 0 0 0 2px color-mix(in srgb, var(--brand) 45%, transparent);
}
.btn-standard-danger {
border: 1px solid color-mix(in srgb, var(--danger) 60%, transparent);
background-color: color-mix(in srgb, var(--danger) 12%, transparent);
color: color-mix(in srgb, var(--danger) 92%, #ffffff);
}
.btn-standard-danger:hover {
background-color: color-mix(in srgb, var(--danger) 22%, transparent);
border-color: var(--danger);
}
.btn-standard-danger:focus-visible {
box-shadow: 0 0 0 2px color-mix(in srgb, var(--danger) 38%, transparent);
}
.btn-standard-icon:hover {
color: var(--text-main);
}
}
@layer utilities {
/* Mobile animations */
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.animate-fadeIn {
animation: fadeIn 0.3s ease-out forwards;
}
}