diff --git a/.agents/skills/openclaw-brand/SKILL.md b/.agents/skills/openclaw-brand/SKILL.md new file mode 100644 index 0000000000..9366d4e4a1 --- /dev/null +++ b/.agents/skills/openclaw-brand/SKILL.md @@ -0,0 +1,32 @@ +--- +name: openclaw-brand +description: Apply OpenClaw visual identity to logos, typography, imagery, voice, documents, presentations, social graphics, and launch materials. Use when the task changes brand identity rather than ordinary product UI or public-page composition. +--- + +# OpenClaw Brand + +Use the canonical identity without turning every surface into a marketing page. + +## Workflow + +1. Read [identity.md](references/identity.md) for palette, typography, logo, and voice. +2. Read [asset-rights.md](references/asset-rights.md) before copying or redistributing assets. +3. Identify the artifact's audience and whether it is product, documentation, or marketing. +4. Use semantic design tokens when the artifact is code. +5. Keep status colors functional; do not use them as arbitrary decoration. +6. Verify contrast, responsive cropping, and text legibility. +7. Verify logo clearspace only when approved consumer-local guidance defines it; + otherwise report that check as unavailable rather than inventing a measurement. + +## Rules + +- Use sentence case for headings, labels, buttons, and navigation. +- Let OpenClaw coral carry primary brand emphasis. +- Use sea-glass green as a restrained secondary accent. +- Use neutral ink and warm-paper surfaces as the foundation. +- Prefer Switzer-compatible sans-serif stacks for interface and body copy. +- Reserve Sentient-compatible serif stacks for editorial accents and quotations. +- Use system monospace for code unless the consumer already licenses another face. +- Preserve logo proportions and colors. Do not rotate, distort, outline, or add effects. +- Use real product, interface, community, or mascot imagery when imagery is needed. +- Avoid generic technology gradients, decorative blobs, and ornamental glow as a substitute for content. diff --git a/.agents/skills/openclaw-brand/references/asset-rights.md b/.agents/skills/openclaw-brand/references/asset-rights.md new file mode 100644 index 0000000000..24c34b9f65 --- /dev/null +++ b/.agents/skills/openclaw-brand/references/asset-rights.md @@ -0,0 +1,25 @@ +# Asset Rights + +This repository distributes CSS and guidance, not brand asset binaries. + +## Current Rule + +- Do not copy Switzer or Sentient font files into a consumer or release artifact. +- Do not redistribute logos, lobster artwork, mascot files, photos, or + illustrations without a repository-local license or explicit recorded grant. +- A public URL or an asset already committed to a site is not proof of + redistribution rights. +- System and fallback font stacks are always acceptable. + +## Before Adding An Asset + +Record: + +1. source and owner +2. license or written permission +3. allowed uses and redistribution terms +4. required attribution +5. the repository path where that evidence lives + +If any item is unknown, keep the asset in the existing consumer and reference it +only from that consumer. diff --git a/.agents/skills/openclaw-brand/references/identity.md b/.agents/skills/openclaw-brand/references/identity.md new file mode 100644 index 0000000000..4f6013161a --- /dev/null +++ b/.agents/skills/openclaw-brand/references/identity.md @@ -0,0 +1,42 @@ +# OpenClaw Identity + +## Color + +Use semantic variables in code. The palette names below explain the identity; +they are not permission to replace semantic tokens with raw values. + +| Role | Dark | Light | +| --- | --- | --- | +| Page | Ink `#101012` | Warm paper `#f6f5f3` | +| Surface | Ink `#19191c` | Warm paper `#eceae6` | +| Primary text | `#ededed` | `#17171a` | +| Secondary text | `#bcbcc4` | `#46464e` | +| Primary coral | `#f5654a` | `#d84a31` | +| Secondary sea glass | `#4fc8ae` | `#14806e` | + +Coral is the primary brand and action color. Sea glass is a secondary accent for +focus, contrast, and occasional supporting emphasis. Neither replaces functional +success, warning, error, or information colors. + +## Typography + +- Display and body: Switzer when the consumer holds a license, otherwise the + `--oc-font-display` and `--oc-font-body` fallback stack. +- Editorial accent: Sentient when licensed, otherwise `--oc-font-serif`. +- Code: the consumer's licensed monospace or `--oc-font-mono`. +- Use sentence case. Keep headings direct, concrete, and proportional to the + surface that contains them. + +## Voice + +OpenClaw should sound capable, direct, curious, and human. Prefer plain verbs, +specific nouns, and short explanations. Avoid inflated futurism, vague claims, +and novelty language that obscures what the product does. + +## Marks And Imagery + +- Preserve the supplied logo's aspect ratio and colors. Apply clearspace only + from approved consumer-local guidance; do not invent a measurement. +- Do not reconstruct the logo from screenshots. +- Use product interfaces, real community work, or approved mascot imagery. +- Keep backgrounds useful to the subject; avoid generic gradients and glow. diff --git a/.agents/skills/openclaw-design-audit/SKILL.md b/.agents/skills/openclaw-design-audit/SKILL.md new file mode 100644 index 0000000000..064aecbf4f --- /dev/null +++ b/.agents/skills/openclaw-design-audit/SKILL.md @@ -0,0 +1,45 @@ +--- +name: openclaw-design-audit +description: Audit OpenClaw frontend code and rendered interfaces for design-system drift, token misuse, primitive reimplementation, accessibility problems, responsive defects, and off-brand copy. Use for design reviews, compliance checks, or scheduled audit-and-fix workflows. +--- + +# OpenClaw Design Audit + +Separate mechanical violations from judgment. Report suggestions as suggestions +unless a documented rule makes them violations. + +## Workflow + +1. Read [rubric.md](references/rubric.md) and run every applicable category. +2. Read the consumer's installed design-system version and current commit SHA. +3. Read the version-matched + [token contract](../openclaw-design-system/references/tokens.md) and + [consumer adapters](../openclaw-design-system/references/consumer-adapters.md). +4. Read the brand or marketing references when those categories apply. +5. Run deterministic source checks before judgment-based review. +6. Inspect representative rendered routes at desktop and mobile sizes. +7. Check light and dark themes where supported. +8. Emit the JSON and Markdown defined in [report-format.md](references/report-format.md). +9. When asked to fix findings, apply only narrow changes allowed by [fix-policy.md](references/fix-policy.md). +10. For scheduled ClawHub delivery, follow [github-pr-delivery.md](references/github-pr-delivery.md). + +## Evidence + +Each finding must include: + +- file and line +- category and severity +- stable rule ID +- concise remediation +- design-system reference +- whether the finding is mechanical or judgment-based + +## Curation + +- Include every error. +- Rank warnings before informational findings, then by affected-file count. +- Surface at most five non-error findings in the concise report. +- Summarize remaining non-error findings by count. +- Treat zero errors, zero warnings, and five or fewer informational findings as + no significant drift. +- Never invent source locations or visual evidence. diff --git a/.agents/skills/openclaw-design-audit/references/fix-policy.md b/.agents/skills/openclaw-design-audit/references/fix-policy.md new file mode 100644 index 0000000000..6e1a4fcc13 --- /dev/null +++ b/.agents/skills/openclaw-design-audit/references/fix-policy.md @@ -0,0 +1,25 @@ +# Audit Fix Policy + +An audit may automatically fix a finding only when the change is narrow, +deterministic, and covered by an existing rule. + +## Allowed + +- replace a raw value with an equivalent canonical semantic token +- replace a new legacy alias with its canonical token +- use an established local primitive instead of a duplicate raw control +- add a missing accessible label when intent is unambiguous +- repair clipping or overflow without changing information architecture +- update the pinned design-system tag in a dedicated dependency change + +## Requires Human Review + +- copy, hierarchy, navigation, or information-architecture changes +- new components or abstractions +- broad visual redesign +- deletion of compatibility aliases +- asset or license interpretation +- changes that intentionally alter current rendered behavior + +Do not combine unrelated dependency, redesign, and audit fixes in one pull +request. Preserve tests and include real browser evidence for rendered changes. diff --git a/.agents/skills/openclaw-design-audit/references/github-pr-delivery.md b/.agents/skills/openclaw-design-audit/references/github-pr-delivery.md new file mode 100644 index 0000000000..0bb1091f12 --- /dev/null +++ b/.agents/skills/openclaw-design-audit/references/github-pr-delivery.md @@ -0,0 +1,55 @@ +# GitHub Pull Request Delivery + +The scheduled ClawHub audit opens a pull request directly against +`openclaw/clawhub`. It does not create or update a tracker issue. + +The schedule and credentials live in the consumer repository's GitHub Actions +workflow. This design-system skill defines the audit and delivery contract; it +does not schedule itself. + +## Branch And Scope + +- Use a stable automation branch such as `automation/design-audit`. +- Start from current remote `main`. +- Commit only the report and allowed deterministic fixes. +- Do not overwrite unrelated human work on an existing branch. + +## Procedure + +1. Checkout `openclaw/clawhub` with full history and fetch remote `main`. +2. Reset only the dedicated automation branch to `origin/main`. +3. Install the design system at the workflow's pinned Git tag. +4. Run source checks, browser checks, and report generation. +5. Apply only fixes allowed by `fix-policy.md`. +6. Write reports under the consumer's established audit-artifact path. +7. If the decision table says `artifact only`, upload the reports and job + summary without pushing a branch. +8. Otherwise commit, force-push the dedicated automation branch with + `--force-with-lease`, then use `gh pr create` or `gh pr edit` for the single + open pull request owned by that branch. + +## Pull Request + +The title must identify the audit and date. The body includes: + +- design-system version +- audited ClawHub SHA +- count by severity +- commands and routes checked +- concise expanded findings +- whether fixes are included +- paths to JSON, Markdown, and screenshot artifacts + +If an open audit pull request exists, update it only when it owns the same stable +automation branch. Close it without merge when a later clean run makes its +findings obsolete. + +## Decision Table + +| Findings | Delivery | +| --- | --- | +| One or more errors | Open or update the pull request | +| Zero errors and one or more warnings | Open or update the pull request | +| Zero errors, zero warnings, more than five informational findings | Open or update the pull request | +| Zero errors, zero warnings, five or fewer informational findings | Artifact and job summary only | +| No findings | Artifact and job summary only; close an obsolete open audit PR | diff --git a/.agents/skills/openclaw-design-audit/references/report-format.md b/.agents/skills/openclaw-design-audit/references/report-format.md new file mode 100644 index 0000000000..225a179387 --- /dev/null +++ b/.agents/skills/openclaw-design-audit/references/report-format.md @@ -0,0 +1,46 @@ +# Audit Report Format + +Produce both `design-audit.json` and `design-audit.md`. + +## JSON + +```json +{ + "designSystemVersion": "v0.0.1", + "consumerSha": "", + "summary": { + "errors": 0, + "warnings": 0, + "info": 0 + }, + "findings": [ + { + "id": "token/raw-color", + "severity": "warning", + "kind": "mechanical", + "file": "src/example.css", + "line": 12, + "message": "Use the semantic accent token.", + "remediation": "Replace the raw coral value with var(--oc-accent-primary).", + "reference": "openclaw-design-system/references/tokens.md" + } + ] +} +``` + +Sort findings by severity, rule ID, file, then line. Keep stable IDs so recurring +automation can compare runs. + +## Markdown + +Include: + +1. audited design-system version and consumer SHA +2. validation commands and rendered routes +3. count by severity +4. every error +5. at most five warning or informational findings +6. count of additional non-error findings not expanded + +Use repository-relative file links. State explicitly when no significant drift +was found. diff --git a/.agents/skills/openclaw-design-audit/references/rubric.md b/.agents/skills/openclaw-design-audit/references/rubric.md new file mode 100644 index 0000000000..c803b7a830 --- /dev/null +++ b/.agents/skills/openclaw-design-audit/references/rubric.md @@ -0,0 +1,37 @@ +# Design Audit Rubric + +## Mechanical Rules + +| ID | Check | +| --- | --- | +| `token/raw-color` | New raw colors where a semantic token exists | +| `token/undefined` | Custom properties used but not defined by package or consumer | +| `token/legacy-alias` | New code depends on a migration-only alias | +| `component/duplicate` | Raw control or primitive duplicates an established local primitive | +| `component/state` | Missing hover, focus, disabled, loading, invalid, or selected state | +| `layout/overflow` | Text or fixed-format UI clips or causes accidental horizontal scroll | +| `a11y/name` | Interactive control lacks an accessible name | +| `a11y/focus` | Keyboard focus is hidden, trapped, or incoherent | +| `theme/parity` | Light or dark theme loses content, hierarchy, or contrast | +| `asset/rights` | New distributable asset has no recorded rights | + +## Judgment Checks + +| ID | Check | +| --- | --- | +| `hierarchy/primary-action` | Competing primary actions obscure the decision | +| `layout/card-overuse` | Sections or cards are unnecessarily nested or floated | +| `typography/scale` | Type scale does not match its container or task density | +| `brand/accent` | Coral, sea glass, or status colors are used without their intended role | +| `marketing/subject` | First viewport hides the actual product, place, person, or offer | +| `copy/clarity` | Interface text is vague, inflated, or does not name the action | + +## Severity + +- `error`: broken interaction, accessibility barrier, illegible theme, accidental + overflow, missing asset rights, or deterministic contract violation. +- `warning`: likely drift or inconsistency with meaningful user impact. +- `info`: improvement with limited current impact. + +Do not mark aesthetic preference as a violation. A finding needs source or +rendered evidence and a documented rule. diff --git a/.agents/skills/openclaw-design-system/SKILL.md b/.agents/skills/openclaw-design-system/SKILL.md new file mode 100644 index 0000000000..2b6677e6c8 --- /dev/null +++ b/.agents/skills/openclaw-design-system/SKILL.md @@ -0,0 +1,41 @@ +--- +name: openclaw-design-system +description: Build or modify OpenClaw application UI using canonical semantic tokens, themes, shared CSS foundations, consumer adapters, and established local primitives. Use for product interfaces, component styling, theme work, or design-token integration. +--- + +# OpenClaw Design System + +Use the shared package for foundations and framework-neutral visual primitives. +Keep consumer-specific behavior, data, routes, and layout composition local. + +## Workflow + +1. Read [tokens.md](references/tokens.md) before choosing colors, spacing, type, radii, or shadows. +2. Read [consumer-adapters.md](references/consumer-adapters.md) for the current framework. +3. Inspect the consumer's existing shared primitives before creating a component. +4. Use semantic tokens for UI intent; use palette primitives only for documented exceptions. +5. Keep application behavior, routes, and information architecture unchanged unless the task says otherwise. +6. Validate the affected routes with existing tests and real browser screenshots. + +## Interface Rules + +- Import the complete CSS contract or its focused exported entry points. +- Compose shared classes from `components.css` before adding a one-off visual implementation. +- Use local shared primitives before raw controls or one-off component implementations. +- Keep one primary action per decision area. +- Use familiar icons for icon-only commands and provide accessible names. +- Use status colors for status, warning, success, error, and informational meaning. +- Keep cards, controls, and repeated fixed-format elements dimensionally stable. +- Avoid nested decorative cards and page sections styled as floating cards. +- Keep surfaces, controls, and insets square through their semantic radius tokens. +- Reserve round geometry for avatars, status dots, and other truly circular indicators. +- Keep focus, hover, active, disabled, loading, and invalid states coherent. +- Keep text within its container at supported viewport sizes. +- Prefer dense, scan-friendly composition for operational product surfaces. + +## Ownership + +Move visual implementation into this repository when its interface is +framework-neutral and useful across consumers. Keep runtime behavior and +framework adapters local until at least two consumers need the same interface +and behavior. diff --git a/.agents/skills/openclaw-design-system/references/consumer-adapters.md b/.agents/skills/openclaw-design-system/references/consumer-adapters.md new file mode 100644 index 0000000000..bfa8ac0b03 --- /dev/null +++ b/.agents/skills/openclaw-design-system/references/consumer-adapters.md @@ -0,0 +1,55 @@ +# Consumer Adapters + +## Plain CSS And Astro + +Use the complete contract when the global reset is desired: + +```css +@import "@openclaw/design-system"; +``` + +For a controlled migration, import `tokens.css`, `themes.css`, and +`typography.css`, then `components.css`. Retain consumer-specific layout CSS. +Theme switching remains application-owned. The canonical public-site selector is +`html[data-theme="light"|"dark"]`. + +## Tailwind 4 + +Import in this order: + +```css +@import "@openclaw/design-system/tokens.css"; +@import "@openclaw/design-system/themes.css"; +@import "@openclaw/design-system/typography.css"; +@import "@openclaw/design-system/components.css"; +@import "@openclaw/design-system/themes/product.css"; +@import "@openclaw/design-system/compat/clawhub.css"; +@import "@openclaw/design-system/tailwind.css"; +``` + +The Tailwind adapter exposes theme utilities. `components.css` provides +framework-neutral classes; keep Radix, React, route, and product behavior in the +consumer. + +The ClawHub compatibility adapter understands: + +- `data-theme-family="claw"` +- `data-theme-resolved="light"|"dark"` +- `data-theme-mode="system"` +- the existing unprefixed token aliases + +Remove aliases only after source search and browser validation prove that no +consumer uses them. + +## Static Documentation Builders + +Copy or resolve the focused CSS exports as build inputs. Import tokens, themes, +and typography before the docs shell CSS. Do not import `base.css` until the +generated navigation, prose, search, code, and Mermaid views have been compared +in a real browser. + +## Versioning + +Install an immutable Git tag. Runtime CSS and skill guidance use the same tag. +Dependabot or a scheduled update workflow may propose a newer tag, but migration +and visual validation remain consumer responsibilities. diff --git a/.agents/skills/openclaw-design-system/references/tokens.md b/.agents/skills/openclaw-design-system/references/tokens.md new file mode 100644 index 0000000000..32303f2256 --- /dev/null +++ b/.agents/skills/openclaw-design-system/references/tokens.md @@ -0,0 +1,51 @@ +# Token Contract + +Import `@openclaw/design-system` for the complete foundation or use focused +exports when the consumer must control reset and adapter order. + +## Layers + +| Layer | Prefix | Purpose | +| --- | --- | --- | +| Palette | `--oc-palette-*` | Fixed source colors; rare direct use | +| Semantic | `--oc-bg-*`, `--oc-text-*`, `--oc-accent-*` | Theme-aware UI intent | +| Scale | `--oc-space-*`, `--oc-font-size-*`, `--oc-radius-*` | Shared dimensions | +| Motion | `--oc-duration-*`, `--oc-ease-*` | Shared interaction timing | +| Product | `--oc-status-*`, `--oc-input-*`, `--oc-diff-*` | Opt-in operational UI | +| Consumer alias | Unprefixed legacy names | Migration compatibility only | + +## Semantic Choices + +- Page background: `--oc-bg-page` +- Ordinary surface: `--oc-bg-surface` +- Elevated surface: `--oc-bg-elevated` +- Primary, secondary, muted text: `--oc-text-primary`, + `--oc-text-secondary`, `--oc-text-muted` +- Primary action: `--oc-accent-primary`; hover: + `--oc-accent-primary-hover` +- Secondary accent: `--oc-accent-secondary` +- Subtle and accent borders: `--oc-border-subtle`, + `--oc-border-accent` +- Focus: `--oc-focus-ring` + +Use `color-mix()` from semantic variables for a local translucent state. Add a +new shared semantic token only when the same intent recurs across consumers. + +## Radius + +Use semantic geometry roles in product UI: + +- `--oc-radius-surface`: cards, panels, and framed sections +- `--oc-radius-control`: buttons, fields, chips, and segmented controls +- `--oc-radius-inset`: nested interactive or decorative surfaces +- `--oc-radius-round`: avatars, status dots, and genuinely circular indicators + +The first three roles are square in the canonical OpenClaw system. Raw +`--oc-radius-*` scale values remain available for documented exceptions, but +must not replace the semantic defaults. + +## Ownership + +Consumer repositories own page composition and application states. This package +owns stable visual foundations, framework-neutral component primitives, and +thin migration aliases. diff --git a/.agents/skills/openclaw-design/SKILL.md b/.agents/skills/openclaw-design/SKILL.md new file mode 100644 index 0000000000..7051bfec26 --- /dev/null +++ b/.agents/skills/openclaw-design/SKILL.md @@ -0,0 +1,33 @@ +--- +name: openclaw-design +description: Route OpenClaw design work to the canonical brand, product design-system, marketing-page, or design-audit guidance. Use when a task touches OpenClaw visual identity, shared CSS tokens, product UI, public web pages, or design-system compliance. +--- + +# OpenClaw Design + +Choose one focused branch before changing an interface. Load multiple branches +only when the task genuinely crosses them. + +| Skill | Use for | +| --- | --- | +| `openclaw-brand` | Identity decisions, typography, logos, imagery, voice, and non-product brand artifacts | +| `openclaw-design-system` | Application UI, semantic tokens, themes, component reuse, and framework adapters | +| `openclaw-marketing-pages` | Public-page composition, landing/content pages, navigation, SEO, and responsive layout | +| `openclaw-design-audit` | Design drift, token misuse, component substitution, accessibility, and recurring audits | + +For a public website change, start with `openclaw-marketing-pages` and add +`openclaw-brand` only when the task changes identity, logo, imagery, typography, +or voice. For a product application, start with `openclaw-design-system`. + +## Shared Contract + +- Install agent guidance from this repository's default branch and refresh it with + `npx skills update --project --yes`. +- Keep runtime CSS pinned to a semantic release tag. +- Prefer semantic tokens over raw palette values. +- Keep product-specific components and layouts in their consumer repository. +- Add shared implementation only after at least two consumers demonstrate the same interface. +- Preserve consumer behavior while changing the visual foundation. +- Validate rendered pages in a real browser at desktop and mobile sizes. +- Check both light and dark themes where the consumer supports them. +- Do not redistribute fonts, logos, or artwork without recorded permission. diff --git a/.agents/skills/openclaw-marketing-pages/SKILL.md b/.agents/skills/openclaw-marketing-pages/SKILL.md new file mode 100644 index 0000000000..de15f61b5d --- /dev/null +++ b/.agents/skills/openclaw-marketing-pages/SKILL.md @@ -0,0 +1,32 @@ +--- +name: openclaw-marketing-pages +description: Create or update OpenClaw public-page composition for websites, landing pages, content pages, ecosystem pages, and campaigns. Use for page structure, navigation, responsive layout, media, SEO presentation, or public-site visual polish. +--- + +# OpenClaw Marketing Pages + +Build the real public experience first. Do not replace it with a generic landing-page +template or an explanatory feature tour. + +## Workflow + +1. Read [page-patterns.md](references/page-patterns.md). +2. Inspect the consumer's existing header, footer, sections, and page primitives. +3. Reuse local public-site patterns before adding another composition. +4. Use the canonical tokens and typography contract. +5. Make the brand, product, place, or object visible in the first viewport. +6. Keep a hint of the next section visible at common desktop and mobile heights. +7. Validate navigation, content hierarchy, media, light/dark themes, and responsive behavior in a browser. + +## Rules + +- Use the literal brand, product, place, person, or offer as the primary headline. +- Put value propositions in supporting copy rather than an abstract headline. +- Use relevant product or community imagery instead of atmospheric stock media. +- Keep page sections unframed; use cards only for genuinely repeated items. +- Avoid repetitive social-proof, feature-grid, and CTA sections without a content need. +- Keep headings proportionate to their container. +- Use icons for tools and familiar actions; do not use decorative icon boxes. +- Preserve readable line length and clear section rhythm. +- Use motion to explain state or progression, not as ambient decoration. +- Preserve SEO metadata, semantic heading order, and accessible navigation. diff --git a/.agents/skills/openclaw-marketing-pages/references/page-patterns.md b/.agents/skills/openclaw-marketing-pages/references/page-patterns.md new file mode 100644 index 0000000000..bc4d566ac6 --- /dev/null +++ b/.agents/skills/openclaw-marketing-pages/references/page-patterns.md @@ -0,0 +1,36 @@ +# Public Page Patterns + +## First Viewport + +- Show the literal product, project, venue, person, or offer immediately. +- Use the name or literal category as the primary heading. +- Keep supporting copy specific: what it is, who it helps, and the next action. +- Let the next section remain partially visible at common viewport heights. +- Use an approved real image or an actual product state when media helps. + +## Structure + +- Reuse the consumer's header, footer, content width, and navigation behavior. +- Build sections as full-width bands or unframed layouts with constrained inner + content. +- Use cards for repeated comparable items, not as wrappers around every section. +- Keep one primary action per decision area and avoid repeated CTA blocks. +- Preserve semantic heading order, metadata, canonical URLs, and readable prose + widths. + +## Responsive Checks + +Check at least one narrow mobile viewport and one desktop viewport. Verify: + +- navigation and menus remain reachable +- headings and buttons wrap without clipping +- media shows the important subject +- fixed controls do not cover content +- horizontal scrolling is intentional +- light and dark themes preserve hierarchy and contrast + +## Local Ownership + +Marketing layouts, decorative textures, film grain, dot grids, site headers, +footers, article prose, and route-specific media remain in the consumer unless +multiple sites prove the same reusable interface. diff --git a/.github/workflows/update-skills.yml b/.github/workflows/update-skills.yml new file mode 100644 index 0000000000..a1cdea6426 --- /dev/null +++ b/.github/workflows/update-skills.yml @@ -0,0 +1,103 @@ +name: Update skills + +on: + schedule: + - cron: "17 15 * * *" + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +concurrency: + group: update-skills + cancel-in-progress: false + +jobs: + update: + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + with: + fetch-depth: 0 + + - name: Update project skills + run: | + set -euo pipefail + # The committed .agents directory keeps updates in universal project scope. + output="$(npx --yes skills@1.5.15 update --project --yes 2>&1)" + printf '%s\n' "$output" + if grep -q "Failed to update" <<<"$output"; then + echo "One or more skills failed to update." >&2 + exit 1 + fi + + - name: Stage managed skill changes + id: changes + run: | + set -euo pipefail + + git add skills-lock.json + while IFS= read -r skill; do + git add ".agents/skills/${skill}" + done < <(jq -r '.skills | keys[]' skills-lock.json) + + unexpected="$( + git status --porcelain=v1 --untracked-files=all \ + | awk 'substr($0, 1, 2) == "??" || substr($0, 2, 1) != " "' + )" + if [[ -n "$unexpected" ]]; then + echo "Unexpected unstaged paths changed:" + echo "$unexpected" + exit 1 + fi + + if git diff --cached --quiet; then + echo "changed=false" >> "$GITHUB_OUTPUT" + else + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Open or update pull request + if: steps.changes.outputs.changed == 'true' + env: + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + branch="automation/update-skills" + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git fetch origin "refs/heads/${branch}:refs/remotes/origin/${branch}" || true + git switch -C "$branch" + git commit -m "chore: update skills" + git push --force-with-lease origin "$branch" + + body="$RUNNER_TEMP/update-skills-pr.md" + { + echo "## Summary" + echo + echo "- refresh all project skills tracked by skills-lock.json" + echo "- update committed skill content and lockfile hashes" + echo + echo "Generated by the daily project skill updater." + } > "$body" + + number="$( + gh pr list \ + --head "$branch" \ + --state open \ + --json number \ + --jq '.[0].number // empty' + )" + if [[ -n "$number" ]]; then + gh pr edit "$number" \ + --title "chore: update project skills" \ + --body-file "$body" + else + gh pr create \ + --base main \ + --head "$branch" \ + --title "chore: update project skills" \ + --body-file "$body" + fi diff --git a/docs/ar/maturity/taxonomy.md b/docs/ar/maturity/taxonomy.md index e1f877b38c..92d424c77f 100644 --- a/docs/ar/maturity/taxonomy.md +++ b/docs/ar/maturity/taxonomy.md @@ -677,7 +677,7 @@ x-i18n:
ألفا57%
بيتا79%
بيتا79%
-
[السياق](/ar/concepts/context)، [محرك السياق](/ar/concepts/context-engine)، [حزمة اختبار محرك سياق Codex](/ar/plan/codex-context-engine-harness)
+
[السياق](/ar/concepts/context)، [محرك السياق](/ar/concepts/context-engine)
diff --git a/docs/de/maturity/taxonomy.md b/docs/de/maturity/taxonomy.md index 313f23f5ab..a9d9ab6ec5 100644 --- a/docs/de/maturity/taxonomy.md +++ b/docs/de/maturity/taxonomy.md @@ -677,7 +677,7 @@ Eine Oberfläche ist ein Produktbereich wie Gateway-Laufzeit, Discord oder die m
Alpha57%
Beta79%
Beta79%
-
[Kontext](/de/concepts/context), [Kontext-Engine](/de/concepts/context-engine), [Codex-Kontext-Engine-Harness](/de/plan/codex-context-engine-harness)
+
[Kontext](/de/concepts/context), [Kontext-Engine](/de/concepts/context-engine)
diff --git a/docs/es/maturity/taxonomy.md b/docs/es/maturity/taxonomy.md index bf42afaa8a..1a340f7581 100644 --- a/docs/es/maturity/taxonomy.md +++ b/docs/es/maturity/taxonomy.md @@ -677,7 +677,7 @@ Una superficie es un área de producto, como el entorno de ejecución de Gateway
Alfa57%
Beta79%
Beta79%
-
[Contexto](/es/concepts/context), [Motor de contexto](/es/concepts/context-engine), [Arnés del motor de contexto de Codex](/es/plan/codex-context-engine-harness)
+
[Contexto](/es/concepts/context), [Motor de contexto](/es/concepts/context-engine)
diff --git a/docs/fa/maturity/taxonomy.md b/docs/fa/maturity/taxonomy.md index a9db0677c7..bcf9673d3d 100644 --- a/docs/fa/maturity/taxonomy.md +++ b/docs/fa/maturity/taxonomy.md @@ -677,7 +677,7 @@ x-i18n:
آلفا57%
بتا79%
بتا79%
-
[زمینه](/fa/concepts/context)، [موتور زمینه](/fa/concepts/context-engine)، [مهار موتور زمینه Codex](/fa/plan/codex-context-engine-harness)
+
[زمینه](/fa/concepts/context)، [موتور زمینه](/fa/concepts/context-engine)
diff --git a/docs/fr/maturity/taxonomy.md b/docs/fr/maturity/taxonomy.md index f8c3c3d1bf..b61b7aa017 100644 --- a/docs/fr/maturity/taxonomy.md +++ b/docs/fr/maturity/taxonomy.md @@ -677,7 +677,7 @@ Une surface est un domaine produit tel que le runtime Gateway, Discord ou l’ap
Alpha57%
Bêta79%
Bêta79%
-
[Contexte](/fr/concepts/context), [Moteur de contexte](/fr/concepts/context-engine), [Banc d’essai du moteur de contexte Codex](/fr/plan/codex-context-engine-harness)
+
[Contexte](/fr/concepts/context), [Moteur de contexte](/fr/concepts/context-engine)
diff --git a/docs/hi/maturity/taxonomy.md b/docs/hi/maturity/taxonomy.md index 25494c393c..50742c116f 100644 --- a/docs/hi/maturity/taxonomy.md +++ b/docs/hi/maturity/taxonomy.md @@ -677,7 +677,7 @@ x-i18n:
अल्फा57%
बीटा79%
बीटा79%
-
[संदर्भ](/hi/concepts/context), [संदर्भ इंजन](/hi/concepts/context-engine), [Codex संदर्भ इंजन हार्नेस](/hi/plan/codex-context-engine-harness)
+
[संदर्भ](/hi/concepts/context), [संदर्भ इंजन](/hi/concepts/context-engine)
diff --git a/docs/id/maturity/taxonomy.md b/docs/id/maturity/taxonomy.md index 162c533da2..55e0e4894b 100644 --- a/docs/id/maturity/taxonomy.md +++ b/docs/id/maturity/taxonomy.md @@ -677,7 +677,7 @@ Permukaan adalah area produk seperti runtime Gateway, Discord, atau aplikasi mac
Alpha57%
Beta79%
Beta79%
-
[Konteks](/id/concepts/context), [Mesin Konteks](/id/concepts/context-engine), [Harness Mesin Konteks Codex](/id/plan/codex-context-engine-harness)
+
[Konteks](/id/concepts/context), [Mesin Konteks](/id/concepts/context-engine)
diff --git a/docs/it/maturity/taxonomy.md b/docs/it/maturity/taxonomy.md index d4c7291f93..22eaecae47 100644 --- a/docs/it/maturity/taxonomy.md +++ b/docs/it/maturity/taxonomy.md @@ -677,7 +677,7 @@ Una superficie è un'area di prodotto come il runtime Gateway, Discord o l'app m
Alfa57%
Beta79%
Beta79%
-
[Contesto](/it/concepts/context), [Motore del contesto](/it/concepts/context-engine), [Harness del motore del contesto di Codex](/it/plan/codex-context-engine-harness)
+
[Contesto](/it/concepts/context), [Motore del contesto](/it/concepts/context-engine)
diff --git a/docs/ja-JP/maturity/taxonomy.md b/docs/ja-JP/maturity/taxonomy.md index 276c317736..7e53f6f8d8 100644 --- a/docs/ja-JP/maturity/taxonomy.md +++ b/docs/ja-JP/maturity/taxonomy.md @@ -677,7 +677,7 @@ x-i18n:
アルファ57%
ベータ79%
ベータ79%
-
[コンテキスト](/ja-JP/concepts/context), [コンテキストエンジン](/ja-JP/concepts/context-engine), [Codexコンテキストエンジンハーネス](/ja-JP/plan/codex-context-engine-harness)
+
[コンテキスト](/ja-JP/concepts/context), [コンテキストエンジン](/ja-JP/concepts/context-engine)
diff --git a/docs/ko/maturity/taxonomy.md b/docs/ko/maturity/taxonomy.md index 81e62c2214..7b78540020 100644 --- a/docs/ko/maturity/taxonomy.md +++ b/docs/ko/maturity/taxonomy.md @@ -677,7 +677,7 @@ x-i18n:
알파57%
베타79%
베타79%
-
[컨텍스트](/ko/concepts/context), [컨텍스트 엔진](/ko/concepts/context-engine), [Codex 컨텍스트 엔진 하니스](/ko/plan/codex-context-engine-harness)
+
[컨텍스트](/ko/concepts/context), [컨텍스트 엔진](/ko/concepts/context-engine)
diff --git a/docs/nl/maturity/taxonomy.md b/docs/nl/maturity/taxonomy.md index 16241d89e9..08ae9a73fb 100644 --- a/docs/nl/maturity/taxonomy.md +++ b/docs/nl/maturity/taxonomy.md @@ -677,7 +677,7 @@ Een oppervlak is een productgebied zoals Gateway-runtime, Discord of de macOS-ap
Alpha57%
Beta79%
Beta79%
-
[Context](/nl/concepts/context), [Context-engine](/nl/concepts/context-engine), [Codex Context Engine-harness](/nl/plan/codex-context-engine-harness)
+
[Context](/nl/concepts/context), [Context-engine](/nl/concepts/context-engine)
diff --git a/docs/pl/maturity/taxonomy.md b/docs/pl/maturity/taxonomy.md index 38c9df53e6..f427e399ca 100644 --- a/docs/pl/maturity/taxonomy.md +++ b/docs/pl/maturity/taxonomy.md @@ -677,7 +677,7 @@ Powierzchnia to obszar produktu, taki jak środowisko uruchomieniowe Gateway, Di
Alfa57%
Beta79%
Beta79%
-
[Kontekst](/pl/concepts/context), [Silnik kontekstu](/pl/concepts/context-engine), [Środowisko testowe silnika kontekstu Codex](/pl/plan/codex-context-engine-harness)
+
[Kontekst](/pl/concepts/context), [Silnik kontekstu](/pl/concepts/context-engine)
diff --git a/docs/pt-BR/maturity/taxonomy.md b/docs/pt-BR/maturity/taxonomy.md index d80da83c45..6708b10b05 100644 --- a/docs/pt-BR/maturity/taxonomy.md +++ b/docs/pt-BR/maturity/taxonomy.md @@ -677,7 +677,7 @@ Uma superfície é uma área do produto, como runtime do Gateway, Discord ou o a
Alfa57%
Beta79%
Beta79%
-
[Contexto](/pt-BR/concepts/context), [Motor de contexto](/pt-BR/concepts/context-engine), [Harness do motor de contexto do Codex](/pt-BR/plan/codex-context-engine-harness)
+
[Contexto](/pt-BR/concepts/context), [Motor de contexto](/pt-BR/concepts/context-engine)
diff --git a/docs/ru/maturity/taxonomy.md b/docs/ru/maturity/taxonomy.md index 79b0c6eb67..2d1b79f1ee 100644 --- a/docs/ru/maturity/taxonomy.md +++ b/docs/ru/maturity/taxonomy.md @@ -677,7 +677,7 @@ x-i18n:
Альфа57%
Бета79%
Бета79%
-
[Контекст](/ru/concepts/context), [Движок контекста](/ru/concepts/context-engine), [Тестовая обвязка движка контекста Codex](/ru/plan/codex-context-engine-harness)
+
[Контекст](/ru/concepts/context), [Движок контекста](/ru/concepts/context-engine)
diff --git a/docs/th/maturity/taxonomy.md b/docs/th/maturity/taxonomy.md index 0f2e06be7c..c5073e4af7 100644 --- a/docs/th/maturity/taxonomy.md +++ b/docs/th/maturity/taxonomy.md @@ -677,7 +677,7 @@ x-i18n:
อัลฟา57%
เบต้า79%
เบต้า79%
-
[บริบท](/th/concepts/context), [เอ็นจินบริบท](/th/concepts/context-engine), [ชุดทดสอบเอ็นจินบริบท Codex](/th/plan/codex-context-engine-harness)
+
[บริบท](/th/concepts/context), [เอ็นจินบริบท](/th/concepts/context-engine)
diff --git a/docs/tr/maturity/taxonomy.md b/docs/tr/maturity/taxonomy.md index 56997d898f..c09752cd84 100644 --- a/docs/tr/maturity/taxonomy.md +++ b/docs/tr/maturity/taxonomy.md @@ -677,7 +677,7 @@ Yüzey, Gateway çalışma zamanı, Discord veya macOS uygulaması gibi bir ür
Alfa57%
Beta79%
Beta79%
-
[Bağlam](/tr/concepts/context), [Bağlam Motoru](/tr/concepts/context-engine), [Codex Bağlam Motoru Harness](/tr/plan/codex-context-engine-harness)
+
[Bağlam](/tr/concepts/context), [Bağlam Motoru](/tr/concepts/context-engine)
diff --git a/docs/uk/maturity/taxonomy.md b/docs/uk/maturity/taxonomy.md index 7f7979f409..d7ecf6aef4 100644 --- a/docs/uk/maturity/taxonomy.md +++ b/docs/uk/maturity/taxonomy.md @@ -677,7 +677,7 @@ x-i18n:
Альфа57%
Бета79%
Бета79%
-
[Контекст](/uk/concepts/context), [Рушій контексту](/uk/concepts/context-engine), [Тестовий стенд рушія контексту Codex](/uk/plan/codex-context-engine-harness)
+
[Контекст](/uk/concepts/context), [Рушій контексту](/uk/concepts/context-engine)
diff --git a/docs/vi/maturity/taxonomy.md b/docs/vi/maturity/taxonomy.md index 78b583edf0..3d89b65257 100644 --- a/docs/vi/maturity/taxonomy.md +++ b/docs/vi/maturity/taxonomy.md @@ -677,7 +677,7 @@ Bề mặt là một khu vực sản phẩm như runtime Gateway, Discord hoặc
Alpha57%
Beta79%
Beta79%
-
[Ngữ cảnh](/vi/concepts/context), [Công cụ ngữ cảnh](/vi/concepts/context-engine), [Bộ khai thác công cụ ngữ cảnh Codex](/vi/plan/codex-context-engine-harness)
+
[Ngữ cảnh](/vi/concepts/context), [Công cụ ngữ cảnh](/vi/concepts/context-engine)
diff --git a/docs/zh-CN/maturity/taxonomy.md b/docs/zh-CN/maturity/taxonomy.md index 7ae15a9adb..9b03cc422f 100644 --- a/docs/zh-CN/maturity/taxonomy.md +++ b/docs/zh-CN/maturity/taxonomy.md @@ -677,7 +677,7 @@ x-i18n:
Alpha 版57%
Beta 版79%
Beta 版79%
-
[上下文](/zh-CN/concepts/context), [上下文引擎](/zh-CN/concepts/context-engine), [Codex 上下文引擎 Harness](/zh-CN/plan/codex-context-engine-harness)
+
[上下文](/zh-CN/concepts/context), [上下文引擎](/zh-CN/concepts/context-engine)
diff --git a/docs/zh-TW/maturity/taxonomy.md b/docs/zh-TW/maturity/taxonomy.md index bb4c109ab7..776354cce6 100644 --- a/docs/zh-TW/maturity/taxonomy.md +++ b/docs/zh-TW/maturity/taxonomy.md @@ -677,7 +677,7 @@ x-i18n:
Alpha 版57%
Beta 版79%
Beta 版79%
-
[脈絡](/zh-TW/concepts/context), [脈絡引擎](/zh-TW/concepts/context-engine), [Codex 脈絡引擎 Harness](/zh-TW/plan/codex-context-engine-harness)
+
[脈絡](/zh-TW/concepts/context), [脈絡引擎](/zh-TW/concepts/context-engine)
diff --git a/package-lock.json b/package-lock.json index 2b9dd11e92..e0a7bf1c43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,9 @@ "packages": { "": { "name": "openclaw-docs-site", + "dependencies": { + "@openclaw/design-system": "https://github.com/openclaw/design-system/archive/refs/tags/v0.0.1.tar.gz" + }, "devDependencies": { "@resvg/resvg-js": "^2.6.2", "highlight.js": "11.11.1", @@ -53,9 +56,9 @@ "license": "MIT" }, "node_modules/@iconify/utils": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.3.tgz", - "integrity": "sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.4.tgz", + "integrity": "sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==", "dev": true, "license": "MIT", "dependencies": { @@ -74,6 +77,15 @@ "@chevrotain/types": "~11.1.2" } }, + "node_modules/@openclaw/design-system": { + "version": "0.0.1", + "resolved": "https://github.com/openclaw/design-system/archive/refs/tags/v0.0.1.tar.gz", + "integrity": "sha512-lHrGhA5J52PLQcRTaIWLXMx/sCpd95zVnCFaJQfu2aJwsoLtRe1CgkHubuIjDKIpq4i8lPClFYGbdUKeTupeUQ==", + "license": "MIT", + "engines": { + "bun": ">=1.3.0" + } + }, "node_modules/@pagefind/darwin-arm64": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.5.2.tgz", @@ -614,9 +626,9 @@ "license": "MIT" }, "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.4.tgz", + "integrity": "sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==", "dev": true, "license": "MIT" }, @@ -750,6 +762,13 @@ "d3-transition": "^3.0.1" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -1352,9 +1371,9 @@ } }, "node_modules/es-toolkit": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.0.tgz", - "integrity": "sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.49.0.tgz", + "integrity": "sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==", "dev": true, "license": "MIT", "workspaces": [ @@ -1469,9 +1488,9 @@ "license": "MIT" }, "node_modules/linkify-it": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", - "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", "dev": true, "funding": [ { @@ -1541,13 +1560,6 @@ "markdown-it": "*" } }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, "node_modules/marked": { "version": "16.4.2", "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", @@ -1599,9 +1611,9 @@ } }, "node_modules/package-manager-detector": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", - "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.7.0.tgz", + "integrity": "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==", "dev": true, "license": "MIT" }, @@ -1743,9 +1755,9 @@ } }, "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz", + "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==", "dev": true, "license": "MIT", "engines": { @@ -1760,9 +1772,9 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", - "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", + "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", diff --git a/package.json b/package.json index 9d6f5d4b22..f8f0f63ea2 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "docs:smoke:shell": "DOCS_SITE_ARTIFACT_MODE=shell node scripts/docs-site/smoke.mjs", "docs:visual": "node scripts/docs-site/visual-smoke.mjs", "docs:check": "npm run docs:build && npm run docs:smoke && npm run docs:visual && node --check scripts/docs-site/llms-full.mjs", + "skills:install": "npx --yes skills@1.5.15 add openclaw/design-system --skill openclaw-design openclaw-brand openclaw-design-system openclaw-marketing-pages openclaw-design-audit --agent codex --copy --yes", "test": "node --test scripts/docs-site/frontmatter.test.mjs" }, "devDependencies": { @@ -28,5 +29,8 @@ "pagefind": "1.5.2", "playwright": "^1.61.1", "yaml": "2.9.0" + }, + "dependencies": { + "@openclaw/design-system": "https://github.com/openclaw/design-system/archive/refs/tags/v0.0.1.tar.gz" } } diff --git a/scripts/docs-site/assets.mjs b/scripts/docs-site/assets.mjs index 19e2003d15..15b367a57c 100644 --- a/scripts/docs-site/assets.mjs +++ b/scripts/docs-site/assets.mjs @@ -1,64 +1,73 @@ import fs from "node:fs"; const maturityCss = fs.readFileSync(new URL("./maturity.css", import.meta.url), "utf8"); +const designSystemCss = [ + "@openclaw/design-system/tokens.css", + "@openclaw/design-system/themes.css", + "@openclaw/design-system/typography.css", + "@openclaw/design-system/components.css", + "@openclaw/design-system/themes/product.css", +] + .map((specifier) => fs.readFileSync(new URL(import.meta.resolve(specifier)), "utf8")) + .join("\n"); export function siteCss() { return ` -:root{--bg:#101012;--paper:#19191c;--paper-2:#202024;--ink:#ededed;--text:#bcbcc4;--muted:#9a9aa2;--line:#232327;--line-strong:#2f2f34;--soft:#33211d;--brand:#f5654a;--brand-2:#b23a28;--accent-2:#4fc8ae;--on-brand:#101012;--code:#141416;--code-inline:#232328;--code-block:#0e0e10;--code-text:#e9e9ee;--code-border:#2a2a30;--code-shadow:0 18px 56px rgba(0,0,0,.30);--tok-comment:#7e7e88;--tok-command:#ff8f78;--tok-option:#79c0ff;--tok-string:#8fd4bd;--tok-literal:#d2a8ff;--tok-key:#f2a37c;--tok-number:#79c0ff;--tok-punct:#8b949e;--shadow:0 20px 70px rgba(0,0,0,.34);color-scheme:dark} -:root[data-theme="light"]{--bg:#f6f5f3;--paper:#ffffff;--paper-2:#f0eeea;--ink:#17171a;--text:#46464e;--muted:#63636c;--line:#e3e1dc;--line-strong:#cfccc5;--soft:#fae8e3;--brand:#d84a31;--brand-2:#9c3222;--accent-2:#14806e;--on-brand:#ffffff;--code:#f2f0ec;--code-inline:#ecebe6;--code-block:#fffefc;--code-text:#26262c;--code-border:#dbd8d1;--code-shadow:none;--tok-comment:#6d6d77;--tok-command:#bb3f28;--tok-option:#2365a8;--tok-string:#0f6355;--tok-literal:#7b3fb4;--tok-key:#a63c22;--tok-number:#1a5fb4;--tok-punct:#75707a;--shadow:0 20px 70px rgba(23,23,26,.10);color-scheme:light} -:root{--tooltip-bg:#ededed;--tooltip-text:#17171a;--tooltip-border:#ededed;--sticky-header-h:121px}:root[data-theme="light"]{--tooltip-bg:#17171a;--tooltip-text:#f6f5f3;--tooltip-border:#17171a} -.oc-table-wrap{max-width:100%;overflow:auto;margin:22px 0 28px;border:1px solid var(--line-strong);border-radius:0;background:color-mix(in srgb,var(--paper) 72%,transparent)}.doc .oc-table{margin:0;width:100%;min-width:560px;border-collapse:separate;border-spacing:0;font-size:13px}.doc .oc-table th,.doc .oc-table td{border:0;border-bottom:1px solid var(--line);padding:10px 12px;text-align:left;vertical-align:top;overflow-wrap:anywhere;word-break:break-word}.doc .oc-table th{position:sticky;top:0;background:color-mix(in srgb,var(--paper-2) 86%,var(--soft) 14%);color:var(--ink);font:780 12px/1.35 Switzer,ui-sans-serif,system-ui,sans-serif}.doc .oc-table tr:last-child td{border-bottom:0}.doc .oc-table td:first-child{color:var(--ink);font-weight:720}.oc-lead{margin:18px 0 28px;color:var(--text);font:500 17px/1.72 Switzer,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}.oc-lead p{margin:0}.oc-pullquote{margin:30px 0;padding:3px 0 3px 24px;border-left:3px solid var(--brand);color:var(--ink)}.oc-pullquote blockquote{margin:0;padding:0;border:0;font:400 21px/1.55 Sentient,Georgia,serif;font-style:italic}.oc-pullquote figcaption{margin-top:10px;color:var(--muted);font-size:12px}.oc-stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(170px,100%),1fr));gap:12px;margin:24px 0}.oc-stat{border:1px solid var(--line-strong);border-radius:0;background:color-mix(in srgb,var(--paper) 72%,transparent);padding:15px 16px}.oc-stat strong{display:block;color:var(--ink);font:780 24px/1 Switzer,ui-sans-serif,system-ui,sans-serif;margin:0 0 8px}.oc-stat>span{display:block;color:var(--muted);font-size:12px;line-height:1.35}.oc-stat-delta{display:inline-block!important;width:max-content;margin-top:10px;padding:2px 7px;border:1px solid color-mix(in srgb,var(--brand) 35%,var(--line-strong));border-radius:2px;background:color-mix(in srgb,var(--brand) 10%,var(--paper));color:var(--brand)!important}.oc-stat div p{margin:.8em 0 0}.oc-cta{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:18px;align-items:end;margin:32px 0;padding:22px;border:1px solid color-mix(in srgb,var(--brand) 34%,var(--line-strong));border-radius:0;background:linear-gradient(135deg,color-mix(in srgb,var(--paper) 82%,var(--brand) 18%),color-mix(in srgb,var(--paper-2) 92%,transparent));box-shadow:var(--shadow)}.oc-cta-copy>span{display:block;color:var(--brand);font:780 12px/1.2 Switzer,ui-sans-serif,system-ui,sans-serif;margin:0 0 7px}.oc-cta-copy strong{display:block;color:var(--ink);font:780 19px/1.28 Switzer,ui-sans-serif,system-ui,sans-serif;margin:0 0 8px}.oc-cta-copy p{margin:0;color:var(--text)}.oc-cta-actions{display:flex;flex-wrap:wrap;gap:9px;align-items:center}.oc-cta-link{display:inline-flex;align-items:center;justify-content:center;min-height:38px;padding:10px 20px;border:1px solid var(--line-strong);border-radius:0;font:600 13px/1 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;transition:background .16s ease,border-color .16s ease,color .16s ease,filter .16s ease}.oc-cta-link-primary{background:var(--brand);border-color:var(--brand);color:var(--on-brand)}.oc-cta-link-secondary{background:color-mix(in srgb,var(--paper) 78%,transparent);color:var(--ink)}.oc-cta-link:after{content:"→";margin-left:8px}.oc-cta-link:hover{filter:brightness(1.04)}.oc-cta-link-primary:hover{background:color-mix(in srgb,var(--brand) 86%,white 14%);border-color:color-mix(in srgb,var(--brand) 86%,white 14%);color:var(--on-brand)}.oc-cta-link-secondary:hover{background:color-mix(in srgb,var(--soft) 62%,var(--paper) 38%);border-color:color-mix(in srgb,var(--brand) 44%,var(--line-strong));color:var(--ink)}.oc-cta-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(230px,100%),1fr));gap:14px;margin:24px 0}.oc-cta-card{display:block;min-height:160px;border:1px solid var(--line-strong);border-radius:0;background:color-mix(in srgb,var(--paper) 78%,transparent);padding:18px 20px;color:var(--text);transition:border-color .16s ease,background .16s ease}.oc-cta-card:hover,.oc-cta-card:focus-visible{border-color:var(--brand);background:color-mix(in srgb,var(--soft) 38%,transparent);outline:0}.oc-cta-card .oc-card-icon{margin-bottom:14px}.oc-cta-card strong{display:block;color:var(--ink);font:760 16px/1.3 Switzer,ui-sans-serif,system-ui,sans-serif;margin:0 0 4px}.oc-cta-kicker{display:block;color:var(--brand);font:760 12px/1.35 Switzer,ui-sans-serif,system-ui,sans-serif;margin:0 0 9px}.oc-cta-card p{margin:0 0 14px;color:var(--muted)}.oc-cta-card .oc-cta-actions{margin-top:16px}.oc-chart{margin:28px 0;padding:16px;border:1px solid var(--line-strong);border-radius:0;background:color-mix(in srgb,var(--paper) 76%,transparent)}.oc-chart figcaption{display:flex;align-items:baseline;justify-content:space-between;gap:14px;margin:0 0 16px}.oc-chart figcaption strong{color:var(--ink);font:780 15px/1.25 Switzer,ui-sans-serif,system-ui,sans-serif}.oc-chart figcaption span{color:var(--muted);font-size:12px}.oc-chart-bars{display:grid;gap:10px}.oc-chart-row{display:grid;grid-template-columns:minmax(86px,150px) minmax(120px,1fr) auto;gap:10px;align-items:center}.oc-chart-row>span{color:var(--text);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.oc-chart-row strong{color:var(--ink);font:760 12px/1 Switzer,ui-sans-serif,system-ui,sans-serif}.oc-chart-track{height:10px;border-radius:0;background:color-mix(in srgb,var(--line-strong) 62%,transparent);overflow:hidden}.oc-chart-track i{display:block;width:var(--oc-chart-value);height:100%;border-radius:inherit;background:linear-gradient(90deg,var(--brand-2),var(--brand))}.oc-chart-line-wrap{display:grid;gap:10px}.oc-chart-line-svg{display:block;width:100%;height:auto;overflow:visible}.oc-chart-line-svg polyline{fill:none;stroke:var(--brand);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}.oc-chart-line-svg circle{fill:var(--paper);stroke:var(--brand);stroke-width:3}.oc-chart-gridline{stroke:var(--line-strong);stroke-width:1}.oc-chart-axis{display:flex;justify-content:space-between;gap:8px;color:var(--muted);font-size:11px}.oc-chart-axis span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.oc-chart-data{position:absolute!important;width:1px!important;height:1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important}@media(max-width:820px){.oc-cta{grid-template-columns:1fr}.oc-chart-row{grid-template-columns:minmax(74px,110px) minmax(90px,1fr) auto}.doc .oc-table{min-width:0;table-layout:fixed}} -*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:120px}body{margin:0;display:flex;flex-direction:column;min-height:100vh;background:var(--bg);color:var(--text);font:15px/1.7 Switzer,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;-webkit-font-smoothing:antialiased}::selection{background:var(--brand);color:var(--on-brand)}a{color:inherit;text-decoration:none}a:hover{color:var(--ink)}img{max-width:100%;height:auto}button,input,select{font:inherit}.hidden{display:none!important}.oc-visually-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}:root[data-theme="dark"] .dark\\:hidden{display:none!important}:root[data-theme="dark"] .dark\\:block{display:block!important}:root[data-theme="light"] .dark\\:block{display:none!important} -.site-header{position:sticky;top:0;z-index:70;background:color-mix(in srgb,var(--bg) 94%,transparent);backdrop-filter:blur(18px);border-bottom:1px solid var(--line)}.header-row,.tabs{max-width:1780px;margin:0 auto}.doc-shell{width:100%;max-width:1780px;margin:0 auto;flex:1 0 auto}.header-row{height:62px;display:grid;grid-template-columns:minmax(0,1fr) minmax(300px,430px) minmax(0,1fr);gap:24px;align-items:center;padding:0 56px}.header-left{display:flex;align-items:center;gap:16px;min-width:0}.brand{display:inline-flex;align-items:center;gap:9px;flex:0 0 auto;color:var(--ink);font-weight:600;font-size:14.5px;letter-spacing:.02em}.brand img{width:22px;height:22px}.brand-name{color:var(--ink)}.brand-tag{color:var(--muted);font:600 10px/1 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;letter-spacing:.08em;text-transform:uppercase;border:1px solid var(--line-strong);padding:3px 6px;margin-left:2px}.language-picker{position:relative;min-width:0}.language-native{display:none}.language-trigger{height:36px;border:1px solid transparent;border-radius:0;background:color-mix(in srgb,var(--paper) 62%,transparent);color:var(--ink);display:flex;align-items:center;gap:9px;max-width:190px;padding:0 12px 0 11px;cursor:pointer;transition:background .16s ease,border-color .16s ease,box-shadow .16s ease,color .16s ease}.language-trigger:hover,.language-picker.open .language-trigger{background:var(--paper);border-color:var(--line-strong);color:var(--ink)}.language-trigger:focus-visible{outline:0;border-color:var(--brand);box-shadow:0 0 0 3px color-mix(in srgb,var(--brand) 28%,transparent),0 10px 30px rgba(0,0,0,.20)}.language-trigger:hover .language-chevron{color:var(--brand)}.locale-flag{width:21px;height:21px;border-radius:50%;display:inline-grid;place-items:center;font-size:17px;line-height:1;overflow:hidden;flex:0 0 auto}.language-current{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;color:var(--ink)}.language-chevron{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;color:var(--muted);line-height:1;transition:transform .16s ease,color .16s ease}.language-chevron .icon{width:16px;height:16px}.language-picker.open .language-chevron{transform:rotate(180deg);color:var(--brand)}.language-menu{position:absolute;top:calc(100% + 10px);left:auto;right:0;width:min(340px,calc(100vw - 32px));max-height:min(72vh,720px);overflow:auto;display:none;z-index:80;padding:10px;background:color-mix(in srgb,var(--bg) 92%,#000 8%);border:1px solid var(--line-strong);border-radius:0;box-shadow:0 30px 90px rgba(0,0,0,.52)}.language-picker.open .language-menu{display:block}.language-option{display:grid;grid-template-columns:30px minmax(0,1fr) 22px;align-items:center;gap:12px;padding:12px 16px;border-radius:0;color:var(--ink);font-weight:800;font-size:18px;line-height:1.2}.language-option:hover{background:color-mix(in srgb,var(--paper-2) 84%,transparent);color:var(--ink)}.language-option.active{color:var(--brand)}.language-option.active:hover{background:color-mix(in srgb,var(--soft) 84%,transparent)}.language-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.language-check{opacity:0;color:var(--brand);font-size:19px;text-align:right}.language-option.active .language-check{opacity:1}.icon{display:block;width:18px;height:18px;min-width:18px;max-width:18px;flex:0 0 18px}.search-button{height:38px;border:1px solid var(--line-strong);border-radius:0;background:color-mix(in srgb,var(--paper) 86%,transparent);color:var(--muted);display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;padding:0 9px 0 14px;cursor:pointer;text-align:left}.search-button:hover{background:var(--paper);border-color:var(--line-strong);color:var(--text)}.search-button:hover .search-shortcut{border-color:var(--line-strong);color:var(--ink);background:var(--paper-2)}.search-label{min-width:0;font-size:14px;color:var(--muted)}.search-shortcut{display:inline-grid;place-items:center;justify-self:end;min-width:44px;height:28px;padding:0 9px;border:1px solid var(--line-strong);border-radius:0;background:color-mix(in srgb,var(--paper-2) 82%,transparent);color:var(--text);font:760 13px/1 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace}.header-links{display:flex;align-items:center;justify-content:flex-end;gap:22px;color:var(--muted);font-size:14px;white-space:nowrap}.header-links>a{display:inline-flex;align-items:center;gap:7px;color:var(--muted);font-weight:650}.header-links>a:hover{color:var(--ink)}.header-links>a .icon{width:16px;height:16px;color:var(--ink)}.header-links .top-icon-link{padding:2px}.header-links .top-icon-link .icon{width:18px;height:18px;min-width:18px;max-width:18px;color:currentColor}.header-links button{border:0;background:transparent;color:var(--muted);cursor:pointer;padding:4px}.header-links button:hover{color:var(--ink)}.theme-toggle{display:inline-grid;place-items:center;width:28px;height:28px}.theme-toggle .icon{width:18px;height:18px}.nav-toggle{display:none;flex-direction:column;gap:4px;border:0;background:none;color:var(--muted);cursor:pointer;padding:5px 2px;transition:color .15s ease}.nav-toggle:hover{color:var(--ink)}.nav-toggle span{display:block;width:18px;height:1.6px;background:currentColor;border-radius:1px;transition:transform .25s ease,opacity .2s ease}body.nav-open .nav-toggle span:nth-child(1){transform:translateY(5.6px) rotate(45deg)}body.nav-open .nav-toggle span:nth-child(2){opacity:0}body.nav-open .nav-toggle span:nth-child(3){transform:translateY(-5.6px) rotate(-45deg)}.sidebar-close{display:none} -.search-shortcut{display:inline-flex;align-items:center;justify-content:flex-end;gap:2px;color:var(--muted);font:760 15px/1 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;background:transparent;border:0;border-radius:0;box-shadow:none;min-width:0;height:15px;padding:0}.search-shortcut span{display:block;line-height:15px}.search-shortcut .icon{width:15px;height:15px;min-width:15px;max-width:15px;stroke-width:2.2}.search-button:hover .search-shortcut{background:transparent;border-color:transparent;color:var(--ink)} +${designSystemCss} +:root{--bg:var(--oc-bg-page);--paper:var(--oc-bg-surface);--paper-2:var(--oc-bg-elevated);--ink:var(--oc-text-primary);--text:var(--oc-text-secondary);--muted:var(--oc-text-muted);--line:var(--oc-border-subtle);--line-strong:color-mix(in srgb,var(--oc-text-primary) 18%,var(--oc-border-subtle));--soft:var(--oc-surface-accent-soft);--brand:var(--oc-accent-primary);--brand-2:var(--oc-accent-primary-deep);--accent-2:var(--oc-accent-secondary);--on-brand:var(--oc-text-on-accent);--code:#141416;--code-inline:#232328;--code-block:#0e0e10;--code-text:#e9e9ee;--code-border:#2a2a30;--code-shadow:var(--oc-shadow-lg);--tok-comment:#7e7e88;--tok-command:#ff8f78;--tok-option:#79c0ff;--tok-string:#8fd4bd;--tok-literal:#d2a8ff;--tok-key:#f2a37c;--tok-number:#79c0ff;--tok-punct:#8b949e;--shadow:var(--oc-shadow-lg);--tooltip-bg:var(--oc-text-primary);--tooltip-text:var(--oc-bg-page);--tooltip-border:var(--oc-text-primary);--sticky-header-h:121px;color-scheme:dark} +:root[data-theme="light"]{--paper:var(--oc-bg-elevated);--paper-2:color-mix(in srgb,var(--oc-bg-surface) 60%,var(--oc-bg-page));--code:#f2f0ec;--code-inline:#ecebe6;--code-block:#fffefc;--code-text:#26262c;--code-border:#dbd8d1;--code-shadow:none;--tok-comment:#6d6d77;--tok-command:#bb3f28;--tok-option:#2365a8;--tok-string:#0f6355;--tok-literal:#7b3fb4;--tok-key:#a63c22;--tok-number:#1a5fb4;--tok-punct:#75707a;color-scheme:light} +.oc-table-wrap{max-width:100%;overflow:auto;margin:22px 0 28px;border:1px solid var(--line-strong);border-radius:var(--oc-radius-surface);background:color-mix(in srgb,var(--paper) 72%,transparent)}.doc .oc-table{margin:0;width:100%;min-width:560px;border-collapse:separate;border-spacing:0;font-size:var(--oc-font-size-sm)}.doc .oc-table th,.doc .oc-table td{border:0;border-bottom:1px solid var(--line);padding:10px var(--oc-space-3);text-align:left;vertical-align:top;overflow-wrap:anywhere;word-break:break-word}.doc .oc-table th{position:sticky;top:0;background:color-mix(in srgb,var(--paper-2) 86%,var(--soft) 14%);color:var(--ink);font:780 var(--oc-font-size-xs)/1.35 var(--oc-font-body)}.doc .oc-table tr:last-child td{border-bottom:0}.doc .oc-table td:first-child{color:var(--ink);font-weight:720}.oc-lead{margin:18px 0 28px;color:var(--text);font:500 var(--oc-font-size-lg)/1.72 var(--oc-font-body)}.oc-lead p{margin:0}.oc-pullquote{margin:30px 0;padding:3px 0 3px var(--oc-space-5);border-left:3px solid var(--brand);color:var(--ink)}.oc-pullquote blockquote{margin:0;padding:0;border:0;font:400 21px/1.55 var(--oc-font-serif);font-style:italic}.oc-pullquote figcaption{margin-top:10px;color:var(--muted);font-size:var(--oc-font-size-xs)}.oc-stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(170px,100%),1fr));gap:var(--oc-space-3);margin:var(--oc-space-5) 0}.oc-stat{border:1px solid var(--line-strong);border-radius:var(--oc-radius-surface);background:color-mix(in srgb,var(--paper) 72%,transparent);padding:15px var(--oc-space-4)}.oc-stat strong{display:block;color:var(--ink);font:780 var(--oc-font-size-2xl)/1 var(--oc-font-body);margin:0 0 var(--oc-space-2)}.oc-stat>span{display:block;color:var(--muted);font-size:var(--oc-font-size-xs);line-height:1.35}.oc-stat-delta{display:inline-block!important;width:max-content;margin-top:10px;padding:2px 7px;border:1px solid color-mix(in srgb,var(--brand) 35%,var(--line-strong));border-radius:var(--oc-radius-control);background:color-mix(in srgb,var(--brand) 10%,var(--paper));color:var(--brand)!important}.oc-stat div p{margin:.8em 0 0}.oc-cta{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:18px;align-items:end;margin:var(--oc-space-6) 0;padding:22px;border:1px solid color-mix(in srgb,var(--brand) 34%,var(--line-strong));border-radius:var(--oc-radius-surface);background:linear-gradient(135deg,color-mix(in srgb,var(--paper) 82%,var(--brand) 18%),color-mix(in srgb,var(--paper-2) 92%,transparent));box-shadow:var(--shadow)}.oc-cta-copy>span{display:block;color:var(--brand);font:780 var(--oc-font-size-xs)/1.2 var(--oc-font-body);margin:0 0 7px}.oc-cta-copy strong{display:block;color:var(--ink);font:780 19px/1.28 var(--oc-font-body);margin:0 0 var(--oc-space-2)}.oc-cta-copy p{margin:0;color:var(--text)}.oc-cta-actions{display:flex;flex-wrap:wrap;gap:9px;align-items:center}.oc-cta-link{display:inline-flex;align-items:center;justify-content:center;min-height:38px;padding:10px 20px;border:1px solid var(--line-strong);border-radius:var(--oc-radius-control);font:600 var(--oc-font-size-sm)/1 var(--oc-font-mono);transition:background var(--oc-duration-fast) var(--oc-ease-out),border-color var(--oc-duration-fast) var(--oc-ease-out),color var(--oc-duration-fast) var(--oc-ease-out),filter var(--oc-duration-fast) var(--oc-ease-out)}.oc-cta-link-primary{background:var(--brand);border-color:var(--brand);color:var(--on-brand)}.oc-cta-link-secondary{background:color-mix(in srgb,var(--paper) 78%,transparent);color:var(--ink)}.oc-cta-link:after{content:"→";margin-left:var(--oc-space-2)}.oc-cta-link:hover{filter:brightness(1.04)}.oc-cta-link-primary:hover{background:var(--oc-accent-primary-hover);border-color:var(--oc-accent-primary-hover);color:var(--on-brand)}.oc-cta-link-secondary:hover{background:color-mix(in srgb,var(--soft) 62%,var(--paper) 38%);border-color:color-mix(in srgb,var(--brand) 44%,var(--line-strong));color:var(--ink)}.oc-cta-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(230px,100%),1fr));gap:14px;margin:var(--oc-space-5) 0}.oc-cta-card{display:block;min-height:160px;border:1px solid var(--line-strong);border-radius:var(--oc-radius-surface);background:color-mix(in srgb,var(--paper) 78%,transparent);padding:18px 20px;color:var(--text);transition:border-color var(--oc-duration-fast) var(--oc-ease-out),background var(--oc-duration-fast) var(--oc-ease-out)}.oc-cta-card:hover,.oc-cta-card:focus-visible{border-color:var(--brand);background:color-mix(in srgb,var(--soft) 38%,transparent);outline:0}.oc-cta-card .oc-card-icon{margin-bottom:14px}.oc-cta-card strong{display:block;color:var(--ink);font:760 16px/1.3 var(--oc-font-body);margin:0 0 var(--oc-space-1)}.oc-cta-kicker{display:block;color:var(--brand);font:760 var(--oc-font-size-xs)/1.35 var(--oc-font-body);margin:0 0 9px}.oc-cta-card p{margin:0 0 14px;color:var(--muted)}.oc-cta-card .oc-cta-actions{margin-top:var(--oc-space-4)}.oc-chart{margin:28px 0;padding:var(--oc-space-4);border:1px solid var(--line-strong);border-radius:var(--oc-radius-surface);background:color-mix(in srgb,var(--paper) 76%,transparent)}.oc-chart figcaption{display:flex;align-items:baseline;justify-content:space-between;gap:14px;margin:0 0 var(--oc-space-4)}.oc-chart figcaption strong{color:var(--ink);font:780 var(--oc-font-size-md)/1.25 var(--oc-font-body)}.oc-chart figcaption span{color:var(--muted);font-size:var(--oc-font-size-xs)}.oc-chart-bars{display:grid;gap:10px}.oc-chart-row{display:grid;grid-template-columns:minmax(86px,150px) minmax(120px,1fr) auto;gap:10px;align-items:center}.oc-chart-row>span{color:var(--text);font-size:var(--oc-font-size-xs);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.oc-chart-row strong{color:var(--ink);font:760 var(--oc-font-size-xs)/1 var(--oc-font-body)}.oc-chart-track{height:10px;border-radius:var(--oc-radius-inset);background:color-mix(in srgb,var(--line-strong) 62%,transparent);overflow:hidden}.oc-chart-track i{display:block;width:var(--oc-chart-value);height:100%;border-radius:inherit;background:linear-gradient(90deg,var(--brand-2),var(--brand))}.oc-chart-line-wrap{display:grid;gap:10px}.oc-chart-line-svg{display:block;width:100%;height:auto;overflow:visible}.oc-chart-line-svg polyline{fill:none;stroke:var(--brand);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}.oc-chart-line-svg circle{fill:var(--paper);stroke:var(--brand);stroke-width:3}.oc-chart-gridline{stroke:var(--line-strong);stroke-width:1}.oc-chart-axis{display:flex;justify-content:space-between;gap:var(--oc-space-2);color:var(--muted);font-size:11px}.oc-chart-axis span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.oc-chart-data{position:absolute!important;width:1px!important;height:1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important}@media(max-width:820px){.oc-cta{grid-template-columns:1fr}.oc-chart-row{grid-template-columns:minmax(74px,110px) minmax(90px,1fr) auto}.doc .oc-table{min-width:0;table-layout:fixed}} +*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:120px}body{margin:0;display:flex;flex-direction:column;min-height:100vh;background:var(--bg);color:var(--text);font:var(--oc-font-size-md)/1.7 var(--oc-font-body);-webkit-font-smoothing:antialiased}::selection{background:var(--brand);color:var(--on-brand)}a{color:inherit;text-decoration:none}a:hover{color:var(--ink)}img{max-width:100%;height:auto}button,input,select{font:inherit}.hidden{display:none!important}.oc-visually-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}:root[data-theme="dark"] .dark\\:hidden{display:none!important}:root[data-theme="dark"] .dark\\:block{display:block!important}:root[data-theme="light"] .dark\\:block{display:none!important} +.site-header{position:sticky;top:0;z-index:70;background:color-mix(in srgb,var(--bg) 94%,transparent);backdrop-filter:blur(18px);border-bottom:1px solid var(--line)}.header-row,.tabs{max-width:1780px;margin:0 auto}.doc-shell{width:100%;max-width:1780px;margin:0 auto;flex:1 0 auto}.header-row{height:62px;display:grid;grid-template-columns:minmax(0,1fr) minmax(300px,430px) minmax(0,1fr);gap:var(--oc-space-5);align-items:center;padding:0 56px}.header-left{display:flex;align-items:center;gap:var(--oc-space-4);min-width:0}.brand{display:inline-flex;align-items:center;gap:9px;flex:0 0 auto;color:var(--ink);font-weight:600;font-size:14.5px;letter-spacing:.02em}.brand img{width:22px;height:22px}.brand-name{color:var(--ink)}.brand-tag{color:var(--muted);font:600 10px/1 var(--oc-font-mono);letter-spacing:.08em;text-transform:uppercase;border:1px solid var(--line-strong);padding:3px 6px;margin-left:2px}.language-picker{position:relative;min-width:0}.language-native{display:none}.language-trigger{height:36px;border:1px solid transparent;border-radius:var(--oc-radius-control);background:color-mix(in srgb,var(--paper) 62%,transparent);color:var(--ink);display:flex;align-items:center;gap:9px;max-width:190px;padding:0 var(--oc-space-3) 0 11px;cursor:pointer;transition:background var(--oc-duration-fast) var(--oc-ease-out),border-color var(--oc-duration-fast) var(--oc-ease-out),box-shadow var(--oc-duration-fast) var(--oc-ease-out),color var(--oc-duration-fast) var(--oc-ease-out)}.language-trigger:hover,.language-picker.open .language-trigger{background:var(--paper);border-color:var(--line-strong);color:var(--ink)}.language-trigger:focus-visible{outline:0;border-color:var(--brand);box-shadow:0 0 0 3px var(--oc-focus-ring),var(--oc-shadow-md)}.language-trigger:hover .language-chevron{color:var(--brand)}.locale-flag{width:21px;height:21px;border-radius:var(--oc-radius-round);display:inline-grid;place-items:center;font-size:var(--oc-font-size-lg);line-height:1;overflow:hidden;flex:0 0 auto}.language-current{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--oc-font-size-base);color:var(--ink)}.language-chevron{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;color:var(--muted);line-height:1;transition:transform var(--oc-duration-fast) var(--oc-ease-out),color var(--oc-duration-fast) var(--oc-ease-out)}.language-chevron .icon{width:16px;height:16px}.language-picker.open .language-chevron{transform:rotate(180deg);color:var(--brand)}.language-menu{position:absolute;top:calc(100% + 10px);left:auto;right:0;width:min(340px,calc(100vw - 32px));max-height:min(72vh,720px);overflow:auto;display:none;z-index:80;padding:10px;background:color-mix(in srgb,var(--bg) 92%,var(--oc-bg-page) 8%);border:1px solid var(--line-strong);border-radius:var(--oc-radius-surface);box-shadow:var(--oc-shadow-lg)}.language-picker.open .language-menu{display:block}.language-option{display:grid;grid-template-columns:30px minmax(0,1fr) 22px;align-items:center;gap:var(--oc-space-3);padding:var(--oc-space-3) var(--oc-space-4);border-radius:var(--oc-radius-control);color:var(--ink);font-weight:800;font-size:18px;line-height:1.2}.language-option:hover{background:color-mix(in srgb,var(--paper-2) 84%,transparent);color:var(--ink)}.language-option.active{color:var(--brand)}.language-option.active:hover{background:color-mix(in srgb,var(--soft) 84%,transparent)}.language-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.language-check{opacity:0;color:var(--brand);font-size:19px;text-align:right}.language-option.active .language-check{opacity:1}.icon{display:block;width:18px;height:18px;min-width:18px;max-width:18px;flex:0 0 18px}.search-button{height:38px;border:1px solid var(--line-strong);border-radius:var(--oc-radius-control);background:color-mix(in srgb,var(--paper) 86%,transparent);color:var(--muted);display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;padding:0 9px 0 14px;cursor:pointer;text-align:left}.search-button:hover{background:var(--paper);border-color:var(--line-strong);color:var(--text)}.search-button:hover .search-shortcut{border-color:var(--line-strong);color:var(--ink);background:var(--paper-2)}.search-label{min-width:0;font-size:var(--oc-font-size-base);color:var(--muted)}.search-shortcut{display:inline-grid;place-items:center;justify-self:end;min-width:44px;height:28px;padding:0 9px;border:1px solid var(--line-strong);border-radius:var(--oc-radius-control);background:color-mix(in srgb,var(--paper-2) 82%,transparent);color:var(--text);font:760 var(--oc-font-size-sm)/1 var(--oc-font-mono)}.header-links{display:flex;align-items:center;justify-content:flex-end;gap:22px;color:var(--muted);font-size:var(--oc-font-size-base);white-space:nowrap}.header-links>a{display:inline-flex;align-items:center;gap:7px;color:var(--muted);font-weight:650}.header-links>a:hover{color:var(--ink)}.header-links>a .icon{width:16px;height:16px;color:var(--ink)}.header-links .top-icon-link{padding:2px}.header-links .top-icon-link .icon{width:18px;height:18px;min-width:18px;max-width:18px;color:currentColor}.header-links button{border:0;background:transparent;color:var(--muted);cursor:pointer;padding:var(--oc-space-1)}.header-links button:hover{color:var(--ink)}.theme-toggle{display:inline-grid;place-items:center;width:28px;height:28px}.theme-toggle .icon{width:18px;height:18px}.nav-toggle{display:none;flex-direction:column;gap:var(--oc-space-1);border:0;background:none;color:var(--muted);cursor:pointer;padding:5px 2px;transition:color var(--oc-duration-fast) var(--oc-ease-out)}.nav-toggle:hover{color:var(--ink)}.nav-toggle span{display:block;width:18px;height:1.6px;background:currentColor;border-radius:var(--oc-radius-inset);transition:transform var(--oc-duration-ui) var(--oc-ease-out),opacity var(--oc-duration-ui) var(--oc-ease-out)}body.nav-open .nav-toggle span:nth-child(1){transform:translateY(5.6px) rotate(45deg)}body.nav-open .nav-toggle span:nth-child(2){opacity:0}body.nav-open .nav-toggle span:nth-child(3){transform:translateY(-5.6px) rotate(-45deg)}.sidebar-close{display:none} +.search-shortcut{display:inline-flex;align-items:center;justify-content:flex-end;gap:2px;color:var(--muted);font:760 var(--oc-font-size-md)/1 var(--oc-font-mono);background:transparent;border:0;border-radius:var(--oc-radius-control);box-shadow:none;min-width:0;height:15px;padding:0}.search-shortcut span{display:block;line-height:15px}.search-shortcut .icon{width:15px;height:15px;min-width:15px;max-width:15px;stroke-width:2.2}.search-button:hover .search-shortcut{background:transparent;border-color:transparent;color:var(--ink)} .theme-toggle-icon{display:none;place-items:center}:root[data-theme="dark"] .theme-toggle-icon-dark,:root[data-theme="light"] .theme-toggle-icon-light{display:grid} -.tabs{position:relative;display:flex;align-items:center;gap:32px;min-height:58px;padding:0 56px;overflow-x:auto;white-space:nowrap}.tab-link{position:relative;color:var(--muted);font:700 13px/1.4 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;padding:19px 0 20px;transition:color .18s ease}.tab-link:hover{color:var(--ink)}.tab-link.active{color:var(--ink)}.tab-underline{position:absolute;left:0;bottom:0;height:2px;width:var(--tu-w,0);transform:translate3d(var(--tu-x,0),0,0);background:var(--brand);border-radius:2px;pointer-events:none;opacity:0;will-change:transform,width;transition:transform .28s cubic-bezier(.4,0,.2,1),width .28s cubic-bezier(.4,0,.2,1),opacity .18s ease}.tabs.is-ready .tab-underline{opacity:1}.tab-underline.no-transition{transition:none}@media(prefers-reduced-motion:reduce){.tab-underline{transition:opacity .18s ease}} -.doc-shell{display:grid;grid-template-columns:340px minmax(0,1fr);gap:72px;padding:38px 56px 90px}.sidebar{position:sticky;top:148px;align-self:start;max-height:calc(100vh - 172px);overflow:auto;padding:0 6px 64px 0;scrollbar-gutter:stable;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--muted) 42%,transparent) transparent}.sidebar::-webkit-scrollbar{width:8px}.sidebar::-webkit-scrollbar-track{background:transparent}.sidebar::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--muted) 34%,transparent);background-clip:content-box;border:2px solid transparent;border-radius:999px}.sidebar:hover::-webkit-scrollbar-thumb{background-color:color-mix(in srgb,var(--muted) 56%,transparent)}.sidebar.has-overflow{--sidebar-fade-top:0px;--sidebar-fade-bottom:0px;mask-image:linear-gradient(to bottom,transparent 0,#000 var(--sidebar-fade-top),#000 calc(100% - var(--sidebar-fade-bottom)),transparent 100%);-webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 var(--sidebar-fade-top),#000 calc(100% - var(--sidebar-fade-bottom)),transparent 100%)}.sidebar.can-scroll-up{--sidebar-fade-top:18px}.sidebar.can-scroll-down{--sidebar-fade-bottom:30px}.nav-section{margin:0 0 33px}.nav-section h2{font:750 11px/1.2 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;color:var(--muted);letter-spacing:.09em;text-transform:uppercase;margin:0 0 14px}.nav-link{display:block;color:var(--muted);border-left:2px solid transparent;padding:7px 14px;margin:2px 0;font-size:14px;line-height:1.48}.nav-link:hover{color:var(--ink);background:color-mix(in srgb,var(--paper) 68%,transparent)}.nav-link.active{border-left-color:var(--brand);color:var(--brand);font-weight:650}.nav-nested{padding-left:10px;border-left:1px solid var(--line);margin:9px 0 0 6px}.nav-nested h2{font-size:12px;color:var(--muted);margin:0 0 5px;text-transform:none} -.main{min-width:0;display:grid;grid-template-columns:minmax(0,760px) 250px;gap:76px;align-items:start}.article{min-width:0}.article-header{margin:0 0 36px}.article-kicker{color:var(--brand);font:780 12px/1.35 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;letter-spacing:.09em;text-transform:uppercase;margin:0 0 10px}.article h1{font:700 clamp(34px,3.8vw,44px)/1.08 Switzer,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;letter-spacing:-.02em;color:var(--ink);margin:0}.doc{font-size:15px}.doc>h1:first-child{display:none}.doc h2{font:750 24px/1.22 Switzer,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;letter-spacing:-.015em;color:var(--ink);margin:3.0em 0 .65em}.doc h3{font:700 17px/1.28 Switzer,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:var(--ink);margin:1.8em 0 .45em}.doc h4{font:700 14px/1.35 Switzer,ui-sans-serif,system-ui,sans-serif;color:var(--ink);margin:1.4em 0 .35em}.doc [tabindex="-1"]:focus{outline:0}.doc p,.doc ul,.doc ol,.doc blockquote,.doc table{margin-top:0;margin-bottom:1.12em}.doc ul,.doc ol{padding-left:1.35rem}.doc li{margin:.24em 0}.doc strong{color:var(--ink);font-weight:800}.doc :where(p,li,td,blockquote) a:not([class]){color:var(--brand);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px}.doc :where(p,li,td,blockquote) a:not([class]):hover{color:var(--ink)}.doc :where(p,li,td,blockquote){overflow-wrap:anywhere;word-break:break-word}.doc code{background:var(--code-inline);border:1px solid var(--code-border);border-radius:0;padding:.08em .36em;font-size:.86em;color:var(--code-text);box-decoration-break:clone}.doc kbd{display:inline-grid;place-items:center;min-width:1.65em;height:1.65em;margin:0 .08em;border:1px solid var(--line-strong);border-bottom-width:2px;border-radius:0;background:var(--paper);color:var(--ink);font:760 .78em/1 ui-monospace,SFMono-Regular,Menlo,monospace}.doc pre{position:relative;overflow:auto;background:var(--code-block);color:var(--code-text);border-radius:0;padding:12px 14px;border:1px solid var(--code-border);box-shadow:var(--code-shadow)}.doc pre code{background:transparent;border:0;color:inherit;padding:0}.doc pre .tok-comment,.doc pre .hljs-comment,.doc pre .hljs-quote{color:var(--tok-comment)}.doc pre .tok-command,.doc pre .hljs-title,.doc pre .hljs-section,.doc pre .hljs-selector-tag{color:var(--tok-command);font-weight:750}.doc pre .tok-option,.doc pre .tok-keyword,.doc pre .hljs-keyword,.doc pre .hljs-built_in,.doc pre .hljs-type{color:var(--tok-option)}.doc pre .tok-string,.doc pre .hljs-string,.doc pre .hljs-regexp{color:var(--tok-string)}.doc pre .tok-var,.doc pre .tok-literal,.doc pre .hljs-variable,.doc pre .hljs-template-variable,.doc pre .hljs-symbol{color:var(--tok-literal)}.doc pre .tok-key,.doc pre .hljs-attr,.doc pre .hljs-attribute,.doc pre .hljs-name{color:var(--tok-key)}.doc pre .tok-number,.doc pre .hljs-number,.doc pre .hljs-literal{color:var(--tok-number)}.doc pre .tok-punct,.doc pre .hljs-punctuation,.doc pre .hljs-meta{color:var(--tok-punct)}.doc pre .hljs-deletion{color:#fca5a5}.doc pre .hljs-addition{color:#7dd3a8}.doc blockquote{border-left:3px solid var(--line-strong);padding-left:24px;color:var(--text);font-family:Sentient,Georgia,serif;font-style:italic}.doc table{width:100%;border-collapse:collapse;font-size:13px}.doc th,.doc td{border-bottom:1px solid var(--line);padding:9px;text-align:left;vertical-align:top}.doc th{color:var(--ink);background:var(--paper);font-weight:760}.doc p[align="center"]{text-align:center}.doc p[align="center"] img{margin:0 auto}.heading-anchor{position:relative;display:inline-grid;place-items:center;width:24px;height:24px;margin-left:7px;padding:0;border:1px solid transparent;border-radius:0;background:transparent;color:var(--muted);vertical-align:-1px;opacity:0;cursor:pointer;transition:opacity .15s ease,background .15s ease,border-color .15s ease,color .15s ease}.doc :is(h1,h2,h3,h4,h5,h6):hover .heading-anchor,.heading-anchor:focus-visible,.heading-anchor[data-copy-state]{opacity:1}.heading-anchor:hover,.heading-anchor:focus-visible{border-color:color-mix(in srgb,var(--brand) 34%,var(--line-strong));background:color-mix(in srgb,var(--soft) 46%,transparent);color:var(--ink);outline:0}.heading-anchor[data-copy-state="copied"]{color:var(--brand)}.heading-anchor[data-copy-state="failed"]{color:#fca5a5}.heading-anchor .heading-anchor-icon{grid-area:1/1;display:block;width:15px;height:15px;stroke-width:2.15}.heading-anchor .heading-anchor-check{display:none}.heading-anchor[data-copy-state="copied"] .heading-anchor-link,.heading-anchor[data-copy-state="failed"] .heading-anchor-link{display:none}.heading-anchor[data-copy-state="copied"] .heading-anchor-check{display:block}.heading-anchor[data-copy-state="failed"]:after{content:"!";grid-area:1/1;font:900 13px/1 Switzer,ui-sans-serif,system-ui,sans-serif} +.tabs{position:relative;display:flex;align-items:center;gap:var(--oc-space-6);min-height:58px;padding:0 56px;overflow-x:auto;white-space:nowrap}.tab-link{position:relative;color:var(--muted);font:700 var(--oc-font-size-sm)/1.4 var(--oc-font-mono);padding:19px 0 20px;transition:color var(--oc-duration-fast) var(--oc-ease-out)}.tab-link:hover{color:var(--ink)}.tab-link.active{color:var(--ink)}.tab-underline{position:absolute;left:0;bottom:0;height:2px;width:var(--tu-w,0);transform:translate3d(var(--tu-x,0),0,0);background:var(--brand);border-radius:var(--oc-radius-control);pointer-events:none;opacity:0;will-change:transform,width;transition:transform var(--oc-duration-ui) var(--oc-ease-out),width var(--oc-duration-ui) var(--oc-ease-out),opacity var(--oc-duration-fast) var(--oc-ease-out)}.tabs.is-ready .tab-underline{opacity:1}.tab-underline.no-transition{transition:none}@media(prefers-reduced-motion:reduce){.tab-underline{transition:opacity var(--oc-duration-fast) var(--oc-ease-out)}} +.doc-shell{display:grid;grid-template-columns:340px minmax(0,1fr);gap:72px;padding:38px 56px 90px}.sidebar{position:sticky;top:148px;align-self:start;max-height:calc(100vh - 172px);overflow:auto;padding:0 6px var(--oc-space-8) 0;scrollbar-gutter:stable;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--muted) 42%,transparent) transparent}.sidebar::-webkit-scrollbar{width:8px}.sidebar::-webkit-scrollbar-track{background:transparent}.sidebar::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--muted) 34%,transparent);background-clip:content-box;border:2px solid transparent;border-radius:var(--oc-radius-round)}.sidebar:hover::-webkit-scrollbar-thumb{background-color:color-mix(in srgb,var(--muted) 56%,transparent)}.sidebar.has-overflow{--sidebar-fade-top:0px;--sidebar-fade-bottom:0px;mask-image:linear-gradient(to bottom,transparent 0,#000 var(--sidebar-fade-top),#000 calc(100% - var(--sidebar-fade-bottom)),transparent 100%);-webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 var(--sidebar-fade-top),#000 calc(100% - var(--sidebar-fade-bottom)),transparent 100%)}.sidebar.can-scroll-up{--sidebar-fade-top:18px}.sidebar.can-scroll-down{--sidebar-fade-bottom:30px}.nav-section{margin:0 0 33px}.nav-section h2{font:750 11px/1.2 var(--oc-font-mono);color:var(--muted);letter-spacing:.09em;text-transform:uppercase;margin:0 0 14px}.nav-link{display:block;color:var(--muted);border-left:2px solid transparent;padding:7px 14px;margin:2px 0;font-size:var(--oc-font-size-base);line-height:1.48}.nav-link:hover{color:var(--ink);background:color-mix(in srgb,var(--paper) 68%,transparent)}.nav-link.active{border-left-color:var(--brand);color:var(--brand);font-weight:650}.nav-nested{padding-left:10px;border-left:1px solid var(--line);margin:9px 0 0 6px}.nav-nested h2{font-size:var(--oc-font-size-xs);color:var(--muted);margin:0 0 5px;text-transform:none} +.main{min-width:0;display:grid;grid-template-columns:minmax(0,760px) 250px;gap:76px;align-items:start}.article{min-width:0}.article-header{margin:0 0 36px}.article-kicker{color:var(--brand);font:780 var(--oc-font-size-xs)/1.35 var(--oc-font-mono);letter-spacing:.09em;text-transform:uppercase;margin:0 0 10px}.article h1{font:700 clamp(34px,3.8vw,44px)/1.08 var(--oc-font-display);letter-spacing:-.02em;color:var(--ink);margin:0}.doc{font-size:var(--oc-font-size-md)}.doc>h1:first-child{display:none}.doc h2{font:750 var(--oc-font-size-2xl)/1.22 var(--oc-font-body);letter-spacing:-.015em;color:var(--ink);margin:3.0em 0 .65em}.doc h3{font:700 var(--oc-font-size-lg)/1.28 var(--oc-font-body);color:var(--ink);margin:1.8em 0 .45em}.doc h4{font:700 var(--oc-font-size-base)/1.35 var(--oc-font-body);color:var(--ink);margin:1.4em 0 .35em}.doc [tabindex="-1"]:focus{outline:0}.doc p,.doc ul,.doc ol,.doc blockquote,.doc table{margin-top:0;margin-bottom:1.12em}.doc ul,.doc ol{padding-left:1.35rem}.doc li{margin:.24em 0}.doc strong{color:var(--ink);font-weight:800}.doc :where(p,li,td,blockquote) a:not([class]){color:var(--brand);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px}.doc :where(p,li,td,blockquote) a:not([class]):hover{color:var(--ink)}.doc :where(p,li,td,blockquote){overflow-wrap:anywhere;word-break:break-word}.doc code{background:var(--code-inline);border:1px solid var(--code-border);border-radius:var(--oc-radius-inset);padding:.08em .36em;font-size:.86em;color:var(--code-text);box-decoration-break:clone}.doc kbd{display:inline-grid;place-items:center;min-width:1.65em;height:1.65em;margin:0 .08em;border:1px solid var(--line-strong);border-bottom-width:2px;border-radius:var(--oc-radius-control);background:var(--paper);color:var(--ink);font:760 .78em/1 var(--oc-font-mono)}.doc pre{position:relative;overflow:auto;background:var(--code-block);color:var(--code-text);border-radius:var(--oc-radius-inset);padding:var(--oc-space-3) 14px;border:1px solid var(--code-border);box-shadow:var(--code-shadow)}.doc pre code{background:transparent;border:0;color:inherit;padding:0}.doc pre .tok-comment,.doc pre .hljs-comment,.doc pre .hljs-quote{color:var(--tok-comment)}.doc pre .tok-command,.doc pre .hljs-title,.doc pre .hljs-section,.doc pre .hljs-selector-tag{color:var(--tok-command);font-weight:750}.doc pre .tok-option,.doc pre .tok-keyword,.doc pre .hljs-keyword,.doc pre .hljs-built_in,.doc pre .hljs-type{color:var(--tok-option)}.doc pre .tok-string,.doc pre .hljs-string,.doc pre .hljs-regexp{color:var(--tok-string)}.doc pre .tok-var,.doc pre .tok-literal,.doc pre .hljs-variable,.doc pre .hljs-template-variable,.doc pre .hljs-symbol{color:var(--tok-literal)}.doc pre .tok-key,.doc pre .hljs-attr,.doc pre .hljs-attribute,.doc pre .hljs-name{color:var(--tok-key)}.doc pre .tok-number,.doc pre .hljs-number,.doc pre .hljs-literal{color:var(--tok-number)}.doc pre .tok-punct,.doc pre .hljs-punctuation,.doc pre .hljs-meta{color:var(--tok-punct)}.doc pre .hljs-deletion{color:#fca5a5}.doc pre .hljs-addition{color:#7dd3a8}.doc blockquote{border-left:3px solid var(--line-strong);padding-left:24px;color:var(--text);font-family:var(--oc-font-serif);font-style:italic}.doc table{width:100%;border-collapse:collapse;font-size:var(--oc-font-size-sm)}.doc th,.doc td{border-bottom:1px solid var(--line);padding:9px;text-align:left;vertical-align:top}.doc th{color:var(--ink);background:var(--paper);font-weight:760}.doc p[align="center"]{text-align:center}.doc p[align="center"] img{margin:0 auto}.heading-anchor{position:relative;display:inline-grid;place-items:center;width:24px;height:24px;margin-left:7px;padding:0;border:1px solid transparent;border-radius:var(--oc-radius-control);background:transparent;color:var(--muted);vertical-align:-1px;opacity:0;cursor:pointer;transition:opacity var(--oc-duration-fast) var(--oc-ease-out),background var(--oc-duration-fast) var(--oc-ease-out),border-color var(--oc-duration-fast) var(--oc-ease-out),color var(--oc-duration-fast) var(--oc-ease-out)}.doc :is(h1,h2,h3,h4,h5,h6):hover .heading-anchor,.heading-anchor:focus-visible,.heading-anchor[data-copy-state]{opacity:1}.heading-anchor:hover,.heading-anchor:focus-visible{border-color:color-mix(in srgb,var(--brand) 34%,var(--line-strong));background:color-mix(in srgb,var(--soft) 46%,transparent);color:var(--ink);outline:0}.heading-anchor[data-copy-state="copied"]{color:var(--brand)}.heading-anchor[data-copy-state="failed"]{color:var(--oc-status-error-fg)}.heading-anchor .heading-anchor-icon{grid-area:1/1;display:block;width:15px;height:15px;stroke-width:2.15}.heading-anchor .heading-anchor-check{display:none}.heading-anchor[data-copy-state="copied"] .heading-anchor-link,.heading-anchor[data-copy-state="failed"] .heading-anchor-link{display:none}.heading-anchor[data-copy-state="copied"] .heading-anchor-check{display:block}.heading-anchor[data-copy-state="failed"]:after{content:"!";grid-area:1/1;font:900 var(--oc-font-size-sm)/1 var(--oc-font-body)} .doc code{overflow-wrap:anywhere;word-break:break-word}.doc pre{max-width:100%} -.toc{position:sticky;top:148px;align-self:start;max-height:calc(100vh - 172px);overflow:auto;color:var(--muted);font-size:14px}.toc h2{display:flex;align-items:center;gap:7px;font:700 11px/1.2 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;letter-spacing:.09em;text-transform:uppercase;color:var(--muted);margin:0 0 14px}.toc h2:before{content:"≡";font-size:14px;color:var(--text)}.toc summary{display:none}.toc a{display:block;color:var(--muted);line-height:1.42;padding:7px 0}.toc a:hover{color:var(--ink)}.toc a.active{color:var(--brand);font-weight:750}.toc-l3{padding-left:12px!important} -.oc-card-grid,.oc-card-group{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;margin:28px 0;padding:1px}.oc-card-grid.oc-card-cols-1{grid-template-columns:1fr}.oc-card-grid.oc-card-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.oc-card-grid.oc-card-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.oc-card{display:block;min-height:136px;background:var(--bg);box-shadow:0 0 0 1px var(--line-strong);padding:24px;color:var(--text);transition:background .16s ease}.oc-card:hover{background:var(--paper);color:var(--text)}.oc-card:focus-visible{background:var(--paper);color:var(--text);outline:2px solid var(--brand);outline-offset:-2px}.oc-card strong{display:block;color:var(--ink);font:750 16px/1.3 Switzer,ui-sans-serif,system-ui,sans-serif;margin:18px 0 8px}.oc-card p{margin:0;color:var(--muted);line-height:1.55}.oc-card-icon{display:block;width:24px;height:24px;color:var(--brand);stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.oc-card>.oc-card-icon,.oc-cta-card>.oc-card-icon{width:26px;height:26px} +.toc{position:sticky;top:148px;align-self:start;max-height:calc(100vh - 172px);overflow:auto;color:var(--muted);font-size:var(--oc-font-size-base)}.toc h2{display:flex;align-items:center;gap:7px;font:700 11px/1.2 var(--oc-font-mono);letter-spacing:.09em;text-transform:uppercase;color:var(--muted);margin:0 0 14px}.toc h2:before{content:"≡";font-size:var(--oc-font-size-base);color:var(--text)}.toc summary{display:none}.toc a{display:block;color:var(--muted);line-height:1.42;padding:7px 0}.toc a:hover{color:var(--ink)}.toc a.active{color:var(--brand);font-weight:750}.toc-l3{padding-left:12px!important} +.oc-card-grid,.oc-card-group{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;margin:28px 0;padding:1px}.oc-card-grid.oc-card-cols-1{grid-template-columns:1fr}.oc-card-grid.oc-card-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.oc-card-grid.oc-card-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.oc-card{display:block;min-height:136px;background:var(--bg);box-shadow:0 0 0 1px var(--line-strong);padding:var(--oc-space-5);color:var(--text);transition:background var(--oc-duration-fast) var(--oc-ease-out)}.oc-card:hover{background:var(--paper);color:var(--text)}.oc-card:focus-visible{background:var(--paper);color:var(--text);outline:2px solid var(--brand);outline-offset:-2px}.oc-card strong{display:block;color:var(--ink);font:750 16px/1.3 var(--oc-font-body);margin:18px 0 var(--oc-space-2)}.oc-card p{margin:0;color:var(--muted);line-height:1.55}.oc-card-icon{display:block;width:24px;height:24px;color:var(--brand);stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.oc-card>.oc-card-icon,.oc-cta-card>.oc-card-icon{width:26px;height:26px} .doc{container-type:inline-size}.oc-card-grid,.oc-card-group{--oc-card-columns:2;display:grid;grid-template-columns:repeat(var(--oc-card-columns),minmax(0,1fr));gap:1px;margin:28px 0;padding:1px}.oc-card-grid.oc-card-cols-1,.oc-card-group.oc-card-cols-1{--oc-card-columns:1}.oc-card-grid.oc-card-cols-2,.oc-card-group.oc-card-cols-2{--oc-card-columns:2}.oc-card-grid.oc-card-cols-3,.oc-card-group.oc-card-cols-3{--oc-card-columns:3}.oc-card-grid.oc-card-cols-4,.oc-card-group.oc-card-cols-4{--oc-card-columns:4}@container (max-width:720px){.oc-card-grid.oc-card-cols-4,.oc-card-group.oc-card-cols-4{--oc-card-columns:2}}@container (max-width:620px){.oc-card-grid.oc-card-cols-3,.oc-card-group.oc-card-cols-3{--oc-card-columns:2}}@container (max-width:520px){.oc-card-grid,.oc-card-group{--oc-card-columns:1}} .oc-card-grid.oc-card-cols-1,.oc-card-group.oc-card-cols-1,.oc-card-grid.oc-card-cols-2,.oc-card-group.oc-card-cols-2,.oc-card-grid.oc-card-cols-3,.oc-card-group.oc-card-cols-3,.oc-card-grid.oc-card-cols-4,.oc-card-group.oc-card-cols-4{grid-template-columns:repeat(var(--oc-card-columns),minmax(0,1fr))} -.oc-steps{counter-reset:step;list-style:none;padding-left:0!important;margin:28px 0 32px 24px}.oc-step{counter-increment:step;border-left:2px solid var(--line);padding:0 0 24px 34px;position:relative}.oc-step:last-child{padding-bottom:0;border-image:linear-gradient(to bottom,var(--line) 0%,color-mix(in srgb,var(--line) 52%,transparent) 44%,transparent 92%) 1}.oc-step:before{content:counter(step);position:absolute;left:-13px;top:0;width:24px;height:24px;border-radius:50%;background:color-mix(in srgb,var(--line-strong) 78%,var(--paper) 22%);color:var(--ink);box-shadow:inset 0 0 0 1px var(--line-strong);display:grid;place-items:center;font-size:12px;font-weight:800}.oc-step h3{margin-top:0}.oc-step>p:first-of-type{margin-top:.2em}.oc-step .oc-code{max-width:100%;margin:14px 0 18px}.oc-step .oc-code:last-child{margin-bottom:0}.oc-callout{--callout-accent:var(--brand);--callout-surface:color-mix(in srgb,var(--paper) 86%,var(--callout-accent) 14%);position:relative;border:1px solid color-mix(in srgb,var(--line-strong) 74%,var(--callout-accent) 26%);border-left:3px solid var(--callout-accent);background:var(--callout-surface);border-radius:0;padding:14px 16px 14px 42px;margin:20px 0;color:var(--text)}.oc-callout strong{display:block;color:var(--ink);font:760 14px/1.3 Switzer,ui-sans-serif,system-ui,sans-serif;margin:0 0 4px}.oc-callout strong:before{content:"i";position:absolute;left:15px;top:15px;width:17px;height:17px;border:1px solid var(--callout-accent);border-radius:50%;display:grid;place-items:center;color:var(--callout-accent);font:800 11px/1 Switzer,ui-sans-serif,system-ui,sans-serif}.oc-callout p:last-child,.oc-callout ul:last-child,.oc-callout ol:last-child{margin-bottom:0}.oc-callout-tip{--callout-accent:#48b49a}.oc-callout-tip strong:before{content:"?"}.oc-callout-info,.oc-callout-note{--callout-accent:#7aa7ff}.oc-callout-warning{--callout-accent:#d97706}.oc-callout-warning strong:before{content:"!"}.oc-callout-check{--callout-accent:#48b49a}.oc-callout-check strong:before{content:"✓"}.oc-callout-say{--callout-accent:#c084fc}.oc-callout-say strong:before{content:">"}.oc-code{margin:18px 0;border:1px solid var(--code-border);border-radius:0;background:var(--code-block);box-shadow:var(--code-shadow);overflow:hidden}.oc-code figcaption{display:flex;align-items:center;min-height:34px;padding:6px 8px 6px 12px;border-bottom:1px solid var(--code-border);background:color-mix(in srgb,var(--paper-2) 42%,transparent);color:var(--muted);font:760 12px/1 Switzer,ui-sans-serif,system-ui,sans-serif}.oc-code pre{margin:0;border:0;border-radius:0;box-shadow:none;background:transparent}.oc-tabs,.oc-code-group{border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 78%,transparent);border-radius:0;margin:20px 0 28px;overflow:hidden}.oc-code-tabs{display:flex;gap:2px;padding:6px 7px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--paper-2) 74%,transparent)}.oc-code-tab{border:0;border-radius:0;background:transparent;color:var(--muted);padding:6px 9px;font:760 12px/1 Switzer,ui-sans-serif,system-ui,sans-serif;cursor:pointer}.oc-code-tab:hover{color:var(--ink);background:color-mix(in srgb,var(--soft) 52%,transparent)}.oc-code-tab.active{color:var(--ink);background:var(--soft)}.oc-code-group .oc-code{display:none;margin:0;border:0;border-radius:0;box-shadow:none}.oc-code-group .oc-code.active{display:block}.oc-code-group .oc-code figcaption{display:none}.oc-tab{border-top:1px solid var(--line);padding:20px 24px}.oc-tab:first-child{border-top:0}.oc-tab h3{margin:0 0 12px;font-size:13px;color:var(--brand)}.oc-tab .oc-code{margin:0;max-width:100%}.oc-accordion-group{display:grid;gap:10px;margin:18px 0}.oc-accordion{border:1px solid var(--line-strong);background:var(--paper);border-radius:0;margin:0;padding:0 13px}.oc-accordion summary{cursor:pointer;color:var(--ink);font-weight:750;padding:12px 0}.oc-accordion summary::marker{color:var(--brand)}.oc-param,.oc-frame{border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 78%,transparent);border-radius:0;padding:13px 15px;margin:12px 0}.oc-frame{padding:10px}.oc-frame figcaption{padding:2px 4px 10px;color:var(--muted);font-size:12px}.oc-frame p{margin:0}.oc-frame img{display:block;margin:0 auto;border-radius:0}.oc-tooltip{position:relative;display:inline-flex;align-items:center;border-bottom:1px dotted color-mix(in srgb,var(--brand) 72%,var(--text));color:var(--ink);cursor:help}.oc-tooltip:focus{outline:2px solid color-mix(in srgb,var(--brand) 45%,transparent);outline-offset:3px;border-radius:0}.oc-tooltip[data-tip]:hover:after,.oc-tooltip[data-tip]:focus:after{content:attr(data-tip);position:absolute;left:50%;bottom:calc(100% + 8px);transform:translateX(-50%);z-index:20;width:max-content;max-width:min(320px,calc(100vw - 40px));padding:8px 10px;border:1px solid var(--tooltip-border);border-radius:0;background:var(--tooltip-bg);color:var(--tooltip-text);font:700 12px/1.35 Switzer,ui-sans-serif,system-ui,sans-serif;box-shadow:var(--shadow)}.oc-param header{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:8px}.oc-param header code{background:var(--code-inline);border-color:var(--code-border);color:var(--ink)}.oc-param-type,.oc-param-default,.oc-param-required{border:1px solid var(--line-strong);border-radius:2px;background:color-mix(in srgb,var(--soft) 70%,transparent);padding:1px 7px;font-size:12px;color:var(--muted)}.oc-param-type{color:var(--brand);border-color:color-mix(in srgb,var(--brand) 34%,var(--line-strong));background:color-mix(in srgb,var(--brand) 12%,var(--paper))}.oc-param-default{color:var(--text);background:color-mix(in srgb,var(--paper-2) 82%,transparent)}.oc-param-required{color:var(--brand);border-color:color-mix(in srgb,var(--brand) 42%,var(--line-strong));background:color-mix(in srgb,var(--brand) 10%,var(--paper))} -.breadcrumbs{display:flex;align-items:center;gap:8px;color:var(--muted);font:650 11.5px/1.4 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;margin:0 0 12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.breadcrumbs span{min-width:0;overflow:hidden;text-overflow:ellipsis}.breadcrumbs .breadcrumb-part{display:inline-flex;align-items:center;gap:8px;flex:0 1 auto}.breadcrumbs .breadcrumb-separator{flex:0 0 auto}.breadcrumbs [aria-current="page"]{color:var(--text)}.page-status{display:flex;flex-wrap:wrap;gap:7px;margin:13px 0 0}.page-status-badge{display:inline-flex;align-items:center;min-height:24px;max-width:100%;border:1px solid var(--line-strong);border-radius:2px;background:color-mix(in srgb,var(--paper) 76%,transparent);color:var(--muted);padding:4px 9px;font:760 12px/1.25 Switzer,ui-sans-serif,system-ui,sans-serif}.page-status-beta,.page-status-status{color:var(--brand);border-color:color-mix(in srgb,var(--brand) 38%,var(--line-strong));background:color-mix(in srgb,var(--soft) 68%,transparent)}.page-status-deprecated{color:#d97706;border-color:color-mix(in srgb,#d97706 42%,var(--line-strong))}.page-tools{display:flex;align-items:center;gap:8px;margin-top:16px}.page-tools a,.page-tools button,.page-feedback button,.oc-prompt button{border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 82%,transparent);color:var(--muted);border-radius:0;padding:6px 9px;font:760 12px/1 Switzer,ui-sans-serif,system-ui,sans-serif;cursor:pointer}.page-tools a:hover,.page-tools button:hover,.page-feedback button:hover,.oc-prompt button:hover{border-color:var(--brand);color:var(--ink)}.oc-code figcaption{justify-content:space-between;gap:12px}.oc-code figcaption .oc-code-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:uppercase;letter-spacing:.08em}.oc-code figcaption button{position:relative;display:grid;place-items:center;flex:0 0 32px;width:32px;height:30px;padding:0;border:1px solid transparent;background:transparent;color:var(--muted);border-radius:0;cursor:pointer}.oc-code figcaption button:before,.oc-code figcaption button:after{content:"";position:absolute;box-sizing:border-box;width:13px;height:13px;border:1.6px solid currentColor;border-radius:0;background:color-mix(in srgb,var(--paper-2) 42%,var(--code-block) 58%)}.oc-code figcaption button:before{left:7px;top:6px;opacity:.72}.oc-code figcaption button:after{left:11px;top:10px}.oc-code figcaption button:hover{border-color:color-mix(in srgb,var(--brand) 32%,var(--line-strong));background:color-mix(in srgb,var(--soft) 46%,transparent);color:var(--ink)}.oc-code figcaption button[data-copy-state="copied"]{color:var(--brand)}.oc-code figcaption button[data-copy-state="copied"]:before{content:"✓";position:static;width:auto;height:auto;border:0;background:transparent;font:900 14px/1 Switzer,ui-sans-serif,system-ui,sans-serif}.oc-code figcaption button[data-copy-state="copied"]:after,.oc-code figcaption button[data-copy-state="failed"]:after{content:none}.oc-code figcaption button[data-copy-state="failed"]{color:#fca5a5}.oc-code figcaption button[data-copy-state="failed"]:before{content:"!";position:static;width:auto;height:auto;border:0;background:transparent;font:900 14px/1 Switzer,ui-sans-serif,system-ui,sans-serif}.doc pre code{display:block;min-width:max-content}.doc .oc-code pre code{white-space:pre}.doc .code-line,.oc-code .code-line{display:block;min-height:1.5em;line-height:1.5;padding:0 2px;border-left:2px solid transparent;white-space:pre}.doc .code-line:before{content:attr(data-line);display:none;width:2.4em;margin-right:1em;color:var(--muted);text-align:right;user-select:none}.doc .has-line-numbers .code-line:before{display:inline-block}.doc .code-line.is-highlighted{background:color-mix(in srgb,var(--brand) 14%,transparent);border-left-color:var(--brand)}.doc .code-line.is-dimmed{opacity:.46}.doc .code-line.is-added{background:color-mix(in srgb,#48b49a 13%,transparent);border-left-color:#48b49a}.doc .code-line.is-removed{background:color-mix(in srgb,#d97706 12%,transparent);border-left-color:#d97706}.doc .oc-code.is-wrapped pre,.doc .oc-code.is-wrapped code{white-space:pre-wrap;min-width:0}.doc .oc-code.is-wrapped .code-line{white-space:pre-wrap}.doc .oc-code.is-expandable pre{max-height:360px}.oc-badge{display:inline-flex;align-items:center;min-height:1.55em;padding:0 .5em;border:1px solid var(--line-strong);border-radius:2px;background:var(--soft);color:var(--ink);font:760 .76em/1 Switzer,ui-sans-serif,system-ui,sans-serif;vertical-align:middle}.oc-badge-orange{color:var(--brand);border-color:color-mix(in srgb,var(--brand) 38%,var(--line-strong))}.oc-badge-green{color:#48b49a;border-color:color-mix(in srgb,#48b49a 38%,var(--line-strong))}.oc-panel,.oc-prompt,.oc-mermaid{border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 86%,transparent);border-radius:0;margin:18px 0;padding:16px}.oc-panel>strong{display:block;color:var(--ink);font:760 14px/1.3 Switzer,ui-sans-serif,system-ui,sans-serif;margin:0 0 8px}.oc-prompt header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px}.oc-prompt strong{color:var(--ink);font:760 14px/1.3 Switzer,ui-sans-serif,system-ui,sans-serif}.oc-prompt p:last-child,.oc-panel p:last-child{margin-bottom:0}.oc-tile-group{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));gap:10px;margin:18px 0}.oc-tile{display:flex;align-items:flex-start;gap:12px;border:1px solid var(--line-strong);border-radius:0;padding:14px;color:var(--text);background:transparent}.oc-tile:hover{border-color:var(--brand);background:color-mix(in srgb,var(--soft) 28%,transparent)}.oc-tile strong{display:block;color:var(--ink);font:750 14px/1.3 Switzer,ui-sans-serif,system-ui,sans-serif;margin:0 0 5px}.oc-tile p{margin:0;color:var(--muted);line-height:1.5}.oc-tile .oc-card-icon{flex:0 0 20px;width:20px;height:20px}.oc-mermaid{overflow:auto;display:grid;place-items:center;min-height:180px;padding:18px;color:var(--code-text);font:13px/1.65 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.oc-mermaid svg{display:block;max-width:100%;height:auto}.oc-mermaid pre{width:100%;margin:0}.oc-mermaid.is-rendered{background:color-mix(in srgb,var(--paper) 70%,transparent)}.oc-mermaid.is-error{display:block;place-items:normal;border-color:color-mix(in srgb,#d97706 42%,var(--line-strong))}.page-feedback{display:flex;align-items:center;gap:9px;border-top:1px solid var(--line);margin-top:42px;padding-top:18px;color:var(--muted);font-size:13px}.page-feedback output{color:var(--brand);font-weight:760}.page-nav{display:grid;grid-template-columns:1fr 1fr;gap:14px;border-top:1px solid var(--line);margin-top:24px;padding-top:18px}.page-nav a{border:1px solid var(--line-strong);background:var(--paper);border-radius:0;padding:13px;color:var(--text)}.page-nav a:hover{border-color:var(--brand)}.page-nav small{display:block;color:var(--muted);font-size:11px;text-transform:uppercase}.next{text-align:right} -.article-meta-row{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:0 0 12px}.article-meta-row .breadcrumbs{margin:0;min-width:0}.article-meta-row .page-tools{margin:0 0 0 auto}.page-actions{display:inline-flex;align-items:stretch;position:relative}.page-tools .page-actions-primary,.page-tools .page-actions-more summary{height:30px;min-height:30px;border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 82%,transparent);color:var(--muted);font:760 12px/1 Switzer,ui-sans-serif,system-ui,sans-serif;cursor:pointer}.page-tools .page-actions-primary{display:inline-flex;align-items:center;gap:7px;white-space:nowrap;border-right:1px solid var(--line-strong);border-radius:0;margin-right:-1px;padding:0 9px}.page-tools .page-actions-primary .icon{width:15px;height:15px;min-width:15px}.page-tools .page-actions-more{position:relative}.page-tools .page-actions-more summary{display:grid;place-items:center;width:34px;border-radius:0;padding:0;list-style:none}.page-tools .page-actions-more summary::-webkit-details-marker{display:none}.page-tools .page-actions-more summary::marker{content:""}.page-tools .page-actions-primary:hover,.page-tools .page-actions-more[open] summary,.page-tools .page-actions-more summary:hover{border-color:var(--brand);color:var(--ink)}.page-actions-chevron{display:grid;place-items:center;color:var(--muted)}.page-tools .page-actions-more summary .page-actions-chevron .icon{width:15px;height:15px;min-width:15px;transition:transform .16s ease}.page-tools .page-actions-more[open] .page-actions-chevron .icon{transform:rotate(180deg)}.page-tools .page-actions-more .page-actions-menu{position:absolute;top:calc(100% + 8px);left:auto;right:0;z-index:40;display:none;gap:4px;min-width:260px;padding:8px;border:1px solid var(--line-strong);border-radius:0;background:var(--paper);box-shadow:var(--shadow)}.page-tools .page-actions-more[open] .page-actions-menu{display:grid}.page-tools .page-action{display:grid;grid-template-columns:18px minmax(0,1fr) auto;align-items:center;gap:10px;width:100%;padding:9px;border:0;border-radius:0;background:transparent;color:var(--text);text-align:left;text-decoration:none;cursor:pointer}.page-tools .page-action:hover{background:var(--soft);color:var(--ink)}.page-tools .page-action .icon{width:17px;height:17px}.page-tools .page-action strong{display:block;color:var(--ink);font:760 12px/1.2 Switzer,ui-sans-serif,system-ui,sans-serif}.page-tools .page-action small{display:block;margin-top:3px;color:var(--muted);font:650 11px/1.25 Switzer,ui-sans-serif,system-ui,sans-serif}.page-tools .page-action-external{justify-self:end;color:var(--muted);font-size:12px}.page-feedback-links{display:flex;align-items:center;gap:9px;margin-left:auto}.page-feedback-links a{border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 82%,transparent);color:var(--muted);border-radius:0;padding:6px 9px;font:760 12px/1 Switzer,ui-sans-serif,system-ui,sans-serif}.page-feedback-links a:hover{border-color:var(--brand);color:var(--ink)}@media(max-width:620px){.page-feedback-links{flex-basis:100%;margin:3px 0 0}} -.doc .oc-code.is-expandable{position:relative}.doc .oc-code.is-expandable pre{max-height:360px;padding-bottom:44px}.doc .oc-code.is-expandable.is-expanded pre{max-height:none}.doc .oc-code.is-expandable:not(.is-expanded):after{content:"";position:absolute;left:0;right:0;bottom:39px;height:72px;background:linear-gradient(180deg,transparent,var(--code-block));pointer-events:none}.oc-code-expand{position:absolute;left:0;right:0;bottom:0;z-index:2;width:100%;min-height:40px;border:0;border-top:1px solid var(--code-border);background:color-mix(in srgb,var(--code-block) 88%,var(--paper-2) 12%);color:var(--brand);font:760 12px/1 Switzer,ui-sans-serif,system-ui,sans-serif;cursor:pointer}.oc-code-expand:hover,.oc-code-expand:focus-visible{color:var(--ink);background:color-mix(in srgb,var(--soft) 48%,var(--code-block));outline:0} -.search-modal{position:fixed;inset:0;background:rgba(0,0,0,.62);display:none;z-index:90;padding:clamp(12px,8vh,72px) 18px}.search-modal.open{display:block}.search-panel{display:grid;grid-template-rows:auto auto minmax(0,1fr) auto;width:min(820px,100%);max-height:min(640px,calc(100vh - 16vh));margin:0 auto;background:var(--paper);border:1px solid var(--line-strong);border-radius:0;box-shadow:var(--shadow);overflow:hidden}.search-head{position:relative;padding:12px;border-bottom:1px solid var(--line)}.search-head input{width:100%;border:1px solid var(--line-strong);border-radius:0;padding:12px 44px 12px 12px;background:var(--bg);color:var(--text);outline:0}.search-head input:focus{border-color:color-mix(in srgb,var(--brand) 42%,var(--line-strong));box-shadow:0 0 0 3px color-mix(in srgb,var(--brand) 16%,transparent)}.search-close{position:absolute;top:50%;right:22px;display:inline-grid;place-items:center;width:28px;height:28px;transform:translateY(-50%);border:0;background:transparent;color:var(--muted);border-radius:0;padding:0;cursor:pointer}.search-close:hover,.search-close:focus-visible{color:var(--ink);background:color-mix(in srgb,var(--paper-2) 72%,transparent);outline:0}.search-close .icon{width:17px;height:17px}.search-hints{grid-row:2;display:flex;flex-wrap:wrap;gap:8px;padding:10px 12px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--paper-2) 58%,transparent)}.search-modal.has-query .search-hints{display:none}.search-hints button{border:1px solid var(--line-strong);border-radius:2px;background:transparent;color:var(--muted);padding:6px 10px;font:730 12px/1 Switzer,ui-sans-serif,system-ui,sans-serif;cursor:pointer}.search-hints button:hover,.search-hints button:focus-visible{color:var(--ink);border-color:var(--brand);background:color-mix(in srgb,var(--soft) 42%,transparent);outline:0}.search-results{grid-row:3;position:relative;min-height:0;max-height:min(440px,calc(100vh - 260px));overflow:auto;padding:8px 12px 22px;scrollbar-color:color-mix(in srgb,var(--muted) 62%,transparent) transparent}.search-results:after{content:"";position:sticky;left:0;right:0;bottom:-22px;display:block;height:26px;margin:0 -12px -22px;pointer-events:none;background:linear-gradient(180deg,transparent,var(--paper) 82%)}.search-results::-webkit-scrollbar{width:10px}.search-results::-webkit-scrollbar-track{background:transparent}.search-results::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--muted) 58%,transparent);border:3px solid transparent;border-radius:999px;background-clip:content-box}.search-results.is-loading{cursor:progress;display:grid;place-items:center}.search-results.is-loading:after{display:none}.search-state{margin:0;padding:12px;color:var(--muted)}.search-loading{display:grid;place-items:center;gap:12px;padding:36px 0;color:var(--muted);font-weight:720}.search-empty{min-height:260px;display:grid;place-content:center;justify-items:center;gap:10px;padding:34px;color:var(--muted);text-align:center}.search-empty-icon{display:grid;place-items:center;width:42px;height:42px;margin:0 0 4px;border:1px solid color-mix(in srgb,var(--brand) 30%,var(--line-strong));border-radius:999px;background:color-mix(in srgb,var(--soft) 36%,transparent);color:color-mix(in srgb,var(--brand) 78%,var(--muted))}.search-empty-icon .icon{width:19px;height:19px;min-width:19px;max-width:19px;stroke-width:2.1}.search-empty strong{max-width:100%;overflow-wrap:anywhere;color:var(--ink);font:780 16px/1.35 Switzer,ui-sans-serif,system-ui,sans-serif}.search-empty p{max-width:420px;margin:0 auto;color:var(--text);font-size:13px}.search-empty-kbd{display:inline-flex;align-items:center;gap:2px;height:20px;margin:0 .18em;padding:0 6px;border:1px solid var(--line-strong);border-radius:0;background:color-mix(in srgb,var(--paper-2) 70%,transparent);color:var(--ink);vertical-align:-4px}.search-empty-kbd .icon{width:13px;height:13px;min-width:13px;max-width:13px;stroke-width:2.2}.search-spinner{display:inline-flex;width:42px;height:42px;flex:0 0 auto;align-items:center;justify-content:center;border:1px solid color-mix(in srgb,var(--brand) 36%,var(--line));border-radius:999px;background:radial-gradient(circle at 32% 28%,rgba(255,255,255,.18),transparent 28%),color-mix(in srgb,var(--paper-2) 82%,var(--brand) 18%);box-shadow:inset 0 0 0 1px rgba(255,255,255,.04),0 10px 32px color-mix(in srgb,var(--brand) 18%,transparent);transform-style:preserve-3d;animation:search-spinner-orbit 2.8s linear infinite}.search-spinner-emoji:before{content:"🦑";display:block;font-size:22px;line-height:1;transform:translateZ(8px);transform-style:preserve-3d;animation:search-spinner-emoji 2.8s steps(1,end) infinite,search-spinner-emoji-spin 2.8s linear infinite}.search-result{display:grid;grid-template-columns:minmax(0,1fr) 24px;grid-template-areas:"meta enter" "title enter" "snippet snippet";gap:5px 10px;border-bottom:1px solid var(--line);border-radius:0;padding:12px 14px;color:var(--text);outline:0}.search-result:hover,.search-result:focus-visible,.search-result.active{border-radius:0;background:color-mix(in srgb,var(--paper-2) 92%,transparent);color:var(--text)}.search-result.active{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--line-strong) 92%,transparent)}.search-result-meta{grid-area:meta;display:flex;min-width:0;gap:8px;align-items:center;color:var(--muted);font:700 12px/1 Switzer,ui-sans-serif,system-ui,sans-serif}.search-result-meta span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-meta span+span:before{content:"/";margin-right:8px;color:var(--muted)}.search-result strong{grid-area:title;display:block;min-width:0;color:var(--ink);font:780 15px/1.35 Switzer,ui-sans-serif,system-ui,sans-serif}.search-result p{grid-area:snippet;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin:.1em 0 0;color:var(--muted);font-size:13px}.search-result mark{border-radius:0;background:color-mix(in srgb,var(--brand) 28%,transparent);color:var(--ink);box-shadow:0 0 0 1px color-mix(in srgb,var(--brand) 22%,transparent);box-decoration-break:clone;-webkit-box-decoration-break:clone}.search-result-enter{grid-area:enter;align-self:center;justify-self:end;display:grid;place-items:center;width:24px;height:24px;color:var(--muted);opacity:0}.search-result-enter .icon{width:17px;height:17px;min-width:17px;max-width:17px;stroke-width:2.1}.search-result.active .search-result-enter,.search-result:hover .search-result-enter{opacity:1}.search-molty{grid-row:4;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;width:100%;border:0;border-top:1px solid var(--line);background:color-mix(in srgb,var(--paper-2) 60%,transparent);color:var(--text);padding:11px 14px;cursor:pointer;text-align:left}.search-molty:hover,.search-molty:focus-visible{background:color-mix(in srgb,var(--soft) 52%,var(--paper) 48%);outline:0}.search-molty img{width:28px;height:28px;border-radius:999px}.search-molty span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-molty [hidden]{display:none}.search-molty strong{color:var(--brand);font-weight:800;background:linear-gradient(90deg,var(--brand),color-mix(in srgb,var(--brand) 55%,white 45%),var(--brand));background-size:220% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:search-term-shimmer 1.7s ease-in-out infinite}.search-molty-shortcut{display:inline-flex;align-items:center;justify-content:flex-end;gap:2px;color:var(--muted);height:15px}.search-molty-shortcut .icon{width:15px;height:15px;min-width:15px;max-width:15px;stroke-width:2.2}.search-molty:hover .search-molty-shortcut,.search-molty:focus-visible .search-molty-shortcut{color:var(--ink)}@media(max-width:640px){.search-modal{padding:10px}.search-modal.open{display:grid;align-items:center}.search-panel{border-radius:0}.search-head{padding:9px}.search-head input{font-size:16px;line-height:1.35;padding:11px 40px 11px 11px}.search-close{right:16px}.search-hints{flex-wrap:nowrap;overflow-x:auto;gap:7px;padding:8px 9px}.search-hints button{flex:0 0 auto}.search-results{max-height:min(340px,calc(100vh - 230px));padding:7px 8px 20px}.search-results:after{margin:0 -8px -20px}.search-empty{min-height:220px;padding:22px 18px}.search-empty p{max-width:280px}.search-result{grid-template-columns:minmax(0,1fr);grid-template-areas:"meta" "title" "snippet";padding:11px 10px}.search-result-enter{display:none}.search-molty{gap:8px;padding:10px 11px}.search-molty img{width:24px;height:24px}.search-molty-shortcut{display:none}}@keyframes search-term-shimmer{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}@keyframes search-spinner-orbit{0%{transform:rotateY(0deg)}12.49%{transform:rotateY(89deg)}12.5%{transform:rotateY(90deg)}25%{transform:rotateY(180deg)}37.49%{transform:rotateY(269deg)}37.5%{transform:rotateY(270deg)}50%{transform:rotateY(360deg)}62.49%{transform:rotateY(449deg)}62.5%{transform:rotateY(450deg)}75%{transform:rotateY(540deg)}87.49%{transform:rotateY(629deg)}87.5%{transform:rotateY(630deg)}100%{transform:rotateY(720deg)}}@keyframes search-spinner-emoji-spin{0%{transform:translateZ(8px) rotateY(0deg)}12.49%{transform:translateZ(8px) rotateY(-89deg)}12.5%{transform:translateZ(8px) rotateY(-90deg)}25%{transform:translateZ(8px) rotateY(-180deg)}37.49%{transform:translateZ(8px) rotateY(-269deg)}37.5%{transform:translateZ(8px) rotateY(-270deg)}50%{transform:translateZ(8px) rotateY(-360deg)}62.49%{transform:translateZ(8px) rotateY(-449deg)}62.5%{transform:translateZ(8px) rotateY(-450deg)}75%{transform:translateZ(8px) rotateY(-540deg)}87.49%{transform:translateZ(8px) rotateY(-629deg)}87.5%{transform:translateZ(8px) rotateY(-630deg)}100%{transform:translateZ(8px) rotateY(-720deg)}}@keyframes search-spinner-emoji{0%,12.49%{content:"🦑"}12.5%,37.49%{content:"🦞"}37.5%,62.49%{content:"🦐"}62.5%,87.49%{content:"🦀"}87.5%,100%{content:"🦑"}}@media(prefers-reduced-motion:reduce){.search-spinner,.search-spinner-emoji:before,.search-molty strong{animation:none}} -.docs-chat{position:fixed;top:0;right:0;bottom:0;width:min(380px,calc(100vw - 28px));z-index:80;pointer-events:none}.docs-chat-launcher{position:absolute;right:18px;bottom:18px;height:46px;border:1px solid color-mix(in srgb,var(--brand) 48%,var(--line-strong));border-radius:0;background:var(--paper);color:var(--ink);display:flex;align-items:center;gap:9px;padding:0 17px 0 8px;font-weight:650;cursor:pointer;box-shadow:0 16px 44px rgba(0,0,0,.30);pointer-events:auto;overflow:hidden;isolation:isolate;transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease}.docs-chat.open .docs-chat-launcher{display:none}.docs-chat-launcher:after{content:none}.docs-chat-launcher:hover{border-color:var(--brand);color:var(--ink)}.docs-chat-launcher:hover:after{opacity:1}.docs-chat-avatar{display:block;width:32px;height:32px;border-radius:999px;object-fit:contain;flex:0 0 auto}.docs-chat-launcher .docs-chat-avatar{width:30px;height:30px}.docs-chat-title .docs-chat-avatar{width:34px;height:34px}.docs-chat-panel{position:absolute;inset:0;display:none;grid-template-rows:auto auto minmax(0,1fr) auto;background:color-mix(in srgb,var(--paper) 94%,#000 6%);border-left:1px solid var(--line-strong);box-shadow:-24px 0 70px rgba(0,0,0,.34);overflow:hidden;pointer-events:auto}.docs-chat.open .docs-chat-panel{display:grid}.docs-chat-head{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:64px;padding:14px 14px 13px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--paper-2) 88%,transparent)}.docs-chat-head p{margin:0 0 2px;color:var(--brand);font-size:12px;font-weight:850;text-transform:uppercase}.docs-chat-head h2{margin:0;color:var(--ink);font:760 18px/1.1 Switzer,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}.docs-chat-actions{display:flex;align-items:center;gap:7px}.docs-chat-icon{position:relative;display:grid;place-items:center;width:34px;height:34px;border:1px solid transparent;border-radius:0;background:transparent;color:var(--muted);padding:0;line-height:1;cursor:pointer;transition:background .15s ease,border-color .15s ease,color .15s ease}.docs-chat-icon .icon{width:17px;height:17px}.docs-chat-icon:hover{border-color:color-mix(in srgb,var(--brand) 38%,var(--line-strong));background:color-mix(in srgb,var(--paper-2) 82%,transparent);color:var(--ink)}.docs-chat-icon:disabled{opacity:.35;cursor:not-allowed}.docs-chat-icon[data-copy-state="copied"]{color:var(--brand);border-color:color-mix(in srgb,var(--brand) 44%,var(--line-strong));background:color-mix(in srgb,var(--soft) 70%,transparent)}.docs-chat-minimize{font-size:22px}.docs-chat-clear[hidden]{display:none}.docs-chat-auth{padding:14px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--paper) 92%,#000 8%)}.docs-chat-auth[hidden]{display:none}.docs-chat-auth-card{border:1px solid var(--line-strong);border-radius:0;background:color-mix(in srgb,var(--paper-2) 86%,transparent);padding:14px}.docs-chat-auth-card p{margin:0 0 16px;color:var(--text);font-size:14px;line-height:1.45;text-wrap:balance}.docs-chat-auth-card strong{display:block;color:var(--ink);font:760 15px/1.25 Switzer,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;margin-bottom:8px}.docs-chat-verify{display:inline-flex;align-items:center;justify-content:center;gap:9px;min-height:40px;border:1px solid var(--brand);border-radius:0;background:var(--brand);color:var(--on-brand)!important;font-weight:850;padding:0 14px;text-decoration:none!important}.docs-chat-github-icon{width:18px;height:18px;fill:currentColor;flex:0 0 auto}.docs-chat-verify:hover{background:color-mix(in srgb,var(--brand) 86%,white 14%);color:var(--on-brand)!important}.docs-chat-log{overflow:auto;padding:14px 14px 16px;display:flex;flex-direction:column;gap:10px}.docs-chat-message{max-width:94%;border:1px solid var(--line);border-radius:0;padding:10px 12px;overflow-wrap:break-word}.docs-chat-message p{margin:0 0 .7em}.docs-chat-message p:last-child{margin-bottom:0}.docs-chat-message a{color:var(--brand);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px;word-break:break-word}.docs-chat-message code{background:var(--code);border:1px solid var(--line-strong);border-radius:0;padding:.05em .32em;color:var(--code-text);font-size:.9em}.docs-chat-code{margin:.35em 0 .85em;border:1px solid var(--line-strong);border-radius:0;background:color-mix(in srgb,var(--code) 92%,#000 8%);overflow:hidden;box-shadow:0 14px 40px rgba(0,0,0,.22)}.docs-chat-code-head{display:flex;align-items:center;min-height:28px;padding:5px 10px;border-bottom:1px solid var(--line);color:var(--muted);font-size:11px;font-weight:800;letter-spacing:.04em;text-transform:uppercase}.docs-chat-code pre{margin:0;padding:12px;overflow:auto;white-space:pre;line-height:1.55}.docs-chat-code code{display:block;background:transparent!important;border:0!important;border-radius:0!important;padding:0!important;color:var(--code-text);font-size:12px}.docs-chat-message.user{align-self:flex-end;background:var(--brand);border-color:var(--brand);color:var(--on-brand)}.docs-chat-message.assistant{align-self:flex-start;background:var(--paper-2);color:var(--text)}.docs-chat-message.thinking{padding:14px;min-height:42px;display:inline-flex;align-items:center}.docs-chat-thinking{display:inline-flex;gap:7px;align-items:flex-end;height:14px}.docs-chat-thinking span{width:7px;height:7px;border-radius:50%;background:var(--muted);animation:docs-chat-dot 1.25s cubic-bezier(.4,0,.2,1) infinite;will-change:transform,opacity,background-color}.docs-chat-thinking span:nth-child(2){animation-delay:.18s}.docs-chat-thinking span:nth-child(3){animation-delay:.36s}@keyframes docs-chat-dot{0%,80%,100%{opacity:.3;transform:translateY(0) scale(.85);background:var(--muted)}40%{opacity:1;transform:translateY(-5px) scale(1);background:var(--brand)}}@media(prefers-reduced-motion:reduce){.docs-chat-thinking span{animation-duration:2.4s;animation-name:docs-chat-dot-fade}@keyframes docs-chat-dot-fade{0%,100%{opacity:.35}50%{opacity:1}}}.docs-chat-message.error{border-color:#8f3a31;color:#ffb3ab;background:color-mix(in srgb,#3d1712 35%,var(--paper))}.docs-chat-form{display:grid;grid-template-columns:1fr auto;gap:10px;padding:12px;border-top:1px solid var(--line);background:var(--paper)}.docs-chat-form[hidden]{display:none}.docs-chat-form textarea{resize:none;min-height:50px;max-height:160px;border:1px solid var(--line-strong);border-radius:0;background:var(--bg);color:var(--ink);padding:12px 12px;line-height:1.35}.docs-chat-form textarea:focus{outline:2px solid color-mix(in srgb,var(--brand) 42%,transparent);border-color:var(--brand)}.docs-chat-form button{align-self:end;display:grid;place-items:center;width:42px;height:42px;border:1px solid var(--brand);border-radius:0;background:var(--brand);color:var(--on-brand);font-weight:850;padding:0;cursor:pointer}.docs-chat-form button .icon{width:18px;height:18px}.docs-chat-form button:disabled{opacity:.55;cursor:wait} -.docs-chat{top:auto;right:18px;bottom:18px;width:min(420px,calc(100vw - 36px));height:min(680px,calc(100vh - 36px));transition:width .24s cubic-bezier(.23,1,.32,1),height .24s cubic-bezier(.23,1,.32,1)}.docs-chat-launcher{right:0;bottom:0}.docs-chat.expanded{width:min(760px,calc(100vw - 36px));height:min(860px,calc(100vh - 36px))}.docs-chat.open{pointer-events:auto}.docs-chat:not(.open):not(.closing){right:18px!important}.docs-chat.open .docs-chat-launcher,.docs-chat.closing .docs-chat-launcher{display:flex;opacity:0;visibility:hidden;pointer-events:none}.docs-chat-panel{display:grid;opacity:0;transform:translateY(10px) scale(.985);transform-origin:bottom right;pointer-events:none;transition:transform .2s cubic-bezier(.23,1,.32,1),opacity .16s ease}.docs-chat.open .docs-chat-panel{display:grid;opacity:1;transform:none;pointer-events:auto}.docs-chat-maximize[aria-pressed="true"]{border-color:color-mix(in srgb,var(--brand) 44%,var(--line-strong));background:color-mix(in srgb,var(--soft) 68%,transparent);color:var(--ink)}.docs-chat-maximize .icon{transition:none}@media(prefers-reduced-motion:reduce){.docs-chat,.docs-chat-panel{transition:none}} -.docs-chat-panel{grid-template-rows:auto auto minmax(0,1fr) auto;inline-size:100%;min-width:0;max-width:100%;background:var(--bg);border:1px solid var(--line-strong);border-radius:0;box-shadow:0 22px 70px rgba(0,0,0,.42);overflow:hidden}.docs-chat-panel>*{min-width:0;max-width:100%}.docs-chat-head{grid-row:1;min-height:58px;overflow:hidden;padding:10px 14px;background:var(--bg);border-bottom:1px solid var(--line);cursor:grab;touch-action:none;user-select:none}.docs-chat.dragging .docs-chat-head{cursor:grabbing}.docs-chat-title{display:flex;align-items:center;gap:10px;flex:1 1 auto;min-width:0}.docs-chat-mark{display:grid;place-items:center;flex:0 0 28px;width:28px;height:28px;color:var(--brand);filter:drop-shadow(0 0 12px color-mix(in srgb,var(--brand) 35%,transparent))}.docs-chat-mark .icon{width:25px;height:25px;stroke-width:1.8}.docs-chat-head h2{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:500 17px/1.05 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;letter-spacing:.04em}.docs-chat-actions{flex:0 0 auto;min-width:0;gap:6px}.docs-chat-icon{width:29px;height:29px;border-radius:0;color:color-mix(in srgb,var(--muted) 82%,transparent)}.docs-chat-icon[hidden]{display:none}.docs-chat-icon .icon{width:17px;height:17px}.docs-chat-copy[data-copy-state] .icon{display:none}.docs-chat-copy[data-copy-state]:before{font:900 15px/1 Switzer,ui-sans-serif,system-ui,sans-serif}.docs-chat-copy[data-copy-state="copied"]:before{content:"✓"}.docs-chat-copy[data-copy-state="failed"]:before{content:"!"}.docs-chat-minimize{font-size:27px;font-weight:320}.docs-chat-log{grid-row:3;min-width:0;overflow-x:hidden;padding:24px 22px 18px;gap:12px}.docs-chat-message{max-width:min(86%,calc(100% - 28px));min-width:0;overflow-wrap:anywhere;word-break:break-word}.docs-chat-message.user{margin-right:0}.docs-chat-code{max-width:100%}.docs-chat-empty{max-width:300px;margin:0 auto;color:color-mix(in srgb,var(--muted) 72%,transparent);text-align:center;font:500 15px/1.45 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;letter-spacing:.03em}.docs-chat-form{grid-row:4;position:relative;display:block;width:100%;min-width:0;max-width:100%;overflow:hidden;padding:16px 22px 22px;border-top:0;background:linear-gradient(180deg,transparent,color-mix(in srgb,var(--bg) 96%,#000 4%) 22%)}.docs-chat:not([data-chat-auth-state="ready"]) .docs-chat-form{display:none}.docs-chat-form textarea{display:block;inline-size:100%;max-width:100%;min-width:0;min-height:118px;max-height:158px;border-radius:0;padding:20px 66px 42px 20px;background:var(--bg);font-size:16px;line-height:1.5;overflow:hidden}.docs-chat-form textarea:focus{outline:0;border-color:var(--brand);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--brand) 48%,transparent),inset 0 0 0 4px color-mix(in srgb,var(--brand) 12%,transparent)}.docs-chat-form button{position:absolute;right:34px;bottom:34px;width:38px;height:38px;border-radius:0}.docs-chat-auth{grid-row:4;align-self:end;border-top:1px solid var(--line);border-bottom:0;background:var(--bg);padding:16px 22px 22px}.docs-chat-auth-card{border-radius:0} -.oc-chart-mark,.oc-chart-donut-key{position:relative}.oc-chart-mark:focus-visible,.oc-chart-line-svg circle:focus-visible,.oc-chart-donut-segment:focus-visible,.oc-chart-donut-key:focus-visible{outline:2px solid color-mix(in srgb,var(--brand) 58%,transparent);outline-offset:3px}.oc-chart-mark[data-tip]:hover:after,.oc-chart-mark[data-tip]:focus:after,.oc-chart-donut-key[data-tip]:hover:after,.oc-chart-donut-key[data-tip]:focus:after{content:attr(data-tip);position:absolute;left:50%;bottom:calc(100% + 9px);transform:translateX(-50%);z-index:30;width:max-content;max-width:min(260px,calc(100vw - 40px));padding:7px 9px;border:1px solid var(--tooltip-border);border-radius:0;background:var(--tooltip-bg);color:var(--tooltip-text);font:760 12px/1.25 Switzer,ui-sans-serif,system-ui,sans-serif;box-shadow:var(--shadow);pointer-events:none}.oc-chart-mark[data-tip]:hover:before,.oc-chart-mark[data-tip]:focus:before,.oc-chart-donut-key[data-tip]:hover:before,.oc-chart-donut-key[data-tip]:focus:before{content:"";position:absolute;left:50%;bottom:calc(100% + 4px);transform:translateX(-50%) rotate(45deg);z-index:31;width:8px;height:8px;background:var(--tooltip-bg);pointer-events:none}.oc-chart-area-fill{fill:color-mix(in srgb,var(--brand) 18%,transparent)}.oc-chart-donut-wrap{display:grid;grid-template-columns:minmax(170px,220px) minmax(0,1fr);gap:18px;align-items:center}.oc-chart-donut-svg{display:block;width:100%;height:auto}.oc-chart-donut-bg{fill:none;stroke:color-mix(in srgb,var(--line-strong) 72%,transparent);stroke-width:28}.oc-chart-donut-segment{fill:none;stroke:var(--oc-chart-tone);stroke-width:28;stroke-linecap:butt;stroke-dasharray:var(--oc-chart-share) 100;stroke-dashoffset:calc(var(--oc-chart-offset) * -1);transition:stroke-width .16s ease,opacity .16s ease}.oc-chart-donut-segment:hover,.oc-chart-donut-segment:focus{stroke-width:32;opacity:.92}.oc-chart-donut-svg text:first-of-type{fill:var(--ink);font:780 24px/1 Switzer,ui-sans-serif,system-ui,sans-serif}.oc-chart-donut-svg text:last-of-type{fill:var(--muted);font:760 11px/1 Switzer,ui-sans-serif,system-ui,sans-serif;text-transform:uppercase}.oc-chart-donut-legend{display:grid;gap:8px}.oc-chart-donut-key{display:grid;grid-template-columns:10px minmax(0,1fr) auto;gap:8px;align-items:center;color:var(--text);font-size:12px}.oc-chart-donut-key i{width:10px;height:10px;border-radius:2px;background:var(--oc-chart-tone)}.oc-chart-donut-key span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.oc-chart-donut-key strong{color:var(--ink);font:760 12px/1 Switzer,ui-sans-serif,system-ui,sans-serif}.oc-callout{--callout-surface:var(--paper);background:var(--callout-surface);border-color:var(--line-strong);border-left-color:var(--callout-accent);box-shadow:none}.oc-callout strong:before{background:var(--paper)}:root[data-theme="light"] .oc-callout{background:var(--paper);border-color:var(--line-strong);border-left-color:var(--callout-accent)}:root[data-theme="light"] .oc-callout strong:before{background:var(--paper);box-shadow:0 0 0 3px var(--paper)} -.page-feedback{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:18px 22px;border-top:1px solid var(--line);margin-top:42px;padding-top:18px}.page-feedback-prompt{display:flex;align-items:center;gap:9px;min-width:0;flex-wrap:wrap}.page-feedback-prompt>span{display:inline-flex;align-items:center;color:var(--text)}.page-feedback-composer{grid-column:1/-1;display:grid;gap:11px}.page-feedback-composer[hidden]{display:none}.page-feedback-composer textarea{width:100%;min-height:110px;resize:vertical;border:1px solid var(--line-strong);border-radius:0;background:color-mix(in srgb,var(--bg) 80%,var(--paper) 20%);color:var(--ink);padding:13px 14px}.page-feedback-composer textarea:focus{outline:0;border-color:var(--brand);box-shadow:0 0 0 3px color-mix(in srgb,var(--brand) 18%,transparent)}.page-feedback-submit{display:inline-flex;align-items:center;justify-content:center;gap:8px;justify-self:end;min-height:38px;border:1px solid color-mix(in srgb,var(--brand) 46%,var(--line-strong));border-radius:0;background:color-mix(in srgb,var(--paper) 76%,transparent);color:var(--brand);padding:0 13px;font:800 12px/1 Switzer,ui-sans-serif,system-ui,sans-serif;white-space:nowrap}.page-feedback-submit .icon{width:15px;height:15px}.page-feedback-submit:hover{border-color:var(--brand);color:var(--ink);background:color-mix(in srgb,var(--soft) 52%,transparent)} -@media(max-width:620px){.page-feedback{grid-template-columns:1fr;padding:16px}.page-feedback-links{margin-left:0}.page-feedback-composer{max-width:none}.page-feedback-submit{width:max-content}} -.docs-chat-message.user a,.docs-chat-message.user a:visited{color:inherit;text-decoration-color:color-mix(in srgb,currentColor 72%,transparent)}.docs-chat-message.user a:hover,.docs-chat-message.user a:focus-visible{color:#000;text-decoration-color:currentColor} -@media(max-width:1120px){html{scroll-padding-top:calc(var(--sticky-header-h) + 54px)}.header-row{grid-template-columns:auto 1fr auto;padding:0 24px}.tabs{padding:0 24px}.oc-card-grid.oc-card-cols-4{grid-template-columns:repeat(2,minmax(0,1fr))}.doc-shell{grid-template-columns:220px minmax(0,1fr);gap:34px;padding-left:24px;padding-right:24px}.sidebar{top:148px;max-height:calc(100vh - 172px);padding-right:4px}.nav-section{margin-bottom:26px}.nav-link{padding:6px 10px;font-size:13px}.main{grid-template-columns:minmax(0,1fr)}.toc{position:fixed;left:calc(24px + 220px + 34px);top:calc(var(--sticky-header-h) + 8px);z-index:60;width:max-content;max-width:calc(100vw - 302px);max-height:none;margin:0;padding:0;overflow:visible;background:transparent;color:var(--muted);font-size:13px;opacity:0;visibility:hidden;pointer-events:none;transform:translateY(-4px);transition:opacity .16s ease,transform .16s ease,visibility .16s ease}.toc.is-visible,.toc[open]{opacity:1;visibility:visible;pointer-events:auto;transform:none}.toc h2{display:none}.toc summary{display:flex;align-items:center;gap:8px;min-height:34px;padding:0 11px;border:1px solid var(--line-strong);border-radius:0;background:color-mix(in srgb,var(--paper) 90%,transparent);color:var(--ink);font:760 12px/1 Switzer,ui-sans-serif,system-ui,sans-serif;cursor:pointer;list-style:none;box-shadow:0 10px 30px rgba(0,0,0,.18)}.toc summary::-webkit-details-marker{display:none}.toc summary:after{content:"";width:6px;height:6px;border-right:1.25px solid color-mix(in srgb,currentColor 72%,transparent);border-bottom:1.25px solid color-mix(in srgb,currentColor 72%,transparent);transform:rotate(45deg);margin-top:-3px}.toc[open] summary{border-color:color-mix(in srgb,var(--brand) 38%,var(--line-strong));background:color-mix(in srgb,var(--soft) 62%,var(--paper) 38%)}.toc[open] summary:after{transform:rotate(225deg);margin-top:3px}.toc nav{position:absolute;left:0;top:calc(100% + 8px);display:none;width:min(340px,calc(100vw - 302px));max-height:min(58vh,520px);overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable;padding:8px 11px 8px 8px;border:1px solid color-mix(in srgb,var(--line-strong) 82%,var(--brand) 18%);border-radius:0;background:color-mix(in srgb,var(--paper) 92%,var(--soft) 8%);box-shadow:var(--shadow)}.toc[open] nav{display:grid;gap:2px}.toc a{display:block;max-width:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:0;padding:8px 9px;color:var(--text)}.toc a:hover,.toc a.active{background:var(--soft);color:var(--ink)}.toc-l3{padding-left:18px!important}}@media(max-width:820px){html{scroll-padding-top:calc(var(--sticky-header-h) + 50px)}.site-header{position:sticky}.header-row{height:auto;min-height:0;grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"menu brand actions" "search search search";align-items:center;padding:10px 14px 12px;gap:10px 12px}.header-left{grid-area:brand;justify-self:center;gap:10px;min-width:0}.brand img{width:22px;height:22px}.language-trigger{width:40px;height:40px;padding:0;justify-content:center;border:1px solid var(--line-strong);background:var(--paper)}.language-current,.language-chevron{display:none}.language-menu{left:auto;right:0;transform:none;width:min(390px,calc(100vw - 28px));max-height:min(72vh,620px)}.search-button{grid-area:search;width:100%;height:40px}.header-links{grid-area:actions;justify-self:end;gap:8px}.theme-toggle{width:40px;height:40px;border:1px solid var(--line-strong)!important;border-radius:0;background:var(--paper)!important}.nav-toggle{grid-area:menu;display:inline-flex;align-items:center;justify-content:center;justify-self:start;width:40px;height:40px;padding:0}.tabs{display:none}.doc-shell{display:block;padding:26px 20px 86px}.toc{left:20px;top:calc(var(--sticky-header-h) + 8px);max-width:calc(100vw - 40px)}.toc nav{width:min(340px,calc(100vw - 40px));max-height:min(62vh,560px)}.toc summary{min-height:36px}body.nav-open{overflow:hidden}body.nav-open:before{content:"";position:fixed;inset:0;z-index:75;background:rgba(0,0,0,.58);backdrop-filter:blur(2px)}.sidebar{position:fixed;inset:0 auto 0 0;width:min(360px,calc(100vw - 28px));z-index:90;transform:translateX(calc(-100% - 1px));transition:transform .2s ease;background:var(--bg);border-right:1px solid var(--line);padding:18px 18px 28px;max-height:none;box-shadow:24px 0 80px rgba(0,0,0,.42);mask-image:none;-webkit-mask-image:none}.sidebar.open{transform:translateX(0)}.sidebar-close{display:flex;align-items:center;justify-content:center;width:100%;height:40px;margin:0 0 18px;border:1px solid var(--line-strong);border-radius:0;background:var(--paper);color:var(--ink);font:760 13px/1 Switzer,ui-sans-serif,system-ui,sans-serif}.breadcrumbs{white-space:normal}.article-meta-row .page-tools{flex:0 0 auto}.breadcrumbs .breadcrumb-group{display:none}.page-tools,.page-feedback{flex-wrap:wrap}.article h1{font-size:28px}.oc-card-grid,.oc-card-group,.oc-card-grid.oc-card-cols-3,.oc-card-grid.oc-card-cols-4,.oc-tile-group,.oc-cta-grid,.oc-stat-grid{grid-template-columns:1fr}.oc-steps{margin-left:18px}.oc-step{padding-left:30px}.oc-tabs,.oc-code-group{margin-left:0;margin-right:0}.oc-tab{padding:18px}.doc pre{white-space:pre-wrap;overflow-wrap:anywhere}.doc pre code{white-space:pre-wrap;min-width:0}.doc .code-line{white-space:pre-wrap;overflow-wrap:anywhere}.oc-code-tabs{overflow-x:auto}.oc-code-tab{flex:0 0 auto}.next{text-align:left}.page-nav{grid-template-columns:1fr}.oc-chart-donut-wrap{grid-template-columns:1fr}.docs-chat,.docs-chat.expanded{right:14px;bottom:14px;width:min(390px,calc(100vw - 28px));height:min(680px,calc(100vh - 28px))}.docs-chat:not(.open):not(.closing){right:14px!important}.docs-chat-launcher{right:0;bottom:0;height:44px;padding:0 14px}.docs-chat-head{min-height:58px;padding:12px}.docs-chat-panel{box-shadow:0 18px 54px rgba(0,0,0,.42)}} +.oc-steps{counter-reset:step;list-style:none;padding-left:0!important;margin:28px 0 var(--oc-space-6) var(--oc-space-5)}.oc-step{counter-increment:step;border-left:2px solid var(--line);padding:0 0 var(--oc-space-5) 34px;position:relative}.oc-step:last-child{padding-bottom:0;border-image:linear-gradient(to bottom,var(--line) 0%,color-mix(in srgb,var(--line) 52%,transparent) 44%,transparent 92%) 1}.oc-step:before{content:counter(step);position:absolute;left:-13px;top:0;width:24px;height:24px;border-radius:var(--oc-radius-round);background:color-mix(in srgb,var(--line-strong) 78%,var(--paper) 22%);color:var(--ink);box-shadow:inset 0 0 0 1px var(--line-strong);display:grid;place-items:center;font-size:var(--oc-font-size-xs);font-weight:800}.oc-step h3{margin-top:0}.oc-step>p:first-of-type{margin-top:.2em}.oc-step .oc-code{max-width:100%;margin:14px 0 18px}.oc-step .oc-code:last-child{margin-bottom:0}.oc-callout{--callout-accent:var(--brand);--callout-surface:color-mix(in srgb,var(--paper) 86%,var(--callout-accent) 14%);position:relative;border:1px solid color-mix(in srgb,var(--line-strong) 74%,var(--callout-accent) 26%);border-left:3px solid var(--callout-accent);background:var(--callout-surface);border-radius:var(--oc-radius-surface);padding:14px var(--oc-space-4) 14px 42px;margin:20px 0;color:var(--text)}.oc-callout strong{display:block;color:var(--ink);font:760 var(--oc-font-size-base)/1.3 var(--oc-font-body);margin:0 0 var(--oc-space-1)}.oc-callout strong:before{content:"i";position:absolute;left:15px;top:15px;width:17px;height:17px;border:1px solid var(--callout-accent);border-radius:var(--oc-radius-round);display:grid;place-items:center;color:var(--callout-accent);font:800 11px/1 var(--oc-font-body)}.oc-callout p:last-child,.oc-callout ul:last-child,.oc-callout ol:last-child{margin-bottom:0}.oc-callout-tip{--callout-accent:var(--oc-status-success-fg)}.oc-callout-tip strong:before{content:"?"}.oc-callout-info,.oc-callout-note{--callout-accent:var(--oc-status-info-fg)}.oc-callout-warning{--callout-accent:var(--oc-status-warning-fg)}.oc-callout-warning strong:before{content:"!"}.oc-callout-check{--callout-accent:var(--oc-status-success-fg)}.oc-callout-check strong:before{content:"✓"}.oc-callout-say{--callout-accent:#c084fc}.oc-callout-say strong:before{content:">"}.oc-code{margin:18px 0;border:1px solid var(--code-border);border-radius:var(--oc-radius-surface);background:var(--code-block);box-shadow:var(--code-shadow);overflow:hidden}.oc-code figcaption{display:flex;align-items:center;min-height:34px;padding:6px var(--oc-space-2) 6px var(--oc-space-3);border-bottom:1px solid var(--code-border);background:color-mix(in srgb,var(--paper-2) 42%,transparent);color:var(--muted);font:760 var(--oc-font-size-xs)/1 var(--oc-font-body)}.oc-code pre{margin:0;border:0;border-radius:var(--oc-radius-inset);box-shadow:none;background:transparent}.oc-tabs,.oc-code-group{border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 78%,transparent);border-radius:var(--oc-radius-surface);margin:20px 0 28px;overflow:hidden}.oc-code-tabs{display:flex;gap:2px;padding:6px 7px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--paper-2) 74%,transparent)}.oc-code-tab{border:0;border-radius:var(--oc-radius-control);background:transparent;color:var(--muted);padding:6px 9px;font:760 var(--oc-font-size-xs)/1 var(--oc-font-body);cursor:pointer}.oc-code-tab:hover{color:var(--ink);background:color-mix(in srgb,var(--soft) 52%,transparent)}.oc-code-tab.active{color:var(--ink);background:var(--soft)}.oc-code-group .oc-code{display:none;margin:0;border:0;border-radius:var(--oc-radius-surface);box-shadow:none}.oc-code-group .oc-code.active{display:block}.oc-code-group .oc-code figcaption{display:none}.oc-tab{border-top:1px solid var(--line);padding:20px var(--oc-space-5)}.oc-tab:first-child{border-top:0}.oc-tab h3{margin:0 0 var(--oc-space-3);font-size:var(--oc-font-size-sm);color:var(--brand)}.oc-tab .oc-code{margin:0;max-width:100%}.oc-accordion-group{display:grid;gap:10px;margin:18px 0}.oc-accordion{border:1px solid var(--line-strong);background:var(--paper);border-radius:var(--oc-radius-surface);margin:0;padding:0 13px}.oc-accordion summary{cursor:pointer;color:var(--ink);font-weight:750;padding:var(--oc-space-3) 0}.oc-accordion summary::marker{color:var(--brand)}.oc-param,.oc-frame{border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 78%,transparent);border-radius:var(--oc-radius-surface);padding:13px 15px;margin:var(--oc-space-3) 0}.oc-frame{padding:10px}.oc-frame figcaption{padding:2px var(--oc-space-1) 10px;color:var(--muted);font-size:var(--oc-font-size-xs)}.oc-frame p{margin:0}.oc-frame img{display:block;margin:0 auto;border-radius:var(--oc-radius-control)}.oc-tooltip{position:relative;display:inline-flex;align-items:center;border-bottom:1px dotted color-mix(in srgb,var(--brand) 72%,var(--text));color:var(--ink);cursor:help}.oc-tooltip:focus{outline:2px solid var(--oc-focus-ring);outline-offset:3px;border-radius:var(--oc-radius-control)}.oc-tooltip[data-tip]:hover:after,.oc-tooltip[data-tip]:focus:after{content:attr(data-tip);position:absolute;left:50%;bottom:calc(100% + 8px);transform:translateX(-50%);z-index:20;width:max-content;max-width:min(320px,calc(100vw - 40px));padding:var(--oc-space-2) 10px;border:1px solid var(--tooltip-border);border-radius:var(--oc-radius-control);background:var(--tooltip-bg);color:var(--tooltip-text);font:700 var(--oc-font-size-xs)/1.35 var(--oc-font-body);box-shadow:var(--shadow)}.oc-param header{display:flex;gap:var(--oc-space-2);align-items:center;flex-wrap:wrap;margin-bottom:var(--oc-space-2)}.oc-param header code{background:var(--code-inline);border-color:var(--code-border);color:var(--ink)}.oc-param-type,.oc-param-default,.oc-param-required{border:1px solid var(--line-strong);border-radius:var(--oc-radius-control);background:color-mix(in srgb,var(--soft) 70%,transparent);padding:1px 7px;font-size:var(--oc-font-size-xs);color:var(--muted)}.oc-param-type{color:var(--brand);border-color:color-mix(in srgb,var(--brand) 34%,var(--line-strong));background:color-mix(in srgb,var(--brand) 12%,var(--paper))}.oc-param-default{color:var(--text);background:color-mix(in srgb,var(--paper-2) 82%,transparent)}.oc-param-required{color:var(--brand);border-color:color-mix(in srgb,var(--brand) 42%,var(--line-strong));background:color-mix(in srgb,var(--brand) 10%,var(--paper))} +.breadcrumbs{display:flex;align-items:center;gap:var(--oc-space-2);color:var(--muted);font:650 11.5px/1.4 var(--oc-font-mono);margin:0 0 var(--oc-space-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.breadcrumbs span{min-width:0;overflow:hidden;text-overflow:ellipsis}.breadcrumbs .breadcrumb-part{display:inline-flex;align-items:center;gap:var(--oc-space-2);flex:0 1 auto}.breadcrumbs .breadcrumb-separator{flex:0 0 auto}.breadcrumbs [aria-current="page"]{color:var(--text)}.page-status{display:flex;flex-wrap:wrap;gap:7px;margin:13px 0 0}.page-status-badge{display:inline-flex;align-items:center;min-height:24px;max-width:100%;border:1px solid var(--line-strong);border-radius:var(--oc-radius-control);background:color-mix(in srgb,var(--paper) 76%,transparent);color:var(--muted);padding:var(--oc-space-1) 9px;font:760 var(--oc-font-size-xs)/1.25 var(--oc-font-body)}.page-status-beta,.page-status-status{color:var(--brand);border-color:color-mix(in srgb,var(--brand) 38%,var(--line-strong));background:color-mix(in srgb,var(--soft) 68%,transparent)}.page-status-deprecated{color:var(--oc-status-warning-fg);border-color:color-mix(in srgb,var(--oc-status-warning-fg) 42%,var(--line-strong))}.page-tools{display:flex;align-items:center;gap:var(--oc-space-2);margin-top:var(--oc-space-4)}.page-tools a,.page-tools button,.page-feedback button,.oc-prompt button{border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 82%,transparent);color:var(--muted);border-radius:var(--oc-radius-control);padding:6px 9px;font:760 var(--oc-font-size-xs)/1 var(--oc-font-body);cursor:pointer}.page-tools a:hover,.page-tools button:hover,.page-feedback button:hover,.oc-prompt button:hover{border-color:var(--brand);color:var(--ink)}.oc-code figcaption{justify-content:space-between;gap:var(--oc-space-3)}.oc-code figcaption .oc-code-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:uppercase;letter-spacing:.08em}.oc-code figcaption button{position:relative;display:grid;place-items:center;flex:0 0 32px;width:32px;height:30px;padding:0;border:1px solid transparent;background:transparent;color:var(--muted);border-radius:var(--oc-radius-control);cursor:pointer}.oc-code figcaption button:before,.oc-code figcaption button:after{content:"";position:absolute;box-sizing:border-box;width:13px;height:13px;border:1.6px solid currentColor;border-radius:var(--oc-radius-inset);background:color-mix(in srgb,var(--paper-2) 42%,var(--code-block) 58%)}.oc-code figcaption button:before{left:7px;top:6px;opacity:.72}.oc-code figcaption button:after{left:11px;top:10px}.oc-code figcaption button:hover{border-color:color-mix(in srgb,var(--brand) 32%,var(--line-strong));background:color-mix(in srgb,var(--soft) 46%,transparent);color:var(--ink)}.oc-code figcaption button[data-copy-state="copied"]{color:var(--brand)}.oc-code figcaption button[data-copy-state="copied"]:before{content:"✓";position:static;width:auto;height:auto;border:0;background:transparent;font:900 var(--oc-font-size-base)/1 var(--oc-font-body)}.oc-code figcaption button[data-copy-state="copied"]:after,.oc-code figcaption button[data-copy-state="failed"]:after{content:none}.oc-code figcaption button[data-copy-state="failed"]{color:var(--oc-status-error-fg)}.oc-code figcaption button[data-copy-state="failed"]:before{content:"!";position:static;width:auto;height:auto;border:0;background:transparent;font:900 var(--oc-font-size-base)/1 var(--oc-font-body)}.doc pre code{display:block;min-width:max-content}.doc .oc-code pre code{white-space:pre}.doc .code-line,.oc-code .code-line{display:block;min-height:1.5em;line-height:1.5;padding:0 2px;border-left:2px solid transparent;white-space:pre}.doc .code-line:before{content:attr(data-line);display:none;width:2.4em;margin-right:1em;color:var(--muted);text-align:right;user-select:none}.doc .has-line-numbers .code-line:before{display:inline-block}.doc .code-line.is-highlighted{background:color-mix(in srgb,var(--brand) 14%,transparent);border-left-color:var(--brand)}.doc .code-line.is-dimmed{opacity:.46}.doc .code-line.is-added{background:color-mix(in srgb,var(--oc-diff-added) 13%,transparent);border-left-color:var(--oc-diff-added)}.doc .code-line.is-removed{background:color-mix(in srgb,var(--oc-diff-removed) 12%,transparent);border-left-color:var(--oc-diff-removed)}.doc .oc-code.is-wrapped pre,.doc .oc-code.is-wrapped code{white-space:pre-wrap;min-width:0}.doc .oc-code.is-wrapped .code-line{white-space:pre-wrap}.doc .oc-code.is-expandable pre{max-height:360px}.oc-badge{display:inline-flex;align-items:center;min-height:1.55em;padding:0 .5em;border:1px solid var(--line-strong);border-radius:var(--oc-radius-control);background:var(--soft);color:var(--ink);font:760 .76em/1 var(--oc-font-body);vertical-align:middle}.oc-badge-orange{color:var(--brand);border-color:color-mix(in srgb,var(--brand) 38%,var(--line-strong))}.oc-badge-green{color:var(--oc-status-success-fg);border-color:color-mix(in srgb,var(--oc-status-success-fg) 38%,var(--line-strong))}.oc-panel,.oc-prompt,.oc-mermaid{border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 86%,transparent);border-radius:var(--oc-radius-surface);margin:18px 0;padding:var(--oc-space-4)}.oc-panel>strong{display:block;color:var(--ink);font:760 var(--oc-font-size-base)/1.3 var(--oc-font-body);margin:0 0 var(--oc-space-2)}.oc-prompt header{display:flex;align-items:center;justify-content:space-between;gap:var(--oc-space-3);margin-bottom:10px}.oc-prompt strong{color:var(--ink);font:760 var(--oc-font-size-base)/1.3 var(--oc-font-body)}.oc-prompt p:last-child,.oc-panel p:last-child{margin-bottom:0}.oc-tile-group{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));gap:10px;margin:18px 0}.oc-tile{display:flex;align-items:flex-start;gap:var(--oc-space-3);border:1px solid var(--line-strong);border-radius:var(--oc-radius-surface);padding:14px;color:var(--text);background:transparent}.oc-tile:hover{border-color:var(--brand);background:color-mix(in srgb,var(--soft) 28%,transparent)}.oc-tile strong{display:block;color:var(--ink);font:750 var(--oc-font-size-base)/1.3 var(--oc-font-body);margin:0 0 5px}.oc-tile p{margin:0;color:var(--muted);line-height:1.5}.oc-tile .oc-card-icon{flex:0 0 20px;width:20px;height:20px}.oc-mermaid{overflow:auto;display:grid;place-items:center;min-height:180px;padding:18px;color:var(--code-text);font:var(--oc-font-size-sm)/1.65 var(--oc-font-mono)}.oc-mermaid svg{display:block;max-width:100%;height:auto}.oc-mermaid pre{width:100%;margin:0}.oc-mermaid.is-rendered{background:color-mix(in srgb,var(--paper) 70%,transparent)}.oc-mermaid.is-error{display:block;place-items:normal;border-color:color-mix(in srgb,var(--oc-status-warning-fg) 42%,var(--line-strong))}.page-feedback{display:flex;align-items:center;gap:9px;border-top:1px solid var(--line);margin-top:42px;padding-top:18px;color:var(--muted);font-size:var(--oc-font-size-sm)}.page-feedback output{color:var(--brand);font-weight:760}.page-nav{display:grid;grid-template-columns:1fr 1fr;gap:14px;border-top:1px solid var(--line);margin-top:var(--oc-space-5);padding-top:18px}.page-nav a{border:1px solid var(--line-strong);background:var(--paper);border-radius:var(--oc-radius-surface);padding:13px;color:var(--text)}.page-nav a:hover{border-color:var(--brand)}.page-nav small{display:block;color:var(--muted);font-size:11px;text-transform:uppercase}.next{text-align:right} +.article-meta-row{display:flex;align-items:center;justify-content:space-between;gap:var(--oc-space-4);margin:0 0 var(--oc-space-3)}.article-meta-row .breadcrumbs{margin:0;min-width:0}.article-meta-row .page-tools{margin:0 0 0 auto}.page-actions{display:inline-flex;align-items:stretch;position:relative}.page-tools .page-actions-primary,.page-tools .page-actions-more summary{height:30px;min-height:30px;border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 82%,transparent);color:var(--muted);font:760 var(--oc-font-size-xs)/1 var(--oc-font-body);cursor:pointer}.page-tools .page-actions-primary{display:inline-flex;align-items:center;gap:7px;white-space:nowrap;border-right:1px solid var(--line-strong);border-radius:var(--oc-radius-control);margin-right:-1px;padding:0 9px}.page-tools .page-actions-primary .icon{width:15px;height:15px;min-width:15px}.page-tools .page-actions-more{position:relative}.page-tools .page-actions-more summary{display:grid;place-items:center;width:34px;border-radius:var(--oc-radius-control);padding:0;list-style:none}.page-tools .page-actions-more summary::-webkit-details-marker{display:none}.page-tools .page-actions-more summary::marker{content:""}.page-tools .page-actions-primary:hover,.page-tools .page-actions-more[open] summary,.page-tools .page-actions-more summary:hover{border-color:var(--brand);color:var(--ink)}.page-actions-chevron{display:grid;place-items:center;color:var(--muted)}.page-tools .page-actions-more summary .page-actions-chevron .icon{width:15px;height:15px;min-width:15px;transition:transform var(--oc-duration-fast) var(--oc-ease-out)}.page-tools .page-actions-more[open] .page-actions-chevron .icon{transform:rotate(180deg)}.page-tools .page-actions-more .page-actions-menu{position:absolute;top:calc(100% + 8px);left:auto;right:0;z-index:40;display:none;gap:var(--oc-space-1);min-width:260px;padding:var(--oc-space-2);border:1px solid var(--line-strong);border-radius:var(--oc-radius-surface);background:var(--paper);box-shadow:var(--shadow)}.page-tools .page-actions-more[open] .page-actions-menu{display:grid}.page-tools .page-action{display:grid;grid-template-columns:18px minmax(0,1fr) auto;align-items:center;gap:10px;width:100%;padding:9px;border:0;border-radius:var(--oc-radius-control);background:transparent;color:var(--text);text-align:left;text-decoration:none;cursor:pointer}.page-tools .page-action:hover{background:var(--soft);color:var(--ink)}.page-tools .page-action .icon{width:17px;height:17px}.page-tools .page-action strong{display:block;color:var(--ink);font:760 var(--oc-font-size-xs)/1.2 var(--oc-font-body)}.page-tools .page-action small{display:block;margin-top:3px;color:var(--muted);font:650 11px/1.25 var(--oc-font-body)}.page-tools .page-action-external{justify-self:end;color:var(--muted);font-size:var(--oc-font-size-xs)}.page-feedback-links{display:flex;align-items:center;gap:9px;margin-left:auto}.page-feedback-links a{border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 82%,transparent);color:var(--muted);border-radius:var(--oc-radius-control);padding:6px 9px;font:760 var(--oc-font-size-xs)/1 var(--oc-font-body)}.page-feedback-links a:hover{border-color:var(--brand);color:var(--ink)}@media(max-width:620px){.page-feedback-links{flex-basis:100%;margin:3px 0 0}} +.doc .oc-code.is-expandable{position:relative}.doc .oc-code.is-expandable pre{max-height:360px;padding-bottom:44px}.doc .oc-code.is-expandable.is-expanded pre{max-height:none}.doc .oc-code.is-expandable:not(.is-expanded):after{content:"";position:absolute;left:0;right:0;bottom:39px;height:72px;background:linear-gradient(180deg,transparent,var(--code-block));pointer-events:none}.oc-code-expand{position:absolute;left:0;right:0;bottom:0;z-index:2;width:100%;min-height:40px;border:0;border-top:1px solid var(--code-border);background:color-mix(in srgb,var(--code-block) 88%,var(--paper-2) 12%);color:var(--brand);font:760 var(--oc-font-size-xs)/1 var(--oc-font-body);cursor:pointer}.oc-code-expand:hover,.oc-code-expand:focus-visible{color:var(--ink);background:color-mix(in srgb,var(--soft) 48%,var(--code-block));outline:0} +.search-modal{position:fixed;inset:0;background:color-mix(in srgb,var(--oc-bg-page) 62%,transparent);display:none;z-index:90;padding:clamp(var(--oc-space-3),8vh,72px) 18px}.search-modal.open{display:block}.search-panel{display:grid;grid-template-rows:auto auto minmax(0,1fr) auto;width:min(820px,100%);max-height:min(640px,calc(100vh - 16vh));margin:0 auto;background:var(--paper);border:1px solid var(--line-strong);border-radius:var(--oc-radius-surface);box-shadow:var(--shadow);overflow:hidden}.search-head{position:relative;padding:var(--oc-space-3);border-bottom:1px solid var(--line)}.search-head input{width:100%;border:1px solid var(--oc-input-border);border-radius:var(--oc-radius-control);padding:var(--oc-space-3) 44px var(--oc-space-3) var(--oc-space-3);background:var(--oc-input-bg);color:var(--text);outline:0}.search-head input:focus{border-color:color-mix(in srgb,var(--brand) 42%,var(--line-strong));box-shadow:0 0 0 3px color-mix(in srgb,var(--brand) 16%,transparent)}.search-close{position:absolute;top:50%;right:22px;display:inline-grid;place-items:center;width:28px;height:28px;transform:translateY(-50%);border:0;background:transparent;color:var(--muted);border-radius:var(--oc-radius-control);padding:0;cursor:pointer}.search-close:hover,.search-close:focus-visible{color:var(--ink);background:color-mix(in srgb,var(--paper-2) 72%,transparent);outline:0}.search-close .icon{width:17px;height:17px}.search-hints{grid-row:2;display:flex;flex-wrap:wrap;gap:var(--oc-space-2);padding:10px var(--oc-space-3);border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--paper-2) 58%,transparent)}.search-modal.has-query .search-hints{display:none}.search-hints button{border:1px solid var(--line-strong);border-radius:var(--oc-radius-control);background:transparent;color:var(--muted);padding:6px 10px;font:730 var(--oc-font-size-xs)/1 var(--oc-font-body);cursor:pointer}.search-hints button:hover,.search-hints button:focus-visible{color:var(--ink);border-color:var(--brand);background:color-mix(in srgb,var(--soft) 42%,transparent);outline:0}.search-results{grid-row:3;position:relative;min-height:0;max-height:min(440px,calc(100vh - 260px));overflow:auto;padding:var(--oc-space-2) var(--oc-space-3) 22px;scrollbar-color:color-mix(in srgb,var(--muted) 62%,transparent) transparent}.search-results:after{content:"";position:sticky;left:0;right:0;bottom:-22px;display:block;height:26px;margin:0 -var(--oc-space-3) -22px;pointer-events:none;background:linear-gradient(180deg,transparent,var(--paper) 82%)}.search-results::-webkit-scrollbar{width:10px}.search-results::-webkit-scrollbar-track{background:transparent}.search-results::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--muted) 58%,transparent);border:3px solid transparent;border-radius:var(--oc-radius-round);background-clip:content-box}.search-results.is-loading{cursor:progress;display:grid;place-items:center}.search-results.is-loading:after{display:none}.search-state{margin:0;padding:var(--oc-space-3);color:var(--muted)}.search-loading{display:grid;place-items:center;gap:var(--oc-space-3);padding:36px 0;color:var(--muted);font-weight:720}.search-empty{min-height:260px;display:grid;place-content:center;justify-items:center;gap:10px;padding:34px;color:var(--muted);text-align:center}.search-empty-icon{display:grid;place-items:center;width:42px;height:42px;margin:0 0 var(--oc-space-1);border:1px solid color-mix(in srgb,var(--brand) 30%,var(--line-strong));border-radius:var(--oc-radius-round);background:color-mix(in srgb,var(--soft) 36%,transparent);color:color-mix(in srgb,var(--brand) 78%,var(--muted))}.search-empty-icon .icon{width:19px;height:19px;min-width:19px;max-width:19px;stroke-width:2.1}.search-empty strong{max-width:100%;overflow-wrap:anywhere;color:var(--ink);font:780 16px/1.35 var(--oc-font-body)}.search-empty p{max-width:420px;margin:0 auto;color:var(--text);font-size:var(--oc-font-size-sm)}.search-empty-kbd{display:inline-flex;align-items:center;gap:2px;height:20px;margin:0 .18em;padding:0 6px;border:1px solid var(--line-strong);border-radius:var(--oc-radius-control);background:color-mix(in srgb,var(--paper-2) 70%,transparent);color:var(--ink);vertical-align:-4px}.search-empty-kbd .icon{width:13px;height:13px;min-width:13px;max-width:13px;stroke-width:2.2}.search-spinner{display:inline-flex;width:42px;height:42px;flex:0 0 auto;align-items:center;justify-content:center;border:1px solid color-mix(in srgb,var(--brand) 36%,var(--line));border-radius:var(--oc-radius-round);background:radial-gradient(circle at 32% 28%,rgba(255,255,255,.18),transparent 28%),color-mix(in srgb,var(--paper-2) 82%,var(--brand) 18%);box-shadow:inset 0 0 0 1px rgba(255,255,255,.04),0 10px 32px color-mix(in srgb,var(--brand) 18%,transparent);transform-style:preserve-3d;animation:search-spinner-orbit 2.8s linear infinite}.search-spinner-emoji:before{content:"🦑";display:block;font-size:22px;line-height:1;transform:translateZ(8px);transform-style:preserve-3d;animation:search-spinner-emoji 2.8s steps(1,end) infinite,search-spinner-emoji-spin 2.8s linear infinite}.search-result{display:grid;grid-template-columns:minmax(0,1fr) 24px;grid-template-areas:"meta enter" "title enter" "snippet snippet";gap:5px 10px;border-bottom:1px solid var(--line);border-radius:var(--oc-radius-control);padding:var(--oc-space-3) 14px;color:var(--text);outline:0}.search-result:hover,.search-result:focus-visible,.search-result.active{border-radius:var(--oc-radius-control);background:color-mix(in srgb,var(--paper-2) 92%,transparent);color:var(--text)}.search-result.active{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--line-strong) 92%,transparent)}.search-result-meta{grid-area:meta;display:flex;min-width:0;gap:var(--oc-space-2);align-items:center;color:var(--muted);font:700 var(--oc-font-size-xs)/1 var(--oc-font-body)}.search-result-meta span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-meta span+span:before{content:"/";margin-right:var(--oc-space-2);color:var(--muted)}.search-result strong{grid-area:title;display:block;min-width:0;color:var(--ink);font:780 var(--oc-font-size-md)/1.35 var(--oc-font-body)}.search-result p{grid-area:snippet;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin:.1em 0 0;color:var(--muted);font-size:var(--oc-font-size-sm)}.search-result mark{border-radius:var(--oc-radius-control);background:color-mix(in srgb,var(--brand) 28%,transparent);color:var(--ink);box-shadow:0 0 0 1px color-mix(in srgb,var(--brand) 22%,transparent);box-decoration-break:clone;-webkit-box-decoration-break:clone}.search-result-enter{grid-area:enter;align-self:center;justify-self:end;display:grid;place-items:center;width:24px;height:24px;color:var(--muted);opacity:0}.search-result-enter .icon{width:17px;height:17px;min-width:17px;max-width:17px;stroke-width:2.1}.search-result.active .search-result-enter,.search-result:hover .search-result-enter{opacity:1}.search-molty{grid-row:4;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;width:100%;border:0;border-top:1px solid var(--line);background:color-mix(in srgb,var(--paper-2) 60%,transparent);color:var(--text);padding:11px 14px;cursor:pointer;text-align:left}.search-molty:hover,.search-molty:focus-visible{background:color-mix(in srgb,var(--soft) 52%,var(--paper) 48%);outline:0}.search-molty img{width:28px;height:28px;border-radius:var(--oc-radius-round)}.search-molty span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-molty [hidden]{display:none}.search-molty strong{color:var(--brand);font-weight:800;background:linear-gradient(90deg,var(--brand),color-mix(in srgb,var(--brand) 55%,white 45%),var(--brand));background-size:220% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:search-term-shimmer 1.7s ease-in-out infinite}.search-molty-shortcut{display:inline-flex;align-items:center;justify-content:flex-end;gap:2px;color:var(--muted);height:15px}.search-molty-shortcut .icon{width:15px;height:15px;min-width:15px;max-width:15px;stroke-width:2.2}.search-molty:hover .search-molty-shortcut,.search-molty:focus-visible .search-molty-shortcut{color:var(--ink)}@media(max-width:640px){.search-modal{padding:10px}.search-modal.open{display:grid;align-items:center}.search-panel{border-radius:var(--oc-radius-surface)}.search-head{padding:9px}.search-head input{font-size:16px;line-height:1.35;padding:11px 40px 11px 11px}.search-close{right:16px}.search-hints{flex-wrap:nowrap;overflow-x:auto;gap:7px;padding:var(--oc-space-2) 9px}.search-hints button{flex:0 0 auto}.search-results{max-height:min(340px,calc(100vh - 230px));padding:7px var(--oc-space-2) 20px}.search-results:after{margin:0 -var(--oc-space-2) -20px}.search-empty{min-height:220px;padding:22px 18px}.search-empty p{max-width:280px}.search-result{grid-template-columns:minmax(0,1fr);grid-template-areas:"meta" "title" "snippet";padding:11px 10px}.search-result-enter{display:none}.search-molty{gap:var(--oc-space-2);padding:10px 11px}.search-molty img{width:24px;height:24px}.search-molty-shortcut{display:none}}@keyframes search-term-shimmer{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}@keyframes search-spinner-orbit{0%{transform:rotateY(0deg)}12.49%{transform:rotateY(89deg)}12.5%{transform:rotateY(90deg)}25%{transform:rotateY(180deg)}37.49%{transform:rotateY(269deg)}37.5%{transform:rotateY(270deg)}50%{transform:rotateY(360deg)}62.49%{transform:rotateY(449deg)}62.5%{transform:rotateY(450deg)}75%{transform:rotateY(540deg)}87.49%{transform:rotateY(629deg)}87.5%{transform:rotateY(630deg)}100%{transform:rotateY(720deg)}}@keyframes search-spinner-emoji-spin{0%{transform:translateZ(8px) rotateY(0deg)}12.49%{transform:translateZ(8px) rotateY(-89deg)}12.5%{transform:translateZ(8px) rotateY(-90deg)}25%{transform:translateZ(8px) rotateY(-180deg)}37.49%{transform:translateZ(8px) rotateY(-269deg)}37.5%{transform:translateZ(8px) rotateY(-270deg)}50%{transform:translateZ(8px) rotateY(-360deg)}62.49%{transform:translateZ(8px) rotateY(-449deg)}62.5%{transform:translateZ(8px) rotateY(-450deg)}75%{transform:translateZ(8px) rotateY(-540deg)}87.49%{transform:translateZ(8px) rotateY(-629deg)}87.5%{transform:translateZ(8px) rotateY(-630deg)}100%{transform:translateZ(8px) rotateY(-720deg)}}@keyframes search-spinner-emoji{0%,12.49%{content:"🦑"}12.5%,37.49%{content:"🦞"}37.5%,62.49%{content:"🦐"}62.5%,87.49%{content:"🦀"}87.5%,100%{content:"🦑"}}@media(prefers-reduced-motion:reduce){.search-spinner,.search-spinner-emoji:before,.search-molty strong{animation:none}} +.docs-chat{position:fixed;top:0;right:0;bottom:0;width:min(380px,calc(100vw - 28px));z-index:80;pointer-events:none}.docs-chat-launcher{position:absolute;right:18px;bottom:18px;height:46px;border:1px solid color-mix(in srgb,var(--brand) 48%,var(--line-strong));border-radius:var(--oc-radius-control);background:var(--paper);color:var(--ink);display:flex;align-items:center;gap:9px;padding:0 17px 0 var(--oc-space-2);font-weight:650;cursor:pointer;box-shadow:var(--oc-shadow-lg);pointer-events:auto;overflow:hidden;isolation:isolate;transition:transform var(--oc-duration-fast) var(--oc-ease-out),border-color var(--oc-duration-fast) var(--oc-ease-out),box-shadow var(--oc-duration-fast) var(--oc-ease-out)}.docs-chat.open .docs-chat-launcher{display:none}.docs-chat-launcher:after{content:none}.docs-chat-launcher:hover{border-color:var(--brand);color:var(--ink)}.docs-chat-launcher:hover:after{opacity:1}.docs-chat-avatar{display:block;width:32px;height:32px;border-radius:var(--oc-radius-round);object-fit:contain;flex:0 0 auto}.docs-chat-launcher .docs-chat-avatar{width:30px;height:30px}.docs-chat-title .docs-chat-avatar{width:34px;height:34px}.docs-chat-panel{position:absolute;inset:0;display:none;grid-template-rows:auto auto minmax(0,1fr) auto;background:color-mix(in srgb,var(--paper) 94%,var(--oc-bg-page) 6%);border-left:1px solid var(--line-strong);box-shadow:var(--oc-shadow-lg);overflow:hidden;pointer-events:auto}.docs-chat.open .docs-chat-panel{display:grid}.docs-chat-head{display:flex;align-items:center;justify-content:space-between;gap:var(--oc-space-3);min-height:64px;padding:14px 14px 13px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--paper-2) 88%,transparent)}.docs-chat-head p{margin:0 0 2px;color:var(--brand);font-size:var(--oc-font-size-xs);font-weight:850;text-transform:uppercase}.docs-chat-head h2{margin:0;color:var(--ink);font:760 18px/1.1 var(--oc-font-body)}.docs-chat-actions{display:flex;align-items:center;gap:7px}.docs-chat-icon{position:relative;display:grid;place-items:center;width:34px;height:34px;border:1px solid transparent;border-radius:var(--oc-radius-control);background:transparent;color:var(--muted);padding:0;line-height:1;cursor:pointer;transition:background var(--oc-duration-fast) var(--oc-ease-out),border-color var(--oc-duration-fast) var(--oc-ease-out),color var(--oc-duration-fast) var(--oc-ease-out)}.docs-chat-icon .icon{width:17px;height:17px}.docs-chat-icon:hover{border-color:color-mix(in srgb,var(--brand) 38%,var(--line-strong));background:color-mix(in srgb,var(--paper-2) 82%,transparent);color:var(--ink)}.docs-chat-icon:disabled{opacity:.35;cursor:not-allowed}.docs-chat-icon[data-copy-state="copied"]{color:var(--brand);border-color:color-mix(in srgb,var(--brand) 44%,var(--line-strong));background:color-mix(in srgb,var(--soft) 70%,transparent)}.docs-chat-minimize{font-size:22px}.docs-chat-clear[hidden]{display:none}.docs-chat-auth{padding:14px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--paper) 92%,var(--oc-bg-page) 8%)}.docs-chat-auth[hidden]{display:none}.docs-chat-auth-card{border:1px solid var(--line-strong);border-radius:var(--oc-radius-surface);background:color-mix(in srgb,var(--paper-2) 86%,transparent);padding:14px}.docs-chat-auth-card p{margin:0 0 var(--oc-space-4);color:var(--text);font-size:var(--oc-font-size-base);line-height:1.45;text-wrap:balance}.docs-chat-auth-card strong{display:block;color:var(--ink);font:760 var(--oc-font-size-md)/1.25 var(--oc-font-body);margin-bottom:var(--oc-space-2)}.docs-chat-verify{display:inline-flex;align-items:center;justify-content:center;gap:9px;min-height:40px;border:1px solid var(--brand);border-radius:var(--oc-radius-control);background:var(--brand);color:var(--on-brand)!important;font-weight:850;padding:0 14px;text-decoration:none!important}.docs-chat-github-icon{width:18px;height:18px;fill:currentColor;flex:0 0 auto}.docs-chat-verify:hover{background:var(--oc-accent-primary-hover);color:var(--on-brand)!important}.docs-chat-log{overflow:auto;padding:14px 14px var(--oc-space-4);display:flex;flex-direction:column;gap:10px}.docs-chat-message{max-width:94%;border:1px solid var(--line);border-radius:var(--oc-radius-surface);padding:10px var(--oc-space-3);overflow-wrap:break-word}.docs-chat-message p{margin:0 0 .7em}.docs-chat-message p:last-child{margin-bottom:0}.docs-chat-message a{color:var(--brand);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px;word-break:break-word}.docs-chat-message code{background:var(--code);border:1px solid var(--line-strong);border-radius:var(--oc-radius-inset);padding:.05em .32em;color:var(--code-text);font-size:.9em}.docs-chat-code{margin:.35em 0 .85em;border:1px solid var(--line-strong);border-radius:var(--oc-radius-surface);background:color-mix(in srgb,var(--code) 92%,var(--oc-bg-page) 8%);overflow:hidden;box-shadow:var(--oc-shadow-md)}.docs-chat-code-head{display:flex;align-items:center;min-height:28px;padding:5px 10px;border-bottom:1px solid var(--line);color:var(--muted);font-size:11px;font-weight:800;letter-spacing:.04em;text-transform:uppercase}.docs-chat-code pre{margin:0;padding:var(--oc-space-3);overflow:auto;white-space:pre;line-height:1.55}.docs-chat-code code{display:block;background:transparent!important;border:0!important;border-radius:var(--oc-radius-inset)!important;padding:0!important;color:var(--code-text);font-size:var(--oc-font-size-xs)}.docs-chat-message.user{align-self:flex-end;background:var(--brand);border-color:var(--brand);color:var(--on-brand)}.docs-chat-message.assistant{align-self:flex-start;background:var(--paper-2);color:var(--text)}.docs-chat-message.thinking{padding:14px;min-height:42px;display:inline-flex;align-items:center}.docs-chat-thinking{display:inline-flex;gap:7px;align-items:flex-end;height:14px}.docs-chat-thinking span{width:7px;height:7px;border-radius:var(--oc-radius-round);background:var(--muted);animation:docs-chat-dot 1.25s var(--oc-ease-out) infinite;will-change:transform,opacity,background-color}.docs-chat-thinking span:nth-child(2){animation-delay:.18s}.docs-chat-thinking span:nth-child(3){animation-delay:.36s}@keyframes docs-chat-dot{0%,80%,100%{opacity:.3;transform:translateY(0) scale(.85);background:var(--muted)}40%{opacity:1;transform:translateY(-5px) scale(1);background:var(--brand)}}@media(prefers-reduced-motion:reduce){.docs-chat-thinking span{animation-duration:2.4s;animation-name:docs-chat-dot-fade}@keyframes docs-chat-dot-fade{0%,100%{opacity:.35}50%{opacity:1}}}.docs-chat-message.error{border-color:color-mix(in srgb,var(--oc-status-error-fg) 52%,var(--line-strong));color:var(--oc-status-error-fg);background:color-mix(in srgb,var(--oc-status-error-bg) 72%,var(--paper))}.docs-chat-form{display:grid;grid-template-columns:1fr auto;gap:10px;padding:var(--oc-space-3);border-top:1px solid var(--line);background:var(--paper)}.docs-chat-form[hidden]{display:none}.docs-chat-form textarea{resize:none;min-height:50px;max-height:160px;border:1px solid var(--oc-input-border);border-radius:var(--oc-radius-control);background:var(--oc-input-bg);color:var(--ink);padding:var(--oc-space-3) var(--oc-space-3);line-height:1.35}.docs-chat-form textarea:focus{outline:2px solid var(--oc-input-focus-ring);border-color:var(--oc-input-focus-border)}.docs-chat-form button{align-self:end;display:grid;place-items:center;width:42px;height:42px;border:1px solid var(--brand);border-radius:var(--oc-radius-control);background:var(--brand);color:var(--on-brand);font-weight:850;padding:0;cursor:pointer}.docs-chat-form button .icon{width:18px;height:18px}.docs-chat-form button:disabled{opacity:.55;cursor:wait} +.docs-chat{top:auto;right:18px;bottom:18px;width:min(420px,calc(100vw - 36px));height:min(680px,calc(100vh - 36px));transition:width var(--oc-duration-ui) var(--oc-ease-out),height var(--oc-duration-ui) var(--oc-ease-out)}.docs-chat-launcher{right:0;bottom:0}.docs-chat.expanded{width:min(760px,calc(100vw - 36px));height:min(860px,calc(100vh - 36px))}.docs-chat.open{pointer-events:auto}.docs-chat:not(.open):not(.closing){right:18px!important}.docs-chat.open .docs-chat-launcher,.docs-chat.closing .docs-chat-launcher{display:flex;opacity:0;visibility:hidden;pointer-events:none}.docs-chat-panel{display:grid;opacity:0;transform:translateY(10px) scale(.985);transform-origin:bottom right;pointer-events:none;transition:transform var(--oc-duration-ui) var(--oc-ease-out),opacity var(--oc-duration-fast) var(--oc-ease-out)}.docs-chat.open .docs-chat-panel{display:grid;opacity:1;transform:none;pointer-events:auto}.docs-chat-maximize[aria-pressed="true"]{border-color:color-mix(in srgb,var(--brand) 44%,var(--line-strong));background:color-mix(in srgb,var(--soft) 68%,transparent);color:var(--ink)}.docs-chat-maximize .icon{transition:none}@media(prefers-reduced-motion:reduce){.docs-chat,.docs-chat-panel{transition:none}} +.docs-chat-panel{grid-template-rows:auto auto minmax(0,1fr) auto;inline-size:100%;min-width:0;max-width:100%;background:var(--bg);border:1px solid var(--line-strong);border-radius:var(--oc-radius-surface);box-shadow:var(--oc-shadow-lg);overflow:hidden}.docs-chat-panel>*{min-width:0;max-width:100%}.docs-chat-head{grid-row:1;min-height:58px;overflow:hidden;padding:10px 14px;background:var(--bg);border-bottom:1px solid var(--line);cursor:grab;touch-action:none;user-select:none}.docs-chat.dragging .docs-chat-head{cursor:grabbing}.docs-chat-title{display:flex;align-items:center;gap:10px;flex:1 1 auto;min-width:0}.docs-chat-mark{display:grid;place-items:center;flex:0 0 28px;width:28px;height:28px;color:var(--brand);filter:drop-shadow(0 0 12px color-mix(in srgb,var(--brand) 35%,transparent))}.docs-chat-mark .icon{width:25px;height:25px;stroke-width:1.8}.docs-chat-head h2{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:500 var(--oc-font-size-lg)/1.05 var(--oc-font-mono);letter-spacing:.04em}.docs-chat-actions{flex:0 0 auto;min-width:0;gap:6px}.docs-chat-icon{width:29px;height:29px;border-radius:var(--oc-radius-control);color:color-mix(in srgb,var(--muted) 82%,transparent)}.docs-chat-icon[hidden]{display:none}.docs-chat-icon .icon{width:17px;height:17px}.docs-chat-copy[data-copy-state] .icon{display:none}.docs-chat-copy[data-copy-state]:before{font:900 var(--oc-font-size-md)/1 var(--oc-font-body)}.docs-chat-copy[data-copy-state="copied"]:before{content:"✓"}.docs-chat-copy[data-copy-state="failed"]:before{content:"!"}.docs-chat-minimize{font-size:27px;font-weight:320}.docs-chat-log{grid-row:3;min-width:0;overflow-x:hidden;padding:var(--oc-space-5) 22px 18px;gap:var(--oc-space-3)}.docs-chat-message{max-width:min(86%,calc(100% - 28px));min-width:0;overflow-wrap:anywhere;word-break:break-word}.docs-chat-message.user{margin-right:0}.docs-chat-code{max-width:100%}.docs-chat-empty{max-width:300px;margin:0 auto;color:color-mix(in srgb,var(--muted) 72%,transparent);text-align:center;font:500 var(--oc-font-size-md)/1.45 var(--oc-font-mono);letter-spacing:.03em}.docs-chat-form{grid-row:4;position:relative;display:block;width:100%;min-width:0;max-width:100%;overflow:hidden;padding:var(--oc-space-4) 22px 22px;border-top:0;background:linear-gradient(180deg,transparent,color-mix(in srgb,var(--bg) 96%,var(--oc-bg-page) 4%) 22%)}.docs-chat:not([data-chat-auth-state="ready"]) .docs-chat-form{display:none}.docs-chat-form textarea{display:block;inline-size:100%;max-width:100%;min-width:0;min-height:118px;max-height:158px;border-radius:var(--oc-radius-control);padding:20px 66px 42px 20px;background:var(--oc-input-bg);font-size:16px;line-height:1.5;overflow:hidden}.docs-chat-form textarea:focus{outline:0;border-color:var(--oc-input-focus-border);box-shadow:inset 0 0 0 1px var(--oc-input-focus-ring),inset 0 0 0 4px var(--oc-input-focus-ring)}.docs-chat-form button{position:absolute;right:34px;bottom:34px;width:38px;height:38px;border-radius:var(--oc-radius-control)}.docs-chat-auth{grid-row:4;align-self:end;border-top:1px solid var(--line);border-bottom:0;background:var(--bg);padding:var(--oc-space-4) 22px 22px}.docs-chat-auth-card{border-radius:var(--oc-radius-surface)} +.oc-chart-mark,.oc-chart-donut-key{position:relative}.oc-chart-mark:focus-visible,.oc-chart-line-svg circle:focus-visible,.oc-chart-donut-segment:focus-visible,.oc-chart-donut-key:focus-visible{outline:2px solid var(--oc-focus-ring);outline-offset:3px}.oc-chart-mark[data-tip]:hover:after,.oc-chart-mark[data-tip]:focus:after,.oc-chart-donut-key[data-tip]:hover:after,.oc-chart-donut-key[data-tip]:focus:after{content:attr(data-tip);position:absolute;left:50%;bottom:calc(100% + 9px);transform:translateX(-50%);z-index:30;width:max-content;max-width:min(260px,calc(100vw - 40px));padding:7px 9px;border:1px solid var(--tooltip-border);border-radius:var(--oc-radius-control);background:var(--tooltip-bg);color:var(--tooltip-text);font:760 var(--oc-font-size-xs)/1.25 var(--oc-font-body);box-shadow:var(--shadow);pointer-events:none}.oc-chart-mark[data-tip]:hover:before,.oc-chart-mark[data-tip]:focus:before,.oc-chart-donut-key[data-tip]:hover:before,.oc-chart-donut-key[data-tip]:focus:before{content:"";position:absolute;left:50%;bottom:calc(100% + 4px);transform:translateX(-50%) rotate(45deg);z-index:31;width:8px;height:8px;background:var(--tooltip-bg);pointer-events:none}.oc-chart-area-fill{fill:color-mix(in srgb,var(--brand) 18%,transparent)}.oc-chart-donut-wrap{display:grid;grid-template-columns:minmax(170px,220px) minmax(0,1fr);gap:18px;align-items:center}.oc-chart-donut-svg{display:block;width:100%;height:auto}.oc-chart-donut-bg{fill:none;stroke:color-mix(in srgb,var(--line-strong) 72%,transparent);stroke-width:28}.oc-chart-donut-segment{fill:none;stroke:var(--oc-chart-tone);stroke-width:28;stroke-linecap:butt;stroke-dasharray:var(--oc-chart-share) 100;stroke-dashoffset:calc(var(--oc-chart-offset) * -1);transition:stroke-width var(--oc-duration-fast) var(--oc-ease-out),opacity var(--oc-duration-fast) var(--oc-ease-out)}.oc-chart-donut-segment:hover,.oc-chart-donut-segment:focus{stroke-width:32;opacity:.92}.oc-chart-donut-svg text:first-of-type{fill:var(--ink);font:780 var(--oc-font-size-2xl)/1 var(--oc-font-body)}.oc-chart-donut-svg text:last-of-type{fill:var(--muted);font:760 11px/1 var(--oc-font-body);text-transform:uppercase}.oc-chart-donut-legend{display:grid;gap:var(--oc-space-2)}.oc-chart-donut-key{display:grid;grid-template-columns:10px minmax(0,1fr) auto;gap:var(--oc-space-2);align-items:center;color:var(--text);font-size:var(--oc-font-size-xs)}.oc-chart-donut-key i{width:10px;height:10px;border-radius:var(--oc-radius-inset);background:var(--oc-chart-tone)}.oc-chart-donut-key span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.oc-chart-donut-key strong{color:var(--ink);font:760 var(--oc-font-size-xs)/1 var(--oc-font-body)}.oc-callout{--callout-surface:var(--paper);background:var(--callout-surface);border-color:var(--line-strong);border-left-color:var(--callout-accent);box-shadow:none}.oc-callout strong:before{background:var(--paper)}:root[data-theme="light"] .oc-callout{background:var(--paper);border-color:var(--line-strong);border-left-color:var(--callout-accent)}:root[data-theme="light"] .oc-callout strong:before{background:var(--paper);box-shadow:0 0 0 3px var(--paper)} +.page-feedback{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:18px 22px;border-top:1px solid var(--line);margin-top:42px;padding-top:18px}.page-feedback-prompt{display:flex;align-items:center;gap:9px;min-width:0;flex-wrap:wrap}.page-feedback-prompt>span{display:inline-flex;align-items:center;color:var(--text)}.page-feedback-composer{grid-column:1/-1;display:grid;gap:11px}.page-feedback-composer[hidden]{display:none}.page-feedback-composer textarea{width:100%;min-height:110px;resize:vertical;border:1px solid var(--oc-input-border);border-radius:var(--oc-radius-control);background:color-mix(in srgb,var(--bg) 80%,var(--paper) 20%);color:var(--ink);padding:13px 14px}.page-feedback-composer textarea:focus{outline:0;border-color:var(--oc-input-focus-border);box-shadow:0 0 0 3px var(--oc-input-focus-ring)}.page-feedback-submit{display:inline-flex;align-items:center;justify-content:center;gap:var(--oc-space-2);justify-self:end;min-height:38px;border:1px solid color-mix(in srgb,var(--brand) 46%,var(--line-strong));border-radius:var(--oc-radius-control);background:color-mix(in srgb,var(--paper) 76%,transparent);color:var(--brand);padding:0 13px;font:800 var(--oc-font-size-xs)/1 var(--oc-font-body);white-space:nowrap}.page-feedback-submit .icon{width:15px;height:15px}.page-feedback-submit:hover{border-color:var(--brand);color:var(--ink);background:color-mix(in srgb,var(--soft) 52%,transparent)} +@media(max-width:620px){.page-feedback{grid-template-columns:1fr;padding:var(--oc-space-4)}.page-feedback-links{margin-left:0}.page-feedback-composer{max-width:none}.page-feedback-submit{width:max-content}} +.docs-chat-message.user a,.docs-chat-message.user a:visited{color:inherit;text-decoration-color:color-mix(in srgb,currentColor 72%,transparent)}.docs-chat-message.user a:hover,.docs-chat-message.user a:focus-visible{color:var(--oc-text-on-accent);text-decoration-color:currentColor} +@media(max-width:1120px){html{scroll-padding-top:calc(var(--sticky-header-h) + 54px)}.header-row{grid-template-columns:auto 1fr auto;padding:0 var(--oc-space-5)}.tabs{padding:0 var(--oc-space-5)}.oc-card-grid.oc-card-cols-4{grid-template-columns:repeat(2,minmax(0,1fr))}.doc-shell{grid-template-columns:220px minmax(0,1fr);gap:34px;padding-left:24px;padding-right:24px}.sidebar{top:148px;max-height:calc(100vh - 172px);padding-right:4px}.nav-section{margin-bottom:26px}.nav-link{padding:6px 10px;font-size:var(--oc-font-size-sm)}.main{grid-template-columns:minmax(0,1fr)}.toc{position:fixed;left:calc(24px + 220px + 34px);top:calc(var(--sticky-header-h) + 8px);z-index:60;width:max-content;max-width:calc(100vw - 302px);max-height:none;margin:0;padding:0;overflow:visible;background:transparent;color:var(--muted);font-size:var(--oc-font-size-sm);opacity:0;visibility:hidden;pointer-events:none;transform:translateY(-4px);transition:opacity var(--oc-duration-fast) var(--oc-ease-out),transform var(--oc-duration-fast) var(--oc-ease-out),visibility var(--oc-duration-fast) var(--oc-ease-out)}.toc.is-visible,.toc[open]{opacity:1;visibility:visible;pointer-events:auto;transform:none}.toc h2{display:none}.toc summary{display:flex;align-items:center;gap:var(--oc-space-2);min-height:34px;padding:0 11px;border:1px solid var(--line-strong);border-radius:var(--oc-radius-control);background:color-mix(in srgb,var(--paper) 90%,transparent);color:var(--ink);font:760 var(--oc-font-size-xs)/1 var(--oc-font-body);cursor:pointer;list-style:none;box-shadow:var(--oc-shadow-md)}.toc summary::-webkit-details-marker{display:none}.toc summary:after{content:"";width:6px;height:6px;border-right:1.25px solid color-mix(in srgb,currentColor 72%,transparent);border-bottom:1.25px solid color-mix(in srgb,currentColor 72%,transparent);transform:rotate(45deg);margin-top:-3px}.toc[open] summary{border-color:color-mix(in srgb,var(--brand) 38%,var(--line-strong));background:color-mix(in srgb,var(--soft) 62%,var(--paper) 38%)}.toc[open] summary:after{transform:rotate(225deg);margin-top:3px}.toc nav{position:absolute;left:0;top:calc(100% + 8px);display:none;width:min(340px,calc(100vw - 302px));max-height:min(58vh,520px);overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable;padding:var(--oc-space-2) 11px var(--oc-space-2) var(--oc-space-2);border:1px solid color-mix(in srgb,var(--line-strong) 82%,var(--brand) 18%);border-radius:var(--oc-radius-surface);background:color-mix(in srgb,var(--paper) 92%,var(--soft) 8%);box-shadow:var(--shadow)}.toc[open] nav{display:grid;gap:2px}.toc a{display:block;max-width:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:var(--oc-radius-control);padding:var(--oc-space-2) 9px;color:var(--text)}.toc a:hover,.toc a.active{background:var(--soft);color:var(--ink)}.toc-l3{padding-left:18px!important}}@media(max-width:820px){html{scroll-padding-top:calc(var(--sticky-header-h) + 50px)}.site-header{position:sticky}.header-row{height:auto;min-height:0;grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"menu brand actions" "search search search";align-items:center;padding:10px 14px var(--oc-space-3);gap:10px var(--oc-space-3)}.header-left{grid-area:brand;justify-self:center;gap:10px;min-width:0}.brand img{width:22px;height:22px}.language-trigger{width:40px;height:40px;padding:0;justify-content:center;border:1px solid var(--line-strong);background:var(--paper)}.language-current,.language-chevron{display:none}.language-menu{left:auto;right:0;transform:none;width:min(390px,calc(100vw - 28px));max-height:min(72vh,620px)}.search-button{grid-area:search;width:100%;height:40px}.header-links{grid-area:actions;justify-self:end;gap:var(--oc-space-2)}.theme-toggle{width:40px;height:40px;border:1px solid var(--line-strong)!important;border-radius:var(--oc-radius-control);background:var(--paper)!important}.nav-toggle{grid-area:menu;display:inline-flex;align-items:center;justify-content:center;justify-self:start;width:40px;height:40px;padding:0}.tabs{display:none}.doc-shell{display:block;padding:26px 20px 86px}.toc{left:20px;top:calc(var(--sticky-header-h) + 8px);max-width:calc(100vw - 40px)}.toc nav{width:min(340px,calc(100vw - 40px));max-height:min(62vh,560px)}.toc summary{min-height:36px}body.nav-open{overflow:hidden}body.nav-open:before{content:"";position:fixed;inset:0;z-index:75;background:color-mix(in srgb,var(--oc-bg-page) 58%,transparent);backdrop-filter:blur(2px)}.sidebar{position:fixed;inset:0 auto 0 0;width:min(360px,calc(100vw - 28px));z-index:90;transform:translateX(calc(-100% - 1px));transition:transform var(--oc-duration-ui) var(--oc-ease-out);background:var(--bg);border-right:1px solid var(--line);padding:18px 18px 28px;max-height:none;box-shadow:var(--oc-shadow-lg);mask-image:none;-webkit-mask-image:none}.sidebar.open{transform:translateX(0)}.sidebar-close{display:flex;align-items:center;justify-content:center;width:100%;height:40px;margin:0 0 18px;border:1px solid var(--line-strong);border-radius:var(--oc-radius-control);background:var(--paper);color:var(--ink);font:760 var(--oc-font-size-sm)/1 var(--oc-font-body)}.breadcrumbs{white-space:normal}.article-meta-row .page-tools{flex:0 0 auto}.breadcrumbs .breadcrumb-group{display:none}.page-tools,.page-feedback{flex-wrap:wrap}.article h1{font-size:28px}.oc-card-grid,.oc-card-group,.oc-card-grid.oc-card-cols-3,.oc-card-grid.oc-card-cols-4,.oc-tile-group,.oc-cta-grid,.oc-stat-grid{grid-template-columns:1fr}.oc-steps{margin-left:18px}.oc-step{padding-left:30px}.oc-tabs,.oc-code-group{margin-left:0;margin-right:0}.oc-tab{padding:18px}.doc pre{white-space:pre-wrap;overflow-wrap:anywhere}.doc pre code{white-space:pre-wrap;min-width:0}.doc .code-line{white-space:pre-wrap;overflow-wrap:anywhere}.oc-code-tabs{overflow-x:auto}.oc-code-tab{flex:0 0 auto}.next{text-align:left}.page-nav{grid-template-columns:1fr}.oc-chart-donut-wrap{grid-template-columns:1fr}.docs-chat,.docs-chat.expanded{right:14px;bottom:14px;width:min(390px,calc(100vw - 28px));height:min(680px,calc(100vh - 28px))}.docs-chat:not(.open):not(.closing){right:14px!important}.docs-chat-launcher{right:0;bottom:0;height:44px;padding:0 14px}.docs-chat-head{min-height:58px;padding:var(--oc-space-3)}.docs-chat-panel{box-shadow:var(--oc-shadow-lg)}} @media(max-width:1120px){.oc-card-grid.oc-card-cols-4,.oc-card-group.oc-card-cols-4{--oc-card-columns:2;grid-template-columns:repeat(var(--oc-card-columns),minmax(0,1fr))}}@media(max-width:820px){.oc-card-grid,.oc-card-group,.oc-card-grid.oc-card-cols-1,.oc-card-group.oc-card-cols-1,.oc-card-grid.oc-card-cols-2,.oc-card-group.oc-card-cols-2,.oc-card-grid.oc-card-cols-3,.oc-card-group.oc-card-cols-3,.oc-card-grid.oc-card-cols-4,.oc-card-group.oc-card-cols-4{--oc-card-columns:1;grid-template-columns:1fr}} .oc-mermaid{position:relative} .oc-mermaid-actions{position:absolute;top:10px;right:10px;z-index:2;display:flex;gap:6px} -.oc-mermaid-expand{display:grid;place-items:center;width:34px;height:34px;border:1px solid color-mix(in srgb,var(--line-strong) 82%,transparent);border-radius:0;background:color-mix(in srgb,var(--paper) 88%,transparent);color:var(--muted);box-shadow:0 12px 34px rgba(0,0,0,.28);cursor:pointer} +.oc-mermaid-expand{display:grid;place-items:center;width:34px;height:34px;border:1px solid color-mix(in srgb,var(--line-strong) 82%,transparent);border-radius:var(--oc-radius-control);background:color-mix(in srgb,var(--paper) 88%,transparent);color:var(--muted);box-shadow:var(--oc-shadow-md);cursor:pointer} .oc-mermaid-expand:hover,.oc-mermaid-expand:focus-visible{outline:0;border-color:color-mix(in srgb,var(--brand) 46%,var(--line-strong));background:color-mix(in srgb,var(--soft) 66%,var(--paper) 34%);color:var(--ink)} .oc-mermaid-expand .icon{width:17px;height:17px;min-width:17px;max-width:17px;stroke-width:2.1} -.oc-mermaid-overlay{position:fixed;inset:0;z-index:120;display:none;padding:22px;background:rgba(0,0,0,.68);backdrop-filter:blur(5px)} -.oc-mermaid-overlay.open{display:grid;grid-template-rows:auto minmax(0,1fr);gap:12px} +.oc-mermaid-overlay{position:fixed;inset:0;z-index:120;display:none;padding:22px;background:color-mix(in srgb,var(--oc-bg-page) 68%,transparent);backdrop-filter:blur(5px)} +.oc-mermaid-overlay.open{display:grid;grid-template-rows:auto minmax(0,1fr);gap:var(--oc-space-3)} .oc-mermaid-overlay-head{display:flex;justify-content:flex-end} -.oc-mermaid-overlay-close{display:grid;place-items:center;width:38px;height:38px;border:1px solid var(--line-strong);border-radius:0;background:color-mix(in srgb,var(--paper) 90%,transparent);color:var(--muted);cursor:pointer} +.oc-mermaid-overlay-close{display:grid;place-items:center;width:38px;height:38px;border:1px solid var(--line-strong);border-radius:var(--oc-radius-control);background:color-mix(in srgb,var(--paper) 90%,transparent);color:var(--muted);cursor:pointer} .oc-mermaid-overlay-close:hover,.oc-mermaid-overlay-close:focus-visible{outline:0;border-color:color-mix(in srgb,var(--brand) 46%,var(--line-strong));background:color-mix(in srgb,var(--soft) 64%,var(--paper) 36%);color:var(--ink)} .oc-mermaid-overlay-close .icon{width:18px;height:18px;min-width:18px;max-width:18px} -.oc-mermaid-overlay-canvas{min-height:0;overflow:auto;overscroll-behavior:contain;border:1px solid var(--line-strong);border-radius:0;background:color-mix(in srgb,var(--paper) 94%,transparent);padding:24px;box-shadow:var(--shadow)} +.oc-mermaid-overlay-canvas{min-height:0;overflow:auto;overscroll-behavior:contain;border:1px solid var(--line-strong);border-radius:var(--oc-radius-surface);background:color-mix(in srgb,var(--paper) 94%,transparent);padding:var(--oc-space-5);box-shadow:var(--shadow)} .oc-mermaid-overlay-canvas svg{display:block;width:max-content;min-width:min(1040px,100%);max-width:none;height:auto;margin:auto} .oc-mermaid-overlay-canvas pre{margin:0;white-space:pre;min-width:max-content} .has-mermaid-overlay{overflow:hidden} -.language-menu{top:calc(100% + 8px);width:min(270px,calc(100vw - 32px));max-height:min(62vh,430px);padding:6px;border-radius:0;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--brand) 58%,transparent) transparent;box-shadow:0 22px 70px rgba(0,0,0,.48)} +.language-menu{top:calc(100% + 8px);width:min(270px,calc(100vw - 32px));max-height:min(62vh,430px);padding:6px;border-radius:var(--oc-radius-surface);scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--brand) 58%,transparent) transparent;box-shadow:var(--oc-shadow-lg)} .language-menu::-webkit-scrollbar{width:8px} .language-menu::-webkit-scrollbar-track{background:transparent} -.language-menu::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--brand) 58%,transparent);border:2px solid transparent;border-radius:999px;background-clip:content-box} -.language-option{grid-template-columns:24px minmax(0,1fr) 18px;gap:8px;padding:8px 10px;border-radius:0;font-size:15px;line-height:1.15} +.language-menu::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--brand) 58%,transparent);border:2px solid transparent;border-radius:var(--oc-radius-round);background-clip:content-box} +.language-option{grid-template-columns:24px minmax(0,1fr) 18px;gap:var(--oc-space-2);padding:var(--oc-space-2) 10px;border-radius:var(--oc-radius-control);font-size:var(--oc-font-size-md);line-height:1.15} .language-check{font-size:16px} @media(max-width:820px){.language-menu{width:min(300px,calc(100vw - 28px));max-height:min(62vh,430px)}.language-native{display:block;position:absolute;inset:0;width:100%;height:100%;margin:0;padding:0;border:0;opacity:0;font-size:16px;z-index:2;cursor:pointer;-webkit-appearance:none;appearance:none}} @media(max-width:640px){.sidebar{width:100vw;border-right:0}} -.site-footer{border-top:1px solid var(--line);margin-top:24px} -.site-footer-inner{max-width:1780px;margin:0 auto;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px 24px;padding:26px 200px 26px 56px;color:var(--muted);font:500 12px/1.6 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace} +.site-footer{border-top:1px solid var(--line);margin-top:var(--oc-space-5)} +.site-footer-inner{max-width:1780px;margin:0 auto;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--oc-space-3) var(--oc-space-5);padding:26px 200px 26px 56px;color:var(--muted);font:500 var(--oc-font-size-xs)/1.6 var(--oc-font-mono)} .site-footer-note{margin:0} .site-footer-note a{color:var(--text);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px} .site-footer-note a:hover{color:var(--brand)} @@ -69,7 +78,7 @@ export function siteCss() { @media(max-width:820px){.site-footer-inner{flex-direction:column;align-items:flex-start;padding:22px 20px 88px}} .docs-chat-head{overflow:visible} .docs-chat-actions{position:relative;z-index:3} -.docs-chat-icon:is(:hover,:focus-visible):not(:disabled):after{content:attr(aria-label);position:absolute;top:calc(100% + 8px);right:0;z-index:80;width:max-content;max-width:min(240px,calc(100vw - 40px));padding:7px 9px;border:1px solid var(--tooltip-border);border-radius:0;background:var(--tooltip-bg);color:var(--tooltip-text);font:760 12px/1.25 Switzer,ui-sans-serif,system-ui,sans-serif;box-shadow:var(--shadow);pointer-events:none;white-space:nowrap} +.docs-chat-icon:is(:hover,:focus-visible):not(:disabled):after{content:attr(aria-label);position:absolute;top:calc(100% + 8px);right:0;z-index:80;width:max-content;max-width:min(240px,calc(100vw - 40px));padding:7px 9px;border:1px solid var(--tooltip-border);border-radius:var(--oc-radius-control);background:var(--tooltip-bg);color:var(--tooltip-text);font:760 var(--oc-font-size-xs)/1.25 var(--oc-font-body);box-shadow:var(--shadow);pointer-events:none;white-space:nowrap} ${maturityCss} `; } @@ -199,7 +208,7 @@ initTocScrollspy(); document.addEventListener("change",(e)=>{const sel=e.target.closest("[data-language-native]");if(sel&&sel.value)location.assign(sel.value)}); document.addEventListener("click",async e=>{const pageActions=e.target.closest(".page-actions");document.querySelectorAll(".page-actions-more[open]").forEach(menu=>{if(!pageActions?.contains(menu))menu.removeAttribute("open")});const toc=e.target.closest(".toc");document.querySelectorAll(".toc[open]").forEach(menu=>{if(compactTocQuery.matches&&!toc?.contains(menu))menu.open=false});const tocLink=e.target.closest(".toc a");if(tocLink){tocSpyHoldUntil=Date.now()+900;setActiveTocLink(tocLinkId(tocLink));if(compactTocQuery.matches)tocLink.closest(".toc").open=false}if(handleDocsControlClick(e))return;const theme=e.target.closest("[data-theme-toggle]");if(theme){const next=root.dataset.theme==="dark"?"light":"dark";root.dataset.theme=next;localStorage.setItem("theme",next);initMermaid(true);return}const trigger=e.target.closest("[data-language-trigger]");if(trigger){e.stopPropagation();toggleLanguage();return}const picker=document.querySelector("[data-language-picker]");if(picker&&!picker.contains(e.target))closeLanguage();const navToggle=e.target.closest("[data-nav-toggle]");if(navToggle){setNavOpen(!document.body.classList.contains("nav-open"));return}if(e.target.closest("[data-nav-close]")){setNavOpen(false);return}if(document.body.classList.contains("nav-open")&&!e.target.closest(".sidebar")){setNavOpen(false);return}if(e.target.closest("[data-search-open]")){openSearch();return}if(e.target.closest("[data-search-clear]")){clearSearch();input?.focus();return}const link=e.target.closest("a[href]");if(!link)return;if(link.closest("[data-language-picker]"))return;if(link.target||link.download||!isPlainLeftClick(e))return;const url=new URL(link.href,location.href);if(url.pathname===location.pathname&&url.search===location.search&&url.hash)return;if(!isDocsPage(url))return;e.preventDefault();closeSearch();const ok=await navigateTo(url);if(!ok)location.href=url.href}); addEventListener("keydown",e=>{handleMermaidOverlayKeydown(e)},{capture:true});modal?.addEventListener("click",e=>{if(e.target===modal)closeSearch()});function isEditableTarget(target){return target instanceof Element&&!!target.closest("input,textarea,select,[contenteditable]")}function isSearchShortcutEvent(e){return (e.metaKey||e.ctrlKey)&&!e.altKey&&!e.shiftKey&&(e.code==="KeyK"||String(e.key).toLowerCase()==="k")}function searchFocusable(){return [...modal?.querySelectorAll("a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\\\"-1\\\"])")||[]].filter(el=>!el.hidden&&el.getAttribute("aria-hidden")!=="true"&&el.offsetParent!==null)}function trapSearchFocus(e){if(e.key!=="Tab"||!modal?.classList.contains("open"))return false;const items=searchFocusable();if(!items.length){e.preventDefault();input?.focus();return true}const first=items[0];const last=items[items.length-1];if(!modal.contains(document.activeElement)){e.preventDefault();first.focus();return true}if(e.shiftKey&&document.activeElement===first){e.preventDefault();last.focus();return true}if(!e.shiftKey&&document.activeElement===last){e.preventDefault();first.focus();return true}return false}addEventListener("keydown",e=>{if(trapSearchFocus(e))return;if(isSearchShortcutEvent(e)){if(!isEditableTarget(e.target)){e.preventDefault();e.stopPropagation();openSearch()}return}if(e.key==="Escape"){closeSearch();document.querySelectorAll(".page-actions-more[open]").forEach(menu=>menu.removeAttribute("open"));document.querySelectorAll(".toc[open]").forEach(menu=>{if(compactTocQuery.matches)menu.open=false});closeLanguage();setNavOpen(false)}},{capture:true}); -addEventListener("popstate",()=>{const key=location.pathname+location.search;if(key===currentDocKey){tocSpyHoldUntil=Date.now()+900;if(location.hash)setActiveTocLink(decodeURIComponent(location.hash.slice(1)));return}navigateTo(new URL(location.href),true)}); +addEventListener("popstate",()=>{closeMermaidOverlay();const key=location.pathname+location.search;if(key===currentDocKey){tocSpyHoldUntil=Date.now()+900;if(location.hash)setActiveTocLink(decodeURIComponent(location.hash.slice(1)));return}navigateTo(new URL(location.href),true)}); document.addEventListener("scroll",e=>{if(e.target?.classList?.contains("sidebar"))updateSidebarFade()},{capture:true,passive:true}); let tocScrollRaf=0;function scheduleTocDisclosure(){if(tocScrollRaf)return;tocScrollRaf=requestAnimationFrame(()=>{tocScrollRaf=0;syncTocDisclosure()})}addEventListener("scroll",scheduleTocDisclosure,{passive:true});addEventListener("scrollend",scheduleTocDisclosure,{passive:true}); let tabResizeRaf=0;addEventListener("resize",()=>{syncStickyHeaderOffset();syncTocDisclosure();cancelAnimationFrame(tabResizeRaf);tabResizeRaf=requestAnimationFrame(()=>{placeTabUnderline(false);updateSidebarFade()})}); diff --git a/scripts/docs-site/build.mjs b/scripts/docs-site/build.mjs index 5fdf516e1c..5d52c9af8c 100644 --- a/scripts/docs-site/build.mjs +++ b/scripts/docs-site/build.mjs @@ -304,7 +304,7 @@ ${canonicalUrl ? ` - + ${siteHeader(page, nav, activeTab)}
${sidebar(page, nav, activeTab)} @@ -488,7 +488,7 @@ function pageStatus(page) { if (meta.since) badges.push([`Since ${meta.since}`, "since"]); if (meta.updated) badges.push([`Updated ${meta.updated}`, "updated"]); return badges.length - ? `
${badges.map(([label, kind]) => `${escapeHtml(label)}`).join("")}
` + ? `
${badges.map(([label, kind]) => `${escapeHtml(label)}`).join("")}
` : ""; } @@ -553,7 +553,7 @@ function tocHtml(items) { function pager(prev, next) { if (!prev && !next) return ""; - return ``; + return ``; } function pageFeedback(page) { @@ -561,7 +561,7 @@ function pageFeedback(page) { const editLink = editUrl ? `Edit source` : ""; const pagePath = pageRoute(page); const canonicalUrl = `${docsOrigin()}${pagePath}`; - return `
Was this useful?
`; + return `
Was this useful?
`; } function raiseIssueUrl(page) { diff --git a/scripts/docs-site/maturity.css b/scripts/docs-site/maturity.css index a304406bd5..592be9d82a 100644 --- a/scripts/docs-site/maturity.css +++ b/scripts/docs-site/maturity.css @@ -1,8 +1,8 @@ .maturity-hero { display: grid; - gap: 14px; + gap: var(--oc-space-4); margin: 10px 0 38px; - padding: 4px 0 26px 20px; + padding: var(--oc-space-1) 0 26px var(--oc-space-5); border-bottom: 1px solid color-mix(in srgb, var(--brand) 22%, transparent); border-left: 3px solid var(--brand); } @@ -15,7 +15,7 @@ max-width: 46rem; margin: 0; color: var(--ink); - font: 750 36px / 1.08 Switzer, ui-sans-serif, system-ui, sans-serif; + font: 750 36px / 1.08 var(--oc-font-display); letter-spacing: 0; } @@ -23,20 +23,20 @@ max-width: 58rem; margin: 0; color: var(--text); - font: 500 16px / 1.65 Switzer, ui-sans-serif, system-ui, sans-serif; + font: 500 var(--oc-font-size-xl) / 1.65 var(--oc-font-body); } .maturity-kicker { margin: 0; color: var(--brand); - font: 750 10px / 1.3 Switzer, ui-sans-serif, system-ui, sans-serif; + font: 750 10px / 1.3 var(--oc-font-body); letter-spacing: 0.1em; text-transform: uppercase; } .maturity-jump-links { margin: 0; - font-size: 13px; + font-size: var(--oc-font-size-sm); line-height: 1.5; } @@ -53,41 +53,41 @@ .maturity-score-stable, .maturity-band-stable { - color: #67c49a; + color: var(--oc-status-success-fg); } .maturity-score-beta, .maturity-band-beta { - color: #7eafd0; + color: var(--oc-status-info-fg); } .maturity-score-alpha, .maturity-band-alpha { - color: #e1a35d; + color: var(--oc-status-warning-fg); } .maturity-score-experimental, .maturity-band-experimental { - color: #df8177; + color: var(--oc-status-error-fg); } .maturity-score-clawesome, .maturity-band-clawesome { - color: #64c6ac; + color: var(--oc-accent-secondary); } .maturity-level-pill { display: inline-flex; align-items: center; - gap: 6px; + gap: var(--oc-space-2); width: max-content; max-width: 100%; - padding: 3px 8px; + padding: 3px var(--oc-space-2); border: 1px solid color-mix(in srgb, currentColor 34%, transparent); - border-radius: 2px; + border-radius: var(--oc-radius-control); background: color-mix(in srgb, currentColor 11%, transparent); color: inherit; - font: 750 10px / 1.25 Switzer, ui-sans-serif, system-ui, sans-serif; + font: 750 10px / 1.25 var(--oc-font-body); white-space: nowrap; } @@ -98,23 +98,23 @@ } .maturity-level-experimental { - color: #df8177; + color: var(--oc-status-error-fg); } .maturity-level-alpha { - color: #e1a35d; + color: var(--oc-status-warning-fg); } .maturity-level-beta { - color: #7eafd0; + color: var(--oc-status-info-fg); } .maturity-level-stable { - color: #67c49a; + color: var(--oc-status-success-fg); } .maturity-level-clawesome { - color: #64c6ac; + color: var(--oc-accent-secondary); } .maturity-summary-grid { @@ -127,7 +127,7 @@ .maturity-summary-item { display: grid; - gap: 10px; + gap: var(--oc-space-3); min-width: 0; padding: 18px 20px 18px 0; } @@ -146,12 +146,12 @@ .maturity-summary-value { display: inline-block; color: var(--ink); - font: 750 30px / 1 Switzer, ui-sans-serif, system-ui, sans-serif; + font: 750 30px / 1 var(--oc-font-display); } .maturity-summary-heading > span:not(.maturity-summary-value) { color: var(--text); - font: 700 13px / 1.2 Switzer, ui-sans-serif, system-ui, sans-serif; + font: 700 var(--oc-font-size-sm) / 1.2 var(--oc-font-body); } .maturity-summary-bar { @@ -208,7 +208,7 @@ } .maturity-band-title { - font-size: 12px; + font-size: var(--oc-font-size-xs); font-weight: 700; } @@ -289,7 +289,7 @@ .maturity-surface-row { display: grid; grid-template-columns: minmax(190px, 1.55fr) repeat(3, minmax(110px, 1fr)) minmax(72px, 0.55fr); - gap: 12px; + gap: var(--oc-space-3); align-items: center; min-width: 0; padding: 13px 0; @@ -306,7 +306,7 @@ padding: 0 0 9px; border-top: 0; color: var(--muted); - font: 750 10px / 1.2 Switzer, ui-sans-serif, system-ui, sans-serif; + font: 750 10px / 1.2 var(--oc-font-body); letter-spacing: 0.04em; text-transform: uppercase; } @@ -326,7 +326,7 @@ .maturity-surface-title { overflow-wrap: anywhere; color: var(--ink); - font: 700 13px / 1.25 Switzer, ui-sans-serif, system-ui, sans-serif; + font: 700 var(--oc-font-size-sm) / 1.25 var(--oc-font-body); } .maturity-surface-meta { @@ -374,17 +374,17 @@ .maturity-lts::before { width: 6px; height: 6px; - border-radius: 50%; + border-radius: var(--oc-radius-round); background: currentColor; content: ""; } .maturity-lts-partial { - color: #e1a35d; + color: var(--oc-status-warning-fg); } .maturity-lts-full { - color: #67c49a; + color: var(--oc-status-success-fg); } .maturity-evidence-grid { @@ -409,7 +409,7 @@ .maturity-evidence-title { color: var(--ink); - font: 700 13px / 1.3 Switzer, ui-sans-serif, system-ui, sans-serif; + font: 700 var(--oc-font-size-sm) / 1.3 var(--oc-font-body); } .maturity-evidence-card span { @@ -421,7 +421,7 @@ .maturity-readiness-summary { margin: 0 0 12px; color: var(--muted); - font-size: 12px; + font-size: var(--oc-font-size-xs); } .maturity-readiness-list, @@ -446,7 +446,7 @@ .maturity-category-row-header { padding: 8px 0; color: var(--muted); - font: 750 10px / 1.2 Switzer, ui-sans-serif, system-ui, sans-serif; + font: 750 10px / 1.2 var(--oc-font-body); letter-spacing: 0.04em; opacity: 0.72; text-transform: uppercase; @@ -473,21 +473,21 @@ } .maturity-readiness-status-ready { - color: #67c49a; + color: var(--oc-status-success-fg); } .maturity-readiness-status-partially-reviewed { - color: #e1a35d; + color: var(--oc-status-warning-fg); } .maturity-readiness-status-needs-review { - color: #df8177; + color: var(--oc-status-error-fg); } .maturity-category-row { display: grid; grid-template-columns: minmax(180px, 1.55fr) repeat(3, minmax(100px, 1fr)) minmax(140px, 1.2fr); - gap: 12px; + gap: var(--oc-space-3); align-items: center; padding: 12px 0; border-top: 1px solid color-mix(in srgb, var(--brand) 11%, transparent); @@ -526,7 +526,7 @@ .maturity-level-row { display: grid; grid-template-columns: minmax(130px, 0.32fr) minmax(0, 1fr); - gap: 4px 14px; + gap: var(--oc-space-1) var(--oc-space-4); padding: 13px 0; border-top: 1px solid color-mix(in srgb, var(--brand) 11%, transparent); } @@ -538,20 +538,20 @@ .maturity-level-title { grid-row: span 2; color: var(--ink); - font-size: 13px; + font-size: var(--oc-font-size-sm); font-weight: 700; } .maturity-level-row span, .maturity-level-promotion { color: var(--muted); - font-size: 12px; + font-size: var(--oc-font-size-xs); line-height: 1.45; } .maturity-surface-link { display: grid; - gap: 3px; + gap: var(--oc-space-1); margin: 0; padding: 11px 0; border-bottom: 1px solid color-mix(in srgb, currentColor 14%, transparent); @@ -563,7 +563,7 @@ } .maturity-surface-link .maturity-surface-title { - font-size: 13px; + font-size: var(--oc-font-size-sm); } .maturity-surface-link > .maturity-surface-meta { @@ -615,12 +615,12 @@ .maturity-surface-row { grid-template-columns: minmax(160px, 1.35fr) repeat(3, minmax(98px, 1fr)) minmax(70px, 0.5fr); - gap: 8px; + gap: var(--oc-space-2); } .maturity-category-row { grid-template-columns: minmax(160px, 1.35fr) repeat(3, minmax(86px, 1fr)) minmax(110px, 1fr); - gap: 8px; + gap: var(--oc-space-2); } } @@ -654,7 +654,7 @@ .maturity-surface-row { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); - gap: 9px 12px; + gap: 9px var(--oc-space-3); } .maturity-surface-metric { diff --git a/scripts/docs-site/mdx-ish.mjs b/scripts/docs-site/mdx-ish.mjs index f702d18821..93c1912a8f 100644 --- a/scripts/docs-site/mdx-ish.mjs +++ b/scripts/docs-site/mdx-ish.mjs @@ -483,7 +483,7 @@ function cardHtml(rawAttrs, selfClosing) { const title = attrs.title ?? attrs.name ?? "Open"; const icon = attrs.icon ? iconSvg(attrs.icon) : ""; const end = selfClosing ? "
" : ""; - return `${icon}
${escapeHtml(title)}${end}`; + return `${icon}
${escapeHtml(title)}${end}`; } function ctaCardHtml(rawAttrs, selfClosing) { @@ -493,7 +493,7 @@ function ctaCardHtml(rawAttrs, selfClosing) { const tone = slug(attrs.tone ?? attrs.variant ?? "default"); const icon = attrs.icon ? iconSvg(attrs.icon) : ""; const end = selfClosing ? `${ctaActions(attrs, "card")}
` : ""; - return `${icon}
${escapeHtml(title)}${attrs.kicker ? `${escapeHtml(attrs.kicker)}` : ""}${end}`; + return `${icon}
${escapeHtml(title)}${attrs.kicker ? `${escapeHtml(attrs.kicker)}` : ""}${end}`; } function ctaActions(attrs, context = "block") { @@ -511,7 +511,8 @@ function ctaActions(attrs, context = "block") { } function ctaLink(href, label, variant, nested = false) { - const className = `oc-cta-link oc-cta-link-${escapeAttr(variant)}`; + const actionVariant = variant === "primary" ? "primary" : "secondary"; + const className = `oc-action oc-action-${actionVariant} oc-cta-link oc-cta-link-${escapeAttr(variant)}`; return nested ? `${escapeHtml(label)}` : `${escapeHtml(label)}`; diff --git a/scripts/docs-site/smoke.mjs b/scripts/docs-site/smoke.mjs index 6098ce3100..7b045b1a38 100644 --- a/scripts/docs-site/smoke.mjs +++ b/scripts/docs-site/smoke.mjs @@ -10,6 +10,7 @@ import { parseFrontmatter } from "./frontmatter.mjs"; const root = process.cwd(); const site = path.join(root, "dist", "docs-site"); const docsDir = path.join(root, "docs"); +const workerSource = fs.readFileSync(path.join(root, "workers", "docs-router.ts"), "utf8"); const sourceMetadata = readSourceMetadata(root); const expectedOrigin = (process.env.DOCS_SITE_CANONICAL_ORIGIN ?? (process.env.DOCS_SITE_CNAME ? `https://${process.env.DOCS_SITE_CNAME}` : "https://docs.openclaw.ai")) @@ -48,6 +49,14 @@ if (!shellOnly) { "docs-search.json", ); } +if (!/--oc-bg-page: #101012/.test(workerSource) + || !/@media \(prefers-color-scheme: light\)/.test(workerSource) + || !/background: var\(--oc-bg-page\)/.test(workerSource) + || !/border-radius: var\(--oc-radius-surface\)/.test(workerSource) + || !/background var\(--oc-duration-fast\) var\(--oc-ease-out\)/.test(workerSource) + || /]+stylesheet/.test(workerSource)) { + throw new Error("worker 404: shared token foundation or self-contained rendering is missing"); +} const poison = [ /\banalysis\s+to=functions\./iu, /\b(?:commentary|final)\s+to=functions\./iu, @@ -214,7 +223,7 @@ if (!/data-chat-copy/.test(index) || !/data-chat-retry[^>]+hidden/.test(index) || !/\.docs-chat\.expanded/.test(chatCss) || !/\.docs-chat\{[^}]*height:min\(680px/.test(chatCss) - || !/\.docs-chat-panel\{[^}]*border-radius:0/.test(chatCss) + || !/\.docs-chat-panel\{[^}]*border-radius:var\(--oc-radius-surface\)/.test(chatCss) || !/\.docs-chat-panel>\*\{min-width:0;max-width:100%/.test(chatCss) || !/\.docs-chat-actions\{[^}]*gap:6px/.test(chatCss) || !/\.docs-chat-head\{overflow:visible\}/.test(chatCss) @@ -232,7 +241,7 @@ if (!/data-chat-copy/.test(index) || !/\.docs-chat-form button\{position:absolute;right:34px;bottom:34px/.test(chatCss) || !/\.docs-chat-auth\{[^}]*grid-row:4;align-self:end/.test(chatCss) || !/\.docs-chat-github-icon\{[^}]*fill:currentColor/.test(chatCss) - || !/\.docs-chat-avatar\{[^}]*border-radius:999px/.test(chatCss) + || !/\.docs-chat-avatar\{[^}]*border-radius:var\(--oc-radius-round\)/.test(chatCss) || !/translateY\(10px\) scale\(\.985\)/.test(chatCss)) { throw new Error("index: floating docs chat controls are missing"); } @@ -293,8 +302,9 @@ if (!/data-language-native/.test(index) || !/\.language-native\{display:block;position:absolute/.test(siteCss)) { throw new Error("assets: native language select fallback for coarse pointers is missing"); } -if (!/tocSpyHoldUntil/.test(siteJs) || !/key===currentDocKey/.test(siteJs)) { - throw new Error("assets: toc scrollspy hold and same-document popstate guard are missing"); +if (!/tocSpyHoldUntil/.test(siteJs) + || !/closeMermaidOverlay\(\);const key=location\.pathname\+location\.search;if\(key===currentDocKey\)\{tocSpyHoldUntil/.test(siteJs)) { + throw new Error("assets: toc scrollspy hold or Mermaid-safe same-document popstate guard is missing"); } if (/\.header-links a[\s{:.[]/.test(siteCss)) { throw new Error("assets: .header-links descendant anchor rules override .language-option layout; scope to .header-links>a"); @@ -325,6 +335,13 @@ if (!/class="site-footer"/.test(index) if (!/--code:#f2f0ec;--code-inline:#ecebe6;--code-block:#fffefc;--code-text:#26262c;--code-border:#dbd8d1;--code-shadow:none/.test(siteCss)) { throw new Error("assets: light code theme is not skinned"); } +if (!/--oc-status-success-bg: rgb\(34 197 94 \/ 0\.12\)/.test(siteCss) + || !/\.oc-app-surface\s*\{/.test(siteCss) + || !/\.oc-action\s*\{/.test(siteCss) + || !/class="oc-app-surface"/.test(index) + || !/class="oc-card oc-card-interactive"/.test(index)) { + throw new Error("assets: v0.0.1 product tokens and shared component primitives were not bundled and consumed"); +} if (/\.toc a:first-of-type/.test(siteCss)) { throw new Error("assets: first table-of-contents item is hard-highlighted"); } @@ -339,7 +356,7 @@ if (!fs.existsSync(path.join(site, "assets/mermaid.esm.min.mjs")) || !fs.existsSync(path.join(site, "assets/chunks/mermaid.esm.min"))) { throw new Error("assets: Mermaid runtime was not copied"); } -if (!/\.sidebar\{[^}]*padding:0 6px 64px 0;[^}]*scrollbar-gutter:stable/.test(siteCss)) { +if (!/\.sidebar\{[^}]*padding:0 6px var\(--oc-space-8\) 0;[^}]*scrollbar-gutter:stable/.test(siteCss)) { throw new Error("assets: sidebar scroll-end padding is missing"); } if (!/\.sidebar\{[^}]*scrollbar-width:thin;[^}]*scrollbar-color:/.test(siteCss) @@ -352,25 +369,28 @@ if (!/\.header-row,\.tabs\{max-width:1780px;margin:0 auto\}/.test(siteCss) || !/\.doc-shell\{display:grid;grid-template-columns:340px minmax\(0,1fr\);gap:72px;padding:38px 56px 90px\}/.test(siteCss)) { throw new Error("assets: docs shell geometry does not match the wide reference layout"); } -if (!/body\{[^}]*font:15px\/1\.7 Switzer,ui-sans-serif/.test(siteCss) +if (!/body\{[^}]*font:var\(--oc-font-size-md\)\/1\.7 var\(--oc-font-body\)/.test(siteCss) || !/::selection\{background:var\(--brand\);color:var\(--on-brand\)\}/.test(siteCss) || /body::before\{[^}]*background-image:radial-gradient/.test(siteCss) - || !/\.tab-link\{[^}]*font:700 13px\/1\.4 ui-monospace/.test(siteCss) - || !/\.article h1\{font:700 clamp\(34px,3\.8vw,44px\)\/1\.08/.test(siteCss) - || !/\.doc\{font-size:15px\}/.test(siteCss)) { + || !/\.tab-link\{[^}]*font:700 var\(--oc-font-size-sm\)\/1\.4 var\(--oc-font-mono\)/.test(siteCss) + || !/\.article h1\{font:700 clamp\(34px,3\.8vw,44px\)\/1\.08 var\(--oc-font-display\)/.test(siteCss) + || !/\.doc\{font-size:var\(--oc-font-size-md\)\}/.test(siteCss)) { throw new Error("assets: docs type scale drifted from the reference skin"); } -if (!/\.nav-section h2\{[^}]*ui-monospace[^}]*text-transform:uppercase/.test(siteCss) - || !/\.article-kicker\{[^}]*ui-monospace[^}]*text-transform:uppercase/.test(siteCss) - || !/\.toc h2\{[^}]*ui-monospace[^}]*text-transform:uppercase/.test(siteCss)) { +if (!/\.nav-section h2\{[^}]*var\(--oc-font-mono\)[^}]*text-transform:uppercase/.test(siteCss) + || !/\.article-kicker\{[^}]*var\(--oc-font-mono\)[^}]*text-transform:uppercase/.test(siteCss) + || !/\.toc h2\{[^}]*var\(--oc-font-mono\)[^}]*text-transform:uppercase/.test(siteCss)) { throw new Error("assets: mono label accents drifted from the reference skin"); } -if (!/--bg:#101012;--paper:#19191c;--paper-2:#202024;[^}]*--soft:#33211d/.test(siteCss) +if (!/--oc-palette-ink-950:\s*#101012/.test(siteCss) + || !/--bg:var\(--oc-bg-page\);--paper:var\(--oc-bg-surface\);--paper-2:var\(--oc-bg-elevated\)/.test(siteCss) + || !/--brand:var\(--oc-accent-primary\);--brand-2:var\(--oc-accent-primary-deep\)/.test(siteCss) + || !/--soft:var\(--oc-surface-accent-soft\)/.test(siteCss) || !/\.nav-link\.active\{border-left-color:var\(--brand\);color:var\(--brand\);font-weight:650\}/.test(siteCss)) { throw new Error("assets: dark sidebar surface is not reference-aligned"); } if (!/\.site-footer\{[^}]*border-top:1px solid var\(--line\)/.test(siteCss) - || !/\.site-footer-inner\{[^}]*ui-monospace/.test(siteCss)) { + || !/\.site-footer-inner\{[^}]*var\(--oc-font-mono\)/.test(siteCss)) { throw new Error("assets: site footer skin is missing"); } if (!/function syncSidebar/.test(siteJs) || !/async function navigateTo/.test(siteJs)) { @@ -389,7 +409,7 @@ if (!/function syncStickyHeaderOffset/.test(siteJs) } if (!/\.toc\{position:fixed;left:calc\(24px \+ 220px \+ 34px\);top:calc\(var\(--sticky-header-h\) \+ 8px\);z-index:60/.test(siteCss) || !/\.toc\.is-visible,\.toc\[open\]\{opacity:1;visibility:visible;pointer-events:auto;transform:none\}/.test(siteCss) - || !/\.toc summary\{display:flex;align-items:center;gap:8px/.test(siteCss) + || !/\.toc summary\{display:flex;align-items:center;gap:var\(--oc-space-2\)/.test(siteCss) || !/\.toc nav\{position:absolute;left:0;top:calc\(100% \+ 8px\);display:none;width:min\(340px,calc\(100vw - 302px\)\)/.test(siteCss) || !/Math\.max\(scrollY,document\.scrollingElement\?\.scrollTop\|\|0\)>8/.test(siteJs) || !/\.toc\[open\] nav\{display:grid;gap:2px\}/.test(siteCss)) { @@ -462,23 +482,22 @@ if (!/\.oc-step:last-child\{[^}]*border-image:linear-gradient\(to bottom,var\(-- } if (!/\.oc-callout\{[^}]*--callout-accent:var\(--brand\)[^}]*border-left:3px solid var\(--callout-accent\)/.test(siteCss) || !/\.oc-callout\{[^}]*background:var\(--callout-surface\);border-color:var\(--line-strong\);border-left-color:var\(--callout-accent\)/.test(siteCss) - || !/\.oc-callout-warning\{--callout-accent:#d97706\}/.test(siteCss) - || !/\.oc-callout-check\{--callout-accent:#48b49a\}/.test(siteCss)) { + || !/\.oc-callout-warning\{--callout-accent:var\(--oc-status-warning-fg\)\}/.test(siteCss) + || !/\.oc-callout-check\{--callout-accent:var\(--oc-status-success-fg\)\}/.test(siteCss)) { throw new Error("assets: callout tones should use reference-aligned component skin"); } if (!/\.oc-table-wrap\{[^}]*max-width:100%;overflow:auto/.test(siteCss) || !/\.doc code\{overflow-wrap:anywhere;word-break:break-word\}/.test(siteCss) || !/@media\(max-width:820px\)[\s\S]*?\.doc \.oc-table\{min-width:0;table-layout:fixed\}/.test(siteCss) - || !/:root\{--tooltip-bg:#ededed;--tooltip-text:#17171a;--tooltip-border:#ededed[^}]*\}/.test(siteCss) - || !/:root\[data-theme="light"\]\{--tooltip-bg:#17171a;--tooltip-text:#f6f5f3;--tooltip-border:#17171a\}/.test(siteCss) + || !/:root\{[^}]*--tooltip-bg:var\(--oc-text-primary\);--tooltip-text:var\(--oc-bg-page\);--tooltip-border:var\(--oc-text-primary\)/.test(siteCss) || !/\.oc-chart\{[^}]*border:1px solid var\(--line-strong\)/.test(siteCss) || !/\.oc-chart-mark\[data-tip\]:hover:after/.test(siteCss) || !/\.oc-chart-mark\[data-tip\]:hover:after,[^{]+\.oc-chart-donut-key\[data-tip\]:focus:after\{[^}]*background:var\(--tooltip-bg\);color:var\(--tooltip-text\)/.test(siteCss) || !/\.oc-chart-donut-segment\{[^}]*stroke-dasharray:var\(--oc-chart-share\)/.test(siteCss) || !/:root\[data-theme="light"\] \.oc-callout\{background:var\(--paper\);border-color:var\(--line-strong\);border-left-color:var\(--callout-accent\)\}/.test(siteCss) || !/\.oc-cta\{[^}]*grid-template-columns:minmax\(0,1fr\) auto/.test(siteCss) - || !/\.oc-cta-link\{[^}]*transition:background \.16s ease,border-color \.16s ease,color \.16s ease,filter \.16s ease/.test(siteCss) - || !/\.oc-cta-link:hover\{filter:brightness\(1\.04\)\}\.oc-cta-link-primary:hover\{background:color-mix\(in srgb,var\(--brand\) 86%,white 14%\);border-color:color-mix\(in srgb,var\(--brand\) 86%,white 14%\);color:var\(--on-brand\)\}\.oc-cta-link-secondary:hover\{background:color-mix\(in srgb,var\(--soft\) 62%,var\(--paper\) 38%\);border-color:color-mix\(in srgb,var\(--brand\) 44%,var\(--line-strong\)\);color:var\(--ink\)\}/.test(siteCss) + || !/\.oc-cta-link\{[^}]*transition:background var\(--oc-duration-fast\) var\(--oc-ease-out\),border-color var\(--oc-duration-fast\) var\(--oc-ease-out\),color var\(--oc-duration-fast\) var\(--oc-ease-out\),filter var\(--oc-duration-fast\) var\(--oc-ease-out\)/.test(siteCss) + || !/\.oc-cta-link:hover\{filter:brightness\(1\.04\)\}\.oc-cta-link-primary:hover\{background:var\(--oc-accent-primary-hover\);border-color:var\(--oc-accent-primary-hover\);color:var\(--on-brand\)\}/.test(siteCss) || !/\.oc-tooltip\[data-tip\]:hover:after,\.oc-tooltip\[data-tip\]:focus:after\{[^}]*background:var\(--tooltip-bg\);color:var\(--tooltip-text\)/.test(siteCss) || !/\.oc-pullquote\{[^}]*border-left:3px solid var\(--brand\)/.test(siteCss)) { throw new Error("assets: editorial components should keep the docs publishing skin"); @@ -505,7 +524,7 @@ for (const marker of [ 'class="oc-card-grid oc-card-cols-2"', 'class="oc-card-grid oc-card-cols-3"', 'class="oc-card-grid oc-card-cols-4"', - 'class="oc-card"', + 'class="oc-card oc-card-interactive"', 'class="oc-code"', 'class="oc-code is-expandable"', 'class="oc-code-group"', @@ -519,7 +538,7 @@ for (const marker of [ 'class="oc-frame"', 'class="oc-tooltip"', 'class="oc-param-default"', - 'class="page-status-badge page-status-beta"', + 'class="oc-pill page-status-badge page-status-beta"', 'Status: visual fixture', 'Applies to: docs shell', 'class="oc-badge oc-badge-orange"', @@ -539,7 +558,7 @@ for (const marker of [ 'class="oc-chart-donut-segment"', 'class="oc-cta oc-cta-default"', 'class="oc-cta-grid"', - 'class="oc-cta-card oc-cta-card-default"', + 'class="oc-card oc-card-interactive oc-cta-card oc-cta-card-default"', 'class="oc-table-wrap"', 'class="oc-table"', 'class="oc-mermaid"', diff --git a/scripts/docs-site/visual-smoke.mjs b/scripts/docs-site/visual-smoke.mjs index 3165a19d85..311ff7ded3 100644 --- a/scripts/docs-site/visual-smoke.mjs +++ b/scripts/docs-site/visual-smoke.mjs @@ -89,9 +89,19 @@ async function checkDesktop() { if (!mermaidOverlayFocus.activeInOverlay || !mermaidOverlayFocus.bodyLocked) { throw new Error(`mermaid overlay focus trap failed: ${JSON.stringify(mermaidOverlayFocus)}`); } - await page.evaluate(() => history.pushState({ docs: true }, "", "/")); + await page.evaluate(() => history.pushState({ docs: true }, "", `${location.pathname}#fixture-components`)); await page.goBack(); await page.locator("[data-mermaid-overlay].open").waitFor({ state: "hidden" }); + const sameDocumentOverlayClose = await page.evaluate(() => ({ + pathname: location.pathname, + overlayOpen: Boolean(document.querySelector("[data-mermaid-overlay].open")), + bodyLocked: document.body.classList.contains("has-mermaid-overlay"), + })); + if (sameDocumentOverlayClose.pathname !== "/__elements" + || sameDocumentOverlayClose.overlayOpen + || sameDocumentOverlayClose.bodyLocked) { + throw new Error(`same-document history left mermaid overlay open: ${JSON.stringify(sameDocumentOverlayClose)}`); + } await page.locator("[data-mermaid-expand]").first().click(); await page.locator("[data-mermaid-overlay].open").waitFor({ state: "visible" }); await page.keyboard.press("Meta+K"); @@ -544,7 +554,12 @@ async function checkMobile() { viewport: innerWidth, }; }); - if (!menu.bodyOpen || menu.ariaExpanded !== "true" || menu.sidebarLeft !== 0 || menu.sidebarRight !== menu.viewport || menu.sidebarWidth !== menu.viewport || !menu.closeVisible) { + if (!menu.bodyOpen + || menu.ariaExpanded !== "true" + || Math.abs(menu.sidebarLeft) >= 1 + || Math.abs(menu.sidebarRight - menu.viewport) >= 1 + || Math.abs(menu.sidebarWidth - menu.viewport) >= 1 + || !menu.closeVisible) { throw new Error(`mobile menu drawer failed (expected full-bleed on phones): ${JSON.stringify(menu)}`); } await page.keyboard.press("Escape"); @@ -696,7 +711,7 @@ async function checkLightMode() { minCardWidth: Math.min(...cardWidths), }; }); - if (skin.theme !== "light" || skin.codeText !== "#26262c" || skin.badgeRadius === "0px" || skin.minCardWidth < 150) { + if (skin.theme !== "light" || skin.codeText !== "#26262c" || skin.badgeRadius !== "0px" || skin.minCardWidth < 150) { throw new Error(`light visual skin failed: ${JSON.stringify(skin)}`); } await page.close(); diff --git a/skills-lock.json b/skills-lock.json new file mode 100644 index 0000000000..9bb46ef734 --- /dev/null +++ b/skills-lock.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "skills": { + "openclaw-brand": { + "source": "openclaw/design-system", + "sourceType": "github", + "skillPath": "openclaw-brand/SKILL.md", + "computedHash": "d4bf50bb9d512dbfbcd4abde7a75d8399b0187ca9486dd7854844aab0cd02e6a" + }, + "openclaw-design": { + "source": "openclaw/design-system", + "sourceType": "github", + "skillPath": "openclaw-design/SKILL.md", + "computedHash": "e01de6c8416328a4f3d85918e4237596a7b07f794c4399fd2ba781d60b0273a3" + }, + "openclaw-design-audit": { + "source": "openclaw/design-system", + "sourceType": "github", + "skillPath": "openclaw-design-audit/SKILL.md", + "computedHash": "12fec90fd4aa1aa569de1beb5a3c85d06887a5e548704dbd094355edc0f52ad3" + }, + "openclaw-design-system": { + "source": "openclaw/design-system", + "sourceType": "github", + "skillPath": "openclaw-design-system/SKILL.md", + "computedHash": "475604f08f37186237fa62605fbfe16ea04367af81f4c3a8c59bcb395ae70cca" + }, + "openclaw-marketing-pages": { + "source": "openclaw/design-system", + "sourceType": "github", + "skillPath": "openclaw-marketing-pages/SKILL.md", + "computedHash": "7da44d258d5a1e87b26535effa13cf20931fd04a884fd95225a4ff603932ef84" + } + } +} diff --git a/workers/docs-router.ts b/workers/docs-router.ts index e624040288..304d98f950 100644 --- a/workers/docs-router.ts +++ b/workers/docs-router.ts @@ -475,15 +475,58 @@ function docsNotFoundHtml(pathname: string): string {