open_blog 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -4
- data/README.md +60 -32
- data/app/assets/builds/open_blog/blog.css +1 -1
- data/app/assets/builds/open_blog/themes.css +403 -0
- data/app/assets/fonts/open_blog/OFL-dm-sans.txt +93 -0
- data/app/assets/fonts/open_blog/OFL-jetbrains-mono.txt +93 -0
- data/app/assets/fonts/open_blog/OFL-newsreader.txt +93 -0
- data/app/assets/fonts/open_blog/OFL-outfit.txt +93 -0
- data/app/assets/fonts/open_blog/OFL-space-grotesk.txt +93 -0
- data/app/assets/fonts/open_blog/dm-sans-italic-latin-ext.woff2 +0 -0
- data/app/assets/fonts/open_blog/dm-sans-italic-latin.woff2 +0 -0
- data/app/assets/fonts/open_blog/dm-sans-latin-ext.woff2 +0 -0
- data/app/assets/fonts/open_blog/dm-sans-latin.woff2 +0 -0
- data/app/assets/fonts/open_blog/jetbrains-mono-latin-ext.woff2 +0 -0
- data/app/assets/fonts/open_blog/jetbrains-mono-latin.woff2 +0 -0
- data/app/assets/fonts/open_blog/newsreader-italic-latin-ext.woff2 +0 -0
- data/app/assets/fonts/open_blog/newsreader-italic-latin.woff2 +0 -0
- data/app/assets/fonts/open_blog/newsreader-latin-ext.woff2 +0 -0
- data/app/assets/fonts/open_blog/newsreader-latin.woff2 +0 -0
- data/app/assets/fonts/open_blog/outfit-latin-ext.woff2 +0 -0
- data/app/assets/fonts/open_blog/outfit-latin.woff2 +0 -0
- data/app/assets/fonts/open_blog/space-grotesk-latin-ext.woff2 +0 -0
- data/app/assets/fonts/open_blog/space-grotesk-latin.woff2 +0 -0
- data/app/controllers/open_blog/api/v1/pages_controller.rb +5 -5
- data/app/helpers/open_blog/faq_helper.rb +3 -1
- data/app/helpers/open_blog/theme_helper.rb +29 -5
- data/lib/generators/open_blog/generator_support.rb +5 -5
- data/lib/generators/open_blog/install/install_generator.rb +22 -1
- data/lib/generators/open_blog/install/templates/initializer.rb.tt +1 -0
- data/lib/generators/open_blog/install/templates/theme/blog.css +194 -93
- data/lib/generators/open_blog/install/templates/theme/open_blog_theme.css +17 -81
- data/lib/generators/open_blog/install/templates/theme/theme.css +3 -85
- data/lib/generators/open_blog/views/views_generator.rb +1 -1
- data/lib/open_blog/build_css.rb +51 -8
- data/lib/open_blog/configuration.rb +37 -1
- data/lib/open_blog/doctor/files.rb +50 -11
- data/lib/open_blog/themes.rb +167 -0
- data/lib/open_blog/version.rb +1 -1
- data/lib/open_blog.rb +1 -0
- data/lib/tasks/open_blog.rake +1 -1
- data/skills/open-blog-install/SKILL.md +1 -1
- metadata +23 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7dc9141447562952baf038f0a5a46bd4d6f300d7fd86d2f87f621ac4103ab22b
|
|
4
|
+
data.tar.gz: bed8bf059533885de53c23f62ba7de2166f4b529846ef53614dc1d0d90740e4d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: '08b3286b42ed0b5ed9ab2879946d7fb122743732b51f5fb7e711cb403bcbbd92e30ae0482fa5ed7629d644962076351563e60a07cc93aa47fc63533a3f3015e8'
|
|
7
|
+
data.tar.gz: c81810d3ec0184a8283a3e9e5ce0d124f9bc762350a6d7bb2aa92c406825788dc3bee83384b2a4093f767aca5201835b48cd55ab7f3e813f2cb40cb228d399b8
|
data/CHANGELOG.md
CHANGED
|
@@ -7,19 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
## [0.
|
|
10
|
+
## [0.2.0] - 2026-10-10
|
|
11
11
|
|
|
12
12
|
### Added
|
|
13
13
|
|
|
14
|
-
-
|
|
15
|
-
-
|
|
14
|
+
- Add three reader presets, Signal, Editorial, and Ink, selected with `config.theme`. Each has light and dark values that meet WCAG 2.2 AA contrast.
|
|
15
|
+
- Ship the preset fonts (Outfit, DM Sans, Newsreader, Space Grotesk, and JetBrains Mono) as woff2 files with their license texts. No font loads from another site.
|
|
16
|
+
- Add `config.theme_colors` for hex color overrides of the preset, for both modes or per mode. Doctor warns when an override takes a text and background pair below 4.5:1; a translucent color is measured over the color under it.
|
|
17
|
+
- Add the `--theme=signal|editorial|ink` installer option.
|
|
18
|
+
- Collapse FAQ entries into `<details>` elements by default; `config.faq_collapsed = false` keeps every answer visible.
|
|
19
|
+
- Add a Themes guide with the presets, palette overrides, the token reference, and fonts.
|
|
16
20
|
|
|
17
21
|
### Changed
|
|
18
22
|
|
|
19
|
-
-
|
|
23
|
+
- The default look is the Signal preset in place of the blue slate theme.
|
|
24
|
+
- The copied token file is now an override stub. Token values come from the preset stylesheet `open_blog/themes.css`, which the gem serves in every host setup.
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
|
|
28
|
+
- Wait for RubyGems to index a pushed version before tagging the release, instead of refusing the tag.
|
|
29
|
+
- Update the existing policy page when two first writes to `PUT /api/v1/pages/:kind` race, instead of answering one of them with `422 validation_failed`.
|
|
30
|
+
|
|
31
|
+
### Upgrade notes
|
|
32
|
+
|
|
33
|
+
- The default look of a 0.1.0 host changes to the Signal preset. A `--skip-tailwind` or Tailwind 3 host gets it when the gem is updated. A Tailwind 4 host gets it after its copied stylesheets and layout are refreshed, as the next two notes show. A host that edited its copied tokens sets `config.theme = :none` to keep them, or moves its hex values to `config.theme_colors`.
|
|
34
|
+
- In a Tailwind 4 host, the copied `app/assets/tailwind/open_blog/blog.css` and `theme.css` are the 0.1.0 files, with no preset rules and no styles for the collapsed FAQ. `bin/rails generate open_blog:install` keeps files that exist, so delete these two files and then run it; doctor gives a warning until `blog.css` is replaced. Do not use `--force` on a configured host, because it also replaces `config/initializers/open_blog.rb`.
|
|
35
|
+
- In a Tailwind 4 host, the blog layout must call `open_blog_theme_stylesheets` before the host stylesheet tag, or `bin/rails open_blog:doctor` reports an error. `bin/rails generate open_blog:views --force` writes that layout.
|
|
36
|
+
- FAQ entries are now collapsed. Set `config.faq_collapsed = false` for the 0.1.0 markup.
|
|
37
|
+
- The [Themes guide](https://techwright-lab.github.io/open-blog/themes/#upgrade-from-010) lists each step.
|
|
38
|
+
|
|
39
|
+
## [0.1.0] - 2026-10-03
|
|
20
40
|
|
|
21
41
|
### Added
|
|
22
42
|
|
|
43
|
+
- Publish searchable public documentation with installation, configuration, publishing, API, MCP, and customization guides.
|
|
44
|
+
- Prepare release pull requests that update the version and dated changelog, then publish verified packages to RubyGems and synchronize GitHub Releases.
|
|
45
|
+
|
|
23
46
|
- Initial gem package, runtime dependencies, tests, and continuous integration.
|
|
24
47
|
- Add a mountable engine with validated configuration and a PostgreSQL/SQLite host test matrix.
|
|
25
48
|
- Add content models, reversible database migrations, deterministic revision identifiers, and immutable publishing records.
|
data/README.md
CHANGED
|
@@ -1,18 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
<h1 align="center">Open Blog</h1>
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
An agentic blog engine for Rails. Markdown and rich-text articles, responsive reader pages,
|
|
5
|
+
immutable revision history, and publishing through Ruby, a JSON API, or MCP tools.
|
|
6
|
+
</p>
|
|
7
|
+
|
|
8
|
+
<p align="center">
|
|
9
|
+
<a href="https://rubygems.org/gems/open_blog"><img alt="Gem version" src="https://img.shields.io/gem/v/open_blog?label=gem&color=cc342d"></a>
|
|
10
|
+
<a href="https://github.com/techwright-lab/open-blog/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/techwright-lab/open-blog/actions/workflows/ci.yml/badge.svg"></a>
|
|
11
|
+
<a href="https://github.com/techwright-lab/open-blog/actions/workflows/installer.yml"><img alt="Installer" src="https://github.com/techwright-lab/open-blog/actions/workflows/installer.yml/badge.svg"></a>
|
|
12
|
+
<a href="https://techwright-lab.github.io/open-blog/"><img alt="Documentation" src="https://img.shields.io/badge/docs-techwright--lab.github.io-1d4ed8"></a>
|
|
13
|
+
<a href="LICENSE.txt"><img alt="License: MIT" src="https://img.shields.io/badge/license-MIT-green"></a>
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
<p align="center">
|
|
17
|
+
<a href="https://techwright-lab.github.io/open-blog/">Documentation</a> ·
|
|
18
|
+
<a href="https://techwright-lab.github.io/open-blog/installation/">Installation</a> ·
|
|
19
|
+
<a href="https://techwright-lab.github.io/open-blog/api/">API reference</a> ·
|
|
20
|
+
<a href="https://techwright-lab.github.io/open-blog/mcp/">MCP</a> ·
|
|
21
|
+
<a href="CHANGELOG.md">Changelog</a>
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
<table align="center">
|
|
25
|
+
<tr>
|
|
26
|
+
<td><img src=".github/images/theme-signal-light.png" alt="Signal preset in light mode" width="420"></td>
|
|
27
|
+
<td><img src=".github/images/theme-signal-dark.png" alt="Signal preset in dark mode" width="420"></td>
|
|
28
|
+
</tr>
|
|
29
|
+
</table>
|
|
30
|
+
|
|
31
|
+
Every publish, edit, approval, and removal leaves an immutable record. A reader can trust the dates and notices on the page, and an agent can publish without inventing a review.
|
|
32
|
+
|
|
33
|
+
## Highlights
|
|
34
|
+
|
|
35
|
+
| | |
|
|
36
|
+
| --- | --- |
|
|
37
|
+
| **Reader pages** | Categories, tags, authors, series, search, Atom and JSON feeds, a sitemap, and structured data. The templates are copied into your app so you can change them. |
|
|
38
|
+
| **Themes** | Three presets, Signal, Editorial, and Ink, each with light and dark mode. Change the palette from the configuration. Fonts ship with the gem; nothing loads from another site. |
|
|
39
|
+
| **Publishing operations** | Ruby operations compute a revision identifier from the content, record each release, and refuse a public edit that does not say whether it is substantive, a correction, or maintenance. |
|
|
40
|
+
| **JSON API and MCP** | Scoped tokens let editorial tools and AI agents publish through the same guarded path. Six agent workflows ship in the gem. |
|
|
41
|
+
| **Approvals and provenance** | A post carries who wrote it, who reviewed which revision, and whether facts were checked. The AI notice on the page follows those records. |
|
|
42
|
+
| **Adoption** | Import an existing blog with its known history, dates, and redirects, without claiming a new first publication. |
|
|
43
|
+
| **Operations** | Policy pages, page views, diagnostics, and surface reports that check what readers actually see against the stored records. |
|
|
44
|
+
| **AdminSuite** | Optional generated resources for a browser-based editor. |
|
|
16
45
|
|
|
17
46
|
## Requirements
|
|
18
47
|
|
|
@@ -27,24 +56,20 @@ Every combination of Ruby, Rails, and database above runs in CI.
|
|
|
27
56
|
|
|
28
57
|
## Install
|
|
29
58
|
|
|
30
|
-
Install from GitHub until a version is published on RubyGems:
|
|
31
|
-
|
|
32
59
|
```sh
|
|
33
|
-
bundle add open_blog
|
|
60
|
+
bundle add open_blog
|
|
34
61
|
bin/rails generate open_blog:install
|
|
35
62
|
```
|
|
36
63
|
|
|
64
|
+
To run the latest unreleased source instead, use `bundle add open_blog --github techwright-lab/open-blog`.
|
|
65
|
+
|
|
37
66
|
Start `bin/dev` (or `bin/rails server`) and open `/blog`. The generator installs tables, mounts the engine at `/blog`, copies the reader views and browser controllers, writes `config/initializers/open_blog.rb`, and publishes a sample article. If it prints an API token, save it: the secret is shown once.
|
|
38
67
|
|
|
39
68
|
Set your site name, publisher, and public origin in the initializer, then run `bin/rails open_blog:doctor` to check the setup. The [installation guide](https://techwright-lab.github.io/open-blog/installation/) lists every generator option, and the [configuration reference](https://techwright-lab.github.io/open-blog/configuration/) lists every setting with its default.
|
|
40
69
|
|
|
41
|
-

|
|
42
|
-
|
|
43
|
-

|
|
44
|
-
|
|
45
70
|
## Publish a post
|
|
46
71
|
|
|
47
|
-
From Ruby
|
|
72
|
+
**From Ruby:**
|
|
48
73
|
|
|
49
74
|
```ruby
|
|
50
75
|
result = OpenBlog::Publish.call(
|
|
@@ -56,7 +81,7 @@ result.post.path # => "/blog/garden-notes"
|
|
|
56
81
|
result.records # => { revision: "new", publication: "first", approval: nil }
|
|
57
82
|
```
|
|
58
83
|
|
|
59
|
-
From the JSON API
|
|
84
|
+
**From the JSON API**, with a token from `bin/rails open_blog:token`:
|
|
60
85
|
|
|
61
86
|
```sh
|
|
62
87
|
curl -s -X POST https://example.com/blog/api/v1/posts \
|
|
@@ -64,19 +89,22 @@ curl -s -X POST https://example.com/blog/api/v1/posts \
|
|
|
64
89
|
-d '{"title":"Garden notes","body":"Today in the garden.","publish":true}'
|
|
65
90
|
```
|
|
66
91
|
|
|
67
|
-
From an agent
|
|
92
|
+
**From an agent**, point an MCP client at `https://example.com/blog/mcp` with the same token. The `blog_save_draft` tool returns a preview link, and `blog_publish_post` records the release. Agents must show the exact text to a person and record only the approval they actually give; the [publishing instructions](https://techwright-lab.github.io/open-blog/mcp/#publishing-instructions) spell this out.
|
|
68
93
|
|
|
69
94
|
A later edit of a public post must carry `change: "substantive"`, `"correction"`, or `"maintenance"`. Without it the write is refused and nothing changes. Normal model saves and the operations keep this history; bulk SQL writes bypass it.
|
|
70
95
|
|
|
71
96
|
## Guides
|
|
72
97
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
- [
|
|
78
|
-
|
|
79
|
-
|
|
98
|
+
| Guide | Covers |
|
|
99
|
+
| --- | --- |
|
|
100
|
+
| [Configuration](https://techwright-lab.github.io/open-blog/configuration/) | Identity, routes, content gates, images, limits, and page views |
|
|
101
|
+
| [Publishing](https://techwright-lab.github.io/open-blog/publishing/) | Operations, previews, scheduling, approvals, and findings |
|
|
102
|
+
| [JSON API](https://techwright-lab.github.io/open-blog/api/) and [MCP](https://techwright-lab.github.io/open-blog/mcp/) | Endpoints, tools, examples, and error codes |
|
|
103
|
+
| [Reader pages and feeds](https://techwright-lab.github.io/open-blog/reader/) | Routes, search, feeds, dates, images, and policy pages |
|
|
104
|
+
| [Adoption](https://techwright-lab.github.io/open-blog/adoption/) | Import existing articles and preserve their known history |
|
|
105
|
+
| [Customization](https://techwright-lab.github.io/open-blog/customization/) | Copied templates, stylesheets, and browser controllers |
|
|
106
|
+
| [Themes](https://techwright-lab.github.io/open-blog/themes/) | Presets, palette overrides, design tokens, and fonts |
|
|
107
|
+
| [AdminSuite](https://techwright-lab.github.io/open-blog/admin-suite/), [Diagnostics](https://techwright-lab.github.io/open-blog/diagnostics/), [Page views](https://techwright-lab.github.io/open-blog/analytics/) | Optional editor, setup checks, surface reports, and analytics |
|
|
80
108
|
|
|
81
109
|
## Development
|
|
82
110
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.hidden{display:none}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}}.ob-page{background:var(--ob-surface);color:var(--ob-text);font-family:var(--ob-font-body);overflow-wrap:anywhere;margin:0;line-height:1.6}.ob-page *,.ob-page :before,.ob-page :after{box-sizing:border-box}.ob-page [hidden]{display:none!important}.ob-page a{color:var(--ob-accent);text-underline-offset:.2em}.ob-page a:hover{color:var(--ob-accent-hover)}.ob-page a:focus-visible,.ob-page button:focus-visible,.ob-page input:focus-visible,.ob-page .ob-table:focus-visible,.ob-page .ob-prose pre:focus-visible{outline:3px solid var(--ob-accent);outline-offset:4px}.ob-page h1,.ob-page h2,.ob-page h3,.ob-page h4,.ob-page h5,.ob-page h6{color:var(--ob-heading);font-family:var(--ob-font-display);text-wrap:balance;font-weight:750;line-height:1.25}.ob-page h1{letter-spacing:-.035em;font-size:clamp(1.875rem,4vw,3rem)}.ob-page h2{font-size:1.5rem}.ob-page h3{font-size:1.25rem}.ob-page h4,.ob-page h5,.ob-page h6{font-size:1.125rem}.ob-page img{max-width:100%;height:auto}.ob-page button{cursor:pointer;font:inherit}.ob-page button:disabled{cursor:default}.ob-main{max-width:var(--ob-page-width);margin:auto;padding:3rem 1rem}.ob-header,.ob-footer{max-width:var(--ob-page-width);flex-wrap:wrap;align-items:center;gap:1rem;margin:auto;padding:1.25rem 1rem;display:flex}.ob-header{border-bottom:1px solid var(--ob-border)}.ob-header nav{margin-left:auto}.ob-site-name{font-size:1.125rem;font-weight:800;text-decoration:none}.ob-footer{border-top:1px solid var(--ob-border);font-size:.875rem}.ob-footer nav{flex-wrap:wrap;gap:1rem;display:flex}.ob-index-heading,.ob-list-heading{margin-bottom:1.5rem}.ob-index-heading h1{font-size:2.25rem;font-weight:800}.ob-tagline,.ob-list-description,.ob-lede{color:var(--ob-text-muted);margin-top:.75rem;font-size:1.125rem}.ob-list-layout{gap:2rem;display:grid}.ob-list-main,.ob-sidebar,.ob-post-card,.ob-featured-details{min-width:0}.ob-search{margin-bottom:1.5rem}.ob-search label{margin-bottom:.5rem;font-weight:700;display:block}.ob-search-controls{gap:.5rem;display:flex}.ob-search input{border:1px solid var(--ob-border-strong);background:var(--ob-surface);width:100%;min-width:0;color:var(--ob-text);font:inherit;border-radius:.5rem;padding:.5rem}.ob-search button{white-space:nowrap;background:var(--ob-accent);color:var(--ob-accent-contrast);border-radius:.5rem;flex-shrink:0;padding:.5rem .75rem}.ob-search-results{border:1px solid var(--ob-border);background:var(--ob-surface-raised);border-radius:.5rem;margin-top:.75rem}.ob-sidebar .ob-search-results a{border-radius:.5rem;display:block}.ob-search-results a:hover{background:var(--ob-accent-soft)}.ob-series-nav{border:1px solid var(--ob-border);border-radius:.75rem;margin:2rem 0;padding:1.25rem}.ob-series-nav h2{margin-bottom:.75rem;font-size:1.125rem}.ob-series-nav p+p{margin-top:.5rem}.ob-sidebar h2{margin-bottom:.75rem;font-size:1rem}.ob-sidebar-categories ul{gap:.5rem;padding-bottom:.5rem;display:flex;overflow-x:auto}.ob-sidebar-categories li{flex-shrink:0}.ob-sidebar a{border-radius:var(--ob-radius-pill);padding:.4rem .8rem;text-decoration:none;display:block}.ob-sidebar a[aria-current=page]{color:var(--ob-accent-contrast);background:var(--ob-accent)}.ob-sidebar-popular{margin-top:1.5rem}.ob-sidebar-popular li+li{margin-top:.25rem}.ob-sidebar-tags,.ob-count{display:none}.ob-post-grid{grid-template-columns:minmax(0,1fr);gap:2rem;display:grid}.ob-card-media{border-radius:var(--ob-radius-media);display:block;overflow:hidden}.ob-card-image,.ob-card-placeholder{aspect-ratio:16/9;object-fit:cover;width:100%}.ob-card-image{transition:transform .18s}.ob-card-media:hover .ob-card-image{transform:scale(1.05)}.ob-card-placeholder{background:linear-gradient(135deg, var(--ob-accent-soft), var(--ob-surface-sunken))}.ob-card-category,.ob-post-category{text-transform:uppercase;letter-spacing:.07em;margin-top:1rem;font-size:.8rem;font-weight:750;display:inline-block}.ob-card-title{margin:.5rem 0}.ob-card-title a,.ob-featured-details h2 a{text-decoration:none}.ob-card-title,.ob-card-description{-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.ob-card-title{-webkit-line-clamp:2}.ob-card-description{-webkit-line-clamp:2;color:var(--ob-text-muted);margin:.75rem 0}.ob-card-author{align-items:center;gap:.5rem;margin-top:1rem;display:flex}.ob-card-author a{color:var(--ob-text)}.ob-avatar{object-fit:cover;vertical-align:middle;border-radius:50%;flex:0 0 2.5rem;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;display:inline-flex}.ob-avatar--initials{background:var(--ob-accent-soft);color:var(--ob-heading);font-weight:750}.ob-date,.ob-reading-time{color:var(--ob-text-subtle);margin:.35rem .75rem .35rem 0;font-size:.875rem;display:inline-block}.ob-featured-card{border:1px solid var(--ob-border);border-top:4px solid var(--ob-accent);border-radius:var(--ob-radius-card);min-width:0;box-shadow:var(--ob-shadow);margin-bottom:2rem;display:grid;overflow:hidden}.ob-featured-card:hover{border-color:var(--ob-accent)}.ob-featured-card .ob-card-media{border-radius:0}.ob-featured-details{padding:1.25rem}.ob-featured-details .ob-card-description{-webkit-line-clamp:3}.ob-featured-label{color:var(--ob-accent);text-transform:uppercase;letter-spacing:.08em;margin-bottom:.5rem;font-size:.8rem;font-weight:750}.ob-pagination{flex-wrap:wrap;justify-content:center;gap:.5rem;margin-top:2.5rem;display:flex}.ob-pagination-link,.ob-pagination-current{border-radius:var(--ob-radius-pill);justify-content:center;align-items:center;min-width:2.5rem;min-height:2.5rem;text-decoration:none;display:inline-flex}.ob-pagination-current{color:var(--ob-accent-contrast);background:var(--ob-accent)}.ob-breadcrumbs ol{flex-wrap:wrap;gap:.5rem;margin-bottom:1.5rem;font-size:.875rem;display:flex}.ob-breadcrumbs li+li:before{content:"/";color:var(--ob-text-subtle);margin-right:.5rem}.ob-post{max-width:var(--ob-content-width);margin:auto}.ob-post-title{margin:.75rem 0 1rem;font-weight:800;line-height:1.15}.ob-post-category{margin-top:0}.ob-byline{margin:1rem 0 1.5rem}.ob-byline-author{font-weight:700}.ob-cover{margin:1.5rem -1rem}.ob-cover img{aspect-ratio:2;object-fit:cover;width:100%}.ob-highlights{border:1px solid var(--ob-border);border-radius:var(--ob-radius-card);background:var(--ob-surface-raised);margin:1.5rem 0;padding:1rem}.ob-highlights h2{margin-bottom:.5rem;font-size:1rem}.ob-highlights ul{flex-wrap:wrap;gap:.25rem 1rem;display:flex}.ob-notice{background:var(--ob-notice-bg);color:var(--ob-notice-text);border:1px solid var(--ob-notice-border);border-radius:var(--ob-radius-card);margin:1rem 0;padding:1rem 1.25rem}.ob-notice h2{color:inherit;margin-bottom:.5rem;font-size:1.125rem}.ob-notice ul{padding-left:1.25rem;list-style:outside}.ob-correction time{display:inline-block}.ob-toc{border-left:3px solid var(--ob-accent);background:var(--ob-surface-raised);border-radius:0 var(--ob-radius-card) var(--ob-radius-card) 0;margin:2rem 0;padding:1rem 1.25rem}.ob-toc h2{margin-bottom:.75rem;font-size:1rem}.ob-toc-item{margin:.35rem 0}.ob-toc-item--h3{padding-left:1rem}.ob-toc a[aria-current=location]{color:var(--ob-heading);font-weight:800;text-decoration-thickness:.15em}.ob-prose{font-size:var(--ob-prose-size);line-height:var(--ob-prose-leading)}.ob-prose>*{margin-block:1.25rem}.ob-prose h2{border-bottom:1px solid var(--ob-border);margin-top:2.5rem;padding-bottom:.5rem}.ob-prose h3,.ob-prose h4{margin-top:2rem}.ob-prose :is(h2,h3,h4,h5,h6){scroll-margin-top:2rem}.ob-heading-anchor{margin-left:.4em;font-size:.8em;text-decoration:none}.ob-prose ul,.ob-prose ol{padding-left:1.5rem}.ob-prose ul{list-style:outside}.ob-prose ol{list-style:decimal}.ob-prose li::marker{color:var(--ob-accent)}.ob-prose li+li{margin-top:.35rem}.ob-prose input[type=checkbox]{margin-right:.4rem}.ob-prose blockquote{border-left:3px solid var(--ob-accent);background:var(--ob-accent-soft);border-radius:0 var(--ob-radius-card) var(--ob-radius-card) 0;padding:.75rem 1.25rem}.ob-prose :not(pre)>code{background:var(--ob-surface-sunken);font-size:.9em;font-family:var(--ob-font-mono);border-radius:.3rem;padding:.15em .3em}.ob-prose pre{background:var(--ob-code-bg);border:1px solid var(--ob-code-border);border-radius:var(--ob-radius-card);overflow-wrap:normal;max-width:100%;padding:3.25rem 1rem 1rem;font-size:.9rem;line-height:1.6;position:relative;overflow-x:auto}.ob-prose .ob-highlight .w{background-color:#0000}.ob-prose pre code{width:max-content;min-width:100%;font-family:var(--ob-font-mono);display:block}.ob-code-language{color:var(--ob-text-subtle);font-family:var(--ob-font-body);font-size:.8rem;position:absolute;top:.65rem;left:1rem}.ob-code-copy{position:absolute;top:.5rem;right:.65rem}.ob-code-copy,.ob-theme-toggle,.ob-share-button{background:var(--ob-surface-raised);min-height:2.5rem;color:var(--ob-text);border:1px solid var(--ob-border-strong);border-radius:var(--ob-radius-pill);justify-content:center;align-items:center;gap:.4rem;padding:.4rem .75rem;display:inline-flex}.ob-icon{flex-shrink:0;width:1.125rem;height:1.125rem}.ob-prose hr{background:linear-gradient(to right, var(--ob-border), var(--ob-accent), var(--ob-border));border:0;height:1px;margin:2.5rem 0}.ob-figure{margin-inline:0}.ob-figure img{border-radius:var(--ob-radius-media)}.ob-figure figcaption{color:var(--ob-text-muted);margin-top:.5rem;font-size:.9rem}.ob-table{border:1px solid var(--ob-border);border-radius:var(--ob-radius-media);max-width:100%;overflow-x:auto}.ob-table table{border-collapse:collapse;width:max-content;min-width:100%;font-size:.95rem}.ob-table th,.ob-table td{text-align:left;border-bottom:1px solid var(--ob-border);padding:.65rem 1rem}.ob-table th{background:var(--ob-surface-raised);color:var(--ob-heading);font-weight:700}.ob-prose .markdown-alert{border-left:4px solid var(--ob-note);background:var(--ob-surface-raised);border-radius:0 var(--ob-radius-card) var(--ob-radius-card) 0;padding:1rem 1.25rem}.ob-prose .markdown-alert-title{color:var(--ob-note);margin-bottom:.5rem;font-weight:750}.ob-prose .markdown-alert-tip{border-color:var(--ob-tip)}.ob-prose .markdown-alert-tip .markdown-alert-title{color:var(--ob-tip)}.ob-prose .markdown-alert-warning,.ob-prose .markdown-alert-caution{border-color:var(--ob-warning)}.ob-prose .markdown-alert-warning .markdown-alert-title,.ob-prose .markdown-alert-caution .markdown-alert-title{color:var(--ob-warning)}.ob-prose--dropcap>p:first-of-type:first-letter{float:left;color:var(--ob-accent);padding-right:.1em;font-size:3.5em;line-height:.9}.ob-faq{border-top:1px solid var(--ob-border);min-width:0;margin-block:2.5rem;padding-top:2rem}.ob-faq>h2{margin-bottom:1.5rem;scroll-margin-top:2rem}.ob-faq-entry+.ob-faq-entry{border-top:1px solid var(--ob-border);margin-top:1.5rem;padding-top:1.5rem}.ob-faq-entry h3{margin-bottom:.75rem}.ob-faq-entry p{font-size:var(--ob-prose-size);line-height:var(--ob-prose-leading);overflow-wrap:anywhere}.ob-faq-entry p+p{margin-top:1rem}.ob-faq-entry a{text-decoration:underline}.ob-tags,.ob-author-profiles,.ob-share{flex-wrap:wrap;align-items:center;gap:.75rem;margin:1.5rem 0;display:flex}.ob-tags a{border-radius:var(--ob-radius-pill);background:var(--ob-accent-soft);padding:.25rem .75rem}.ob-share-status{color:var(--ob-text-muted);font-size:.875rem}.ob-author-box,.ob-call-to-action{background:var(--ob-surface-raised);border:1px solid var(--ob-border);border-radius:var(--ob-radius-card);margin-block:2rem;padding:1.5rem}.ob-author-box h2,.ob-call-to-action h2{margin-bottom:.75rem}.ob-author-bio{margin-top:.75rem}.ob-related-posts,.ob-recent-posts{margin-top:3rem}.ob-related-posts>h2,.ob-recent-posts>h2{margin-bottom:1.5rem}.ob-empty{color:var(--ob-text-muted);padding-block:2rem}.ob-reading-progress{z-index:50;background:var(--ob-border);pointer-events:none;height:3px;position:fixed;inset:0 0 auto}.ob-reading-progress-fill{background:var(--ob-accent);width:0;height:100%}@media (min-width:40rem){.ob-post-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.ob-featured-card{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.ob-featured-card .ob-card-image,.ob-featured-card .ob-card-placeholder{height:100%}.ob-cover{margin-inline:0}.ob-cover img{border-radius:var(--ob-radius-media)}}@media (min-width:64rem){.ob-list-layout{grid-template-columns:14rem minmax(0,1fr)}.ob-sidebar{align-self:start;position:sticky;top:2rem}.ob-sidebar-categories ul{display:block;overflow:visible}.ob-sidebar-categories li{margin-bottom:.25rem}.ob-sidebar a{justify-content:space-between;gap:.75rem;display:flex}.ob-sidebar-tags{margin-top:1.5rem;display:block}.ob-sidebar-tags ul{flex-wrap:wrap;gap:.5rem;display:flex}.ob-count{display:inline}.ob-related-posts .ob-post-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (prefers-reduced-motion:reduce){.ob-card-image{transition:none}.ob-card-media:hover .ob-card-image{transform:none}}.ob-highlight table td{padding:5px}.ob-highlight table pre{margin:0}.ob-highlight,.ob-highlight .w{color:#24292f;background-color:#f6f8fa}.ob-highlight .k,.ob-highlight .kd,.ob-highlight .kn,.ob-highlight .kp,.ob-highlight .kr,.ob-highlight .kt,.ob-highlight .kv{color:#cf222e}.ob-highlight .gd{color:#82071e;background-color:#ffebe9}.ob-highlight .nb,.ob-highlight .nc,.ob-highlight .no,.ob-highlight .nn{color:#953800}.ob-highlight .sr,.ob-highlight .na,.ob-highlight .nt{color:#116329}.ob-highlight .gi{color:#116329;background-color:#dafbe1}.ob-highlight .ges{font-style:italic;font-weight:700}.ob-highlight .kc,.ob-highlight .l,.ob-highlight .ld,.ob-highlight .m,.ob-highlight .mb,.ob-highlight .mf,.ob-highlight .mh,.ob-highlight .mi,.ob-highlight .il,.ob-highlight .mo,.ob-highlight .mx,.ob-highlight .sb,.ob-highlight .bp,.ob-highlight .ne,.ob-highlight .nl,.ob-highlight .py,.ob-highlight .nv,.ob-highlight .vc,.ob-highlight .vg,.ob-highlight .vi,.ob-highlight .vm,.ob-highlight .o,.ob-highlight .ow{color:#0550ae}.ob-highlight .gh,.ob-highlight .gu{color:#0550ae;font-weight:700}.ob-highlight .s,.ob-highlight .sa,.ob-highlight .sc,.ob-highlight .dl,.ob-highlight .sd,.ob-highlight .s2,.ob-highlight .se,.ob-highlight .sh,.ob-highlight .sx,.ob-highlight .s1,.ob-highlight .ss{color:#0a3069}.ob-highlight .nd,.ob-highlight .nf,.ob-highlight .fm{color:#8250df}.ob-highlight .err{color:#f6f8fa;background-color:#82071e}.ob-highlight .ni,.ob-highlight .si{color:#24292f}.ob-highlight .ge{color:#24292f;font-style:italic}.ob-highlight .gs{color:#24292f;font-weight:700}[data-theme=dark] .ob-highlight table td{padding:5px}[data-theme=dark] .ob-highlight table pre{margin:0}[data-theme=dark] .ob-highlight,[data-theme=dark] .ob-highlight .w{color:#c9d1d9;background-color:#161b22}[data-theme=dark] .ob-highlight .k,[data-theme=dark] .ob-highlight .kd,[data-theme=dark] .ob-highlight .kn,[data-theme=dark] .ob-highlight .kp,[data-theme=dark] .ob-highlight .kr,[data-theme=dark] .ob-highlight .kt,[data-theme=dark] .ob-highlight .kv{color:#ff7b72}[data-theme=dark] .ob-highlight .gr{color:#f0f6fc}[data-theme=dark] .ob-highlight .gd{color:#ffdcd7;background-color:#67060c}[data-theme=dark] .ob-highlight .nb,[data-theme=dark] .ob-highlight .nc,[data-theme=dark] .ob-highlight .no,[data-theme=dark] .ob-highlight .nn{color:#ffa657}[data-theme=dark] .ob-highlight .sr,[data-theme=dark] .ob-highlight .na,[data-theme=dark] .ob-highlight .nt{color:#7ee787}[data-theme=dark] .ob-highlight .gi{color:#aff5b4;background-color:#033a16}[data-theme=dark] .ob-highlight .ges{font-style:italic;font-weight:700}[data-theme=dark] .ob-highlight .kc,[data-theme=dark] .ob-highlight .l,[data-theme=dark] .ob-highlight .ld,[data-theme=dark] .ob-highlight .m,[data-theme=dark] .ob-highlight .mb,[data-theme=dark] .ob-highlight .mf,[data-theme=dark] .ob-highlight .mh,[data-theme=dark] .ob-highlight .mi,[data-theme=dark] .ob-highlight .il,[data-theme=dark] .ob-highlight .mo,[data-theme=dark] .ob-highlight .mx,[data-theme=dark] .ob-highlight .sb,[data-theme=dark] .ob-highlight .bp,[data-theme=dark] .ob-highlight .ne,[data-theme=dark] .ob-highlight .nl,[data-theme=dark] .ob-highlight .py,[data-theme=dark] .ob-highlight .nv,[data-theme=dark] .ob-highlight .vc,[data-theme=dark] .ob-highlight .vg,[data-theme=dark] .ob-highlight .vi,[data-theme=dark] .ob-highlight .vm,[data-theme=dark] .ob-highlight .o,[data-theme=dark] .ob-highlight .ow{color:#79c0ff}[data-theme=dark] .ob-highlight .gh,[data-theme=dark] .ob-highlight .gu{color:#1f6feb;font-weight:700}[data-theme=dark] .ob-highlight .s,[data-theme=dark] .ob-highlight .sa,[data-theme=dark] .ob-highlight .sc,[data-theme=dark] .ob-highlight .dl,[data-theme=dark] .ob-highlight .sd,[data-theme=dark] .ob-highlight .s2,[data-theme=dark] .ob-highlight .se,[data-theme=dark] .ob-highlight .sh,[data-theme=dark] .ob-highlight .sx,[data-theme=dark] .ob-highlight .s1,[data-theme=dark] .ob-highlight .ss{color:#a5d6ff}[data-theme=dark] .ob-highlight .nd,[data-theme=dark] .ob-highlight .nf,[data-theme=dark] .ob-highlight .fm{color:#d2a8ff}[data-theme=dark] .ob-highlight .err{color:#f0f6fc;background-color:#8e1519}[data-theme=dark] .ob-highlight .c,[data-theme=dark] .ob-highlight .ch,[data-theme=dark] .ob-highlight .cd,[data-theme=dark] .ob-highlight .cm,[data-theme=dark] .ob-highlight .cp,[data-theme=dark] .ob-highlight .cpf,[data-theme=dark] .ob-highlight .c1,[data-theme=dark] .ob-highlight .cs,[data-theme=dark] .ob-highlight .gl,[data-theme=dark] .ob-highlight .gt{color:#8b949e}[data-theme=dark] .ob-highlight .ni,[data-theme=dark] .ob-highlight .si{color:#c9d1d9}[data-theme=dark] .ob-highlight .ge{color:#c9d1d9;font-style:italic}[data-theme=dark] .ob-highlight .gs{color:#c9d1d9;font-weight:700}@media (prefers-color-scheme:dark){html:not([data-theme=light]) .ob-highlight table td{padding:5px}html:not([data-theme=light]) .ob-highlight table pre{margin:0}html:not([data-theme=light]) .ob-highlight,html:not([data-theme=light]) .ob-highlight .w{color:#c9d1d9;background-color:#161b22}html:not([data-theme=light]) .ob-highlight .k,html:not([data-theme=light]) .ob-highlight .kd,html:not([data-theme=light]) .ob-highlight .kn,html:not([data-theme=light]) .ob-highlight .kp,html:not([data-theme=light]) .ob-highlight .kr,html:not([data-theme=light]) .ob-highlight .kt,html:not([data-theme=light]) .ob-highlight .kv{color:#ff7b72}html:not([data-theme=light]) .ob-highlight .gr{color:#f0f6fc}html:not([data-theme=light]) .ob-highlight .gd{color:#ffdcd7;background-color:#67060c}html:not([data-theme=light]) .ob-highlight .nb,html:not([data-theme=light]) .ob-highlight .nc,html:not([data-theme=light]) .ob-highlight .no,html:not([data-theme=light]) .ob-highlight .nn{color:#ffa657}html:not([data-theme=light]) .ob-highlight .sr,html:not([data-theme=light]) .ob-highlight .na,html:not([data-theme=light]) .ob-highlight .nt{color:#7ee787}html:not([data-theme=light]) .ob-highlight .gi{color:#aff5b4;background-color:#033a16}html:not([data-theme=light]) .ob-highlight .ges{font-style:italic;font-weight:700}html:not([data-theme=light]) .ob-highlight .kc,html:not([data-theme=light]) .ob-highlight .l,html:not([data-theme=light]) .ob-highlight .ld,html:not([data-theme=light]) .ob-highlight .m,html:not([data-theme=light]) .ob-highlight .mb,html:not([data-theme=light]) .ob-highlight .mf,html:not([data-theme=light]) .ob-highlight .mh,html:not([data-theme=light]) .ob-highlight .mi,html:not([data-theme=light]) .ob-highlight .il,html:not([data-theme=light]) .ob-highlight .mo,html:not([data-theme=light]) .ob-highlight .mx,html:not([data-theme=light]) .ob-highlight .sb,html:not([data-theme=light]) .ob-highlight .bp,html:not([data-theme=light]) .ob-highlight .ne,html:not([data-theme=light]) .ob-highlight .nl,html:not([data-theme=light]) .ob-highlight .py,html:not([data-theme=light]) .ob-highlight .nv,html:not([data-theme=light]) .ob-highlight .vc,html:not([data-theme=light]) .ob-highlight .vg,html:not([data-theme=light]) .ob-highlight .vi,html:not([data-theme=light]) .ob-highlight .vm,html:not([data-theme=light]) .ob-highlight .o,html:not([data-theme=light]) .ob-highlight .ow{color:#79c0ff}html:not([data-theme=light]) .ob-highlight .gh,html:not([data-theme=light]) .ob-highlight .gu{color:#1f6feb;font-weight:700}html:not([data-theme=light]) .ob-highlight .s,html:not([data-theme=light]) .ob-highlight .sa,html:not([data-theme=light]) .ob-highlight .sc,html:not([data-theme=light]) .ob-highlight .dl,html:not([data-theme=light]) .ob-highlight .sd,html:not([data-theme=light]) .ob-highlight .s2,html:not([data-theme=light]) .ob-highlight .se,html:not([data-theme=light]) .ob-highlight .sh,html:not([data-theme=light]) .ob-highlight .sx,html:not([data-theme=light]) .ob-highlight .s1,html:not([data-theme=light]) .ob-highlight .ss{color:#a5d6ff}html:not([data-theme=light]) .ob-highlight .nd,html:not([data-theme=light]) .ob-highlight .nf,html:not([data-theme=light]) .ob-highlight .fm{color:#d2a8ff}html:not([data-theme=light]) .ob-highlight .err{color:#f0f6fc;background-color:#8e1519}html:not([data-theme=light]) .ob-highlight .c,html:not([data-theme=light]) .ob-highlight .ch,html:not([data-theme=light]) .ob-highlight .cd,html:not([data-theme=light]) .ob-highlight .cm,html:not([data-theme=light]) .ob-highlight .cp,html:not([data-theme=light]) .ob-highlight .cpf,html:not([data-theme=light]) .ob-highlight .c1,html:not([data-theme=light]) .ob-highlight .cs,html:not([data-theme=light]) .ob-highlight .gl,html:not([data-theme=light]) .ob-highlight .gt{color:#8b949e}html:not([data-theme=light]) .ob-highlight .ni,html:not([data-theme=light]) .ob-highlight .si{color:#c9d1d9}html:not([data-theme=light]) .ob-highlight .ge{color:#c9d1d9;font-style:italic}html:not([data-theme=light]) .ob-highlight .gs{color:#c9d1d9;font-weight:700}}.ob-highlight .gr{color:#cf222e}.ob-highlight .c,.ob-highlight .ch,.ob-highlight .cd,.ob-highlight .cm,.ob-highlight .cp,.ob-highlight .cpf,.ob-highlight .c1,.ob-highlight .cs,.ob-highlight .gl,.ob-highlight .gt{color:#57606a}[data-theme=dark] .ob-highlight .gh,[data-theme=dark] .ob-highlight .gu{color:#79c0ff}@media (prefers-color-scheme:dark){html:not([data-theme=light]) .ob-highlight .gh,html:not([data-theme=light]) .ob-highlight .gu{color:#79c0ff}}:root{--ob-surface:#fff;--ob-surface-raised:#f8fafc;--ob-surface-sunken:#f1f5f9;--ob-heading:#0f172a;--ob-text:#334155;--ob-text-muted:#475569;--ob-text-subtle:#526176;--ob-border:#cbd5e1;--ob-border-strong:#64748b;--ob-accent:#1d4ed8;--ob-accent-hover:#1e40af;--ob-accent-soft:#dbeafe;--ob-accent-contrast:#fff;--ob-code-bg:#f6f8fa;--ob-code-border:#94a3b8;--ob-notice-bg:#eff6ff;--ob-notice-border:#60a5fa;--ob-notice-text:#1e3a8a;--ob-note:#1d4ed8;--ob-tip:#166534;--ob-warning:#854d0e;--ob-shadow:0 8px 24px #0f172a1a;--ob-font-display:ui-sans-serif, system-ui, sans-serif;--ob-font-body:ui-sans-serif, system-ui, sans-serif;--ob-font-mono:ui-monospace, SFMono-Regular, Consolas, monospace;--ob-radius-card:1rem;--ob-radius-media:.75rem;--ob-radius-pill:999px;--ob-prose-size:1.125rem;--ob-prose-leading:1.8;--ob-content-width:56rem;--ob-page-width:72rem}:root[data-theme=dark]{--ob-surface:#0f172a;--ob-surface-raised:#1e293b;--ob-surface-sunken:#020617;--ob-heading:#f8fafc;--ob-text:#e2e8f0;--ob-text-muted:#cbd5e1;--ob-text-subtle:#94a3b8;--ob-border:#475569;--ob-border-strong:#94a3b8;--ob-accent:#93c5fd;--ob-accent-hover:#bfdbfe;--ob-accent-soft:#172554;--ob-accent-contrast:#0f172a;--ob-code-bg:#161b22;--ob-code-border:#64748b;--ob-notice-bg:#172554;--ob-notice-border:#60a5fa;--ob-notice-text:#dbeafe;--ob-note:#93c5fd;--ob-tip:#86efac;--ob-warning:#fde047}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--ob-surface:#0f172a;--ob-surface-raised:#1e293b;--ob-surface-sunken:#020617;--ob-heading:#f8fafc;--ob-text:#e2e8f0;--ob-text-muted:#cbd5e1;--ob-text-subtle:#94a3b8;--ob-border:#475569;--ob-border-strong:#94a3b8;--ob-accent:#93c5fd;--ob-accent-hover:#bfdbfe;--ob-accent-soft:#172554;--ob-accent-contrast:#0f172a;--ob-code-bg:#161b22;--ob-code-border:#64748b;--ob-notice-bg:#172554;--ob-notice-border:#60a5fa;--ob-notice-text:#dbeafe;--ob-note:#93c5fd;--ob-tip:#86efac;--ob-warning:#fde047}}:root{color-scheme:light dark}:root[data-theme=light]{color-scheme:light}:root[data-theme=dark]{color-scheme:dark}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.hidden{display:none}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}}.ob-page{background:var(--ob-surface);color:var(--ob-text);font-family:var(--ob-font-body);overflow-wrap:anywhere;-webkit-font-smoothing:antialiased;margin:0;line-height:1.6}.ob-page *,.ob-page :before,.ob-page :after{box-sizing:border-box}.ob-page [hidden]{display:none!important}.ob-page ::selection{background:var(--ob-accent-2-soft,var(--ob-accent-soft));color:var(--ob-heading)}.ob-page a{color:var(--ob-accent);text-underline-offset:.2em}.ob-page a:hover{color:var(--ob-accent-hover)}.ob-page a:focus-visible,.ob-page button:focus-visible,.ob-page input:focus-visible,.ob-page summary:focus-visible,.ob-page .ob-table:focus-visible,.ob-page .ob-prose pre:focus-visible{outline:3px solid var(--ob-accent);outline-offset:4px}.ob-page h1,.ob-page h2,.ob-page h3,.ob-page h4,.ob-page h5,.ob-page h6{color:var(--ob-heading);font-family:var(--ob-font-display);font-weight:var(--ob-heading-weight,750);letter-spacing:var(--ob-heading-tracking,normal);text-transform:var(--ob-heading-transform,none);text-wrap:balance;line-height:1.2}.ob-page h1{font-size:clamp(2rem,5vw,3.125rem);line-height:1.08}.ob-page h2{font-size:1.75rem}.ob-page h3{font-size:1.25rem}.ob-page h4,.ob-page h5,.ob-page h6{font-size:1.125rem}.ob-page img{max-width:100%;height:auto}.ob-page button{cursor:pointer;font:inherit}.ob-page button:disabled{cursor:default}.ob-main{max-width:var(--ob-page-width);margin:auto;padding:2.5rem 1rem 4rem}.ob-header,.ob-footer{max-width:var(--ob-page-width);flex-wrap:wrap;align-items:center;gap:1rem 1.75rem;margin:auto;padding:1rem;display:flex}.ob-header{border-bottom:var(--ob-rule-width,1px) solid var(--ob-border);min-height:4.5rem}.ob-header nav{margin-left:auto;font-size:.9375rem;font-weight:500}.ob-header nav a,.ob-footer a{color:var(--ob-text);text-decoration:none}.ob-page .ob-site-name{color:var(--ob-heading);font-family:var(--ob-font-display);letter-spacing:var(--ob-heading-tracking,normal);text-transform:var(--ob-heading-transform,none);font-size:1.375rem;font-weight:800;text-decoration:none}.ob-footer{border-top:var(--ob-rule-width,1px) solid var(--ob-border);color:var(--ob-text-subtle);padding-block:2rem;font-size:.875rem}.ob-footer nav{flex-wrap:wrap;gap:.5rem 1.25rem;display:flex}.ob-index-heading,.ob-list-heading,.ob-author-heading{margin-bottom:2.5rem}.ob-tagline,.ob-list-description{max-width:40rem;color:var(--ob-text-muted);margin-top:.875rem;font-size:1.1875rem;line-height:1.5}.ob-lede{color:var(--ob-text-muted);font-size:1.3125rem;font-style:var(--ob-lede-style,normal);margin:0 0 1.5rem;line-height:1.5}.ob-list-layout{gap:2rem;display:grid}.ob-list-main,.ob-sidebar,.ob-post-card,.ob-featured-details{min-width:0}.ob-search{margin-bottom:2rem}.ob-search label,.ob-sidebar h2,.ob-toc h2,.ob-highlights h2,.ob-related-posts>h2,.ob-recent-posts>h2,.ob-author-box h2{color:var(--ob-heading);font-family:var(--ob-font-display);letter-spacing:.08em;text-transform:uppercase;margin-bottom:.75rem;font-size:.8125rem;font-weight:700;line-height:1.4;display:block}.ob-sidebar h2,.ob-related-posts>h2,.ob-recent-posts>h2{border-bottom:var(--ob-rule-width,1px) solid var(--ob-border);padding-bottom:.5rem}.ob-search-controls{gap:.5rem;display:flex}.ob-search input{border:var(--ob-rule-width,1px) solid var(--ob-border-strong);border-radius:var(--ob-radius-pill);background:var(--ob-surface);width:100%;min-width:0;min-height:2.5rem;color:var(--ob-text);font:inherit;padding:.4rem .875rem;font-size:.9375rem}.ob-search-results{border:var(--ob-rule-width,1px) solid var(--ob-border);border-radius:var(--ob-radius-media);background:var(--ob-surface-raised);margin-top:.75rem;overflow:hidden}.ob-sidebar .ob-search-results a{border:0;border-radius:0;padding:.5rem .875rem;display:block}.ob-search-results a:hover{background:var(--ob-accent-soft)}.ob-series-nav{border:var(--ob-rule-width,1px) solid var(--ob-border);border-radius:var(--ob-radius-media);margin:2rem 0;padding:1.25rem}.ob-series-nav h2{text-transform:none;margin-bottom:.75rem;font-size:1.125rem}.ob-series-nav p+p{margin-top:.5rem}.ob-sidebar-categories ul{gap:.5rem;padding-bottom:.5rem;display:flex;overflow-x:auto}.ob-sidebar-categories li{flex-shrink:0}.ob-sidebar a{border:var(--ob-rule-width,1px) solid var(--ob-border);border-radius:var(--ob-radius-pill);color:var(--ob-text);padding:.4rem .875rem;font-size:.9375rem;text-decoration:none;display:block}.ob-sidebar a:hover{color:var(--ob-accent-hover)}.ob-sidebar a[aria-current=page]{border-color:var(--ob-accent);background:var(--ob-accent);color:var(--ob-accent-contrast)}.ob-sidebar-popular{margin-top:2rem}.ob-sidebar-popular ol{counter-reset:ob-popular}.ob-sidebar-popular li{border-bottom:1px solid var(--ob-border);counter-increment:ob-popular;gap:.75rem;padding:.625rem 0;display:flex}.ob-sidebar-popular li:before{color:var(--ob-accent);font-family:var(--ob-font-display);content:counter(ob-popular);flex:0 0 1.75rem;font-size:1.375rem;font-weight:800;line-height:1.1}.ob-sidebar-popular a{color:var(--ob-heading);border:0;border-radius:0;padding:0;font-weight:500;line-height:1.35}.ob-sidebar-tags,.ob-count{display:none}.ob-post-grid{grid-template-columns:minmax(0,1fr);gap:2.25rem 2rem;display:grid}.ob-post-card{flex-direction:column;align-items:flex-start;display:flex}.ob-card-media{border-radius:var(--ob-radius-media);background:var(--ob-surface-sunken);align-self:stretch;display:block;overflow:hidden}.ob-card-image,.ob-card-placeholder{aspect-ratio:16/9;object-fit:cover;width:100%;display:block}.ob-card-image{transition:transform .18s}.ob-card-media:hover .ob-card-image{transform:scale(1.05)}.ob-card-placeholder{background:linear-gradient(135deg, var(--ob-accent-soft) 0 55%, var(--ob-accent-2-soft,var(--ob-surface-sunken)) 55%)}.ob-card-category,.ob-post-category,.ob-featured-label{letter-spacing:.12em;text-transform:uppercase;font-size:.75rem;font-weight:600;text-decoration:none;display:inline-block}.ob-card-category{margin-top:.875rem}.ob-featured-label{color:var(--ob-accent)}.ob-featured-label:before{border-radius:var(--ob-radius-pill);background:var(--ob-accent-2,var(--ob-accent));content:"";width:.625rem;height:.625rem;margin-right:.5rem;display:inline-block}.ob-page .ob-card-title,.ob-page .ob-featured-details h2{text-transform:none;margin:.5rem 0 0}.ob-page .ob-card-title{font-size:1.375rem}.ob-page .ob-featured-details h2{font-size:clamp(1.5rem,3vw,2rem);line-height:1.1}.ob-card-title a,.ob-featured-details h2 a{color:inherit;text-decoration:none}.ob-card-title,.ob-card-description{-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.ob-card-title{-webkit-line-clamp:2}.ob-card-description{-webkit-line-clamp:2;color:var(--ob-text-muted);margin:.625rem 0 0;line-height:1.6}.ob-card-author{align-items:center;gap:.5rem;margin-top:.875rem;font-size:.875rem;display:flex}.ob-card-author a{color:var(--ob-text-subtle);text-decoration:none}.ob-card-author .ob-avatar{flex-basis:1.75rem;width:1.75rem;height:1.75rem;font-size:.6875rem}.ob-avatar{border-radius:var(--ob-radius-pill);object-fit:cover;vertical-align:middle;flex:0 0 2.5rem;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;display:inline-flex}.ob-avatar--initials{background:var(--ob-accent-soft);color:var(--ob-heading);font-weight:700}.ob-date,.ob-reading-time{color:var(--ob-text-subtle);margin:.25rem .75rem 0 0;font-size:.875rem;display:inline-block}.ob-featured-card{border:var(--ob-rule-width,1px) solid var(--ob-border);border-radius:var(--ob-radius-card);background:var(--ob-surface-raised);min-width:0;box-shadow:var(--ob-shadow,none);margin-bottom:2.5rem;display:grid;overflow:hidden}.ob-featured-card .ob-card-media{border-radius:0}.ob-featured-details{flex-direction:column;justify-content:center;align-items:flex-start;padding:1.5rem;display:flex}.ob-featured-details .ob-card-description{-webkit-line-clamp:3}.ob-pagination{flex-wrap:wrap;justify-content:center;gap:.5rem;margin-top:3rem;display:flex}.ob-pagination-link,.ob-pagination-current{border:var(--ob-rule-width,1px) solid var(--ob-border);border-radius:var(--ob-radius-pill);justify-content:center;align-items:center;min-width:2.75rem;min-height:2.75rem;font-size:.875rem;font-weight:500;text-decoration:none;display:inline-flex}.ob-page .ob-pagination-link{color:var(--ob-text)}.ob-pagination-current{border-color:var(--ob-accent);background:var(--ob-accent);color:var(--ob-accent-contrast)}.ob-breadcrumbs ol{color:var(--ob-text-subtle);flex-wrap:wrap;gap:.5rem;margin-bottom:1.75rem;font-size:.875rem;display:flex}.ob-breadcrumbs a{color:var(--ob-text-subtle);text-decoration:none}.ob-breadcrumbs li+li:before{content:"/";color:var(--ob-text-subtle);margin-right:.5rem}.ob-post{max-width:var(--ob-content-width);margin:auto}.ob-post-title,.ob-title{margin:.75rem 0 1.125rem}.ob-byline{border-block:var(--ob-rule-width,1px) solid var(--ob-border);color:var(--ob-text-subtle);flex-wrap:wrap;align-items:center;gap:.25rem .875rem;margin:1.5rem 0;padding:1rem 0;font-size:.9375rem;display:flex}.ob-byline .ob-date{margin-top:0}.ob-page .ob-byline-author{color:var(--ob-heading);font-weight:600;text-decoration:none}.ob-cover{margin:1.75rem -1rem 2.25rem}.ob-cover img{aspect-ratio:2;object-fit:cover;width:100%;display:block}.ob-highlights{border:var(--ob-rule-width,1px) solid var(--ob-border);border-radius:var(--ob-radius-media);background:var(--ob-surface-raised);margin:1.5rem 0;padding:1rem 1.25rem}.ob-highlights h2{margin-bottom:.25rem}.ob-highlights ul{flex-wrap:wrap;gap:.25rem 1rem;display:flex}.ob-notice{border:var(--ob-rule-width,1px) solid var(--ob-notice-border);border-radius:var(--ob-radius-media);background:var(--ob-notice-bg);color:var(--ob-notice-text);margin:1.5rem 0;padding:.875rem 1rem;font-size:.9375rem;line-height:1.5}.ob-page .ob-notice h2{color:inherit;text-transform:none;margin-bottom:.5rem;font-size:1.0625rem}.ob-page .ob-notice a{color:inherit;text-decoration:underline}.ob-notice ul{padding-left:1.25rem;list-style:outside}.ob-correction time{display:inline-block}.ob-toc{border:var(--ob-rule-width,1px) solid var(--ob-border);border-radius:var(--ob-radius-media);background:var(--ob-surface-raised);margin:0 0 2.25rem;padding:1.125rem 1.375rem;font-size:.9375rem}.ob-toc-item{margin:.35rem 0}.ob-toc-item--h3{padding-left:1rem}.ob-toc a{text-decoration:none}.ob-toc a[aria-current=location]{color:var(--ob-heading);font-weight:700;text-decoration:underline;text-decoration-thickness:.15em}.ob-prose{font-size:var(--ob-prose-size);line-height:var(--ob-prose-leading)}.ob-prose>*{margin-block:1.4em}.ob-prose>:first-child{margin-top:0}.ob-prose h2{margin-top:2.2em;margin-bottom:.6em;font-size:1.875rem}.ob-prose h3,.ob-prose h4{margin-top:2rem}.ob-prose :is(h2,h3,h4,h5,h6){scroll-margin-top:2rem}.ob-heading-anchor{margin-left:.4em;font-size:.8em;text-decoration:none}.ob-prose a{text-decoration:underline;text-decoration-thickness:max(1px, var(--ob-rule-width,1px));text-underline-offset:3px}.ob-prose ul,.ob-prose ol{padding-left:1.5rem}.ob-prose ul{list-style:outside}.ob-prose ol{list-style:decimal}.ob-prose li::marker{color:var(--ob-accent)}.ob-prose li+li{margin-top:.35rem}.ob-prose input[type=checkbox]{margin-right:.4rem}.ob-prose blockquote{border-left:4px solid var(--ob-accent);border-radius:0 var(--ob-radius-media) var(--ob-radius-media) 0;background:linear-gradient(90deg, var(--ob-accent-soft), transparent 70%);color:var(--ob-heading);padding:.875rem 1.375rem;font-size:1.15em;font-style:italic}.ob-prose :not(pre)>code{border:1px solid var(--ob-border);border-radius:calc(var(--ob-radius-media) / 2);background:var(--ob-surface-sunken);font-family:var(--ob-font-mono);padding:.1em .4em;font-size:.85em}.ob-page .ob-prose pre,.ob-page .ob-prose pre.ob-highlight{border:var(--ob-rule-width,1px) solid var(--ob-code-border);border-radius:var(--ob-radius-media);background:var(--ob-code-bg);max-width:100%;color:var(--ob-code-text,var(--ob-heading));overflow-wrap:normal;padding:3.25rem 1.375rem 1.25rem;font-size:.9rem;line-height:1.65;position:relative;overflow-x:auto}.ob-prose .ob-highlight .w{background-color:#0000}.ob-prose pre code{width:max-content;min-width:100%;font-family:var(--ob-font-mono);display:block}.ob-code-language{color:var(--ob-code-text,var(--ob-heading));font-family:var(--ob-font-mono);letter-spacing:.08em;text-transform:uppercase;font-size:.75rem;position:absolute;top:.875rem;left:1.375rem}.ob-code-copy{position:absolute;top:.5rem;right:.65rem}.ob-code-copy,.ob-theme-toggle,.ob-share-button,.ob-search button{border:var(--ob-rule-width,1px) solid var(--ob-border-strong);border-radius:var(--ob-radius-pill);background:var(--ob-surface);min-height:2.5rem;color:var(--ob-text);white-space:nowrap;flex-shrink:0;justify-content:center;align-items:center;gap:.4rem;padding:.4rem .875rem;font-size:.875rem;font-weight:500;display:inline-flex}.ob-code-copy{min-height:2rem;padding-block:.2rem;font-size:.75rem}.ob-icon{flex-shrink:0;width:1.125rem;height:1.125rem}.ob-prose hr{height:max(1px, var(--ob-rule-width,1px));background:linear-gradient(to right, var(--ob-accent), var(--ob-accent-2,var(--ob-accent)), var(--ob-border));border:0;margin:2.5rem 0}.ob-figure{margin-inline:0}.ob-figure img{border-radius:var(--ob-radius-media)}.ob-figure figcaption{color:var(--ob-text-subtle);margin-top:.5rem;font-size:.875rem}.ob-table{border:var(--ob-rule-width,1px) solid var(--ob-border);border-radius:var(--ob-radius-media);max-width:100%;overflow-x:auto}.ob-table table{border-collapse:collapse;width:max-content;min-width:100%;font-size:.95rem}.ob-table th,.ob-table td{text-align:left;border-bottom:1px solid var(--ob-border);padding:.65rem 1rem}.ob-table th{background:var(--ob-surface-raised);color:var(--ob-heading);font-weight:700}.ob-prose .markdown-alert{border-left:4px solid var(--ob-note);background:var(--ob-surface-raised);border-radius:0 var(--ob-radius-media) var(--ob-radius-media) 0;padding:1rem 1.25rem}.ob-prose .markdown-alert-title{color:var(--ob-note);margin-bottom:.5rem;font-weight:700}.ob-prose .markdown-alert-tip{border-color:var(--ob-tip)}.ob-prose .markdown-alert-tip .markdown-alert-title{color:var(--ob-tip)}.ob-prose .markdown-alert-warning,.ob-prose .markdown-alert-caution{border-color:var(--ob-warning)}.ob-prose .markdown-alert-warning .markdown-alert-title,.ob-prose .markdown-alert-caution .markdown-alert-title{color:var(--ob-warning)}.ob-prose--dropcap>p:first-of-type:first-letter{float:left;color:var(--ob-accent);padding-right:.1em;font-size:3.5em;line-height:.9}.ob-faq{border-top:var(--ob-rule-width,1px) solid var(--ob-border);min-width:0;margin-block:3rem 2.5rem;padding-top:2.25rem}.ob-faq>h2{margin-bottom:1.125rem;scroll-margin-top:2rem}.ob-faq-entry+.ob-faq-entry{border-top:1px solid var(--ob-border);margin-top:1.5rem;padding-top:1.5rem}.ob-page .ob-faq-entry h3{letter-spacing:normal;text-transform:none;margin-bottom:.75rem;font-size:1.125rem;line-height:1.35}.ob-faq-entry p{color:var(--ob-text-muted);font-size:var(--ob-prose-size);line-height:var(--ob-prose-leading);overflow-wrap:anywhere}.ob-faq-entry p+p{margin-top:1rem}.ob-faq-entry a{text-decoration:underline}details.ob-faq-entry{border-bottom:1px solid var(--ob-border)}details.ob-faq-entry+details.ob-faq-entry{border-top:0;margin-top:0;padding-top:0}details.ob-faq-entry>summary{cursor:pointer;justify-content:space-between;align-items:center;gap:1rem;min-height:2.75rem;padding:.875rem 0;list-style:none;display:flex}details.ob-faq-entry>summary::-webkit-details-marker{display:none}details.ob-faq-entry>summary:after{width:1.5rem;color:var(--ob-accent);font-family:var(--ob-font-mono);text-align:center;content:"+";content:"+" / "";flex:none;font-size:1.375rem;line-height:1}details.ob-faq-entry[open]>summary:after{content:"−";content:"−" / ""}details.ob-faq-entry>summary:hover h3{color:var(--ob-accent-hover)}.ob-page details.ob-faq-entry>summary h3{margin:0}details.ob-faq-entry>summary~p:last-child{padding-bottom:1.25rem}.ob-tags,.ob-author-profiles,.ob-share{flex-wrap:wrap;align-items:center;gap:.5rem .75rem;margin:1.5rem 0;display:flex}.ob-tags ul{flex-wrap:wrap;gap:.5rem;display:flex}.ob-tags a,.ob-sidebar-tags a{border:var(--ob-rule-width,1px) solid var(--ob-border);border-radius:var(--ob-radius-pill);color:var(--ob-text);padding:.3rem .875rem;font-size:.8125rem;font-weight:500;text-decoration:none;display:inline-block}.ob-tags a:hover,.ob-sidebar-tags a:hover{border-color:var(--ob-accent)}.ob-share-status{color:var(--ob-text-muted);font-size:.875rem}.ob-author-box{border:var(--ob-rule-width,1px) solid var(--ob-border);border-radius:var(--ob-radius-card);background:var(--ob-surface-raised);grid-template-columns:auto minmax(0,1fr);align-items:center;gap:.25rem 1.125rem;margin-block:2.5rem;padding:1.375rem;display:grid}.ob-author-box h2{grid-column:1/-1;margin-bottom:.5rem}.ob-author-box .ob-avatar{flex-basis:4rem;grid-row:span 2;width:4rem;height:4rem;font-size:1.25rem}.ob-page .ob-author-box>a{color:var(--ob-heading);font-family:var(--ob-font-display);font-size:1.125rem;font-weight:var(--ob-heading-weight,750);text-decoration:none}.ob-author-bio{color:var(--ob-text-muted);margin-top:.25rem;font-size:.9375rem;line-height:1.55}.ob-author-heading .ob-author-bio{max-width:40rem;margin-top:.875rem;font-size:1.0625rem}.ob-call-to-action{border-left:6px solid var(--ob-accent-2,var(--ob-accent));border-radius:var(--ob-radius-card);background:var(--ob-heading);color:var(--ob-surface);gap:.375rem 1.5rem;margin-block:2.5rem;padding:2rem;display:grid}.ob-page .ob-call-to-action h2{color:inherit;font-size:1.5rem}.ob-call-to-action p{font-size:.9375rem}.ob-page .ob-call-to-action a{border-radius:var(--ob-radius-pill);background:var(--ob-accent);color:var(--ob-accent-contrast);white-space:nowrap;justify-self:start;margin-top:.75rem;padding:.75rem 1.25rem;font-weight:600;text-decoration:none}.ob-related-posts,.ob-recent-posts{margin-top:3rem}.ob-related-posts>h2,.ob-recent-posts>h2{margin-bottom:1.25rem}.ob-page .ob-related-posts .ob-card-title{font-size:1.1875rem}.ob-empty{color:var(--ob-text-muted);padding-block:2rem}.ob-reading-progress{z-index:50;background:var(--ob-border);pointer-events:none;height:3px;position:fixed;inset:0 0 auto}.ob-reading-progress-fill{background:var(--ob-accent);width:0;height:100%}:root[data-ob-theme=signal] .ob-featured-card{border-left:6px solid var(--ob-accent)}:root[data-ob-theme=signal] .ob-prose h2{padding-bottom:.3em;position:relative}:root[data-ob-theme=signal] .ob-prose h2:after{background:var(--ob-accent);content:"";border-radius:2px;width:3rem;height:3px;position:absolute;bottom:0;left:0}:root:is([data-ob-theme=editorial],[data-ob-theme=ink]) :is(.ob-header,.ob-footer,.ob-faq,.ob-sidebar h2,.ob-related-posts>h2,.ob-recent-posts>h2,.ob-tags a,.ob-sidebar-tags a,.ob-pagination-link){border-color:var(--ob-border-strong)}:root:is([data-ob-theme=editorial],[data-ob-theme=ink]) :is(.ob-byline,.ob-toc){border-top-color:var(--ob-border-strong)}:root:is([data-ob-theme=editorial],[data-ob-theme=ink]) :is(.ob-card-media,.ob-cover img,.ob-figure img){border:var(--ob-rule-width) solid var(--ob-border)}:root:is([data-ob-theme=editorial],[data-ob-theme=ink]) :is(.ob-search label,.ob-sidebar h2,.ob-toc h2,.ob-highlights h2,.ob-related-posts>h2,.ob-recent-posts>h2,.ob-author-box h2,.ob-card-category,.ob-post-category,.ob-featured-label){font-family:var(--ob-font-mono);letter-spacing:.14em;font-size:.6875rem;font-weight:500}:root[data-ob-theme=editorial] :is(.ob-header nav,.ob-breadcrumbs,.ob-card-author,.ob-date,.ob-reading-time,.ob-tags a,.ob-sidebar-tags a,.ob-figure figcaption){font-style:italic}:root[data-ob-theme=editorial] :is(.ob-header nav,.ob-sidebar a,.ob-toc){font-size:1.0625rem}:root[data-ob-theme=editorial] .ob-sidebar-popular li:before{font-style:italic;font-weight:500}:root[data-ob-theme=editorial] .ob-featured-card{background:0 0;border-width:0 0 1px;border-radius:0;gap:1.5rem 2.25rem;padding-bottom:2.5rem;overflow:visible}:root[data-ob-theme=editorial] .ob-featured-card .ob-card-media{border-radius:var(--ob-radius-media)}:root[data-ob-theme=editorial] .ob-featured-details{padding:0}:root[data-ob-theme=editorial] :is(.ob-toc,.ob-author-box){background:0 0;border-width:1px 0;border-radius:0;padding-inline:0}:root[data-ob-theme=editorial] .ob-author-box{border-color:var(--ob-border-strong)}:root[data-ob-theme=editorial] .ob-prose h2{border-top:1px solid var(--ob-border-strong);padding-top:.6em}:root[data-ob-theme=editorial] .ob-prose>h2:first-child{border-top:0;padding-top:0}:root[data-ob-theme=editorial] .ob-prose blockquote{background:0 0;border-left-width:2px;border-radius:0;padding-block:0;font-size:1.25em;line-height:1.4}:root[data-ob-theme=editorial] .ob-prose>p:first-of-type:first-letter{float:left;color:var(--ob-accent);font-family:var(--ob-font-display);padding:.08em .12em 0 0;font-size:4.2em;font-weight:500;line-height:.82}:root[data-ob-theme=editorial] .ob-call-to-action{border:1px solid var(--ob-border-strong);background:var(--ob-surface-raised);color:var(--ob-text-muted)}:root[data-ob-theme=editorial] .ob-call-to-action h2{color:var(--ob-heading)}:root[data-ob-theme=ink] :is(.ob-header nav,.ob-footer,.ob-breadcrumbs,.ob-byline,.ob-card-author,.ob-date,.ob-reading-time,.ob-tags a,.ob-sidebar-tags a,.ob-pagination,.ob-figure figcaption,.ob-code-copy,.ob-theme-toggle,.ob-share-button,.ob-search button,.ob-call-to-action a){font-family:var(--ob-font-mono);letter-spacing:.04em;text-transform:uppercase;font-size:.75rem}:root[data-ob-theme=ink] :is(.ob-card-media,.ob-cover img,.ob-figure img,.ob-featured-card,.ob-toc,.ob-author-box,.ob-prose blockquote){border-color:var(--ob-border-strong)}:root[data-ob-theme=ink] :is(.ob-card-category,.ob-post-category){color:var(--ob-heading)}:root[data-ob-theme=ink] :is(.ob-card-category,.ob-post-category):before{background:var(--ob-accent);content:"";width:.625rem;height:.625rem;margin-right:.5rem;display:inline-block}:root[data-ob-theme=ink] :is(.ob-featured-card,.ob-author-box){background:var(--ob-surface)}:root[data-ob-theme=ink] .ob-featured-card .ob-card-media{border:0}:root[data-ob-theme=ink] .ob-list-main .ob-post-grid{padding:0 var(--ob-rule-width) var(--ob-rule-width) 0;gap:0}:root[data-ob-theme=ink] .ob-list-main .ob-post-card{margin:0 calc(-1 * var(--ob-rule-width)) calc(-1 * var(--ob-rule-width)) 0;border:var(--ob-rule-width) solid var(--ob-border-strong);padding:1.5rem}:root[data-ob-theme=ink] .ob-list-main .ob-post-card .ob-card-media{border-width:1px}:root[data-ob-theme=ink] .ob-lede{border-left:2px solid var(--ob-border-strong);padding-left:1.125rem}:root[data-ob-theme=ink] :is(.ob-toc a,.ob-sidebar-categories a,.ob-footer a){color:var(--ob-heading)}:root[data-ob-theme=ink] .ob-sidebar a[aria-current=page]{color:var(--ob-accent-contrast)}:root[data-ob-theme=ink] .ob-sidebar-popular li:before{font-family:var(--ob-font-mono);content:counter(ob-popular, decimal-leading-zero);padding-top:.25rem;font-size:.75rem;font-weight:500}:root[data-ob-theme=ink] .ob-prose{counter-reset:ob-section}:root[data-ob-theme=ink] .ob-prose h2{counter-increment:ob-section}:root[data-ob-theme=ink] .ob-prose h2:before{color:var(--ob-accent);font-family:var(--ob-font-mono);letter-spacing:.1em;vertical-align:middle;content:counter(ob-section, decimal-leading-zero);content:counter(ob-section, decimal-leading-zero) / "";margin-right:.875rem;font-size:.8125rem;font-weight:500}:root[data-ob-theme=ink] .ob-prose blockquote{border:2px solid var(--ob-border-strong);background:var(--ob-accent-2-soft);font-family:var(--ob-font-display);letter-spacing:-.02em;font-size:1.3em;font-style:normal;font-weight:500;line-height:1.25}@media (min-width:40rem){.ob-post-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.ob-featured-card{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.ob-featured-card .ob-card-image,.ob-featured-card .ob-card-placeholder{height:100%}.ob-featured-details{padding:2.25rem}.ob-cover{margin-inline:0}.ob-cover img{border-radius:var(--ob-radius-card)}.ob-call-to-action{grid-template-columns:minmax(0,1fr) auto;align-items:center}.ob-call-to-action>:not(a){grid-column:1}.ob-page .ob-call-to-action a{grid-area:1/2/span 2;margin-top:0}:root[data-ob-theme=ink] .ob-featured-card .ob-card-media{border-right:2px solid var(--ob-border-strong)}}@media (min-width:64rem){.ob-list-layout{grid-template-columns:minmax(0,1fr) 17rem;gap:3rem}.ob-list-main{grid-area:1/1}.ob-sidebar{grid-area:1/2;align-self:start;position:sticky;top:2rem}.ob-sidebar-categories ul{padding-bottom:0;display:block;overflow:visible}.ob-sidebar-categories a{border-width:0 0 1px;border-radius:0;justify-content:space-between;gap:.75rem;padding:.625rem 0;display:flex}.ob-sidebar-categories a[aria-current=page]{border-color:var(--ob-border);color:var(--ob-accent);background:0 0;font-weight:700}:root[data-ob-theme=ink] .ob-sidebar-categories a[aria-current=page]{color:var(--ob-accent)}.ob-sidebar-tags{margin-top:2rem;display:block}.ob-sidebar-tags ul{flex-wrap:wrap;gap:.5rem;display:flex}.ob-count{color:var(--ob-text-subtle);font-size:.8125rem;display:inline}.ob-related-posts .ob-post-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (prefers-reduced-motion:reduce){.ob-card-image{transition:none}.ob-card-media:hover .ob-card-image{transform:none}}.ob-highlight table td{padding:5px}.ob-highlight table pre{margin:0}.ob-highlight,.ob-highlight .w{color:#24292f;background-color:#f6f8fa}.ob-highlight .k,.ob-highlight .kd,.ob-highlight .kn,.ob-highlight .kp,.ob-highlight .kr,.ob-highlight .kt,.ob-highlight .kv{color:#cf222e}.ob-highlight .gd{color:#82071e;background-color:#ffebe9}.ob-highlight .nb,.ob-highlight .nc,.ob-highlight .no,.ob-highlight .nn{color:#953800}.ob-highlight .sr,.ob-highlight .na,.ob-highlight .nt{color:#116329}.ob-highlight .gi{color:#116329;background-color:#dafbe1}.ob-highlight .ges{font-style:italic;font-weight:700}.ob-highlight .kc,.ob-highlight .l,.ob-highlight .ld,.ob-highlight .m,.ob-highlight .mb,.ob-highlight .mf,.ob-highlight .mh,.ob-highlight .mi,.ob-highlight .il,.ob-highlight .mo,.ob-highlight .mx,.ob-highlight .sb,.ob-highlight .bp,.ob-highlight .ne,.ob-highlight .nl,.ob-highlight .py,.ob-highlight .nv,.ob-highlight .vc,.ob-highlight .vg,.ob-highlight .vi,.ob-highlight .vm,.ob-highlight .o,.ob-highlight .ow{color:#0550ae}.ob-highlight .gh,.ob-highlight .gu{color:#0550ae;font-weight:700}.ob-highlight .s,.ob-highlight .sa,.ob-highlight .sc,.ob-highlight .dl,.ob-highlight .sd,.ob-highlight .s2,.ob-highlight .se,.ob-highlight .sh,.ob-highlight .sx,.ob-highlight .s1,.ob-highlight .ss{color:#0a3069}.ob-highlight .nd,.ob-highlight .nf,.ob-highlight .fm{color:#8250df}.ob-highlight .err{color:#f6f8fa;background-color:#82071e}.ob-highlight .ni,.ob-highlight .si{color:#24292f}.ob-highlight .ge{color:#24292f;font-style:italic}.ob-highlight .gs{color:#24292f;font-weight:700}[data-theme=dark] .ob-highlight table td{padding:5px}[data-theme=dark] .ob-highlight table pre{margin:0}[data-theme=dark] .ob-highlight,[data-theme=dark] .ob-highlight .w{color:#c9d1d9;background-color:#161b22}[data-theme=dark] .ob-highlight .k,[data-theme=dark] .ob-highlight .kd,[data-theme=dark] .ob-highlight .kn,[data-theme=dark] .ob-highlight .kp,[data-theme=dark] .ob-highlight .kr,[data-theme=dark] .ob-highlight .kt,[data-theme=dark] .ob-highlight .kv{color:#ff7b72}[data-theme=dark] .ob-highlight .gr{color:#f0f6fc}[data-theme=dark] .ob-highlight .gd{color:#ffdcd7;background-color:#67060c}[data-theme=dark] .ob-highlight .nb,[data-theme=dark] .ob-highlight .nc,[data-theme=dark] .ob-highlight .no,[data-theme=dark] .ob-highlight .nn{color:#ffa657}[data-theme=dark] .ob-highlight .sr,[data-theme=dark] .ob-highlight .na,[data-theme=dark] .ob-highlight .nt{color:#7ee787}[data-theme=dark] .ob-highlight .gi{color:#aff5b4;background-color:#033a16}[data-theme=dark] .ob-highlight .ges{font-style:italic;font-weight:700}[data-theme=dark] .ob-highlight .kc,[data-theme=dark] .ob-highlight .l,[data-theme=dark] .ob-highlight .ld,[data-theme=dark] .ob-highlight .m,[data-theme=dark] .ob-highlight .mb,[data-theme=dark] .ob-highlight .mf,[data-theme=dark] .ob-highlight .mh,[data-theme=dark] .ob-highlight .mi,[data-theme=dark] .ob-highlight .il,[data-theme=dark] .ob-highlight .mo,[data-theme=dark] .ob-highlight .mx,[data-theme=dark] .ob-highlight .sb,[data-theme=dark] .ob-highlight .bp,[data-theme=dark] .ob-highlight .ne,[data-theme=dark] .ob-highlight .nl,[data-theme=dark] .ob-highlight .py,[data-theme=dark] .ob-highlight .nv,[data-theme=dark] .ob-highlight .vc,[data-theme=dark] .ob-highlight .vg,[data-theme=dark] .ob-highlight .vi,[data-theme=dark] .ob-highlight .vm,[data-theme=dark] .ob-highlight .o,[data-theme=dark] .ob-highlight .ow{color:#79c0ff}[data-theme=dark] .ob-highlight .gh,[data-theme=dark] .ob-highlight .gu{color:#1f6feb;font-weight:700}[data-theme=dark] .ob-highlight .s,[data-theme=dark] .ob-highlight .sa,[data-theme=dark] .ob-highlight .sc,[data-theme=dark] .ob-highlight .dl,[data-theme=dark] .ob-highlight .sd,[data-theme=dark] .ob-highlight .s2,[data-theme=dark] .ob-highlight .se,[data-theme=dark] .ob-highlight .sh,[data-theme=dark] .ob-highlight .sx,[data-theme=dark] .ob-highlight .s1,[data-theme=dark] .ob-highlight .ss{color:#a5d6ff}[data-theme=dark] .ob-highlight .nd,[data-theme=dark] .ob-highlight .nf,[data-theme=dark] .ob-highlight .fm{color:#d2a8ff}[data-theme=dark] .ob-highlight .err{color:#f0f6fc;background-color:#8e1519}[data-theme=dark] .ob-highlight .c,[data-theme=dark] .ob-highlight .ch,[data-theme=dark] .ob-highlight .cd,[data-theme=dark] .ob-highlight .cm,[data-theme=dark] .ob-highlight .cp,[data-theme=dark] .ob-highlight .cpf,[data-theme=dark] .ob-highlight .c1,[data-theme=dark] .ob-highlight .cs,[data-theme=dark] .ob-highlight .gl,[data-theme=dark] .ob-highlight .gt{color:#8b949e}[data-theme=dark] .ob-highlight .ni,[data-theme=dark] .ob-highlight .si{color:#c9d1d9}[data-theme=dark] .ob-highlight .ge{color:#c9d1d9;font-style:italic}[data-theme=dark] .ob-highlight .gs{color:#c9d1d9;font-weight:700}@media (prefers-color-scheme:dark){html:not([data-theme=light]) .ob-highlight table td{padding:5px}html:not([data-theme=light]) .ob-highlight table pre{margin:0}html:not([data-theme=light]) .ob-highlight,html:not([data-theme=light]) .ob-highlight .w{color:#c9d1d9;background-color:#161b22}html:not([data-theme=light]) .ob-highlight .k,html:not([data-theme=light]) .ob-highlight .kd,html:not([data-theme=light]) .ob-highlight .kn,html:not([data-theme=light]) .ob-highlight .kp,html:not([data-theme=light]) .ob-highlight .kr,html:not([data-theme=light]) .ob-highlight .kt,html:not([data-theme=light]) .ob-highlight .kv{color:#ff7b72}html:not([data-theme=light]) .ob-highlight .gr{color:#f0f6fc}html:not([data-theme=light]) .ob-highlight .gd{color:#ffdcd7;background-color:#67060c}html:not([data-theme=light]) .ob-highlight .nb,html:not([data-theme=light]) .ob-highlight .nc,html:not([data-theme=light]) .ob-highlight .no,html:not([data-theme=light]) .ob-highlight .nn{color:#ffa657}html:not([data-theme=light]) .ob-highlight .sr,html:not([data-theme=light]) .ob-highlight .na,html:not([data-theme=light]) .ob-highlight .nt{color:#7ee787}html:not([data-theme=light]) .ob-highlight .gi{color:#aff5b4;background-color:#033a16}html:not([data-theme=light]) .ob-highlight .ges{font-style:italic;font-weight:700}html:not([data-theme=light]) .ob-highlight .kc,html:not([data-theme=light]) .ob-highlight .l,html:not([data-theme=light]) .ob-highlight .ld,html:not([data-theme=light]) .ob-highlight .m,html:not([data-theme=light]) .ob-highlight .mb,html:not([data-theme=light]) .ob-highlight .mf,html:not([data-theme=light]) .ob-highlight .mh,html:not([data-theme=light]) .ob-highlight .mi,html:not([data-theme=light]) .ob-highlight .il,html:not([data-theme=light]) .ob-highlight .mo,html:not([data-theme=light]) .ob-highlight .mx,html:not([data-theme=light]) .ob-highlight .sb,html:not([data-theme=light]) .ob-highlight .bp,html:not([data-theme=light]) .ob-highlight .ne,html:not([data-theme=light]) .ob-highlight .nl,html:not([data-theme=light]) .ob-highlight .py,html:not([data-theme=light]) .ob-highlight .nv,html:not([data-theme=light]) .ob-highlight .vc,html:not([data-theme=light]) .ob-highlight .vg,html:not([data-theme=light]) .ob-highlight .vi,html:not([data-theme=light]) .ob-highlight .vm,html:not([data-theme=light]) .ob-highlight .o,html:not([data-theme=light]) .ob-highlight .ow{color:#79c0ff}html:not([data-theme=light]) .ob-highlight .gh,html:not([data-theme=light]) .ob-highlight .gu{color:#1f6feb;font-weight:700}html:not([data-theme=light]) .ob-highlight .s,html:not([data-theme=light]) .ob-highlight .sa,html:not([data-theme=light]) .ob-highlight .sc,html:not([data-theme=light]) .ob-highlight .dl,html:not([data-theme=light]) .ob-highlight .sd,html:not([data-theme=light]) .ob-highlight .s2,html:not([data-theme=light]) .ob-highlight .se,html:not([data-theme=light]) .ob-highlight .sh,html:not([data-theme=light]) .ob-highlight .sx,html:not([data-theme=light]) .ob-highlight .s1,html:not([data-theme=light]) .ob-highlight .ss{color:#a5d6ff}html:not([data-theme=light]) .ob-highlight .nd,html:not([data-theme=light]) .ob-highlight .nf,html:not([data-theme=light]) .ob-highlight .fm{color:#d2a8ff}html:not([data-theme=light]) .ob-highlight .err{color:#f0f6fc;background-color:#8e1519}html:not([data-theme=light]) .ob-highlight .c,html:not([data-theme=light]) .ob-highlight .ch,html:not([data-theme=light]) .ob-highlight .cd,html:not([data-theme=light]) .ob-highlight .cm,html:not([data-theme=light]) .ob-highlight .cp,html:not([data-theme=light]) .ob-highlight .cpf,html:not([data-theme=light]) .ob-highlight .c1,html:not([data-theme=light]) .ob-highlight .cs,html:not([data-theme=light]) .ob-highlight .gl,html:not([data-theme=light]) .ob-highlight .gt{color:#8b949e}html:not([data-theme=light]) .ob-highlight .ni,html:not([data-theme=light]) .ob-highlight .si{color:#c9d1d9}html:not([data-theme=light]) .ob-highlight .ge{color:#c9d1d9;font-style:italic}html:not([data-theme=light]) .ob-highlight .gs{color:#c9d1d9;font-weight:700}}.ob-highlight .gr{color:#cf222e}.ob-highlight .c,.ob-highlight .ch,.ob-highlight .cd,.ob-highlight .cm,.ob-highlight .cp,.ob-highlight .cpf,.ob-highlight .c1,.ob-highlight .cs,.ob-highlight .gl,.ob-highlight .gt{color:#57606a}[data-theme=dark] .ob-highlight .gh,[data-theme=dark] .ob-highlight .gu{color:#79c0ff}@media (prefers-color-scheme:dark){html:not([data-theme=light]) .ob-highlight .gh,html:not([data-theme=light]) .ob-highlight .gu{color:#79c0ff}}:root{color-scheme:light dark}:root[data-theme=light]{color-scheme:light}:root[data-theme=dark]{color-scheme:dark}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}
|