mirror of
https://github.com/kulysocc/obsidian-bumblebee.git
synced 2026-07-22 04:40:27 +00:00
Two highlights still painted an accent/amber fill instead of the neutral mono Surface used by active nav items (ADR-0007): - Heading/block navigation flash (.is-flashing) used --text-highlight-bg (the amber ==mark== colour); move it to --bb-surface-selected and drop the `lighten` blend so it matches a selected nav row. - Outline+ fills its active item with --interactive-accent; keep the accent text but swap the fill for --bb-surface-selected. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1559 lines
No EOL
55 KiB
CSS
1559 lines
No EOL
55 KiB
CSS
/* @settings
|
||
|
||
name: Bumblebee theme settings
|
||
id: bumblebee
|
||
settings:
|
||
-
|
||
# Headers underline
|
||
|
||
id: headers-underline
|
||
title: Headers underline
|
||
type: heading
|
||
level: 1
|
||
collapsed: true
|
||
-
|
||
id: h1-underline
|
||
title: H1 header underline
|
||
type: class-toggle
|
||
-
|
||
id: h2-underline
|
||
title: H2 header underline
|
||
type: class-toggle
|
||
|
||
-
|
||
# Headers Settings
|
||
|
||
id: headers
|
||
title: Headers colors
|
||
type: heading
|
||
level: 1
|
||
collapsed: true
|
||
-
|
||
# All Headers
|
||
|
||
id: all-headers
|
||
title: All headers
|
||
type: heading
|
||
level: 3
|
||
collapsed: true
|
||
-
|
||
id: headers-one-color
|
||
title: All headers are the same color
|
||
type: class-toggle
|
||
default: true
|
||
-
|
||
id: h-color-theme
|
||
title: Header color
|
||
type: variable-themed-color
|
||
opacity: false
|
||
format: hex
|
||
default-light: '#000000'
|
||
default-dark: '#FFFFFF'
|
||
|
||
-
|
||
# Particular Headers
|
||
|
||
id: particular-headers
|
||
title: Particular headers
|
||
description: These settings won't work if `All headers are the same color` is ON
|
||
type: heading
|
||
level: 3
|
||
collapsed: true
|
||
-
|
||
id: h1-color-theme
|
||
title: H1 color
|
||
type: variable-themed-color
|
||
opacity: false
|
||
format: hex
|
||
default-light: '#000000'
|
||
default-dark: '#FFFFFF'
|
||
-
|
||
id: h2-color-theme
|
||
title: H2 color
|
||
type: variable-themed-color
|
||
opacity: false
|
||
format: hex
|
||
default-light: '#000000'
|
||
default-dark: '#FFFFFF'
|
||
-
|
||
id: h3-color-theme
|
||
title: H3 color
|
||
type: variable-themed-color
|
||
opacity: false
|
||
format: hex
|
||
default-light: '#000000'
|
||
default-dark: '#FFFFFF'
|
||
-
|
||
id: h4-color-theme
|
||
title: H4 color
|
||
type: variable-themed-color
|
||
opacity: false
|
||
format: hex
|
||
default-light: '#000000'
|
||
default-dark: '#FFFFFF'
|
||
-
|
||
id: h5-color-theme
|
||
title: H5 color
|
||
type: variable-themed-color
|
||
opacity: false
|
||
format: hex
|
||
default-light: '#000000'
|
||
default-dark: '#FFFFFF'
|
||
-
|
||
id: h6-color-theme
|
||
title: H6 color
|
||
type: variable-themed-color
|
||
opacity: false
|
||
format: hex
|
||
default-light: '#000000'
|
||
default-dark: '#FFFFFF'
|
||
|
||
-
|
||
# Kanban Settings
|
||
|
||
id: kanban
|
||
title: Kanban
|
||
type: heading
|
||
level: 1
|
||
collapsed: true
|
||
-
|
||
id: kanban-variant
|
||
title: Kanban variant
|
||
description: Variations of Kanban styles
|
||
type: class-select
|
||
allowEmpty: false
|
||
default: kanban-full
|
||
options:
|
||
-
|
||
label: Full style
|
||
value: kanban-full
|
||
-
|
||
label: Minimal style
|
||
value: kanban-on
|
||
-
|
||
label: Disable styles
|
||
value: kanban-off
|
||
-
|
||
id: kanban-same-height-cards
|
||
title: Minimal height for cards
|
||
description: All cards will have the same initial height
|
||
type: class-toggle
|
||
default: true
|
||
-
|
||
id: kanban-full-height-column
|
||
title: Full height lists
|
||
type: class-toggle
|
||
default: true
|
||
*/
|
||
|
||
body {
|
||
/* Animations */
|
||
--anim-duration-none: 0;
|
||
--anim-duration-superfast: 70ms;
|
||
--anim-duration-fast: 140ms;
|
||
--anim-duration-moderate: 300ms;
|
||
--anim-duration-slow: 560ms;
|
||
--anim-motion-smooth: cubic-bezier(0.45, 0.05, 0.55, 0.95);
|
||
--anim-motion-delay: cubic-bezier(0.65, 0.05, 0.36, 1);
|
||
--anim-motion-jumpy: cubic-bezier(0.68, -0.55, 0.27, 1.55);
|
||
--anim-motion-swing: cubic-bezier(0, 0.55, 0.45, 1);
|
||
/* Blockquotes */
|
||
--blockquote-border-thickness: 2px;
|
||
--blockquote-border-color: var(--interactive-accent);
|
||
--blockquote-font-style: normal;
|
||
--blockquote-color: inherit;
|
||
--blockquote-background-color: transparent;
|
||
/* Bold — overridden per mode below */
|
||
--bold-weight: var(--font-semibold);
|
||
--bold-color: inherit;
|
||
/* Borders */
|
||
--border-width: 1px;
|
||
/* Buttons */
|
||
--button-radius: var(--bb-radius-pill);
|
||
/* Callouts — tinted title row over outlined transparent body (see ADR-0005) */
|
||
--callout-border-width: 1px;
|
||
--callout-border-opacity: 0.40;
|
||
--callout-padding: 0;
|
||
--callout-radius: var(--bb-radius-soft);
|
||
--callout-blend-mode: normal;
|
||
--callout-title-color: inherit;
|
||
--callout-title-padding: var(--size-4-2) var(--size-4-3);
|
||
--callout-title-size: inherit;
|
||
--callout-content-padding: var(--size-4-3);
|
||
--callout-content-background: transparent;
|
||
--callout-bug: var(--color-red-rgb);
|
||
--callout-default: var(--color-blue-rgb);
|
||
--callout-error: var(--color-red-rgb);
|
||
--callout-example: var(--color-purple-rgb);
|
||
--callout-fail: var(--color-red-rgb);
|
||
--callout-important: var(--color-cyan-rgb);
|
||
--callout-info: var(--color-blue-rgb);
|
||
--callout-question: var(--color-yellow-rgb);
|
||
--callout-success: var(--color-green-rgb);
|
||
--callout-summary: var(--color-cyan-rgb);
|
||
--callout-tip: var(--color-cyan-rgb);
|
||
--callout-todo: var(--color-blue-rgb);
|
||
--callout-warning: var(--color-orange-rgb);
|
||
--callout-quote: 158, 158, 158;
|
||
/* Canvas */
|
||
--canvas-background: var(--background-primary);
|
||
--canvas-card-label-color: var(--text-faint);
|
||
--canvas-color-1: var(--color-red-rgb);
|
||
--canvas-color-2: var(--color-orange-rgb);
|
||
--canvas-color-3: var(--color-yellow-rgb);
|
||
--canvas-color-4: var(--color-green-rgb);
|
||
--canvas-color-5: var(--color-cyan-rgb);
|
||
--canvas-color-6: var(--color-purple-rgb);
|
||
--canvas-dot-pattern: var(--color-base-30);
|
||
/* Checkboxes */
|
||
--checkbox-radius: var(--radius-s);
|
||
--checkbox-size: var(--font-text-size);
|
||
--checkbox-marker-color: var(--background-primary);
|
||
--checkbox-color: var(--interactive-accent);
|
||
--checkbox-color-hover: var(--interactive-accent-hover);
|
||
--checkbox-border-color: var(--text-faint);
|
||
--checkbox-border-color-hover: var(--text-muted);
|
||
--checklist-done-decoration: line-through;
|
||
--checklist-done-color: var(--text-muted);
|
||
/* Code — tokens map to palette colors defined per mode */
|
||
--code-white-space: pre-wrap;
|
||
--code-size: var(--font-smaller);
|
||
--code-background: var(--background-primary-alt);
|
||
--code-normal: var(--text-muted);
|
||
--code-comment: var(--text-faint);
|
||
--code-function: var(--color-orange);
|
||
--code-important: var(--color-orange);
|
||
--code-keyword: var(--color-red);
|
||
--code-property: var(--color-blue);
|
||
--code-punctuation: var(--text-muted);
|
||
--code-string: var(--color-green);
|
||
--code-tag: var(--color-red);
|
||
--code-value: var(--color-purple);
|
||
/* Collapse icons */
|
||
--collapse-icon-color: var(--text-faint);
|
||
--collapse-icon-color-collapsed: var(--text-accent);
|
||
/* Cursor — pointer on interactive chrome for IDE-feel; see ADR 0006 */
|
||
--cursor: pointer;
|
||
--cursor-link: pointer;
|
||
/* Dialogs */
|
||
--dialog-width: 560px;
|
||
--dialog-max-width: 80vw;
|
||
--dialog-max-height: 85vh;
|
||
/* Dividers */
|
||
--divider-color: var(--background-modifier-border);
|
||
--divider-color-hover: var(--interactive-accent);
|
||
--divider-width: 1px;
|
||
--divider-width-hover: 3px;
|
||
--divider-vertical-height: calc(100% - var(--header-height));
|
||
/* Dragging */
|
||
--drag-ghost-background: rgba(0, 0, 0, 0.85);
|
||
--drag-ghost-text-color: #fff;
|
||
/* Embeds */
|
||
--embed-max-height: 4000px;
|
||
--embed-canvas-max-height: 400px;
|
||
--embed-background: inherit;
|
||
--embed-border-left: 2px solid var(--interactive-accent);
|
||
--embed-border-right: none;
|
||
--embed-border-top: none;
|
||
--embed-border-bottom: none;
|
||
--embed-padding: 0 0 0 var(--size-4-6);
|
||
--embed-font-style: inherit;
|
||
--embed-block-shadow-hover: 0 0 0 1px var(--background-modifier-border),
|
||
inset 0 0 0 1px var(--background-modifier-border);
|
||
/* File layout */
|
||
--file-line-width: 700px;
|
||
--file-folding-offset: 24px;
|
||
--file-margins: var(--size-4-8);
|
||
--file-header-font-size: var(--font-ui-small);
|
||
--file-header-font-weight: 400;
|
||
--file-header-border: var(--border-width) solid transparent;
|
||
--file-header-justify: center;
|
||
/* Relative font sizes */
|
||
--font-smallest: 0.8em;
|
||
--font-smaller: 0.875em;
|
||
--font-small: 0.933em;
|
||
/* UI font sizes */
|
||
--font-ui-smaller: 12px;
|
||
--font-ui-small: 13px;
|
||
--font-ui-medium: 15px;
|
||
--font-ui-large: 20px;
|
||
/* Font weights */
|
||
--font-thin: 100;
|
||
--font-extralight: 200;
|
||
--font-light: 300;
|
||
--font-normal: 400;
|
||
--font-medium: 500;
|
||
--font-semibold: 600;
|
||
--font-bold: 700;
|
||
--font-extrabold: 800;
|
||
--font-black: 900;
|
||
/* Footnotes */
|
||
--footnote-size: var(--font-smaller);
|
||
/* Graphs */
|
||
--graph-controls-width: 240px;
|
||
--graph-text: var(--text-normal);
|
||
--graph-line: var(--color-base-35, var(--background-modifier-border-focus));
|
||
--graph-node: var(--text-muted);
|
||
--graph-node-unresolved: var(--text-faint);
|
||
--graph-node-focused: var(--text-accent);
|
||
--graph-node-tag: var(--color-green);
|
||
--graph-node-attachment: var(--color-yellow);
|
||
/* Headings */
|
||
--heading-formatting: var(--text-faint);
|
||
--h1-color: var(--h1-color-theme);
|
||
--h2-color: var(--h2-color-theme);
|
||
--h3-color: var(--h3-color-theme);
|
||
--h4-color: var(--h4-color-theme);
|
||
--h5-color: var(--h5-color-theme);
|
||
--h6-color: var(--h6-color-theme);
|
||
--h1-font: inherit;
|
||
--h2-font: inherit;
|
||
--h3-font: inherit;
|
||
--h4-font: inherit;
|
||
--h5-font: inherit;
|
||
--h6-font: inherit;
|
||
--h1-line-height: 1.2;
|
||
--h2-line-height: 1.2;
|
||
--h3-line-height: 1.3;
|
||
--h4-line-height: 1.4;
|
||
--h5-line-height: var(--line-height-normal);
|
||
--h6-line-height: var(--line-height-normal);
|
||
--h1-size: 2em;
|
||
--h2-size: 1.6em;
|
||
--h3-size: 1.37em;
|
||
--h4-size: 1.25em;
|
||
--h5-size: 1.12em;
|
||
--h6-size: 1.12em;
|
||
--h1-style: normal;
|
||
--h2-style: normal;
|
||
--h3-style: normal;
|
||
--h4-style: normal;
|
||
--h5-style: normal;
|
||
--h6-style: normal;
|
||
--h1-variant: normal;
|
||
--h2-variant: normal;
|
||
--h3-variant: normal;
|
||
--h4-variant: normal;
|
||
--h5-variant: normal;
|
||
--h6-variant: normal;
|
||
--h1-weight: 700;
|
||
--h2-weight: 600;
|
||
--h3-weight: 600;
|
||
--h4-weight: 600;
|
||
--h5-weight: 600;
|
||
--h6-weight: 600;
|
||
/* View header */
|
||
--header-height: 40px;
|
||
/* Horizontal rules */
|
||
--hr-color: var(--background-modifier-border);
|
||
--hr-thickness: 2px;
|
||
/* Icons */
|
||
--icon-size: var(--icon-m);
|
||
--icon-stroke: var(--icon-m-stroke-width);
|
||
--icon-xs: 14px;
|
||
--icon-s: 16px;
|
||
--icon-m: 18px;
|
||
--icon-l: 18px;
|
||
--icon-xl: 32px;
|
||
--icon-xs-stroke-width: 2px;
|
||
--icon-s-stroke-width: 2px;
|
||
--icon-m-stroke-width: 1.75px;
|
||
--icon-l-stroke-width: 1.75px;
|
||
--icon-xl-stroke-width: 1.25px;
|
||
--icon-color: var(--text-muted);
|
||
--icon-color-hover: var(--text-muted);
|
||
--icon-color-active: var(--text-accent);
|
||
--icon-color-focused: var(--text-normal);
|
||
--icon-opacity: 0.85;
|
||
--icon-opacity-hover: 1;
|
||
--icon-opacity-active: 1;
|
||
--clickable-icon-radius: var(--bb-radius-chrome);
|
||
/* Indentation guide */
|
||
--indentation-guide-width: 1px;
|
||
--indentation-guide-color: rgba(var(--mono-rgb-100), 0.12);
|
||
--indentation-guide-color-active: rgba(var(--mono-rgb-100), 0.3);
|
||
/* Inline title */
|
||
--inline-title-color: var(--h1-color);
|
||
--inline-title-font: var(--h1-font);
|
||
--inline-title-line-height: var(--h1-line-height);
|
||
--inline-title-size: var(--h1-size);
|
||
--inline-title-style: var(--h1-style);
|
||
--inline-title-variant: var(--h1-variant);
|
||
--inline-title-weight: var(--h1-weight);
|
||
--inline-title-margin-bottom: 0.5em;
|
||
/* Inputs */
|
||
--input-height: 30px;
|
||
--input-radius: var(--bb-radius-chrome);
|
||
--input-font-weight: var(--font-normal);
|
||
--input-border-width: 1px;
|
||
/* Italic */
|
||
--italic-color: inherit;
|
||
--italic-weight: inherit;
|
||
/* Z-index */
|
||
--layer-cover: 5;
|
||
--layer-sidedock: 10;
|
||
--layer-status-bar: 15;
|
||
--layer-popover: 30;
|
||
--layer-slides: 45;
|
||
--layer-modal: 50;
|
||
--layer-notice: 60;
|
||
--layer-menu: 65;
|
||
--layer-tooltip: 70;
|
||
--layer-dragged-item: 80;
|
||
/* Line heights */
|
||
--line-height-normal: 1.5;
|
||
--line-height-tight: 1.3;
|
||
/* Links */
|
||
--link-color: var(--text-accent);
|
||
--link-color-hover: var(--text-accent-hover);
|
||
--link-decoration: none;
|
||
--link-decoration-hover: underline;
|
||
--link-decoration-thickness: auto;
|
||
--link-external-color: var(--text-accent);
|
||
--link-external-color-hover: var(--text-accent-hover);
|
||
--link-external-decoration: none;
|
||
--link-external-decoration-hover: underline;
|
||
--link-external-filter: none;
|
||
--link-unresolved-color: var(--text-accent);
|
||
--link-unresolved-opacity: 0.7;
|
||
--link-unresolved-filter: none;
|
||
--link-unresolved-decoration-style: solid;
|
||
--link-unresolved-decoration-color: hsla(var(--interactive-accent-hsl), 0.3);
|
||
/* Lists */
|
||
--list-indent: 2em;
|
||
--list-spacing: 0.075em;
|
||
--list-marker-color: var(--text-accent);
|
||
--list-marker-color-hover: var(--text-muted);
|
||
--list-marker-color-collapsed: var(--text-accent);
|
||
--list-bullet-border: none;
|
||
--list-bullet-radius: 50%;
|
||
--list-bullet-size: 5px;
|
||
--list-bullet-transform: none;
|
||
--list-numbered-style: decimal;
|
||
/* File navigator */
|
||
--nav-item-size: var(--font-ui-smaller);
|
||
--nav-item-radius: var(--bb-radius-chrome);
|
||
--nav-item-color: var(--text-muted);
|
||
--nav-item-color-hover: var(--text-normal);
|
||
--nav-item-color-active: var(--text-normal);
|
||
--nav-item-color-selected: var(--text-accent);
|
||
--nav-item-color-highlighted: var(--text-accent-hover);
|
||
--nav-item-background-hover: var(--background-modifier-hover);
|
||
--nav-item-background-active: var(--bb-surface-active);
|
||
--nav-item-background-selected: var(--bb-surface-selected);
|
||
--nav-item-padding: var(--size-2-1) var(--size-4-2) var(--size-2-1) var(--size-4-6);
|
||
--nav-item-parent-padding: var(--nav-item-padding);
|
||
--nav-item-children-padding-left: var(--size-2-2);
|
||
--nav-item-children-margin-left: var(--size-4-3);
|
||
--nav-item-weight: inherit;
|
||
--nav-item-weight-hover: inherit;
|
||
--nav-item-weight-active: inherit;
|
||
--nav-item-white-space: nowrap;
|
||
--nav-indentation-guide-width: var(--indentation-guide-width);
|
||
--nav-indentation-guide-color: var(--indentation-guide-color);
|
||
--nav-collapse-icon-color: var(--collapse-icon-color);
|
||
--nav-collapse-icon-color-collapsed: var(--text-faint);
|
||
/* Modals */
|
||
--modal-background: var(--background-primary);
|
||
--modal-width: 90vw;
|
||
--modal-height: 85vh;
|
||
--modal-max-width: 1100px;
|
||
--modal-max-height: 1000px;
|
||
--modal-max-width-narrow: 800px;
|
||
--modal-border-width: var(--border-width);
|
||
--modal-border-color: var(--color-base-30, var(--background-modifier-border-focus));
|
||
--modal-radius: var(--bb-radius-modal);
|
||
--modal-community-sidebar-width: 280px;
|
||
--bb-modal-backdrop-blur: 2px;
|
||
--bb-modal-backdrop-dim: 0.42;
|
||
/* PDF view */
|
||
--pdf-background: var(--background-primary);
|
||
--pdf-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05), 0 2px 8px rgba(0, 0, 0, 0.1);
|
||
--pdf-spread-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05);
|
||
--pdf-sidebar-background: var(--background-primary);
|
||
--pdf-thumbnail-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15), 0 2px 8px rgba(0, 0, 0, 0.2);
|
||
/* Popovers */
|
||
--popover-width: 450px;
|
||
--popover-height: 400px;
|
||
--popover-max-height: 70vh;
|
||
--popover-pdf-width: 600px;
|
||
--popover-pdf-height: 800px;
|
||
--popover-font-size: var(--font-text-size);
|
||
/* Prompts */
|
||
--prompt-width: 700px;
|
||
--prompt-max-width: 80vw;
|
||
--prompt-max-height: 70vh;
|
||
--prompt-border-width: var(--border-width);
|
||
--prompt-border-color: var(--color-base-40, var(--background-modifier-border-focus));
|
||
/* Radiuses */
|
||
--radius-s: 4px;
|
||
--radius-m: 8px;
|
||
--radius-l: 12px;
|
||
--radius-xl: 16px;
|
||
/* Radius roles — "Chrome vs. Content" (ADR-0008).
|
||
The rule: does the element dock to a window edge, or float above it?
|
||
· Docked chrome (tabs, nav rows, inputs, status bar) → sharp 0px.
|
||
· Floating content (callouts, code, embeds, menus) → soft.
|
||
· Overlays (modals) keep the strongest rounding.
|
||
· Single-line controls (tags, buttons, toggles) → full pill.
|
||
New elements pick a role, never a raw px value — that keeps the set
|
||
coherent as it grows. */
|
||
--bb-radius-chrome: 0;
|
||
--bb-radius-soft: var(--radius-l);
|
||
--bb-radius-modal: var(--radius-xl);
|
||
--bb-radius-pill: 999px;
|
||
/* Ribbon */
|
||
--ribbon-background: var(--background-secondary);
|
||
--ribbon-background-collapsed: var(--background-primary);
|
||
--ribbon-width: 44px;
|
||
--ribbon-padding: var(--size-4-2) var(--size-4-1) var(--size-4-3);
|
||
/* Scrollbars */
|
||
--scrollbar-active-thumb-bg: rgba(var(--mono-rgb-100), 0.2);
|
||
--scrollbar-bg: rgba(var(--mono-rgb-100), 0.05);
|
||
--scrollbar-thumb-bg: rgba(var(--mono-rgb-100), 0.1);
|
||
/* Search */
|
||
--search-clear-button-color: var(--text-muted);
|
||
--search-clear-button-size: 13px;
|
||
--search-icon-color: var(--text-muted);
|
||
--search-icon-size: 18px;
|
||
--search-result-background: var(--background-primary);
|
||
/* Layout sizing */
|
||
--size-2-1: 2px;
|
||
--size-2-2: 4px;
|
||
--size-2-3: 6px;
|
||
--size-4-1: 4px;
|
||
--size-4-2: 8px;
|
||
--size-4-3: 12px;
|
||
--size-4-4: 16px;
|
||
--size-4-5: 20px;
|
||
--size-4-6: 24px;
|
||
--size-4-8: 32px;
|
||
--size-4-9: 36px;
|
||
--size-4-12: 48px;
|
||
--size-4-16: 64px;
|
||
--size-4-18: 72px;
|
||
/* Sidebar */
|
||
--sidebar-markdown-font-size: calc(var(--font-text-size) * 0.9);
|
||
--sidebar-tab-text-display: none;
|
||
/* Sliders */
|
||
--slider-thumb-border-width: 1px;
|
||
--slider-thumb-border-color: var(--background-modifier-border-hover);
|
||
--slider-thumb-height: 18px;
|
||
--slider-thumb-width: 18px;
|
||
--slider-thumb-y: -6px;
|
||
--slider-thumb-radius: 50%;
|
||
--slider-s-thumb-size: 15px;
|
||
--slider-s-thumb-position: -5px;
|
||
--slider-track-background: var(--background-modifier-border);
|
||
--slider-track-height: 3px;
|
||
/* Status bar */
|
||
--status-bar-background: var(--background-secondary);
|
||
--status-bar-border-color: var(--divider-color);
|
||
--status-bar-border-width: 1px 0 0 1px;
|
||
--status-bar-font-size: var(--font-ui-smaller);
|
||
--status-bar-text-color: var(--text-muted);
|
||
--status-bar-position: fixed;
|
||
--status-bar-radius: var(--bb-radius-chrome);
|
||
--status-bar-scroll-padding: calc(var(--status-bar-font-size) + 18px);
|
||
/* Swatch */
|
||
--swatch-radius: 14px;
|
||
--swatch-height: 24px;
|
||
--swatch-width: 24px;
|
||
--swatch-shadow: inset 0 0 0 1px rgba(var(--mono-rgb-100), 0.15);
|
||
/* Tabs */
|
||
--tab-background-active: var(--background-primary);
|
||
--tab-text-color: var(--text-faint);
|
||
--tab-text-color-active: var(--text-muted);
|
||
--tab-text-color-focused: var(--text-muted);
|
||
--tab-text-color-focused-active: var(--text-muted);
|
||
--tab-text-color-focused-highlighted: var(--text-accent);
|
||
--tab-text-color-focused-active-current: var(--text-normal);
|
||
--tab-font-size: var(--font-ui-small);
|
||
--tab-font-weight: inherit;
|
||
--tab-container-background: var(--background-secondary);
|
||
--tab-divider-color: var(--background-modifier-border-hover);
|
||
--tab-outline-color: var(--divider-color);
|
||
--tab-outline-width: 1px;
|
||
--tab-curve: 0;
|
||
--tab-radius: var(--bb-radius-chrome);
|
||
--tab-radius-active: var(--bb-radius-chrome);
|
||
--tab-width: 200px;
|
||
--tab-max-width: 320px;
|
||
--tab-stacked-pane-width: 700px;
|
||
--tab-stacked-header-width: var(--header-height);
|
||
--tab-stacked-font-size: var(--font-ui-small);
|
||
--tab-stacked-font-weight: 400;
|
||
--tab-stacked-text-align: left;
|
||
--tab-stacked-text-transform: rotate(0deg);
|
||
--tab-stacked-text-writing-mode: vertical-lr;
|
||
--tab-stacked-shadow: -8px 0 8px 0 rgba(0, 0, 0, 0.05);
|
||
/* Tables */
|
||
--table-background: transparent;
|
||
--table-border-width: 1px;
|
||
--table-border-color: var(--background-modifier-border);
|
||
--table-white-space: normal;
|
||
--table-header-background: var(--table-background);
|
||
--table-header-background-hover: inherit;
|
||
--table-header-border-width: var(--table-border-width);
|
||
--table-header-border-color: var(--table-border-color);
|
||
--table-header-font: inherit;
|
||
--table-header-size: var(--font-text-size);
|
||
--table-header-weight: var(--bold-weight);
|
||
--table-header-color: var(--text-normal);
|
||
--table-text-size: inherit;
|
||
--table-text-color: inherit;
|
||
--table-column-max-width: none;
|
||
--table-column-alt-background: var(--table-background);
|
||
--table-column-first-border-width: var(--table-border-width);
|
||
--table-column-last-border-width: var(--table-border-width);
|
||
--table-row-background-hover: var(--table-background);
|
||
--table-row-alt-background: var(--table-background);
|
||
--table-row-last-border-width: var(--table-border-width);
|
||
/* Tags */
|
||
--tag-size: var(--font-smaller);
|
||
--tag-color: var(--text-accent);
|
||
--tag-color-hover: var(--text-accent);
|
||
--tag-decoration: none;
|
||
--tag-decoration-hover: none;
|
||
--tag-background: hsla(var(--interactive-accent-hsl), 0.1);
|
||
--tag-background-hover: hsla(var(--interactive-accent-hsl), 0.2);
|
||
--tag-border-color: hsla(var(--interactive-accent-hsl), 0.15);
|
||
--tag-border-color-hover: hsla(var(--interactive-accent-hsl), 0.15);
|
||
--tag-border-width: 0px;
|
||
--tag-padding-x: 0.65em;
|
||
--tag-padding-y: 0.25em;
|
||
--tag-radius: 2em;
|
||
/* Window frame */
|
||
--titlebar-background: var(--background-secondary);
|
||
--titlebar-background-focused: var(--background-secondary-alt);
|
||
--titlebar-border-width: 0px;
|
||
--titlebar-border-color: var(--background-modifier-border);
|
||
--titlebar-text-color: var(--text-muted);
|
||
--titlebar-text-color-focused: var(--text-normal);
|
||
--titlebar-text-weight: var(--font-bold);
|
||
/* Toggles */
|
||
--toggle-border-width: 2px;
|
||
--toggle-width: 40px;
|
||
--toggle-radius: 18px;
|
||
--toggle-thumb-color: white;
|
||
--toggle-thumb-radius: 18px;
|
||
--toggle-thumb-height: 18px;
|
||
--toggle-thumb-width: 18px;
|
||
--toggle-s-border-width: 2px;
|
||
--toggle-s-width: 34px;
|
||
--toggle-s-thumb-height: 15px;
|
||
--toggle-s-thumb-width: 15px;
|
||
/* Vault name */
|
||
--vault-name-font-size: var(--font-ui-small);
|
||
--vault-name-font-weight: var(--font-medium);
|
||
--vault-name-color: var(--text-normal);
|
||
/* Workspace */
|
||
--workspace-background-translucent: rgba(var(--mono-rgb-0), 0.6);
|
||
/* Color mappings */
|
||
--accent-h: var(--accent-h-theme);
|
||
--accent-s: var(--accent-s-theme);
|
||
--accent-l: var(--accent-l-theme);
|
||
--background-primary: var(--color-base-00);
|
||
--background-primary-alt: var(--color-base-10);
|
||
--background-secondary: var(--color-base-20);
|
||
/* Surface — the neutral interaction overlay (see CONTEXT.md → Surface).
|
||
Keyed off --mono-rgb-100 so it flips white↔black per mode automatically.
|
||
Accent is reserved for interactive *foreground* (text/icons/borders),
|
||
never fills — see ADR-0007. */
|
||
--bb-surface-hover: rgba(var(--mono-rgb-100), 0.045);
|
||
--bb-surface-active: rgba(var(--mono-rgb-100), 0.07);
|
||
--bb-surface-selected: rgba(var(--mono-rgb-100), 0.11);
|
||
--background-modifier-hover: var(--bb-surface-hover);
|
||
--background-modifier-active-hover: var(--bb-surface-active);
|
||
--background-modifier-border: var(--color-base-30);
|
||
--background-modifier-border-hover: var(--color-base-30);
|
||
--background-modifier-border-focus: var(--color-accent);
|
||
--background-modifier-error-rgb: var(--color-red-rgb);
|
||
--background-modifier-error: var(--color-red);
|
||
--background-modifier-error-hover: var(--color-red);
|
||
--background-modifier-success-rgb: var(--color-green-rgb);
|
||
--background-modifier-success: var(--color-green);
|
||
--background-modifier-message: rgba(0, 0, 0, 0.9);
|
||
--background-modifier-form-field: var(--color-base-25);
|
||
--text-normal: var(--color-base-100);
|
||
--text-muted: var(--color-base-70);
|
||
--text-faint: var(--color-base-50);
|
||
--text-on-accent: #000000;
|
||
--text-on-accent-inverted: #ffffff;
|
||
--text-error: var(--color-red);
|
||
--text-success: var(--color-green);
|
||
--text-selection: hsla(var(--color-accent-hsl), 0.2);
|
||
--text-highlight-bg: rgba(255, 208, 0, 0.4);
|
||
--text-accent: var(--color-accent);
|
||
--text-accent-hover: var(--color-accent-2);
|
||
--interactive-normal: var(--color-base-00);
|
||
--interactive-hover: var(--color-base-10);
|
||
--interactive-accent-hsl: var(--color-accent-hsl);
|
||
--interactive-accent: var(--color-accent-1);
|
||
--interactive-accent-hover: var(--color-accent-2);
|
||
}
|
||
|
||
/* ── Dark mode ────────────────────────────────────────────────────── */
|
||
|
||
.theme-dark {
|
||
color-scheme: dark;
|
||
--highlight-mix-blend-mode: lighten;
|
||
--mono-rgb-0: 0, 0, 0;
|
||
--mono-rgb-100: 255, 255, 255;
|
||
|
||
/* Semantic colors */
|
||
--color-red-rgb: 255, 87, 87;
|
||
--color-red: #FF5757;
|
||
--color-green-rgb: 126, 231, 135;
|
||
--color-green: #7EE787;
|
||
--color-orange-rgb: 255, 193, 74;
|
||
--color-orange: #FFC14A;
|
||
--color-yellow-rgb: 255, 193, 74;
|
||
--color-yellow: #FFC14A;
|
||
--color-cyan-rgb: 121, 192, 255;
|
||
--color-cyan: #79C0FF;
|
||
--color-blue-rgb: 121, 192, 255;
|
||
--color-blue: #79C0FF;
|
||
--color-purple-rgb: 210, 168, 255;
|
||
--color-purple: #D2A8FF;
|
||
--color-pink-rgb: 255, 143, 163;
|
||
--color-pink: #FF8FA3;
|
||
|
||
/* Base scale — #0B0B0B → #DEDEDE */
|
||
--color-base-00: #0B0B0B;
|
||
--color-base-10: #141414;
|
||
--color-base-20: #1A1A1A;
|
||
--color-base-25: #1F1F1F;
|
||
--color-base-30: #2A2A2A;
|
||
--color-base-35: #242424;
|
||
--color-base-40: #333333;
|
||
--color-base-50: #555555;
|
||
--color-base-60: #666666;
|
||
--color-base-70: #888888;
|
||
--color-base-100: #DEDEDE;
|
||
|
||
/* Accent — #FFC14A ≈ hsl(39, 100%, 64%) */
|
||
--accent-h-theme: 39;
|
||
--accent-s-theme: 100%;
|
||
--accent-l-theme: 64%;
|
||
--color-accent-hsl: var(--accent-h), var(--accent-s), var(--accent-l);
|
||
--color-accent: hsl(var(--accent-h), var(--accent-s), var(--accent-l));
|
||
--color-accent-1: hsl(var(--accent-h), var(--accent-s), calc(var(--accent-l) - 4%));
|
||
--color-accent-2: hsl(var(--accent-h), var(--accent-s), calc(var(--accent-l) + 4%));
|
||
|
||
/* Bold — vivid red (ADR 0002) */
|
||
--bold-color: #FF5757;
|
||
|
||
/* Heading colors — white, no hue (by design) */
|
||
--h-color-theme: #FFFFFF;
|
||
--h1-color-theme: #FFFFFF;
|
||
--h2-color-theme: #FFFFFF;
|
||
--h3-color-theme: #FFFFFF;
|
||
--h4-color-theme: #FFFFFF;
|
||
--h5-color-theme: #FFFFFF;
|
||
--h6-color-theme: #FFFFFF;
|
||
|
||
/* Selection — full opacity amber, black text (ADR — matches aihero.dev) */
|
||
--text-selection: var(--color-accent);
|
||
|
||
/* Misc */
|
||
--background-secondary-alt: var(--color-base-25);
|
||
--background-modifier-box-shadow: rgba(0, 0, 0, 0.4);
|
||
--background-modifier-cover: rgba(0, 0, 0, 0.5);
|
||
--text-highlight-bg: rgba(255, 208, 0, 0.4);
|
||
--text-highlight-bg-active: rgba(255, 128, 0, 0.4);
|
||
--input-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.06);
|
||
--input-shadow-hover: inset 0 0 0 1px var(--color-base-70);
|
||
--shadow-s: none;
|
||
--shadow-l: none;
|
||
|
||
--inline-code-background: rgba(255, 255, 255, 0.06);
|
||
--inline-code-color: #B0B0B0;
|
||
--inline-code-border-color: rgba(255, 255, 255, 0.12);
|
||
|
||
/* Primary button */
|
||
--color-btn-primary-bg: #B8860B;
|
||
--color-btn-primary-hover-bg: #CC9A0D;
|
||
|
||
/* Kanban */
|
||
--kanban-background: var(--background-primary);
|
||
--kanban-lane-background: var(--background-secondary-alt);
|
||
--kanban-item-background: var(--background-primary-alt);
|
||
--kanban-lane-border: var(--color-base-35);
|
||
--kanban-lane-count: var(--color-base-35);
|
||
--kanban-options-btn: var(--color-base-30);
|
||
}
|
||
|
||
.is-mobile.theme-dark {
|
||
--color-base-00: #0B0B0B;
|
||
--color-base-10: #141414;
|
||
--color-base-20: #1A1A1A;
|
||
--tag-background: hsla(var(--interactive-accent-hsl), 0.2);
|
||
--modal-background: var(--background-secondary);
|
||
--search-result-background: var(--background-secondary);
|
||
--background-modifier-form-field: var(--background-modifier-border);
|
||
--background-modifier-cover: rgba(0, 0, 0, 0.6);
|
||
--background-modifier-hover: rgba(var(--mono-rgb-100), 0.15);
|
||
--settings-home-background: var(--background-primary);
|
||
}
|
||
|
||
/* ── Light mode ───────────────────────────────────────────────────── */
|
||
|
||
.theme-light {
|
||
color-scheme: light;
|
||
--highlight-mix-blend-mode: darken;
|
||
--mono-rgb-0: 255, 255, 255;
|
||
--mono-rgb-100: 0, 0, 0;
|
||
|
||
/* Semantic colors — darkened for WCAG AA on white (ADR 0001) */
|
||
--color-red-rgb: 200, 48, 48;
|
||
--color-red: #C83030;
|
||
--color-green-rgb: 42, 122, 59;
|
||
--color-green: #2A7A3B;
|
||
--color-orange-rgb: 184, 134, 11;
|
||
--color-orange: #B8860B;
|
||
--color-yellow-rgb: 184, 134, 11;
|
||
--color-yellow: #B8860B;
|
||
--color-cyan-rgb: 26, 95, 170;
|
||
--color-cyan: #1A5FAA;
|
||
--color-blue-rgb: 26, 95, 170;
|
||
--color-blue: #1A5FAA;
|
||
--color-purple-rgb: 123, 77, 170;
|
||
--color-purple: #7B4DAA;
|
||
--color-pink-rgb: 180, 40, 80;
|
||
--color-pink: #B42850;
|
||
|
||
/* Base scale — #FFFFFF → #1A1A1A */
|
||
--color-base-00: #FFFFFF;
|
||
--color-base-05: #FAFAFA;
|
||
--color-base-10: #F5F5F5;
|
||
--color-base-20: #EFEFEF;
|
||
--color-base-25: #F5F5F5;
|
||
--color-base-30: #DEDEDE;
|
||
--color-base-35: #D0D0D0;
|
||
--color-base-40: #BBBBBB;
|
||
--color-base-50: #888888;
|
||
--color-base-60: #707070;
|
||
--color-base-70: #555555;
|
||
--color-base-100: #1A1A1A;
|
||
|
||
/* Accent — #B8860B ≈ hsl(43, 89%, 38%) */
|
||
--accent-h-theme: 43;
|
||
--accent-s-theme: 89%;
|
||
--accent-l-theme: 38%;
|
||
--color-accent-hsl: var(--accent-h), var(--accent-s), var(--accent-l);
|
||
--color-accent: hsl(var(--accent-h), var(--accent-s), var(--accent-l));
|
||
--color-accent-1: hsl(var(--accent-h), var(--accent-s), calc(var(--accent-l) + 3%));
|
||
--color-accent-2: hsl(var(--accent-h), var(--accent-s), calc(var(--accent-l) + 6%));
|
||
|
||
/* Bold — darker red for light bg (ADR 0001) */
|
||
--bold-color: #C83030;
|
||
|
||
/* Heading colors — black, no hue */
|
||
--h-color-theme: #000000;
|
||
--h1-color-theme: #000000;
|
||
--h2-color-theme: #000000;
|
||
--h3-color-theme: #000000;
|
||
--h4-color-theme: #000000;
|
||
--h5-color-theme: #000000;
|
||
--h6-color-theme: #000000;
|
||
|
||
/* Selection — full opacity dark amber, black text */
|
||
--text-selection: var(--color-accent);
|
||
|
||
/* Misc */
|
||
--background-secondary-alt: var(--color-base-05);
|
||
--background-modifier-box-shadow: rgba(0, 0, 0, 0.1);
|
||
--background-modifier-cover: rgba(220, 220, 220, 0.4);
|
||
--text-highlight-bg: rgba(255, 208, 0, 0.4);
|
||
--text-highlight-bg-active: rgba(255, 128, 0, 0.4);
|
||
--input-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12);
|
||
--input-shadow-hover: inset 0 0 0 1px rgba(0, 0, 0, 0.2);
|
||
--shadow-s: none;
|
||
--shadow-l: none;
|
||
|
||
--inline-code-background: rgba(0, 0, 0, 0.04);
|
||
--inline-code-color: var(--text-muted);
|
||
--inline-code-border-color: rgba(0, 0, 0, 0.10);
|
||
|
||
/* Primary button */
|
||
--color-btn-primary-bg: #B8860B;
|
||
--color-btn-primary-hover-bg: #CC9A0D;
|
||
|
||
/* Kanban */
|
||
--kanban-background: var(--background-primary);
|
||
--kanban-lane-background: var(--background-primary-alt);
|
||
--kanban-item-background: var(--background-primary);
|
||
--kanban-lane-border: var(--color-base-30);
|
||
--kanban-lane-count: rgba(0, 0, 0, 0.08);
|
||
--kanban-options-btn: var(--background-primary-alt);
|
||
}
|
||
|
||
/* ── Selection color ─────────────────────────────────────────────── */
|
||
/* Forces black text on full-opacity amber selection background */
|
||
|
||
::selection {
|
||
background-color: var(--color-accent);
|
||
color: #000000;
|
||
}
|
||
|
||
/* ── Tables ──────────────────────────────────────────────────────── */
|
||
|
||
.markdown-rendered td,
|
||
.markdown-rendered th {
|
||
padding: var(--size-2-3) var(--size-4-3);
|
||
}
|
||
|
||
.markdown-rendered th {
|
||
text-align: left;
|
||
}
|
||
|
||
.markdown-rendered tbody tr:nth-child(2n) {
|
||
background-color: var(--background-secondary);
|
||
}
|
||
|
||
/* ── Cursor ──────────────────────────────────────────────────────── */
|
||
|
||
/* Interactive elements that don't read var(--cursor); see ADR 0006. */
|
||
.workspace-tab-header,
|
||
.workspace-tab-header-new-tab,
|
||
.task-list-item-checkbox {
|
||
cursor: pointer;
|
||
}
|
||
|
||
/* ── Tabs — flush & square (ADR-0008 "Chrome vs. Content") ───────── */
|
||
/* Tabs are docked chrome: perfectly square, no inset, no gap between
|
||
them, in every split (root + sidebars). Obsidian core scopes the tab
|
||
radius and the inner inset under .mod-left-split / .mod-right-split /
|
||
.mod-root (specificity 0,3,0), so the flush overrides are pinned at
|
||
the same reach. --tab-curve:0 already collapses the curve pseudo. */
|
||
.mod-root .workspace-tab-header-container .workspace-tab-header,
|
||
.mod-left-split .workspace-tab-header-container .workspace-tab-header,
|
||
.mod-right-split .workspace-tab-header-container .workspace-tab-header {
|
||
border-radius: var(--bb-radius-chrome);
|
||
/* Drop core's 1px/3px/3.5px inset so the hover/active fill (which sits
|
||
on .workspace-tab-header-inner) reaches every edge of the tab. */
|
||
padding: 0;
|
||
}
|
||
|
||
/* The interactive fill lives on the inner, not the header. Core rounds it
|
||
to var(--tab-radius); square it so hover fills the tab as one clean block. */
|
||
.mod-root .workspace-tab-header-container .workspace-tab-header-inner,
|
||
.mod-left-split .workspace-tab-header-container .workspace-tab-header-inner,
|
||
.mod-right-split .workspace-tab-header-container .workspace-tab-header-inner {
|
||
border-radius: var(--bb-radius-chrome);
|
||
}
|
||
|
||
.mod-root .workspace-tab-header-container .workspace-tab-header-container-inner,
|
||
.mod-left-split .workspace-tab-header-container .workspace-tab-header-container-inner,
|
||
.mod-right-split .workspace-tab-header-container .workspace-tab-header-container-inner {
|
||
margin: 0;
|
||
padding: 0;
|
||
gap: 0;
|
||
}
|
||
|
||
/* First tab sits flush against the sidebar/window edge (core pads 8px left). */
|
||
.mod-root .workspace-tab-header-container {
|
||
padding-left: 0;
|
||
}
|
||
|
||
/* When the left sidebar is collapsed, its toggle button moves into the root
|
||
tab strip and butts right up against the first tab. Give it the same gap
|
||
the tabs have from the new-tab (+). Only present while collapsed, so the
|
||
flush open-state is unaffected. */
|
||
.mod-root .workspace-tab-header-container .sidebar-toggle-button.mod-left {
|
||
margin-right: var(--size-4-2);
|
||
}
|
||
|
||
/* The new-tab (+) button clings to the last tab (core margin-left: -4px);
|
||
give it a normal gap instead. */
|
||
.mod-root .workspace-tab-header-container .workspace-tab-header-new-tab,
|
||
.mod-left-split .workspace-tab-header-container .workspace-tab-header-new-tab,
|
||
.mod-right-split .workspace-tab-header-container .workspace-tab-header-new-tab {
|
||
margin-left: var(--size-4-2);
|
||
}
|
||
|
||
/* Active tab belongs to the content, so it merges into the pane below.
|
||
Core draws a full 1px outline box (box-shadow) whose bottom edge cuts the
|
||
active tab off from the content, and the strip carries a bottom rule on top
|
||
of that. Drop both: the active tab is already the content colour
|
||
(--tab-background-active = --background-primary), so with no line it flows
|
||
straight into the pane. The distinction is the value step alone — active =
|
||
content dark, inactive tabs sit on the lighter strip. No accent marker. */
|
||
.mod-root .workspace-tab-header-container .workspace-tab-header.mod-active,
|
||
.mod-left-split .workspace-tab-header-container .workspace-tab-header.mod-active,
|
||
.mod-right-split .workspace-tab-header-container .workspace-tab-header.mod-active {
|
||
box-shadow: none;
|
||
}
|
||
|
||
.mod-root .workspace-tab-header-container {
|
||
border-bottom: none;
|
||
}
|
||
|
||
/* Give the tab label + close button the same breathing room horizontally that
|
||
they have vertically (centred in a 39px tab ≈ 10px). Core's 6px/3px inner
|
||
padding let them cling to the edges. Root tabs only — sidebar tabs are
|
||
icon-only and lay out differently. */
|
||
.mod-root .workspace-tab-header-container .workspace-tab-header-inner {
|
||
padding-left: 10px;
|
||
padding-right: 10px;
|
||
}
|
||
|
||
/* Inter-tab divider spans the full tab height instead of core's centred 20px
|
||
stub, so flush square tabs read as clean segments. */
|
||
.workspace .mod-root .workspace-tab-header-container .workspace-tab-header-inner::after {
|
||
top: 0;
|
||
height: 100%;
|
||
}
|
||
|
||
/* Inputs are docked chrome → square. Obsidian core re-pins --input-radius
|
||
to --radius-m per platform (.mod-macos / .mod-windows / .mod-linux),
|
||
tying our body-level token; re-assert the chrome role above it. */
|
||
body.mod-macos,
|
||
body.mod-windows,
|
||
body.mod-linux {
|
||
--input-radius: var(--bb-radius-chrome);
|
||
}
|
||
|
||
/* ── Home-tab search — concentric radius (ADR-0008, Strategy-E rule) ─ */
|
||
/* This search is floating content, not docked chrome, so it may be soft — and
|
||
it's a nested case: the outer box wraps inner rows with ~6px padding, so the
|
||
outer radius is derived, outer = inner + padding, for parallel (concentric)
|
||
corners.
|
||
The Home-tab plugin already wires BOTH halves of the expanded box to
|
||
--input-radius: the .home-tab-searchbar corners and the
|
||
.home-tab-suggestion-container's bottom corners (with .is-active zeroing the
|
||
searchbar's bottom so input-top meets results-bottom as one shape). Our chrome
|
||
system sets --input-radius: 0, which squared that bottom. Rather than fight the
|
||
plugin's boosted-specificity rules per element, re-point --input-radius scoped
|
||
to .home-tab at the derived outer radius — both halves follow it, in collapsed
|
||
and expanded states. Inner suggestion rows get the smaller inner radius. */
|
||
.home-tab {
|
||
--bb-r-inner: 8px;
|
||
/* inner suggestion-row radius */
|
||
--bb-r-gap: 6px;
|
||
/* visual gap inner→outer = padding + border */
|
||
--input-radius: calc(var(--bb-r-inner) + var(--bb-r-gap));
|
||
/* outer = 14px */
|
||
}
|
||
|
||
/* Inset the rows by the gap (minus the 1px container border) so their inner
|
||
corners sit concentric inside the container's outer corners: item edge lands
|
||
--bb-r-gap in from the border-box edge, and Rinner = Router − gap. */
|
||
.home-tab .home-tab-suggestion-container {
|
||
padding: calc(var(--bb-r-gap) - var(--input-border-width, 1px));
|
||
}
|
||
|
||
.home-tab .home-tab-suggestion-container .suggestion {
|
||
border-radius: var(--bb-r-inner);
|
||
}
|
||
|
||
/* Join phantom: the plugin updates .is-active and the suggestion container's
|
||
contents on different ticks. On clearing the query, .is-active drops at once
|
||
but the container keeps rendering the PREVIOUS query's results for ~200ms
|
||
before removing them — so the container is a stale signal, and keying the bar
|
||
shape off it flashes a mismatched frame (squared/open bar above a stale or
|
||
blank result box). Treat .is-active as the single source of truth: the instant
|
||
it drops, hide the lagging container and round/close the bar together. And open
|
||
the bar only when active AND real results already follow, so the reverse lag
|
||
(active before results populate) can't flash a squared bar above nothing. */
|
||
.home-tab .home-tab-suggestion-container:empty {
|
||
display: none;
|
||
}
|
||
|
||
.home-tab .home-tab-searchbar:not(.is-active)+.home-tab-suggestion-container {
|
||
display: none;
|
||
}
|
||
|
||
.home-tab .home-tab-searchbar:not(.is-active:has(+ .home-tab-suggestion-container:not(:empty))) {
|
||
border-bottom-left-radius: var(--input-radius) !important;
|
||
border-bottom-right-radius: var(--input-radius) !important;
|
||
border-bottom: var(--input-border-width, 1px) solid var(--background-modifier-border) !important;
|
||
}
|
||
|
||
/* ── Buttons ─────────────────────────────────────────────────────── */
|
||
|
||
button {
|
||
transition: 80ms cubic-bezier(0.33, 1, 0.68, 1);
|
||
}
|
||
|
||
button:hover {
|
||
cursor: var(--cursor-link);
|
||
}
|
||
|
||
button.mod-cta {
|
||
background-color: var(--color-btn-primary-bg);
|
||
color: #000000;
|
||
}
|
||
|
||
button.mod-cta:hover {
|
||
background-color: var(--color-btn-primary-hover-bg);
|
||
}
|
||
|
||
/* ── Callouts — tinted title row over outlined transparent body ─── */
|
||
/* See ADR-0005. The title's tint band reads as a status banner; the
|
||
1px outline holds the shape. The hairline divider below the title is
|
||
rendered as a border-top on .callout-content, so it vanishes for free
|
||
when Obsidian omits .callout-content (title-only) or hides it
|
||
(collapsed) — leaving a clean tinted banner in either state. */
|
||
|
||
.callout {
|
||
background-color: transparent;
|
||
/* Obsidian's default .callout border-color is a neutral grey that ignores
|
||
--callout-color, so the tinted outline must be set explicitly here. */
|
||
border-color: rgba(var(--callout-color), 0.40);
|
||
overflow: hidden;
|
||
}
|
||
|
||
.callout-title {
|
||
background-color: rgba(var(--callout-color), 0.12);
|
||
color: rgb(var(--callout-color));
|
||
}
|
||
|
||
/* Let the title text grow so the fold chevron is pushed to the outer edge. */
|
||
.callout-title-inner {
|
||
flex: 1;
|
||
}
|
||
|
||
.callout-content {
|
||
border-top: 1px solid rgba(var(--callout-color), 0.22);
|
||
}
|
||
|
||
/* The content padding controls the body's inner spacing — drop the stacked
|
||
first/last paragraph margins Obsidian would otherwise add on top of it. */
|
||
.callout-content> :first-child {
|
||
margin-top: 0;
|
||
}
|
||
|
||
.callout-content> :last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
/* ── Headers — one-color toggle ─────────────────────────────────── */
|
||
|
||
body.headers-one-color {
|
||
--h1-color: var(--h-color-theme);
|
||
--h2-color: var(--h-color-theme);
|
||
--h3-color: var(--h-color-theme);
|
||
--h4-color: var(--h-color-theme);
|
||
--h5-color: var(--h-color-theme);
|
||
--h6-color: var(--h-color-theme);
|
||
}
|
||
|
||
/* ── Code blocks — subtle bordered panel, same in every mode ─────── */
|
||
/* The elevated --code-background (base-10) is already applied by Obsidian, as
|
||
are the top/bottom corner radii; only the border WIDTH is missing (the border
|
||
colour already resolves to --background-modifier-border). Add it so the block
|
||
reads as a softly outlined, slightly-raised panel — matching in reading view
|
||
(<pre>) and in Live Preview / Source (CodeMirror .HyperMD-codeblock lines,
|
||
where the box is assembled from per-line edges: sides on every line, top on
|
||
the opening fence, bottom on the closing fence). */
|
||
.markdown-rendered pre {
|
||
border: 1px solid var(--background-modifier-border);
|
||
}
|
||
|
||
.markdown-source-view.mod-cm6 .HyperMD-codeblock {
|
||
border-left: 1px solid var(--background-modifier-border);
|
||
border-right: 1px solid var(--background-modifier-border);
|
||
}
|
||
|
||
.markdown-source-view.mod-cm6 .HyperMD-codeblock-begin {
|
||
border-top: 1px solid var(--background-modifier-border);
|
||
}
|
||
|
||
.markdown-source-view.mod-cm6 .HyperMD-codeblock-end {
|
||
border-bottom: 1px solid var(--background-modifier-border);
|
||
}
|
||
|
||
/* ── Inline code ─────────────────────────────────────────────────── */
|
||
|
||
/* Reading view (<code>), legacy CM5 (.cm-s-obsidian) AND the current CM6 live
|
||
preview (.markdown-source-view.mod-cm6). The cm6 selector is what keeps inline
|
||
code identical in edit view — without it Obsidian's editor defaults win
|
||
(solid --code-background fill, muted colour, no border). */
|
||
.markdown-rendered :not(pre)>code,
|
||
.cm-s-obsidian .cm-inline-code,
|
||
.markdown-source-view.mod-cm6 .cm-inline-code {
|
||
background-color: var(--inline-code-background);
|
||
padding: 0.08em 0.36em;
|
||
border-radius: 4px;
|
||
border: 1px solid var(--inline-code-border-color);
|
||
color: var(--inline-code-color);
|
||
font-weight: 400;
|
||
}
|
||
|
||
/* ── Mermaid diagrams ────────────────────────────────────────────── */
|
||
|
||
.markdown-rendered .mermaid {
|
||
overflow-x: auto;
|
||
}
|
||
|
||
/* ── Header underlines ───────────────────────────────────────────── */
|
||
|
||
body.h1-underline h1,
|
||
body.h1-underline .markdown-rendered h1 {
|
||
padding-bottom: 0.3em;
|
||
border-bottom: 1px solid var(--color-base-40);
|
||
}
|
||
|
||
body.h2-underline h2,
|
||
body.h2-underline .markdown-rendered h2 {
|
||
padding-bottom: 0.3em;
|
||
border-bottom: 1px solid var(--color-base-40);
|
||
}
|
||
|
||
/* ── Input focus rings ───────────────────────────────────────────── */
|
||
|
||
textarea:active,
|
||
input[type='text']:active,
|
||
input[type='search']:active,
|
||
input[type='email']:active,
|
||
input[type='password']:active,
|
||
input[type='number']:active,
|
||
textarea:focus,
|
||
input[type='text']:focus,
|
||
input[type='search']:focus,
|
||
input[type='email']:focus,
|
||
input[type='password']:focus,
|
||
input[type='number']:focus,
|
||
textarea:focus-visible,
|
||
input[type='text']:focus-visible,
|
||
input[type='search']:focus-visible,
|
||
input[type='email']:focus-visible,
|
||
input[type='password']:focus-visible,
|
||
input[type='number']:focus-visible {
|
||
box-shadow: 0 0 0 1px var(--background-modifier-border-focus);
|
||
}
|
||
|
||
select:focus,
|
||
.dropdown:focus {
|
||
box-shadow: 0 0 0 2px var(--background-modifier-border-focus);
|
||
}
|
||
|
||
/* ── Modal backdrop — frosted dimmer ─────────────────────────────── */
|
||
/* When a dialog is open (Settings, Command Palette, Quick Switcher, …)
|
||
the shared .modal-bg dimmer blurs the app behind it.
|
||
|
||
Two Obsidian/Chromium quirks have to be defused for the blur to render:
|
||
1. Obsidian ships .modal-bg with opacity < 1. Chromium silently DISABLES
|
||
backdrop-filter on any element whose own opacity is < 1, so we force
|
||
opacity: 1 and bake the dim into the background colour instead.
|
||
2. On macOS Obsidian sets `body { contain: strict }`. The `paint`
|
||
containment turns <body> into an isolated backdrop root, so the filter
|
||
samples an empty backdrop and renders black. We drop paint containment
|
||
(keep layout/style/size) only while a dimmed modal is open. */
|
||
body:has(.modal-container.mod-dim) {
|
||
contain: layout style size;
|
||
}
|
||
|
||
.modal-container.mod-dim .modal-bg {
|
||
/* !important: Obsidian animates opacity to 0.85; any value < 1 makes
|
||
Chromium drop the backdrop-filter entirely (see note above). */
|
||
opacity: 1 !important;
|
||
background-color: rgba(0, 0, 0, var(--bb-modal-backdrop-dim));
|
||
backdrop-filter: blur(var(--bb-modal-backdrop-blur));
|
||
-webkit-backdrop-filter: blur(var(--bb-modal-backdrop-blur));
|
||
}
|
||
|
||
@media (prefers-reduced-transparency: reduce) {
|
||
body:has(.modal-container.mod-dim) {
|
||
contain: strict;
|
||
}
|
||
|
||
.modal-container.mod-dim .modal-bg {
|
||
backdrop-filter: none;
|
||
-webkit-backdrop-filter: none;
|
||
}
|
||
}
|
||
|
||
/* ── Selection surfaces — align stray highlights to the neutral Surface ─ */
|
||
/* Accent is a foreground role (text/icons/borders); fills use the neutral
|
||
mono Surface (ADR-0007). A few highlights outside the nav still paint an
|
||
accent/amber FILL — pull them onto --bb-surface-selected so they read the
|
||
same as an active file-tree item. */
|
||
|
||
/* Heading/block navigation flash (clicking a heading, following a link).
|
||
Core sets background to --text-highlight-bg (the amber ==mark== colour)
|
||
with !important; override to the neutral surface. Also drop the `lighten`
|
||
blend so it renders identically to a selected nav row. */
|
||
.is-flashing {
|
||
background-color: var(--bb-surface-selected) !important;
|
||
mix-blend-mode: normal;
|
||
}
|
||
|
||
/* Outline+ (community plugin) fills its active item with the accent colour.
|
||
Keep the accent TEXT (matches --nav-item-color-selected) but swap the
|
||
accent fill for the neutral surface. `body` prefix wins over the plugin
|
||
rule regardless of stylesheet load order. */
|
||
body .outline-plus-floating-outline .outline-plus-floating-outline__link.is-active {
|
||
color: var(--text-accent);
|
||
background: var(--bb-surface-selected);
|
||
}
|
||
|
||
/* ── File navigator — snappy expand/collapse ─────────────────────── */
|
||
/* Obsidian's folder expand/collapse runs a ~100ms CSS height transition
|
||
and, after collapse, reconciles its virtualised row list (rewriting the
|
||
min-height spacer) — which makes folders feel sluggish and flickers on
|
||
close for medium folders. We snap instantly and hide collapsed children
|
||
so the post-collapse row shuffle never paints. See ADR 0003. */
|
||
.nav-files-container .tree-item-children {
|
||
transition: none !important;
|
||
}
|
||
|
||
.nav-files-container .tree-item.is-collapsed>.tree-item-children {
|
||
display: none !important;
|
||
}
|
||
|
||
/* Right-align the file-explorer action buttons (Obsidian centres them by
|
||
default) and shrink their icons to --icon-xs (14px). */
|
||
.nav-buttons-container {
|
||
justify-content: flex-end;
|
||
}
|
||
|
||
.nav-buttons-container .clickable-icon {
|
||
--icon-size: var(--icon-xs);
|
||
}
|
||
|
||
/* ── Hover Editor plugin ─────────────────────────────────────────── */
|
||
|
||
.popover.hover-editor>.popover-content {
|
||
border: var(--border-width) var(--color-base-30) solid;
|
||
box-shadow: 0 0 10px 3px var(--background-modifier-box-shadow);
|
||
}
|
||
|
||
/* ── Kanban — common ─────────────────────────────────────────────── */
|
||
|
||
.kanban-plugin {
|
||
--lane-width: 348px;
|
||
}
|
||
|
||
body.theme-light .kanban-plugin__lane-items>div {
|
||
box-shadow: rgba(140, 149, 159, 0.15) 0px 3px 6px;
|
||
}
|
||
|
||
/* Kanban — same height cards */
|
||
body.kanban-same-height-cards .kanban-plugin__item-content-wrapper,
|
||
body.kanban-same-height-cards .kanban-plugin__item-title-wrapper {
|
||
min-height: 68px;
|
||
}
|
||
|
||
/* Kanban — full height column */
|
||
body.kanban-full-height-column button.kanban-plugin__new-item-button {
|
||
align-self: flex-end;
|
||
}
|
||
|
||
body.kanban-full-height-column .kanban-plugin__item-button-wrapper {
|
||
flex-grow: 1;
|
||
display: flex;
|
||
}
|
||
|
||
body.kanban-full-height-column .kanban-plugin__lane-wrapper {
|
||
min-height: 100%;
|
||
}
|
||
|
||
/* ── Kanban — Minimal ────────────────────────────────────────────── */
|
||
|
||
body.kanban-on .kanban-plugin {
|
||
background-color: var(--kanban-background);
|
||
}
|
||
|
||
body.kanban-on .kanban-plugin__lane {
|
||
background-color: var(--kanban-lane-background);
|
||
border: 1px solid var(--kanban-lane-border);
|
||
}
|
||
|
||
body.kanban-on .kanban-plugin__lane-title {
|
||
flex-grow: 0;
|
||
width: fit-content;
|
||
}
|
||
|
||
body.kanban-on .kanban-plugin__item-content-wrapper,
|
||
body.kanban-on .kanban-plugin__item-title-wrapper,
|
||
body.kanban-on .kanban-plugin__item-metadata-wrapper:not(:empty) {
|
||
background: var(--kanban-item-background);
|
||
}
|
||
|
||
body.kanban-on .kanban-plugin__icon>svg {
|
||
transform: rotate(90deg);
|
||
}
|
||
|
||
body.kanban-on .kanban-plugin__lane-settings-button-wrapper {
|
||
margin-left: auto;
|
||
}
|
||
|
||
body.kanban-on div.kanban-plugin__lane-title-count {
|
||
background-color: var(--kanban-lane-count);
|
||
border-radius: 1em;
|
||
padding: 2px 5px;
|
||
}
|
||
|
||
body.kanban-on .kanban-plugin__item button.kanban-plugin__item-prefix-button,
|
||
body.kanban-on .kanban-plugin__item button.kanban-plugin__item-postfix-button,
|
||
body.kanban-on .kanban-plugin__lane button.kanban-plugin__lane-settings-button {
|
||
padding: 0 5px;
|
||
height: 24px;
|
||
box-shadow: none;
|
||
}
|
||
|
||
body.kanban-on .kanban-plugin__item button.kanban-plugin__item-prefix-button:hover,
|
||
body.kanban-on .kanban-plugin__item button.kanban-plugin__item-postfix-button:hover,
|
||
body.kanban-on .kanban-plugin__lane button.kanban-plugin__lane-settings-button:hover {
|
||
background-color: var(--kanban-options-btn);
|
||
cursor: pointer;
|
||
}
|
||
|
||
body.kanban-on button.kanban-plugin__new-item-button {
|
||
border: none;
|
||
justify-content: flex-start;
|
||
}
|
||
|
||
body.kanban-on .kanban-plugin__new-item-button:hover {
|
||
color: var(--text-normal);
|
||
background-color: inherit;
|
||
box-shadow: none;
|
||
}
|
||
|
||
body.kanban-on .kanban-plugin__lane-items {
|
||
padding: 8px 15px;
|
||
}
|
||
|
||
body.kanban-on .kanban-plugin__item-prefix-button-wrapper input[type=checkbox] {
|
||
filter: none;
|
||
}
|
||
|
||
/* ── Kanban — Full ───────────────────────────────────────────────── */
|
||
|
||
body.kanban-full .kanban-plugin {
|
||
background-color: var(--kanban-background);
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__lane {
|
||
background-color: var(--kanban-lane-background);
|
||
border: 1px solid var(--kanban-lane-border);
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__lane-grip {
|
||
position: absolute;
|
||
opacity: 0;
|
||
width: calc(var(--lane-width) - 1em);
|
||
height: 3em;
|
||
z-index: 0;
|
||
margin: 0;
|
||
cursor: default;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__lane-header-wrapper div {
|
||
z-index: 1;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__lane-header-wrapper {
|
||
padding-left: 14px;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__markdown-preview-view {
|
||
font-size: inherit;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__lane-title {
|
||
flex-grow: 0;
|
||
width: fit-content;
|
||
font-size: 1em;
|
||
}
|
||
|
||
body.kanban-full div.kanban-plugin__lane-title-count {
|
||
background-color: var(--kanban-lane-count);
|
||
border-radius: 1em;
|
||
padding: 2px 5px;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__lane-settings-button-wrapper {
|
||
margin-left: auto;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__lane-items {
|
||
padding: 2px 6px;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__item-content-wrapper,
|
||
body.kanban-full .kanban-plugin__item-title-wrapper,
|
||
body.kanban-full .kanban-plugin__item-metadata-wrapper:not(:empty) {
|
||
background: var(--kanban-item-background);
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__item {
|
||
border-color: var(--kanban-lane-border);
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__lane-items>div {
|
||
margin-bottom: 8px;
|
||
margin-top: 0;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__lane-header-wrapper,
|
||
body.kanban-full .kanban-plugin__item-button-wrapper,
|
||
body.kanban-full .kanban-plugin__item-form {
|
||
border: none;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__item-title-wrapper {
|
||
padding: 12px 12px 12px 0;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__item-title,
|
||
body.kanban-full .kanban-plugin__item-input-wrapper {
|
||
padding-left: 12px;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__item-prefix-button-wrapper {
|
||
align-self: center;
|
||
margin-left: 5px;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__item-metadata .is-button:hover {
|
||
cursor: var(--cursor-link);
|
||
color: var(--text-normal);
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__icon>svg {
|
||
transform: rotate(90deg);
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__icon {
|
||
font-size: 1.4em;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__item-postfix-button.clickable-icon {
|
||
opacity: 0;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__item:hover .kanban-plugin__item-postfix-button.clickable-icon {
|
||
opacity: 1;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__new-item-button {
|
||
border: none;
|
||
justify-content: flex-start;
|
||
box-shadow: none;
|
||
padding-left: 0;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__item-button-plus {
|
||
margin-right: 8px;
|
||
font-size: 1.9em;
|
||
height: inherit;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__new-item-button:hover {
|
||
background-color: inherit;
|
||
box-shadow: none;
|
||
color: var(--text-muted);
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__item-prefix-button-wrapper input[type=checkbox] {
|
||
filter: none;
|
||
margin: 3px;
|
||
}
|
||
|
||
body.kanban-full .kanban-plugin__markdown-preview-view>div>* {
|
||
overflow-x: unset;
|
||
} |