@font-face { font-family: "Literata"; font-style: normal; font-weight: 200 900; font-display: swap; src: url(literata-latin-wght-normal.7176a8389de9bbdb.woff2) format("woff2"); } @font-face { font-family: "Literata"; font-style: italic; font-weight: 200 900; font-display: swap; src: url(literata-latin-wght-italic.e4d05b57998a212c.woff2) format("woff2"); } @font-face { font-family: "JetBrains Mono"; font-style: normal; font-weight: 100 800; font-display: swap; src: url(jetbrains-mono-latin-wght-normal.9433d6f3a3e2860d.woff2) format("woff2"); } :root { --tali-bg: #FFFFFF; --tali-fg: #22201A; --tali-muted: #5F5C54; --tali-inline-code: #3A362E; --tali-code-bg: #F4F1EB; --tali-border: #D9D7D2; --tali-border-strong: #8B887F; --tali-link: #22201A; --tali-underline: #8B887F; --tali-flash: rgba(34, 32, 26, .08); --tali-accent: #22201A; --tali-accent-fill: #22201A; --tali-on-accent: #FFFFFF; --tali-edge-shadow: rgba(0, 0, 0, .16); color-scheme: light; --tali-callout-note: #5F5C54; --tali-callout-tip: #3F6152; --tali-callout-warning: #7A4A18; --tali-callout-important: #8B3A2E; --tali-status-live: var(--tali-callout-tip); --tali-status-warn: var(--tali-callout-warning); --tali-status-error: var(--tali-callout-important); --tali-font-body: 1.25rem/1.55 "Literata", Georgia, serif; --tali-font-mono: "JetBrains Mono", ui-monospace, monospace; --tali-mono-size: .92em; --tali-measure: 32em; --tali-chrome-maxw: 56rem; --tali-note-w: 0; --tali-note-gap: 0; --tali-band: 71rem; --tali-side-l: calc((var(--tali-band) - 40rem) / 2); --tali-side-r: calc((var(--tali-band) - 40rem) / 2); --tali-band-span: bleed-start / bleed-end; --tali-band-anchor: center; --tali-u: 1.9375rem; --tali-radius: 2px; --tali-focus: 2px solid var(--tali-accent); --tali-focus-offset: 2px; --tali-dur: .1s; --tali-output-max: 32rem; --tali-scrim: rgba(0, 0, 0, .42); } html[data-theme="dark"] { --tali-bg: #14130F; --tali-fg: #EAE7E0; --tali-muted: #D0CCC3; --tali-inline-code: #DBD7CE; --tali-code-bg: #1C1A15; --tali-border: #33312B; --tali-border-strong: #7C7972; --tali-link: #EAE7E0; --tali-underline: #6E6B63; --tali-flash: rgba(234, 231, 224, .08); --tali-accent: #EAE7E0; --tali-accent-fill: #EAE7E0; --tali-on-accent: #14130F; --tali-edge-shadow: rgba(255, 255, 255, .14); --tali-callout-note: #D0CCC3; --tali-callout-tip: #8FBBA3; --tali-callout-warning: #D0A67C; --tali-callout-important: #DC8B78; color-scheme: dark; } html { scroll-behavior: smooth; } @property --tali-search-flash { syntax: "<color>"; inherits: true; initial-value: transparent; } ::highlight(tali-search-flash) { background-color: var(--tali-search-flash); color: inherit; } mark.tali-search-mark { color: inherit; border-radius: var(--tali-radius); background-color: rgba(250, 204, 21, .5); animation: tali-search-mark-fade 1.5s ease-out forwards; } @keyframes tali-search-mark-fade { 0%, 45% { background-color: rgba(250, 204, 21, .5); } 100% { background-color: transparent; } } html[data-theme="dark"] mark.tali-search-mark { background-color: #6e5414; } @keyframes tali-search-mark-fade-dark { 0%, 45% { background-color: #6e5414; } 100% { background-color: transparent; } } html[data-theme="dark"] mark.tali-search-mark { animation-name: tali-search-mark-fade-dark; } html.tali-search-flashing { animation: tali-search-flash 1.5s ease-out forwards; } @keyframes tali-search-flash { 0%, 45% { --tali-search-flash: rgba(250, 204, 21, .55); } 100% { --tali-search-flash: transparent; } } html[data-theme="dark"].tali-search-flashing { animation-name: tali-search-flash-dark; } @keyframes tali-search-flash-dark { 0%, 45% { --tali-search-flash: rgba(250, 204, 21, .36); } 100% { --tali-search-flash: transparent; } } @media (prefers-reduced-motion: reduce) { html.tali-search-flashing { animation-duration: .01ms; } } .tali-input { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; margin: 1rem 0; font: inherit; } .tali-input-label { font-weight: 600; } .tali-input-control { font: inherit; accent-color: var(--tali-accent); } .tali-input-control[type="range"] { flex: 1 1 12rem; max-width: 22rem; } .tali-input-out { font-variant-numeric: tabular-nums; min-width: 2.5em; color: var(--tali-muted); } .tali-sr-only, .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } body { max-width: none; margin: calc(2 * var(--tali-u)) 0; padding: 0; font: var(--tali-font-body); color: var(--tali-fg); background: var(--tali-bg); overflow-wrap: break-word; font-feature-settings: "liga" 1, "calt" 1, "kern" 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } body p, body li, body dd, body blockquote, body figcaption { line-height: 1.55; } nav li, [role="listbox"] li, .column-margin p { line-height: inherit; } p, li { text-wrap: pretty; orphans: 2; widows: 2; } h1, h2, h3, h4, h5, h6, figcaption, blockquote, .callout-title { text-wrap: balance; } figure, .tali-figure { break-inside: avoid; } figcaption { break-before: avoid; } h1, h2, h3, h4, h5, h6 { break-after: avoid; } .tali-skip { position: fixed; top: -3rem; left: .5rem; z-index: 2147482000; background: var(--tali-fg); color: var(--tali-bg); padding: .5rem .8rem; border-radius: var(--tali-radius); font: 400 .78rem/1.3 var(--tali-font-mono); text-transform: uppercase; letter-spacing: .053em; text-decoration: none; } .tali-skip:focus { top: .5rem; } .tali-skip-toc:focus { left: 13rem; } @media (prefers-reduced-motion: no-preference) { .tali-skip { transition: top var(--tali-dur) ease; } } a:focus-visible, button:focus-visible, [role="button"]:focus-visible, [role="tab"]:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible, summary:focus-visible, [tabindex="0"]:focus-visible { outline: var(--tali-focus); outline-offset: var(--tali-focus-offset); border-radius: var(--tali-radius); } .tali-skip:focus-visible { outline: var(--tali-focus); outline-offset: 2px; } pre, code, table, .katex { font-variant-numeric: tabular-nums; } a { color: var(--tali-link); text-decoration-color: var(--tali-underline); } a.btn { display: inline-block; font: 400 .78rem/1.3 var(--tali-font-mono); text-transform: uppercase; letter-spacing: .053em; text-decoration: none; padding: .4rem .95rem; border-radius: var(--tali-radius); border: 1px solid var(--tali-accent); color: var(--tali-link); transition: background var(--tali-dur) ease, color var(--tali-dur) ease; } a.btn:hover { background: var(--tali-accent-fill); color: var(--tali-on-accent); } a.btn-outline-secondary { border-color: var(--tali-border-strong); color: var(--tali-muted); } a.btn-outline-secondary:hover { background: var(--tali-fg); color: var(--tali-bg); border-color: var(--tali-fg); } a.btn-sm { font-size: .8rem; padding: .25rem .7rem; } a.btn-primary { background: var(--tali-accent-fill); border-color: var(--tali-accent-fill); color: var(--tali-on-accent); } a.btn-primary:hover { background: var(--tali-accent-fill); color: var(--tali-on-accent); text-decoration: underline; text-underline-offset: 3px; } a.btn-lg { font-size: 1.02rem; padding: .62rem 1.35rem; border-radius: var(--tali-radius); } .hero { padding: calc(2 * var(--tali-u)) 0 var(--tali-u); } .hero h1, .hero h2 { font-size: 2.25rem; line-height: 1.1; letter-spacing: -.008em; margin: 0 0 calc(.5 * var(--tali-u)); } .hero p, .hero .hero-lead { font-size: 1.25rem; color: var(--tali-muted); max-width: none; margin: 0 0 var(--tali-u); line-height: 1.5; } .hero-eyebrow { font: var(--tali-font-body); font-size: .92rem; font-style: italic; color: var(--tali-muted); text-transform: none; letter-spacing: normal; margin: 0 0 calc(.5 * var(--tali-u)); } .hero-eyebrow::after { content: ""; display: block; width: 2.5rem; height: 2px; background: var(--tali-fg); margin-top: calc(.25 * var(--tali-u)); } .hero-actions { display: flex; flex-wrap: wrap; gap: .6rem; margin-top: var(--tali-u); } .hero a.btn, .hero-actions a.btn { margin: 0; } .feature-list { display: flex; flex-direction: column; margin: calc(2 * var(--tali-u)) 0; border-top: 1px solid var(--tali-border); } .feature { padding: var(--tali-u) 0; border-bottom: 1px solid var(--tali-border); } .feature h3 { margin: 0 0 calc(.25 * var(--tali-u)); font-size: 1.3rem; } .feature p { margin: 0; color: var(--tali-muted); font-size: .95rem; } h1, h2, h3, h4, h5, h6 { font-family: inherit; font-weight: 600; } p { margin: 0 0 var(--tali-u); } hr { border: 0; border-top: 1px solid var(--tali-border); margin: calc(2 * var(--tali-u)) 0; } h1 { font-size: 2.25rem; line-height: 1.1; letter-spacing: -.008em; margin: 0 0 calc(.5 * var(--tali-u)); } h2 { font-size: 1.6rem; line-height: 1.2; margin: calc(2 * var(--tali-u)) 0 calc(.5 * var(--tali-u)); } h3 { font-size: 1.3rem; line-height: 1.3; margin: calc(1.5 * var(--tali-u)) 0 calc(.5 * var(--tali-u)); } h4, h5, h6 { font: 400 .78rem/1.3 var(--tali-font-mono); text-transform: uppercase; letter-spacing: .053em; margin: var(--tali-u) 0 calc(.5 * var(--tali-u)); } .tali-title-block { margin: 0 0 calc(2 * var(--tali-u)); padding-bottom: var(--tali-u); border-bottom: 1px solid var(--tali-border); } .tali-title-block .title { margin: 0 0 .3rem; font-size: 2.5rem; line-height: 1.15; } .tali-title-block .subtitle { margin: .2rem 0; font-size: 1.4rem; color: var(--tali-muted); font-weight: 400; } .tali-title-block .description { margin: .4rem 0; color: var(--tali-fg); } .tali-title-block .tali-title-meta { margin-top: .6rem; display: flex; flex-wrap: wrap; gap: .25rem 1rem; font: 400 .78rem/1.3 var(--tali-font-mono); text-transform: uppercase; letter-spacing: .053em; color: var(--tali-muted); } .tali-title-block .tali-byline { display: inline; font: var(--tali-font-body); font-size: .78rem; font-weight: 400; line-height: 1.3; text-transform: none; letter-spacing: normal; } .tali-title-block .tali-author { white-space: nowrap; } .tali-title-block .tali-author a { color: inherit; text-decoration: none; } .tali-title-block .tali-author a:hover, .tali-title-block .tali-author a:focus-visible { text-decoration: underline; text-underline-offset: .15em; } .tali-author-mark { font-size: .75em; line-height: 0; vertical-align: super; margin-left: .1em; color: var(--tali-accent); } .tali-affiliations { margin: .35rem 0 0; color: var(--tali-muted); font: var(--tali-font-body); font-size: .78rem; font-weight: 400; line-height: 1.3; } .tali-affiliation-list { margin: 0; padding: 0; list-style: none; } .tali-affiliation-list li { display: inline; margin-right: .9rem; } .tali-affiliation-num { font-size: .75em; line-height: 0; vertical-align: super; margin-right: .2em; color: var(--tali-accent); } .tali-equal-note { margin: .2rem 0 0; } .tali-appendix { margin: 3rem 0 0; padding-top: 1.25rem; border-top: 1px solid var(--tali-border); font-size: .9em; color: var(--tali-muted); } .tali-appendix-part + .tali-appendix-part { margin-top: 1.25rem; } .tali-appendix h2 { font-weight: 600; font-size: .95em; line-height: 1.3; margin: 0 0 .4rem; color: var(--tali-fg); letter-spacing: 0; } .tali-appendix p { margin: 0; } .tali-contributions { display: grid; grid-template-columns: max-content 1fr; gap: .3rem 1rem; margin: 0; } .tali-contributions dt { font-weight: 600; color: var(--tali-fg); } .tali-contributions dd { margin: 0; } @media (max-width: 32rem) { .tali-contributions { grid-template-columns: 1fr; gap: 0; } .tali-contributions dd { margin: 0 0 .5rem; } } pre { position: relative; padding: calc(.5 * var(--tali-u)); border-radius: var(--tali-radius); overflow: auto; line-height: 1.5; background-color: var(--tali-code-bg); background-image: linear-gradient(to right, var(--tali-code-bg) 30%, transparent), linear-gradient(to left, var(--tali-code-bg) 30%, transparent), radial-gradient(farthest-side at left, var(--tali-edge-shadow), transparent), radial-gradient(farthest-side at right, var(--tali-edge-shadow), transparent); background-position: left center, right center, left center, right center; background-repeat: no-repeat; background-size: 38px 100%, 38px 100%, 13px 100%, 13px 100%; background-attachment: local, local, scroll, scroll; } pre, code { font-family: var(--tali-font-mono); font-size: var(--tali-mono-size); font-feature-settings: "kern" 1; font-variant-ligatures: none; } pre > code { display: block; overflow: visible; background: transparent; padding: 0; font-size: inherit; } .tali-hl-comment { color: #6E6A60; font-style: italic; } .tali-hl-string { color: #3F6152; } .tali-hl-keyword, .tali-hl-storage { color: #7A3B52; } .tali-hl-constant, .tali-hl-support { color: #3A5578; } .tali-hl-entity { color: #6B4A2F; } .tali-hl-variable { color: #22201A; } :not(pre) > code { background: var(--tali-code-bg); padding: .1em .35em; border-radius: var(--tali-radius); color: var(--tali-inline-code); font-size: var(--tali-mono-size); overflow-wrap: anywhere; } .tali-copy { position: absolute; top: .45rem; right: .45rem; display: inline-flex; align-items: center; justify-content: center; padding: .28rem; line-height: 0; color: var(--tali-muted); background: var(--tali-bg); border: 1px solid var(--tali-border-strong); border-radius: var(--tali-radius); cursor: pointer; opacity: 0; transition: opacity var(--tali-dur) ease, color var(--tali-dur) ease, border-color var(--tali-dur) ease; } .tali-copy svg { display: block; width: 14px; height: 14px; } pre:hover .tali-copy, .tali-copy:focus-visible { opacity: 1; } .tali-copy:hover { color: var(--tali-fg); border-color: var(--tali-muted); } .tali-copy.tali-copied { color: var(--tali-callout-tip); border-color: var(--tali-callout-tip); } @media (hover: none) { .tali-copy { opacity: 1; } } pre.mermaid { background: transparent; padding: .5rem 0; text-align: center; overflow-x: auto; } pre.mermaid svg { max-width: none; height: auto; } @media (min-width: 64rem) { pre.mermaid svg { max-width: 100%; } } blockquote { border-left: 3px solid var(--tali-border); margin: 0 0 1rem; padding-left: 1rem; color: var(--tali-muted); } img { max-width: 100%; height: auto; } canvas, svg, video, iframe { max-width: 100%; } table { border-collapse: collapse; display: block; width: max-content; max-width: 100%; overflow-x: auto; background: linear-gradient(to right, var(--tali-bg) 30%, transparent) left center, linear-gradient(to left, var(--tali-bg) 30%, transparent) right center, radial-gradient(farthest-side at left, var(--tali-edge-shadow), transparent) left center, radial-gradient(farthest-side at right, var(--tali-edge-shadow), transparent) right center; background-repeat: no-repeat; background-size: 38px 100%, 38px 100%, 13px 100%, 13px 100%; background-attachment: local, local, scroll, scroll; } th, td { border: 1px solid var(--tali-border); padding: calc(.25 * var(--tali-u)) .6rem; } th code, td code { overflow-wrap: normal; } th code { text-transform: none; letter-spacing: normal; } figcaption, table caption { font: var(--tali-font-body); font-size: .92rem; font-style: italic; font-weight: 400; color: var(--tali-muted); text-transform: none; letter-spacing: normal; } table caption { caption-side: top; padding-bottom: calc(.25 * var(--tali-u)); text-align: left; } .tali-caption-label { font: 400 .78rem/1.3 var(--tali-font-mono); font-style: normal; text-transform: uppercase; letter-spacing: .053em; } thead th { border-bottom: 2px solid var(--tali-border); font: 400 .78rem/1.3 var(--tali-font-mono); text-transform: uppercase; letter-spacing: .053em; } .callout { border: 0; border-left: 2px solid var(--tali-border-strong); border-radius: 0; margin: 0 0 var(--tali-u); padding-left: calc(.5 * var(--tali-u)); } .callout-title { font: var(--tali-font-body); font-weight: 600; line-height: 1.3; text-transform: none; letter-spacing: normal; margin: 0 0 calc(.5 * var(--tali-u)); display: flex; align-items: center; } .callout-title.callout-kind { font: 400 .78rem/1.3 var(--tali-font-mono); text-transform: uppercase; letter-spacing: .053em; } .callout-body { padding: 0; } .callout-body > :first-child { margin-top: 0; } .callout-body > :last-child { margin-bottom: 0; } .callout-note { border-left-color: var(--tali-callout-note); } .callout-tip { border-left-color: var(--tali-callout-tip); } .callout-warning { border-left-color: var(--tali-callout-warning); } .callout-collapse > details > summary.callout-title { cursor: pointer; } .callout-collapse > details[open] > summary.callout-title { margin-bottom: 0; } details.tali-code-fold > summary { cursor: pointer; color: var(--tali-muted); font: var(--tali-font-body); font-size: .78rem; font-weight: 400; line-height: 1.3; text-transform: none; letter-spacing: normal; padding: .15rem 0; margin-bottom: .35rem; } details.tali-code-fold > summary.tali-code-label { font: 400 .78rem/1.3 var(--tali-font-mono); text-transform: uppercase; letter-spacing: .053em; } details.tali-code-fold > summary:hover { color: var(--tali-fg); } details.tali-code-fold > summary { display: flex; align-items: center; gap: .45em; list-style: none; } details.tali-code-fold > summary::-webkit-details-marker { display: none; } details.tali-code-fold > summary::before { content: ""; flex: 0 0 auto; width: .42em; height: .42em; margin-bottom: .12em; border-top: 2px solid currentColor; border-right: 2px solid currentColor; transform: rotate(45deg); transition: transform var(--tali-dur) ease; opacity: .75; } details.tali-code-fold[open] > summary::before { transform: rotate(135deg); } .callout-collapse > details > summary.callout-title { list-style: none; } .callout-collapse > details > summary.callout-title::-webkit-details-marker { display: none; } .callout-collapse > details > summary.callout-title::after { content: ""; flex: 0 0 auto; margin-left: auto; width: .42em; height: .42em; margin-bottom: .12em; border-top: 2px solid currentColor; border-right: 2px solid currentColor; transform: rotate(45deg); transition: transform var(--tali-dur) ease; opacity: .75; } .callout-collapse > details[open] > summary.callout-title::after { transform: rotate(135deg); } .tali-xref { text-decoration: underline; text-underline-offset: .12em; text-decoration-thickness: from-font; } .tali-references .csl-entry { margin: calc(.5 * var(--tali-u)) 0; padding-left: 2.2rem; text-indent: -2.2rem; } .tali-fnref { font-size: .75em; line-height: 0; white-space: nowrap; } .tali-fnref a { text-decoration: none; padding: 0 .1em; } .tali-sidenote { display: none; } .tali-sidenote:target { display: block; margin: .6rem 0; padding-left: .9rem; border-left: 2px solid var(--tali-accent); } .tali-sidenote-num { font-size: .75em; vertical-align: super; line-height: 0; margin-right: .35em; color: var(--tali-accent); } .tali-sidenote-back { display: none; } .tali-sidenote:target .tali-sidenote-back { display: inline; margin-left: .5em; font: 400 .78rem/1.3 var(--tali-font-mono); text-transform: uppercase; letter-spacing: .053em; } @media print { #tali-main, #tali-root, #tali-main > article { display: block !important; } .tali-sidenote, .tali-sidenote:target, .column-margin { display: block; float: none; width: auto; margin: .6rem 0; padding-left: .9rem; border-left: 2px solid var(--tali-border); background: none; } .tali-sidenote-back { display: none !important; } } .column-margin { margin: 1rem 0; padding-left: .9rem; border-left: 2px solid var(--tali-accent); } .column-margin > :first-child { margin-top: 0; } .column-margin > :last-child { margin-bottom: 0; } .tali-sidenote, .column-margin { font: var(--tali-font-body); font-size: .82rem; font-weight: 400; line-height: 1.5; text-transform: none; letter-spacing: normal; color: var(--tali-muted); text-align: left; } @media (min-width: 66rem) { :is(body:not(.has-toc):not(.tali-site):not(.tali-book-body), .tali-site-main:not(.has-toc), .tali-book-main):has(.column-margin, .tali-sidenote) { --tali-note-w: 20rem; --tali-note-gap: 3.75rem; --tali-side-l: calc(var(--tali-band) - 40rem); --tali-side-r: 0; --tali-band-span: bleed-start / text-end; --tali-band-anchor: end; } :is(body:not(.has-toc):not(.tali-site):not(.tali-book-body), .tali-site-main:not(.has-toc), .tali-book-main) .tali-sidenote { display: block; float: right; clear: right; width: var(--tali-note-w); margin: .3rem calc(-1 * (var(--tali-note-w) + var(--tali-note-gap))) var(--tali-u) var(--tali-note-gap); padding-left: 0; border-left: 0; } :is(body:not(.has-toc):not(.tali-site):not(.tali-book-body), .tali-site-main:not(.has-toc), .tali-book-main) :is(#tali-main, #tali-root, #tali-main > article) > .column-margin { grid-column: note; margin: 0 0 var(--tali-u); padding-left: 0; border-left: 0; } } #tali-main, #tali-root, #tali-main > article { --tali-prose-cols: minmax(1rem, 1fr) [bleed-start] minmax(0, var(--tali-side-l)) [text-start] min(var(--tali-measure), 100% - 2rem) [text-end] var(--tali-note-gap) [note-start] var(--tali-note-w) [note-end] minmax(0, var(--tali-side-r)) [bleed-end] minmax(1rem, 1fr); display: grid; grid-template-columns: var(--tali-prose-cols); } :is(#tali-main, #tali-root, #tali-main > article) > * { grid-column: text; } #tali-main > article { grid-column: 1 / -1; } :is(#tali-main, #tali-root, #tali-main > article) > :is(pre, .column-page, details.tali-code-fold, figure.tali-listing, .tali-output, table, figure.tali-figure:has(> pre.mermaid)) { grid-column: var(--tali-band-span); } :is(#tali-main, #tali-root, #tali-main > article) > pre { box-sizing: border-box; } :is(#tali-main, #tali-root, #tali-main > article) > :is(pre, details.tali-code-fold, figure.tali-listing, .tali-output, table) { justify-self: var(--tali-band-anchor); } :is(#tali-main, #tali-root, #tali-main > article) > :is(pre, details.tali-code-fold, figure.tali-listing, .tali-output) { width: max-content; min-width: min(40rem, 100%); max-width: 100%; } :is(#tali-main, #tali-root, #tali-main > article) > .tali-output :is(img, table) { margin-inline: auto; } :is(#tali-main, #tali-root, #tali-main > article) > :is(.tali-output, figure.tali-listing, figure.tali-figure) :is(figcaption, .tali-listing-caption) { max-width: 40rem; margin-inline: auto; } .tali-output { margin: 0 0 var(--tali-u); } .tali-output:empty { display: none; } .tali-output > pre { background-color: var(--tali-code-bg); border-left: 3px solid var(--tali-border); max-height: var(--tali-output-max); background-image: linear-gradient(to bottom, var(--tali-code-bg) 30%, transparent), linear-gradient(to top, var(--tali-code-bg) 30%, transparent), radial-gradient(farthest-side at top, var(--tali-edge-shadow), transparent), radial-gradient(farthest-side at bottom, var(--tali-edge-shadow), transparent); background-position: center top, center bottom, center top, center bottom; background-repeat: no-repeat; background-size: 100% 38px, 100% 38px, 100% 13px, 100% 13px; background-attachment: local, local, scroll, scroll; } .tali-output > table { display: block; max-height: var(--tali-output-max); overflow: auto; } .tali-output img { display: block; max-width: 100%; max-height: var(--tali-output-max); object-fit: contain; } @media print { .tali-output > pre, .tali-output > table, .tali-output img { max-height: none; overflow: visible; } } img.tali-fig { display: block; max-width: 100%; } img.tali-fig-dark { display: none; } html[data-theme="dark"] img.tali-fig-light { display: none; } html[data-theme="dark"] img.tali-fig-dark { display: block; } .tali-stderr { border-left-color: var(--tali-callout-warning) !important; background: color-mix(in srgb, var(--tali-callout-warning) 13%, var(--tali-bg)) !important; } .tali-error { border-left-color: var(--tali-callout-important) !important; background: color-mix(in srgb, var(--tali-callout-important) 12%, var(--tali-bg)) !important; } [data-block-id] { scroll-margin-top: 1rem; } [data-block-id].tali-hl { outline: 2px solid var(--tali-accent); outline-offset: 3px; border-radius: var(--tali-radius); } @keyframes tali-flash { from { background-color: var(--tali-flash); } to { background-color: transparent; } } [data-block-id].tali-flash { animation: tali-flash .8s ease-out; border-radius: var(--tali-radius); } @keyframes tali-hl-fade { from { outline-color: var(--tali-accent); } to { outline-color: transparent; } } [data-block-id].tali-hl-flash { outline: 2px solid var(--tali-accent); outline-offset: 3px; border-radius: var(--tali-radius); animation: tali-hl-fade .7s ease-out forwards; } html.tali-srcnav [data-block-id], html.tali-srcnav [data-tali-src] { cursor: pointer; } .tali-src-hover { outline: 2px dashed var(--tali-accent); outline-offset: 3px; border-radius: var(--tali-radius); } figure.tali-figure { margin: 0 0 var(--tali-u); } figure.tali-figure img { max-width: 100%; height: auto; } figure.tali-figure video { display: block; width: 100%; height: auto; border: 1px solid var(--tali-border); border-radius: var(--tali-radius); background: var(--tali-code-bg); } figure.tali-figure img.tali-img-dark { display: none; } html[data-theme="dark"] figure.tali-figure img.tali-img-light { display: none; } html[data-theme="dark"] figure.tali-figure img.tali-img-dark { display: inline; } figure.tali-figure figcaption { margin-top: calc(.5 * var(--tali-u)); } figure.tali-table-figure figcaption { margin-top: 0; margin-bottom: calc(.25 * var(--tali-u)); } .tali-listing { margin: 1.5rem 0; } .tali-listing-caption { font-size: .9em; color: var(--tali-muted); margin-bottom: .35rem; } .tali-figure-center { text-align: center; } .tali-eqn { display: grid; grid-template-columns: 1fr auto; align-items: center; column-gap: 1rem; } .tali-eqn .tali-eqn-body { min-width: 0; } .tali-eqn .tali-eqn-body .katex-display { margin: 0; } .tali-eqn .tali-eqn-number { color: var(--tali-muted); font-variant-numeric: tabular-nums; white-space: nowrap; } .katex-display > .katex { width: max-content; margin: 0 auto; } .katex-display { overflow-x: auto; overflow-y: hidden; padding: .3rem 0; background: linear-gradient(to right, var(--tali-bg) 30%, transparent) left center, linear-gradient(to left, var(--tali-bg) 30%, transparent) right center, radial-gradient(farthest-side at left, var(--tali-edge-shadow), transparent) left center, radial-gradient(farthest-side at right, var(--tali-edge-shadow), transparent) right center; background-repeat: no-repeat; background-size: 38px 100%, 38px 100%, 13px 100%, 13px 100%; background-attachment: local, local, scroll, scroll; } .katex { font-size: 1.06em; } .katex-display > .katex { font-size: 1.18em; } body.has-toc { max-width: 102.25rem; display: grid; align-items: start; gap: 2.5rem; grid-template-columns: minmax(0, 1fr) 14rem; justify-content: center; } body.has-toc > main { min-width: 0; } #TOC { position: sticky; top: calc(.5 * var(--tali-u)); max-height: 92vh; overflow: auto; font: 400 .78rem/1.3 var(--tali-font-mono); text-transform: uppercase; letter-spacing: .053em; } #TOC ul { list-style: none; margin: .2rem 0; padding-left: .9rem; } #TOC > ul { padding-left: 0; } #TOC ul ul { display: none; } #TOC li.tali-toc-expanded > ul { display: block; } #TOC a { display: block; padding: .12rem 0 .12rem .6rem; border-left: 2px solid transparent; color: var(--tali-muted); text-decoration: none; } #TOC a:hover { color: var(--tali-fg); } #TOC a.tali-toc-active { color: var(--tali-fg); border-left-color: var(--tali-accent); } @media (max-width: 60rem) { body { padding-bottom: 2.75rem; } body.has-toc { grid-template-columns: minmax(0, 1fr); max-width: none; gap: 0; } body.has-toc > #TOC { order: -1; position: static; max-height: 45vh; overflow: auto; border-bottom: 1px solid var(--tali-border); margin-bottom: var(--tali-u); padding-bottom: calc(.5 * var(--tali-u)); } .tali-layout { grid-template-columns: minmax(0, 1fr) !important; } } @media (max-width: 30rem) { body { font-size: 16px; } .tali-title-block .title { font-size: 2rem; } .tali-title-block .subtitle { font-size: 1.12rem; } h1 { font-size: 1.8rem; } h2 { font-size: 1.28rem; } h3 { font-size: 1.04rem; } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; scroll-behavior: auto !important; } } @media (prefers-reduced-motion: no-preference) { @view-transition { navigation: auto; } } @media (forced-colors: active) { a:focus-visible, button:focus-visible, [role="button"]:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible, summary:focus-visible, [tabindex="0"]:focus-visible, .tali-skip:focus-visible { outline: 2px solid Highlight; outline-offset: 2px; } .callout, blockquote, table, .tali-figure figure, pre { border: 1px solid CanvasText; } } @media (prefers-contrast: more) { :root:root { --tali-muted: var(--tali-fg); --tali-border: var(--tali-fg); } } @media print { :root:root { --tali-bg: #fff; --tali-fg: #111; --tali-muted: #555; --tali-border: #ccc; --tali-code-bg: #f5f5f5; --tali-link: var(--tali-fg); --tali-accent: var(--tali-fg); } #tali-controls, #tali-diagnostics, .tali-copy { display: none !important; } body { max-width: none !important; margin: 0 !important; } body.has-toc { display: grid !important; grid-template-columns: 1fr !important; gap: 0 !important; } body.has-toc > #TOC { position: static !important; transform: none !important; order: -1 !important; max-height: none !important; overflow: visible !important; z-index: auto !important; background: transparent !important; border-radius: 0 !important; margin: 0 0 1.5rem !important; padding: 0 0 1rem !important; border-bottom: 1px solid var(--tali-border) !important; } #TOC::before { display: none !important; } #TOC ul ul { display: block !important; } pre { white-space: pre-wrap !important; overflow: visible !important; background-image: none !important; } table { display: table !important; overflow: visible !important; background: none !important; } .katex-display { overflow: visible !important; background: none !important; } pre, figure, table, blockquote, .callout, .tali-eqn { break-inside: avoid; } h2, h3, h4 { break-after: avoid; } a[href^="http"]::after { content: " (" attr(href) ")"; font-size: .85em; color: var(--tali-muted); word-break: break-all; } } .tali-js-error { background: color-mix(in srgb, var(--tali-callout-important) 12%, var(--tali-bg)); border: 1px solid color-mix(in srgb, var(--tali-callout-important) 45%, transparent); padding: .5em .7em; border-radius: var(--tali-radius); overflow: auto; font-size: .85em; white-space: pre-wrap; overflow-wrap: anywhere; } html[data-theme="dark"] pre.mermaid { background: transparent; } html[data-theme="dark"] .tali-hl-comment { color: #8C877C; font-style: italic; } html[data-theme="dark"] .tali-hl-string { color: #8FBBA3; } html[data-theme="dark"] .tali-hl-keyword, html[data-theme="dark"] .tali-hl-storage { color: #D99BB0; } html[data-theme="dark"] .tali-hl-constant, html[data-theme="dark"] .tali-hl-support { color: #9DB4DA; } html[data-theme="dark"] .tali-hl-entity { color: #D0A67C; } html[data-theme="dark"] .tali-hl-variable { color: #EAE7E0; } body.tali-site { max-width: none; margin: 0; padding: 0; min-height: 100vh; display: flex; flex-direction: column; --tali-nav-h: 3.25rem; } @media (min-width: 60.001rem) { body.tali-site #TOC { top: calc(var(--tali-nav-h) + 1rem); } } body.tali-site [data-block-id] { scroll-margin-top: calc(var(--tali-nav-h) + 1rem); } :is(.tali-site-nav, .tali-book-topbar) { position: sticky; top: 0; z-index: 50; background: var(--tali-bg); border-bottom: 1px solid var(--tali-border); } :is(.tali-nav-inner, .tali-book-topbar-inner) { position: relative; max-width: var(--tali-chrome-maxw); margin: 0 auto; padding: calc(.25 * var(--tali-u)) 1rem; display: flex; align-items: center; gap: 1.1rem; font: 400 .78rem/1.3 var(--tali-font-mono); text-transform: uppercase; letter-spacing: .053em; } .tali-book-topbar-inner { gap: .7rem; } .tali-nav-brand { color: var(--tali-fg); text-decoration: none; white-space: nowrap; font: var(--tali-font-body); font-size: 1.02rem; font-weight: 700; line-height: 1.3; text-transform: none; letter-spacing: normal; } .tali-brand-logo { display: block; max-height: 1.75rem; width: auto; max-width: min(14rem, 45vw, 100%); object-fit: contain; } .tali-nav-links { display: flex; align-items: center; gap: .35rem; flex: 1; } .tali-nav-spacer { flex: 1 1 auto; } .tali-nav-link { display: inline-flex; flex-direction: column; align-items: flex-start; color: var(--tali-muted); text-decoration: none; padding: .35rem .6rem; border-radius: var(--tali-radius); white-space: nowrap; transition: color var(--tali-dur) ease, background var(--tali-dur) ease; } .tali-nav-link::after { content: attr(data-label); font-weight: 600; height: 0; overflow: hidden; visibility: hidden; pointer-events: none; } .tali-nav-link:hover { color: var(--tali-fg); background: var(--tali-code-bg); } .tali-nav-icon { align-items: center; padding: .35rem .5rem; } .tali-nav-icon::after { content: none; } .tali-nav-icon svg { display: block; } .tali-nav-active { color: var(--tali-fg); font-weight: 600; text-decoration: underline; text-decoration-color: var(--tali-accent); text-decoration-thickness: 2px; text-underline-offset: 6px; } .tali-nav-active:hover { background: transparent; } .tali-search-btn { display: inline-flex; align-items: center; gap: .4rem; background: var(--tali-code-bg); color: var(--tali-muted); border: 1px solid var(--tali-border); border-radius: var(--tali-radius); padding: .32rem .55rem; font: inherit; font-size: .9rem; line-height: 1; cursor: pointer; transition: border-color var(--tali-dur) ease, color var(--tali-dur) ease; } .tali-search-btn:hover { border-color: var(--tali-accent); color: var(--tali-fg); } .tali-search-btn svg { flex: none; } .tali-search-kbd { font-family: var(--tali-font-mono); font-size: .72rem; border: 1px solid var(--tali-border); border-radius: var(--tali-radius); padding: 0 .3rem; color: var(--tali-muted); } .tali-nav-burger { display: none; background: transparent; border: 0; } .tali-site-main { box-sizing: border-box; flex: 1 0 auto; width: 100%; max-width: none; margin: 0 auto; padding: 2rem 0; } .tali-site-main > main { min-width: 0; } .tali-site-main.has-toc { max-width: 102.25rem; display: grid; align-items: start; gap: 2.5rem; grid-template-columns: minmax(0, 1fr) 14rem; } @media (max-width: 60rem) { .tali-site-main.has-toc { grid-template-columns: minmax(0, 1fr); } .tali-site-main.has-toc > #TOC { order: -1; position: static; max-height: 45vh; overflow: auto; border-bottom: 1px solid var(--tali-border); margin-bottom: var(--tali-u); padding-bottom: calc(.5 * var(--tali-u)); } } .tali-site-footer { flex-shrink: 0; border-top: 1px solid var(--tali-border); } .tali-foot-inner { max-width: var(--tali-chrome-maxw); margin: 0 auto; padding: calc(.5 * var(--tali-u)) 1rem; display: flex; align-items: center; gap: 1.25rem; flex-wrap: wrap; font: 400 .78rem/1.3 var(--tali-font-mono); text-transform: uppercase; letter-spacing: .053em; color: var(--tali-muted); } .tali-foot-left, .tali-foot-center, .tali-foot-right { display: inline-flex; align-items: center; gap: 1.1rem; } .tali-foot-left:empty, .tali-foot-center:empty, .tali-foot-right:empty { display: none; } .tali-foot-center { flex: 1 1 auto; justify-content: center; } .tali-foot-right { margin-left: auto; } .tali-foot-item { color: var(--tali-muted); text-decoration: none; display: inline-flex; align-items: center; gap: .35rem; } a.tali-foot-item:hover { color: var(--tali-fg); } .tali-foot-item svg { width: 16px; height: 16px; } a.tali-foot-item:has(svg) { min-height: 24px; min-width: 24px; justify-content: center; } .tali-listing { margin: calc(2 * var(--tali-u)) 0; padding: 0; list-style: none; border-top: 1px solid var(--tali-border); } .tali-listing > .tali-listing-item { display: flex; margin: 0; padding: 0; border-bottom: 1px solid var(--tali-border); } .tali-listing > .tali-listing-item > .tali-card { flex: 1 1 auto; min-width: 0; } .tali-card { display: flex; flex-direction: column; text-decoration: none; color: var(--tali-fg); padding: var(--tali-u) 0; transition: background var(--tali-dur) ease; } .tali-card:hover, .tali-card:focus-visible { background: var(--tali-code-bg); } .tali-card-img { width: 100%; max-width: 12rem; aspect-ratio: 16 / 9; object-fit: cover; display: block; margin-bottom: calc(.5 * var(--tali-u)); background: var(--tali-code-bg); } .tali-card-body { display: flex; flex-direction: column; gap: calc(.25 * var(--tali-u)); } .tali-card-date { display: block; font: 400 .78rem/1.3 var(--tali-font-mono); color: var(--tali-muted); text-transform: uppercase; letter-spacing: .053em; } .tali-card-title { font-weight: 600; font-size: 1.25rem; line-height: 1.25; margin: 0; } .tali-card-desc { margin: 0; font-size: .92rem; color: var(--tali-muted); line-height: 1.5; } @media (max-width: 40rem) { .tali-search-kbd { display: none; } .tali-nav-burger { display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 4px; cursor: pointer; margin-left: auto; width: 44px; height: 44px; padding: 0; } .tali-nav-burger span { display: block; width: 22px; height: 2px; border-radius: 2px; background: var(--tali-fg); transition: transform var(--tali-dur) ease, opacity var(--tali-dur) ease; } .tali-nav-links { display: none; position: absolute; top: 100%; left: 0; right: 0; flex-direction: column; align-items: stretch; gap: 0; flex: none; background: var(--tali-bg); border-bottom: 1px solid var(--tali-border); padding: .35rem 0; } .tali-nav-links.tali-nav-open { display: flex; } .tali-nav-spacer { display: none; } .tali-nav-link { padding: .7rem 1.15rem; border-radius: 0; } } @media (hover: none) and (pointer: coarse) { .tali-search-kbd { display: none; } .tali-nav-link { position: relative; } .tali-nav-link::before { content: ""; position: absolute; left: 0; right: 0; top: 50%; transform: translateY(-50%); height: 44px; } .tali-nav-icon { min-width: 44px; } } body.tali-book-body { max-width: none; margin: 0; padding: 0; --tali-nav-h: 3.25rem; min-height: 100vh; display: flex; flex-direction: column; } body.tali-book-body [data-block-id] { scroll-margin-top: calc(var(--tali-nav-h) + 1rem); } .tali-book-drawer-btn { display: inline-flex; align-items: center; gap: .45rem; background: transparent; border: 1px solid var(--tali-border); border-radius: var(--tali-radius); color: var(--tali-fg); cursor: pointer; padding: .35rem .6rem; font: inherit; font-size: .9rem; transition: border-color var(--tali-dur) ease, color var(--tali-dur) ease; } .tali-book-drawer-btn:hover { border-color: var(--tali-accent); } .tali-book-drawer-btn svg { display: block; flex: none; } .tali-book-topbar .tali-nav-spacer { flex: 1 1 auto; } .tali-book-main { box-sizing: border-box; flex: 1 0 auto; width: 100%; max-width: none; margin: 0 auto; padding: 2rem 0; } .tali-book-inner > main { min-width: 0; } .tali-book-postnav { display: flex; align-items: center; gap: 1rem; margin-top: calc(2 * var(--tali-u)); padding-top: calc(.5 * var(--tali-u)); border-top: 1px solid var(--tali-border); } .tali-book-prev, .tali-book-next { color: var(--tali-muted); text-decoration: none; font-size: .95rem; } .tali-book-prev:hover, .tali-book-next:hover { color: var(--tali-link); } .tali-book-postnav .tali-nav-spacer { flex: 1 1 auto; } .tali-listing-backnav { margin-top: calc(2 * var(--tali-u)); padding-top: calc(.5 * var(--tali-u)); border-top: 1px solid var(--tali-border); } .tali-back-link { color: var(--tali-muted); text-decoration: none; font-size: .95rem; } .tali-back-link:hover { color: var(--tali-link); } .tali-section-number { color: var(--tali-muted); font-weight: inherit; margin-right: .15em; } .tali-book-drawer[hidden] { display: none; } .tali-book-drawer { position: fixed; inset: 0; z-index: 60; } .tali-book-drawer-backdrop { position: absolute; inset: 0; background: var(--tali-scrim); } .tali-book-drawer-panel { position: absolute; top: 0; left: 0; bottom: 0; width: min(20rem, 86vw); overflow-y: auto; overscroll-behavior: contain; padding: var(--tali-u) calc(.5 * var(--tali-u)) calc(2 * var(--tali-u)); background: var(--tali-bg); border-right: 1px solid var(--tali-border); animation: tali-book-drawer-in var(--tali-dur) ease; } @keyframes tali-book-drawer-in { from { transform: translateX(-100%); } to { transform: translateX(0); } } @media (prefers-reduced-motion: reduce) { .tali-book-drawer-panel { animation: none; } } .tali-book-sidebar-head { display: flex; align-items: center; justify-content: space-between; gap: .5rem; margin: 0 0 calc(.5 * var(--tali-u)); } .tali-book-brand { display: block; color: var(--tali-fg); text-decoration: none; font: var(--tali-font-body); font-size: 1.02rem; font-weight: 700; line-height: 1.25; text-transform: none; letter-spacing: normal; } .tali-book-topbar .tali-book-brand { min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } @media (max-width: 22rem) { .tali-book-drawer-btn span { display: none; } .tali-book-drawer-btn { padding: .35rem .45rem; } } .tali-book-drawer-close { flex: 0 0 auto; background: transparent; border: 0; cursor: pointer; color: var(--tali-muted); font-size: 1.1rem; line-height: 1; padding: .15rem .35rem; display: inline-flex; align-items: center; justify-content: center; min-width: 24px; min-height: 24px; border-radius: var(--tali-radius); } @media (hover: none) and (pointer: coarse) { .tali-book-drawer-close { min-width: 44px; min-height: 44px; } } .tali-book-drawer-close:hover { color: var(--tali-fg); background: var(--tali-code-bg); } .tali-book-chapters { list-style: none; margin: 0; padding: 0; } .tali-book-part { margin: var(--tali-u) 0 calc(.25 * var(--tali-u)); font-size: 1rem; font-weight: 600; color: var(--tali-muted); } .tali-book-part-nested { margin-left: .9rem; } .tali-book-chapter { display: block; padding: calc(.25 * var(--tali-u)) 0; color: var(--tali-muted); text-decoration: none; font-size: .95rem; line-height: 1.3; } .tali-book-chapter:hover { color: var(--tali-fg); } .tali-book-active { color: var(--tali-link); font-weight: 600; } .tali-chap-num { color: var(--tali-muted); margin-right: .25rem; } .tali-book-active .tali-chap-num { color: var(--tali-link); } @media (forced-colors: active) { .tali-site-nav, .tali-book-topbar { border-bottom: 1px solid CanvasText; } .tali-site-footer { border-top: 1px solid CanvasText; } .tali-book-drawer-panel { border-right: 1px solid CanvasText; } .tali-nav-active, .tali-book-active, a[aria-current="page"] { text-decoration: underline; text-underline-offset: 3px; } .tali-search-btn, .tali-nav-burger, .tali-book-drawer-btn { border: 1px solid CanvasText; } } .tali-draft-badge { display: inline-block; align-self: flex-start; font-size: .7rem; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--tali-bg); background: var(--tali-muted); border-radius: var(--tali-radius); padding: .05rem .35rem; margin-right: .4rem; vertical-align: middle; } .tali-draft-banner { text-align: center; font-size: .8rem; font-weight: 600; letter-spacing: .03em; color: var(--tali-bg); background: var(--tali-muted); padding: .3rem .6rem; }