/
githubmirror
/
obsidian-clipper
Обзор
Документация
Войти
/
githubmirror
/
obsidian-clipper
Код
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/reader.scss
624 строки
14 KB
Steph Ango
Warn when a reader font can't render and harden font name handling
15 июн 2026, 23:57
15 июн 2026, 23:57
4cd92d4
Код
Авторство
О чём код?
@import 'styles/reader-themes'; @import 'styles/reader-content'; @import 'styles/reader/lightbox'; @import 'styles/reader/transcripts'; @import 'styles/reader/comments'; @import 'styles/reader/outline'; ::view-transition-old(root), ::view-transition-new(root) { animation-duration: 0.1s; animation-timing-function: ease-out; } .obsidian-reader-active { background-color: var(--background-primary) !important; overflow: auto !important; height: auto !important; .obsidian-highlighter-menu { display: none !important; } &.theme-light:not(.no-blend-images) { img, svg { mix-blend-mode: multiply; } } &.theme-dark { .mw-invert { filter: invert(1); } &:not(.no-blend-images) .invert-images { img, svg { filter: invert(1) hue-rotate(180deg); mix-blend-mode: screen; } } } &.color-links a { color: var(--text-accent-hover); } } .theme-light { --mix-blend-mode: multiply; } .theme-dark { --mix-blend-mode: screen; } .obsidian-reader-active body { --safe-area-inset-top: env(safe-area-inset-top); --safe-area-inset-bottom: env(safe-area-inset-bottom); --safe-area-inset-left: env(safe-area-inset-left); --safe-area-inset-right: env(safe-area-inset-right); --preferred-text-scale: env(preferred-text-scale); --font-ui: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif; --font-text: system-ui, -apple-system, sans-serif; --sidebar-width: 240px; --layer-reader: 5; --layer-highlights: 20; --layer-footnote: 20; --layer-popover: 30; --layer-menu: 50; --layer-clipper: 60; --font-ui-small: 13px; background: var(--background-primary) !important; margin: 0 !important; padding: 0 !important; color: var(--text-normal) !important; font-size: var(--dynamic-font-size) !important; line-height: var(--line-height-normal) !important; font-family: var(--font-text) !important; -webkit-font-smoothing: antialiased !important; ::selection { background-color: var(--text-selection); } .obsidian-reader-left-sidebar.is-empty ~ .obsidian-reader-content { --sidebar-width: 30px; } .obsidian-reader-right-sidebar { width: var(--clipper-sidebar-width, auto); } .obsidian-reader-content { padding: max(4rem, 4vh) 1rem 0 !important; width: var(--line-width); max-width: calc(100vw - var(--sidebar-width) - var(--clipper-sidebar-width, 0px)); overflow: clip; > article { margin: 0 auto; max-width: 100%; } } .metadata { margin-bottom: max(2rem, 3vh); } .metadata-details { font-family: var(--font-ui); color: var(--text-muted); font-size: 0.9em; .metadata-highlights { white-space: nowrap; } .metadata-author { color: var(--text-normal); font-weight: var(--font-medium); } a { color: inherit; text-decoration: none; color: var(--text-muted); } a:hover { text-decoration: underline; } } .reader-video-wrapper { aspect-ratio: 16 / 9; background: #000; border-radius: var(--radius-m); corner-shape: var(--corner-shape); overflow: hidden; video.reader-video-player { width: 100% !important; height: 100% !important; left: auto !important; top: auto !important; position: relative !important; } } .obsidian-highlight-overlay { z-index: var(--layer-highlights); } } .reader-nav { position: fixed; top: 0; inset-inline-start: 0; padding: 16px 20px; display: flex; gap: 12px; } .reader-nav-link { --link-external-color: var(--text-faint); --link-external-color-hover: var(--text-normal); --link-external-decoration: none; --link-external-decoration-hover: none; text-decoration: none; font-size: var(--font-ui-small); font-family: var(--font-ui); } .reader-url-input-wrapper { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100%; max-width: 500px; padding: 0 24px; box-sizing: border-box; } .reader-url-input { width: 100%; padding: 12px 16px; font-size: 16px; font-family: var(--font-ui, system-ui, -apple-system, sans-serif); color: var(--text-normal, #111); background: var(--background-primary, #fff); border: 1px solid var(--background-modifier-border, #e0e0e0); border-radius: var(--radius-m, 8px); outline: none; box-sizing: border-box; &::placeholder { color: var(--text-faint, #aaa); } &:focus { border-color: var(--background-modifier-border, #888); } } .obsidian-reader-loading { font-family: var(--font-ui); position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); display: flex; flex-direction: column; align-items: center; gap: var(--size-4-3); margin-top: -10px; &::before { content: ''; width: var(--size-4-5); height: var(--size-4-5); border: 2px solid var(--background-modifier-border); border-top-color: var(--text-muted); border-radius: 50%; animation: obsidian-reader-spin 0.6s linear infinite; } } .obsidian-reader-loading-text { color: var(--text-faint); font-size: 0.8em; } .obsidian-reader-error { font-family: var(--font-ui); position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); display: flex; flex-direction: column; align-items: center; gap: var(--size-4-3); } .obsidian-reader-error-text { text-align: center; color: var(--text-normal); font-size: 0.9em; text-wrap: balance; line-height: 1.5; } .obsidian-reader-error-link { color: var(--text-faint); font-size: 0.8em; text-decoration: underline; cursor: pointer; &:hover { color: var(--text-muted); } } @keyframes obsidian-reader-spin { to { transform: rotate(360deg); } } .obsidian-reader-footer { color: var(--text-faint); font-family: var(--font-ui); font-size: 0.7em; margin-top: 36vh; padding: 1rem 0 2rem 0; border-top: 1px solid var(--background-modifier-border); } .obsidian-reader-settings { position: fixed; top: 0; right: 0; z-index: var(--layer-menu); font-family: var(--font-ui); user-select: none; -webkit-user-select: none; } .obsidian-reader-nav { position: absolute; top: var(--size-4-3); right: var(--size-4-5); background: var(--background-primary); box-shadow: 5px -10px 20px 20px var(--background-primary); border-radius: var(--radius-m); corner-shape: var(--corner-shape); display: flex; align-items: center; gap: 4px; transition: opacity 0.15s ease, visibility 0.15s ease; .nav-btn { border-radius: var(--radius-m); corner-shape: var(--corner-shape); width: 30px; height: 30px; padding: 0; display: flex; align-items: center; justify-content: center; border: none; cursor: pointer; font-size: 16px; -webkit-tap-highlight-color: transparent; transition: color 0.15s ease, opacity 0.15s ease, transform 0.15s ease; background: var(--background-primary); color: var(--text-muted); outline: none; svg { opacity: 0.85; } @media (hover: hover) { &:hover { color: var(--text-normal); background: var(--background-primary-alt); svg { opacity: 0.85; } } } &.is-active { color: var(--text-normal); background: var(--background-primary-alt); @media (hover: none) { transition: none; } } } } @media (max-width: 768px) { .obsidian-reader-nav { position: fixed; top: 0; right: 0; left: 0; background: none; box-shadow: none; width: calc(100vw - var(--size-4-3) * 2); padding: calc(var(--safe-area-inset-top) + var(--size-4-2)) var(--size-4-3) var(--size-4-2); justify-content: flex-end; &::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(to bottom, var(--background-primary) 25%, transparent); pointer-events: none; height: 200%; z-index: -1; } .nav-btn { width: 40px; height: 40px; background: transparent; svg { width: 22px; height: 22px; } } } .obsidian-reader-active body { h1 { margin-top: 1.5em; } } .obsidian-reader-settings.is-open .obsidian-reader-settings-controls { width: 90%; position: fixed; background-color: var(--background-primary-alt); left: 0; right: 0; bottom: 0; margin: 0 auto; padding: 5% 5% 6px; border-radius: 8% 8% 0 0; box-shadow: 0 0 0 1px var(--background-modifier-border); .obsidian-reader-settings-link-button, .obsidian-reader-settings-select-wrapper >.obsidian-reader-settings-select, .obsidian-reader-settings-controls-group { border-radius: 40px; } .obsidian-reader-settings-typography-group { flex-direction: row; } .obsidian-reader-settings-link-button, .obsidian-reader-settings-button, .obsidian-reader-settings-select-wrapper >.obsidian-reader-settings-select { height: 40px; background-color: var(--background-modifier-border); font-size: max(var(--font-ui-small), 16px); &:hover, &:active, &:focus { background-color: var(--background-modifier-border); } } } } .obsidian-reader-clip-dropdown { display: none; position: absolute; top: calc(var(--size-4-3) + 36px); right: var(--size-4-5); background: var(--background-primary); border: var(--border-width) solid var(--background-modifier-border); border-radius: var(--radius-m); corner-shape: var(--corner-shape); padding: var(--size-2-3); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12); z-index: 9999999999; &.is-open { display: block; } } .obsidian-reader-clip-item { display: flex; align-items: center; gap: var(--size-4-2); padding: var(--size-2-2) var(--size-4-2); border-radius: var(--radius-s); corner-shape: var(--corner-shape); color: var(--text-normal); white-space: nowrap; cursor: pointer; font-size: var(--font-ui-small); &:hover { background: var(--background-primary-alt); } svg { flex-shrink: 0; color: var(--text-muted); } } .obsidian-reader-settings-controls { display: none; background: var(--background-primary); padding: var(--size-4-5); padding-top: 56px; } .obsidian-reader-settings.is-open { .obsidian-reader-settings-trigger { color: var(--text-normal); } .obsidian-reader-settings-controls { display: grid; } } .obsidian-reader-settings-typography-group { display: flex; gap: var(--size-2-3); flex-direction: column; } .obsidian-reader-settings-dropdown-group { display: flex; flex-direction: column; gap: var(--size-2-3); } .obsidian-reader-settings-spacer { margin: 3px 0; } .obsidian-reader-settings-controls { align-items: center; gap: var(--size-2-3); .obsidian-reader-settings-select { width: 100%; } } .obsidian-reader-settings-controls-group { display: flex; align-items: center; flex-grow: 1; border: 1px solid var(--background-modifier-border); border-radius: var(--radius-m); corner-shape: var(--corner-shape); overflow: hidden; > .obsidian-reader-settings-button { flex: 1; border-radius: 0; &:not(:first-child) { border-left: 1px solid var(--background-modifier-border); } } } .obsidian-reader-settings-button { box-sizing: border-box; display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; border: none; background: transparent; border-radius: var(--radius-l); height: 26px; color: var(--text-muted); cursor: pointer; padding: 0; } .obsidian-reader-settings-button:hover { background: var(--background-primary-alt); color: var(--text-normal); } .obsidian-reader-settings-select { -webkit-appearance: none; -moz-appearance: none; appearance: none; background-color: transparent; border: 1px solid var(--background-modifier-border); color: var(--text-muted); font-family: inherit; font-size: var(--font-ui-small); height: 28px; padding: 4px 30px 4px 8px; border-radius: var(--radius-m); corner-shape: var(--corner-shape); cursor: pointer; background-repeat: no-repeat, repeat; /* arrow icon position (1em from the right, 50% vertical) , then gradient position*/ background-position: var(--dropdown-background-position); /* icon size, then gradient */ background-size: var(--dropdown-background-size); background-blend-mode: hard-light; & { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23000' opacity='0.9' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' %3E%3Cpath d='m7 15 5 5 5-5'/%3E%3Cpath d='m7 9 5-5 5 5'/%3E%3C/svg%3E"); } &:hover { background-color: var(--background-primary-alt); color: var(--text-normal); } &:focus { outline: none; background-color: var(--background-primary-alt); color: var(--text-normal); } } .theme-dark .obsidian-reader-settings-select { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23FFF' opacity='0.6' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' %3E%3Cpath d='m7 15 5 5 5-5'/%3E%3Cpath d='m7 9 5-5 5 5'/%3E%3C/svg%3E"); } .obsidian-reader-settings-select-wrapper { position: relative; display: flex; align-items: center; > svg { position: absolute; left: 8px; pointer-events: none; color: var(--text-muted); z-index: 1; } > .obsidian-reader-settings-select { padding-left: 32px; } &:hover > svg { color: var(--text-normal); } } .obsidian-reader-font-notice { color: var(--color-orange); font-size: var(--font-ui-small); line-height: 1.3; max-width: 220px; padding: 0 2px; } .obsidian-reader-settings-link-button { box-sizing: border-box; display: flex; align-items: center; justify-content: flex-start; gap: 8px; border: 1px solid var(--background-modifier-border); background: transparent; border-radius: var(--radius-m); corner-shape: var(--corner-shape); height: 28px; padding: 0 6px; color: var(--text-muted); cursor: pointer; font-family: inherit; font-size: var(--font-ui-small); &:hover { background: var(--background-primary-alt); color: var(--text-normal); } } .obsidian-reader-container { display: grid; grid-template-columns: 1fr auto 1fr; gap: var(--size-4-5); width: 100%; margin: 0 auto; } // Mobile outline overlay .nav-btn-outline { display: none !important; &.is-hidden { display: none !important; } } @media (max-width: 768px) { .nav-btn-outline:not(.is-hidden) { display: flex !important; margin-inline-end: auto; } .obsidian-reader-container { grid-template-columns: 1fr; } .obsidian-reader-active body .obsidian-reader-content { max-width: 90vw; width: 100%; margin: 0 auto; } .obsidian-reader-left-sidebar, .obsidian-reader-right-sidebar { display: none; } }