/* ========================================================================== Emby Developer site theme Re-skins the docfx output to match the emby.media website redesign. Loaded after docfx.css/main.css/header.css so it can safely override their color and header rules. ========================================================================== */ /* ------------------------------------------------------------------------- FONTS Self-hosted locally (this site lives on a different origin than emby.media, e.g. dev.emby.media, so we can't share emby.media's cached copy the way the support site does). font-display: block (not swap) since the file is local/fast to load - this briefly holds text rendering instead of flashing the fallback font and then visibly swapping to Inter. ------------------------------------------------------------------------- */ @font-face { font-family: "Inter"; src: url("../fonts/InterVariable.woff2") format("woff2"); font-style: normal; font-weight: 100 900; font-display: block; } @font-face { font-family: "Inter"; src: url("../fonts/InterVariable-Italic.woff2") format("woff2"); font-style: italic; font-weight: 100 900; font-display: block; } /* ------------------------------------------------------------------------- COLOR VARIABLES `--modern-*` mirror the variables used on the main website (see resources/modern-theme.css) so the two can be kept in sync. The legacy `--header-*`/`--highlight-*`/etc. names are still used throughout main.css; aliasing them here re-themes those rules too. ------------------------------------------------------------------------- */ :root { --modern-bg: #090d0f; --modern-surface: #111719; --modern-surface-2: #172023; --modern-text: #f7f9f8; --modern-muted: #a7b2ae; --modern-line: rgba(255, 255, 255, .1); --modern-green: #75d66d; --modern-green-deep: #52b54b; --modern-button-green: #75d66d; --header-bg-color: var(--modern-surface); --header-ft-color: var(--modern-text); --highlight-light: var(--modern-green); --highlight-dark: var(--modern-green-deep); --accent-dim: var(--modern-line); --accent-super-dim: var(--modern-surface-2); --font-color: var(--modern-text); --toc-font-color: var(--modern-muted); --tab-hover-color: var(--modern-surface-2); --card-box-shadow: 0 18px 42px rgba(0, 0, 0, .12); --search-box-shadow: 0 18px 45px rgba(0, 0, 0, .14); --header-height: 76px; --header-height-mobile: 68px; --subnav-height: 62px; --subnav-height-mobile: 56px; } /* ------------------------------------------------------------------------- BASE ------------------------------------------------------------------------- */ html { background: var(--modern-bg); scroll-behavior: smooth; } body { background: var(--modern-bg); font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; -webkit-font-smoothing: antialiased; } h1, h2, h3, h4, h5, h6 { color: var(--modern-text); } h1 { color: var(--modern-text); font-weight: 700; letter-spacing: -.02em; } strong, b, optgroup { color: var(--modern-text); } ::selection { background: rgba(117, 214, 109, .35); } a:focus-visible, button:focus-visible, input:focus-visible { outline: 2px solid var(--modern-green); outline-offset: 2px; } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } *, *::before, *::after { transition: none !important; } } /* ------------------------------------------------------------------------- PAGE CHROME The .site-header and the breadcrumb/search subnav are both fixed and stacked (subnav sits right under the header). docfx's own CSS makes .sidefilter/.sidetoc/.sideaffix position:fixed too, so #wrapper's padding and those elements' `top` must both clear header + subnav. ------------------------------------------------------------------------- */ #wrapper { padding-top: calc(var(--header-height) + var(--subnav-height)); } .article { margin-top: 0; } .sidefilter, .sideaffix { top: calc(var(--header-height) + var(--subnav-height) + 16px); } .sidetoc { top: calc(var(--header-height) + var(--subnav-height) + 60px); } @media only screen and (max-width: 900px) { #wrapper { padding-top: calc(var(--header-height-mobile) + var(--subnav-height-mobile)); } .sidefilter, .sideaffix { top: calc(var(--header-height-mobile) + var(--subnav-height-mobile) + 16px); } .sidetoc { top: calc(var(--header-height-mobile) + var(--subnav-height-mobile) + 56px); } } /* ------------------------------------------------------------------------- SITE HEADER / NAVIGATION Mirrors the main website's .site-header component. ------------------------------------------------------------------------- */ .site-header { position: fixed; inset: 0 0 auto; z-index: 1000; height: var(--header-height); background: rgba(9, 13, 15, .82); border-bottom: 1px solid var(--modern-line); backdrop-filter: blur(18px); } .site-header .nav { display: flex; align-items: center; gap: 32px; height: var(--header-height); } /* Bootstrap's .container::before/::after clearfix become phantom flex items once .container is flexed, offsetting the real content by however much space they (and their surrounding `gap`) take up. */ .site-header .nav::before, .site-header .nav::after { display: none; content: none; } .site-header .brand { display: inline-flex; align-items: center; flex: 0 0 auto; } .site-header .brand img { display: block; height: 102px; width: auto; max-width: none; } .site-header .brand .logo-on-light { display: none; } .site-header .nav-links { display: flex; align-items: center; gap: 30px; margin-left: auto; margin-right: 3px; } .site-header .nav-links-list { display: contents; } .site-header .nav-links-list li { list-style: none; } .site-header .nav-links a { padding: 0; color: #d9e0dd; font-size: 15px; font-weight: 650; line-height: 1.5; white-space: nowrap; } .site-header .nav-links a:hover, .site-header .nav-links a.is-current, .site-header .nav-links a.active { color: var(--modern-green); } .site-header .menu-button { display: none; margin-left: auto; padding: 8px; color: #fff; background: none; border: 0; font-size: 26px; line-height: 1; } @media only screen and (max-width: 900px) { .site-header { height: var(--header-height-mobile); } .site-header .nav { height: var(--header-height-mobile); gap: 16px; } .site-header .menu-button { display: block; } .site-header .nav-links { display: none; position: absolute; inset: var(--header-height-mobile) 14px auto; padding: 18px; flex-direction: column; align-items: stretch; gap: 4px; background: var(--modern-surface); border: 1px solid var(--modern-line); border-radius: 16px; box-shadow: 0 24px 48px rgba(0, 0, 0, .4); } .site-header .nav-links.open { display: flex; } .site-header .nav-links a { padding: 12px; } } /* ------------------------------------------------------------------------- BREADCRUMB / SEARCH SUBNAV Fixed right under the .site-header (see PAGE CHROME for the matching #wrapper padding and sidebar offsets). ------------------------------------------------------------------------- */ .subnav.navbar { position: fixed; inset: var(--header-height) 0 auto; z-index: 999; height: var(--subnav-height); margin: 0; padding: 0; display: flex; align-items: center; background: var(--modern-bg); border-bottom: 1px solid var(--modern-line); border-radius: 0; box-shadow: none; } @media only screen and (max-width: 900px) { .subnav.navbar { inset: var(--header-height-mobile) 0 auto; height: var(--subnav-height-mobile); } } .subnav .container { display: flex; align-items: center; gap: 20px; flex-wrap: wrap; } .subnav .container::before, .subnav .container::after { display: none; content: none; } .subnav #breadcrumb { flex: 1 1 auto; } .breadcrumb { margin: 0; padding: 0; background: none; } .breadcrumb li { color: var(--modern-muted); font-weight: 650; } .breadcrumpsearch { flex: 0 0 auto; margin-right: -5px; } .breadcrumpsearch .navbar-form { margin: 0; padding: 0; } .breadcrumpsearch .form-group { margin: 0; position: relative; } .breadcrumpsearch .form-group .fa-search { position: absolute; top: 50%; left: 14px; color: var(--modern-green); font-size: 13px; transform: translateY(-50%); pointer-events: none; } #search .form-control, #toc_filter_input { height: 32px; padding: 0 14px; color: var(--modern-text); background: var(--modern-surface); border: 1px solid var(--modern-line); border-radius: 10px; box-shadow: none; } .toc-filter > .clear-icon { right: 10px; } #search .form-control { width: 220px; padding-left: 34px; } #search .form-control::placeholder, #toc_filter_input::placeholder { color: var(--modern-muted); } #search .form-control:focus, #toc_filter_input:focus { border-color: var(--modern-green); outline: 2px solid rgba(117, 214, 109, .24); outline-offset: 1px; } /* ------------------------------------------------------------------------- SIDEBAR / TABLE OF CONTENTS ------------------------------------------------------------------------- */ .sidefilter, .sidetoc, .sidetoc > .toc { background-color: var(--modern-bg); } .toc-filter { box-shadow: none; } .toc .nav > li.active > a, .toc .nav > li.active > a:hover, .toc .nav > li.active > a:focus { color: var(--modern-green); } .affix ul > li.active > a, .affix ul > li.active > a:before { color: var(--modern-green); } .expand-stub { color: var(--modern-muted); } /* ------------------------------------------------------------------------- CONTENT: links, alerts, code, tables, images ------------------------------------------------------------------------- */ article h4 { border-bottom-color: var(--modern-line); } .alert-info > h5 { color: #8ecbf5; background-color: rgba(25, 118, 210, .16); border-bottom-color: #3f9fe0; } .alert-warning > h5 { color: #f5c26b; background-color: rgba(245, 127, 23, .16); border-bottom-color: #f5a623; } .alert-danger > h5 { color: #f28b8b; background-color: rgba(211, 47, 47, .18); border-bottom-color: #e35b5b; } pre { color: var(--modern-text); background-color: var(--modern-surface-2); } code { color: var(--modern-green); background-color: var(--modern-surface-2); } pre code { color: inherit; background: none; } blockquote { color: var(--modern-muted); background: var(--modern-surface); border-left: 4px solid var(--modern-line); font-size: inherit; } table { color: var(--modern-muted); background: var(--modern-surface); border: 1px solid var(--modern-line); } th { color: var(--modern-text); background: var(--modern-surface-2); } td, th { border-color: var(--modern-line) !important; } hr { border-color: var(--modern-line); } input[type="text"], input[type="email"], input[type="search"], input[type="password"], input[type="number"], select, textarea { color: var(--modern-text); background: var(--modern-surface); border: 1px solid var(--modern-line); } .article img { border-radius: 10px; box-shadow: 0 18px 42px rgba(0, 0, 0, .14); } /* ------------------------------------------------------------------------- SEARCH RESULTS ------------------------------------------------------------------------- */ #search-results { color: var(--modern-text); } #search-results .search-list { color: var(--modern-muted); } #search-results mark { color: inherit; background: rgba(117, 214, 109, .35); } .pagination > li > a, .pagination > li > span { color: var(--modern-text); background-color: var(--modern-surface); border-color: var(--modern-line); } .pagination > .active > a, .pagination > .active > span { color: #0d1210; background-color: var(--modern-green); border-color: var(--modern-green); } /* ------------------------------------------------------------------------- FOOTER ------------------------------------------------------------------------- */ footer .footer { padding: 26px 0; color: var(--modern-muted); background-color: var(--modern-bg); border-top: 1px solid var(--modern-line); } footer .footer a.lnk { color: var(--modern-green); } footer .footer a.lnk:hover { color: var(--modern-text); } .contribution-link { opacity: .7; } .contribution-link:hover { opacity: 1; } /* ------------------------------------------------------------------------- LIGHT THEME Matches the main website's light palette (currently its live default). ------------------------------------------------------------------------- */ html[data-theme="light"] { --modern-bg: #f7f8f9; --modern-surface: #ffffff; --modern-surface-2: #f1f3f5; --modern-text: #18201d; --modern-muted: #5f6f65; --modern-line: rgba(24, 32, 29, .12); --modern-green: #418f3c; --modern-green-deep: #367b32; --modern-button-green: #52b54b; } html[data-theme="light"] .site-header { background: rgba(255, 255, 255, .95); border-bottom-color: rgba(24, 32, 29, .12); box-shadow: 0 8px 24px rgba(25, 31, 28, .06); } html[data-theme="light"] .site-header .brand .logo-on-dark { display: none; } html[data-theme="light"] .site-header .brand .logo-on-light { display: block; } html[data-theme="light"] .site-header .nav-links a { color: #2d3b33; } html[data-theme="light"] .site-header .nav-links a:hover, html[data-theme="light"] .site-header .nav-links a.is-current, html[data-theme="light"] .site-header .nav-links a.active { color: var(--modern-green); } html[data-theme="light"] .site-header .menu-button { color: #142019; } html[data-theme="light"] .site-header .nav-links { background: #ffffff; } html[data-theme="light"] .alert-info > h5 { color: #1976d2; } html[data-theme="light"] .alert-warning > h5 { color: #b96a00; } html[data-theme="light"] .alert-danger > h5 { color: #d32f2f; } html[data-theme="light"] code { color: var(--modern-green-deep); } html[data-theme="light"] .pagination > .active > a, html[data-theme="light"] .pagination > .active > span { color: #ffffff; }