/* * The FineNotes playground's own stylesheet: the design tokens FineNotes' * styles.css reads (named as Obsidian names them, values our own), plain * styles for the Obsidian stand-in's DOM (modal, menu, settings rows, * buttons, fields, notices), and the playground's bar. * Original code for this site. GPL-3.0-or-later. */ :root, body, .theme-light { color-scheme: light; --color-base-00: #ffffff; --color-base-05: #fcfcfc; --color-base-10: #fafafa; --color-base-20: #f6f6f6; --color-base-25: #e3e3e3; --color-base-30: #e0e0e0; --color-base-35: #d4d4d4; --color-base-40: #bdbdbd; --color-base-50: #ababab; --color-base-60: #707070; --color-base-70: #5c5c5c; --color-base-100: #222222; --mono-rgb-0: 255, 255, 255; --mono-rgb-100: 0, 0, 0; --color-red: #e93147; --color-orange: #ec7500; --color-yellow: #e0ac00; --color-green: #08b94e; --color-blue: #086ddd; --color-purple: #7852ee; --accent-h: 258; --accent-s: 88%; --accent-l: 66%; --interactive-accent-hsl: var(--accent-h), var(--accent-s), var(--accent-l); --interactive-accent: hsl(var(--accent-h), var(--accent-s), var(--accent-l)); --interactive-accent-hover: hsl(var(--accent-h), var(--accent-s), 60%); --interactive-normal: var(--color-base-00); --interactive-hover: var(--color-base-10); --text-accent: hsl(var(--accent-h), var(--accent-s), 60%); --text-accent-hover: hsl(var(--accent-h), var(--accent-s), 54%); --text-on-accent: #ffffff; --text-normal: var(--color-base-100); --text-muted: var(--color-base-70); --text-faint: var(--color-base-50); --text-error: var(--color-red); --text-success: var(--color-green); --background-primary: var(--color-base-00); --background-primary-alt: var(--color-base-10); --background-secondary: var(--color-base-20); --background-secondary-alt: var(--color-base-05); --background-modifier-border: var(--color-base-30); --background-modifier-border-hover: var(--color-base-35); --background-modifier-border-focus: var(--color-base-40); --background-modifier-hover: rgba(var(--mono-rgb-100), 0.067); --background-modifier-active-hover: hsla(var(--interactive-accent-hsl), 0.15); --background-modifier-error: var(--color-red); --background-modifier-form-field: var(--color-base-00); --modal-background: var(--background-primary); --icon-color: var(--text-muted); --icon-color-hover: var(--text-normal); --icon-opacity: 0.85; --icon-xs: 14px; --icon-s: 16px; --icon-m: 18px; --icon-l: 18px; --icon-size: var(--icon-m); --icon-stroke: 1.75px; --toggle-thumb-color: #ffffff; --cursor: default; --font-interface: -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, Roboto, "Helvetica Neue", Arial, sans-serif; --font-text: var(--font-interface); --font-monospace: ui-monospace, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; --font-ui-smaller: 12px; --font-ui-small: 13px; --font-ui-medium: 15px; --font-ui-large: 20px; --font-normal: 400; --font-medium: 500; --font-semibold: 600; --font-bold: 700; --line-height-normal: 1.5; --hotkey-font: var(--font-interface); --hotkey-font-size: 12px; --hotkey-radius: 4px; --hotkey-background: var(--color-base-25); --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; --radius-s: 4px; --radius-m: 8px; --radius-l: 12px; --border-width: 1px; --shadow-s: 0 1px 2px rgba(0, 0, 0, 0.06), 0 3px 8px rgba(0, 0, 0, 0.08); --shadow-l: 0 2px 8px rgba(0, 0, 0, 0.08), 0 12px 32px rgba(0, 0, 0, 0.16); --layer-popover: 30; --layer-modal: 50; --layer-notice: 60; --layer-menu: 65; --layer-dragged-item: 80; --keyboard-height: 0px; --safe-area-inset-top: env(safe-area-inset-top, 0px); --play-bar-h: 40px; } /* --- Page --------------------------------------------------------------------------- */ *, *::before, *::after { box-sizing: border-box; } html, body { margin: 0; height: 100%; overflow: hidden; overscroll-behavior: none; } body { background: var(--background-primary); color: var(--text-normal); font-family: var(--font-interface); font-size: var(--font-ui-medium); line-height: var(--line-height-normal); -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: 100%; -webkit-tap-highlight-color: transparent; display: flex; flex-direction: column; } a { color: var(--text-accent); } /* --- The playground's bar ----------------------------------------------------------- */ .play-bar { flex: 0 0 auto; height: var(--play-bar-h); display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 0 10px 0 14px; background: #1f1d2b; color: #f2f0fa; font-size: 13px; white-space: nowrap; user-select: none; -webkit-user-select: none; touch-action: manipulation; } .play-bar-text { overflow: hidden; text-overflow: ellipsis; min-width: 0; } .play-bar-short { display: none; } .play-bar-actions { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; } .play-bar .play-bar-button, .play-bar .play-bar-get { appearance: none; display: inline-flex; align-items: center; min-height: 0; box-shadow: none; font-weight: 500; font: inherit; font-size: 12.5px; line-height: 1; border-radius: 999px; padding: 7px 11px; cursor: pointer; text-decoration: none; border: 1px solid rgba(255, 255, 255, 0.22); background: transparent; color: inherit; } .play-bar .play-bar-button:hover { background: rgba(255, 255, 255, 0.1); } .play-bar .play-bar-button.is-on { background: rgba(255, 255, 255, 0.92); color: #1f1d2b; border-color: transparent; } .play-bar-button[hidden] { display: none; } .play-bar .play-bar-get { background: #b3a7f7; border-color: transparent; color: #17161d; font-weight: 600; } .play-bar .play-bar-get:hover { background: #c7befa; } @media (max-width: 640px) { .play-bar-long { display: none; } .play-bar-short { display: inline; } } @media (max-width: 430px) { .play-bar { padding: 0 6px 0 10px; } .play-bar-text { display: none; } .play-bar-actions { flex: 1 1 auto; justify-content: space-between; } } .play-root { position: relative; flex: 1 1 auto; min-height: 0; overflow: hidden; } .play-loading { position: absolute; inset: 0; display: grid; place-items: center; color: var(--text-muted); background: #3b3e45; color: #e8e8ea; } .play-ready .play-loading { display: none; } .play-noscript { padding: 24px; } /* The notebook view fills the playground, as a tab fills Obsidian's pane. */ .play-pane { position: absolute; inset: 0; display: flex; flex-direction: column; } .play-pane > .view-content { position: relative; flex: 1 1 auto; min-height: 0; padding: 0; overflow: hidden; background: var(--background-primary); } /* --- Obsidian's base controls -------------------------------------------------------- */ .svg-icon { width: var(--icon-size); height: var(--icon-size); stroke-width: var(--icon-stroke); flex: 0 0 auto; } button { font-family: inherit; font-size: var(--font-ui-small); font-weight: var(--font-medium); color: var(--text-normal); -webkit-appearance: none; appearance: none; cursor: var(--cursor); } button:not(.clickable-icon) { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 30px; padding: 4px 14px; border: 0; border-radius: var(--radius-s); background: var(--interactive-normal); box-shadow: 0 0 0 1px var(--background-modifier-border), 0 1px 2px rgba(0, 0, 0, 0.06); white-space: nowrap; } button:not(.clickable-icon):hover { background: var(--interactive-hover); } button.mod-cta { background: var(--interactive-accent); color: var(--text-on-accent); box-shadow: none; } button.mod-cta:hover { background: var(--interactive-accent-hover); } button.mod-warning { background: var(--color-red); color: #fff; box-shadow: none; } button:disabled { opacity: 0.5; cursor: not-allowed; } .clickable-icon { display: inline-flex; align-items: center; justify-content: center; padding: 4px 6px; border: 0; border-radius: var(--radius-s); background: transparent; color: var(--icon-color); opacity: var(--icon-opacity); cursor: var(--cursor); } .clickable-icon:hover { background: var(--background-modifier-hover); color: var(--icon-color-hover); opacity: 1; } input[type="text"], input[type="search"], input[type="number"], input[type="email"], input[type="url"], input:not([type]), textarea, select.dropdown, select { font-family: inherit; font-size: var(--font-ui-small); color: var(--text-normal); background: var(--background-modifier-form-field); border: 1px solid var(--background-modifier-border); border-radius: var(--radius-s); padding: 5px 8px; outline: none; } input[type="text"]:focus, input[type="search"]:focus, input[type="number"]:focus, input:not([type]):focus, textarea:focus, select:focus { border-color: var(--interactive-accent); box-shadow: 0 0 0 2px hsla(var(--interactive-accent-hsl), 0.25); } select.dropdown, select { padding-right: 24px; } input[type="range"] { accent-color: var(--interactive-accent); } .checkbox-container { position: relative; display: inline-block; flex: 0 0 auto; width: 40px; height: 22px; border-radius: 999px; background: var(--color-base-35); cursor: pointer; transition: background 0.15s; } .checkbox-container input { display: none; } .checkbox-container::after { content: ""; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px; border-radius: 50%; background: var(--toggle-thumb-color); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25); transition: transform 0.15s; } .checkbox-container.is-enabled { background: var(--interactive-accent); } .checkbox-container.is-enabled::after { transform: translateX(18px); } .checkbox-container.is-disabled { opacity: 0.5; } kbd { font-family: var(--hotkey-font); font-size: var(--hotkey-font-size); background: var(--hotkey-background); border-radius: var(--hotkey-radius); padding: 1px 5px; } .is-hidden { display: none; } /* --- Settings rows ------------------------------------------------------------------- */ .setting-item { display: flex; align-items: center; gap: 12px; padding: 10px 0; border-top: 1px solid var(--background-modifier-border); } .setting-item:first-child { border-top: 0; } .setting-item-info { flex: 1 1 auto; min-width: 0; } .setting-item-name { font-size: var(--font-ui-medium); color: var(--text-normal); } .setting-item-description { font-size: var(--font-ui-smaller); color: var(--text-muted); padding-top: 2px; } .setting-item-description:empty { display: none; } .setting-item-control { display: flex; align-items: center; justify-content: flex-end; gap: 8px; flex: 0 1 auto; } .setting-item-heading .setting-item-name { font-weight: var(--font-semibold); } .setting-item.is-disabled { opacity: 0.5; pointer-events: none; } /* --- Modal --------------------------------------------------------------------------- */ .modal-container { position: fixed; inset: 0; z-index: var(--layer-modal); display: flex; align-items: center; justify-content: center; padding: 16px; } .modal-bg { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.45); } .modal { position: relative; display: flex; flex-direction: column; width: 560px; max-width: 100%; max-height: calc(100% - 16px); overflow: auto; padding: 20px 22px; border-radius: 14px; background: var(--modal-background); box-shadow: var(--shadow-l); border: 1px solid var(--background-modifier-border); } .modal-close-button { position: absolute; top: 10px; right: 10px; z-index: 1; } .modal-header { padding-right: 32px; } .modal-title { font-size: var(--font-ui-large); font-weight: var(--font-semibold); line-height: 1.3; margin-bottom: 12px; } .modal-title:empty { display: none; } .modal-content { font-size: var(--font-ui-medium); } .modal-button-container { display: flex; justify-content: flex-end; gap: 8px; margin-top: 16px; flex-wrap: wrap; } .prompt { padding: 0; width: 600px; } .prompt-input-container { padding: 10px; border-bottom: 1px solid var(--background-modifier-border); } .prompt-input { width: 100%; font-size: var(--font-ui-medium) !important; } .prompt-results { overflow: auto; max-height: 50vh; padding: 6px; } .suggestion-item { padding: 8px 10px; border-radius: var(--radius-s); cursor: pointer; } .suggestion-item.is-selected, .suggestion-item:hover { background: var(--background-modifier-hover); } .suggestion-empty { padding: 10px; color: var(--text-muted); } .prompt-instructions { display: flex; gap: 12px; padding: 8px 12px; font-size: var(--font-ui-smaller); color: var(--text-muted); border-top: 1px solid var(--background-modifier-border); } .prompt-instruction-command { font-weight: var(--font-semibold); margin-right: 4px; } @media (max-width: 600px) { .modal-container { padding: 8px; align-items: flex-end; } .modal { width: 100%; max-height: calc(100% - 8px); padding: 16px; } } /* --- Menu ---------------------------------------------------------------------------- */ .menu { position: fixed; z-index: var(--layer-menu); min-width: 190px; max-width: calc(100vw - 8px); max-height: calc(100vh - 8px); overflow: auto; padding: 5px; border-radius: 10px; background: var(--background-primary); border: 1px solid var(--background-modifier-border); box-shadow: var(--shadow-l); font-size: var(--font-ui-small); user-select: none; -webkit-user-select: none; } .menu-separator { height: 1px; margin: 4px 2px; background: var(--background-modifier-border); } .menu-item { display: flex; align-items: center; gap: 8px; padding: 6px 10px; border-radius: 6px; cursor: pointer; color: var(--text-normal); } .menu-item:hover { background: var(--background-modifier-hover); } .menu-item-icon { display: flex; color: var(--icon-color); } .menu-item-icon .svg-icon { --icon-size: 16px; } .menu-item-icon:empty { display: none; } .menu-item-check { display: flex; margin-left: auto; color: var(--interactive-accent); } .menu-item-check .svg-icon { --icon-size: 16px; } .menu.mod-no-icon .menu-item-icon { display: none; } .menu-item.is-disabled { opacity: 0.45; cursor: default; } .menu-item.is-label { color: var(--text-muted); font-size: var(--font-ui-smaller); cursor: default; } .menu-item.is-warning { color: var(--color-red); } .menu-item.is-warning .menu-item-icon { color: var(--color-red); } .menu-item-title { flex: 1 1 auto; } /* --- Notices ------------------------------------------------------------------------- */ .notice-container { position: fixed; top: calc(var(--play-bar-h) + 10px); right: 10px; left: auto; z-index: var(--layer-notice); display: flex; flex-direction: column; align-items: flex-end; gap: 6px; max-width: min(380px, calc(100vw - 20px)); pointer-events: none; } .notice { pointer-events: auto; padding: 10px 14px; border-radius: 10px; background: #2b2a33; color: #f4f3f8; font-size: var(--font-ui-small); line-height: 1.4; box-shadow: var(--shadow-l); cursor: pointer; white-space: normal; } .notice a, .play-notice-link { color: #c9b8ff; font-weight: 600; } @media (max-width: 600px) { .notice-container { left: 10px; right: 10px; max-width: none; align-items: stretch; } } /* --- Small Obsidian bits the plugin's panels use --------------------------------------- */ .setting-progress-bar { height: 6px; border-radius: 3px; background: var(--background-modifier-border); overflow: hidden; width: 120px; } .setting-progress-bar-inner { height: 100%; background: var(--interactive-accent); } /* iOS zooms into any field under 16 px when it gets the focus. */ @media (pointer: coarse) { .modal input, .modal textarea, .modal select, .prompt-input { font-size: 16px; } } .search-input-container { position: relative; display: flex; } .search-input-container input { width: 100%; } /* --- Suggestions under a text field (AbstractInputSuggest) ------------------------------ */ .suggestion-container { position: fixed; z-index: var(--layer-menu); max-height: 240px; overflow: auto; padding: 4px; border-radius: 8px; background: var(--background-primary); border: 1px solid var(--background-modifier-border); box-shadow: var(--shadow-l); font-size: var(--font-ui-small); } .setting-item-error { color: var(--text-error); font-size: var(--font-ui-smaller); } /* --- The notebook's section tabs (see section-tabs.ts) ----------------------------------- */ /* Room beside the page: every tab shows its whole label. */ .play-tabs-open button.goodobsidian-page-tab.clickable-icon { width: auto; max-width: 210px; transform: translateX(0); } .play-tabs-open button.goodobsidian-page-tab.clickable-icon:not(.is-current) { opacity: 0.88; } /* No room (a phone): the tabs would sit on the paper; Contents lists the sections. */ .play-tabs-hidden .goodobsidian-page-tabs { display: none; }