UNPKG

docsify

Version:

A magical documentation generator.

1,569 lines (1,537 loc) 54.4 kB
/* Variables: Basic */ /* ========================================================================== */ :root { /* Color */ --color-bg : #fff; --color-text : #333; --theme-color: #0b85d7; /* Color: Monochromatic */ --color-mono-min: var(--color-bg); --color-mono-1 : color-mix(in srgb, var(--color-mono-min), var(--color-mono-max) 5%); --color-mono-2 : color-mix(in srgb, var(--color-mono-min), var(--color-mono-max) 10%); --color-mono-3 : color-mix(in srgb, var(--color-mono-min), var(--color-mono-max) 20%); --color-mono-4 : color-mix(in srgb, var(--color-mono-min), var(--color-mono-max) 32%); --color-mono-5 : color-mix(in srgb, var(--color-mono-max), var(--color-mono-min) 50%); --color-mono-6 : color-mix(in srgb, var(--color-mono-max), var(--color-mono-min) 32%); --color-mono-7 : color-mix(in srgb, var(--color-mono-max), var(--color-mono-min) 20%); --color-mono-8 : color-mix(in srgb, var(--color-mono-max), var(--color-mono-min) 10%); --color-mono-9 : color-mix(in srgb, var(--color-mono-max), var(--color-mono-min) 5%); --color-mono-max: var(--color-text); /* Color: Theme Shades (darker) & Tints (lighter)*/ /* NOTE: Values derived from --theme-color */ --theme-color-1: color-mix(in srgb, var(--theme-color), var(--color-mono-min) 90%); --theme-color-2: color-mix(in srgb, var(--theme-color), var(--color-mono-min) 75%); --theme-color-3: color-mix(in srgb, var(--theme-color), var(--color-mono-min) 55%); --theme-color-4: color-mix(in srgb, var(--theme-color), var(--color-mono-min) 30%); --theme-color-5: color-mix(in srgb, var(--theme-color), var(--color-mono-max) 30%); --theme-color-6: color-mix(in srgb, var(--theme-color), var(--color-mono-max) 55%); --theme-color-7: color-mix(in srgb, var(--theme-color), var(--color-mono-max) 75%); --theme-color-8: color-mix(in srgb, var(--theme-color), var(--color-mono-max) 90%); /* Typography */ --font-family : system-ui, sans-serif; --font-family-emoji: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; --font-family-mono : ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace; --font-size : 16px; /* px */ --font-size-xxxl : calc(var(--font-size-xxl) * var(--modular-scale)); --font-size-xxl : calc(var(--font-size-xl) * var(--modular-scale)); --font-size-xl : calc(var(--font-size-l) * var(--modular-scale)); --font-size-l : calc(1rem * var(--modular-scale)); --font-size-m : var(--font-size); --font-size-s : max(13px, calc(var(--font-size-m) / var(--modular-scale))); --font-size-xs : max(11px, calc(var(--font-size-s) / var(--modular-scale))); --font-size-emoji : 1.2em; --font-size-mono : 0.875rem; --font-weight : 350; --font-weight-mono : var(--font-weight); --line-height : 1.6; --modular-scale : 1.250; /* 1.067, 1.125, 1.200, 1.250, 1.333, 1.414, 1.500, 1.618 */ /* Common */ --border-color : var(--color-mono-2); --border-radius : 3px; /* Single value */ --duration-slow : 500ms; --duration-medium : 250ms; --duration-fast : 150ms; --margin-block : 1rem; /* Single value */ --scroll-padding-top: var(--margin-block); /* Content */ --content-margin-inline: 45px; /* Single value */ --content-max-width : 72ch; /* Cover */ --cover-bg : unset; --cover-bg-brightness: 1; --cover-bg-overlay : radial-gradient(transparent 60%, rgba(0, 0, 0, 0.1)); --cover-color : ; --cover-title-color : var(--strong-color); --cover-title-font : var(--font-size-xxxl) var(--font-family); /* Elements */ --blockquote-bg : ; --blockquote-border-color : var(--theme-color); --blockquote-border-radius : 0; --blockquote-border-width : 0 0 0 4px; --blockquote-color : var(--color-mono-6); --blockquote-padding : 0 0 0 1.5em; --button-bg : var(--theme-color); --button-border-radius : 100vh; --button-color : #fff; --button-padding : 0.3em 1.25em 0.315em 1.25em; --callout-bg : var(--color-mono-1); --callout-border-color : ; --callout-border-radius : var(--border-radius); --callout-border-width : 1px; --callout-charm-bg : ; --callout-charm-border-radius : 100vh; --callout-charm-color : #fff; --callout-charm-content : ''; --callout-charm-font-size : 16px; --callout-charm-inset : 1em auto auto 15px; --callout-charm-size : 26px; --callout-charm-translate : 0; --callout-color : ; --callout-padding : 1em 1em 1em calc(25px + var(--callout-charm-size)); --code-bg : var(--color-mono-1); --code-color : ; --codeblock-bg : var(--code-bg); --codeblock-color : var(--code-color); --codeblock-comment : #6e8090; --codeblock-function : #dd4a68; --codeblock-important : #c94922; --codeblock-keyword : #07a; --codeblock-operator : #a67f59; --codeblock-property : #c08b30; --codeblock-punctuation : #999; --codeblock-selector : #690; --codeblock-tag : #905; --codeblock-variable : #e90; --form-element-bg : var(--color-mono-1); --form-element-border-color : var(--color-mono-3); --form-element-border-radius : var(--border-radius); --form-element-color : ; --heading-color : var(--strong-color); --heading-font-weight : 600; --heading-line-height : calc(2ex + 5px); /* Unit required */ --kbd-bg : var(--color-mono-1); --kbd-border : 1px solid var(--color-mono-3); --kbd-border-radius : 4px; --kbd-color : var(--color-mono-5); --kbd-alt-bg : var(--color-mono-1); --kbd-alt-border : none; --kbd-alt-border-radius : var(--kbd-border-radius); --kbd-alt-box-shadow : 0 2px 0 1px var(--color-mono-3); --kbd-alt-color : var(--kbd-color); --link-color : ; --link-color-hover : var(--theme-color); --link-underline-color : var(--theme-color); --link-underline-color-hover : var(--link-underline-color); --link-underline-thickness : 2px; --link-underline-thickness-hover: var(--link-underline-thickness); --mark-bg : #fef08a; --mark-color : ; --strong-color : color-mix(in srgb, var(--color-text), black 35%); --strong-font-weight : 600; --table-row-alt-bg : var(--color-mono-1); /* Navbar */ --navbar-font-size : var(--font-size); --navbar-height : 4em; --navbar-link-color : ; --navbar-link-color-active: var(--theme-color); --navbar-drop-link-spacing: 0.5em; /* Sidebar */ --sidebar-bg : var(--color-bg); --sidebar-border-color : var(--border-color); --sidebar-color : ; --sidebar-font-size : var(--font-size); --sidebar-group-border : ; --sidebar-group-spacing : ; --sidebar-group-title-border : ; --sidebar-group-title-color : var(--strong-color); --sidebar-group-title-font-size : ; --sidebar-group-title-font-weight : var(--strong-font-weight); --sidebar-group-title-spacing : ; --sidebar-link-color : var(--color-text); --sidebar-link-color-active : var(--theme-color); --sidebar-link-spacing : 0.75em; --sidebar-name-color : var(--strong-color); --sidebar-name-font-family : var(--font-family); --sidebar-name-font-size : var(--font-size-xl); --sidebar-name-font-weight : var(--strong-font-weight); --sidebar-name-margin : 1.5rem 20px; --sidebar-pagelink-bg : ; --sidebar-pagelink-bg-collapsed : ; --sidebar-pagelink-bg-empty : ; --sidebar-pagelink-bg-expanded : ; --sidebar-toggle-alignment : center; /* start center end */ --sidebar-toggle-bg : var(--color-mono-2); --sidebar-toggle-bg-hover : var(--button-bg); --sidebar-toggle-color : var(--color-mono-4); --sidebar-toggle-color-hover : var(--button-color); --sidebar-toggle-height : 80px; --sidebar-toggle-margin-block : 20px; --sidebar-toggle-width : 22px; --sidebar-width : 280px; } /* Scoped Variables */ /* ========================================================================== */ .callout.caution { /* Tailwind: red 50/200/500 */ --callout-bg : #fef2f2; --callout-border-color: #fecaca; --callout-charm-bg : #ef4444 center no-repeat url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="13" height="13" fill="white"><path d="M10 14C10 15.1 9.1 16 8 16 6.9 16 6 15.1 6 14 6 12.9 6.9 12 8 12 9.1 12 10 12.9 10 14Z"/><path d="M10 1.6C10 1.2 9.8 0.9 9.6 0.7 9.2 0.3 8.6 0 8 0 7.4 0 6.8 0.2 6.5 0.6 6.2 0.9 6 1.2 6 1.6 6 1.7 6 1.8 6 1.9L6.8 9.6C6.9 9.9 7 10.1 7.2 10.2 7.4 10.4 7.7 10.5 8 10.5 8.3 10.5 8.6 10.4 8.8 10.3 9 10.1 9.1 9.9 9.2 9.6L10 1.9C10 1.8 10 1.7 10 1.6Z"/></svg>'); } .callout.important { /* Tailwind: violet 50/200/500 */ --callout-bg : #f5f3ff; --callout-border-color: #ddd6fe; --callout-charm-bg : #8b5cf6 center no-repeat url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="white"><path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path></svg>'); } .callout.note { --callout-bg : var(--theme-color-1); --callout-border-color: var(--theme-color-2); --callout-charm-bg : var(--theme-color) center no-repeat url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="14" height="14" fill="white"><path d="M9.1 0C10.2 0 10.7 0.7 10.7 1.6 10.7 2.6 9.8 3.6 8.6 3.6 7.6 3.6 7 3 7 2 7 1.1 7.7 0 9.1 0Z"/><path d="M5.8 16C5 16 4.4 15.5 5 13.2L5.9 9.1C6.1 8.5 6.1 8.2 5.9 8.2 5.7 8.2 4.6 8.6 3.9 9.1L3.5 8.4C5.6 6.6 7.9 5.6 8.9 5.6 9.8 5.6 9.9 6.6 9.5 8.2L8.4 12.5C8.2 13.2 8.3 13.5 8.5 13.5 8.7 13.5 9.6 13.2 10.4 12.5L10.9 13.2C8.9 15.2 6.7 16 5.8 16Z"/></svg>'); } .callout.tip { /* Tailwind: teal 50/200/500 */ --callout-bg : #f0fdfa; --callout-border-color: #99f6e4; --callout-charm-bg : #14b8a6 center no-repeat url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="14" height="14" fill="white"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"></path></svg>'); } .callout.warning { /* Tailwind: amber 50/200/300 */ --callout-bg : #fffbeb; --callout-border-color: #fde68a; --callout-charm-bg : #fcd34d center no-repeat url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="13" height="13" fill="#a16207"><path d="M10 14C10 15.1 9.1 16 8 16 6.9 16 6 15.1 6 14 6 12.9 6.9 12 8 12 9.1 12 10 12.9 10 14Z"/><path d="M10 1.6C10 1.2 9.8 0.9 9.6 0.7 9.2 0.3 8.6 0 8 0 7.4 0 6.8 0.2 6.5 0.6 6.2 0.9 6 1.2 6 1.6 6 1.7 6 1.8 6 1.9L6.8 9.6C6.9 9.9 7 10.1 7.2 10.2 7.4 10.4 7.7 10.5 8 10.5 8.3 10.5 8.6 10.4 8.8 10.3 9 10.1 9.1 9.9 9.2 9.6L10 1.9C10 1.8 10 1.7 10 1.6Z"/></svg>'); } /* Variables: Advanced */ /* ========================================================================== */ /* prettier-ignore */ :root { /* z-index */ --z-skip-to-content: 2147483647; --z-progress : 2147483637; --z-sidebar : 60; --z-sidebar-toggle : 50; --z-main-overlay : 40; --z-github-corner : 30; --z-app-nav : 20; --z-cover : 10; } /* Base */ /* ========================================================================== */ *, *::before, *::after { box-sizing: border-box; border: 0; font: inherit; -webkit-text-size-adjust: none; text-size-adjust: none; } html, body { height: 100vh; } html { background: var(--color-bg); color: var(--color-text); font-family: var(--font-family); font-feature-settings: 'liga' 1, 'calt' 1; /* NOTE: Fix for Chrome */ font-optical-sizing: auto; font-size: var(--font-size); font-weight: var(--font-weight); line-height: var(--line-height); scroll-padding-top: var(--scroll-padding-top); } body { overflow-x: hidden; margin: 0; } body:not(.ready) { overflow: hidden; } body:not(.ready) [data-cloak],body:not(.ready) .app-nav,body:not(.ready) > nav { display: none; } /* Loading animation */ body.loading::before { position: fixed; } /* Content or cover loaded */ body.loading:has(:where(#main,.cover-main):not(:empty))::before { display: none; } [tabindex='-1']:focus { outline: none !important; } /* Elements */ /* ========================================================================== */ small, sub, sup { display: inline-block; font-size: var(--font-size-s); } a { color: var(--link-color); /* NOTE: Safari may require a forced redraw when changing text-decoration values (e.g., :hover). One way to do this is via translate: 0 0 0. */ } a:not(.button) { text-decoration-color: var(--link-underline-color); text-decoration-line: underline; text-decoration-style: solid; text-decoration-thickness: var(--link-underline-thickness); text-underline-offset: 2px; } a:not(.button):hover { color: var(--link-color-hover); text-decoration-color: var(--link-underline-color-hover); text-decoration-thickness: var(--link-underline-thickness-hover); } h1, h2, h3, h4, h5, h6 { margin: 0; line-height: var(--heading-line-height); } hr { margin-block: 1em; border: none; border-bottom: 1px solid var(--border-color); } ins { text-decoration: underline; } kbd { display: inline-block; min-width: 2em; padding: 0.3em 0.5em; border: var(--kbd-border); border-radius: var(--kbd-border-radius); background: var(--kbd-bg); color: var(--kbd-color); font-size: var(--font-size-s); line-height: 1; text-align: center; white-space: nowrap; } mark { padding-inline: 1px; border-radius: 1px; background: var(--mark-bg); color: var(--mark-color); } strong { color: var(--strong-color); font-weight: var(--strong-font-weight); } summary { cursor: pointer; } summary > * { display: inline; } :disabled { cursor: not-allowed; } /* Buttons */ /* ---------------------------------- */ a.button, button[type], input.button, input:is([type='button'], [type='reset'], [type='submit']) { display: inline-block; margin-block: 0.35em; border: 2px solid var(--color-mono-2); box-shadow: 0 0 0 3px transparent; background: var(--color-mono-2); color: var(--color-text); cursor: pointer; vertical-align: middle; transition: outline-color var(--duration-fast); } :is(a.button,button[type],input.button,input:is([type='button'],[type='reset'],[type='submit'])):not(:focus-visible) { outline-color: transparent; } :is(a.button,button[type],input.button,input:is([type='button'],[type='reset'],[type='submit'])):hover { outline: 3px solid var(--theme-color-3); outline-offset: 1px; } :is(a.button,button[type],input.button,input:is([type='button'],[type='reset'],[type='submit'])) + :is(a.button,button[type],input.button,input:is([type='button'],[type='reset'],[type='submit'])) { margin-left: 0.25em; } .primary:is(a.button,button[type],input.button,input:is([type='button'],[type='reset'],[type='submit'])),.secondary:is(a.button,button[type],input.button,input:is([type='button'],[type='reset'],[type='submit'])) { border-color: var(--button-bg); } /* Primary Button */ .primary:is(a.button,button[type],input.button,input:is([type='button'],[type='reset'],[type='submit'])) { background: var(--button-bg); color: var(--button-color); } /* Secondary Button */ .secondary:is(a.button,button[type],input.button,input:is([type='button'],[type='reset'],[type='submit'])) { background: transparent; color: var(--button-bg); } a.button, button[type], input:where([type='button'], [type='reset'], [type='submit']) { padding: var(--button-padding); border-radius: var(--button-border-radius); text-decoration: none; } :is(button[type],input.button,input:where([type='button'],[type='reset'],[type='submit'])):disabled { opacity: 0.6; filter: grayscale(100%); pointer-events: none; } button:not([type]) { color: inherit; } /* Emoji */ /* ---------------------------------- */ .emoji:where(img) { height: 1.2em; vertical-align: middle; } .emoji:where(span) { font-family: var(--font-family-emoji); font-size: var(--font-size-emoji); vertical-align: middle; } /* Form Elements /* ---------------------------------- */ :is(fieldset,input:not([type='checkbox']),optgroup,option,select,textarea):disabled { opacity: 0.6; } fieldset, input, select, textarea { max-width: 100%; border-radius: var(--form-element-border-radius); } input, select, textarea { padding: 0.25em 0.5em; border: 1px solid var(--form-element-border-color); } input, select, textarea { background: var(--form-element-bg); color: var(--form-element-color); } input, label, select { vertical-align: middle; } fieldset { padding: 1em; border: 1px solid var(--color-mono-2); } fieldset > :first-child,fieldset > legend + * { margin-top: 0; } fieldset > :last-child { margin-bottom: 0; } input:where([type='checkbox'], [type='radio']) { --_size: 1.1em; appearance: none; display: inline-block; position: relative; top: -0.1em; height: var(--_size); width: var(--_size); margin: 0; padding: 0; } input.toggle:where([type='checkbox'],[type='radio']) { --_inset: 2px; --_handle-size: calc(var(--_size) - (var(--_inset) * 2)); height: calc(var(--_size) + 2px); width: calc(var(--_size) * 1.9); border-radius: 100vh; } input.toggle:where([type='checkbox'],[type='radio'])::before,input.toggle:where([type='checkbox'],[type='radio'])::after { all: unset; } input.toggle:where([type='checkbox'],[type='radio'])::before { content: ''; display: inline-block; position: absolute; top: var(--_inset); left: var(--_inset); height: var(--_handle-size); width: var(--_handle-size); border-radius: 100vh; background: var(--color-mono-3); transition: all var(--duration-fast); } input.toggle:where([type='checkbox'],[type='radio']):checked { background: var(--theme-color); border-color: var(--theme-color); } input.toggle:where([type='checkbox'],[type='radio']):checked::before { left: calc(100% - var(--_handle-size) - var(--_inset)); background: var(--color-bg); } label input:where([type='checkbox'],[type='radio']) { margin-right: 0.25em; } input:where([type='checkbox']):not(.toggle) { border-radius: min(var(--form-element-border-radius), 3px); } input:where([type='checkbox']):not(.toggle)::before { content: ''; display: inline-block; position: absolute; top: 43%; left: 50%; rotate: 40deg; translate: -50% -50%; height: 0.7em; width: 0.4em; border-bottom: 2px solid transparent; border-right: 2px solid transparent; } input:where([type='checkbox']):not(.toggle):checked { border-color: var(--theme-color); background: var(--theme-color); } input:where([type='checkbox']):not(.toggle):checked::before { border-color: var(--color-bg); } input:where([type='radio']):not(.toggle) { border-radius: 100vh; } input:where([type='radio']):not(.toggle):checked { border-color: var(--theme-color); box-shadow: inset 0 0 0 0.25em var(--theme-color); } label { display: inline-block; } select { appearance: none; padding-right: 20px; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4.95 10'%3E%3Cpolygon fill='black' opacity='0.5' points='1.41 4.67 2.48 3.18 3.54 4.67 1.41 4.67'/%3E%3Cpolygon fill='black' opacity='0.5' points='3.54 5.33 2.48 6.82 1.41 5.33 3.54 5.33'/%3E%3C/svg%3E"); background-position: right 2px center; background-repeat: no-repeat; font-weight: normal; /* Fix for Safari using serif font is weight is bold */ } @media screen and (prefers-color-scheme: dark) { select { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4.95 10'%3E%3Cpolygon fill='white' opacity='0.4' points='1.41 4.67 2.48 3.18 3.54 4.67 1.41 4.67'/%3E%3Cpolygon fill='white' opacity='0.4' points='3.54 5.33 2.48 6.82 1.41 5.33 3.54 5.33'/%3E%3C/svg%3E"); } } /* App */ /* ========================================================================== */ body > .progress { position: fixed; z-index: var(--z-progress); inset: 0 0 auto 0; height: 2px; width: 0%; background: var(--theme-color); transition: width var(--duration-medium) ease, opacity calc(var(--duration-medium) * 2); } main { display: block; position: relative; width: 100vw; min-height: 100vh; /* Overlay */ } main::before { content: ''; position: fixed; z-index: var(--z-main-overlay); top: 0; bottom: 0; width: 0; background: transparent; transition: width 0s var(--duration-medium), background var(--duration-medium); } main.hidden { display: none; } main > .content { position: absolute; inset: 0; transition: left var(--duration-medium) ease; } body:has(.sidebar.show) :is(main > .content) { left: var(--sidebar-width); } /* hideSidebar: true */ body:not:has(.sidebar) :is(main > .content) { position: static; } .github-corner { position: absolute; top: 0; right: 0; z-index: var(--z-github-corner); border-bottom: 0; text-decoration: none; } .github-corner:hover .octo-arm { animation: github-corner 560ms ease-in-out; } .github-corner svg { height: var(--navbar-height); width: var(--navbar-height); color: var(--color-bg); fill: var(--theme-color); } @keyframes github-corner { 0%, 100% { rotate: 0; } 20%, 60% { rotate: -25deg; } 40%, 80% { rotate: 10deg; } } .loading:empty /* Block: <div class="loading"></div> */, .loading:not(:empty)::before /* Pseudo: <div class="loading">Content</div> */ { --_gradient: no-repeat radial-gradient(farthest-side, var(--theme-color) 92%, #0000); content: ''; display: block; width: 36px; aspect-ratio: 1; background: var(--_gradient) top, var(--_gradient) left, var(--_gradient) right, var(--_gradient) bottom; background-size: 10px 10px; animation: loading 1s infinite; } .loading:not(:empty)::before { position: absolute; z-index: 1; top: 50%; left: 50%; translate: -50% -50%; } @keyframes loading { to { rotate: 0.5turn; } } #app { display: flex; align-items: center; justify-content: center; gap: 0.75em; height: 100vh; padding-inline: 50px; } #skip-to-content { position: fixed; z-index: var(--z-skip-to-content); top: 0; left: 50%; opacity: 0; translate: -50% -100%; transition-property: opacity, translate; transition-duration: 0s, var(--duration-medium); transition-delay: var(--duration-medium), 0s; transition-timing-function: ease; } #skip-to-content:focus { opacity: 1; translate: -50% 0.75rem; transition-duration: 0s, var(--duration-medium); transition-delay: 0s, 0s; } /* Cover */ /* ========================================================================== */ .cover { display: none; position: relative; z-index: var(--z-cover); min-height: 100vh; width: 100%; align-items: center; background: var(--cover-bg); color: var(--cover-color); } .cover:before { content: ''; position: absolute; inset: 0 0 0 0; background: var(--cover-bg-overlay); -webkit-backdrop-filter: brightness(var(--cover-bg-brightness)); backdrop-filter: brightness(var(--cover-bg-brightness)); } .cover.show { display: flex; } .cover a:not(.anchor) { text-decoration-color: var(--theme-color); } .cover blockquote { font-size: var(--font-size-xl); line-height: var(--heading-line-height); text-align: center; } :is(.cover blockquote),:is(.cover blockquote) > p { margin-block: 1rem; } .cover h1 { position: relative; color: var(--cover-title-color); font: var(--cover-title-font); } :is(:is(.cover h1) a),:is(:is(.cover h1) a):hover { text-decoration-color: transparent; } :is(.cover h1) a { color: var(--cover-title-color); } :is(.cover h1) small { font-weight: var(--font-weight); position: absolute; bottom: 0; } .cover ul { margin-bottom: 1.5rem; padding: 0; list-style-type: none; } .cover-main { position: relative; z-index: 1; flex: 1; margin: 5vh var(--content-margin-inline); text-align: center; } /* Nav Bar */ /* ========================================================================== */ .app-nav { display: flex; align-items: center; justify-content: end; gap: 1em; position: absolute; z-index: var(--z-app-nav); top: 0; right: 0; left: 0; height: var(--navbar-height); padding-inline: var(--content-margin-inline); transition: left var(--duration-medium) ease; } .app-nav:has( ~ .github-corner) { padding-inline-end: calc(var(--navbar-height) + 1em); } body:where(:has(.sidebar.show)) .app-nav { left: var(--sidebar-width); } .app-nav a { color: var(--navbar-link-color); text-decoration-color: transparent; } :is(.app-nav a):hover { translate: 0; /* HACK: Force Safari to render text-decoration */ text-decoration-color: var(--navbar-link-color-active); } .active :is(.app-nav a) { color: var(--navbar-link-color-active); } .app-nav ul { list-style: none; margin: 0; padding: 0; } .app-nav > ul { display: flex; justify-content: end; flex-wrap: wrap; gap: 0 1em; } .app-nav li { display: inline-block; position: relative; white-space: nowrap; cursor: pointer; /* Dropdown */ } :is(.app-nav li) ul { position: absolute; z-index: 1; top: -9999vh; right: 50%; translate: 50% 0; overflow-y: auto; max-height: calc(100vh - 61px); padding: 1em; border: 1px solid var(--border-color); border-radius: var(--border-radius); background: var(--color-bg); } li:last-child :is(:is(.app-nav li) ul) { right: calc(0px - var(--content-margin-inline) / 2); translate: 0; } :is(.app-nav li) li { display: block; margin-block: var(--navbar-drop-link-spacing); } :is(:is(.app-nav li) li):first-child { margin-top: 0; } :is(:is(.app-nav li) li):last-child { margin-bottom: 0; } :is(:is(.app-nav li) li) a { display: flex; align-items: center; gap: 0.25em; margin: 0; } :is(:is(:is(.app-nav li) li) a):hover { color: var(--navbar-link-color-active); } :is(:is(.app-nav li):focus-within,:is(.app-nav li):hover) ul { top: 100%; } .app-nav p { margin: 0; } .app-nav > :where(a,p),.app-nav > ul > li > :where(a,p) { white-space: nowrap; } .app-nav-merged { display: none; } /* Sidebar */ /* ========================================================================== */ :root { --_sidebar-inset: 20px; --_sidebar-list-inset: 0.85em; --_sidebar-scrollbar-width: 10px; /* macOS overlay scrollbar default */ } @supports (scrollbar-width: auto) { :root { --_sidebar-scrollbar-width: 4px; } } :is(.app-nav-merged,.sidebar-nav) > * { margin-inline: var(--_sidebar-inset); } :is(:is(.app-nav-merged,.sidebar-nav) > *):first-child { margin-top: 0; } :is(.app-nav-merged,.sidebar-nav) > hr { margin-inline: 0; } :is(.app-nav-merged,.sidebar-nav) ul { margin: 0; padding: 0; list-style: none; } :is(:is(.app-nav-merged,.sidebar-nav) > ul) > * { margin-left: var(--_sidebar-inset); } :is(:is(.app-nav-merged,.sidebar-nav) > ul) ul { padding-left: var(--_sidebar-list-inset); } .group:is(:is(:is(.app-nav-merged,.sidebar-nav) > ul) > li) { padding-top: var(--sidebar-group-spacing); border-top: var(--sidebar-group-border); } .group:is(:is(:is(.app-nav-merged,.sidebar-nav) > ul) > li):has( + :not(.group)),.group:is(:is(:is(.app-nav-merged,.sidebar-nav) > ul) > li):last-child { border-bottom: var(--sidebar-group-border); } :is(.app-nav-merged,.sidebar-nav) li { margin-block: var(--sidebar-link-spacing); } :is(:is(.app-nav-merged,.sidebar-nav) li) > p { margin: 0; /* Text-only <p> tags */ } .group-title:is(:is(:is(.app-nav-merged,.sidebar-nav) li) > p) { margin-right: var(--_sidebar-inset); margin-bottom: var(--sidebar-group-title-spacing); padding-bottom: var(--sidebar-group-title-spacing); border-bottom: var(--sidebar-group-title-border); color: var(--sidebar-group-title-color); font-size: var(--sidebar-group-title-font-size); font-weight: var(--sidebar-group-title-font-weight); } :is(:is(.app-nav-merged,.sidebar-nav) li) a { display: block; padding-right: var(--_sidebar-inset); overflow: hidden; } :is(:is(:is(.app-nav-merged,.sidebar-nav) li) a):has(img,svg) { display: flex; align-items: center; gap: 0.25em; } .active:is(:is(.app-nav-merged,.sidebar-nav) li) > a { color: var(--sidebar-link-color-active); } .collapse:is(:is(.app-nav-merged,.sidebar-nav) li) > :not(a) { display: none; } .sidebar { visibility: hidden; position: absolute; z-index: var(--z-sidebar); top: 0; bottom: 0; left: 0; translate: calc(0px - var(--sidebar-width)); width: var(--sidebar-width); overscroll-behavior: contain; border-right: 1px solid var(--sidebar-border-color); background: var(--sidebar-bg); color: var(--sidebar-color); font-size: var(--sidebar-font-size); transition: translate var(--duration-medium) ease, visibility var(--duration-medium); /* Non-webkit browsers: style scrollbar for consistency */ } @supports (scrollbar-width: auto) { .sidebar::-webkit-scrollbar { width: var(--_sidebar-scrollbar-width); } .sidebar::-webkit-scrollbar-thumb { border-radius: var(--_sidebar-scrollbar-width); background: transparent; } .sidebar:hover::-webkit-scrollbar-thumb { background: rgba(136, 136, 136, 0.4); } .sidebar:hover::-webkit-scrollbar-track { background: rgba(136, 136, 136, 0.1); } } .sidebar a[href] { text-decoration-color: transparent; color: var(--sidebar-link-color); } :is(.sidebar a[href]):hover { translate: 0; /* HACK: Force Safari to render text-decoration */ text-decoration-color: var(--sidebar-link-color-active); } .sidebar .app-name { margin: var(--sidebar-name-margin); color: var(--sidebar-name-color); font-family: var(--sidebar-name-font-family); font-size: var(--sidebar-name-font-size); font-weight: var(--sidebar-name-font-weight); text-align: center; } :is(.sidebar a.app-name-link) img { display: block; max-width: 100%; } :is(.sidebar a.app-name-link):hover { color: var(--sidebar-link-color-active); text-decoration-color: transparent; } body:has(.sidebar.show) .sidebar { visibility: visible; translate: 0; } body.sticky .sidebar { position: fixed; overflow-y: auto; } :is(.sidebar-nav li) a.page-link { border-radius: var(--border-radius); background: var(--sidebar-pagelink-bg); } .active > :is(:is(.sidebar-nav li) a.page-link),:has(.active) > :is(:is(.sidebar-nav li) a.page-link) { background: var(--sidebar-pagelink-bg-expanded); } :is(.active > :is(:is(.sidebar-nav li) a.page-link),:has(.active) > :is(:is(.sidebar-nav li) a.page-link)):only-child { background: var(--sidebar-pagelink-bg-empty); } .collapse > :is(:is(.sidebar-nav li) a.page-link) { background: var(--sidebar-pagelink-bg-collapsed); } .sidebar-toggle { display: flex; align-items: var(--sidebar-toggle-alignment); justify-content: start; position: absolute; z-index: var(--z-sidebar-toggle); top: 0; bottom: 0; width: var(--sidebar-toggle-width); margin: 0; padding: 0; border: 0; background: transparent; cursor: pointer; -webkit-tap-highlight-color: transparent; transition: background var(--duration-medium), translate var(--duration-medium) ease; } @media screen and (any-hover) { .sidebar-toggle:hover { background: color-mix( in srgb, var(--sidebar-toggle-bg-hover) 10%, transparent ); } } body:where(:has(.sidebar.show)) .sidebar-toggle { translate: var(--sidebar-width); transition: background 0s, translate var(--duration-medium) ease; } body.sticky .sidebar-toggle { position: fixed; } /* Increase tap target size on touch-only devices */ @media screen and not (any-hover) { .sidebar-toggle { width: calc(var(--content-margin-inline) - 10px); } } .sidebar-toggle-button { display: flex; flex-direction: column; justify-content: center; align-items: center; height: var(--sidebar-toggle-height); width: var(--sidebar-toggle-width); margin-block: var(--sidebar-toggle-margin-block); border-radius: 0 var(--border-radius) var(--border-radius) 0; background: var(--sidebar-toggle-bg); color: var(--sidebar-toggle-color); transition-duration: var(--duration-medium); transition-property: background, translate; } .sidebar-toggle-button span { --_size: 4px; display: block; height: var(--_size); width: var(--_size); border-radius: 100vh; background: currentColor; transition: background var(--duration-medium); } :is(.sidebar-toggle-button span):nth-child(2) { margin-block: calc(var(--_size) - 1px); } @media screen and (any-hover) { .sidebar-toggle-button:hover,body:where(:has(.sidebar-toggle:hover)) .sidebar-toggle-button { background: var(--sidebar-toggle-bg-hover); color: var(--sidebar-toggle-color-hover); } } /* Markdown */ /* ========================================================================== */ .markdown-section { position: relative; width: var(--content-max-width); max-width: calc(100% - (var(--content-margin-inline) * 2)); margin: var(--content-margin-inline) auto 0 auto; padding-bottom: 2rem; } body:has(.app-nav) .markdown-section { margin-top: calc(var(--navbar-height) + (var(--content-margin-inline) / 2)); } .markdown-section > :first-child { margin-top: 0; } .markdown-section blockquote,.markdown-section details,.markdown-section figure,.markdown-section form,.markdown-section iframe,.markdown-section ol,.markdown-section output,.markdown-section p,.markdown-section pre,.markdown-section table,.markdown-section ul { margin-block: var(--margin-block); } .anchor:is(.markdown-section a) { color: inherit; } .anchor:is(.markdown-section a):not(:hover) { text-decoration-color: transparent; } .anchor:is(.markdown-section a):hover { translate: 0 0 0; /* Safari Fix: Forced redraw */ text-decoration-color: var(--link-underline-color-hover); } .markdown-section blockquote { position: relative; overflow: auto; margin-inline: 0; padding: var(--blockquote-padding); border: solid var(--blockquote-border-color); border-width: var(--blockquote-border-width); border-radius: var(--blockquote-border-radius); background: var(--blockquote-bg); color: var(--blockquote-color); } :is(.markdown-section blockquote) > :first-child { margin-top: 0; } :is(.markdown-section blockquote) > :last-child { margin-bottom: 0; } .markdown-section em { font-style: italic; } .markdown-section hr { margin-block: 2em; } .markdown-section iframe { display: block; width: 100%; max-width: 100%; border: 1px solid var(--color-mono-2); } .markdown-section img { max-width: 100%; } .markdown-section kbd { margin-inline: 0.15em; } .alt:is(.markdown-section kbd) { padding: 0.5em; border: var(--kbd-alt-border); border-radius: var(--kbd-alt-border-radius); box-shadow: var(--kbd-alt-box-shadow); background: var(--kbd-alt-bg); color: var(--kbd-alt-color); font-size: var(--font-size-m); } /* Callouts */ /* ---------------------------------- */ .markdown-section .callout { position: relative; margin-block: calc(var(--margin-block) * 1.5); padding: var(--callout-padding); border: solid var(--callout-border-color); border-width: var(--callout-border-width); border-radius: var(--callout-border-radius); background: var(--callout-bg); color: var(--callout-color); /* Charm */ } :is(.markdown-section .callout)::before { content: var(--callout-charm-content); position: absolute; inset: var(--callout-charm-inset); height: var(--callout-charm-size); width: var(--callout-charm-size); translate: var(--callout-charm-translate); border-radius: var(--callout-charm-border-radius); background: var(--callout-charm-bg); color: var(--callout-charm-color); font-size: var(--callout-charm-font-size); font-weight: var(--strong-font-weight); line-height: var(--callout-charm-size); text-align: center; } :is(.markdown-section .callout) > :first-child { margin-top: 0; } :is(.markdown-section .callout) > :last-child { margin-bottom: 0; } :is(.markdown-section .callout) code,:is(.markdown-section .callout) strong { color: inherit; } :is(.markdown-section .callout) code { background: rgba(0, 0, 0, 0.05); } :is(.markdown-section .callout) pre:where([data-lang]) { background: rgba(255, 255, 255, 0.4); } :is(.markdown-section .callout) .callout { margin-block: var(--margin-block); } /* Code, Output, Samp */ /* ---------------------------------- */ .markdown-section code,.markdown-section output,.markdown-section pre { border-radius: var(--border-radius); } .markdown-section code,.markdown-section pre,.markdown-section samp { font-family: var(--font-family-mono); font-size: var(--font-size-mono); } .markdown-section output,.markdown-section pre[data-lang] { position: relative; } :is(.markdown-section output,.markdown-section pre[data-lang])::after { content: attr(data-lang); position: absolute; top: 0.5rem; right: 0.5rem; color: inherit; font-family: var(--font-family); font-size: var(--font-size-xs); letter-spacing: 0.02em; line-height: 1; opacity: 0.5; } .markdown-section :not(pre) > code,.markdown-section samp { white-space: pre-wrap; overflow-wrap: break-word; } .markdown-section code { margin: 0 0.1em; padding: 0.2em 0.35em; background: var(--code-bg); color: var(--code-color); } :is(.markdown-section code) .token { position: relative; left: auto; } .markdown-section output { display: block; padding: 1.7rem 1.4rem 1.4rem; border: 1px solid var(--color-mono-2); } :is(.markdown-section output) > :first-child { margin-top: 0; } :is(.markdown-section output) > :last-child { margin-bottom: 0; } .markdown-section pre[data-lang] { /* NOTE: !important declaration are intended to override third-party Prism theme values */ padding: 0 !important; border-radius: var(--border-radius) !important; font-family: var(--font-family-mono) !important; font-size: var(--font-size-mono) !important; line-height: inherit !important; tab-size: 2 !important; text-align: left; white-space: pre; word-spacing: normal; word-wrap: normal; word-break: normal; hyphens: none; } :is(.markdown-section pre[data-lang]):only-child { margin: 0; } :is(.markdown-section pre[data-lang]) > code { display: block; overflow: auto; margin: 0 !important; padding: 0 !important; padding-block: 1.5rem !important; padding-inline: 1.5rem !important; background: transparent; color: inherit; font-size: inherit; white-space: inherit; } .markdown-section samp { font-weight: var(--strong-font-weight); } :is(.markdown-section samp) .token { position: relative; left: auto; } /* Headings */ /* --------------------------------- */ .markdown-section :where(h1,h2,h3,h4,h5,h6) { margin: 2rem 0 0.5em; color: var(--heading-color); font-weight: var(--heading-font-weight); /* Prevent long titles from causing horizontal scrolling */ } [id]:is(.markdown-section :where(h1,h2,h3,h4,h5,h6)) a { overflow-x: clip; overflow-y: visible; text-overflow: ellipsis; } .markdown-section h1,.markdown-section h2 { margin-top: 2.5rem; } .markdown-section :is(h1,h2,h3,h4,h5,h6) + * { margin-top: 0; } .markdown-section h1 { font-size: var(--font-size-xxxl); } :is(.markdown-section h1):first-of-type { margin-top: 0; } .markdown-section h2 { --_spacing: 0.5em; margin-bottom: calc( var(--_spacing) + (var(--heading-line-height) - var(--font-size-xxl)) ); padding-bottom: var(--_spacing); border-bottom: 1px solid var(--border-color); font-size: var(--font-size-xxl); } .markdown-section h3 { font-size: var(--font-size-xl); } .markdown-section h4 { font-size: var(--font-size-l); } .markdown-section h5 { font-size: var(--font-size-m); } :is(.markdown-section h6),:is(.markdown-section h6) + :not(h1,h2,h3,h4,h5) { font-size: var(--font-size-s); } /* Lists */ /* ---------------------------------- */ .markdown-section ol,.markdown-section ul { margin: 0; padding-inline-start: 1.5em; } :is(.markdown-section ol,.markdown-section ul) :is(.markdown-section ol,.markdown-section ul) { margin-top: 0.25em; } :is(.markdown-section li):not(:last-child) { margin-bottom: 0.25em; } .markdown-section ul.task-list { --_checkbox-margin: 0.2em; --_checkbox-offset: 1.6em; padding-inline-start: 0.6em; } :is(.markdown-section ul.task-list) input[type='checkbox'] { margin-top: -0.15em; margin-right: var(--_checkbox-margin); margin-left: calc(0px - var(--_checkbox-offset)); } :is(.markdown-section ul.task-list) li { position: relative; margin-top: var(--_checkbox-margin); margin-bottom: var(--_checkbox-margin); margin-left: var(--_checkbox-offset); list-style-type: none; /* Vertical Connector */ } :is(:is(.markdown-section ul.task-list) li):has(.task-list)::before { content: ''; position: absolute; z-index: -1; top: 1em; left: -1em; bottom: 0; border-left: 1px solid var(--color-mono-2); } :is(.markdown-section ul.task-list) ul.task-list { padding-inline-start: 1.5em; } :is(:is(.markdown-section ul.task-list) ul.task-list) li { margin-left: var(--_checkbox-margin); } /* Horizontal Connector */ :is(:is(:is(.markdown-section ul.task-list) ul.task-list) > li)::after { content: ''; position: absolute; z-index: -1; top: 0.9em; left: -2.7em; width: 1.25em; border-top: 1px solid var(--color-mono-2); border-left: none; } /* Horizontal Connector + Mask */ :is(:is(:is(.markdown-section ul.task-list) ul.task-list) > li):last-child::after { bottom: 0; background: var(--color-bg); } /* Tables */ /* ---------------------------------- */ .markdown-section th,.markdown-section td { padding: 0.25em 0.75em; border: 1px solid var(--color-mono-2); } .markdown-section table { display: block; width: 100%; overflow: auto; border-collapse: collapse; border-spacing: 0; } .markdown-section thead { display: none; font-weight: var(--strong-font-weight); text-align: left; } :is(.markdown-section thead):has(th:not(:empty)) { display: table-header-group; } .markdown-section th { font-weight: var(--strong-font-weight); } :is(.markdown-section th):not([align]) { text-align: left; } .markdown-section tr { border-top: 1px solid var(--color-mono-2); } :is(.markdown-section tr):nth-child(2n) { background: var(--table-row-alt-bg); } /* Syntax Highlighting */ /* See: https://prismjs.com */ /* ========================================================================== */ pre[data-lang] { background: var(--codeblock-bg); color: var(--codeblock-color); } .namespace { opacity: 0.7; } .token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag { color: var(--codeblock-tag); } .token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string { color: var(--codeblock-selector); } .token.entity,.token.operator,.token.url,.language-css .token.string,.style .token.string { color: var(--codeblock-operator); } .token.cdata,.token.comment,.token.doctype,.token.prolog { color: var(--codeblock-comment); } .token.atrule,.token.attr-value,.token.keyword { color: var(--codeblock-keyword); } .token.important,.token.regex,.token.variable { color: var(--codeblock-variable); } .token.bold,.token.important { font-weight: var(--strong-font-weight); } .token.entity { cursor: help; } .token.function { color: var(--codeblock-function); } .token.important { color: var(--codeblock-important); } .token.italic { font-style: italic; } .token.punctuation { color: var(--codeblock-punctuation); } /* Utility */ /* ========================================================================== */ [class*='clamp-'] { overflow: hidden; text-overflow: ellipsis; } [class*='clamp-']:not(.clamp-1) { display: -webkit-box; -webkit-box-orient: vertical; } .clamp-1 { white-space: nowrap; } .clamp-2 { -webkit-line-clamp: 2; } .clamp-3 { -webkit-line-clamp: 3; } .visually-hidden { clip-path: inset(50%); height: 1px; overflow: hidden; position: absolute; white-space: nowrap; width: 1px; } /* Media */ /* ========================================================================== */ :root { --_mobile-breakpoint: 640px; /* JS Accessible. Match with MQ below. */ } @media (prefers-reduced-motion) { :root { --duration-slow: 0s; --duration-medium: 0s; --duration-fast: 0s; } } @media print { .app-nav, .github-corner, .sidebar, .sidebar-toggle { display: none; } } /* Mobile */ @media screen and (max-width: 640px) { .app-nav-merged { display: block; } body:has(.sidebar.show) .app-nav,body:has(.sidebar.show) .github-corner { pointer-events: none; } body:has(.sidebar.show) .app-nav { left: 0; } :is(body:has(.sidebar.show) main)::before { width: 100%; background: rgba(0, 0, 0, 0.15); transition: width 0s, background var(--duration-medium); } body:has(.sidebar.show) .sidebar-toggle { width: calc(100% - var(--sidebar-width)); } :is(body:has(.sidebar.show) .sidebar-toggle):hover { background: transparent; } body:has(.sidebar.show) main > .content { left: 0; } body:has(.app-nav-merged) .app-nav { display: none; } body:has(.app-nav-merged) .markdown-section { margin-top: var(--content-margin-inline); } } /* Sidebar chevrons */ /* ========================================================================== */ /* prettier-ignore */ :root:has(body[class*='sidebar-chevron']) { --sidebar-chevron-collapsed-color: var(--color-mono-3); --sidebar-chevron-expanded-color : var(--theme-color); /* Chevron right (Mono) */ --sidebar-pagelink-bg: no-repeat var(--_sidebar_pagelink-bg-left) calc(50% - 2.5px) / 6px 5px linear-gradient( 45deg, transparent 2.75px, var(--sidebar-chevron-collapsed-color) 2.75px 4.25px, transparent 4px ),