// mantra · book-grade reader typography // Fraunces (variable) body + IBM Plex Sans (labels) + IBM Plex Mono (non-Latin) // Pergament-ink light · deep-ink dark · 62ch measure // Headings H2 as margin-labels on wide, inline-before on mobile // --- Fonts (self-hosted) --------------------------------------------- @font-face { font-family: "Fraunces"; src: url("/fonts/fraunces-variable.woff2") format("woff2-variations"); font-weight: 100 900; font-style: normal; font-display: swap; } @font-face { font-family: "Fraunces"; src: url("/fonts/fraunces-italic-variable.woff2") format("woff2-variations"); font-weight: 100 900; font-style: italic; font-display: swap; } @font-face { font-family: "IBM Plex Sans"; src: url("/fonts/plex-sans-variable.woff2") format("woff2-variations"); font-weight: 100 900; font-style: normal; font-display: swap; } @font-face { font-family: "IBM Plex Mono"; src: url("/fonts/plex-mono-variable.woff2") format("woff2"); font-weight: 400; font-style: normal; font-display: swap; } // --- Color tokens ---------------------------------------------------- :root { // Pergament (light). Warm paper + cooler ink for thermal tension: // the page is lit, the letters carry the shadow. --mantra-bg: #fdfbf5; --mantra-bg-deep: #f5f0e3; --mantra-fg: #181c22; --mantra-muted: #6e6f70; --mantra-faint: #d6d3d0; --mantra-accent: #5e4b3a; --mantra-hairline: rgba(24, 28, 34, 0.08); --mantra-measure: 62ch; --mantra-serif: "Fraunces", Georgia, "Times New Roman", serif; --mantra-sans: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, system-ui, sans-serif; --mantra-mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, monospace; } @media (prefers-color-scheme: dark) { :root { --mantra-bg: #0f1012; --mantra-fg: #e7e3dd; --mantra-muted: #8a857d; --mantra-faint: #2a2826; --mantra-accent: #c9b999; --mantra-hairline: rgba(231, 227, 221, 0.10); } } // --- Reset + base ---------------------------------------------------- * { box-sizing: border-box; } ::selection { background: var(--mantra-accent); color: var(--mantra-bg); } html, body { margin: 0; padding: 0; background: var(--mantra-bg); color: var(--mantra-fg); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-rendering: optimizeLegibility; } body { font-family: var(--mantra-serif); font-size: 19px; line-height: 1.68; letter-spacing: 0.002em; // Variable-axis tuning: a warmer serif without eccentricity font-variation-settings: "opsz" 18, "SOFT" 30, "WONK" 0, "wght" 400; font-feature-settings: "kern" 1, "liga" 1, "calt" 1, "onum" 1; } a { color: inherit; text-decoration: none; border-bottom: 1px solid var(--mantra-hairline); transition: border-color 0.2s, color 0.2s; } a:hover { border-bottom-color: var(--mantra-accent); color: var(--mantra-accent); } main { max-width: var(--mantra-measure); margin: 0 auto; padding: 6rem 1.5rem 8rem; } @media (max-width: 640px) { main { padding: 3rem 1.25rem 5rem; } body { font-size: 18px; line-height: 1.65; } } // --- Landing -------------------------------------------------------- .landing { max-width: 74ch; } // Silent opening — first screen, room for a breath before the catalog. // Holds the hero title + the root question + a small scroll-hint, then // the catalog unfolds below. .landing-opening { min-height: calc(100vh - 4rem); display: flex; flex-direction: column; justify-content: center; padding: 2rem 0 3rem; position: relative; } .landing-scroll-hint { position: absolute; bottom: 3vh; left: 0; font-family: var(--mantra-sans); font-size: 0.68rem; letter-spacing: 0.22em; text-transform: uppercase; color: var(--mantra-faint); font-variation-settings: "wght" 450; } .landing-catalog { padding-top: 2rem; position: relative; } .landing-catalog-label { font-family: var(--mantra-sans); font-variation-settings: "wght" 500; font-size: 0.68rem; letter-spacing: 0.28em; text-transform: uppercase; color: var(--mantra-muted); margin: 0 0 3rem; padding-bottom: 1rem; border-bottom: 1px solid var(--mantra-hairline); } .landing-head { margin-bottom: 5rem; } .landing-title { font-family: var(--mantra-serif); font-variation-settings: "opsz" 144, "SOFT" 50, "WONK" 0, "wght" 320; font-size: clamp(3.5rem, 8.5vw, 5.5rem); font-weight: 320; line-height: 0.98; letter-spacing: -0.025em; margin: 0; color: var(--mantra-fg); } .landing-subtitle { font-family: var(--mantra-sans); font-variation-settings: "wght" 400; font-size: 0.78rem; color: var(--mantra-muted); text-transform: uppercase; letter-spacing: 0.22em; margin: 1.5rem 0 3.5rem; } .landing-question { font-family: var(--mantra-serif); font-style: italic; font-variation-settings: "opsz" 36, "SOFT" 50, "WONK" 0, "wght" 380; font-size: clamp(1.25rem, 2.4vw, 1.5rem); line-height: 1.4; color: var(--mantra-fg); margin: 0 0 4.5rem; max-width: 32ch; padding-left: 1.4rem; border-left: 2px solid var(--mantra-accent); } .landing-section-label { font-family: var(--mantra-sans); font-variation-settings: "wght" 500; font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.28em; color: var(--mantra-muted); margin: 0 0 1.5rem; } .landing-artifacts { margin-bottom: 6rem; } .artifacts-list { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 1.25rem; } @media (max-width: 760px) { .artifacts-list { grid-template-columns: 1fr; } } .artifact-line a { display: block; border-bottom: none; line-height: 1.45; padding: 1.25rem 1.4rem; border: 1px solid var(--mantra-hairline); border-radius: 6px; background: color-mix(in srgb, var(--mantra-bg) 60%, transparent); transition: border-color 0.18s, transform 0.18s, background 0.18s; } .artifact-line a:hover { border-color: var(--mantra-accent); transform: translateY(-1px); } .artifact-title { display: block; font-family: var(--mantra-serif); font-variation-settings: "opsz" 36, "SOFT" 50, "WONK" 0, "wght" 480; font-size: 1.25rem; color: var(--mantra-fg); letter-spacing: -0.005em; } .artifact-sep { display: none; } .artifact-subtitle { display: block; margin-top: 0.4rem; font-family: var(--mantra-serif); font-style: italic; color: var(--mantra-muted); font-size: 0.9rem; line-height: 1.4; } .artifact-line a:hover .artifact-title { color: var(--mantra-accent); } .landing-cycle { margin-bottom: 5rem; padding-top: 2.5rem; border-top: 1px solid var(--mantra-hairline); &:first-of-type { border-top: none; padding-top: 0; } } .landing-cycle-head { display: grid; grid-template-columns: auto 1fr; gap: 1.8rem; align-items: start; margin-bottom: 3rem; } .landing-cycle-number { font-family: var(--mantra-serif); font-variation-settings: "opsz" 144, "SOFT" 50, "WONK" 0, "wght" 250; font-size: clamp(3.5rem, 6vw, 5rem); line-height: 0.9; letter-spacing: -0.04em; color: var(--mantra-faint); font-feature-settings: "onum" 1, "tnum" 0; } .landing-cycle-headings { padding-top: 0.4rem; } .landing-cycle-title { font-family: var(--mantra-serif); font-variation-settings: "opsz" 72, "SOFT" 50, "WONK" 0, "wght" 400; font-size: clamp(1.6rem, 3vw, 2.1rem); line-height: 1.1; letter-spacing: -0.01em; margin: 0; color: var(--mantra-fg); } .landing-cycle-subtitle { font-family: var(--mantra-sans); font-variation-settings: "wght" 400; font-size: 0.72rem; color: var(--mantra-muted); text-transform: uppercase; letter-spacing: 0.2em; margin: 0.5rem 0 0; } .landing-cycle-question { font-family: var(--mantra-serif); font-style: italic; font-variation-settings: "opsz" 32, "SOFT" 50, "WONK" 0, "wght" 400; font-size: clamp(1rem, 1.8vw, 1.15rem); line-height: 1.45; color: var(--mantra-muted); margin: 1rem 0 0; max-width: 42ch; } @media (max-width: 560px) { .landing-cycle-head { grid-template-columns: 1fr; gap: 0.8rem; } } .landing-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 3.5rem; } @media (max-width: 760px) { .landing-grid { grid-template-columns: 1fr; gap: 3rem; } } .landing-col-label { font-family: var(--mantra-sans); font-variation-settings: "wght" 500; font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.28em; color: var(--mantra-muted); margin: 0 0 1.75rem; } .works-list, .themes-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 1.5rem; } .work-line { a { display: block; border-bottom: none; line-height: 1.35; } a:hover { color: var(--mantra-fg); } a:hover .work-author { color: var(--mantra-accent); } } .work-author { font-family: var(--mantra-serif); font-variation-settings: "opsz" 18, "SOFT" 30, "WONK" 0, "wght" 500; color: var(--mantra-fg); } .work-sep { color: var(--mantra-faint); } .work-title { font-style: italic; color: var(--mantra-muted); } .work-claim { font-family: var(--mantra-serif); font-variation-settings: "opsz" 14, "SOFT" 30, "WONK" 0, "wght" 380; font-size: 0.88rem; color: var(--mantra-muted); line-height: 1.5; margin-top: 0.3rem; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; } .work-claim em { font-style: italic; } .work-claim strong { font-variation-settings: "opsz" 14, "SOFT" 30, "WONK" 0, "wght" 600; } .theme-line a { display: block; border-bottom: none; } .theme-title { font-family: var(--mantra-serif); font-variation-settings: "opsz" 18, "SOFT" 30, "WONK" 0, "wght" 500; } .theme-count { font-family: var(--mantra-sans); color: var(--mantra-muted); font-size: 0.82rem; letter-spacing: 0.02em; } // --- Source page ---------------------------------------------------- .source-breadcrumb { font-family: var(--mantra-sans); font-variation-settings: "wght" 450; font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.22em; color: var(--mantra-muted); margin-bottom: 3rem; .sep { margin: 0 0.5em; color: var(--mantra-faint); } a { color: var(--mantra-muted); border-bottom: none; } a:hover { color: var(--mantra-fg); } } // --- Source hero (title page, shown before body) -------------------- .source-hero { margin: 4.5rem 0 5rem; max-width: var(--mantra-measure); } .source-hero-eyebrow { font-family: var(--mantra-sans); font-variation-settings: "wght" 500; font-size: 0.72rem; letter-spacing: 0.22em; text-transform: uppercase; color: var(--mantra-muted); margin-bottom: 1.5rem; } .source-hero-title { font-family: var(--mantra-serif); font-variation-settings: "opsz" 144, "SOFT" 50, "WONK" 0, "wght" 360; font-size: clamp(2.3rem, 5.5vw, 3.6rem); line-height: 1.03; letter-spacing: -0.018em; margin: 0 0 2.2rem; color: var(--mantra-fg); } .source-hero-claim { font-family: var(--mantra-serif); font-style: italic; font-variation-settings: "opsz" 36, "SOFT" 50, "WONK" 0, "wght" 400; font-size: clamp(1.15rem, 2.2vw, 1.35rem); line-height: 1.5; color: var(--mantra-fg); margin: 0 0 2rem; padding-left: 1.4rem; border-left: 2px solid var(--mantra-accent); max-width: 54ch; display: -webkit-box; -webkit-line-clamp: 5; -webkit-box-orient: vertical; overflow: hidden; } .source-hero-meta { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.5rem; font-family: var(--mantra-sans); font-size: 0.78rem; color: var(--mantra-muted); letter-spacing: 0.02em; } .source-hero-confidence { font-variation-settings: "wght" 500; &[data-level="high"] { color: var(--mantra-accent); } &[data-level="medium"] { color: var(--mantra-muted); } &[data-level="low"] { color: var(--mantra-faint); } } .source-hero-sep { color: var(--mantra-faint); } .source-hero-tags { font-family: var(--mantra-mono); font-size: 0.72rem; color: var(--mantra-faint); letter-spacing: 0.04em; } .source-hero-rule { height: 1px; background: var(--mantra-hairline); width: 6rem; margin-top: 2.5rem; } // --- Source body ---------------------------------------------------- .source-body { // Positioning anchor for H2 margin-labels below. position: relative; // The first H1 is duplicated in the hero; hide here to avoid // repeating the author/title at the top of the body. > h1:first-child { display: none; } // H1 is the work title h1 { font-family: var(--mantra-serif); font-variation-settings: "opsz" 96, "SOFT" 50, "WONK" 0, "wght" 380; font-size: clamp(2rem, 5vw, 2.75rem); line-height: 1.1; letter-spacing: -0.012em; margin: 0 0 2.5rem; color: var(--mantra-fg); } // H2 as margin-label on wide screens (pulled into left margin) h2 { font-family: var(--mantra-sans); font-variation-settings: "wght" 500; font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.24em; color: var(--mantra-muted); font-weight: 500; margin: 3.5rem 0 1.25rem; position: relative; } @media (min-width: 1300px) { h2 { position: absolute; // Pull the label into the left gutter, outside the article box. // Column is 20ch wide (fits long compound labels like // «интеллектуальная родословная» in two lines) + 3rem breathing // room before the paragraph column. left: calc(-20ch - 3rem); margin: 0; padding-top: 0.55rem; width: 20ch; text-align: right; letter-spacing: 0.18em; line-height: 1.35; } h2 + * { margin-top: 3rem; } } h3 { font-family: var(--mantra-serif); font-variation-settings: "opsz" 24, "SOFT" 40, "WONK" 0, "wght" 520; font-size: 1.12rem; letter-spacing: -0.005em; margin: 2.2rem 0 0.8rem; color: var(--mantra-fg); } p { margin: 0 0 1.35rem; hyphens: auto; -webkit-hyphens: auto; } em, i { font-style: italic; font-variation-settings: "opsz" 18, "SOFT" 40, "WONK" 0, "wght" 400; } strong, b { font-variation-settings: "opsz" 18, "SOFT" 30, "WONK" 0, "wght" 600; } a { border-bottom: 1px solid var(--mantra-muted); } a:hover { border-bottom-color: var(--mantra-accent); } blockquote { border-left: 2px solid var(--mantra-accent); margin: 2rem 0 2rem -0.5rem; padding: 0.3rem 0 0.3rem 1.5rem; font-style: italic; font-variation-settings: "opsz" 17, "SOFT" 50, "WONK" 0, "wght" 400; color: var(--mantra-fg); font-size: 0.98rem; p { margin-bottom: 0.6rem; &:last-child { margin-bottom: 0; } } } code { font-family: var(--mantra-mono); font-size: 0.85em; background: var(--mantra-faint); padding: 0.1rem 0.35rem; border-radius: 3px; } pre { font-family: var(--mantra-mono); font-size: 0.82rem; background: var(--mantra-faint); padding: 1rem 1.25rem; border-radius: 6px; overflow-x: auto; margin: 1.75rem 0; line-height: 1.5; code { background: none; padding: 0; font-size: inherit; } } ul, ol { margin: 0 0 1.35rem; padding-left: 1.5rem; } li { margin: 0.3rem 0; } hr { border: none; border-top: 1px solid var(--mantra-hairline); margin: 3rem auto; width: 12ch; } table { width: 100%; border-collapse: collapse; font-size: 0.9rem; margin: 1.5rem 0; th, td { padding: 0.5rem 0.8rem; border-bottom: 1px solid var(--mantra-hairline); text-align: left; vertical-align: top; } th { font-family: var(--mantra-sans); font-variation-settings: "wght" 500; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.15em; color: var(--mantra-muted); } } // Paragraph click-target + margin dot (M.3 margin-layer). // - Empty paragraphs: faint dot appears only on hover (affordance). // - Annotated paragraphs (.has-notes): dot is always visible in the // accent colour, so readers see at a glance where the marginalia is. p[data-para-id] { position: relative; cursor: pointer; } @media (min-width: 900px) { p[data-para-id]::before { content: ""; position: absolute; left: -1.25rem; top: 0.75em; width: 5px; height: 5px; border-radius: 50%; background: var(--mantra-faint); opacity: 0; transition: opacity 0.2s, background 0.2s, transform 0.2s; } p[data-para-id]:hover::before { opacity: 1; background: var(--mantra-muted); } p[data-para-id].has-notes::before { opacity: 1; background: var(--mantra-accent); } p[data-para-id].has-notes:hover::before { transform: scale(1.3); } } } .source-foot { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 1rem; margin-top: 5rem; padding-top: 2rem; border-top: 1px solid var(--mantra-hairline); font-family: var(--mantra-sans); font-size: 0.78rem; letter-spacing: 0.08em; text-transform: uppercase; color: var(--mantra-muted); a { border-bottom: none; color: var(--mantra-muted); } a:hover { color: var(--mantra-fg); } .nav-prev { justify-self: start; } .nav-home { justify-self: center; } .nav-next { justify-self: end; } } // --- Theme page ----------------------------------------------------- .theme-h1 { font-family: var(--mantra-serif); font-variation-settings: "opsz" 72, "SOFT" 50, "WONK" 0, "wght" 380; font-size: clamp(2rem, 4.5vw, 2.75rem); line-height: 1.1; letter-spacing: -0.01em; margin: 0 0 2rem; color: var(--mantra-fg); } .theme-desc { margin-bottom: 3rem; p { color: var(--mantra-fg); margin-bottom: 1.2rem; } } .theme-contributing { margin-top: 3rem; } // --- Misc ----------------------------------------------------------- // --- Language toggle (top-right) --- .lang-toggle { position: fixed; top: 1.25rem; right: 1.5rem; z-index: 10; display: flex; align-items: center; gap: 0.4rem; font-family: var(--mantra-sans); font-variation-settings: "wght" 450; font-size: 0.78rem; letter-spacing: 0.1em; a { color: var(--mantra-faint); text-decoration: none; border-bottom: none; padding: 0.1rem 0.1rem; transition: color 0.15s; } a:hover { color: var(--mantra-fg); } a.lang-active { color: var(--mantra-fg); font-variation-settings: "wght" 600; } .lang-dot { color: var(--mantra-faint); } } @media (max-width: 640px) { .lang-toggle { top: 1rem; right: 1rem; font-size: 0.72rem; } } .err { color: #b45309; font-family: var(--mantra-mono); font-size: 0.88rem; } .not-found { padding: 2rem 0; } .back-link { color: var(--mantra-muted); font-family: var(--mantra-sans); font-size: 0.85rem; border-bottom: none; } // --- Inspector (v0.3 persistent right panel) ------------------------ // Reader frame: article centered in remaining space, inspector fixed right. // On wide screens we reserve the inspector's width via padding-right on // the frame — this keeps `main { margin: 0 auto }` genuinely centered // in the visible reading area instead of being pushed sideways. .reader-frame { position: relative; transition: padding-right 0.2s; } @media (min-width: 1180px) { .reader-frame { padding-right: 400px; } } .inspector { position: fixed; top: 0; right: 0; bottom: 0; width: 380px; background: var(--mantra-bg); border-left: 1px solid var(--mantra-hairline); z-index: 15; display: flex; flex-direction: column; font-family: var(--mantra-sans); font-size: 0.92rem; color: var(--mantra-fg); overflow: hidden; } @media (max-width: 1180px) { .inspector { position: fixed; top: auto; right: 0; left: 0; bottom: 0; width: 100vw; max-height: 55vh; border-left: none; border-top: 1px solid var(--mantra-hairline); box-shadow: 0 -6px 20px rgba(0, 0, 0, 0.06); } } .inspector-head { padding: 0.9rem 1.1rem 0.7rem; border-bottom: 1px solid var(--mantra-hairline); text-align: center; } .inspector-tabs { display: inline-flex; gap: 0.2rem; .tab { background: transparent; border: none; cursor: pointer; font-family: var(--mantra-sans); font-size: 0.8rem; font-variation-settings: "wght" 450; letter-spacing: 0.08em; text-transform: lowercase; color: var(--mantra-muted); padding: 0.3rem 0.9rem; border-radius: 14px; transition: color 0.15s, background 0.15s; &:hover { color: var(--mantra-fg); } &.tab-active { color: var(--mantra-bg); background: var(--mantra-accent); font-variation-settings: "wght" 600; } } } .inspector-anchor { padding: 0.7rem 1.1rem; border-bottom: 1px solid var(--mantra-hairline); min-height: 3.2rem; } .inspector-hint { font-family: var(--mantra-serif); font-style: italic; font-size: 0.85rem; color: var(--mantra-faint); margin: 0; line-height: 1.4; } .inspector-anchor-chip { display: flex; align-items: flex-start; gap: 0.4rem; position: relative; } .inspector-excerpt { flex: 1; font-family: var(--mantra-serif); font-style: italic; font-size: 0.86rem; line-height: 1.5; color: var(--mantra-muted); max-height: 5.5em; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; padding-left: 0.6rem; border-left: 2px solid var(--mantra-hairline); &.is-selection { border-left-color: var(--mantra-accent); color: var(--mantra-fg); } } .inspector-anchor-clear { background: transparent; border: none; cursor: pointer; color: var(--mantra-faint); font-family: var(--mantra-serif); font-size: 1.1rem; line-height: 1; padding: 0 0.25rem; transition: color 0.15s; &:hover { color: var(--mantra-fg); } } .inspector-form { padding: 0.9rem 1.1rem 1rem; display: flex; flex-direction: column; gap: 0.6rem; border-bottom: 1px solid var(--mantra-hairline); } .inspector-input { width: 100%; resize: vertical; min-height: 4.5rem; background: var(--mantra-bg); color: var(--mantra-fg); border: 1px solid var(--mantra-hairline); border-radius: 4px; padding: 0.55rem 0.7rem; font-family: var(--mantra-serif); font-size: 0.95rem; line-height: 1.45; transition: border-color 0.15s; &:focus { outline: none; border-color: var(--mantra-accent); } } .inspector-actions { display: flex; align-items: center; gap: 0.8rem; } .inspector-author { display: inline-flex; align-items: center; gap: 0.35rem; flex: 1; min-width: 0; .inspector-author-label { font-size: 0.72rem; color: var(--mantra-muted); letter-spacing: 0.06em; text-transform: lowercase; font-variation-settings: "wght" 500; } .inspector-author-input { flex: 1; min-width: 0; background: transparent; border: none; border-bottom: 1px dashed var(--mantra-faint); font-family: var(--mantra-sans); font-size: 0.82rem; color: var(--mantra-fg); padding: 0.1rem 0 0.15rem; outline: none; transition: border-color 0.15s; &:focus { border-bottom-color: var(--mantra-accent); } &::placeholder { color: var(--mantra-faint); } } } .inspector-submit { background: var(--mantra-accent); color: var(--mantra-bg); border: none; border-radius: 14px; padding: 0.45rem 1.1rem; font-family: var(--mantra-sans); font-size: 0.82rem; font-variation-settings: "wght" 600; letter-spacing: 0.06em; text-transform: lowercase; cursor: pointer; transition: opacity 0.15s, transform 0.12s; &:hover:not(:disabled) { transform: translateY(-1px); } &:disabled { opacity: 0.4; cursor: not-allowed; } } .inspector-error { color: #b45309; font-family: var(--mantra-mono); font-size: 0.78rem; margin: 0; word-break: break-word; } .inspector-entries { flex: 1 1 auto; overflow-y: auto; padding: 0.7rem 1.1rem 1rem; display: flex; flex-direction: column; gap: 0.9rem; } .inspector-entries-label { font-family: var(--mantra-sans); font-size: 0.68rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--mantra-muted); margin-bottom: 0.2rem; &:empty { display: none; } } // --- Selection popover (floating over selected text) ---------------- .selpop { position: fixed; transform: translate(-50%, -100%); z-index: 30; display: flex; align-items: center; gap: 0; background: var(--mantra-fg); color: var(--mantra-bg); border-radius: 18px; padding: 0.2rem 0.3rem; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15); font-family: var(--mantra-sans); font-size: 0.78rem; animation: selpop-in 0.12s ease-out; white-space: nowrap; } @keyframes selpop-in { from { opacity: 0; transform: translate(-50%, -95%); } to { opacity: 1; transform: translate(-50%, -100%); } } .selpop::after { content: ""; position: absolute; left: 50%; bottom: -5px; transform: translateX(-50%) rotate(45deg); width: 10px; height: 10px; background: var(--mantra-fg); } .selpop-btn { background: transparent; border: none; color: var(--mantra-bg); cursor: pointer; padding: 0.35rem 0.7rem; border-radius: 14px; font-family: var(--mantra-sans); font-size: 0.78rem; font-variation-settings: "wght" 500; letter-spacing: 0.04em; display: inline-flex; align-items: center; gap: 0.3rem; transition: background 0.12s; &:hover { background: rgba(255, 255, 255, 0.1); } } .selpop-ask { color: var(--mantra-bg); font-variation-settings: "wght" 600; } .selpop-ico { color: var(--mantra-accent); font-size: 0.9rem; } .selpop-sep { width: 1px; height: 16px; background: rgba(255, 255, 255, 0.15); margin: 0 0.15rem; } .selpop-close { padding: 0.35rem 0.55rem; font-size: 1rem; line-height: 1; } .margin-empty { color: var(--mantra-muted); font-style: italic; font-family: var(--mantra-serif); font-size: 0.9rem; margin: 1.2rem 0; text-align: center; } .note-card { border-left: 2px solid var(--mantra-hairline); padding: 0.1rem 0 0.1rem 0.8rem; &.note-card-ask { border-left-color: var(--mantra-accent); } .note-card-meta { font-size: 0.72rem; letter-spacing: 0.08em; color: var(--mantra-muted); margin-bottom: 0.3rem; font-variation-settings: "wght" 500; } .note-q { font-family: var(--mantra-serif); font-style: italic; font-size: 0.94rem; line-height: 1.5; margin: 0 0 0.5rem; color: var(--mantra-fg); } .note-a { font-family: var(--mantra-serif); font-size: 0.94rem; line-height: 1.55; margin: 0; color: var(--mantra-fg); white-space: pre-wrap; } } .margin-drawer-form { padding: 0.9rem 1.1rem 1rem; display: flex; flex-direction: column; gap: 0.6rem; } .margin-drawer-input { width: 100%; resize: vertical; min-height: 4.5rem; background: var(--mantra-bg); color: var(--mantra-fg); border: 1px solid var(--mantra-hairline); border-radius: 4px; padding: 0.55rem 0.7rem; font-family: var(--mantra-serif); font-size: 0.95rem; line-height: 1.45; transition: border-color 0.15s; &:focus { outline: none; border-color: var(--mantra-accent); } } .margin-drawer-actions { display: flex; align-items: center; gap: 0.8rem; } .margin-drawer-author { display: inline-flex; align-items: center; gap: 0.35rem; flex: 1; min-width: 0; .margin-drawer-author-label { font-size: 0.72rem; color: var(--mantra-muted); letter-spacing: 0.06em; text-transform: lowercase; font-variation-settings: "wght" 500; } .margin-drawer-author-input { flex: 1; min-width: 0; background: transparent; border: none; border-bottom: 1px dashed var(--mantra-faint); font-family: var(--mantra-sans); font-size: 0.82rem; color: var(--mantra-fg); padding: 0.1rem 0 0.15rem; outline: none; transition: border-color 0.15s; &:focus { border-bottom-color: var(--mantra-accent); } &::placeholder { color: var(--mantra-faint); } } } .margin-drawer-submit { background: var(--mantra-accent); color: var(--mantra-bg); border: none; border-radius: 14px; padding: 0.45rem 1.1rem; font-family: var(--mantra-sans); font-size: 0.82rem; font-variation-settings: "wght" 600; letter-spacing: 0.06em; text-transform: lowercase; cursor: pointer; transition: opacity 0.15s, transform 0.12s; &:hover:not(:disabled) { transform: translateY(-1px); } &:disabled { opacity: 0.4; cursor: not-allowed; } } .margin-drawer-error { color: #b45309; font-family: var(--mantra-mono); font-size: 0.78rem; margin: 0; word-break: break-word; } // Mobile: drawer becomes a bottom sheet @media (max-width: 720px) { .margin-drawer { top: auto; right: 0; left: 0; bottom: 0; width: 100vw; max-height: 75vh; border-left: none; border-top: 1px solid var(--mantra-hairline); box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.08); animation: drawer-up 0.22s ease-out; } @keyframes drawer-up { from { transform: translateY(16px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } } // --- v0.4 polish: focus mode, reading thread, dwell trace ------------ // Focus mode: hides chrome, widens reading area, fades the inspector. // Toggled by F or the "focus·f" corner button. .reader-frame.focus-mode { .lang-toggle, .source-breadcrumb, .source-foot { opacity: 0; pointer-events: none; transition: opacity 0.3s ease-out; } .inspector { transform: translateX(calc(100% - 2rem)); transition: transform 0.35s cubic-bezier(0.2, 0.7, 0.25, 1); opacity: 0.3; } .inspector:hover { opacity: 1; transform: translateX(0); } } @media (min-width: 1180px) { .reader-frame.focus-mode { padding-right: 0; } .reader-frame.focus-mode > main.source { max-width: 68ch; } } // Focus-exit corner pill — only appears when focus-mode is on. .focus-exit { position: fixed; bottom: 2rem; right: 2rem; z-index: 25; background: var(--mantra-fg); color: var(--mantra-bg); border: none; border-radius: 18px; padding: 0.45rem 0.95rem; font-family: var(--mantra-sans); font-size: 0.7rem; letter-spacing: 0.14em; text-transform: lowercase; font-variation-settings: "wght" 500; cursor: pointer; box-shadow: 0 6px 18px rgba(0, 0, 0, 0.18); transition: transform 0.15s; animation: focus-exit-in 0.25s ease-out; } .focus-exit:hover { transform: translateY(-2px); } @keyframes focus-exit-in { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } // Reading progress thread — 2px line along bottom, scales horizontally // as the reader scrolls through the source. .reading-thread { position: fixed; left: 0; right: 0; bottom: 0; height: 2px; z-index: 20; background: transparent; pointer-events: none; } .reading-thread-fill { display: block; height: 100%; width: 100%; background: var(--mantra-accent); transform-origin: left center; transform: scaleX(0); transition: transform 0.18s ease-out; opacity: 0.7; } // Dwell trace — reader spent ≥12s on this paragraph; a small marker // shows up in the margin. Personal, stored in localStorage. // Distinct from .has-notes (public): dwell is the readers trace. .source-body p[data-para-id].dwelled { &::after { content: ""; position: absolute; right: -1.25rem; top: 0.75em; width: 4px; height: 4px; border-radius: 50%; background: var(--mantra-muted); opacity: 0.4; transition: opacity 0.3s, transform 0.3s; } &:hover::after { opacity: 0.7; transform: scale(1.3); } } @media (max-width: 900px) { .source-body p[data-para-id].dwelled::after { display: none; } } // --- v0.4.1 push-to-100: staggered hero, heavier artifact, focus anim --- // Staggered reveal — source hero unfolds сверху-вниз, не вспышкой .source-hero > * { opacity: 0; transform: translateY(6px); animation: hero-rise 0.6s cubic-bezier(0.2, 0.7, 0.25, 1) forwards; } .source-hero > *:nth-child(1) { animation-delay: 0.08s; } .source-hero > *:nth-child(2) { animation-delay: 0.22s; } .source-hero > *:nth-child(3) { animation-delay: 0.42s; } .source-hero > *:nth-child(4) { animation-delay: 0.56s; } .source-hero > *:nth-child(5) { animation-delay: 0.72s; } .source-body { opacity: 0; animation: body-rise 0.7s ease-out 0.9s forwards; } @keyframes hero-rise { to { opacity: 1; transform: translateY(0); } } @keyframes body-rise { to { opacity: 1; } } // Respect prefers-reduced-motion @media (prefers-reduced-motion: reduce) { .source-hero > *, .source-body { animation: none; opacity: 1; transform: none; } } // Artifact typography — тяжелее, плотнее, визуально весомее чем distillation. // Напряжение между регистрами: distillate — лёгкая живая нота; artifact — // первая кость, которую держат. .source.artifact { .source-hero-title { font-variation-settings: "opsz" 144, "SOFT" 30, "WONK" 0, "wght" 480; letter-spacing: -0.022em; } .source-body { font-variation-settings: "opsz" 18, "SOFT" 20, "WONK" 0, "wght" 430; line-height: 1.72; } .source-body h2 { font-variation-settings: "wght" 600; letter-spacing: 0.22em; } .source-body strong { font-variation-settings: "opsz" 18, "SOFT" 20, "WONK" 0, "wght" 680; } } // Focus mode — при входе выдох «тушения комнаты»: фон на мгновение // темнеет до deep-pergament, chrome выдыхает, затем фон возвращается. .reader-frame.focus-mode { animation: room-dim 0.6s ease-out; } @keyframes room-dim { 0% { background: var(--mantra-bg); } 40% { background: var(--mantra-bg-deep); } 100% { background: var(--mantra-bg); } } @media (prefers-reduced-motion: reduce) { .reader-frame.focus-mode { animation: none; } } // Featured work — «сегодня» one source in focus, rotates by day. The // rest of the corpus is shown below, but this one карта has typographic // weight that others don't. Principle 5 (граница) — ONE thing in focus, // the 33 others are available but not shown with the same gravity. .featured-work { margin-bottom: 5rem; padding-bottom: 2rem; border-bottom: 1px solid var(--mantra-hairline); } .featured-label { font-family: var(--mantra-sans); font-variation-settings: "wght" 500; font-size: 0.7rem; letter-spacing: 0.28em; text-transform: uppercase; color: var(--mantra-accent); margin-bottom: 1.5rem; } .featured-card { display: block; text-decoration: none; border-bottom: none; padding: 0; transition: transform 0.25s cubic-bezier(0.2, 0.7, 0.25, 1); } .featured-card:hover { transform: translateX(2px); } .featured-author { font-family: var(--mantra-serif); font-variation-settings: "opsz" 24, "SOFT" 30, "WONK" 0, "wght" 520; font-size: 1.05rem; color: var(--mantra-fg); margin-bottom: 0.4rem; } .featured-title { font-family: var(--mantra-serif); font-variation-settings: "opsz" 72, "SOFT" 50, "WONK" 0, "wght" 420; font-size: clamp(1.6rem, 3vw, 2.2rem); line-height: 1.15; letter-spacing: -0.012em; margin: 0 0 1.3rem; color: var(--mantra-fg); } .featured-claim { font-family: var(--mantra-serif); font-style: italic; font-variation-settings: "opsz" 24, "SOFT" 30, "WONK" 0, "wght" 400; font-size: 1.05rem; line-height: 1.55; color: var(--mantra-muted); max-width: 58ch; display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden; } .featured-claim em { font-style: italic; color: var(--mantra-fg); } .featured-claim strong { font-variation-settings: "opsz" 24, "SOFT" 30, "WONK" 0, "wght" 600; color: var(--mantra-fg); }