{"documents":[{"href":"/docs/getting-started/what-these-are","title":"What these are","page":"What these are","section":"Getting started","summary":"A collection of small TypeScript packages that agree with each other, built on what the web platform already provides."},{"href":"/docs/getting-started/what-these-are#what-they-have-in-common","title":"What they have in common","page":"What these are","section":"Getting started"},{"href":"/docs/getting-started/what-these-are#what-they-are-not","title":"What they are not","page":"What these are","section":"Getting started"},{"href":"/docs/getting-started/what-these-are#where-to-go-next","title":"Where to go next","page":"What these are","section":"Getting started"},{"href":"/docs/getting-started/install-and-pin","title":"Install and pin","page":"Install and pin","section":"Getting started","summary":"How each package installs by its own name, why every package in a project shares one release date, and where the record of a release is kept."},{"href":"/docs/getting-started/install-and-pin#keep-every-package-on-one-date","title":"Keep every package on one date","page":"Install and pin","section":"Getting started"},{"href":"/docs/getting-started/install-and-pin#finding-out-what-changed","title":"Finding out what changed","page":"Install and pin","section":"Getting started"},{"href":"/docs/getting-started/your-first-handler","title":"Your first handler","page":"Your first handler","section":"Getting started","summary":"Three packages composed into a request handler that never throws, and what each line of it demonstrates."},{"href":"/docs/getting-started/your-first-handler#what-each-part-is-doing","title":"What each part is doing","page":"Your first handler","section":"Getting started"},{"href":"/docs/getting-started/your-first-handler#running-it","title":"Running it","page":"Your first handler","section":"Getting started"},{"href":"/docs/getting-started/your-first-handler#where-to-go-next","title":"Where to go next","page":"Your first handler","section":"Getting started"},{"href":"/docs/getting-started/the-sdxc-command","title":"The sdxc command","page":"The sdxc command","section":"Getting started","summary":"Start a project from a template, generate files where the layout puts them, copy UI components to edit, upgrade with a prompt for your agent, and run your app's own commands."},{"href":"/docs/getting-started/the-sdxc-command#start-a-project","title":"Start a project","page":"The sdxc command","section":"Getting started"},{"href":"/docs/getting-started/the-sdxc-command#configure-the-command-line","title":"Configure the command line","page":"The sdxc command","section":"Getting started"},{"href":"/docs/getting-started/the-sdxc-command#generate-files","title":"Generate files","page":"The sdxc command","section":"Getting started"},{"href":"/docs/getting-started/the-sdxc-command#make-the-generated-files-your-own","title":"Make the generated files your own","page":"The sdxc command","section":"Getting started"},{"href":"/docs/getting-started/the-sdxc-command#copy-a-ui-component-to-edit-it","title":"Copy a UI component to edit it","page":"The sdxc command","section":"Getting started"},{"href":"/docs/getting-started/the-sdxc-command#upgrade","title":"Upgrade","page":"The sdxc command","section":"Getting started"},{"href":"/docs/getting-started/the-sdxc-command#run-your-app-s-commands","title":"Run your app's commands","page":"The sdxc command","section":"Getting started"},{"href":"/docs/getting-started/the-sdxc-command#where-to-go-next","title":"Where to go next","page":"The sdxc command","section":"Getting started"},{"href":"/docs/conventions/result-everywhere","title":"Result everywhere","page":"Result everywhere","section":"Conventions","summary":"Every fallible entry point answers with a value instead of throwing, and what that buys you at the call site."},{"href":"/docs/conventions/result-everywhere#working-with-one","title":"Working with one","page":"Result everywhere","section":"Conventions"},{"href":"/docs/conventions/result-everywhere#crossing-the-boundary","title":"Crossing the boundary","page":"Result everywhere","section":"Conventions"},{"href":"/docs/conventions/result-everywhere#errors-carry-position","title":"Errors carry position","page":"Result everywhere","section":"Conventions"},{"href":"/docs/conventions/result-everywhere#what-still-throws","title":"What still throws","page":"Result everywhere","section":"Conventions"},{"href":"/docs/conventions/standard-schema-validation","title":"Standard Schema validation","page":"Standard Schema validation","section":"Conventions","summary":"Where a package needs a schema it accepts any Standard Schema, so the validation library is yours to choose."},{"href":"/docs/conventions/standard-schema-validation#what-that-looks-like","title":"What that looks like","page":"Standard Schema validation","section":"Conventions"},{"href":"/docs/conventions/standard-schema-validation#validating-on-your-own","title":"Validating on your own","page":"Standard Schema validation","section":"Conventions"},{"href":"/docs/conventions/standard-schema-validation#why-it-is-an-interface-rather-than-a-dependency","title":"Why it is an interface rather than a dependency","page":"Standard Schema validation","section":"Conventions"},{"href":"/docs/conventions/subpath-exports","title":"Subpath exports","page":"Subpath exports","section":"Conventions","summary":"A package is split into entry points so importing one concern leaves the others out of your bundle."},{"href":"/docs/conventions/subpath-exports#the-recurring-shapes","title":"The recurring shapes","page":"Subpath exports","section":"Conventions"},{"href":"/docs/conventions/subpath-exports#a-package-with-no-root","title":"A package with no root","page":"Subpath exports","section":"Conventions"},{"href":"/docs/conventions/subpath-exports#why-this-rather-than-more-packages","title":"Why this rather than more packages","page":"Subpath exports","section":"Conventions"},{"href":"/docs/conventions/naming","title":"Naming","page":"Naming","section":"Conventions","summary":"What a package name tells you, and the conventions its exports follow, so the next package reads like the last one."},{"href":"/docs/conventions/naming#package-names","title":"Package names","page":"Naming","section":"Conventions"},{"href":"/docs/conventions/naming#symmetric-pairs","title":"Symmetric pairs","page":"Naming","section":"Conventions"},{"href":"/docs/conventions/naming#prefixes-that-mean-something","title":"Prefixes that mean something","page":"Naming","section":"Conventions"},{"href":"/docs/conventions/naming#types-live-in-a-namespace-beside-the-value","title":"Types live in a namespace beside the value","page":"Naming","section":"Conventions"},{"href":"/docs/conventions/naming#options-are-named-at-the-call-site","title":"Options are named at the call site","page":"Naming","section":"Conventions"},{"href":"/docs/building-remix-apps/wire-the-router","title":"Wire the router: middleware, context and services","page":"Wire the router: middleware, context and services","section":"Building Remix apps","summary":"Build the global middleware chain once, publish services onto the request context, and let tests swap them."},{"href":"/docs/building-remix-apps/wire-the-router#one-logger-per-worker","title":"One logger per worker","page":"Wire the router: middleware, context and services","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/wire-the-router#the-composition-root","title":"The composition root","page":"Wire the router: middleware, context and services","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/wire-the-router#publishing-a-service","title":"Publishing a service","page":"Wire the router: middleware, context and services","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/wire-the-router#reading-it-from-a-handler","title":"Reading it from a handler","page":"Wire the router: middleware, context and services","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/wire-the-router#swapping-it-in-a-test","title":"Swapping it in a test","page":"Wire the router: middleware, context and services","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/wire-the-router#where-to-go-next","title":"Where to go next","page":"Wire the router: middleware, context and services","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/forms-and-params","title":"Validate forms and route params","page":"Validate forms and route params","section":"Building Remix apps","summary":"Turn form posts, query strings, route params and JSON bodies into typed values, and answer each failure with the right response."},{"href":"/docs/building-remix-apps/forms-and-params#describe-the-form-as-a-schema","title":"Describe the form as a schema","page":"Validate forms and route params","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/forms-and-params#validate-in-the-action","title":"Validate in the action","page":"Validate forms and route params","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/forms-and-params#render-the-issues","title":"Render the issues","page":"Validate forms and route params","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/forms-and-params#validate-route-params","title":"Validate route params","page":"Validate forms and route params","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/forms-and-params#validate-the-query-string","title":"Validate the query string","page":"Validate forms and route params","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/forms-and-params#answer-an-api-client","title":"Answer an API client","page":"Validate forms and route params","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/forms-and-params#where-to-go-next","title":"Where to go next","page":"Validate forms and route params","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/interface-with-remix-ui","title":"Build the interface with remix/component","page":"Build the interface with remix/component","section":"Building Remix apps","summary":"Compose pages from @sdxc/ui components, lay them out with @sdxc/u mixins, and hydrate only the island that needs script."},{"href":"/docs/building-remix-apps/interface-with-remix-ui#the-stylesheets","title":"The stylesheets","page":"Build the interface with remix/component","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/interface-with-remix-ui#compose-a-card","title":"Compose a card","page":"Build the interface with remix/component","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/interface-with-remix-ui#layout-with-mixins","title":"Layout with mixins","page":"Build the interface with remix/component","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/interface-with-remix-ui#a-dialog-with-no-script","title":"A dialog with no script","page":"Build the interface with remix/component","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/interface-with-remix-ui#an-island-only-where-it-s-needed","title":"An island, only where it's needed","page":"Build the interface with remix/component","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/interface-with-remix-ui#where-to-go-next","title":"Where to go next","page":"Build the interface with remix/component","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/translate-your-app","title":"Translate your app","page":"Translate your app","section":"Building Remix apps","summary":"Detect each request's language, translate MessageFormat 2 messages in handlers, views, jobs and islands, and catch broken copy in a test."},{"href":"/docs/building-remix-apps/translate-your-app#write-the-messages","title":"Write the messages","page":"Translate your app","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/translate-your-app#detect-the-language-per-request","title":"Detect the language per request","page":"Translate your app","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/translate-your-app#translate-in-a-handler","title":"Translate in a handler","page":"Translate your app","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/translate-your-app#messages-with-markup","title":"Messages with markup","page":"Translate your app","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/translate-your-app#reach-the-translator-from-any-component","title":"Reach the translator from any component","page":"Translate your app","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/translate-your-app#let-the-visitor-choose","title":"Let the visitor choose","page":"Translate your app","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/translate-your-app#translate-outside-a-request","title":"Translate outside a request","page":"Translate your app","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/translate-your-app#catch-broken-messages-in-a-test","title":"Catch broken messages in a test","page":"Translate your app","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/translate-your-app#where-to-go-next","title":"Where to go next","page":"Translate your app","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/seo-sitemaps-and-robots","title":"SEO, sitemaps and robots.txt","page":"SEO, sitemaps and robots.txt","section":"Building Remix apps","summary":"Give every page one canonical URL and structured data, and serve sitemap.xml, robots.txt and security.txt from routes."},{"href":"/docs/building-remix-apps/seo-sitemaps-and-robots#one-instance-for-the-site","title":"One instance for the site","page":"SEO, sitemaps and robots.txt","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/seo-sitemaps-and-robots#head-metadata-from-the-layout","title":"Head metadata from the layout","page":"SEO, sitemaps and robots.txt","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/seo-sitemaps-and-robots#structured-data-from-a-page","title":"Structured data from a page","page":"SEO, sitemaps and robots.txt","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/seo-sitemaps-and-robots#serve-the-sitemap","title":"Serve the sitemap","page":"SEO, sitemaps and robots.txt","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/seo-sitemaps-and-robots#serve-robots-txt","title":"Serve robots.txt","page":"SEO, sitemaps and robots.txt","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/seo-sitemaps-and-robots#serve-security-txt","title":"Serve security.txt","page":"SEO, sitemaps and robots.txt","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/seo-sitemaps-and-robots#where-to-go-next","title":"Where to go next","page":"SEO, sitemaps and robots.txt","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/values","title":"Dates, text and identifiers","page":"Dates, text and identifiers","section":"Building Remix apps","summary":"Mint prefixed record IDs, slug and summarize titles, show dates in the viewer's zone, and compare client versions."},{"href":"/docs/building-remix-apps/values#mint-record-ids","title":"Mint record ids","page":"Dates, text and identifiers","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/values#keep-uuids-typed-below-the-edge","title":"Keep UUIDs typed below the edge","page":"Dates, text and identifiers","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/values#derive-the-title-slug-and-summary","title":"Derive the title, slug and summary","page":"Dates, text and identifiers","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/values#create-and-address-the-record","title":"Create and address the record","page":"Dates, text and identifiers","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/values#show-dates-in-the-viewer-s-zone","title":"Show dates in the viewer's zone","page":"Dates, text and identifiers","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/values#compare-client-versions","title":"Compare client versions","page":"Dates, text and identifiers","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/values#where-to-go-next","title":"Where to go next","page":"Dates, text and identifiers","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/router-utilities","title":"Canonical URLs, lazy routes and header fields","page":"Canonical URLs, lazy routes and header fields","section":"Building Remix apps","summary":"Redirect to one canonical host and path, end a request with a thrown Response, load routes on demand, and read structured headers."},{"href":"/docs/building-remix-apps/router-utilities#one-canonical-path","title":"One canonical path","page":"Canonical URLs, lazy routes and header fields","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/router-utilities#one-canonical-host","title":"One canonical host","page":"Canonical URLs, lazy routes and header fields","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/router-utilities#end-a-request-from-any-depth","title":"End a request from any depth","page":"Canonical URLs, lazy routes and header fields","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/router-utilities#import-each-route-on-first-use","title":"Import each route on first use","page":"Canonical URLs, lazy routes and header fields","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/router-utilities#read-and-write-structured-header-fields","title":"Read and write structured header fields","page":"Canonical URLs, lazy routes and header fields","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/router-utilities#where-to-go-next","title":"Where to go next","page":"Canonical URLs, lazy routes and header fields","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/nested-fields","title":"Read nested query strings and forms","page":"Read nested query strings and forms","section":"Building Remix apps","summary":"Read bracket keys like filter[status][] and items[0][quantity] into typed objects and arrays, from a URL or a form post, and write them back."},{"href":"/docs/building-remix-apps/nested-fields#how-keys-read","title":"How keys read","page":"Read nested query strings and forms","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/nested-fields#filter-a-list-from-the-query-string","title":"Filter a list from the query string","page":"Read nested query strings and forms","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/nested-fields#write-the-filters-as-a-form","title":"Write the filters as a form","page":"Read nested query strings and forms","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/nested-fields#link-to-another-page-of-the-same-view","title":"Link to another page of the same view","page":"Read nested query strings and forms","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/nested-fields#read-a-form-with-nested-fields","title":"Read a form with nested fields","page":"Read nested query strings and forms","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/nested-fields#name-the-inputs","title":"Name the inputs","page":"Read nested query strings and forms","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/nested-fields#validate-in-the-action","title":"Validate in the action","page":"Read nested query strings and forms","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/nested-fields#submit-a-nested-form-from-code","title":"Submit a nested form from code","page":"Read nested query strings and forms","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/nested-fields#where-to-go-next","title":"Where to go next","page":"Read nested query strings and forms","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/qr-codes","title":"Draw QR codes","page":"Draw QR codes","section":"Building Remix apps","summary":"Encode a link at the error correction level its surface needs, render it inline with remix/component, and serve it as an SVG file from a route."},{"href":"/docs/building-remix-apps/qr-codes#encode-the-link","title":"Encode the link","page":"Draw QR codes","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/qr-codes#keep-a-code-inside-its-layout","title":"Keep a code inside its layout","page":"Draw QR codes","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/qr-codes#render-it-on-a-page","title":"Render it on a page","page":"Draw QR codes","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/qr-codes#serve-it-as-an-svg-file","title":"Serve it as an SVG file","page":"Draw QR codes","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/qr-codes#where-to-go-next","title":"Where to go next","page":"Draw QR codes","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/load-content-as-readers-reach-it","title":"Load content as readers reach it","page":"Load content as readers reach it","section":"Building Remix apps","summary":"Defer a list's next page until the reader scrolls near it and a dialog's content until it opens, keep the address bar on the page being read, and keep plain links for browsers running no script."},{"href":"/docs/building-remix-apps/load-content-as-readers-reach-it#register-the-client-entry","title":"Register the client entry","page":"Load content as readers reach it","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/load-content-as-readers-reach-it#start-from-a-link","title":"Start from a link","page":"Load content as readers reach it","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/load-content-as-readers-reach-it#answer-the-frame-with-a-fragment","title":"Answer the frame with a fragment","page":"Load content as readers reach it","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/load-content-as-readers-reach-it#load-the-next-page-as-the-reader-scrolls","title":"Load the next page as the reader scrolls","page":"Load content as readers reach it","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/load-content-as-readers-reach-it#keep-the-address-bar-on-the-page-being-read","title":"Keep the address bar on the page being read","page":"Load content as readers reach it","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/load-content-as-readers-reach-it#walk-the-list-back-up","title":"Walk the list back up","page":"Load content as readers reach it","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/load-content-as-readers-reach-it#load-a-dialog-s-content-when-it-opens","title":"Load a dialog's content when it opens","page":"Load content as readers reach it","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/load-content-as-readers-reach-it#test-it","title":"Test it","page":"Load content as readers reach it","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/load-content-as-readers-reach-it#where-to-go-next","title":"Where to go next","page":"Load content as readers reach it","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/keyboard-shortcuts","title":"Keyboard shortcuts","page":"Keyboard shortcuts","section":"Building Remix apps","summary":"Bind page-wide keys with keymap(), print each hint in the reader's own key caps, list them in a shortcuts panel, and announce what a key did."},{"href":"/docs/building-remix-apps/keyboard-shortcuts#write-each-combo-once","title":"Write each combo once","page":"Keyboard shortcuts","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/keyboard-shortcuts#print-hints-in-the-reader-s-key-caps","title":"Print hints in the reader's key caps","page":"Keyboard shortcuts","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/keyboard-shortcuts#bind-the-keys","title":"Bind the keys","page":"Keyboard shortcuts","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/keyboard-shortcuts#where-the-keys-stand-down","title":"Where the keys stand down","page":"Keyboard shortcuts","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/keyboard-shortcuts#list-the-shortcuts","title":"List the shortcuts","page":"Keyboard shortcuts","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/keyboard-shortcuts#announce-what-a-key-did","title":"Announce what a key did","page":"Keyboard shortcuts","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/keyboard-shortcuts#bind-outside-a-component","title":"Bind outside a component","page":"Keyboard shortcuts","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/keyboard-shortcuts#where-to-go-next","title":"Where to go next","page":"Keyboard shortcuts","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/calendars-and-date-ranges","title":"Calendars, date ranges and time zones","page":"Calendars, date ranges and time zones","section":"Building Remix apps","summary":"Lay out a month calendar in the viewer's zone, read a report's day range from the query string, and let people pick their time zone from the runtime's own list."},{"href":"/docs/building-remix-apps/calendars-and-date-ranges#lay-out-a-month","title":"Lay out a month","page":"Calendars, date ranges and time zones","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/calendars-and-date-ranges#put-events-on-the-grid","title":"Put events on the grid","page":"Calendars, date ranges and time zones","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/calendars-and-date-ranges#read-a-report-s-day-range","title":"Read a report's day range","page":"Calendars, date ranges and time zones","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/calendars-and-date-ranges#let-people-pick-their-time-zone","title":"Let people pick their time zone","page":"Calendars, date ranges and time zones","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/calendars-and-date-ranges#where-to-go-next","title":"Where to go next","page":"Calendars, date ranges and time zones","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/search-dialog","title":"Build a search dialog","page":"Build a search dialog","section":"Building Remix apps","summary":"Open a search dialog from every page's header, show live results in a frame as the reader types, fall back to a plain results page, and announce what each search found."},{"href":"/docs/building-remix-apps/search-dialog#two-routes","title":"Two routes","page":"Build a search dialog","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/search-dialog#open-the-dialog-from-the-header","title":"Open the dialog from the header","page":"Build a search dialog","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/search-dialog#answer-the-frame-with-a-fragment","title":"Answer the frame with a fragment","page":"Build a search dialog","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/search-dialog#cache-what-the-dialog-asks-for","title":"Cache what the dialog asks for","page":"Build a search dialog","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/search-dialog#render-the-box-and-the-matches","title":"Render the box and the matches","page":"Build a search dialog","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/search-dialog#reload-the-frame-as-the-reader-types","title":"Reload the frame as the reader types","page":"Build a search dialog","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/search-dialog#the-full-results-page","title":"The full results page","page":"Build a search dialog","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/search-dialog#accessibility-at-a-glance","title":"Accessibility at a glance","page":"Build a search dialog","section":"Building Remix apps"},{"href":"/docs/building-remix-apps/search-dialog#where-to-go-next","title":"Where to go next","page":"Build a search dialog","section":"Building Remix apps"},{"href":"/docs/http-apis/json-apis","title":"Build a JSON API with problem details","page":"Build a JSON API with problem details","section":"HTTP APIs","summary":"A small resource API that validates bodies, answers failures as RFC 9457 problems, pages its lists and states its rate limit."},{"href":"/docs/http-apis/json-apis#declare-the-problem-catalog","title":"Declare the problem catalog","page":"Build a JSON API with problem details","section":"HTTP APIs"},{"href":"/docs/http-apis/json-apis#validate-the-body-and-create","title":"Validate the body and create","page":"Build a JSON API with problem details","section":"HTTP APIs"},{"href":"/docs/http-apis/json-apis#answer-a-missing-resource","title":"Answer a missing resource","page":"Build a JSON API with problem details","section":"HTTP APIs"},{"href":"/docs/http-apis/json-apis#page-the-list","title":"Page the list","page":"Build a JSON API with problem details","section":"HTTP APIs"},{"href":"/docs/http-apis/json-apis#rate-limit-the-api","title":"Rate limit the API","page":"Build a JSON API with problem details","section":"HTTP APIs"},{"href":"/docs/http-apis/json-apis#where-to-go-next","title":"Where to go next","page":"Build a JSON API with problem details","section":"HTTP APIs"},{"href":"/docs/http-apis/openapi","title":"Describe your API with OpenAPI","page":"Describe your API with OpenAPI","section":"HTTP APIs","summary":"Turn the schemas your handlers validate with into an OpenAPI 3.1 document, serve it, and test responses against it."},{"href":"/docs/http-apis/openapi#swap-the-schema-import","title":"Swap the schema import","page":"Describe your API with OpenAPI","section":"HTTP APIs"},{"href":"/docs/http-apis/openapi#declare-the-operations","title":"Declare the operations","page":"Describe your API with OpenAPI","section":"HTTP APIs"},{"href":"/docs/http-apis/openapi#parse-through-the-operation","title":"Parse through the operation","page":"Describe your API with OpenAPI","section":"HTTP APIs"},{"href":"/docs/http-apis/openapi#build-and-serve-the-document","title":"Build and serve the document","page":"Describe your API with OpenAPI","section":"HTTP APIs"},{"href":"/docs/http-apis/openapi#keep-it-honest-in-tests","title":"Keep it honest in tests","page":"Describe your API with OpenAPI","section":"HTTP APIs"},{"href":"/docs/http-apis/openapi#where-to-go-next","title":"Where to go next","page":"Describe your API with OpenAPI","section":"HTTP APIs"},{"href":"/docs/http-apis/safe-writes","title":"Idempotent writes and JSON Merge Patch","page":"Idempotent writes and JSON Merge Patch","section":"HTTP APIs","summary":"Make a create safe to retry with Idempotency-Key, accept partial updates as merge patches, and refuse writes based on stale reads."},{"href":"/docs/http-apis/safe-writes#extend-the-problem-catalog","title":"Extend the problem catalog","page":"Idempotent writes and JSON Merge Patch","section":"HTTP APIs"},{"href":"/docs/http-apis/safe-writes#make-create-safe-to-retry","title":"Make create safe to retry","page":"Idempotent writes and JSON Merge Patch","section":"HTTP APIs"},{"href":"/docs/http-apis/safe-writes#send-a-key","title":"Send a key","page":"Idempotent writes and JSON Merge Patch","section":"HTTP APIs"},{"href":"/docs/http-apis/safe-writes#hand-out-an-etag","title":"Hand out an ETag","page":"Idempotent writes and JSON Merge Patch","section":"HTTP APIs"},{"href":"/docs/http-apis/safe-writes#accept-a-merge-patch","title":"Accept a merge patch","page":"Idempotent writes and JSON Merge Patch","section":"HTTP APIs"},{"href":"/docs/http-apis/safe-writes#send-a-patch","title":"Send a patch","page":"Idempotent writes and JSON Merge Patch","section":"HTTP APIs"},{"href":"/docs/http-apis/safe-writes#where-to-go-next","title":"Where to go next","page":"Idempotent writes and JSON Merge Patch","section":"HTTP APIs"},{"href":"/docs/http-apis/api-clients","title":"Write a typed API client","page":"Write a typed API client","section":"HTTP APIs","summary":"A client class for one API that attaches credentials once, validates every response, and turns problem documents into typed failures."},{"href":"/docs/http-apis/api-clients#share-the-contract","title":"Share the contract","page":"Write a typed API client","section":"HTTP APIs"},{"href":"/docs/http-apis/api-clients#read-every-response-one-way","title":"Read every response one way","page":"Write a typed API client","section":"HTTP APIs"},{"href":"/docs/http-apis/api-clients#write-the-client","title":"Write the client","page":"Write a typed API client","section":"HTTP APIs"},{"href":"/docs/http-apis/api-clients#branch-on-the-problem","title":"Branch on the problem","page":"Write a typed API client","section":"HTTP APIs"},{"href":"/docs/http-apis/api-clients#test-it-with-msw","title":"Test it with MSW","page":"Write a typed API client","section":"HTTP APIs"},{"href":"/docs/http-apis/api-clients#where-to-go-next","title":"Where to go next","page":"Write a typed API client","section":"HTTP APIs"},{"href":"/docs/http-apis/paginate-lists","title":"Paginate lists","page":"Paginate lists","section":"HTTP APIs","summary":"Page by offset or keyset, validate the page parameters, advertise pages in Link headers, and render a pager in HTML."},{"href":"/docs/http-apis/paginate-lists#offset-or-keyset","title":"Offset or keyset","page":"Paginate lists","section":"HTTP APIs"},{"href":"/docs/http-apis/paginate-lists#bind-the-parameters-once","title":"Bind the parameters once","page":"Paginate lists","section":"HTTP APIs"},{"href":"/docs/http-apis/paginate-lists#offset-pages-for-an-api","title":"Offset pages for an API","page":"Paginate lists","section":"HTTP APIs"},{"href":"/docs/http-apis/paginate-lists#what-the-headers-say","title":"What the headers say","page":"Paginate lists","section":"HTTP APIs"},{"href":"/docs/http-apis/paginate-lists#walk-the-pages-from-a-client","title":"Walk the pages from a client","page":"Paginate lists","section":"HTTP APIs"},{"href":"/docs/http-apis/paginate-lists#a-numbered-pager-in-html","title":"A numbered pager in HTML","page":"Paginate lists","section":"HTTP APIs"},{"href":"/docs/http-apis/paginate-lists#older-and-newer-links-for-a-feed","title":"Older and newer links for a feed","page":"Paginate lists","section":"HTTP APIs"},{"href":"/docs/http-apis/paginate-lists#where-to-go-next","title":"Where to go next","page":"Paginate lists","section":"HTTP APIs"},{"href":"/docs/http-apis/json-pointer","title":"Address JSON with JSON Pointer","page":"Address JSON with JSON Pointer","section":"HTTP APIs","summary":"Parse, stringify, get and set RFC 6901 JSON Pointers, so a member named a/b still points at itself in a problem, a schema path or a patch."},{"href":"/docs/http-apis/json-pointer#parse-and-stringify","title":"Parse and stringify","page":"Address JSON with JSON Pointer","section":"HTTP APIs"},{"href":"/docs/http-apis/json-pointer#read-a-value","title":"Read a value","page":"Address JSON with JSON Pointer","section":"HTTP APIs"},{"href":"/docs/http-apis/json-pointer#write-a-value","title":"Write a value","page":"Address JSON with JSON Pointer","section":"HTTP APIs"},{"href":"/docs/http-apis/json-pointer#name-a-validation-issue","title":"Name a validation issue","page":"Address JSON with JSON Pointer","section":"HTTP APIs"},{"href":"/docs/http-apis/json-pointer#where-to-go-next","title":"Where to go next","page":"Address JSON with JSON Pointer","section":"HTTP APIs"},{"href":"/docs/http-apis/link-header","title":"Parse and write Link headers","page":"Parse and write Link headers","section":"HTTP APIs","summary":"Parse and stringify RFC 8288 Link headers, keep foreign parameters through a merge, and drop malformed entries instead of failing the response."},{"href":"/docs/http-apis/link-header#parse-a-header","title":"Parse a header","page":"Parse and write Link headers","section":"HTTP APIs"},{"href":"/docs/http-apis/link-header#write-a-header","title":"Write a header","page":"Parse and write Link headers","section":"HTTP APIs"},{"href":"/docs/http-apis/link-header#merge-without-dropping-foreign-links","title":"Merge without dropping foreign links","page":"Parse and write Link headers","section":"HTTP APIs"},{"href":"/docs/http-apis/link-header#follow-next-links-as-a-client","title":"Follow next links as a client","page":"Parse and write Link headers","section":"HTTP APIs"},{"href":"/docs/http-apis/link-header#where-to-go-next","title":"Where to go next","page":"Parse and write Link headers","section":"HTTP APIs"},{"href":"/docs/identity-and-security/sign-in-with-oidc","title":"Sign in with OpenID Connect","page":"Sign in with OpenID Connect","section":"Identity & security","summary":"An authorization-code login against any OpenID Connect provider, with a KV-backed session and a return URL that stays on your origin."},{"href":"/docs/identity-and-security/sign-in-with-oidc#declare-the-routes","title":"Declare the routes","page":"Sign in with OpenID Connect","section":"Identity & security"},{"href":"/docs/identity-and-security/sign-in-with-oidc#keep-the-login-in-a-kv-session","title":"Keep the login in a KV session","page":"Sign in with OpenID Connect","section":"Identity & security"},{"href":"/docs/identity-and-security/sign-in-with-oidc#describe-the-provider","title":"Describe the provider","page":"Sign in with OpenID Connect","section":"Identity & security"},{"href":"/docs/identity-and-security/sign-in-with-oidc#build-the-relying-party","title":"Build the relying party","page":"Sign in with OpenID Connect","section":"Identity & security"},{"href":"/docs/identity-and-security/sign-in-with-oidc#start-the-login","title":"Start the login","page":"Sign in with OpenID Connect","section":"Identity & security"},{"href":"/docs/identity-and-security/sign-in-with-oidc#finish-it-in-the-callback","title":"Finish it in the callback","page":"Sign in with OpenID Connect","section":"Identity & security"},{"href":"/docs/identity-and-security/sign-in-with-oidc#sign-out-on-both-sides","title":"Sign out on both sides","page":"Sign in with OpenID Connect","section":"Identity & security"},{"href":"/docs/identity-and-security/sign-in-with-oidc#know-who-is-signed-in","title":"Know who is signed in","page":"Sign in with OpenID Connect","section":"Identity & security"},{"href":"/docs/identity-and-security/sign-in-with-oidc#where-to-go-next","title":"Where to go next","page":"Sign in with OpenID Connect","section":"Identity & security"},{"href":"/docs/identity-and-security/passkeys","title":"Add passkeys","page":"Add passkeys","section":"Identity & security","summary":"Enroll a passkey for a signed-in account and sign in with it, verifying both WebAuthn ceremonies on the server."},{"href":"/docs/identity-and-security/passkeys#declare-the-endpoints","title":"Declare the endpoints","page":"Add passkeys","section":"Identity & security"},{"href":"/docs/identity-and-security/passkeys#one-relying-party","title":"One relying party","page":"Add passkeys","section":"Identity & security"},{"href":"/docs/identity-and-security/passkeys#keep-the-challenge-between-the-two-requests","title":"Keep the challenge between the two requests","page":"Add passkeys","section":"Identity & security"},{"href":"/docs/identity-and-security/passkeys#store-what-the-ceremony-proves","title":"Store what the ceremony proves","page":"Add passkeys","section":"Identity & security"},{"href":"/docs/identity-and-security/passkeys#enroll-a-passkey","title":"Enroll a passkey","page":"Add passkeys","section":"Identity & security"},{"href":"/docs/identity-and-security/passkeys#sign-in-with-it","title":"Sign in with it","page":"Add passkeys","section":"Identity & security"},{"href":"/docs/identity-and-security/passkeys#run-the-ceremony-in-the-browser","title":"Run the ceremony in the browser","page":"Add passkeys","section":"Identity & security"},{"href":"/docs/identity-and-security/passkeys#where-to-go-next","title":"Where to go next","page":"Add passkeys","section":"Identity & security"},{"href":"/docs/identity-and-security/webhooks","title":"Receive and send webhooks","page":"Receive and send webhooks","section":"Identity & security","summary":"Verify Standard Webhooks deliveries, reject replays, hand the work to a queue, and sign the deliveries you send."},{"href":"/docs/identity-and-security/webhooks#declare-the-job-a-delivery-becomes","title":"Declare the job a delivery becomes","page":"Receive and send webhooks","section":"Identity & security"},{"href":"/docs/identity-and-security/webhooks#verify-then-enqueue","title":"Verify, then enqueue","page":"Receive and send webhooks","section":"Identity & security"},{"href":"/docs/identity-and-security/webhooks#fail-closed-and-answer-each-failure-honestly","title":"Fail closed, and answer each failure honestly","page":"Receive and send webhooks","section":"Identity & security"},{"href":"/docs/identity-and-security/webhooks#do-the-work-in-the-job","title":"Do the work in the job","page":"Receive and send webhooks","section":"Identity & security"},{"href":"/docs/identity-and-security/webhooks#send-webhooks-of-your-own","title":"Send webhooks of your own","page":"Receive and send webhooks","section":"Identity & security"},{"href":"/docs/identity-and-security/webhooks#receive-a-billing-platform-s-deliveries","title":"Receive a billing platform's deliveries","page":"Receive and send webhooks","section":"Identity & security"},{"href":"/docs/identity-and-security/webhooks#where-to-go-next","title":"Where to go next","page":"Receive and send webhooks","section":"Identity & security"},{"href":"/docs/identity-and-security/protect-forms","title":"Protect forms from bots and abuse","page":"Protect forms from bots and abuse","section":"Identity & security","summary":"Layer a honeypot, a CAPTCHA, a per-address budget, spam scoring and address and password checks on a public sign-up form."},{"href":"/docs/identity-and-security/protect-forms#mount-the-guards-on-the-route","title":"Mount the guards on the route","page":"Protect forms from bots and abuse","section":"Identity & security"},{"href":"/docs/identity-and-security/protect-forms#a-trap-no-person-fills","title":"A trap no person fills","page":"Protect forms from bots and abuse","section":"Identity & security"},{"href":"/docs/identity-and-security/protect-forms#a-budget-per-address","title":"A budget per address","page":"Protect forms from bots and abuse","section":"Identity & security"},{"href":"/docs/identity-and-security/protect-forms#a-challenge-with-a-test-provider","title":"A challenge, with a test provider","page":"Protect forms from bots and abuse","section":"Identity & security"},{"href":"/docs/identity-and-security/protect-forms#check-the-address","title":"Check the address","page":"Protect forms from bots and abuse","section":"Identity & security"},{"href":"/docs/identity-and-security/protect-forms#check-the-password-then-score-the-rest","title":"Check the password, then score the rest","page":"Protect forms from bots and abuse","section":"Identity & security"},{"href":"/docs/identity-and-security/protect-forms#guard-a-newsletter-sign-up","title":"Guard a newsletter sign-up","page":"Protect forms from bots and abuse","section":"Identity & security"},{"href":"/docs/identity-and-security/protect-forms#where-to-go-next","title":"Where to go next","page":"Protect forms from bots and abuse","section":"Identity & security"},{"href":"/docs/identity-and-security/security-headers","title":"Security headers and CSP","page":"Security headers and CSP","section":"Identity & security","summary":"One typed policy for CSP, HSTS and Permissions-Policy, nonces for the scripts you render, violation reports, and a security.txt."},{"href":"/docs/identity-and-security/security-headers#write-the-policy-once","title":"Write the policy once","page":"Security headers and CSP","section":"Identity & security"},{"href":"/docs/identity-and-security/security-headers#install-it-before-the-renderer","title":"Install it before the renderer","page":"Security headers and CSP","section":"Identity & security"},{"href":"/docs/identity-and-security/security-headers#nonces-for-the-scripts-you-render","title":"Nonces for the scripts you render","page":"Security headers and CSP","section":"Identity & security"},{"href":"/docs/identity-and-security/security-headers#hash-a-fixed-inline-script-instead","title":"Hash a fixed inline script instead","page":"Security headers and CSP","section":"Identity & security"},{"href":"/docs/identity-and-security/security-headers#collect-reports-before-enforcing","title":"Collect reports before enforcing","page":"Security headers and CSP","section":"Identity & security"},{"href":"/docs/identity-and-security/security-headers#loosen-one-route-not-the-policy","title":"Loosen one route, not the policy","page":"Security headers and CSP","section":"Identity & security"},{"href":"/docs/identity-and-security/security-headers#publish-security-txt","title":"Publish security.txt","page":"Security headers and CSP","section":"Identity & security"},{"href":"/docs/identity-and-security/security-headers#where-to-go-next","title":"Where to go next","page":"Security headers and CSP","section":"Identity & security"},{"href":"/docs/identity-and-security/json-web-tokens","title":"Issue and verify JWTs","page":"Issue and verify JWTs","section":"Identity & security","summary":"Sign short-lived tokens with keys kept in R2, publish them as a JWKS, verify tokens by issuer and audience, and rotate keys safely."},{"href":"/docs/identity-and-security/json-web-tokens#describe-the-token","title":"Describe the token","page":"Issue and verify JWTs","section":"Identity & security"},{"href":"/docs/identity-and-security/json-web-tokens#keep-the-signing-keys-in-r2","title":"Keep the signing keys in R2","page":"Issue and verify JWTs","section":"Identity & security"},{"href":"/docs/identity-and-security/json-web-tokens#sign-a-token","title":"Sign a token","page":"Issue and verify JWTs","section":"Identity & security"},{"href":"/docs/identity-and-security/json-web-tokens#publish-the-key-set","title":"Publish the key set","page":"Issue and verify JWTs","section":"Identity & security"},{"href":"/docs/identity-and-security/json-web-tokens#verify-on-the-other-side","title":"Verify on the other side","page":"Issue and verify JWTs","section":"Identity & security"},{"href":"/docs/identity-and-security/json-web-tokens#expiry-on-the-client-side","title":"Expiry on the client side","page":"Issue and verify JWTs","section":"Identity & security"},{"href":"/docs/identity-and-security/json-web-tokens#rotate-the-key","title":"Rotate the key","page":"Issue and verify JWTs","section":"Identity & security"},{"href":"/docs/identity-and-security/json-web-tokens#id-tokens-are-a-different-job","title":"ID tokens are a different job","page":"Issue and verify JWTs","section":"Identity & security"},{"href":"/docs/identity-and-security/json-web-tokens#where-to-go-next","title":"Where to go next","page":"Issue and verify JWTs","section":"Identity & security"},{"href":"/docs/identity-and-security/web-crypto","title":"Hash, sign and encrypt with Web Crypto","page":"Hash, sign and encrypt with Web Crypto","section":"Identity & security","summary":"Reset links backed by hashed tokens, scrypt passwords, HMAC-signed links and secrets sealed at rest with AES-GCM."},{"href":"/docs/identity-and-security/web-crypto#pick-the-primitive-by-what-happens-next","title":"Pick the primitive by what happens next","page":"Hash, sign and encrypt with Web Crypto","section":"Identity & security"},{"href":"/docs/identity-and-security/web-crypto#an-opaque-token-for-a-reset-link","title":"An opaque token for a reset link","page":"Hash, sign and encrypt with Web Crypto","section":"Identity & security"},{"href":"/docs/identity-and-security/web-crypto#store-the-new-password-with-scrypt","title":"Store the new password with scrypt","page":"Hash, sign and encrypt with Web Crypto","section":"Identity & security"},{"href":"/docs/identity-and-security/web-crypto#sign-a-link-with-hmac","title":"Sign a link with HMAC","page":"Hash, sign and encrypt with Web Crypto","section":"Identity & security"},{"href":"/docs/identity-and-security/web-crypto#seal-secrets-at-rest","title":"Seal secrets at rest","page":"Hash, sign and encrypt with Web Crypto","section":"Identity & security"},{"href":"/docs/identity-and-security/web-crypto#codes-from-an-authenticator-app","title":"Codes from an authenticator app","page":"Hash, sign and encrypt with Web Crypto","section":"Identity & security"},{"href":"/docs/identity-and-security/web-crypto#where-to-go-next","title":"Where to go next","page":"Hash, sign and encrypt with Web Crypto","section":"Identity & security"},{"href":"/docs/identity-and-security/two-factor","title":"Add two-factor sign-in with TOTP","page":"Add two-factor sign-in with TOTP","section":"Identity & security","summary":"Enroll an authenticator app, ask for its code after the password, spend each code once, back it up with recovery codes, and turn it off."},{"href":"/docs/identity-and-security/two-factor#three-tables","title":"Three tables","page":"Add two-factor sign-in with TOTP","section":"Identity & security"},{"href":"/docs/identity-and-security/two-factor#start-enrollment","title":"Start enrollment","page":"Add two-factor sign-in with TOTP","section":"Identity & security"},{"href":"/docs/identity-and-security/two-factor#accept-each-code-once","title":"Accept each code once","page":"Add two-factor sign-in with TOTP","section":"Identity & security"},{"href":"/docs/identity-and-security/two-factor#recovery-codes","title":"Recovery codes","page":"Add two-factor sign-in with TOTP","section":"Identity & security"},{"href":"/docs/identity-and-security/two-factor#confirm-the-first-code","title":"Confirm the first code","page":"Add two-factor sign-in with TOTP","section":"Identity & security"},{"href":"/docs/identity-and-security/two-factor#ask-for-the-code-after-the-password","title":"Ask for the code after the password","page":"Add two-factor sign-in with TOTP","section":"Identity & security"},{"href":"/docs/identity-and-security/two-factor#turn-two-factor-off","title":"Turn two-factor off","page":"Add two-factor sign-in with TOTP","section":"Identity & security"},{"href":"/docs/identity-and-security/two-factor#where-to-go-next","title":"Where to go next","page":"Add two-factor sign-in with TOTP","section":"Identity & security"},{"href":"/docs/identity-and-security/verify-domains","title":"Custom domains for your customers","page":"Custom domains for your customers","section":"Identity & security","summary":"Prove a customer owns a domain with a DNS TXT check, register it on Cloudflare for SaaS, and poll it until it serves."},{"href":"/docs/identity-and-security/verify-domains#declare-the-two-jobs","title":"Declare the two jobs","page":"Custom domains for your customers","section":"Identity & security"},{"href":"/docs/identity-and-security/verify-domains#show-the-customer-a-record-to-publish","title":"Show the customer a record to publish","page":"Custom domains for your customers","section":"Identity & security"},{"href":"/docs/identity-and-security/verify-domains#check-the-record-until-it-appears","title":"Check the record until it appears","page":"Custom domains for your customers","section":"Identity & security"},{"href":"/docs/identity-and-security/verify-domains#register-the-proven-domain","title":"Register the proven domain","page":"Custom domains for your customers","section":"Identity & security"},{"href":"/docs/identity-and-security/verify-domains#poll-until-the-certificate-is-live","title":"Poll until the certificate is live","page":"Custom domains for your customers","section":"Identity & security"},{"href":"/docs/identity-and-security/verify-domains#tell-the-customer-what-is-missing","title":"Tell the customer what is missing","page":"Custom domains for your customers","section":"Identity & security"},{"href":"/docs/identity-and-security/verify-domains#remove-a-domain","title":"Remove a domain","page":"Custom domains for your customers","section":"Identity & security"},{"href":"/docs/identity-and-security/verify-domains#where-to-go-next","title":"Where to go next","page":"Custom domains for your customers","section":"Identity & security"},{"href":"/docs/identity-and-security/enterprise-sso","title":"Enterprise sign-on with SAML and SCIM","page":"Enterprise sign-on with SAML and SCIM","section":"Identity & security","summary":"Let a customer's directory sign its people in over SAML 2.0 and provision their users and groups over SCIM 2.0."},{"href":"/docs/identity-and-security/enterprise-sso#the-routes","title":"The routes","page":"Enterprise sign-on with SAML and SCIM","section":"Identity & security"},{"href":"/docs/identity-and-security/enterprise-sso#configure-a-connection-from-the-provider-s-metadata","title":"Configure a connection from the provider's metadata","page":"Enterprise sign-on with SAML and SCIM","section":"Identity & security"},{"href":"/docs/identity-and-security/enterprise-sso#publish-your-own-metadata","title":"Publish your own metadata","page":"Enterprise sign-on with SAML and SCIM","section":"Identity & security"},{"href":"/docs/identity-and-security/enterprise-sso#start-a-sign-in","title":"Start a sign-in","page":"Enterprise sign-on with SAML and SCIM","section":"Identity & security"},{"href":"/docs/identity-and-security/enterprise-sso#verify-the-assertion","title":"Verify the assertion","page":"Enterprise sign-on with SAML and SCIM","section":"Identity & security"},{"href":"/docs/identity-and-security/enterprise-sso#remember-assertions-for-as-long-as-they-are-valid","title":"Remember assertions for as long as they are valid","page":"Enterprise sign-on with SAML and SCIM","section":"Identity & security"},{"href":"/docs/identity-and-security/enterprise-sso#authenticate-the-directory","title":"Authenticate the directory","page":"Enterprise sign-on with SAML and SCIM","section":"Identity & security"},{"href":"/docs/identity-and-security/enterprise-sso#describe-what-you-serve","title":"Describe what you serve","page":"Enterprise sign-on with SAML and SCIM","section":"Identity & security"},{"href":"/docs/identity-and-security/enterprise-sso#create-and-list-users","title":"Create and list users","page":"Enterprise sign-on with SAML and SCIM","section":"Identity & security"},{"href":"/docs/identity-and-security/enterprise-sso#patch-a-user","title":"Patch a user","page":"Enterprise sign-on with SAML and SCIM","section":"Identity & security"},{"href":"/docs/identity-and-security/enterprise-sso#groups","title":"Groups","page":"Enterprise sign-on with SAML and SCIM","section":"Identity & security"},{"href":"/docs/identity-and-security/enterprise-sso#mount-it","title":"Mount it","page":"Enterprise sign-on with SAML and SCIM","section":"Identity & security"},{"href":"/docs/identity-and-security/enterprise-sso#where-to-go-next","title":"Where to go next","page":"Enterprise sign-on with SAML and SCIM","section":"Identity & security"},{"href":"/docs/identity-and-security/fetch-untrusted-urls","title":"Fetch URLs a stranger chose","page":"Fetch URLs a stranger chose","section":"Identity & security","summary":"Refuse private hosts at the endpoint, fetch in a job under one deadline and a byte cap on every redirect, and cap bodies that never came from fetch."},{"href":"/docs/identity-and-security/fetch-untrusted-urls#refuse-the-url-at-the-endpoint","title":"Refuse the URL at the endpoint","page":"Fetch URLs a stranger chose","section":"Identity & security"},{"href":"/docs/identity-and-security/fetch-untrusted-urls#follow-and-read-it-under-one-deadline","title":"Follow and read it under one deadline","page":"Fetch URLs a stranger chose","section":"Identity & security"},{"href":"/docs/identity-and-security/fetch-untrusted-urls#turn-failures-into-job-verbs","title":"Turn failures into job verbs","page":"Fetch URLs a stranger chose","section":"Identity & security"},{"href":"/docs/identity-and-security/fetch-untrusted-urls#check-where-the-name-points","title":"Check where the name points","page":"Fetch URLs a stranger chose","section":"Identity & security"},{"href":"/docs/identity-and-security/fetch-untrusted-urls#reach-your-own-network-on-purpose","title":"Reach your own network on purpose","page":"Fetch URLs a stranger chose","section":"Identity & security"},{"href":"/docs/identity-and-security/fetch-untrusted-urls#cap-a-body-that-did-not-come-from-fetch","title":"Cap a body that did not come from fetch","page":"Fetch URLs a stranger chose","section":"Identity & security"},{"href":"/docs/identity-and-security/fetch-untrusted-urls#stream-a-capped-image-through","title":"Stream a capped image through","page":"Fetch URLs a stranger chose","section":"Identity & security"},{"href":"/docs/identity-and-security/fetch-untrusted-urls#use-the-packages-that-already-fetch-through-it","title":"Use the packages that already fetch through it","page":"Fetch URLs a stranger chose","section":"Identity & security"},{"href":"/docs/identity-and-security/fetch-untrusted-urls#test-it-with-msw","title":"Test it with MSW","page":"Fetch URLs a stranger chose","section":"Identity & security"},{"href":"/docs/identity-and-security/fetch-untrusted-urls#where-to-go-next","title":"Where to go next","page":"Fetch URLs a stranger chose","section":"Identity & security"},{"href":"/docs/identity-and-security/client-addresses","title":"Client addresses and networks","page":"Client addresses and networks","section":"Identity & security","summary":"Read the caller's address once per request, key limits on its network, store it as text, admit only your own networks and refuse internal targets."},{"href":"/docs/identity-and-security/client-addresses#publish-the-address-once","title":"Publish the address once","page":"Client addresses and networks","section":"Identity & security"},{"href":"/docs/identity-and-security/client-addresses#decide-what-null-means","title":"Decide what null means","page":"Client addresses and networks","section":"Identity & security"},{"href":"/docs/identity-and-security/client-addresses#key-a-budget-on-the-client-s-network","title":"Key a budget on the client's network","page":"Client addresses and networks","section":"Identity & security"},{"href":"/docs/identity-and-security/client-addresses#pass-an-ip-not-a-string","title":"Pass an IP, not a string","page":"Client addresses and networks","section":"Identity & security"},{"href":"/docs/identity-and-security/client-addresses#write-it-into-the-log","title":"Write it into the log","page":"Client addresses and networks","section":"Identity & security"},{"href":"/docs/identity-and-security/client-addresses#admit-only-your-own-networks","title":"Admit only your own networks","page":"Client addresses and networks","section":"Identity & security"},{"href":"/docs/identity-and-security/client-addresses#refuse-an-internal-address-someone-typed","title":"Refuse an internal address someone typed","page":"Client addresses and networks","section":"Identity & security"},{"href":"/docs/identity-and-security/client-addresses#test-with-the-header-cloudflare-sends","title":"Test with the header Cloudflare sends","page":"Client addresses and networks","section":"Identity & security"},{"href":"/docs/identity-and-security/client-addresses#where-to-go-next","title":"Where to go next","page":"Client addresses and networks","section":"Identity & security"},{"href":"/docs/identity-and-security/authorization","title":"Decide who can do what","page":"Decide who can do what","section":"Identity & security","summary":"Name every ability once, grant them through additive roles, refuse through guards, and check them in routes, handlers, jobs and MCP tools from facts loaded once."},{"href":"/docs/identity-and-security/authorization#name-what-people-do","title":"Name what people do","page":"Decide who can do what","section":"Identity & security"},{"href":"/docs/identity-and-security/authorization#write-the-policy","title":"Write the policy","page":"Decide who can do what","section":"Identity & security"},{"href":"/docs/identity-and-security/authorization#bind-the-person-on-each-request","title":"Bind the person on each request","page":"Decide who can do what","section":"Identity & security"},{"href":"/docs/identity-and-security/authorization#guard-a-route","title":"Guard a route","page":"Decide who can do what","section":"Identity & security"},{"href":"/docs/identity-and-security/authorization#check-inside-a-handler","title":"Check inside a handler","page":"Decide who can do what","section":"Identity & security"},{"href":"/docs/identity-and-security/authorization#answer-refusals","title":"Answer refusals","page":"Decide who can do what","section":"Identity & security"},{"href":"/docs/identity-and-security/authorization#gate-on-the-plan","title":"Gate on the plan","page":"Decide who can do what","section":"Identity & security"},{"href":"/docs/identity-and-security/authorization#switch-an-ability-off-with-a-flag","title":"Switch an ability off with a flag","page":"Decide who can do what","section":"Identity & security"},{"href":"/docs/identity-and-security/authorization#check-in-a-background-job","title":"Check in a background job","page":"Decide who can do what","section":"Identity & security"},{"href":"/docs/identity-and-security/authorization#scope-an-agent","title":"Scope an agent","page":"Decide who can do what","section":"Identity & security"},{"href":"/docs/identity-and-security/authorization#test-the-policy-as-a-table","title":"Test the policy as a table","page":"Decide who can do what","section":"Identity & security"},{"href":"/docs/identity-and-security/authorization#where-to-go-next","title":"Where to go next","page":"Decide who can do what","section":"Identity & security"},{"href":"/docs/identity-and-security/http-message-signatures","title":"Sign and verify HTTP requests","page":"Sign and verify HTTP requests","section":"Identity & security","summary":"Sign requests with RFC 9421 or draft-cavage, verify them with a freshness window and replay checks, and attach and check Content-Digest, Repr-Digest and Digest."},{"href":"/docs/identity-and-security/http-message-signatures#make-a-key-pair","title":"Make a key pair","page":"Sign and verify HTTP requests","section":"Identity & security"},{"href":"/docs/identity-and-security/http-message-signatures#sign-the-requests-you-send","title":"Sign the requests you send","page":"Sign and verify HTTP requests","section":"Identity & security"},{"href":"/docs/identity-and-security/http-message-signatures#verify-the-requests-you-receive","title":"Verify the requests you receive","page":"Sign and verify HTTP requests","section":"Identity & security"},{"href":"/docs/identity-and-security/http-message-signatures#refuse-in-a-way-the-caller-can-act-on","title":"Refuse in a way the caller can act on","page":"Sign and verify HTTP requests","section":"Identity & security"},{"href":"/docs/identity-and-security/http-message-signatures#refuse-a-replay","title":"Refuse a replay","page":"Sign and verify HTTP requests","section":"Identity & security"},{"href":"/docs/identity-and-security/http-message-signatures#fall-back-to-draft-cavage","title":"Fall back to draft-cavage","page":"Sign and verify HTTP requests","section":"Identity & security"},{"href":"/docs/identity-and-security/http-message-signatures#read-and-write-the-signature-fields","title":"Read and write the signature fields","page":"Sign and verify HTTP requests","section":"Identity & security"},{"href":"/docs/identity-and-security/http-message-signatures#attach-digests-on-their-own","title":"Attach digests on their own","page":"Sign and verify HTTP requests","section":"Identity & security"},{"href":"/docs/identity-and-security/http-message-signatures#where-to-go-next","title":"Where to go next","page":"Sign and verify HTTP requests","section":"Identity & security"},{"href":"/docs/data-and-background-work/cache-on-workers","title":"Cache on Cloudflare Workers","page":"Cache on Cloudflare Workers","section":"Data & background work","summary":"Keep values in Workers KV with a stale copy for outages, and store whole responses at the edge under tags you can purge."},{"href":"/docs/data-and-background-work/cache-on-workers#open-a-cache-for-each-request","title":"Open a cache for each request","page":"Cache on Cloudflare Workers","section":"Data & background work"},{"href":"/docs/data-and-background-work/cache-on-workers#read-through-with-fetch","title":"Read through with fetch","page":"Cache on Cloudflare Workers","section":"Data & background work"},{"href":"/docs/data-and-background-work/cache-on-workers#choose-a-ttl","title":"Choose a TTL","page":"Cache on Cloudflare Workers","section":"Data & background work"},{"href":"/docs/data-and-background-work/cache-on-workers#keep-a-stale-copy-for-when-the-source-is-down","title":"Keep a stale copy for when the source is down","page":"Cache on Cloudflare Workers","section":"Data & background work"},{"href":"/docs/data-and-background-work/cache-on-workers#store-whole-responses-at-the-edge","title":"Store whole responses at the edge","page":"Cache on Cloudflare Workers","section":"Data & background work"},{"href":"/docs/data-and-background-work/cache-on-workers#purge-when-the-content-changes","title":"Purge when the content changes","page":"Cache on Cloudflare Workers","section":"Data & background work"},{"href":"/docs/data-and-background-work/cache-on-workers#test-both-layers-without-a-platform","title":"Test both layers without a platform","page":"Cache on Cloudflare Workers","section":"Data & background work"},{"href":"/docs/data-and-background-work/cache-on-workers#where-to-go-next","title":"Where to go next","page":"Cache on Cloudflare Workers","section":"Data & background work"},{"href":"/docs/data-and-background-work/databases","title":"Query D1 and Durable Object SQL","page":"Query D1 and Durable Object SQL","section":"Data & background work","summary":"Run remix/data-table models on D1 or a Durable Object's SQLite, publish the database on ctx.db, and test against real SQL."},{"href":"/docs/data-and-background-work/databases#what-the-drivers-add-to-your-tables","title":"What the drivers add to your tables","page":"Query D1 and Durable Object SQL","section":"Data & background work"},{"href":"/docs/data-and-background-work/databases#open-the-database-over-d1","title":"Open the database over D1","page":"Query D1 and Durable Object SQL","section":"Data & background work"},{"href":"/docs/data-and-background-work/databases#publish-it-on-ctx-db","title":"Publish it on ctx.db","page":"Query D1 and Durable Object SQL","section":"Data & background work"},{"href":"/docs/data-and-background-work/databases#write-what-d1-can-commit","title":"Write what D1 can commit","page":"Query D1 and Durable Object SQL","section":"Data & background work"},{"href":"/docs/data-and-background-work/databases#move-the-models-into-a-durable-object","title":"Move the models into a Durable Object","page":"Query D1 and Durable Object SQL","section":"Data & background work"},{"href":"/docs/data-and-background-work/databases#test-against-real-sql","title":"Test against real SQL","page":"Query D1 and Durable Object SQL","section":"Data & background work"},{"href":"/docs/data-and-background-work/databases#where-to-go-next","title":"Where to go next","page":"Query D1 and Durable Object SQL","section":"Data & background work"},{"href":"/docs/data-and-background-work/data-models","title":"Model your tables","page":"Model your tables","section":"Data & background work","summary":"Wrap remix/data-table tables in models with scopes, callbacks and typed meta fields, bind them per request as ctx.models, and dispatch jobs only after a write commits."},{"href":"/docs/data-and-background-work/data-models#define-a-model","title":"Define a model","page":"Model your tables","section":"Data & background work"},{"href":"/docs/data-and-background-work/data-models#publish-the-models-on-ctx-models","title":"Publish the models on ctx.models","page":"Model your tables","section":"Data & background work"},{"href":"/docs/data-and-background-work/data-models#dispatch-side-effects-after-commit","title":"Dispatch side effects after commit","page":"Model your tables","section":"Data & background work"},{"href":"/docs/data-and-background-work/data-models#bind-several-registries","title":"Bind several registries","page":"Model your tables","section":"Data & background work"},{"href":"/docs/data-and-background-work/data-models#keep-several-record-types-in-one-table","title":"Keep several record types in one table","page":"Model your tables","section":"Data & background work"},{"href":"/docs/data-and-background-work/data-models#store-open-ended-attributes-in-a-meta-table","title":"Store open-ended attributes in a meta table","page":"Model your tables","section":"Data & background work"},{"href":"/docs/data-and-background-work/data-models#write-helpers-over-any-model","title":"Write helpers over any model","page":"Model your tables","section":"Data & background work"},{"href":"/docs/data-and-background-work/data-models#build-test-data-with-factories","title":"Build test data with factories","page":"Model your tables","section":"Data & background work"},{"href":"/docs/data-and-background-work/data-models#where-to-go-next","title":"Where to go next","page":"Model your tables","section":"Data & background work"},{"href":"/docs/data-and-background-work/jobs-and-cron","title":"Background jobs and cron","page":"Background jobs and cron","section":"Data & background work","summary":"Declare jobs once, enqueue them from handlers, run them on Cloudflare Queues and cron triggers, and validate schedules users type."},{"href":"/docs/data-and-background-work/jobs-and-cron#declare-the-jobs","title":"Declare the jobs","page":"Background jobs and cron","section":"Data & background work"},{"href":"/docs/data-and-background-work/jobs-and-cron#write-a-handler","title":"Write a handler","page":"Background jobs and cron","section":"Data & background work"},{"href":"/docs/data-and-background-work/jobs-and-cron#publish-services-onto-the-job-context","title":"Publish services onto the job context","page":"Background jobs and cron","section":"Data & background work"},{"href":"/docs/data-and-background-work/jobs-and-cron#share-one-queue","title":"Share one queue","page":"Background jobs and cron","section":"Data & background work"},{"href":"/docs/data-and-background-work/jobs-and-cron#build-the-dispatcher","title":"Build the dispatcher","page":"Background jobs and cron","section":"Data & background work"},{"href":"/docs/data-and-background-work/jobs-and-cron#enqueue-from-a-request","title":"Enqueue from a request","page":"Background jobs and cron","section":"Data & background work"},{"href":"/docs/data-and-background-work/jobs-and-cron#wire-the-worker","title":"Wire the Worker","page":"Background jobs and cron","section":"Data & background work"},{"href":"/docs/data-and-background-work/jobs-and-cron#alert-a-channel-when-a-job-gives-up","title":"Alert a channel when a job gives up","page":"Background jobs and cron","section":"Data & background work"},{"href":"/docs/data-and-background-work/jobs-and-cron#run-jobs-in-a-test","title":"Run jobs in a test","page":"Background jobs and cron","section":"Data & background work"},{"href":"/docs/data-and-background-work/jobs-and-cron#validate-a-schedule-someone-typed","title":"Validate a schedule someone typed","page":"Background jobs and cron","section":"Data & background work"},{"href":"/docs/data-and-background-work/jobs-and-cron#where-to-go-next","title":"Where to go next","page":"Background jobs and cron","section":"Data & background work"},{"href":"/docs/data-and-background-work/send-email","title":"Send email","page":"Send email","section":"Data & background work","summary":"Write emails as remix/component classes, translate them for the reader, send them from a job, and assert on them with an in-memory transport."},{"href":"/docs/data-and-background-work/send-email#build-the-mailer","title":"Build the mailer","page":"Send email","section":"Data & background work"},{"href":"/docs/data-and-background-work/send-email#write-the-email-as-a-class","title":"Write the email as a class","page":"Send email","section":"Data & background work"},{"href":"/docs/data-and-background-work/send-email#translate-for-the-reader","title":"Translate for the reader","page":"Send email","section":"Data & background work"},{"href":"/docs/data-and-background-work/send-email#publish-the-mailer-to-jobs","title":"Publish the mailer to jobs","page":"Send email","section":"Data & background work"},{"href":"/docs/data-and-background-work/send-email#send-it-from-a-job","title":"Send it from a job","page":"Send email","section":"Data & background work"},{"href":"/docs/data-and-background-work/send-email#send-from-a-request-when-you-have-to","title":"Send from a request when you have to","page":"Send email","section":"Data & background work"},{"href":"/docs/data-and-background-work/send-email#test-with-the-memory-transport","title":"Test with the memory transport","page":"Send email","section":"Data & background work"},{"href":"/docs/data-and-background-work/send-email#where-to-go-next","title":"Where to go next","page":"Send email","section":"Data & background work"},{"href":"/docs/data-and-background-work/feature-flags","title":"Feature flags","page":"Feature flags","section":"Data & background work","summary":"Declare flags in a typed catalog, target them by rule or percentage, and evaluate them on ctx.flags in handlers and jobs."},{"href":"/docs/data-and-background-work/feature-flags#write-the-definitions","title":"Write the definitions","page":"Feature flags","section":"Data & background work"},{"href":"/docs/data-and-background-work/feature-flags#name-them-in-a-catalog","title":"Name them in a catalog","page":"Feature flags","section":"Data & background work"},{"href":"/docs/data-and-background-work/feature-flags#build-the-instance","title":"Build the instance","page":"Feature flags","section":"Data & background work"},{"href":"/docs/data-and-background-work/feature-flags#publish-ctx-flags","title":"Publish ctx.flags","page":"Feature flags","section":"Data & background work"},{"href":"/docs/data-and-background-work/feature-flags#evaluate-in-a-handler","title":"Evaluate in a handler","page":"Feature flags","section":"Data & background work"},{"href":"/docs/data-and-background-work/feature-flags#target-a-rule-or-a-percentage","title":"Target a rule or a percentage","page":"Feature flags","section":"Data & background work"},{"href":"/docs/data-and-background-work/feature-flags#move-definitions-into-kv","title":"Move definitions into KV","page":"Feature flags","section":"Data & background work"},{"href":"/docs/data-and-background-work/feature-flags#edit-a-rule-as-text","title":"Edit a rule as text","page":"Feature flags","section":"Data & background work"},{"href":"/docs/data-and-background-work/feature-flags#switch-an-ability-off","title":"Switch an ability off","page":"Feature flags","section":"Data & background work"},{"href":"/docs/data-and-background-work/feature-flags#test-with-a-pinned-flag","title":"Test with a pinned flag","page":"Feature flags","section":"Data & background work"},{"href":"/docs/data-and-background-work/feature-flags#where-to-go-next","title":"Where to go next","page":"Feature flags","section":"Data & background work"},{"href":"/docs/data-and-background-work/billing","title":"Charge for your app","page":"Charge for your app","section":"Data & background work","summary":"Sell through a hosted checkout, keep your own copy of what each customer holds, and gate features on it without calling the platform."},{"href":"/docs/data-and-background-work/billing#configure-the-provider","title":"Configure the provider","page":"Charge for your app","section":"Data & background work"},{"href":"/docs/data-and-background-work/billing#publish-it-on-the-request","title":"Publish it on the request","page":"Charge for your app","section":"Data & background work"},{"href":"/docs/data-and-background-work/billing#link-each-account-to-a-customer","title":"Link each account to a customer","page":"Charge for your app","section":"Data & background work"},{"href":"/docs/data-and-background-work/billing#open-a-hosted-checkout","title":"Open a hosted checkout","page":"Charge for your app","section":"Data & background work"},{"href":"/docs/data-and-background-work/billing#sync-what-the-customer-holds","title":"Sync what the customer holds","page":"Charge for your app","section":"Data & background work"},{"href":"/docs/data-and-background-work/billing#receive-the-platform-s-webhooks","title":"Receive the platform's webhooks","page":"Charge for your app","section":"Data & background work"},{"href":"/docs/data-and-background-work/billing#keep-a-delivery-store","title":"Keep a delivery store","page":"Charge for your app","section":"Data & background work"},{"href":"/docs/data-and-background-work/billing#gate-a-feature","title":"Gate a feature","page":"Charge for your app","section":"Data & background work"},{"href":"/docs/data-and-background-work/billing#gate-inside-an-authorization-policy","title":"Gate inside an authorization policy","page":"Charge for your app","section":"Data & background work"},{"href":"/docs/data-and-background-work/billing#repair-what-webhooks-missed","title":"Repair what webhooks missed","page":"Charge for your app","section":"Data & background work"},{"href":"/docs/data-and-background-work/billing#where-to-go-next","title":"Where to go next","page":"Charge for your app","section":"Data & background work"},{"href":"/docs/data-and-background-work/csv","title":"Import and export CSV","page":"Import and export CSV","section":"Data & background work","summary":"Read an uploaded CSV into validated rows with errors that name the line, and stream exports that spreadsheets open safely."},{"href":"/docs/data-and-background-work/csv#describe-a-row","title":"Describe a row","page":"Import and export CSV","section":"Data & background work"},{"href":"/docs/data-and-background-work/csv#parse-the-file-and-validate-each-row","title":"Parse the file and validate each row","page":"Import and export CSV","section":"Data & background work"},{"href":"/docs/data-and-background-work/csv#accept-the-upload","title":"Accept the upload","page":"Import and export CSV","section":"Data & background work"},{"href":"/docs/data-and-background-work/csv#stream-an-export","title":"Stream an export","page":"Import and export CSV","section":"Data & background work"},{"href":"/docs/data-and-background-work/csv#neutralize-formulas","title":"Neutralize formulas","page":"Import and export CSV","section":"Data & background work"},{"href":"/docs/data-and-background-work/csv#write-for-spreadsheets-in-other-locales","title":"Write for spreadsheets in other locales","page":"Import and export CSV","section":"Data & background work"},{"href":"/docs/data-and-background-work/csv#where-to-go-next","title":"Where to go next","page":"Import and export CSV","section":"Data & background work"},{"href":"/docs/data-and-background-work/retry-with-backoff","title":"Retry on a growing delay","page":"Retry on a growing delay","section":"Data & background work","summary":"Wait longer after each failure, with a ceiling and jitter, in queue jobs, in-process retries, polled rows and sign-in lockouts."},{"href":"/docs/data-and-background-work/retry-with-backoff#build-the-schedule-once","title":"Build the schedule once","page":"Retry on a growing delay","section":"Data & background work"},{"href":"/docs/data-and-background-work/retry-with-backoff#honor-retry-after","title":"Honor Retry-After","page":"Retry on a growing delay","section":"Data & background work"},{"href":"/docs/data-and-background-work/retry-with-backoff#retry-a-job-on-a-growing-delay","title":"Retry a job on a growing delay","page":"Retry on a growing delay","section":"Data & background work"},{"href":"/docs/data-and-background-work/retry-with-backoff#retry-inside-one-request","title":"Retry inside one request","page":"Retry on a growing delay","section":"Data & background work"},{"href":"/docs/data-and-background-work/retry-with-backoff#store-the-next-attempt-for-a-polled-resource","title":"Store the next attempt for a polled resource","page":"Retry on a growing delay","section":"Data & background work"},{"href":"/docs/data-and-background-work/retry-with-backoff#write-the-steps-by-hand","title":"Write the steps by hand","page":"Retry on a growing delay","section":"Data & background work"},{"href":"/docs/data-and-background-work/retry-with-backoff#let-the-first-failures-through","title":"Let the first failures through","page":"Retry on a growing delay","section":"Data & background work"},{"href":"/docs/data-and-background-work/retry-with-backoff#test-the-exact-delays","title":"Test the exact delays","page":"Retry on a growing delay","section":"Data & background work"},{"href":"/docs/data-and-background-work/retry-with-backoff#where-to-go-next","title":"Where to go next","page":"Retry on a growing delay","section":"Data & background work"},{"href":"/docs/data-and-background-work/conditions","title":"Rules your users write","page":"Rules your users write","section":"Data & background work","summary":"Let customers write conditions as text or JSON, store them as data, refuse a broken one with its path, and evaluate it in a request or a job."},{"href":"/docs/data-and-background-work/conditions#define-the-dialect-once","title":"Define the dialect once","page":"Rules your users write","section":"Data & background work"},{"href":"/docs/data-and-background-work/conditions#accept-a-rule-from-an-api","title":"Accept a rule from an API","page":"Rules your users write","section":"Data & background work"},{"href":"/docs/data-and-background-work/conditions#let-people-type-the-rule-as-text","title":"Let people type the rule as text","page":"Rules your users write","section":"Data & background work"},{"href":"/docs/data-and-background-work/conditions#share-named-filters","title":"Share named filters","page":"Rules your users write","section":"Data & background work"},{"href":"/docs/data-and-background-work/conditions#evaluate-in-a-job","title":"Evaluate in a job","page":"Rules your users write","section":"Data & background work"},{"href":"/docs/data-and-background-work/conditions#add-an-operator-of-your-own","title":"Add an operator of your own","page":"Rules your users write","section":"Data & background work"},{"href":"/docs/data-and-background-work/conditions#speak-the-same-language-in-flags-and-logs","title":"Speak the same language in flags and logs","page":"Rules your users write","section":"Data & background work"},{"href":"/docs/data-and-background-work/conditions#test-the-dialect","title":"Test the dialect","page":"Rules your users write","section":"Data & background work"},{"href":"/docs/data-and-background-work/conditions#where-to-go-next","title":"Where to go next","page":"Rules your users write","section":"Data & background work"},{"href":"/docs/data-and-background-work/newsletter","title":"Run a newsletter list","page":"Run a newsletter list","section":"Data & background work","summary":"Subscribe readers to Buttondown or Kit through one contract, credit the campaign they came from, follow confirmations and unsubscribes from webhooks, and test against an in-memory list."},{"href":"/docs/data-and-background-work/newsletter#pick-a-provider","title":"Pick a provider","page":"Run a newsletter list","section":"Data & background work"},{"href":"/docs/data-and-background-work/newsletter#publish-it-on-the-request","title":"Publish it on the request","page":"Run a newsletter list","section":"Data & background work"},{"href":"/docs/data-and-background-work/newsletter#subscribe-from-a-form","title":"Subscribe from a form","page":"Run a newsletter list","section":"Data & background work"},{"href":"/docs/data-and-background-work/newsletter#credit-the-campaign","title":"Credit the campaign","page":"Run a newsletter list","section":"Data & background work"},{"href":"/docs/data-and-background-work/newsletter#change-a-reader-from-your-app","title":"Change a reader from your app","page":"Run a newsletter list","section":"Data & background work"},{"href":"/docs/data-and-background-work/newsletter#follow-confirmations-and-unsubscribes","title":"Follow confirmations and unsubscribes","page":"Run a newsletter list","section":"Data & background work"},{"href":"/docs/data-and-background-work/newsletter#test-against-the-memory-list","title":"Test against the memory list","page":"Run a newsletter list","section":"Data & background work"},{"href":"/docs/data-and-background-work/newsletter#hold-your-own-provider-to-the-contract","title":"Hold your own provider to the contract","page":"Run a newsletter list","section":"Data & background work"},{"href":"/docs/data-and-background-work/newsletter#where-to-go-next","title":"Where to go next","page":"Run a newsletter list","section":"Data & background work"},{"href":"/docs/data-and-background-work/attribution","title":"Know where visitors come from","page":"Know where visitors come from","section":"Data & background work","summary":"Record a visitor's first and last touch from UTM parameters, click IDs and referrers, then store it with the account, the checkout or the newsletter reader they become."},{"href":"/docs/data-and-background-work/attribution#what-a-touch-holds","title":"What a touch holds","page":"Know where visitors come from","section":"Data & background work"},{"href":"/docs/data-and-background-work/attribution#keep-the-first-and-last-touch","title":"Keep the first and last touch","page":"Know where visitors come from","section":"Data & background work"},{"href":"/docs/data-and-background-work/attribution#store-it-with-the-account","title":"Store it with the account","page":"Know where visitors come from","section":"Data & background work"},{"href":"/docs/data-and-background-work/attribution#pass-it-to-the-checkout","title":"Pass it to the checkout","page":"Know where visitors come from","section":"Data & background work"},{"href":"/docs/data-and-background-work/attribution#credit-a-newsletter-reader","title":"Credit a newsletter reader","page":"Know where visitors come from","section":"Data & background work"},{"href":"/docs/data-and-background-work/attribution#strip-tracking-parameters-from-links","title":"Strip tracking parameters from links","page":"Know where visitors come from","section":"Data & background work"},{"href":"/docs/data-and-background-work/attribution#test-it","title":"Test it","page":"Know where visitors come from","section":"Data & background work"},{"href":"/docs/data-and-background-work/attribution#where-to-go-next","title":"Where to go next","page":"Know where visitors come from","section":"Data & background work"},{"href":"/docs/data-and-background-work/messaging","title":"Send alerts to chat and paging services","page":"Send alerts to chat and paging services","section":"Data & background work","summary":"Write one message, deliver it to Slack, Discord, Telegram, PagerDuty, Opsgenie or a signed webhook from a job with retries, and test it without a network."},{"href":"/docs/data-and-background-work/messaging#write-the-message-once","title":"Write the message once","page":"Send alerts to chat and paging services","section":"Data & background work"},{"href":"/docs/data-and-background-work/messaging#configure-a-destination-per-channel","title":"Configure a destination per channel","page":"Send alerts to chat and paging services","section":"Data & background work"},{"href":"/docs/data-and-background-work/messaging#check-a-pasted-url-before-saving-it","title":"Check a pasted URL before saving it","page":"Send alerts to chat and paging services","section":"Data & background work"},{"href":"/docs/data-and-background-work/messaging#deliver-from-a-job","title":"Deliver from a job","page":"Send alerts to chat and paging services","section":"Data & background work"},{"href":"/docs/data-and-background-work/messaging#fan-out-by-severity","title":"Fan out by severity","page":"Send alerts to chat and paging services","section":"Data & background work"},{"href":"/docs/data-and-background-work/messaging#edit-the-first-message-on-recovery","title":"Edit the first message on recovery","page":"Send alerts to chat and paging services","section":"Data & background work"},{"href":"/docs/data-and-background-work/messaging#sign-webhooks-for-your-customers-systems","title":"Sign webhooks for your customers' systems","page":"Send alerts to chat and paging services","section":"Data & background work"},{"href":"/docs/data-and-background-work/messaging#change-one-platform-s-layout","title":"Change one platform's layout","page":"Send alerts to chat and paging services","section":"Data & background work"},{"href":"/docs/data-and-background-work/messaging#test-the-delivery-job","title":"Test the delivery job","page":"Send alerts to chat and paging services","section":"Data & background work"},{"href":"/docs/data-and-background-work/messaging#hold-a-custom-provider-to-the-contract","title":"Hold a custom provider to the contract","page":"Send alerts to chat and paging services","section":"Data & background work"},{"href":"/docs/data-and-background-work/messaging#where-to-go-next","title":"Where to go next","page":"Send alerts to chat and paging services","section":"Data & background work"},{"href":"/docs/data-and-background-work/browser-push","title":"Send browser push notifications","page":"Send browser push notifications","section":"Data & background work","summary":"Subscribe a browser from a click, store the subscription safely, and send encrypted Web Push from a Worker, directly or as one more messaging destination."},{"href":"/docs/data-and-background-work/browser-push#generate-the-sender-s-keys","title":"Generate the sender's keys","page":"Send browser push notifications","section":"Data & background work"},{"href":"/docs/data-and-background-work/browser-push#draw-the-notification-in-a-service-worker","title":"Draw the notification in a service worker","page":"Send browser push notifications","section":"Data & background work"},{"href":"/docs/data-and-background-work/browser-push#subscribe-from-a-click","title":"Subscribe from a click","page":"Send browser push notifications","section":"Data & background work"},{"href":"/docs/data-and-background-work/browser-push#store-the-subscription","title":"Store the subscription","page":"Send browser push notifications","section":"Data & background work"},{"href":"/docs/data-and-background-work/browser-push#send-a-notification","title":"Send a notification","page":"Send browser push notifications","section":"Data & background work"},{"href":"/docs/data-and-background-work/browser-push#send-through-messaging","title":"Send through messaging","page":"Send browser push notifications","section":"Data & background work"},{"href":"/docs/data-and-background-work/browser-push#rotate-the-keys","title":"Rotate the keys","page":"Send browser push notifications","section":"Data & background work"},{"href":"/docs/data-and-background-work/browser-push#test-without-a-push-service","title":"Test without a push service","page":"Send browser push notifications","section":"Data & background work"},{"href":"/docs/data-and-background-work/browser-push#where-to-go-next","title":"Where to go next","page":"Send browser push notifications","section":"Data & background work"},{"href":"/docs/data-and-background-work/zone-files","title":"Import and export DNS zone files","page":"Import and export DNS zone files","section":"Data & background work","summary":"Read a pasted BIND zone file into typed records with every unusable line reported, check them against live DNS, and hand the zone back as a file."},{"href":"/docs/data-and-background-work/zone-files#read-the-paste","title":"Read the paste","page":"Import and export DNS zone files","section":"Data & background work"},{"href":"/docs/data-and-background-work/zone-files#keep-the-records-you-track","title":"Keep the records you track","page":"Import and export DNS zone files","section":"Data & background work"},{"href":"/docs/data-and-background-work/zone-files#accept-the-paste","title":"Accept the paste","page":"Import and export DNS zone files","section":"Data & background work"},{"href":"/docs/data-and-background-work/zone-files#compare-with-live-dns","title":"Compare with live DNS","page":"Import and export DNS zone files","section":"Data & background work"},{"href":"/docs/data-and-background-work/zone-files#export-the-zone","title":"Export the zone","page":"Import and export DNS zone files","section":"Data & background work"},{"href":"/docs/data-and-background-work/zone-files#read-a-zone-with-includes","title":"Read a zone with includes","page":"Import and export DNS zone files","section":"Data & background work"},{"href":"/docs/data-and-background-work/zone-files#where-to-go-next","title":"Where to go next","page":"Import and export DNS zone files","section":"Data & background work"},{"href":"/docs/data-and-background-work/domain-expiry","title":"Watch when a domain expires","page":"Watch when a domain expires","section":"Data & background work","summary":"Read a domain's expiry date, status and registrar from its registry over RDAP, sweep every tracked domain on a schedule, and alert before the registration lapses."},{"href":"/docs/data-and-background-work/domain-expiry#build-the-client","title":"Build the client","page":"Watch when a domain expires","section":"Data & background work"},{"href":"/docs/data-and-background-work/domain-expiry#look-up-a-domain","title":"Look up a domain","page":"Watch when a domain expires","section":"Data & background work"},{"href":"/docs/data-and-background-work/domain-expiry#decide-what-a-lookup-means","title":"Decide what a lookup means","page":"Watch when a domain expires","section":"Data & background work"},{"href":"/docs/data-and-background-work/domain-expiry#alert-before-it-lapses","title":"Alert before it lapses","page":"Watch when a domain expires","section":"Data & background work"},{"href":"/docs/data-and-background-work/domain-expiry#sweep-on-a-schedule","title":"Sweep on a schedule","page":"Watch when a domain expires","section":"Data & background work"},{"href":"/docs/data-and-background-work/domain-expiry#test-the-decisions","title":"Test the decisions","page":"Watch when a domain expires","section":"Data & background work"},{"href":"/docs/data-and-background-work/domain-expiry#where-to-go-next","title":"Where to go next","page":"Watch when a domain expires","section":"Data & background work"},{"href":"/docs/data-and-background-work/zip-downloads","title":"Stream several files as a ZIP","page":"Stream several files as a ZIP","section":"Data & background work","summary":"Bundle generated text, CSV streams and stored files into one ZIP download that starts at once, holds one entry in memory at a time, and refuses entry names an unarchiver would write outside its folder."},{"href":"/docs/data-and-background-work/zip-downloads#how-the-archive-is-written","title":"How the archive is written","page":"Stream several files as a ZIP","section":"Data & background work"},{"href":"/docs/data-and-background-work/zip-downloads#add-the-entries","title":"Add the entries","page":"Stream several files as a ZIP","section":"Data & background work"},{"href":"/docs/data-and-background-work/zip-downloads#open-stored-files-when-the-archive-reaches-them","title":"Open stored files when the archive reaches them","page":"Stream several files as a ZIP","section":"Data & background work"},{"href":"/docs/data-and-background-work/zip-downloads#serve-the-download","title":"Serve the download","page":"Stream several files as a ZIP","section":"Data & background work"},{"href":"/docs/data-and-background-work/zip-downloads#keep-entry-names-safe-to-extract","title":"Keep entry names safe to extract","page":"Stream several files as a ZIP","section":"Data & background work"},{"href":"/docs/data-and-background-work/zip-downloads#when-a-source-fails-mid-download","title":"When a source fails mid-download","page":"Stream several files as a ZIP","section":"Data & background work"},{"href":"/docs/data-and-background-work/zip-downloads#build-the-archive-once-and-store-it","title":"Build the archive once and store it","page":"Stream several files as a ZIP","section":"Data & background work"},{"href":"/docs/data-and-background-work/zip-downloads#where-to-go-next","title":"Where to go next","page":"Stream several files as a ZIP","section":"Data & background work"},{"href":"/docs/data-and-background-work/full-text-search","title":"Full-text search over SQLite","page":"Full-text search over SQLite","section":"Data & background work","summary":"Keep an FTS5 index beside the tables you already have, parse what a reader types without a syntax error, rank title matches above body matches, highlight them, and page the results."},{"href":"/docs/data-and-background-work/full-text-search#keep-a-search-table-beside-the-content","title":"Keep a search table beside the content","page":"Full-text search over SQLite","section":"Data & background work"},{"href":"/docs/data-and-background-work/full-text-search#describe-the-search","title":"Describe the search","page":"Full-text search over SQLite","section":"Data & background work"},{"href":"/docs/data-and-background-work/full-text-search#keep-the-table-current","title":"Keep the table current","page":"Full-text search over SQLite","section":"Data & background work"},{"href":"/docs/data-and-background-work/full-text-search#rebuild-the-index-in-batches","title":"Rebuild the index in batches","page":"Full-text search over SQLite","section":"Data & background work"},{"href":"/docs/data-and-background-work/full-text-search#parse-what-the-reader-typed","title":"Parse what the reader typed","page":"Full-text search over SQLite","section":"Data & background work"},{"href":"/docs/data-and-background-work/full-text-search#search-filter-and-page","title":"Search, filter and page","page":"Full-text search over SQLite","section":"Data & background work"},{"href":"/docs/data-and-background-work/full-text-search#highlight-what-matched","title":"Highlight what matched","page":"Full-text search over SQLite","section":"Data & background work"},{"href":"/docs/data-and-background-work/full-text-search#search-without-fts5","title":"Search without FTS5","page":"Full-text search over SQLite","section":"Data & background work"},{"href":"/docs/data-and-background-work/full-text-search#where-to-go-next","title":"Where to go next","page":"Full-text search over SQLite","section":"Data & background work"},{"href":"/docs/data-and-background-work/json-lines","title":"Stream JSON Lines","page":"Stream JSON Lines","section":"Data & background work","summary":"Export records as a JSON Lines download that streams as it is read, import uploads row by row with errors that name the line, and resume a long import where it stopped."},{"href":"/docs/data-and-background-work/json-lines#export-as-a-stream","title":"Export as a stream","page":"Stream JSON Lines","section":"Data & background work"},{"href":"/docs/data-and-background-work/json-lines#import-an-upload-row-by-row","title":"Import an upload row by row","page":"Stream JSON Lines","section":"Data & background work"},{"href":"/docs/data-and-background-work/json-lines#bound-what-a-line-may-cost","title":"Bound what a line may cost","page":"Stream JSON Lines","section":"Data & background work"},{"href":"/docs/data-and-background-work/json-lines#resume-a-long-import","title":"Resume a long import","page":"Stream JSON Lines","section":"Data & background work"},{"href":"/docs/data-and-background-work/json-lines#copy-lines-without-parsing-them","title":"Copy lines without parsing them","page":"Stream JSON Lines","section":"Data & background work"},{"href":"/docs/data-and-background-work/json-lines#small-files-in-memory","title":"Small files in memory","page":"Stream JSON Lines","section":"Data & background work"},{"href":"/docs/data-and-background-work/json-lines#where-to-go-next","title":"Where to go next","page":"Stream JSON Lines","section":"Data & background work"},{"href":"/docs/content-and-feeds/markdown-pipeline","title":"A markdown content pipeline","page":"A markdown content pipeline","section":"Content & feeds","summary":"Parse posts with typed frontmatter and custom tags, transform them in one walk, and render them in a Remix route."},{"href":"/docs/content-and-feeds/markdown-pipeline#describe-what-a-post-may-contain","title":"Describe what a post may contain","page":"A markdown content pipeline","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-pipeline#transform-the-tree-in-one-walk","title":"Transform the tree in one walk","page":"A markdown content pipeline","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-pipeline#load-and-parse-inside-the-request","title":"Load and parse inside the request","page":"A markdown content pipeline","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-pipeline#read-the-tree-without-changing-it","title":"Read the tree without changing it","page":"A markdown content pipeline","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-pipeline#render-it-in-a-route","title":"Render it in a route","page":"A markdown content pipeline","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-pipeline#html-and-plain-text-for-everything-else","title":"HTML and plain text for everything else","page":"A markdown content pipeline","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-pipeline#where-to-go-next","title":"Where to go next","page":"A markdown content pipeline","section":"Content & feeds"},{"href":"/docs/content-and-feeds/publish-feeds","title":"Publish RSS, Atom and JSON feeds","page":"Publish RSS, Atom and JSON feeds","section":"Content & feeds","summary":"Serve one list of posts as RSS 2.0, Atom and JSON Feed, advertise them, and ping a WebSub hub when they change."},{"href":"/docs/content-and-feeds/publish-feeds#one-list-of-entries","title":"One list of entries","page":"Publish RSS, Atom and JSON feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/publish-feeds#rss-2-0","title":"RSS 2.0","page":"Publish RSS, Atom and JSON feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/publish-feeds#atom-1-0","title":"Atom 1.0","page":"Publish RSS, Atom and JSON feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/publish-feeds#json-feed-1-1","title":"JSON Feed 1.1","page":"Publish RSS, Atom and JSON feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/publish-feeds#let-readers-find-them","title":"Let readers find them","page":"Publish RSS, Atom and JSON feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/publish-feeds#push-updates-with-websub","title":"Push updates with WebSub","page":"Publish RSS, Atom and JSON feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/publish-feeds#publish-an-opml-list","title":"Publish an OPML list","page":"Publish RSS, Atom and JSON feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/publish-feeds#where-to-go-next","title":"Where to go next","page":"Publish RSS, Atom and JSON feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/indieweb","title":"Join the IndieWeb: Webmention and Micropub","page":"Join the IndieWeb: Webmention and Micropub","section":"Content & feeds","summary":"Mark posts up with microformats, receive and send Webmentions from background jobs, and accept posts over Micropub."},{"href":"/docs/content-and-feeds/indieweb#mark-up-your-posts","title":"Mark up your posts","page":"Join the IndieWeb: Webmention and Micropub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/indieweb#receive-webmentions","title":"Receive Webmentions","page":"Join the IndieWeb: Webmention and Micropub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/indieweb#verify-in-the-background","title":"Verify in the background","page":"Join the IndieWeb: Webmention and Micropub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/indieweb#send-webmentions","title":"Send Webmentions","page":"Join the IndieWeb: Webmention and Micropub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/indieweb#accept-posts-over-micropub","title":"Accept posts over Micropub","page":"Join the IndieWeb: Webmention and Micropub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/indieweb#where-to-go-next","title":"Where to go next","page":"Join the IndieWeb: Webmention and Micropub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/calendar-feeds","title":"Publish calendar feeds","page":"Publish calendar feeds","section":"Content & feeds","summary":"Serve your events as an iCalendar feed people subscribe to, with time zones and recurrence, and read uploaded .ics files back."},{"href":"/docs/content-and-feeds/calendar-feeds#give-the-feed-a-route","title":"Give the feed a route","page":"Publish calendar feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/calendar-feeds#turn-a-meetup-into-an-event","title":"Turn a meetup into an event","page":"Publish calendar feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/calendar-feeds#serve-the-feed","title":"Serve the feed","page":"Publish calendar feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/calendar-feeds#a-weekly-series-in-a-time-zone","title":"A weekly series in a time zone","page":"Publish calendar feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/calendar-feeds#show-the-next-sessions-on-your-pages","title":"Show the next sessions on your pages","page":"Publish calendar feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/calendar-feeds#offer-a-single-event-as-a-download","title":"Offer a single event as a download","page":"Publish calendar feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/calendar-feeds#read-an-uploaded-calendar","title":"Read an uploaded calendar","page":"Publish calendar feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/calendar-feeds#invite-people-by-email","title":"Invite people by email","page":"Publish calendar feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/calendar-feeds#where-to-go-next","title":"Where to go next","page":"Publish calendar feeds","section":"Content & feeds"},{"href":"/docs/content-and-feeds/read-web-pages","title":"Read other people's pages","page":"Read other people's pages","section":"Content & feeds","summary":"Save links for later by fetching each page under bounds in a job, pulling out its article, and building preview cards."},{"href":"/docs/content-and-feeds/read-web-pages#declare-the-job","title":"Declare the job","page":"Read other people's pages","section":"Content & feeds"},{"href":"/docs/content-and-feeds/read-web-pages#accept-the-link","title":"Accept the link","page":"Read other people's pages","section":"Content & feeds"},{"href":"/docs/content-and-feeds/read-web-pages#read-the-article-in-the-job","title":"Read the article in the job","page":"Read other people's pages","section":"Content & feeds"},{"href":"/docs/content-and-feeds/read-web-pages#keep-a-plain-text-excerpt","title":"Keep a plain-text excerpt","page":"Read other people's pages","section":"Content & feeds"},{"href":"/docs/content-and-feeds/read-web-pages#build-a-preview-card-from-the-head","title":"Build a preview card from the head","page":"Read other people's pages","section":"Content & feeds"},{"href":"/docs/content-and-feeds/read-web-pages#clean-markup-that-arrives-another-way","title":"Clean markup that arrives another way","page":"Read other people's pages","section":"Content & feeds"},{"href":"/docs/content-and-feeds/read-web-pages#where-to-go-next","title":"Where to go next","page":"Read other people's pages","section":"Content & feeds"},{"href":"/docs/content-and-feeds/reference-docs","title":"Generate reference docs from JSDoc","page":"Generate reference docs from JSDoc","section":"Content & feeds","summary":"Read the JSDoc in your TypeScript source at build time, emit JSON, and serve an API reference page for every public symbol."},{"href":"/docs/content-and-feeds/reference-docs#read-every-module","title":"Read every module","page":"Generate reference docs from JSDoc","section":"Content & feeds"},{"href":"/docs/content-and-feeds/reference-docs#find-what-the-entry-point-publishes","title":"Find what the entry point publishes","page":"Generate reference docs from JSDoc","section":"Content & feeds"},{"href":"/docs/content-and-feeds/reference-docs#shape-the-records-a-page-reads","title":"Shape the records a page reads","page":"Generate reference docs from JSDoc","section":"Content & feeds"},{"href":"/docs/content-and-feeds/reference-docs#write-the-json-at-build-time","title":"Write the JSON at build time","page":"Generate reference docs from JSDoc","section":"Content & feeds"},{"href":"/docs/content-and-feeds/reference-docs#serve-a-page-per-symbol","title":"Serve a page per symbol","page":"Generate reference docs from JSDoc","section":"Content & feeds"},{"href":"/docs/content-and-feeds/reference-docs#keep-every-public-symbol-documented","title":"Keep every public symbol documented","page":"Generate reference docs from JSDoc","section":"Content & feeds"},{"href":"/docs/content-and-feeds/reference-docs#where-to-go-next","title":"Where to go next","page":"Generate reference docs from JSDoc","section":"Content & feeds"},{"href":"/docs/content-and-feeds/activitypub","title":"Federate a site with ActivityPub","page":"Federate a site with ActivityPub","section":"Content & feeds","summary":"Publish an actor, answer WebFinger, verify an inbox that handles follows and undos, deliver signed posts to followers from jobs, and test it all in memory."},{"href":"/docs/content-and-feeds/activitypub#generate-the-actor-s-keys","title":"Generate the actor's keys","page":"Federate a site with ActivityPub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/activitypub#describe-the-actor","title":"Describe the actor","page":"Federate a site with ActivityPub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/activitypub#build-the-federation","title":"Build the federation","page":"Federate a site with ActivityPub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/activitypub#answer-the-actor-s-urls","title":"Answer the actor's URLs","page":"Federate a site with ActivityPub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/activitypub#what-the-inbox-does-inside-the-request","title":"What the inbox does inside the request","page":"Federate a site with ActivityPub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/activitypub#answer-webfinger","title":"Answer WebFinger","page":"Federate a site with ActivityPub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/activitypub#process-the-queue","title":"Process the queue","page":"Federate a site with ActivityPub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/activitypub#handle-follows-undos-and-replies","title":"Handle follows, undos and replies","page":"Federate a site with ActivityPub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/activitypub#publish-posts-as-articles","title":"Publish posts as articles","page":"Federate a site with ActivityPub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/activitypub#deliver-from-a-job","title":"Deliver from a job","page":"Federate a site with ActivityPub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/activitypub#serve-each-post-both-ways","title":"Serve each post both ways","page":"Federate a site with ActivityPub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/activitypub#test-it-in-memory","title":"Test it in memory","page":"Federate a site with ActivityPub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/activitypub#where-to-go-next","title":"Where to go next","page":"Federate a site with ActivityPub","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-plugins","title":"Anchor, polish and lint markdown","page":"Anchor, polish and lint markdown","section":"Content & feeds","summary":"Give headings anchors and a table of contents, rewrite links, set typographic punctuation, turn pasted URLs into embeds, and check content in CI."},{"href":"/docs/content-and-feeds/markdown-plugins#run-the-plugins-in-order","title":"Run the plugins in order","page":"Anchor, polish and lint markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-plugins#anchor-headings-and-build-a-table-of-contents","title":"Anchor headings and build a table of contents","page":"Anchor, polish and lint markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-plugins#rewrite-the-urls-a-document-points-at","title":"Rewrite the URLs a document points at","page":"Anchor, polish and lint markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-plugins#set-prose-in-typographic-punctuation","title":"Set prose in typographic punctuation","page":"Anchor, polish and lint markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-plugins#turn-pasted-urls-into-embeds","title":"Turn pasted URLs into embeds","page":"Anchor, polish and lint markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-plugins#lint-content-in-ci","title":"Lint content in CI","page":"Anchor, polish and lint markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-plugins#where-to-go-next","title":"Where to go next","page":"Anchor, polish and lint markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-variables","title":"Fill markdown templates with variables","page":"Fill markdown templates with variables","section":"Content & feeds","summary":"Write one markdown document with holes for per-render values, fill them per tenant, plan or locale, and keep the template round-tripping through an editor."},{"href":"/docs/content-and-feeds/markdown-variables#write-the-holes-into-the-document","title":"Write the holes into the document","page":"Fill markdown templates with variables","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-variables#fill-the-values-per-render","title":"Fill the values per render","page":"Fill markdown templates with variables","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-variables#let-the-schemas-wait-for-their-values","title":"Let the schemas wait for their values","page":"Fill markdown templates with variables","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-variables#decide-what-a-missing-value-means","title":"Decide what a missing value means","page":"Fill markdown templates with variables","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-variables#serve-the-template-not-one-reader-s-copy","title":"Serve the template, not one reader's copy","page":"Fill markdown templates with variables","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-variables#where-to-go-next","title":"Where to go next","page":"Fill markdown templates with variables","section":"Content & feeds"},{"href":"/docs/content-and-feeds/ebooks","title":"Offer posts as EPUB ebooks","page":"Offer posts as EPUB ebooks","section":"Content & feeds","summary":"Turn a markdown post into an EPUB with a nested table of contents and accessibility metadata, refused at build time wherever epubcheck would reject it, and serve it as a download."},{"href":"/docs/content-and-feeds/ebooks#render-a-chapter-body","title":"Render a chapter body","page":"Offer posts as EPUB ebooks","section":"Content & feeds"},{"href":"/docs/content-and-feeds/ebooks#build-the-book","title":"Build the book","page":"Offer posts as EPUB ebooks","section":"Content & feeds"},{"href":"/docs/content-and-feeds/ebooks#serve-the-download","title":"Serve the download","page":"Offer posts as EPUB ebooks","section":"Content & feeds"},{"href":"/docs/content-and-feeds/ebooks#read-a-build-failure","title":"Read a build failure","page":"Offer posts as EPUB ebooks","section":"Content & feeds"},{"href":"/docs/content-and-feeds/ebooks#carry-images-and-several-chapters","title":"Carry images and several chapters","page":"Offer posts as EPUB ebooks","section":"Content & feeds"},{"href":"/docs/content-and-feeds/ebooks#where-to-go-next","title":"Where to go next","page":"Offer posts as EPUB ebooks","section":"Content & feeds"},{"href":"/docs/content-and-feeds/math","title":"Render TeX math","page":"Render TeX math","section":"Content & feeds","summary":"Turn TeX formulas in markdown and in components into MathML the browser draws natively, with broken formulas caught at build time."},{"href":"/docs/content-and-feeds/math#what-it-looks-like","title":"What it looks like","page":"Render TeX math","section":"Content & feeds"},{"href":"/docs/content-and-feeds/math#convert-a-formula","title":"Convert a formula","page":"Render TeX math","section":"Content & feeds"},{"href":"/docs/content-and-feeds/math#find-the-math-in-markdown","title":"Find the math in markdown","page":"Render TeX math","section":"Content & feeds"},{"href":"/docs/content-and-feeds/math#draw-the-tags-in-a-route","title":"Draw the tags in a route","page":"Render TeX math","section":"Content & feeds"},{"href":"/docs/content-and-feeds/math#render-to-html-for-feeds-and-email","title":"Render to HTML for feeds and email","page":"Render TeX math","section":"Content & feeds"},{"href":"/docs/content-and-feeds/math#where-to-go-next","title":"Where to go next","page":"Render TeX math","section":"Content & feeds"},{"href":"/docs/content-and-feeds/diagrams","title":"Draw diagrams from text","page":"Draw diagrams from text","section":"Content & feeds","summary":"Turn Mermaid sequence, class, state and flowchart diagrams in markdown into SVG drawn on the server, with broken diagrams caught at build time."},{"href":"/docs/content-and-feeds/diagrams#write-a-diagram","title":"Write a diagram","page":"Draw diagrams from text","section":"Content & feeds"},{"href":"/docs/content-and-feeds/diagrams#draw-a-diagram-from-a-string","title":"Draw a diagram from a string","page":"Draw diagrams from text","section":"Content & feeds"},{"href":"/docs/content-and-feeds/diagrams#find-the-diagrams-in-markdown","title":"Find the diagrams in markdown","page":"Draw diagrams from text","section":"Content & feeds"},{"href":"/docs/content-and-feeds/diagrams#draw-the-tags-in-a-route","title":"Draw the tags in a route","page":"Draw diagrams from text","section":"Content & feeds"},{"href":"/docs/content-and-feeds/diagrams#match-your-theme","title":"Match your theme","page":"Draw diagrams from text","section":"Content & feeds"},{"href":"/docs/content-and-feeds/diagrams#render-to-html-for-feeds-and-email","title":"Render to HTML for feeds and email","page":"Draw diagrams from text","section":"Content & feeds"},{"href":"/docs/content-and-feeds/diagrams#where-to-go-next","title":"Where to go next","page":"Draw diagrams from text","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-frames","title":"Load live regions into markdown","page":"Load live regions into markdown","section":"Content & feeds","summary":"Write a frame tag in a markdown document to hold a region a route renders per request, such as an interactive island, while the prose around it stays parsed once and cached."},{"href":"/docs/content-and-feeds/markdown-frames#write-a-frame","title":"Write a frame","page":"Load live regions into markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-frames#register-the-tag","title":"Register the tag","page":"Load live regions into markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-frames#render-it","title":"Render it","page":"Load live regions into markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-frames#serve-the-region","title":"Serve the region","page":"Load live regions into markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/markdown-frames#where-the-region-goes-outside-the-page","title":"Where the region goes outside the page","page":"Load live regions into markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/youtube-embeds","title":"Embed YouTube videos in markdown","page":"Embed YouTube videos in markdown","section":"Content & feeds","summary":"Turn a YouTube URL pasted on its own line into a lazy-loaded, privacy-enhanced player, keeping its start time, with a plain link left for feeds."},{"href":"/docs/content-and-feeds/youtube-embeds#paste-the-url","title":"Paste the URL","page":"Embed YouTube videos in markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/youtube-embeds#turn-the-url-into-a-tag","title":"Turn the URL into a tag","page":"Embed YouTube videos in markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/youtube-embeds#draw-the-player","title":"Draw the player","page":"Embed YouTube videos in markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/youtube-embeds#allow-the-player-in-your-content-security-policy","title":"Allow the player in your Content Security Policy","page":"Embed YouTube videos in markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/youtube-embeds#keep-a-link-in-feeds-and-email","title":"Keep a link in feeds and email","page":"Embed YouTube videos in markdown","section":"Content & feeds"},{"href":"/docs/content-and-feeds/youtube-embeds#where-to-go-next","title":"Where to go next","page":"Embed YouTube videos in markdown","section":"Content & feeds"},{"href":"/docs/operations-and-testing/observability","title":"Logs, traces and timings","page":"Logs, traces and timings","section":"Operations & testing","summary":"One wide log event per invocation, a W3C trace that follows a request into its jobs, and a Server-Timing header for the browser."},{"href":"/docs/operations-and-testing/observability#configure-the-logger-once","title":"Configure the logger once","page":"Logs, traces and timings","section":"Operations & testing"},{"href":"/docs/operations-and-testing/observability#attach-it-at-the-top-of-the-router","title":"Attach it at the top of the router","page":"Logs, traces and timings","section":"Operations & testing"},{"href":"/docs/operations-and-testing/observability#write-into-the-record-from-a-handler","title":"Write into the record from a handler","page":"Logs, traces and timings","section":"Operations & testing"},{"href":"/docs/operations-and-testing/observability#reach-the-log-outside-a-handler","title":"Reach the log outside a handler","page":"Logs, traces and timings","section":"Operations & testing"},{"href":"/docs/operations-and-testing/observability#hand-the-same-logger-to-the-job-dispatcher","title":"Hand the same logger to the job dispatcher","page":"Logs, traces and timings","section":"Operations & testing"},{"href":"/docs/operations-and-testing/observability#carry-the-trace-to-outbound-requests","title":"Carry the trace to outbound requests","page":"Logs, traces and timings","section":"Operations & testing"},{"href":"/docs/operations-and-testing/observability#report-timings-to-the-browser","title":"Report timings to the browser","page":"Logs, traces and timings","section":"Operations & testing"},{"href":"/docs/operations-and-testing/observability#sample-only-when-you-have-to","title":"Sample only when you have to","page":"Logs, traces and timings","section":"Operations & testing"},{"href":"/docs/operations-and-testing/observability#where-to-go-next","title":"Where to go next","page":"Logs, traces and timings","section":"Operations & testing"},{"href":"/docs/operations-and-testing/mcp-server","title":"Expose your app over MCP","page":"Expose your app over MCP","section":"Operations & testing","summary":"Declare tools and resources, answer them with your app's own context, cache the expensive ones, and mount the server as a route."},{"href":"/docs/operations-and-testing/mcp-server#declare-the-tools","title":"Declare the tools","page":"Expose your app over MCP","section":"Operations & testing"},{"href":"/docs/operations-and-testing/mcp-server#declare-a-resource","title":"Declare a resource","page":"Expose your app over MCP","section":"Operations & testing"},{"href":"/docs/operations-and-testing/mcp-server#answer-them-with-your-app-s-context","title":"Answer them with your app's context","page":"Expose your app over MCP","section":"Operations & testing"},{"href":"/docs/operations-and-testing/mcp-server#cache-the-expensive-tool","title":"Cache the expensive tool","page":"Expose your app over MCP","section":"Operations & testing"},{"href":"/docs/operations-and-testing/mcp-server#mount-the-endpoint","title":"Mount the endpoint","page":"Expose your app over MCP","section":"Operations & testing"},{"href":"/docs/operations-and-testing/mcp-server#scope-tools-to-a-credential","title":"Scope tools to a credential","page":"Expose your app over MCP","section":"Operations & testing"},{"href":"/docs/operations-and-testing/mcp-server#where-to-go-next","title":"Where to go next","page":"Expose your app over MCP","section":"Operations & testing"},{"href":"/docs/operations-and-testing/testing","title":"Test Workers apps","page":"Test Workers apps","section":"Operations & testing","summary":"Vitest through Vite+, real bindings in the Workers pool, in-memory mocks, MSW, and executable specs against a running app."},{"href":"/docs/operations-and-testing/testing#configure-two-projects","title":"Configure two projects","page":"Test Workers apps","section":"Operations & testing"},{"href":"/docs/operations-and-testing/testing#drive-the-real-router","title":"Drive the real router","page":"Test Workers apps","section":"Operations & testing"},{"href":"/docs/operations-and-testing/testing#use-the-real-binding-in-the-workers-pool","title":"Use the real binding in the Workers pool","page":"Test Workers apps","section":"Operations & testing"},{"href":"/docs/operations-and-testing/testing#reach-for-the-in-memory-mocks-elsewhere","title":"Reach for the in-memory mocks elsewhere","page":"Test Workers apps","section":"Operations & testing"},{"href":"/docs/operations-and-testing/testing#answer-outbound-http-with-msw","title":"Answer outbound HTTP with MSW","page":"Test Workers apps","section":"Operations & testing"},{"href":"/docs/operations-and-testing/testing#record-mail-and-jobs-in-memory","title":"Record mail and jobs in memory","page":"Test Workers apps","section":"Operations & testing"},{"href":"/docs/operations-and-testing/testing#specify-behavior-with-spec-files","title":"Specify behavior with .spec files","page":"Test Workers apps","section":"Operations & testing"},{"href":"/docs/operations-and-testing/testing#where-to-go-next","title":"Where to go next","page":"Test Workers apps","section":"Operations & testing"},{"href":"/docs/operations-and-testing/test-data","title":"Generate believable test data","page":"Generate believable test data","section":"Operations & testing","summary":"Seed test databases and component fixtures with realistic data that comes out identical on every run, so failures replay and snapshots hold."},{"href":"/docs/operations-and-testing/test-data#one-generator-per-fixture","title":"One generator per fixture","page":"Generate believable test data","section":"Operations & testing"},{"href":"/docs/operations-and-testing/test-data#write-factories-that-agree-with-themselves","title":"Write factories that agree with themselves","page":"Generate believable test data","section":"Operations & testing"},{"href":"/docs/operations-and-testing/test-data#seed-a-test-database","title":"Seed a test database","page":"Generate believable test data","section":"Operations & testing"},{"href":"/docs/operations-and-testing/test-data#feed-component-previews","title":"Feed component previews","page":"Generate believable test data","section":"Operations & testing"},{"href":"/docs/operations-and-testing/test-data#keep-snapshots-stable","title":"Keep snapshots stable","page":"Generate believable test data","section":"Operations & testing"},{"href":"/docs/operations-and-testing/test-data#shake-out-hidden-assumptions","title":"Shake out hidden assumptions","page":"Generate believable test data","section":"Operations & testing"},{"href":"/docs/operations-and-testing/test-data#where-to-go-next","title":"Where to go next","page":"Generate believable test data","section":"Operations & testing"},{"href":"/docs/operations-and-testing/executable-specs","title":"Write executable specs","page":"Write executable specs","section":"Operations & testing","summary":"Describe your running app's behavior in .spec files, run them against a dev server with named grants, and gate CI on them."},{"href":"/docs/operations-and-testing/executable-specs#point-the-suite-at-your-app","title":"Point the suite at your app","page":"Write executable specs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/executable-specs#write-a-spec","title":"Write a spec","page":"Write executable specs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/executable-specs#run-it-and-read-the-denial","title":"Run it, and read the denial","page":"Write executable specs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/executable-specs#post-forms-with-generated-input","title":"Post forms with generated input","page":"Write executable specs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/executable-specs#share-steps-as-commands","title":"Share steps as commands","page":"Write executable specs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/executable-specs#grant-permissions-by-name","title":"Grant permissions by name","page":"Write executable specs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/executable-specs#run-it-in-ci","title":"Run it in CI","page":"Write executable specs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/executable-specs#where-to-go-next","title":"Where to go next","page":"Write executable specs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/estimate-costs","title":"Estimate what your Worker costs","page":"Estimate what your Worker costs","section":"Operations & testing","summary":"Turn requests, CPU time, KV reads and D1 rows into cents with Cloudflare's list prices, and warn before a month runs over budget."},{"href":"/docs/operations-and-testing/estimate-costs#a-meter-is-a-price-and-an-allowance","title":"A meter is a price and an allowance","page":"Estimate what your Worker costs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/estimate-costs#estimate-a-month","title":"Estimate a month","page":"Estimate what your Worker costs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/estimate-costs#price-one-unit-of-work","title":"Price one unit of work","page":"Estimate what your Worker costs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/estimate-costs#count-what-you-can-measure","title":"Count what you can measure","page":"Estimate what your Worker costs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/estimate-costs#warn-before-the-bill-arrives","title":"Warn before the bill arrives","page":"Estimate what your Worker costs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/estimate-costs#know-when-prices-move","title":"Know when prices move","page":"Estimate what your Worker costs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/estimate-costs#where-to-go-next","title":"Where to go next","page":"Estimate what your Worker costs","section":"Operations & testing"},{"href":"/docs/operations-and-testing/randomness","title":"Randomness you can replay","page":"Randomness you can replay","section":"Operations & testing","summary":"Pass random streams into your own code, seed them in tests, store the seed behind a draw, and resume a stream from storage."},{"href":"/docs/operations-and-testing/randomness#accept-a-random-in-your-own-functions","title":"Accept a Random in your own functions","page":"Randomness you can replay","section":"Operations & testing"},{"href":"/docs/operations-and-testing/randomness#pass-a-seeded-stream-in-tests","title":"Pass a seeded stream in tests","page":"Randomness you can replay","section":"Operations & testing"},{"href":"/docs/operations-and-testing/randomness#draw-a-result-you-can-replay","title":"Draw a result you can replay","page":"Randomness you can replay","section":"Operations & testing"},{"href":"/docs/operations-and-testing/randomness#keep-independent-streams-apart","title":"Keep independent streams apart","page":"Randomness you can replay","section":"Operations & testing"},{"href":"/docs/operations-and-testing/randomness#save-a-stream-and-resume-it","title":"Save a stream and resume it","page":"Randomness you can replay","section":"Operations & testing"},{"href":"/docs/operations-and-testing/randomness#log-the-seed-of-a-run-you-may-need-to-replay","title":"Log the seed of a run you may need to replay","page":"Randomness you can replay","section":"Operations & testing"},{"href":"/docs/operations-and-testing/randomness#hand-a-stream-to-other-packages","title":"Hand a stream to other packages","page":"Randomness you can replay","section":"Operations & testing"},{"href":"/docs/operations-and-testing/randomness#make-secrets-with-web-crypto","title":"Make secrets with Web Crypto","page":"Randomness you can replay","section":"Operations & testing"},{"href":"/docs/operations-and-testing/randomness#where-to-go-next","title":"Where to go next","page":"Randomness you can replay","section":"Operations & testing"},{"href":"/docs/operations-and-testing/build-a-command-line","title":"Build a command line","page":"Build a command line","section":"Operations & testing","summary":"Declare commands as a contract, answer them with typed handlers, ask for what a flag left out, show progress, share services through middleware, and test every command without a terminal."},{"href":"/docs/operations-and-testing/build-a-command-line#declare-the-commands","title":"Declare the commands","page":"Build a command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/build-a-command-line#answer-them","title":"Answer them","page":"Build a command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/build-a-command-line#ask-for-what-the-command-line-left-out","title":"Ask for what the command line left out","page":"Build a command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/build-a-command-line#show-progress","title":"Show progress","page":"Build a command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/build-a-command-line#hand-the-rest-to-another-program","title":"Hand the rest to another program","page":"Build a command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/build-a-command-line#share-services-through-middleware","title":"Share services through middleware","page":"Build a command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/build-a-command-line#one-file-per-command","title":"One file per command","page":"Build a command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/build-a-command-line#test-a-command","title":"Test a command","page":"Build a command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/build-a-command-line#where-to-go-next","title":"Where to go next","page":"Build a command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/your-apps-command-line","title":"Your app's command line","page":"Your app's command line","section":"Operations & testing","summary":"Give your app commands for work that belongs to no request, and publish its log, database, models, jobs, translations and mailer to them through the same middleware its routes use."},{"href":"/docs/operations-and-testing/your-apps-command-line#where-it-lives","title":"Where it lives","page":"Your app's command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/your-apps-command-line#add-a-command","title":"Add a command","page":"Your app's command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/your-apps-command-line#publish-the-app-s-services","title":"Publish the app's services","page":"Your app's command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/your-apps-command-line#the-log","title":"The log","page":"Your app's command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/your-apps-command-line#the-database-and-a-sql-prompt","title":"The database, and a SQL prompt","page":"Your app's command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/your-apps-command-line#models","title":"Models","page":"Your app's command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/your-apps-command-line#jobs-that-run-where-you-are-watching","title":"Jobs that run where you are watching","page":"Your app's command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/your-apps-command-line#translations","title":"Translations","page":"Your app's command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/your-apps-command-line#mail-that-never-leaves-your-laptop","title":"Mail that never leaves your laptop","page":"Your app's command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/your-apps-command-line#production-data","title":"Production data","page":"Your app's command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/your-apps-command-line#run-app-code-outside-the-server","title":"Run app code outside the server","page":"Your app's command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/your-apps-command-line#test-a-command","title":"Test a command","page":"Your app's command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/your-apps-command-line#where-to-go-next","title":"Where to go next","page":"Your app's command line","section":"Operations & testing"},{"href":"/docs/operations-and-testing/configuration-files","title":"Read configuration files","page":"Read configuration files","section":"Operations & testing","summary":"Parse JSON with comments and trailing commas, point a mistake at its line and column, validate the result, and hand it to every command of a command line."},{"href":"/docs/operations-and-testing/configuration-files#the-file","title":"The file","page":"Read configuration files","section":"Operations & testing"},{"href":"/docs/operations-and-testing/configuration-files#parse-it-and-point-at-the-mistake","title":"Parse it and point at the mistake","page":"Read configuration files","section":"Operations & testing"},{"href":"/docs/operations-and-testing/configuration-files#validate-the-shape","title":"Validate the shape","page":"Read configuration files","section":"Operations & testing"},{"href":"/docs/operations-and-testing/configuration-files#hand-it-to-every-command","title":"Hand it to every command","page":"Read configuration files","section":"Operations & testing"},{"href":"/docs/operations-and-testing/configuration-files#strip-it-for-another-reader","title":"Strip it for another reader","page":"Read configuration files","section":"Operations & testing"},{"href":"/docs/operations-and-testing/configuration-files#where-to-go-next","title":"Where to go next","page":"Read configuration files","section":"Operations & testing"},{"href":"/docs/operations-and-testing/edit-source-files","title":"Edit source files","page":"Edit source files","section":"Operations & testing","summary":"Find the modules a project imports, rename a package across every file, move names to another module, and add declarations and calls, changing only the text each edit touches."},{"href":"/docs/operations-and-testing/edit-source-files#find-what-a-project-imports","title":"Find what a project imports","page":"Edit source files","section":"Operations & testing"},{"href":"/docs/operations-and-testing/edit-source-files#rename-a-package-everywhere","title":"Rename a package everywhere","page":"Edit source files","section":"Operations & testing"},{"href":"/docs/operations-and-testing/edit-source-files#move-names-to-another-module","title":"Move names to another module","page":"Edit source files","section":"Operations & testing"},{"href":"/docs/operations-and-testing/edit-source-files#add-a-declaration-and-its-call","title":"Add a declaration and its call","page":"Edit source files","section":"Operations & testing"},{"href":"/docs/operations-and-testing/edit-source-files#trust-the-output","title":"Trust the output","page":"Edit source files","section":"Operations & testing"},{"href":"/docs/operations-and-testing/edit-source-files#where-to-go-next","title":"Where to go next","page":"Edit source files","section":"Operations & testing"},{"href":"/docs/releases/versioning","title":"Versioning","page":"Versioning","section":"Releases","summary":"Releases are dated rather than semantic, the number records when a release went out, and that is why a dependency is written as one exact date."},{"href":"/docs/releases/versioning#the-number-says-when","title":"The number says when","page":"Versioning","section":"Releases"},{"href":"/docs/releases/versioning#depend-on-one-exact-date","title":"Depend on one exact date","page":"Versioning","section":"Releases"},{"href":"/docs/releases/versioning#why-a-range-is-the-wrong-tool","title":"Why a range is the wrong tool","page":"Versioning","section":"Releases"},{"href":"/docs/license","title":"License","page":"License","section":"License","summary":"Every package in the collection is published under the MIT license, on the same terms, and each one carries its own copy of it."},{"href":"/docs/license#what-the-license-grants","title":"What the license grants","page":"License","section":"License"},{"href":"/api/kit","title":"@sdxc/kit","page":"@sdxc/kit","section":"Packages · The sdxc command","summary":"The sdxc command line: start a Remix v3 app, generate its files, copy UI components into it and upgrade it"},{"href":"/api/kit#installation","title":"Installation","page":"@sdxc/kit","section":"Packages · The sdxc command"},{"href":"/api/kit#usage","title":"Usage","page":"@sdxc/kit","section":"Packages · The sdxc command"},{"href":"/api/kit#releases","title":"Releases","page":"@sdxc/kit","section":"Packages · The sdxc command"},{"href":"/api/kit#api","title":"API","page":"@sdxc/kit","section":"Packages · The sdxc command"},{"href":"/api/kit#commands","title":"Commands","page":"@sdxc/kit","section":"Packages · The sdxc command"},{"href":"/api/kit#configuration","title":"Configuration","page":"@sdxc/kit","section":"Packages · The sdxc command"},{"href":"/api/kit#sdxc-kit-config-schema-json","title":"@sdxc/kit/config.schema.json","page":"@sdxc/kit","section":"Packages · The sdxc command"},{"href":"/api/kit#sdxc-kit-lock-schema-json","title":"@sdxc/kit/lock.schema.json","page":"@sdxc/kit","section":"Packages · The sdxc command"},{"href":"/api/kit#createsdxc-options-and-kitversion","title":"createSDXC(options?) and kitVersion()","page":"@sdxc/kit","section":"Packages · The sdxc command"},{"href":"/api/http","title":"@sdxc/http","page":"@sdxc/http","section":"Packages · HTTP & responses","summary":"Response builders, content negotiation, and HTTP caching for the Fetch API"},{"href":"/api/http#installation","title":"Installation","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#usage","title":"Usage","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#answer-with-json","title":"Answer with JSON","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#use-named-statuses-and-content-types","title":"Use named statuses and content types","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#serve-the-format-the-client-asked-for","title":"Serve the format the client asked for","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#cache-a-page-and-answer-its-revalidations","title":"Cache a page and answer its revalidations","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#answer-head-like-get","title":"Answer HEAD like GET","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#api","title":"API","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-content-type","title":"@sdxc/http/content-type","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-status-code","title":"@sdxc/http/status-code","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-response","title":"@sdxc/http/response","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-response-json","title":"@sdxc/http/response/json","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-response-html","title":"@sdxc/http/response/html","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-negotiate","title":"@sdxc/http/negotiate","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-cache","title":"@sdxc/http/cache","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-middleware-head-requests","title":"@sdxc/http/middleware/head-requests","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#pattern-a-validated-api-endpoint","title":"Pattern: A Validated API Endpoint","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#pattern-a-conditional-write","title":"Pattern: A Conditional Write","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#pattern-revalidate-by-modification-time","title":"Pattern: Revalidate by Modification Time","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#pattern-a-cached-asset-route","title":"Pattern: A Cached Asset Route","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#pattern-a-streamed-csv-download","title":"Pattern: A Streamed CSV Download","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#pattern-post-redirect-get","title":"Pattern: Post, Redirect, Get","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#pattern-server-sent-events","title":"Pattern: Server-Sent Events","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/response","title":"@sdxc/response","page":"@sdxc/response","section":"Packages · HTTP & responses","summary":"Semantic helpers that build Response objects for JSON APIs and redirects"},{"href":"/api/response#installation","title":"Installation","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#usage","title":"Usage","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#answer-with-json","title":"Answer with JSON","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#add-headers","title":"Add headers","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#answer-without-a-body","title":"Answer without a body","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#redirect","title":"Redirect","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#api","title":"API","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#success","title":"Success","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#nocontent-init-response","title":"noContent(init?): Response","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#client-errors","title":"Client errors","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#server-errors","title":"Server errors","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#redirect-target-url-location-string-init-redirect-init-response","title":"redirect(target: URL | Location | string, init?: redirect.Init): Response","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#redirect-status","title":"redirect.Status","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#types","title":"Types","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#pattern-validating-a-request-body","title":"Pattern: Validating A Request Body","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#pattern-narrowing-the-body-on-the-client","title":"Pattern: Narrowing The Body On The Client","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#pattern-post-redirect-get-after-a-form","title":"Pattern: Post-Redirect-Get After A Form","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#pattern-guarding-an-endpoint","title":"Pattern: Guarding An Endpoint","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#pattern-asserting-on-responses-in-tests","title":"Pattern: Asserting On Responses In Tests","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/api-client","title":"@sdxc/api-client","page":"@sdxc/api-client","section":"Packages · HTTP & responses","summary":"Base class for HTTP API clients: one origin, verb methods, shared hooks"},{"href":"/api/api-client#installation","title":"Installation","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#usage","title":"Usage","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#define-a-client-for-one-service","title":"Define a client for one service","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#attach-what-every-request-needs","title":"Attach what every request needs","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#paths-resolve-against-the-base-url","title":"Paths resolve against the base URL","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#api","title":"API","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#new-apiclient-baseurl-url","title":"new APIClient(baseURL: URL)","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#client-fetch-path-string-init-requestinit-promise-response","title":"client.fetch(path: string, init?: RequestInit): Promise<Response>","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#client-get-client-post-client-put-client-patch-client-delete","title":"client.get, client.post, client.put, client.patch, client.delete","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#protected-before-request-request-promise-request","title":"protected before(request: Request): Promise<Request>","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#protected-after-request-request-response-response-promise-response","title":"protected after(request: Request, response: Response): Promise<Response>","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#protected-propagatetrace-all-traceparent-none","title":"protected propagateTrace: \"all\" | \"traceparent\" | \"none\"","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#protected-baseurl-url","title":"protected baseURL: URL","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#types","title":"Types","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#pattern-methods-that-return-data","title":"Pattern: Methods That Return Data","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#pattern-one-error-policy-for-every-call","title":"Pattern: One Error Policy For Every Call","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#pattern-carry-the-trace-across-services","title":"Pattern: Carry The Trace Across Services","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#pattern-stubbing-the-origin-in-tests","title":"Pattern: Stubbing The Origin In Tests","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip","title":"@sdxc/get-client-ip","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses","summary":"Read the client IP from a Cloudflare Workers request"},{"href":"/api/get-client-ip#installation","title":"Installation","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#usage","title":"Usage","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#read-the-caller-s-address","title":"Read the caller's address","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#fall-back-when-there-is-no-address","title":"Fall back when there is no address","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#publish-it-on-every-request","title":"Publish it on every request","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#api","title":"API","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#getclientip-request-request-ip-null","title":"getClientIP(request: Request): IP | null","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#sdxc-get-client-ip-middleware","title":"@sdxc/get-client-ip/middleware","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#pattern-rate-limiting-per-client-network","title":"Pattern: Rate Limiting Per Client Network","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#pattern-restricting-routes-to-a-network","title":"Pattern: Restricting Routes To A Network","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#pattern-attaching-the-address-to-a-log-line","title":"Pattern: Attaching The Address To A Log Line","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#pattern-pairing-it-with-cloudflare-s-geolocation","title":"Pattern: Pairing It With Cloudflare's Geolocation","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/ip","title":"@sdxc/ip","page":"@sdxc/ip","section":"Packages · HTTP & responses","summary":"IPv4 and IPv6 addresses and ranges as value objects that classify against the IANA special-purpose registries"},{"href":"/api/ip#installation","title":"Installation","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#usage","title":"Usage","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#parse-an-address","title":"Parse an address","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#classify-it","title":"Classify it","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#test-a-range","title":"Test a range","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#api","title":"API","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#ip-parse-text-string-result-ip-ip-error","title":"IP.parse(text: string): Result<IP, IP.Error>","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#ip","title":"IP","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#ip-range-parse-text-string-result-ip-range-ip-error","title":"IP.Range.parse(text: string): Result<IP.Range, IP.Error>","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#ip-range","title":"IP.Range","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#ip-error","title":"IP.Error","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#types","title":"Types","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#pattern-refusing-a-name-that-resolves-inside-the-network","title":"Pattern: Refusing A Name That Resolves Inside The Network","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#pattern-an-allowlist-of-networks","title":"Pattern: An Allowlist Of Networks","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#pattern-keying-a-rate-limit-on-the-client-s-network","title":"Pattern: Keying A Rate Limit On The Client's Network","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#pattern-reporting-why-input-was-refused","title":"Pattern: Reporting Why Input Was Refused","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/ip#pattern-functions-that-only-accept-a-checked-address","title":"Pattern: Functions That Only Accept A Checked Address","page":"@sdxc/ip","section":"Packages · HTTP & responses"},{"href":"/api/outbound","title":"@sdxc/outbound","page":"@sdxc/outbound","section":"Packages · HTTP & responses","summary":"Check, follow and read URLs a stranger chose: public hosts on every redirect, one deadline, bounded bodies"},{"href":"/api/outbound#installation","title":"Installation","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#usage","title":"Usage","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#check-a-url","title":"Check a URL","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#follow-it-and-read-the-body","title":"Follow it and read the body","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#handle-the-failure","title":"Handle the failure","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#api","title":"API","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#checkurl-input-string-url-options-checkoptions-result-url-outbounderror","title":"checkUrl(input: string | URL, options?: CheckOptions): Result<URL, OutboundError>","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#follow-input-string-url-options-followoptions-promise-result-followed-outbounderror","title":"follow(input: string | URL, options?: FollowOptions): Promise<Result<Followed, OutboundError>>","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#resolvehost-url-url-options-signal-abortsignal-promise-result-string-outbounderror","title":"resolveHost(url: URL, options?: { signal?: AbortSignal }): Promise<Result<string[], OutboundError>>","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#readtext-message-request-response-options-maxbytes-number-promise-result-readtext-outbounderror","title":"readText(message: Request | Response, options: { maxBytes: number }): Promise<Result<ReadText, OutboundError>>","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#readbytes-message-request-response-options-maxbytes-number-promise-result-readbytes-outbounderror","title":"readBytes(message: Request | Response, options: { maxBytes: number }): Promise<Result<ReadBytes, OutboundError>>","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#limitbody-response-response-options-maxbytes-number-response","title":"limitBody(response: Response, options: { maxBytes: number }): Response","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#release-body-cancel-promise-void-null-void","title":"release(body: { cancel(): Promise<void> } | null): void","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#outbounderror","title":"OutboundError","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#types","title":"Types","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#pattern-fetching-a-subscribed-feed","title":"Pattern: Fetching A Subscribed Feed","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#pattern-proxying-an-embedded-image","title":"Pattern: Proxying An Embedded Image","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#pattern-capping-an-incoming-body","title":"Pattern: Capping An Incoming Body","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#pattern-posting-to-a-url-a-stranger-chose","title":"Pattern: Posting To A URL A Stranger Chose","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#pattern-checking-dns-answers","title":"Pattern: Checking DNS Answers","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/outbound#pattern-reaching-your-own-network-on-purpose","title":"Pattern: Reaching Your Own Network On Purpose","page":"@sdxc/outbound","section":"Packages · HTTP & responses"},{"href":"/api/user-agent","title":"@sdxc/user-agent","page":"@sdxc/user-agent","section":"Packages · HTTP & responses","summary":"Read a User-Agent string into its browser, engine, operating system and device"},{"href":"/api/user-agent#installation","title":"Installation","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#usage","title":"Usage","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#parse-a-header","title":"Parse a header","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#tell-bots-apart","title":"Tell bots apart","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#parse-once-per-request","title":"Parse once per request","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#ask-a-question-of-it","title":"Ask a question of it","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#api","title":"API","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#parse-useragent-string-useragent","title":"parse(userAgent: string): UserAgent","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#isbot-header-string-boolean","title":"isBot(header: string): boolean","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#useragent-middleware","title":"userAgent(): Middleware","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#currentuseragent","title":"CurrentUserAgent","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#predicates","title":"Predicates","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#types","title":"Types","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#pattern-naming-a-device-a-person-will-recognize","title":"Pattern: Naming A Device A Person Will Recognize","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#pattern-serving-a-platform-s-own-download","title":"Pattern: Serving A Platform's Own Download","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#pattern-counting-only-human-visits","title":"Pattern: Counting Only Human Visits","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#pattern-adapting-a-view-deep-in-a-render","title":"Pattern: Adapting A View Deep In A Render","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#pattern-gating-on-a-browser-version","title":"Pattern: Gating On A Browser Version","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields","title":"@sdxc/structured-fields","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses","summary":"Parse and serialize RFC 9651 structured HTTP field values"},{"href":"/api/structured-fields#installation","title":"Installation","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#usage","title":"Usage","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#write-a-field","title":"Write a field","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#read-the-untyped-model","title":"Read the untyped model","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#keep-a-type-a-primitive-cannot-carry","title":"Keep a type a primitive cannot carry","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#read-a-field-through-a-schema","title":"Read a field through a schema","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#api","title":"API","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#sdxc-structured-fields","title":"@sdxc/structured-fields","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#sdxc-structured-fields-schema","title":"@sdxc/structured-fields/schema","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#types","title":"Types","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#pattern-read-cache-status-hops","title":"Pattern: Read Cache-Status Hops","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#pattern-an-idempotency-key-item","title":"Pattern: An Idempotency-Key Item","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#pattern-digests-as-byte-sequences","title":"Pattern: Digests As Byte Sequences","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#pattern-inner-lists-with-parameters","title":"Pattern: Inner Lists With Parameters","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#pattern-write-only-the-members-you-have","title":"Pattern: Write Only The Members You Have","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#pattern-branch-on-why-a-field-failed","title":"Pattern: Branch On Why A Field Failed","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/link-header","title":"@sdxc/link-header","page":"@sdxc/link-header","section":"Packages · HTTP & responses","summary":"Parse and stringify RFC 8288 Link headers"},{"href":"/api/link-header#installation","title":"Installation","page":"@sdxc/link-header","section":"Packages · HTTP & responses"},{"href":"/api/link-header#usage","title":"Usage","page":"@sdxc/link-header","section":"Packages · HTTP & responses"},{"href":"/api/link-header#parse-a-header","title":"Parse a header","page":"@sdxc/link-header","section":"Packages · HTTP & responses"},{"href":"/api/link-header#write-a-header","title":"Write a header","page":"@sdxc/link-header","section":"Packages · HTTP & responses"},{"href":"/api/link-header#merge-without-dropping-foreign-links","title":"Merge without dropping foreign links","page":"@sdxc/link-header","section":"Packages · HTTP & responses"},{"href":"/api/link-header#api","title":"API","page":"@sdxc/link-header","section":"Packages · HTTP & responses"},{"href":"/api/link-header#parse-header-string-null-link","title":"parse(header: string | null): Link[]","page":"@sdxc/link-header","section":"Packages · HTTP & responses"},{"href":"/api/link-header#stringify-links-readonly-link-readonly-string-string-null","title":"stringify(links: readonly Link[] | readonly string[]): string | null","page":"@sdxc/link-header","section":"Packages · HTTP & responses"},{"href":"/api/link-header#serializelink-target-string-rel-string-params-record-string-string-string","title":"serializeLink(target: string, rel: string, params?: Record<string, string>): string","page":"@sdxc/link-header","section":"Packages · HTTP & responses"},{"href":"/api/link-header#types","title":"Types","page":"@sdxc/link-header","section":"Packages · HTTP & responses"},{"href":"/api/link-header#pattern-follow-next-links-as-a-client","title":"Pattern: Follow Next Links As A Client","page":"@sdxc/link-header","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields","title":"@sdxc/digest-fields","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses","summary":"RFC 9530 Content-Digest and Repr-Digest, plus the RFC 3230 Digest header"},{"href":"/api/digest-fields#installation","title":"Installation","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#usage","title":"Usage","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#digest-a-body","title":"Digest a body","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#write-the-field","title":"Write the field","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#read-a-field","title":"Read a field","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#verify-a-received-body","title":"Verify a received body","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#api","title":"API","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#digest-bytes-binarylike-algorithm-digestalgorithm-promise-result-uint8array-digesterror","title":"digest(bytes: BinaryLike, algorithm: DigestAlgorithm): Promise<Result<Uint8Array, DigestError>>","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#parse-value-string-field-digestfield-result-fieldvalues-field-digesterror","title":"parse(value: string, field: DigestField): Result<FieldValues[field], DigestError>","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#stringify-value-fieldvalues-field-field-digestfield-result-string-digesterror","title":"stringify(value: FieldValues[field], field: DigestField): Result<string, DigestError>","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#verify-headers-headers-body-binarylike-options-verifyoptions-promise-result-void-digesterror","title":"verify(headers: Headers, body: BinaryLike, options: VerifyOptions): Promise<Result<void, DigestError>>","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#digest-algorithms","title":"DIGEST_ALGORITHMS","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#digesterror","title":"DigestError","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#types","title":"Types","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#pattern-signing-ready-outbound-request","title":"Pattern: Signing-Ready Outbound Request","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#pattern-verifying-whichever-field-the-sender-used","title":"Pattern: Verifying Whichever Field the Sender Used","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/digest-fields#pattern-answering-want-content-digest","title":"Pattern: Answering Want-Content-Digest","page":"@sdxc/digest-fields","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures","title":"@sdxc/http-signatures","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses","summary":"Sign and verify HTTP requests with RFC 9421 message signatures or draft-cavage-12"},{"href":"/api/http-signatures#installation","title":"Installation","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#usage","title":"Usage","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#sign-a-request","title":"Sign a request","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#verify-a-request","title":"Verify a request","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#read-and-write-the-fields","title":"Read and write the fields","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#api","title":"API","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#sign-request-request-options-signoptions-promise-result-request-httpsignatureerror","title":"sign(request: Request, options: SignOptions): Promise<Result<Request, HttpSignatureError>>","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#verify-request-request-options-verifyoptions-promise-result-verified-httpsignatureerror","title":"verify(request: Request, options: VerifyOptions): Promise<Result<Verified, HttpSignatureError>>","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#parsesignatureinput-text-stringifysignatureinput-inputs","title":"parseSignatureInput(text) / stringifySignatureInput(inputs)","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#parsesignature-text-stringifysignature-signatures","title":"parseSignature(text) / stringifySignature(signatures)","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#parseacceptsignature-text-stringifyacceptsignature-requests","title":"parseAcceptSignature(text) / stringifyAcceptSignature(requests)","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#parsecavagesignature-text-stringifycavagesignature-signature","title":"parseCavageSignature(text) / stringifyCavageSignature(signature)","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#httpsignatureerror","title":"HttpSignatureError","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#types","title":"Types","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#pattern-falling-back-from-rfc-9421-to-draft-cavage","title":"Pattern: Falling back from RFC 9421 to draft-cavage","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#pattern-verifying-with-keys-from-pem","title":"Pattern: Verifying with keys from PEM","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#pattern-answering-verification-failures","title":"Pattern: Answering verification failures","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#pattern-asking-for-a-signature-with-accept-signature","title":"Pattern: Asking for a signature with Accept-Signature","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/http-signatures#pattern-covering-query-parameters-under-a-second-signature","title":"Pattern: Covering query parameters under a second signature","page":"@sdxc/http-signatures","section":"Packages · HTTP & responses"},{"href":"/api/server-timing","title":"@sdxc/server-timing","page":"@sdxc/server-timing","section":"Packages · HTTP & responses","summary":"Server-Timing measurements collected per request and written to a response header"},{"href":"/api/server-timing#installation","title":"Installation","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#usage","title":"Usage","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#measure-and-report","title":"Measure and report","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#time-several-operations","title":"Time several operations","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#annotate-an-existing-response","title":"Annotate an existing response","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#api","title":"API","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#new-timingcollector","title":"new TimingCollector()","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#collector-measure-t-name-string-description-string-fn-promise-t-promise-t","title":"collector.measure<T>(name: string, description: string, fn: () => Promise<T>): Promise<T>","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#collector-tostring-string","title":"collector.toString(): string","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#collector-toheaders-headers-headers-headers","title":"collector.toHeaders(headers?: Headers): Headers","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#pattern-timing-every-request","title":"Pattern: Timing every request","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#pattern-measuring-across-layers","title":"Pattern: Measuring across layers","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#pattern-reporting-a-failed-call","title":"Pattern: Reporting a failed call","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware","title":"@sdxc/catch-response-middleware","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses","summary":"Router middleware that turns a thrown Response into the request's response"},{"href":"/api/catch-response-middleware#installation","title":"Installation","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware#usage","title":"Usage","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware#install-it-on-the-router","title":"Install it on the router","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware#throw-from-a-helper","title":"Throw from a helper","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware#api","title":"API","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware#catchresponse-middleware","title":"catchResponse(): Middleware","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware#pattern-order-it-below-response-observing-middleware","title":"Pattern: Order It Below Response-Observing Middleware","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware#pattern-guard-a-route-from-middleware","title":"Pattern: Guard A Route From Middleware","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware#pattern-throw-error-responses-from-data-helpers","title":"Pattern: Throw Error Responses From Data Helpers","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/assets-middleware","title":"@sdxc/assets-middleware","page":"@sdxc/assets-middleware","section":"Packages · HTTP & responses","summary":"Router middleware that resolves a document's stylesheets and client entry once per request and publishes them on the request context as ctx.assets"},{"href":"/api/assets-middleware#installation","title":"Installation","page":"@sdxc/assets-middleware","section":"Packages · HTTP & responses"},{"href":"/api/assets-middleware#usage","title":"Usage","page":"@sdxc/assets-middleware","section":"Packages · HTTP & responses"},{"href":"/api/assets-middleware#publish-the-document-s-assets","title":"Publish the document's assets","page":"@sdxc/assets-middleware","section":"Packages · HTTP & responses"},{"href":"/api/assets-middleware#read-ctx-assets-in-a-route","title":"Read ctx.assets in a route","page":"@sdxc/assets-middleware","section":"Packages · HTTP & responses"},{"href":"/api/assets-middleware#api","title":"API","page":"@sdxc/assets-middleware","section":"Packages · HTTP & responses"},{"href":"/api/assets-middleware#assets-resolver-documentassetsresolver-options-assetsoptions-middleware","title":"assets(resolver: DocumentAssetsResolver, options: AssetsOptions): Middleware","page":"@sdxc/assets-middleware","section":"Packages · HTTP & responses"},{"href":"/api/assets-middleware#assets","title":"Assets","page":"@sdxc/assets-middleware","section":"Packages · HTTP & responses"},{"href":"/api/assets-middleware#types","title":"Types","page":"@sdxc/assets-middleware","section":"Packages · HTTP & responses"},{"href":"/api/assets-middleware#pattern-a-document-shell","title":"Pattern: A Document Shell","page":"@sdxc/assets-middleware","section":"Packages · HTTP & responses"},{"href":"/api/assets-middleware#pattern-stylesheets-from-several-modules","title":"Pattern: Stylesheets From Several Modules","page":"@sdxc/assets-middleware","section":"Packages · HTTP & responses"},{"href":"/api/assets-middleware#pattern-a-csp-nonce-for-the-import-map","title":"Pattern: A CSP Nonce For The Import Map","page":"@sdxc/assets-middleware","section":"Packages · HTTP & responses"},{"href":"/api/assets-middleware#pattern-reading-the-assets-by-key","title":"Pattern: Reading The Assets By Key","page":"@sdxc/assets-middleware","section":"Packages · HTTP & responses"},{"href":"/api/assets-middleware#pattern-fixed-assets-in-a-test","title":"Pattern: Fixed Assets In A Test","page":"@sdxc/assets-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware","title":"@sdxc/trailing-slash-middleware","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses","summary":"Router middleware that redirects every path to one canonical trailing-slash form"},{"href":"/api/trailing-slash-middleware#installation","title":"Installation","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#usage","title":"Usage","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#strip-trailing-slashes","title":"Strip trailing slashes","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#enforce-a-trailing-slash","title":"Enforce a trailing slash","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#the-longhand","title":"The longhand","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#api","title":"API","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#trailingslash-options-trailingslashoptions-middleware","title":"trailingSlash(options?: TrailingSlashOptions): Middleware","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#types","title":"Types","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#pattern-placing-it-first","title":"Pattern: Placing It First","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#pattern-forms-keep-their-method","title":"Pattern: Forms Keep Their Method","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#pattern-directory-urls-beside-static-files","title":"Pattern: Directory URLs Beside Static Files","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#pattern-picking-the-mode-once","title":"Pattern: Picking The Mode Once","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/no-www-middleware","title":"@sdxc/no-www-middleware","page":"@sdxc/no-www-middleware","section":"Packages · HTTP & responses","summary":"Router middleware that permanently redirects a www. hostname to the apex domain"},{"href":"/api/no-www-middleware#installation","title":"Installation","page":"@sdxc/no-www-middleware","section":"Packages · HTTP & responses"},{"href":"/api/no-www-middleware#usage","title":"Usage","page":"@sdxc/no-www-middleware","section":"Packages · HTTP & responses"},{"href":"/api/no-www-middleware#redirect-to-the-apex-domain","title":"Redirect to the apex domain","page":"@sdxc/no-www-middleware","section":"Packages · HTTP & responses"},{"href":"/api/no-www-middleware#the-longhand","title":"The longhand","page":"@sdxc/no-www-middleware","section":"Packages · HTTP & responses"},{"href":"/api/no-www-middleware#api","title":"API","page":"@sdxc/no-www-middleware","section":"Packages · HTTP & responses"},{"href":"/api/no-www-middleware#nowww-middleware","title":"noWWW(): Middleware","page":"@sdxc/no-www-middleware","section":"Packages · HTTP & responses"},{"href":"/api/no-www-middleware#pattern-canonical-host-ahead-of-other-middleware","title":"Pattern: Canonical Host Ahead of Other Middleware","page":"@sdxc/no-www-middleware","section":"Packages · HTTP & responses"},{"href":"/api/no-www-middleware#pattern-form-posts-through-the-redirect","title":"Pattern: Form Posts Through the Redirect","page":"@sdxc/no-www-middleware","section":"Packages · HTTP & responses"},{"href":"/api/no-www-middleware#pattern-observe-redirects-from-an-outer-middleware","title":"Pattern: Observe Redirects From an Outer Middleware","page":"@sdxc/no-www-middleware","section":"Packages · HTTP & responses"},{"href":"/api/well-known","title":"@sdxc/well-known","page":"@sdxc/well-known","section":"Packages · HTTP & responses","summary":"Typed documents for well-known URIs: security.txt, WebFinger, NodeInfo, OAuth and OIDC metadata, JWKS and more"},{"href":"/api/well-known#installation","title":"Installation","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#usage","title":"Usage","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#find-a-document-s-url","title":"Find a document's URL","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#read-a-fetched-document","title":"Read a fetched document","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#write-a-document","title":"Write a document","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#serve-it","title":"Serve it","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#api","title":"API","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known","title":"@sdxc/well-known","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#every-document-subpath","title":"Every document subpath","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-security-txt-rfc-9116","title":"@sdxc/well-known/security-txt (RFC 9116)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-webfinger-rfc-7033","title":"@sdxc/well-known/webfinger (RFC 7033)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-oauth-authorization-server-rfc-8414","title":"@sdxc/well-known/oauth-authorization-server (RFC 8414)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-openid-configuration-openid-connect-discovery-1-0","title":"@sdxc/well-known/openid-configuration (OpenID Connect Discovery 1.0)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-oauth-protected-resource-rfc-9728","title":"@sdxc/well-known/oauth-protected-resource (RFC 9728)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-jwks-rfc-7517","title":"@sdxc/well-known/jwks (RFC 7517)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-change-password-w3c","title":"@sdxc/well-known/change-password (W3C)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-passkey-endpoints-w3c","title":"@sdxc/well-known/passkey-endpoints (W3C)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-nodeinfo-nodeinfo-2-0-and-2-1","title":"@sdxc/well-known/nodeinfo (NodeInfo 2.0 and 2.1)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-response","title":"@sdxc/well-known/response","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-middleware","title":"@sdxc/well-known/middleware","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#types","title":"Types","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#pattern-security-txt-webfinger-and-change-password-on-one-router","title":"Pattern: security.txt, WebFinger And Change-Password On One Router","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#pattern-openid-connect-discovery-with-its-key-set","title":"Pattern: OpenID Connect Discovery With Its Key Set","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#pattern-protected-resource-metadata-for-a-bearer-token-api","title":"Pattern: Protected Resource Metadata For A Bearer-Token API","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#pattern-discovering-an-authorization-server-from-a-resource","title":"Pattern: Discovering An Authorization Server From A Resource","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#pattern-importing-a-fetched-key-set","title":"Pattern: Importing A Fetched Key Set","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#pattern-advertising-a-server-through-nodeinfo","title":"Pattern: Advertising A Server Through NodeInfo","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#pattern-passkey-endpoints-for-password-managers","title":"Pattern: Passkey Endpoints For Password Managers","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/openapi","title":"@sdxc/openapi","page":"@sdxc/openapi","section":"Packages · API design","summary":"Build, serve and check OpenAPI 3.1 documents from typed operations"},{"href":"/api/openapi#installation","title":"Installation","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#usage","title":"Usage","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#declare-an-operation","title":"Declare an operation","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#build-and-serve-the-document","title":"Build and serve the document","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#parse-a-request-through-the-operation","title":"Parse a request through the operation","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#api","title":"API","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#sdxc-openapi","title":"@sdxc/openapi","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#sdxc-openapi-security","title":"@sdxc/openapi/security","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#sdxc-openapi-router","title":"@sdxc/openapi/router","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#sdxc-openapi-testing","title":"@sdxc/openapi/testing","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#types","title":"Types","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#pattern-query-strings-forms-and-response-headers","title":"Pattern: Query Strings, Forms And Response Headers","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#pattern-secured-operations-and-their-scopes","title":"Pattern: Secured Operations And Their Scopes","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#pattern-a-drift-test","title":"Pattern: A Drift Test","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#pattern-conformance-across-a-test-suite","title":"Pattern: Conformance Across A Test Suite","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#pattern-read-a-published-document","title":"Pattern: Read A Published Document","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/problem","title":"@sdxc/problem","page":"@sdxc/problem","section":"Packages · API design","summary":"Build, detect and parse RFC 9457 problem details, cataloged per API"},{"href":"/api/problem#installation","title":"Installation","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#usage","title":"Usage","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#answer-with-a-problem","title":"Answer with a problem","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#declare-a-catalog","title":"Declare a catalog","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#read-a-problem","title":"Read a problem","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#report-validation-failures","title":"Report validation failures","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#api","title":"API","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#problem-options-problemoptions-init-responseinit-response","title":"problem(options: ProblemOptions, init?: ResponseInit): Response","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#stringify-options-problemoptions-string","title":"stringify(options: ProblemOptions): string","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#defineproblems-base-string-entries-problementries-problemcatalog","title":"defineProblems(base: string, entries: ProblemEntries): ProblemCatalog","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#isproblem-message-request-response-boolean","title":"isProblem(message: Request | Response): boolean","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#parseproblem-response-response-options-promise-result-problem-problemparseerror","title":"parseProblem(response: Response, options?): Promise<Result<Problem, ProblemParseError>>","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#parse-text-string-options-parseoptions-result-problem-problemparseerror","title":"parse(text: string, options?: ParseOptions): Result<Problem, ProblemParseError>","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#validationproblem-issues-problemissue-options-response","title":"validationProblem(issues: ProblemIssue[], options?): Response","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#issuesfrom-source-code-invalid-problemissue","title":"issuesFrom(source, code = \"invalid\"): ProblemIssue[]","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#topointer-path-string","title":"toPointer(path): string","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#issues-schema","title":"ISSUES_SCHEMA","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#problemparseerror","title":"ProblemParseError","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#problem-media-type-about-blank","title":"PROBLEM_MEDIA_TYPE, ABOUT_BLANK","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#types","title":"Types","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#pattern-share-a-catalog-between-a-server-and-its-client","title":"Pattern: Share A Catalog Between A Server And Its Client","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#pattern-render-an-error-reference-from-the-catalog","title":"Pattern: Render An Error Reference From The Catalog","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#pattern-validation-failures-with-custom-codes","title":"Pattern: Validation Failures With Custom Codes","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#pattern-read-a-third-party-api-s-problems","title":"Pattern: Read A Third-Party API's Problems","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#pattern-problems-outside-http","title":"Pattern: Problems Outside HTTP","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/json-schema","title":"@sdxc/json-schema","page":"@sdxc/json-schema","section":"Packages · API design","summary":"Schema builders that validate like remix/data-schema and emit JSON Schema"},{"href":"/api/json-schema#installation","title":"Installation","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#usage","title":"Usage","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#validate-a-request-body","title":"Validate a request body","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#describe-it-as-json-schema","title":"Describe it as JSON Schema","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#name-and-annotate-schemas","title":"Name and annotate schemas","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#recursive-schemas","title":"Recursive schemas","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#api","title":"API","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#combinators","title":"Combinators","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#schema-methods","title":"Schema methods","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#tojsonschema-schema-standardjsonschemav1-options-tojsonschemaoptions-result-jsonschema-jsonschemaconversionerror","title":"toJSONSchema(schema: StandardJSONSchemaV1, options?: ToJSONSchemaOptions): Result<JSONSchema, JSONSchemaConversionError>","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#withjsonschema-schema-jsonschema-jsonschema-input-jsonschema-output-jsonschema-schema","title":"withJSONSchema(schema, jsonSchema: JSONSchema | { input: JSONSchema; output: JSONSchema }): Schema","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#jsonschemaconversionerror","title":"JSONSchemaConversionError","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#parse-parsesafe-validationerror","title":"parse, parseSafe, ValidationError","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#sdxc-json-schema-checks","title":"@sdxc/json-schema/checks","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#sdxc-json-schema-coerce","title":"@sdxc/json-schema/coerce","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#types","title":"Types","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#pattern-a-path-parameter-that-documents-its-format","title":"Pattern: A Path Parameter That Documents Its Format","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#pattern-a-query-string-with-coercion","title":"Pattern: A Query String With Coercion","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#pattern-a-tagged-union-of-events","title":"Pattern: A Tagged Union Of Events","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#pattern-a-shape-the-combinators-cannot-express","title":"Pattern: A Shape The Combinators Cannot Express","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#pattern-hand-a-schema-to-a-standard-json-schema-tool","title":"Pattern: Hand A Schema To A Standard JSON Schema Tool","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-pointer","title":"@sdxc/json-pointer","page":"@sdxc/json-pointer","section":"Packages · API design","summary":"Parse, stringify, get and set RFC 6901 JSON Pointers"},{"href":"/api/json-pointer#installation","title":"Installation","page":"@sdxc/json-pointer","section":"Packages · API design"},{"href":"/api/json-pointer#usage","title":"Usage","page":"@sdxc/json-pointer","section":"Packages · API design"},{"href":"/api/json-pointer#api","title":"API","page":"@sdxc/json-pointer","section":"Packages · API design"},{"href":"/api/json-pointer#stringify-segments-readonly-string-number-string","title":"stringify(segments: readonly (string | number)[]): string","page":"@sdxc/json-pointer","section":"Packages · API design"},{"href":"/api/json-pointer#parse-pointer-string-result-string-jsonpointerparseerror","title":"parse(pointer: string): Result<string[], JsonPointerParseError>","page":"@sdxc/json-pointer","section":"Packages · API design"},{"href":"/api/json-pointer#get-document-unknown-pointer-string-result-unknown-jsonpointererror","title":"get(document: unknown, pointer: string): Result<unknown, JsonPointerError>","page":"@sdxc/json-pointer","section":"Packages · API design"},{"href":"/api/json-pointer#set-document-unknown-pointer-string-value-unknown-result-unknown-jsonpointererror","title":"set(document: unknown, pointer: string, value: unknown): Result<unknown, JsonPointerError>","page":"@sdxc/json-pointer","section":"Packages · API design"},{"href":"/api/json-pointer#types","title":"Types","page":"@sdxc/json-pointer","section":"Packages · API design"},{"href":"/api/json-pointer#pattern-report-a-validation-issue-as-a-pointer","title":"Pattern: Report a validation issue as a pointer","page":"@sdxc/json-pointer","section":"Packages · API design"},{"href":"/api/json-pointer#pattern-update-one-field-without-inventing-parents","title":"Pattern: Update one field without inventing parents","page":"@sdxc/json-pointer","section":"Packages · API design"},{"href":"/api/pagination","title":"@sdxc/pagination","page":"@sdxc/pagination","section":"Packages · API design","summary":"Offset and keyset pagination with parameter parsing and Link headers"},{"href":"/api/pagination#installation","title":"Installation","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#usage","title":"Usage","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#page-arithmetic","title":"Page arithmetic","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#offset-paging-from-request-parameters","title":"Offset paging from request parameters","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#keyset-paging-for-a-long-feed","title":"Keyset paging for a long feed","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#advertise-the-page-in-the-response","title":"Advertise the page in the response","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#api","title":"API","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#new-pagination-init-paginationinit","title":"new Pagination(init: PaginationInit)","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pagination-series-options-pageseriesoptions-pageseries","title":"pagination.series(options?: PageSeriesOptions): PageSeries","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pagination-tojson-paginationjson","title":"pagination.toJSON(): PaginationJSON","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pagination-byoffset-query-options-offsetoptions-promise-result-page-t-paginationerror","title":"Pagination.byOffset(query, options: OffsetOptions): Promise<Result<Page<T>, PaginationError>>","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pagination-bykeyset-query-options-keysetoptions-promise-result-keysetpage-t-paginationerror","title":"Pagination.byKeyset(query, options: KeysetOptions): Promise<Result<KeysetPage<T>, PaginationError>>","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#parsepageparams-searchparams-options-parsepageparamsoptions-result-pageparams-validationerror","title":"parsePageParams(searchParams, options?: ParsePageParamsOptions): Result<PageParams, ValidationError>","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#createpaging-options-createpagingoptions-paging","title":"createPaging(options?: CreatePagingOptions): Paging","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#paginate-headers-page-options-paginateoptions-headers","title":"paginate(headers, page, options: PaginateOptions): Headers","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#parselinkheader-header-string-null-linkvalue","title":"parseLinkHeader(header: string | null): LinkValue[]","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#serializelinkheader-links-readonly-linkvalue-readonly-string-string-null","title":"serializeLinkHeader(links: readonly LinkValue[] | readonly string[]): string | null","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#serializelink-target-string-rel-string-params-record-string-string-string","title":"serializeLink(target: string, rel: string, params?: Record<string, string>): string","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#encodecursor-direction-columns-values-result-string-unencodablecursorvalueerror","title":"encodeCursor(direction, columns, values): Result<string, UnencodableCursorValueError>","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#decodecursor-cursor-string-result-decodedcursor-invalidcursorerror","title":"decodeCursor(cursor: string): Result<DecodedCursor, InvalidCursorError>","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#defaults","title":"Defaults","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#errors","title":"Errors","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#types","title":"Types","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pattern-one-api-both-strategies","title":"Pattern: One API, Both Strategies","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pattern-answering-each-error","title":"Pattern: Answering Each Error","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pattern-rendering-a-numbered-pager","title":"Pattern: Rendering A Numbered Pager","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pattern-page-numbers-in-the-body","title":"Pattern: Page Numbers In The Body","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pattern-following-next-links-as-a-client","title":"Pattern: Following Next Links As A Client","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pattern-paging-links-beside-other-links","title":"Pattern: Paging Links Beside Other Links","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/idempotency","title":"@sdxc/idempotency","page":"@sdxc/idempotency","section":"Packages · API design","summary":"Idempotency-Key requests: replay the first response, refuse conflicting reuse"},{"href":"/api/idempotency#installation","title":"Installation","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#usage","title":"Usage","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#send-a-key","title":"Send a key","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#protect-a-route","title":"Protect a route","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#store-records-in-sql","title":"Store records in SQL","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#api","title":"API","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#sdxc-idempotency","title":"@sdxc/idempotency","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#sdxc-idempotency-middleware","title":"@sdxc/idempotency/middleware","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#sdxc-idempotency-data-table","title":"@sdxc/idempotency/data-table","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#sdxc-idempotency-memory","title":"@sdxc/idempotency/memory","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#sdxc-idempotency-client","title":"@sdxc/idempotency/client","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#types","title":"Types","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#pattern-refusals-from-your-problem-catalog","title":"Pattern: Refusals From Your Problem Catalog","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#pattern-tuning-what-is-compared-and-stored","title":"Pattern: Tuning What Is Compared And Stored","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#pattern-a-durable-object-as-the-store","title":"Pattern: A Durable Object As The Store","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#pattern-keys-for-retried-jobs","title":"Pattern: Keys For Retried Jobs","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#pattern-a-key-on-every-write-of-an-api-client","title":"Pattern: A Key On Every Write Of An API Client","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#pattern-forward-the-client-s-key-upstream","title":"Pattern: Forward The Client's Key Upstream","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/merge-patch","title":"@sdxc/merge-patch","page":"@sdxc/merge-patch","section":"Packages · API design","summary":"Apply, diff and read RFC 7396 JSON Merge Patch documents"},{"href":"/api/merge-patch#installation","title":"Installation","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#usage","title":"Usage","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#apply-a-patch","title":"Apply a patch","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#compute-a-patch","title":"Compute a patch","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#parse-and-write-patch-text","title":"Parse and write patch text","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#read-a-patch-request","title":"Read a PATCH request","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#api","title":"API","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#sdxc-merge-patch","title":"@sdxc/merge-patch","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#sdxc-merge-patch-request","title":"@sdxc/merge-patch/request","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#types","title":"Types","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#pattern-validate-a-patch-with-the-create-schema","title":"Pattern: Validate A PATCH With The Create Schema","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#pattern-send-only-what-changed","title":"Pattern: Send Only What Changed","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#pattern-type-the-patches-a-client-builds","title":"Pattern: Type The Patches A Client Builds","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#pattern-adopt-merge-patch-on-an-existing-endpoint","title":"Pattern: Adopt Merge Patch On An Existing Endpoint","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/auth","title":"@sdxc/auth","page":"@sdxc/auth","section":"Packages · Identity & security","summary":"OAuth 2.0 and OpenID Connect client for any runtime that speaks Request and Response"},{"href":"/api/auth#installation","title":"Installation","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#usage","title":"Usage","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#point-at-an-issuer","title":"Point at an issuer","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sign-a-person-in","title":"Sign a person in","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#read-the-session","title":"Read the session","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#call-an-api-as-the-app-itself","title":"Call an API as the app itself","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#accept-bearer-tokens","title":"Accept bearer tokens","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#api","title":"API","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-issuer","title":"@sdxc/auth/issuer","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-relying-party","title":"@sdxc/auth/relying-party","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-auth-session","title":"@sdxc/auth/auth-session","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-service-client","title":"@sdxc/auth/service-client","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-resource-server","title":"@sdxc/auth/resource-server","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-protected-resource","title":"@sdxc/auth/protected-resource","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-bearer-challenge","title":"@sdxc/auth/bearer-challenge","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-management-client","title":"@sdxc/auth/management-client","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-id-token","title":"@sdxc/auth/id-token","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-access-token","title":"@sdxc/auth/access-token","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-auth-error","title":"@sdxc/auth/auth-error","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-remix-context","title":"@sdxc/auth/remix/context","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-remix-schemes","title":"@sdxc/auth/remix/schemes","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-remix-authorization","title":"@sdxc/auth/remix/authorization","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#types","title":"Types","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#pattern-wiring-a-remix-router","title":"Pattern: Wiring A Remix Router","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#pattern-step-up-authentication","title":"Pattern: Step-Up Authentication","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#pattern-an-api-that-describes-itself","title":"Pattern: An API That Describes Itself","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#pattern-finding-where-to-get-a-token","title":"Pattern: Finding Where To Get A Token","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#pattern-opaque-tokens-over-introspection","title":"Pattern: Opaque Tokens Over Introspection","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#pattern-sharing-documents-across-isolates","title":"Pattern: Sharing Documents Across Isolates","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#pattern-reading-the-provider-s-records","title":"Pattern: Reading The Provider's Records","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/authz","title":"@sdxc/authz","page":"@sdxc/authz","section":"Packages · Identity & security","summary":"Authorization from a typed catalog of abilities, additive roles and guards, answered synchronously from loaded facts"},{"href":"/api/authz#installation","title":"Installation","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#usage","title":"Usage","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#declare-abilities","title":"Declare abilities","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#write-a-policy","title":"Write a policy","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#bind-and-check","title":"Bind and check","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#guard-a-route","title":"Guard a route","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#api","title":"API","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#catalog","title":"Catalog","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#policy","title":"Policy","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#access","title":"Access","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#decisions-and-errors","title":"Decisions and errors","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#sdxc-authz-middleware-router","title":"@sdxc/authz/middleware/router","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#sdxc-authz-middleware-dispatcher","title":"@sdxc/authz/middleware/dispatcher","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#sdxc-authz-mcp","title":"@sdxc/authz/mcp","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#sdxc-authz-facts-flags","title":"@sdxc/authz/facts/flags","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#sdxc-authz-facts-billing","title":"@sdxc/authz/facts/billing","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#sdxc-authz-testing","title":"@sdxc/authz/testing","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#types","title":"Types","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#pattern-answering-refusals","title":"Pattern: Answering refusals","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#pattern-plan-and-flag-gates","title":"Pattern: Plan and flag gates","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#pattern-permissions-for-a-page","title":"Pattern: Permissions for a page","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#pattern-scoped-api-tokens","title":"Pattern: Scoped API tokens","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#pattern-mcp-tools","title":"Pattern: MCP tools","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#pattern-authorizing-a-job","title":"Pattern: Authorizing a job","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/authz#pattern-testing-a-policy","title":"Pattern: Testing a policy","page":"@sdxc/authz","section":"Packages · Identity & security"},{"href":"/api/jwt","title":"@sdxc/jwt","page":"@sdxc/jwt","section":"Packages · Identity & security","summary":"JWT payload classes and the keys that sign them"},{"href":"/api/jwt#installation","title":"Installation","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#usage","title":"Usage","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#describe-a-kind-of-token","title":"Describe a kind of token","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#issue-a-token","title":"Issue a token","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#publish-the-key-set","title":"Publish the key set","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#verify-a-token","title":"Verify a token","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#api","title":"API","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#jwt","title":"JWT","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#jwk","title":"JWK","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#keystorage","title":"KeyStorage","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#creater2keystorage-bucket-r2keybucket-keystorage","title":"createR2KeyStorage(bucket: R2KeyBucket): KeyStorage","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#pattern-an-issuer-in-a-worker","title":"Pattern: An Issuer In A Worker","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#pattern-verifying-an-upstream-id-token","title":"Pattern: Verifying An Upstream ID Token","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#pattern-several-issuers-one-verifier","title":"Pattern: Several Issuers, One Verifier","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#pattern-rotating-signing-keys","title":"Pattern: Rotating Signing Keys","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#pattern-keys-in-a-database","title":"Pattern: Keys In A Database","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#pattern-in-memory-key-storage-for-tests","title":"Pattern: In-Memory Key Storage For Tests","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/passkey","title":"@sdxc/passkey","page":"@sdxc/passkey","section":"Packages · Identity & security","summary":"Passkeys end to end: a WebAuthn browser API and a verifying relying party"},{"href":"/api/passkey#installation","title":"Installation","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#usage","title":"Usage","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#create-a-relying-party","title":"Create a relying party","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#register-a-passkey","title":"Register a passkey","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#sign-in-with-a-passkey","title":"Sign in with a passkey","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#offer-passkeys-in-the-sign-in-field","title":"Offer passkeys in the sign-in field","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#api","title":"API","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#sdxc-passkey-client","title":"@sdxc/passkey/client","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#sdxc-passkey-server","title":"@sdxc/passkey/server","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#errors","title":"Errors","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#types","title":"Types","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#pattern-two-json-endpoints-per-ceremony","title":"Pattern: Two JSON Endpoints Per Ceremony","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#pattern-autofill-with-a-button-fallback","title":"Pattern: Autofill With A Button Fallback","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#pattern-passkeys-as-a-second-factor","title":"Pattern: Passkeys As A Second Factor","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#pattern-enrolling-this-device","title":"Pattern: Enrolling This Device","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#pattern-telling-the-person-what-happened","title":"Pattern: Telling The Person What Happened","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/saml","title":"@sdxc/saml","page":"@sdxc/saml","section":"Packages · Identity & security","summary":"SAML 2.0 service provider: verify signed assertions, build requests and metadata"},{"href":"/api/saml#installation","title":"Installation","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#usage","title":"Usage","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#verify-a-response","title":"Verify a response","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#start-a-sign-in","title":"Start a sign-in","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#read-and-write-metadata","title":"Read and write metadata","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#api","title":"API","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#verifyresponse-source-string-options-verifyresponseoptions-promise-result-assertion-samlerror","title":"verifyResponse(source: string, options: VerifyResponseOptions): Promise<Result<Assertion, SAMLError>>","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#createauthnrequest-options-createauthnrequestoptions-promise-result-authnrequestresult-samlerror","title":"createAuthnRequest(options: CreateAuthnRequestOptions): Promise<Result<AuthnRequestResult, SAMLError>>","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#parseidpmetadata-source-string-promise-result-idpmetadata-samlerror","title":"parseIdPMetadata(source: string): Promise<Result<IdPMetadata, SAMLError>>","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#buildserviceprovidermetadata-options-serviceprovidermetadataoptions-result-string-samlerror","title":"buildServiceProviderMetadata(options: ServiceProviderMetadataOptions): Result<string, SAMLError>","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#certificate","title":"Certificate","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#assertion","title":"Assertion","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#errors","title":"Errors","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#supported-algorithms","title":"Supported algorithms","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#types","title":"Types","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#pattern-an-assertion-consumer-service","title":"Pattern: An Assertion Consumer Service","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#pattern-a-replay-store-on-a-table","title":"Pattern: A Replay Store On A Table","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#pattern-certificates-that-rotate","title":"Pattern: Certificates That Rotate","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#pattern-signed-requests-and-encrypted-assertions","title":"Pattern: Signed Requests And Encrypted Assertions","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#pattern-mapping-attributes-to-an-account","title":"Pattern: Mapping Attributes To An Account","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/scim","title":"@sdxc/scim","page":"@sdxc/scim","section":"Packages · Identity & security","summary":"SCIM 2.0 resources, filters, PATCH operations and discovery documents"},{"href":"/api/scim#installation","title":"Installation","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#usage","title":"Usage","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#read-a-user-and-answer","title":"Read a User and answer","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#describe-the-attributes-you-serve","title":"Describe the attributes you serve","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#list-users-with-a-filter","title":"List Users with a filter","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#patch-a-user","title":"Patch a User","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#serve-discovery","title":"Serve discovery","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#api","title":"API","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#sdxc-scim","title":"@sdxc/scim","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#sdxc-scim-filter","title":"@sdxc/scim/filter","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#sdxc-scim-data-table","title":"@sdxc/scim/data-table","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#sdxc-scim-patch","title":"@sdxc/scim/patch","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#sdxc-scim-discovery","title":"@sdxc/scim/discovery","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#types","title":"Types","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#pattern-push-a-filter-into-sql-fall-back-in-memory","title":"Pattern: Push A Filter Into SQL, Fall Back In Memory","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#pattern-conditional-writes-with-entity-tags","title":"Pattern: Conditional Writes With Entity Tags","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#pattern-a-custom-schema-extension","title":"Pattern: A Custom Schema Extension","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/crypto","title":"@sdxc/crypto","page":"@sdxc/crypto","section":"Packages · Identity & security","summary":"Web Crypto primitives — hashing, HMAC, tokens, TOTP, AES-GCM — plus scrypt passwords"},{"href":"/api/crypto#installation","title":"Installation","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#usage","title":"Usage","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#hash-and-encode","title":"Hash and encode","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#sign-and-verify-a-payload","title":"Sign and verify a payload","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#hash-a-password","title":"Hash a password","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#encrypt-a-value-at-rest","title":"Encrypt a value at rest","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#api","title":"API","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#encoding","title":"Encoding","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#bytes","title":"Bytes","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#hashing-and-hmac","title":"Hashing and HMAC","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#random-values","title":"Random values","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#passwords","title":"Passwords","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#totp","title":"TOTP","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#symmetric-encryption","title":"Symmetric encryption","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#errors","title":"Errors","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#types","title":"Types","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#pattern-upgrade-password-hashes-on-login","title":"Pattern: Upgrade Password Hashes On Login","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#pattern-api-keys-with-hashed-lookup-and-sealed-storage","title":"Pattern: API Keys With Hashed Lookup And Sealed Storage","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#pattern-verify-an-inbound-webhook-signature","title":"Pattern: Verify An Inbound Webhook Signature","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#pattern-enroll-a-second-factor-with-recovery-codes","title":"Pattern: Enroll A Second Factor With Recovery Codes","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#pattern-publish-and-import-a-public-key-as-pem","title":"Pattern: Publish And Import A Public Key As PEM","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/security-headers","title":"@sdxc/security-headers","page":"@sdxc/security-headers","section":"Packages · Identity & security","summary":"Typed CSP, Permissions-Policy and security response headers, with middleware"},{"href":"/api/security-headers#installation","title":"Installation","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#usage","title":"Usage","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#install-the-middleware","title":"Install the middleware","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#read-the-nonce-in-a-handler","title":"Read the nonce in a handler","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#write-headers-without-the-middleware","title":"Write headers without the middleware","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#parse-a-header-back","title":"Parse a header back","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#api","title":"API","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#sdxc-security-headers","title":"@sdxc/security-headers","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#sdxc-security-headers-csp","title":"@sdxc/security-headers/csp","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#sdxc-security-headers-permissions-policy","title":"@sdxc/security-headers/permissions-policy","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#sdxc-security-headers-reports","title":"@sdxc/security-headers/reports","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#sdxc-security-headers-middleware","title":"@sdxc/security-headers/middleware","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#types","title":"Types","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#pattern-the-managed-import-map","title":"Pattern: The Managed Import Map","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#pattern-a-route-that-must-be-framed","title":"Pattern: A Route That Must Be Framed","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#pattern-report-only-rollout-and-a-report-route","title":"Pattern: Report-Only Rollout And A Report Route","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#pattern-a-variant-policy-for-cached-pages","title":"Pattern: A Variant Policy For Cached Pages","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#pattern-asserting-a-policy-in-a-test","title":"Pattern: Asserting A Policy In A Test","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#pattern-choosing-sources-that-hold-up","title":"Pattern: Choosing Sources That Hold Up","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/webhooks","title":"@sdxc/webhooks","page":"@sdxc/webhooks","section":"Packages · Identity & security","summary":"Sign and verify Standard Webhooks deliveries, reporting every failure as a typed value"},{"href":"/api/webhooks#installation","title":"Installation","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#usage","title":"Usage","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#verify-an-inbound-request","title":"Verify an inbound request","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#type-the-payload","title":"Type the payload","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#sign-an-outbound-delivery","title":"Sign an outbound delivery","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#reject-replays","title":"Reject replays","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#api","title":"API","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#verify-request-request-options-verifyoptions-promise-result-verifieddelivery-webhookerror","title":"verify(request: Request, options: VerifyOptions): Promise<Result<VerifiedDelivery, WebhookError>>","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#sign-payload-unknown-options-signoptions-promise-result-signeddelivery-webhookerror","title":"sign(payload: unknown, options: SignOptions): Promise<Result<SignedDelivery, WebhookError>>","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#kvreplaystore","title":"KVReplayStore","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#errors","title":"Errors","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#types","title":"Types","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#pattern-a-fail-closed-endpoint","title":"Pattern: A Fail-Closed Endpoint","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#pattern-delivering-with-retries","title":"Pattern: Delivering With Retries","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#pattern-rotating-a-secret","title":"Pattern: Rotating a Secret","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#pattern-a-replay-store-over-a-table","title":"Pattern: A Replay Store Over a Table","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#pattern-round-tripping-in-tests","title":"Pattern: Round-Tripping in Tests","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/captcha","title":"@sdxc/captcha","page":"@sdxc/captcha","section":"Packages · Forms & abuse","summary":"Turnstile, hCaptcha and reCAPTCHA verification, with middleware and widgets"},{"href":"/api/captcha#installation","title":"Installation","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#usage","title":"Usage","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#verify-a-token","title":"Verify a token","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#guard-a-form-route","title":"Guard a form route","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#render-the-widget","title":"Render the widget","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#switch-providers","title":"Switch providers","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#api","title":"API","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#captcha","title":"Captcha","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#new-captchaerror-code-providercodes","title":"new CaptchaError(code, providerCodes?)","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#captcha-provider-options-from-middleware","title":"captcha(provider, options?) from ./middleware","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#captchakey-from-middleware","title":"CaptchaKey from ./middleware","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#new-turnstile-secretkey-field-timeout-from-turnstile","title":"new Turnstile({ secretKey, field?, timeout? }) from ./turnstile","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#new-hcaptcha-secretkey-sitekey-maxriskscore-field-timeout-from-hcaptcha","title":"new HCaptcha({ secretKey, siteKey?, maxRiskScore?, field?, timeout? }) from ./hcaptcha","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#new-recaptcha-secretkey-minscore-field-timeout-from-recaptcha","title":"new ReCaptcha({ secretKey, minScore?, field?, timeout? }) from ./recaptcha","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#new-memorycaptcha-field-verification-unknowntokens-from-memory","title":"new MemoryCaptcha({ field?, verification?, unknownTokens? }) from ./memory","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#widgets","title":"Widgets","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#types","title":"Types","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#pattern-fail-open-when-the-provider-is-down","title":"Pattern: Fail open when the provider is down","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#pattern-escalate-a-low-recaptcha-v3-score","title":"Pattern: Escalate a low reCAPTCHA v3 score","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#pattern-hold-a-token-to-its-form-and-site","title":"Pattern: Hold a token to its form and site","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#pattern-testing-a-guarded-route","title":"Pattern: Testing a guarded route","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#pattern-implementing-captcha-for-another-provider","title":"Pattern: Implementing Captcha for another provider","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/honeypot","title":"@sdxc/honeypot","page":"@sdxc/honeypot","section":"Packages · Forms & abuse","summary":"Honeypot form fields with a signed timestamp, middleware and a UI component"},{"href":"/api/honeypot#installation","title":"Installation","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#usage","title":"Usage","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#issue-and-verify-fields","title":"Issue and verify fields","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#render-the-fields","title":"Render the fields","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#guard-the-route","title":"Guard the route","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#api","title":"API","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#sdxc-honeypot","title":"@sdxc/honeypot","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#sdxc-honeypot-middleware","title":"@sdxc/honeypot/middleware","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#sdxc-honeypot-ui","title":"@sdxc/honeypot/ui","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#types","title":"Types","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#pattern-answer-a-bot-like-a-success","title":"Pattern: Answer a bot like a success","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#pattern-ask-a-person-to-resubmit-after-a-timing-limit","title":"Pattern: Ask a person to resubmit after a timing limit","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#pattern-rotate-the-secret","title":"Pattern: Rotate the secret","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#pattern-score-what-passes-with-a-spam-filter","title":"Pattern: Score what passes with a spam filter","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#pattern-test-a-guarded-route","title":"Pattern: Test a guarded route","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/spam","title":"@sdxc/spam","page":"@sdxc/spam","section":"Packages · Forms & abuse","summary":"Spam scoring for user content: local rules, reputation checks and a classifier"},{"href":"/api/spam#installation","title":"Installation","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#usage","title":"Usage","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#score-a-submission","title":"Score a submission","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#describe-the-submission","title":"Describe the submission","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#add-reputation-checks","title":"Add reputation checks","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#learn-from-moderators","title":"Learn from moderators","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#api","title":"API","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam","title":"@sdxc/spam","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam-author-email","title":"@sdxc/spam/author-email","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam-stop-forum-spam","title":"@sdxc/spam/stop-forum-spam","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam-link-blocklist","title":"@sdxc/spam/link-blocklist","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam-akismet","title":"@sdxc/spam/akismet","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam-bayes","title":"@sdxc/spam/bayes","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam-workers-ai","title":"@sdxc/spam/workers-ai","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam-memory","title":"@sdxc/spam/memory","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#pattern-refuse-bots-before-scoring","title":"Pattern: Refuse bots before scoring","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#pattern-hold-discard-or-publish","title":"Pattern: Hold, discard or publish","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#pattern-train-a-classifier-on-your-moderation-queue","title":"Pattern: Train a classifier on your moderation queue","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#pattern-escalate-the-unsure-band-to-a-model","title":"Pattern: Escalate the unsure band to a model","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#pattern-write-a-rule-for-your-site","title":"Pattern: Write a rule for your site","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#pattern-reweight-a-rule","title":"Pattern: Reweight a rule","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#pattern-test-code-that-filters","title":"Pattern: Test code that filters","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/password-policy","title":"@sdxc/password-policy","page":"@sdxc/password-policy","section":"Packages · Forms & abuse","summary":"Password checks: length, common and breached passwords, similarity and reuse"},{"href":"/api/password-policy#installation","title":"Installation","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#usage","title":"Usage","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#check-a-new-password","title":"Check a new password","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#ask-have-i-been-pwned","title":"Ask Have I Been Pwned","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#relax-the-minimum-for-a-second-factor","title":"Relax the minimum for a second factor","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#run-one-rule-from-a-small-entry-point","title":"Run one rule from a small entry point","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#api","title":"API","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#entry-points","title":"Entry points","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#checkpassword-candidate-string-options-checkpasswordoptions-promise-result-void-passwordpolicyerror","title":"checkPassword(candidate: string, options?: CheckPasswordOptions): Promise<Result<void, PasswordPolicyError>>","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#checklength-candidate-string-options-lengthoptions-result-void-passwordpolicyerror","title":"checkLength(candidate: string, options?: LengthOptions): Result<void, PasswordPolicyError>","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#checkcommonpassword-candidate-string-result-void-passwordpolicyerror","title":"checkCommonPassword(candidate: string): Result<void, PasswordPolicyError>","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#iscommonpassword-candidate-string-boolean","title":"isCommonPassword(candidate: string): boolean","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#checkidentifiers-candidate-string-identifiers-string-result-void-passwordpolicyerror","title":"checkIdentifiers(candidate: string, identifiers: string[]): Result<void, PasswordPolicyError>","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#checkdeniedterms-candidate-string-terms-string-result-void-passwordpolicyerror","title":"checkDeniedTerms(candidate: string, terms: string[]): Result<void, PasswordPolicyError>","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#checkbreachedpassword-candidate-string-options-breachedpasswordoptions-promise-result-void-passwordpolicyerror","title":"checkBreachedPassword(candidate: string, options?: BreachedPasswordOptions): Promise<Result<void, PasswordPolicyError>>","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#checkpasswordhistory-candidate-string-previoushashes-string-options-passwordhistoryoptions-promise-result-void-passwordpolicyerror","title":"checkPasswordHistory(candidate: string, previousHashes: string[], options?: PasswordHistoryOptions): Promise<Result<void, PasswordPolicyError>>","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#passwordpolicyerror","title":"PasswordPolicyError","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#constants","title":"Constants","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#types","title":"Types","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#pattern-mapping-a-refusal-to-a-message","title":"Pattern: Mapping A Refusal To A Message","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#pattern-failing-open-when-the-lookup-is-down","title":"Pattern: Failing Open When The Lookup Is Down","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#pattern-sign-up-that-hashes-what-was-submitted","title":"Pattern: Sign-Up That Hashes What Was Submitted","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#pattern-refusing-a-reused-password-on-change","title":"Pattern: Refusing A Reused Password On Change","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#pattern-a-small-policy-without-the-bundled-list","title":"Pattern: A Small Policy Without The Bundled List","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/email-address","title":"@sdxc/email-address","page":"@sdxc/email-address","section":"Packages · Forms & abuse","summary":"Email address parsing, normalization, disposable-domain and mail-server checks"},{"href":"/api/email-address#installation","title":"Installation","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#usage","title":"Usage","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#parse-an-address","title":"Parse an address","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#refuse-disposable-and-role-addresses","title":"Refuse disposable and role addresses","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#check-the-domain-receives-mail","title":"Check the domain receives mail","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#suggest-a-fix-for-a-mistyped-provider","title":"Suggest a fix for a mistyped provider","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#api","title":"API","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#sdxc-email-address","title":"@sdxc/email-address","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#sdxc-email-address-disposable","title":"@sdxc/email-address/disposable","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#sdxc-email-address-mail-server","title":"@sdxc/email-address/mail-server","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#sdxc-email-address-role-account","title":"@sdxc/email-address/role-account","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#sdxc-email-address-typo","title":"@sdxc/email-address/typo","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#types","title":"Types","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#pattern-validate-a-sign-up-address","title":"Pattern: Validate a sign-up address","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#pattern-store-one-form-index-the-other","title":"Pattern: Store one form, index the other","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#pattern-verify-a-claimed-organization-domain","title":"Pattern: Verify a claimed organization domain","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#pattern-cache-mail-server-answers","title":"Pattern: Cache mail-server answers","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/markdown","title":"@sdxc/markdown","page":"@sdxc/markdown","section":"Packages · Content & formats","summary":"GitHub Flavored Markdown: parse to a typed AST, transform it, write it back"},{"href":"/api/markdown#installation","title":"Installation","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#usage","title":"Usage","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#parse-a-document","title":"Parse a document","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#validate-the-frontmatter","title":"Validate the frontmatter","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#transform-it-with-visitors","title":"Transform it with visitors","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#render-it","title":"Render it","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#write-it-back","title":"Write it back","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#api","title":"API","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown","title":"@sdxc/markdown","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown-html","title":"@sdxc/markdown/html","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown-plain","title":"@sdxc/markdown/plain","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown-remix","title":"@sdxc/markdown/remix","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown-plugin-headings","title":"@sdxc/markdown/plugin/headings","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown-plugin-links","title":"@sdxc/markdown/plugin/links","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown-plugin-typography","title":"@sdxc/markdown/plugin/typography","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown-plugin-variables","title":"@sdxc/markdown/plugin/variables","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown-plugin-embeds","title":"@sdxc/markdown/plugin/embeds","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown-plugin-frames","title":"@sdxc/markdown/plugin/frames","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown-plugin-lint","title":"@sdxc/markdown/plugin/lint","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#types","title":"Types","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#pattern-a-documentation-page","title":"Pattern: A Documentation Page","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#pattern-writing-a-visitor","title":"Pattern: Writing A Visitor","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#pattern-annotations-tags-and-comments","title":"Pattern: Annotations, Tags And Comments","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#pattern-variables-filled-per-render","title":"Pattern: Variables Filled Per Render","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#pattern-allowlisted-html","title":"Pattern: Allowlisted HTML","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#pattern-embeds-and-server-rendered-frames","title":"Pattern: Embeds And Server-Rendered Frames","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#pattern-lint-content-in-ci","title":"Pattern: Lint Content In CI","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/math","title":"@sdxc/math","page":"@sdxc/math","section":"Packages · Content & formats","summary":"TeX math to MathML Core, with a markdown walk visitor and a component"},{"href":"/api/math#installation","title":"Installation","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#usage","title":"Usage","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#convert-tex","title":"Convert TeX","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#read-the-tree","title":"Read the tree","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#render-math-in-markdown","title":"Render math in markdown","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#render-with-remix","title":"Render with Remix","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#api","title":"API","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#tomathml-tex-string-options-mathoptions-result-string-matherror","title":"toMathML(tex: string, options?: MathOptions): Result<string, MathError>","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#parsemath-tex-string-options-mathoptions-result-mathelement-matherror","title":"parseMath(tex: string, options?: MathOptions): Result<MathElement, MathError>","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#matherror","title":"MathError","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#sdxc-math-markdown","title":"@sdxc/math/markdown","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#sdxc-math-ui","title":"@sdxc/math/ui","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#types","title":"Types","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#supported-tex","title":"Supported TeX","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#pattern-validate-tex-from-a-form","title":"Pattern: Validate TeX From A Form","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#pattern-fail-a-build-on-a-broken-formula","title":"Pattern: Fail A Build On A Broken Formula","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#pattern-keep-building-when-a-formula-breaks","title":"Pattern: Keep Building When A Formula Breaks","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/math#pattern-render-a-markdown-article-with-remix","title":"Pattern: Render A Markdown Article With Remix","page":"@sdxc/math","section":"Packages · Content & formats"},{"href":"/api/diagram","title":"@sdxc/diagram","page":"@sdxc/diagram","section":"Packages · Content & formats","summary":"Mermaid sequence, class, state and flowchart diagrams to SVG, with a markdown walk visitor and a component"},{"href":"/api/diagram#installation","title":"Installation","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#usage","title":"Usage","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#draw-a-diagram","title":"Draw a diagram","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#render-diagrams-in-markdown","title":"Render diagrams in markdown","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#render-with-remix","title":"Render with Remix","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#api","title":"API","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#tosvg-source-string-options-diagramoptions-result-string-diagramerror","title":"toSVG(source: string, options?: DiagramOptions): Result<string, DiagramError>","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#parsediagram-source-string-options-diagramoptions-result-svgelement-diagramerror","title":"parseDiagram(source: string, options?: DiagramOptions): Result<SvgElement, DiagramError>","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#diagramerror","title":"DiagramError","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#types","title":"Types","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#sdxc-diagram-markdown","title":"@sdxc/diagram/markdown","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#sdxc-diagram-ui","title":"@sdxc/diagram/ui","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#theming","title":"Theming","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#supported-syntax","title":"Supported syntax","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#pattern-keep-a-live-preview-rendering-while-a-diagram-is-half-written","title":"Pattern: Keep A Live Preview Rendering While A Diagram Is Half-Written","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#pattern-fail-a-build-at-the-broken-line","title":"Pattern: Fail A Build At The Broken Line","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#pattern-name-a-diagram-for-screen-readers","title":"Pattern: Name A Diagram For Screen Readers","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#pattern-match-the-page-s-colors","title":"Pattern: Match The Page's Colors","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/diagram#pattern-serve-a-diagram-as-an-svg-file","title":"Pattern: Serve A Diagram As An SVG File","page":"@sdxc/diagram","section":"Packages · Content & formats"},{"href":"/api/yaml","title":"@sdxc/yaml","page":"@sdxc/yaml","section":"Packages · Content & formats","summary":"YAML reading and writing over a documented subset, shaped after the built-in JSON object"},{"href":"/api/yaml#installation","title":"Installation","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#usage","title":"Usage","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#read-a-document","title":"Read a document","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#write-a-value","title":"Write a value","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#use-both-under-one-name","title":"Use both under one name","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#api","title":"API","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#parse-source-string-result-unknown-yamlparseerror","title":"parse(source: string): Result<unknown, YAMLParseError>","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#stringify-value-unknown-options-stringifyoptions-result-string-yamlstringifyerror","title":"stringify(value: unknown, options?: StringifyOptions): Result<string, YAMLStringifyError>","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#yamlparseerror","title":"YAMLParseError","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#yamlstringifyerror","title":"YAMLStringifyError","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#types","title":"Types","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#supported-subset","title":"Supported subset","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#pattern-validating-parsed-yaml-with-a-schema","title":"Pattern: Validating parsed YAML with a schema","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#pattern-editing-a-document","title":"Pattern: Editing a document","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#pattern-writing-text-that-needs-quoting","title":"Pattern: Writing text that needs quoting","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#pattern-reporting-where-a-file-went-wrong","title":"Pattern: Reporting where a file went wrong","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/xml","title":"@sdxc/xml","page":"@sdxc/xml","section":"Packages · Content & formats","summary":"XML parser and serializer for RSS-style feeds"},{"href":"/api/xml#installation","title":"Installation","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#usage","title":"Usage","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#parse-a-document","title":"Parse a document","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#find-elements","title":"Find elements","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#write-a-document","title":"Write a document","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#api","title":"API","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-parse-source-string-options-xml-parseoptions-result-xml-xmlparseerror","title":"XML.parse(source: string, options?: XML.ParseOptions): Result<XML, XMLParseError>","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-stringify-input-xml-xml-input-result-string-xmlstringifyerror","title":"XML.stringify(input: XML | XML.Input): Result<string, XMLStringifyError>","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#new-xml-document-xml-document","title":"new XML(document: XML.Document)","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-declaration-xml-declaration-undefined","title":"xml.declaration: XML.Declaration | undefined","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-root-xml-element","title":"xml.root: XML.Element","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-query-path-string-xml-element-undefined","title":"xml.query(path: string): XML.Element | undefined","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-queryall-path-string-xml-element","title":"xml.queryAll(path: string): XML.Element[]","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-find-predicate-xml-predicate-xml-element-undefined","title":"xml.find(predicate: XML.Predicate): XML.Element | undefined","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-findall-predicate-xml-predicate-xml-element","title":"xml.findAll(predicate: XML.Predicate): XML.Element[]","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-tojson-xml-document","title":"xml.toJSON(): XML.Document","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-tostring-string","title":"xml.toString(): string","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xmlparseerror","title":"XMLParseError","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xmlstringifyerror","title":"XMLStringifyError","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#types","title":"Types","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#pattern-reading-a-feed-s-items","title":"Pattern: Reading a feed's items","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#pattern-writing-a-feed-with-a-namespace","title":"Pattern: Writing a feed with a namespace","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#pattern-editing-a-parsed-document","title":"Pattern: Editing a parsed document","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#pattern-hashing-a-document-byte-for-byte","title":"Pattern: Hashing a document byte for byte","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/html","title":"@sdxc/html","page":"@sdxc/html","section":"Packages · Content & formats","summary":"Read a served page: fetch or parse HTML, then query it by role and accessible name"},{"href":"/api/html#installation","title":"Installation","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#usage","title":"Usage","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#get-a-page","title":"Get a page","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#read-the-head-and-the-text","title":"Read the head and the text","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#address-an-element-by-role-and-name","title":"Address an element by role and name","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#read-forms-tables-and-definition-lists","title":"Read forms, tables and definition lists","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#narrow-to-a-section","title":"Narrow to a section","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#api","title":"API","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#html-parse-source-string-result-html-htmlparseerror","title":"HTML.parse(source: string): Result<HTML, HTMLParseError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#html-fetch-input-url-requestinfo-init-requestinit-promise-result-html-htmlfetcherror-htmlparseerror","title":"HTML.fetch(input: URL | RequestInfo, init?: RequestInit): Promise<Result<HTML, HTMLFetchError | HTMLParseError>>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#html-sanitize-source-string-policy-html-sanitizepolicy-result-string-htmlparseerror","title":"HTML.sanitize(source: string, policy?: HTML.SanitizePolicy): Result<string, HTMLParseError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-title-string-undefined","title":"doc.title: string | undefined","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-text-string","title":"doc.text: string","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-meta-name-string-result-string-htmlnotfounderror","title":"doc.meta(name: string): Result<string, HTMLNotFoundError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-link-rel-string-result-string-htmlnotfounderror","title":"doc.link(rel: string): Result<string, HTMLNotFoundError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-query-selector-html-selector-result-html-element-htmlqueryerror","title":"doc.query(selector?: HTML.Selector): Result<HTML.Element, HTMLQueryError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-queryall-selector-html-selector-html-element","title":"doc.queryAll(selector?: HTML.Selector): HTML.Element[]","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-field-name-string-options-html-fieldoptions-result-html-element-htmlqueryerror","title":"doc.field(name: string, options?: HTML.FieldOptions): Result<HTML.Element, HTMLQueryError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-cell-selector-html-cellselector-result-html-element-htmlqueryerror","title":"doc.cell(selector: HTML.CellSelector): Result<HTML.Element, HTMLQueryError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-definition-term-string-options-html-options-result-html-element-htmlqueryerror","title":"doc.definition(term: string, options?: HTML.Options): Result<HTML.Element, HTMLQueryError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#html-element","title":"HTML.Element","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#parsedocument-source-string-result-domdocument-htmlparseerror-from-document","title":"parseDocument(source: string): Result<DOMDocument, HTMLParseError> from ./document","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#errors","title":"Errors","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#types","title":"Types","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#pattern-checking-a-page-as-served","title":"Pattern: Checking A Page As Served","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#pattern-pulling-records-out-of-a-section","title":"Pattern: Pulling Records Out Of A Section","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#pattern-reporting-a-lookup-that-missed","title":"Pattern: Reporting A Lookup That Missed","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#pattern-rendering-someone-else-s-article","title":"Pattern: Rendering Someone Else's Article","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#pattern-walking-the-tree","title":"Pattern: Walking The Tree","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/csv","title":"@sdxc/csv","page":"@sdxc/csv","section":"Packages · Content & formats","summary":"Read and write RFC 4180 CSV, with a streaming writer and formula neutralization"},{"href":"/api/csv#installation","title":"Installation","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#usage","title":"Usage","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#write-and-read-back","title":"Write and read back","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#read-an-upload","title":"Read an upload","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#choose-columns-and-write-typed-cells","title":"Choose columns and write typed cells","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#stream-a-download","title":"Stream a download","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#api","title":"API","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#parse-source-string-options-parseoptions","title":"parse(source: string, options?: ParseOptions)","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#stringify-rows-options-stringifyoptions","title":"stringify(rows, options?: StringifyOptions)","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#streamify-rows-options-stringifyoptions-columns","title":"streamify(rows, options: StringifyOptions & { columns })","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#csvparseerror","title":"CSVParseError","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#csvstringifyerror","title":"CSVStringifyError","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#types","title":"Types","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#pattern-type-uploaded-rows","title":"Pattern: Type Uploaded Rows","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#pattern-export-from-a-paged-query","title":"Pattern: Export From A Paged Query","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#pattern-a-file-excel-opens-correctly","title":"Pattern: A File Excel Opens Correctly","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#pattern-headerless-records-and-tsv","title":"Pattern: Headerless Records And TSV","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#pattern-exchange-data-between-programs","title":"Pattern: Exchange Data Between Programs","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#pattern-report-errors-to-the-caller","title":"Pattern: Report Errors To The Caller","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/jsonl","title":"@sdxc/jsonl","page":"@sdxc/jsonl","section":"Packages · Content & formats","summary":"JSON Lines reading and writing, streamed with a bounded buffer and line numbers in every failure"},{"href":"/api/jsonl#installation","title":"Installation","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#usage","title":"Usage","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#parse-and-write-a-file-in-memory","title":"Parse and write a file in memory","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#stream-values-from-a-request-body","title":"Stream values from a request body","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#stream-values-into-a-response","title":"Stream values into a response","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#api","title":"API","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#parse-text-string-result-unknown-jsonlerror","title":"parse(text: string): Result<unknown[], JSONLError>","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#stringify-values-iterable-unknown-result-string-jsonlerror","title":"stringify(values: Iterable<unknown>): Result<string, JSONLError>","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#lines-source-bytesource-options-linesoptions-asyncgenerator-result-line-jsonlerror","title":"lines(source: ByteSource, options?: LinesOptions): AsyncGenerator<Result<Line, JSONLError>>","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#read-source-bytesource-options-readoptions-asyncgenerator-result-entry-jsonlerror","title":"read(source: ByteSource, options?: ReadOptions): AsyncGenerator<Result<Entry, JSONLError>>","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#encode-values-iterable-unknown-asynciterable-unknown-readablestream-uint8array","title":"encode(values: Iterable<unknown> | AsyncIterable<unknown>): ReadableStream<Uint8Array>","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#encodelines-lines-iterable-string-asynciterable-string-readablestream-uint8array","title":"encodeLines(lines: Iterable<string> | AsyncIterable<string>): ReadableStream<Uint8Array>","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#jsonlerror","title":"JSONLError","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#types","title":"Types","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#patterns","title":"Patterns","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#pattern-import-an-uploaded-file-row-by-row","title":"Pattern: Import an uploaded file row by row","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonl#pattern-resume-a-long-import-where-it-stopped","title":"Pattern: Resume a long import where it stopped","page":"@sdxc/jsonl","section":"Packages · Content & formats"},{"href":"/api/jsonc","title":"@sdxc/jsonc","page":"@sdxc/jsonc","section":"Packages · Content & formats","summary":"JSON with comments and trailing commas, parsed with errors that point at the line and column"},{"href":"/api/jsonc#installation","title":"Installation","page":"@sdxc/jsonc","section":"Packages · Content & formats"},{"href":"/api/jsonc#usage","title":"Usage","page":"@sdxc/jsonc","section":"Packages · Content & formats"},{"href":"/api/jsonc#read-a-configuration-file","title":"Read a configuration file","page":"@sdxc/jsonc","section":"Packages · Content & formats"},{"href":"/api/jsonc#strip-and-parse-it-yourself","title":"Strip and parse it yourself","page":"@sdxc/jsonc","section":"Packages · Content & formats"},{"href":"/api/jsonc#api","title":"API","page":"@sdxc/jsonc","section":"Packages · Content & formats"},{"href":"/api/jsonc#parse-text-string-result-unknown-jsoncparseerror","title":"parse(text: string): Result<unknown, JSONCParseError>","page":"@sdxc/jsonc","section":"Packages · Content & formats"},{"href":"/api/jsonc#strip-text-string-string","title":"strip(text: string): string","page":"@sdxc/jsonc","section":"Packages · Content & formats"},{"href":"/api/jsonc#jsoncparseerror","title":"JSONCParseError","page":"@sdxc/jsonc","section":"Packages · Content & formats"},{"href":"/api/jsonc#patterns","title":"Patterns","page":"@sdxc/jsonc","section":"Packages · Content & formats"},{"href":"/api/jsonc#pattern-validate-a-configuration-file-after-parsing-it","title":"Pattern: Validate a configuration file after parsing it","page":"@sdxc/jsonc","section":"Packages · Content & formats"},{"href":"/api/icalendar","title":"@sdxc/icalendar","page":"@sdxc/icalendar","section":"Packages · Content & formats","summary":"Read and write iCalendar documents, with recurrence rules and time zones"},{"href":"/api/icalendar#installation","title":"Installation","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#usage","title":"Usage","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#serve-a-feed","title":"Serve a feed","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#read-a-calendar","title":"Read a calendar","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#expand-a-recurrence","title":"Expand a recurrence","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#write-a-zoned-recurring-event","title":"Write a zoned recurring event","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#api","title":"API","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#sdxc-icalendar","title":"@sdxc/icalendar","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#sdxc-icalendar-rrule","title":"@sdxc/icalendar/rrule","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#sdxc-icalendar-timezone","title":"@sdxc/icalendar/timezone","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#sdxc-icalendar-itip","title":"@sdxc/icalendar/itip","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#types","title":"Types","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#pattern-invite-reschedule-and-cancel-by-mail","title":"Pattern: Invite, Reschedule and Cancel by Mail","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#pattern-answer-an-invitation-and-record-the-answer","title":"Pattern: Answer an Invitation and Record the Answer","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#pattern-a-feed-and-a-single-event-download","title":"Pattern: A Feed and a Single-Event Download","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#pattern-the-last-day-of-every-month","title":"Pattern: The Last Day of Every Month","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#pattern-is-anything-active-now","title":"Pattern: Is Anything Active Now","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#pattern-edit-a-calendar-without-losing-what-it-holds","title":"Pattern: Edit a Calendar Without Losing What It Holds","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/epub","title":"@sdxc/epub","page":"@sdxc/epub","section":"Packages · Content & formats","summary":"Build EPUB 3.3 publications from XHTML chapters, checked against what epubcheck rejects"},{"href":"/api/epub#installation","title":"Installation","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#usage","title":"Usage","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#build-a-book","title":"Build a book","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#send-the-file","title":"Send the file","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#add-a-cover-styles-and-images","title":"Add a cover, styles and images","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#handle-a-failure","title":"Handle a failure","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#api","title":"API","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#epub-build-input-epub-input-result-epub-epuberror","title":"EPUB.build(input: EPUB.Input): Result<EPUB, EpubError>","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#epub","title":"EPUB","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#epuberror","title":"EpubError","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#types","title":"Types","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#pattern-downloading-markdown-as-a-book","title":"Pattern: Downloading Markdown As A Book","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#pattern-a-nested-table-of-contents-with-front-and-back-matter","title":"Pattern: A Nested Table Of Contents With Front And Back Matter","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#pattern-a-book-in-another-language","title":"Pattern: A Book In Another Language","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#pattern-declaring-accessibility","title":"Pattern: Declaring Accessibility","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/epub#pattern-reporting-what-to-fix","title":"Pattern: Reporting What To Fix","page":"@sdxc/epub","section":"Packages · Content & formats"},{"href":"/api/zip","title":"@sdxc/zip","page":"@sdxc/zip","section":"Packages · Content & formats","summary":"Streaming ZIP archive writer with CRC-32, storing every entry uncompressed"},{"href":"/api/zip#installation","title":"Installation","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#usage","title":"Usage","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#build-an-archive-and-stream-it","title":"Build an archive and stream it","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#add-entries-from-streams","title":"Add entries from streams","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#check-each-entry","title":"Check each entry","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#collect-the-archive-as-bytes","title":"Collect the archive as bytes","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#api","title":"API","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#zip","title":"Zip","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#crc32-bytes-uint8array-previous-number-number","title":"crc32(bytes: Uint8Array, previous?: number): number","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#ziperror","title":"ZipError","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#types","title":"Types","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#pattern-a-download-endpoint-built-from-paged-data","title":"Pattern: A Download Endpoint Built From Paged Data","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#pattern-accepting-user-supplied-file-names","title":"Pattern: Accepting User-Supplied File Names","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#pattern-reproducible-archives","title":"Pattern: Reproducible Archives","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#pattern-a-source-that-fails-partway","title":"Pattern: A Source That Fails Partway","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/zip#pattern-checksumming-a-stream-in-chunks","title":"Pattern: Checksumming A Stream In Chunks","page":"@sdxc/zip","section":"Packages · Content & formats"},{"href":"/api/distill","title":"@sdxc/distill","page":"@sdxc/distill","section":"Packages · Content & formats","summary":"Extract the article from a web page: bounded fetch, scoring and sanitizing"},{"href":"/api/distill#installation","title":"Installation","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#usage","title":"Usage","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#distill-a-url","title":"Distill a URL","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#honour-robots-txt","title":"Honour robots.txt","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#distill-markup-you-already-have","title":"Distill markup you already have","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#summarize-any-page","title":"Summarize any page","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#api","title":"API","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#distill-url-string-options-distill-options-promise-result-distill-retrieved-distillerror","title":"distill(url: string, options: Distill.Options): Promise<Result<Distill.Retrieved, DistillError>>","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#distillfrom-source-string-url-string-result-distill-article-distillemptyerror","title":"distillFrom(source: string, url: string): Result<Distill.Article, DistillEmptyError>","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#summaryfrom-source-string-url-string-result-distill-summary-distillemptyerror","title":"summaryFrom(source: string, url: string): Result<Distill.Summary, DistillEmptyError>","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#addressable-url-string-result-url-distillrefusederror","title":"addressable(url: string): Result<URL, DistillRefusedError>","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#max-bytes-max-redirects-timeout-ms","title":"MAX_BYTES, MAX_REDIRECTS, TIMEOUT_MS","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#excerpt-length","title":"EXCERPT_LENGTH","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#errors","title":"Errors","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#sanitization","title":"Sanitization","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#types","title":"Types","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#pattern-copy-for-every-outcome","title":"Pattern: Copy For Every Outcome","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#pattern-caching-by-url","title":"Pattern: Caching By URL","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#pattern-keeping-the-article-only-when-it-adds-something","title":"Pattern: Keeping The Article Only When It Adds Something","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#pattern-robots-rules-cached-per-origin","title":"Pattern: Robots Rules Cached Per Origin","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#pattern-background-distillation-with-tighter-bounds","title":"Pattern: Background Distillation With Tighter Bounds","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#pattern-testing-against-a-fixture","title":"Pattern: Testing Against A Fixture","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/jsdoc","title":"@sdxc/jsdoc","page":"@sdxc/jsdoc","section":"Packages · Content & formats","summary":"Read JSDoc out of JavaScript and TypeScript source text into a JSON documentation model"},{"href":"/api/jsdoc#installation","title":"Installation","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#usage","title":"Usage","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#extract-one-module","title":"Extract one module","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#read-a-symbol-s-tags","title":"Read a symbol's tags","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#parse-a-comment-on-its-own","title":"Parse a comment on its own","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#assemble-the-document-a-site-reads","title":"Assemble the document a site reads","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#api","title":"API","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#extract-source-string-options-extractoptions-result-docmodule-extracterror","title":"extract(source: string, options?: ExtractOptions): Result<DocModule, ExtractError>","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#parsecomment-raw-string-doccomment","title":"parseComment(raw: string): DocComment","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#findtag-comment-doccomment-null-tag-string-doctag-null","title":"findTag(comment: DocComment | null, tag: string): DocTag | null","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#findtags-comment-doccomment-null-tag-string-doctag","title":"findTags(comment: DocComment | null, tag: string): DocTag[]","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#inlinelinks-text-string-doclink","title":"inlineLinks(text: string): DocLink[]","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#schema-version-number","title":"SCHEMA_VERSION: number","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#extracterror","title":"ExtractError","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#types","title":"Types","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#pattern-resolving-a-barrel","title":"Pattern: Resolving A Barrel","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#pattern-linking-symbols-to-each-other","title":"Pattern: Linking Symbols To Each Other","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#pattern-rendering-the-tree-by-kind","title":"Pattern: Rendering The Tree By Kind","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#pattern-reporting-syntax-errors","title":"Pattern: Reporting Syntax Errors","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#pattern-a-maintainers-build-with-internal-symbols","title":"Pattern: A Maintainers' Build With Internal Symbols","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/codemod","title":"@sdxc/codemod","page":"@sdxc/codemod","section":"Packages · Content & formats","summary":"Source-to-source edits of JavaScript and TypeScript imports and declarations, changing only the edited ranges"},{"href":"/api/codemod#installation","title":"Installation","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#usage","title":"Usage","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#find-every-module-a-file-references","title":"Find every module a file references","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#rewrite-specifiers","title":"Rewrite specifiers","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#move-imports-to-another-module","title":"Move imports to another module","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#add-to-a-declaration-object-and-to-a-sequence-of-calls","title":"Add to a declaration object and to a sequence of calls","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#api","title":"API","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#findmodulereferences-filename-string-source-string-options-findoptions-result-modulereference-codemoderror","title":"findModuleReferences(filename: string, source: string, options?: FindOptions): Result<ModuleReference[], CodemodError>","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#rewritespecifiers-filename-source-map-options-result-edit-codemoderror","title":"rewriteSpecifiers(filename, source, map, options?): Result<Edit, CodemodError>","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#moveimports-filename-source-options-moveoptions-result-edit-codemoderror","title":"moveImports(filename, source, options: MoveOptions): Result<Edit, CodemodError>","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#addproperty-filename-source-options-addpropertyoptions-result-edit-codemoderror","title":"addProperty(filename, source, options: AddPropertyOptions): Result<Edit, CodemodError>","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#insertafterlast-filename-source-options-insertoptions-result-edit-codemoderror","title":"insertAfterLast(filename, source, options: InsertOptions): Result<Edit, CodemodError>","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#edit","title":"Edit","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#codemoderror","title":"CodemodError","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#types","title":"Types","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#patterns","title":"Patterns","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/codemod#pattern-point-a-project-at-its-own-copy-of-a-component","title":"Pattern: Point a project at its own copy of a component","page":"@sdxc/codemod","section":"Packages · Content & formats"},{"href":"/api/rss","title":"@sdxc/rss","page":"@sdxc/rss","section":"Packages · Feeds & publishing","summary":"RSS 2.0 feed builder and parser"},{"href":"/api/rss#installation","title":"Installation","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#usage","title":"Usage","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#build-a-feed","title":"Build a feed","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#read-a-feed","title":"Read a feed","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#fetch-a-feed","title":"Fetch a feed","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#api","title":"API","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#new-rss-channel-rss-channel","title":"new RSS(channel: RSS.Channel)","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-channel","title":"rss.channel","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-items","title":"rss.items","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-additem-item-rss-item-void","title":"rss.addItem(item: RSS.Item): void","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-removeitem-guid-string-void","title":"rss.removeItem(guid: string): void","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-tojson-rss-feed","title":"rss.toJSON(): RSS.Feed","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-tostring-string","title":"rss.toString(): string","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-parse-source-string-rss","title":"RSS.parse(source: string): RSS","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-fromxml-xml-xml-rss","title":"RSS.fromXML(xml: XML): RSS","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-fetch-input-url-requestinfo-init-requestinit-promise-rss","title":"RSS.fetch(input: URL | RequestInfo, init?: RequestInit): Promise<RSS>","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#types","title":"Types","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#pattern-serve-a-feed-from-a-request-handler","title":"Pattern: Serve a feed from a request handler","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#pattern-publish-a-podcast-with-a-custom-namespace","title":"Pattern: Publish a podcast with a custom namespace","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#pattern-edit-a-published-feed","title":"Pattern: Edit a published feed","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#pattern-aggregate-several-feeds","title":"Pattern: Aggregate several feeds","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#pattern-detect-the-feed-format-before-reading-it","title":"Pattern: Detect the feed format before reading it","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/atom","title":"@sdxc/atom","page":"@sdxc/atom","section":"Packages · Feeds & publishing","summary":"Atom 1.0 feed parser and builder"},{"href":"/api/atom#installation","title":"Installation","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#usage","title":"Usage","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#parse-a-feed","title":"Parse a feed","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#fetch-a-feed","title":"Fetch a feed","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#build-a-feed","title":"Build a feed","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#api","title":"API","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#new-atom-feed-atom-feed","title":"new Atom(feed: Atom.Feed)","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-feed","title":"atom.feed","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-entries","title":"atom.entries","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-addentry-entry-atom-entry-void","title":"atom.addEntry(entry: Atom.Entry): void","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-removeentry-id-string-void","title":"atom.removeEntry(id: string): void","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-tojson-atom-document","title":"atom.toJSON(): Atom.Document","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-tostring-string","title":"atom.toString(): string","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-parse-source-string-base-string-result-atom-atomparseerror","title":"Atom.parse(source: string, base?: string): Result<Atom, AtomParseError>","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-fromxml-xml-xml-base-string-result-atom-atomparseerror","title":"Atom.fromXML(xml: XML, base?: string): Result<Atom, AtomParseError>","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-fetch-input-url-requestinfo-init-requestinit-promise-result-atom-atomfetcherror-atomparseerror","title":"Atom.fetch(input: URL | RequestInfo, init?: RequestInit): Promise<Result<Atom, AtomFetchError | AtomParseError>>","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#errors","title":"Errors","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#types","title":"Types","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#pattern-reading-entries-for-display","title":"Pattern: Reading Entries For Display","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#pattern-serving-a-feed-from-a-request-handler","title":"Pattern: Serving A Feed From A Request Handler","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#pattern-editing-a-feed-in-place","title":"Pattern: Editing A Feed In Place","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#pattern-foreign-elements-and-namespaces","title":"Pattern: Foreign Elements And Namespaces","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#pattern-parsing-an-already-parsed-document","title":"Pattern: Parsing An Already-Parsed Document","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed","title":"@sdxc/json-feed","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing","summary":"JSON Feed 1.1 builder and parser"},{"href":"/api/json-feed#installation","title":"Installation","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#usage","title":"Usage","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#build-a-feed","title":"Build a feed","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#serialize-it","title":"Serialize it","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#parse-a-feed","title":"Parse a feed","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#fetch-a-feed","title":"Fetch a feed","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#api","title":"API","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#new-jsonfeed-feed-jsonfeed-feed","title":"new JSONFeed(feed: JSONFeed.Feed)","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#feed-feed","title":"feed.feed","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#feed-items","title":"feed.items","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#feed-version","title":"feed.version","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#feed-additem-item-jsonfeed-item-void","title":"feed.addItem(item: JSONFeed.Item): void","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#feed-removeitem-id-string-void","title":"feed.removeItem(id: string): void","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#feed-tojson-jsonfeed-document","title":"feed.toJSON(): JSONFeed.Document","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#feed-tostring-string","title":"feed.toString(): string","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#jsonfeed-parse-source-string-result-jsonfeed-jsonfeedparseerror","title":"JSONFeed.parse(source: string): Result<JSONFeed, JSONFeedParseError>","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#jsonfeed-fromjson-value-unknown-result-jsonfeed-jsonfeedparseerror","title":"JSONFeed.fromJSON(value: unknown): Result<JSONFeed, JSONFeedParseError>","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#jsonfeed-fetch-input-url-requestinfo-init-requestinit-promise-result-jsonfeed-jsonfeedfetcherror-jsonfeedparseerror","title":"JSONFeed.fetch(input: URL | RequestInfo, init?: RequestInit): Promise<Result<JSONFeed, JSONFeedFetchError | JSONFeedParseError>>","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#jsonfeed-version-value-unknown-string-undefined","title":"JSONFeed.version(value: unknown): string | undefined","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#jsonfeed-mediatype","title":"JSONFeed.mediaType","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#jsonfeedparseerror-jsonfeedfetcherror","title":"JSONFeedParseError, JSONFeedFetchError","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#types","title":"Types","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#pattern-a-podcast-feed","title":"Pattern: A Podcast Feed","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#pattern-publish-an-extension","title":"Pattern: Publish An Extension","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#pattern-import-items-from-someone-else-s-feed","title":"Pattern: Import Items From Someone Else's Feed","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#pattern-recognize-a-feed-among-other-json","title":"Pattern: Recognize A Feed Among Other JSON","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#pattern-edit-a-feed-and-write-it-back","title":"Pattern: Edit A Feed And Write It Back","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed","title":"@sdxc/feed","page":"@sdxc/feed","section":"Packages · Feeds & publishing","summary":"One feed API over RSS, Atom and JSON Feed, with conditional fetching and autodiscovery"},{"href":"/api/feed#installation","title":"Installation","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#usage","title":"Usage","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#parse-feed-text","title":"Parse feed text","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#fetch-a-feed-sending-the-validators-you-stored","title":"Fetch a feed, sending the validators you stored","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#discover-a-feed-from-a-site","title":"Discover a feed from a site","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#api","title":"API","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-parse-source-string-options-feed-parseoptions-result-feed-feedparseerror-feedformaterror","title":"Feed.parse(source: string, options?: Feed.ParseOptions): Result<Feed, FeedParseError | FeedFormatError>","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-fromxml-xml-xml-options-feed-parseoptions","title":"Feed.fromXML(xml: XML, options?: Feed.ParseOptions)","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-fromjson-value-unknown-options-feed-parseoptions","title":"Feed.fromJSON(value: unknown, options?: Feed.ParseOptions)","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-fetch-input-string-url-options-feed-fetchoptions-promise-result-feed-fetchresult-feedfetcherror-feedparseerror-feedformaterror","title":"Feed.fetch(input: string | URL, options?: Feed.FetchOptions): Promise<Result<Feed.FetchResult, FeedFetchError | FeedParseError | FeedFormatError>>","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-discover-input-string-url-options-feed-fetchoptions-promise-result-feed-discovery-feedfetcherror","title":"Feed.discover(input: string | URL, options?: Feed.FetchOptions): Promise<Result<Feed.Discovery[], FeedFetchError>>","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-selecthub-header-feed-link-document-feed-link-feed-hub-undefined","title":"Feed.selectHub(header?: Feed.Link[], document?: Feed.Link[]): Feed.Hub | undefined","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-selectsubscription-header-feed-link-document-feed-link-feed-subscription-undefined","title":"Feed.selectSubscription(header?: Feed.Link[], document?: Feed.Link[]): Feed.Subscription | undefined","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#new-feed-data-feed-data","title":"new Feed(data: Feed.Data)","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-accessors","title":"feed accessors","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#normalized-fields","title":"Normalized fields","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#errors","title":"Errors","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#types","title":"Types","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#pattern-subscribe-from-whatever-someone-pasted","title":"Pattern: Subscribe From Whatever Someone Pasted","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#pattern-poll-feeds-on-a-schedule","title":"Pattern: Poll Feeds On A Schedule","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#pattern-tell-failures-apart","title":"Pattern: Tell Failures Apart","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#pattern-subscribe-to-a-websub-hub","title":"Pattern: Subscribe To A WebSub Hub","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#pattern-parse-a-document-you-already-hold-and-store-it","title":"Pattern: Parse A Document You Already Hold, And Store It","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#pattern-read-feeds-on-your-own-network","title":"Pattern: Read Feeds On Your Own Network","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/opml","title":"@sdxc/opml","page":"@sdxc/opml","section":"Packages · Feeds & publishing","summary":"Read and write OPML subscription lists"},{"href":"/api/opml#installation","title":"Installation","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#usage","title":"Usage","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#read-a-subscription-list","title":"Read a subscription list","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#keep-the-folders","title":"Keep the folders","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#write-a-subscription-list","title":"Write a subscription list","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#api","title":"API","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#parse-source-string-result-opml-outline-opmlparseerror","title":"parse(source: string): Result<OPML.Outline[], OPMLParseError>","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#stringify-outlines-opml-outline-options-opml-stringifyoptions-string","title":"stringify(outlines: OPML.Outline[], options?: OPML.StringifyOptions): string","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#opmlparseerror","title":"OPMLParseError","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#types","title":"Types","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#pattern-import-an-uploaded-file","title":"Pattern: Import an uploaded file","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#pattern-serve-an-export-as-a-download","title":"Pattern: Serve an export as a download","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#pattern-merge-an-import-into-existing-subscriptions","title":"Pattern: Merge an import into existing subscriptions","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#pattern-group-subscriptions-by-folder","title":"Pattern: Group subscriptions by folder","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#pattern-test-an-export-against-its-import","title":"Pattern: Test an export against its import","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap","title":"@sdxc/sitemap","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing","summary":"Read and write the sitemap protocol: collect URLs, or fetch a published sitemap"},{"href":"/api/sitemap#installation","title":"Installation","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#usage","title":"Usage","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#build-a-sitemap","title":"Build a sitemap","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#read-a-published-sitemap","title":"Read a published sitemap","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#parse-a-document-you-already-hold","title":"Parse a document you already hold","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#api","title":"API","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#new-sitemap","title":"new Sitemap()","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemap-append-loc-url-options-sitemap-appendoptions-void","title":"sitemap.append(loc: URL, options?: Sitemap.AppendOptions): void","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemap-tostring-string","title":"sitemap.toString(): string","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemap-kind-sitemap-kind","title":"sitemap.kind: Sitemap.Kind","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemap-entries-set-sitemap-entry","title":"sitemap.entries: Set<Sitemap.Entry>","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemap-size-number","title":"sitemap.size: number","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemap-parse-xml-xml-result-sitemap-sitemapparseerror","title":"Sitemap.parse(xml: XML): Result<Sitemap, SitemapParseError>","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemap-fetch-input-url-requestinfo-init-requestinit-promise-result-sitemap-sitemapfetcherror-sitemapparseerror-xmlparseerror","title":"Sitemap.fetch(input: URL | RequestInfo, init?: RequestInit): Promise<Result<Sitemap, SitemapFetchError | SitemapParseError | XMLParseError>>","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemapparseerror","title":"SitemapParseError","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemapfetcherror","title":"SitemapFetchError","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#types","title":"Types","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#pattern-serving-a-sitemap","title":"Pattern: Serving a Sitemap","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#pattern-writing-a-sitemap-index","title":"Pattern: Writing a Sitemap Index","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#pattern-walking-an-index-into-its-pages","title":"Pattern: Walking an Index Into Its Pages","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#pattern-recrawling-only-what-changed","title":"Pattern: Recrawling Only What Changed","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#pattern-filtering-and-republishing-a-sitemap","title":"Pattern: Filtering and Republishing a Sitemap","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#pattern-reading-a-gzipped-sitemap","title":"Pattern: Reading a Gzipped Sitemap","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/robots","title":"@sdxc/robots","page":"@sdxc/robots","section":"Packages · Feeds & publishing","summary":"Read, write and evaluate robots.txt and robots directives"},{"href":"/api/robots#installation","title":"Installation","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#usage","title":"Usage","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#evaluate-a-file-you-already-hold","title":"Evaluate a file you already hold","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#check-a-url-before-crawling-it","title":"Check a URL before crawling it","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#write-a-robots-txt","title":"Write a robots.txt","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#read-and-write-per-page-directives","title":"Read and write per-page directives","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#api","title":"API","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#sdxc-robots","title":"@sdxc/robots","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#sdxc-robots-fetch","title":"@sdxc/robots/fetch","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#sdxc-robots-directives","title":"@sdxc/robots/directives","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#types","title":"Types","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#pattern-cache-the-outcome-per-origin","title":"Pattern: Cache The Outcome Per Origin","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#pattern-pace-requests-and-discover-sitemaps","title":"Pattern: Pace Requests And Discover Sitemaps","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#pattern-serve-robots-txt-with-per-bot-rules","title":"Pattern: Serve robots.txt With Per-Bot Rules","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#pattern-send-page-directives-as-header-and-meta-tag","title":"Pattern: Send Page Directives As Header And Meta Tag","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#pattern-honor-a-page-s-directives-when-indexing","title":"Pattern: Honor A Page's Directives When Indexing","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/microformats","title":"@sdxc/microformats","page":"@sdxc/microformats","section":"Packages · Feeds & publishing","summary":"Parse, read and write microformats2"},{"href":"/api/microformats#installation","title":"Installation","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#usage","title":"Usage","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#parse-a-page","title":"Parse a page","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#read-an-entry","title":"Read an entry","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#mark-up-a-template","title":"Mark up a template","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#api","title":"API","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#sdxc-microformats","title":"@sdxc/microformats","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#sdxc-microformats-vocabulary","title":"@sdxc/microformats/vocabulary","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#sdxc-microformats-ui","title":"@sdxc/microformats/ui","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#pattern-label-a-webmention","title":"Pattern: Label A Webmention","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#pattern-answer-micropub-with-the-same-shape","title":"Pattern: Answer Micropub With The Same Shape","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#pattern-find-who-a-site-belongs-to","title":"Pattern: Find Who A Site Belongs To","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#pattern-read-a-feed","title":"Pattern: Read A Feed","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#pattern-read-a-vocabulary-of-your-own","title":"Pattern: Read A Vocabulary Of Your Own","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#pattern-store-and-reload-a-parsed-page","title":"Pattern: Store And Reload A Parsed Page","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#pattern-verify-a-template-with-the-parser","title":"Pattern: Verify A Template With The Parser","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/micropub","title":"@sdxc/micropub","page":"@sdxc/micropub","section":"Packages · Feeds & publishing","summary":"Read Micropub requests into typed operations and build the spec's responses"},{"href":"/api/micropub#installation","title":"Installation","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#usage","title":"Usage","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#parse-a-write","title":"Parse a write","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#check-the-token-and-its-scopes","title":"Check the token and its scopes","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#answer-a-query","title":"Answer a query","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#accept-an-upload","title":"Accept an upload","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#api","title":"API","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#parseoperation-request-request-options-micropub-parseoptions-promise-result-micropub-parsed-micropub-operation-micropubrequesterror","title":"parseOperation(request: Request, options?: Micropub.ParseOptions): Promise<Result<Micropub.Parsed<Micropub.Operation>, MicropubRequestError>>","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#parsequery-request-request-result-micropub-parsed-micropub-query-micropubrequesterror","title":"parseQuery(request: Request): Result<Micropub.Parsed<Micropub.Query>, MicropubRequestError>","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#requiredscopes-operation-micropub-operation-micropub-scope","title":"requiredScopes(operation: Micropub.Operation): Micropub.Scope[]","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#responses","title":"Responses","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#micropubrequesterror","title":"MicropubRequestError","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#parseupload-request-request-options-media-options-result-micropub-parsed-file-micropubrequesterror-from-media","title":"parseUpload(request: Request, options: Media.Options): Result<Micropub.Parsed<File>, MicropubRequestError> from ./media","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#uploaded-location-string-url-response-from-media","title":"uploaded(location: string | URL): Response from ./media","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#types","title":"Types","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#pattern-one-endpoint-for-every-write","title":"Pattern: One Endpoint For Every Write","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#pattern-apply-an-update-to-a-stored-item","title":"Pattern: Apply An Update To A Stored Item","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#pattern-files-urls-and-commands-on-a-create","title":"Pattern: Files, URLs And Commands On A Create","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#pattern-forms-already-read-by-middleware","title":"Pattern: Forms Already Read By Middleware","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#pattern-advertise-what-the-server-supports","title":"Pattern: Advertise What The Server Supports","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#pattern-read-a-post-back-for-editing","title":"Pattern: Read A Post Back For Editing","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/webmention","title":"@sdxc/webmention","page":"@sdxc/webmention","section":"Packages · Feeds & publishing","summary":"Receive, verify, discover and send Webmentions"},{"href":"/api/webmention#installation","title":"Installation","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#usage","title":"Usage","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#receive","title":"Receive","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#verify-in-the-background","title":"Verify in the background","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#advertise-your-endpoint","title":"Advertise your endpoint","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#send","title":"Send","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#api","title":"API","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#sdxc-webmention","title":"@sdxc/webmention","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#sdxc-webmention-receiver","title":"@sdxc/webmention/receiver","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#sdxc-webmention-discover","title":"@sdxc/webmention/discover","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#sdxc-webmention-sender","title":"@sdxc/webmention/sender","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#types","title":"Types","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#pattern-an-endpoint-and-its-verification-job","title":"Pattern: An Endpoint And Its Verification Job","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#pattern-notify-on-create-and-update","title":"Pattern: Notify On Create And Update","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#pattern-delete-a-post","title":"Pattern: Delete A Post","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#pattern-retry-or-acknowledge-a-send","title":"Pattern: Retry Or Acknowledge A Send","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#pattern-check-a-source-you-already-parsed","title":"Pattern: Check A Source You Already Parsed","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#pattern-discover-without-sending","title":"Pattern: Discover Without Sending","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/websub","title":"@sdxc/websub","page":"@sdxc/websub","section":"Packages · Feeds & publishing","summary":"WebSub subscriber and publisher: subscribe, verify intent and signatures, notify hubs"},{"href":"/api/websub#installation","title":"Installation","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#usage","title":"Usage","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#subscribe-to-a-topic","title":"Subscribe to a topic","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#confirm-the-hub-s-verification","title":"Confirm the hub's verification","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#verify-a-delivery","title":"Verify a delivery","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#advertise-a-hub-and-ping-it","title":"Advertise a hub and ping it","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#api","title":"API","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#sdxc-websub","title":"@sdxc/websub","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#sdxc-websub-subscriber","title":"@sdxc/websub/subscriber","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#sdxc-websub-publisher","title":"@sdxc/websub/publisher","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#types","title":"Types","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#pattern-a-callback-route","title":"Pattern: A Callback Route","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#pattern-renew-before-the-lease-expires","title":"Pattern: Renew Before The Lease Expires","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#pattern-queue-hub-requests","title":"Pattern: Queue Hub Requests","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#pattern-ping-after-publishing","title":"Pattern: Ping After Publishing","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub","title":"@sdxc/activitypub","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing","summary":"ActivityPub protocol logic: vocabulary, actors, discovery, a verified inbox and signed delivery"},{"href":"/api/activitypub#installation","title":"Installation","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#usage","title":"Usage","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#set-up-a-federation","title":"Set up a federation","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#answer-the-actor-s-urls","title":"Answer the actor's URLs","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#process-the-queue","title":"Process the queue","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#handle-replies-likes-and-follows","title":"Handle replies, likes and follows","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#publish-an-activity","title":"Publish an activity","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#api","title":"API","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#federation","title":"Federation","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#actorkeys","title":"ActorKeys","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#remoteresolver","title":"RemoteResolver","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#cacheseenactivities","title":"CacheSeenActivities","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#vocabulary","title":"Vocabulary","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#errors","title":"Errors","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#storage","title":"Storage","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#sdxc-activitypub-testing","title":"@sdxc/activitypub/testing","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#types","title":"Types","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#pattern-one-job-with-sdxc-jobs","title":"Pattern: One Job With @sdxc/jobs","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#pattern-serve-a-post-as-html-or-activitystreams","title":"Pattern: Serve A Post As HTML Or ActivityStreams","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#pattern-webfinger-and-handle-lookup","title":"Pattern: WebFinger And Handle Lookup","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#pattern-approve-followers-by-hand","title":"Pattern: Approve Followers By Hand","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#pattern-an-outbox-and-a-replies-collection","title":"Pattern: An Outbox And A Replies Collection","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#pattern-read-remote-documents-without-a-federation","title":"Pattern: Read Remote Documents Without A Federation","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/activitypub#pattern-test-against-in-memory-stores-and-hold-real-ones-to-the-contract","title":"Pattern: Test Against In-Memory Stores And Hold Real Ones To The Contract","page":"@sdxc/activitypub","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter","title":"@sdxc/newsletter","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing","summary":"Vendor-neutral newsletter subscriber lists with Buttondown and Kit providers"},{"href":"/api/newsletter#installation","title":"Installation","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#usage","title":"Usage","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#create-a-provider","title":"Create a provider","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#subscribe-an-address","title":"Subscribe an address","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#read-change-and-unsubscribe-a-reader","title":"Read, change and unsubscribe a reader","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#api","title":"API","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#newsletter","title":"Newsletter","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#subscribers-subscribe-input-subscribeinput-promise-result-subscribeoutcome-newslettererror","title":"subscribers.subscribe(input: SubscribeInput): Promise<Result<SubscribeOutcome, NewsletterError>>","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#subscribers-find-ref-subscriberref-promise-result-subscriber-newslettererror","title":"subscribers.find(ref: SubscriberRef): Promise<Result<Subscriber, NewsletterError>>","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#subscribers-tags-ref-subscriberref-promise-result-string-newslettererror","title":"subscribers.tags(ref: SubscriberRef): Promise<Result<string[], NewsletterError>>","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#subscribers-list-query-listsubscribersquery-promise-result-page-subscriber-newslettererror","title":"subscribers.list(query?: ListSubscribersQuery): Promise<Result<Page<Subscriber>, NewsletterError>>","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#subscribers-update-ref-subscriberref-input-updatesubscriberinput-promise-result-subscriber-newslettererror","title":"subscribers.update(ref: SubscriberRef, input: UpdateSubscriberInput): Promise<Result<Subscriber, NewsletterError>>","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#subscribers-unsubscribe-ref-subscriberref-promise-result-subscriber-newslettererror","title":"subscribers.unsubscribe(ref: SubscriberRef): Promise<Result<Subscriber, NewsletterError>>","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#webhooks-verify-request-request-rawbody-string-promise-boolean","title":"webhooks.verify(request: Request, rawBody: string): Promise<boolean>","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#webhooks-events-request-request-rawbody-string-result-newsletterevent-newslettererror","title":"webhooks.events(request: Request, rawBody: string): Result<NewsletterEvent[], NewsletterError>","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#default-page-size","title":"DEFAULT_PAGE_SIZE","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#newslettererror","title":"NewsletterError","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#new-newsletterwebhook-provider-newsletter-handlers-newsletterwebhookhandlers-options-newsletterwebhookoptions","title":"new NewsletterWebhook(provider: Newsletter, handlers: NewsletterWebhookHandlers, options?: NewsletterWebhookOptions)","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#sdxc-newsletter-middleware","title":"@sdxc/newsletter/middleware","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#sdxc-newsletter-middleware-cli","title":"@sdxc/newsletter/middleware/cli","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#sdxc-newsletter-buttondown","title":"@sdxc/newsletter/buttondown","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#sdxc-newsletter-kit","title":"@sdxc/newsletter/kit","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#sdxc-newsletter-memory","title":"@sdxc/newsletter/memory","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#sdxc-newsletter-conformance","title":"@sdxc/newsletter/conformance","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#types","title":"Types","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#pattern-a-subscribe-form-on-a-router","title":"Pattern: A subscribe form on a router","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#pattern-testing-against-the-memory-provider","title":"Pattern: Testing against the memory provider","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#pattern-crediting-the-campaign-a-visitor-arrived-from","title":"Pattern: Crediting the campaign a visitor arrived from","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#pattern-reacting-to-webhook-events","title":"Pattern: Reacting to webhook events","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#pattern-walking-the-whole-list-from-a-job","title":"Pattern: Walking the whole list from a job","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/newsletter#pattern-holding-a-custom-provider-to-the-contract","title":"Pattern: Holding a custom provider to the contract","page":"@sdxc/newsletter","section":"Packages · Feeds & publishing"},{"href":"/api/data-model","title":"@sdxc/data-model","page":"@sdxc/data-model","section":"Packages · Data & storage","summary":"Models over remix/data-table tables with scopes, async callbacks and typed meta fields"},{"href":"/api/data-model#installation","title":"Installation","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#usage","title":"Usage","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#define-a-model","title":"Define a model","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#bind-it-read-and-write","title":"Bind it, read and write","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#publish-models-per-request","title":"Publish models per request","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#reach-services-and-defer-side-effects","title":"Reach services and defer side effects","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#api","title":"API","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#createmodel-table-options","title":"createModel(table, options?)","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#withcontext-context","title":"withContext<Context>()","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#definition-bind-context-host-options","title":"definition.bind(context, host?, options?)","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#definition-extend-value-options","title":"definition.extend(value, options)","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#bound-model","title":"Bound model","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#createmodels-entries","title":"createModels(entries)","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#field","title":"field","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#models-registry-context-options-from-router-jobs-and-cli","title":"models(registry, context, options?) from ./router, ./jobs and ./cli","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#notfound","title":"NotFound","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#constraintviolation","title":"ConstraintViolation","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#testing","title":"./testing","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#types","title":"Types","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#pattern-scopes-over-a-soft-deleted-table","title":"Pattern: Scopes Over A Soft-Deleted Table","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#pattern-custom-methods-that-answer-queries-results-or-raw-rows","title":"Pattern: Custom Methods That Answer Queries, Results Or Raw Rows","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#pattern-every-callback-around-a-write","title":"Pattern: Every Callback Around A Write","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#pattern-pin-a-model-to-one-slice-of-a-table","title":"Pattern: Pin A Model To One Slice Of A Table","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#pattern-open-ended-attributes-as-typed-meta-fields","title":"Pattern: Open-Ended Attributes As Typed Meta Fields","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#pattern-sub-models-on-a-discriminator","title":"Pattern: Sub-Models On A Discriminator","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#pattern-helpers-over-any-model","title":"Pattern: Helpers Over Any Model","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#pattern-paging-a-scope","title":"Pattern: Paging A Scope","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/data-model#pattern-factories-in-a-test","title":"Pattern: Factories In A Test","page":"@sdxc/data-model","section":"Packages · Data & storage"},{"href":"/api/database-middleware","title":"@sdxc/database-middleware","page":"@sdxc/database-middleware","section":"Packages · Data & storage","summary":"Middleware that publishes a remix/data-table database as ctx.db on a request, a job or a command"},{"href":"/api/database-middleware#installation","title":"Installation","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#usage","title":"Usage","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#publish-the-database-on-requests","title":"Publish the database on requests","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#read-it-by-key","title":"Read it by key","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#publish-it-on-jobs","title":"Publish it on jobs","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#publish-it-on-a-command-line-with-a-sql-prompt","title":"Publish it on a command line, with a SQL prompt","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#api","title":"API","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#database-db-database-middleware","title":"database(db: Database): Middleware","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#database-db-database-database-jobmiddleware-from-jobs","title":"database(db: Database | (() => Database)): JobMiddleware from ./jobs","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#database-db-database-database-commandmiddleware-from-cli","title":"database(db: Database | (() => Database)): CommandMiddleware from ./cli","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#db-command-and-dbhandler-from-cli","title":"DB_COMMAND and dbHandler from ./cli","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#database","title":"Database","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#pattern-in-memory-database-in-tests","title":"Pattern: In-memory database in tests","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#pattern-one-database-per-job-run","title":"Pattern: One database per job run","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#pattern-one-instance-per-request","title":"Pattern: One instance per request","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/database-middleware#pattern-feeding-later-middleware","title":"Pattern: Feeding later middleware","page":"@sdxc/database-middleware","section":"Packages · Data & storage"},{"href":"/api/cache","title":"@sdxc/cache","page":"@sdxc/cache","section":"Packages · Data & storage","summary":"Cache contract with adapters for memory and Cloudflare KV"},{"href":"/api/cache#installation","title":"Installation","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#usage","title":"Usage","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#compute-once-read-many-times","title":"Compute once, read many times","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#read-write-and-delete-entries","title":"Read, write and delete entries","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#values-come-back-as-json","title":"Values come back as JSON","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#store-entries-in-workers-kv","title":"Store entries in Workers KV","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#api","title":"API","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#cache","title":"Cache","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#cacheerror","title":"CacheError","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#new-memorycache-options-memorycacheoptions","title":"new MemoryCache(options?: MemoryCacheOptions)","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#new-workerkvcache-kv-kvnamespace-options-workerkvcacheoptions","title":"new WorkerKVCache(kv: KVNamespace, options?: WorkerKVCacheOptions)","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#conformance-options-conformanceoptions-void","title":"conformance(options: ConformanceOptions): void","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#types","title":"Types","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#pattern-accept-any-cache-test-with-memory","title":"Pattern: Accept Any Cache, Test With Memory","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#pattern-expire-entries-on-a-test-clock","title":"Pattern: Expire Entries On A Test Clock","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#pattern-cache-per-request-in-a-worker","title":"Pattern: Cache Per Request In A Worker","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#pattern-invalidate-after-a-write","title":"Pattern: Invalidate After A Write","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#pattern-rethrow-failures","title":"Pattern: Rethrow Failures","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#pattern-verify-a-custom-adapter","title":"Pattern: Verify A Custom Adapter","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache","title":"@sdxc/workers-cache","page":"@sdxc/workers-cache","section":"Packages · Data & storage","summary":"Cache tags, purging and cache-status reads for Cloudflare Workers Cache"},{"href":"/api/workers-cache#installation","title":"Installation","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#usage","title":"Usage","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#declare-a-tag-vocabulary","title":"Declare a tag vocabulary","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#tag-a-response","title":"Tag a response","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#purge-by-tag","title":"Purge by tag","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#declare-caching-from-a-route","title":"Declare caching from a route","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#api","title":"API","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#createtags-vocabulary-tagvocabulary-cachetags-vocabulary","title":"createTags(vocabulary: TagVocabulary): CacheTags<Vocabulary>","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#cachetag-tags-readonly-cachetag-string","title":"cacheTag(tags: readonly CacheTag[]): string","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#purge-cache-cacheinterface-options-purgeoptions-promise-result-void-purgeerror","title":"purge(cache: CacheInterface, options: PurgeOptions): Promise<Result<void, PurgeError>>","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#cachestatus-response-response-cachestatus","title":"cacheStatus(response: Response): CacheStatus","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#cachehops-response-response-cachehop","title":"cacheHops(response: Response): CacheHop[]","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#createrecordingcache-options-recordingcacheoptions-recordingcache","title":"createRecordingCache(options?: RecordingCacheOptions): RecordingCache","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#cache-options-workerscachemiddlewareoptions-middleware","title":"cache(options: WorkersCacheMiddlewareOptions): Middleware","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#constants","title":"Constants","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#errors","title":"Errors","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#types","title":"Types","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#pattern-named-policies-in-one-module","title":"Pattern: Named Policies In One Module","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#pattern-a-group-tag-from-a-middleware","title":"Pattern: A Group Tag From A Middleware","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#pattern-purge-now-or-after-the-response","title":"Pattern: Purge Now Or After The Response","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#pattern-purge-outside-a-request","title":"Pattern: Purge Outside A Request","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#pattern-checking-cache-behavior-in-a-smoke-test","title":"Pattern: Checking Cache Behavior In A Smoke Test","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#pattern-testing-a-cached-route","title":"Pattern: Testing A Cached Route","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/search","title":"@sdxc/search","page":"@sdxc/search","section":"Packages · Data & storage","summary":"Full-text search over SQLite tables you already declare: safe query parsing, FTS5 and LIKE matching, field-weighted ranking, highlighting and batched reindexing"},{"href":"/api/search#installation","title":"Installation","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#usage","title":"Usage","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#parse-what-somebody-typed","title":"Parse what somebody typed","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#search-a-table","title":"Search a table","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#rank-with-an-fts5-index","title":"Rank with an FTS5 index","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#highlight-what-matched","title":"Highlight what matched","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#api","title":"API","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#parsequery-input-options-result-parsedquery-null-validationerror","title":"parseQuery(input, options?): Result<ParsedQuery | null, ValidationError>","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#formatquery-query-options-string","title":"formatQuery(query, options?): string","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#highlight-text-query-options-highlightsegment","title":"highlight(text, query, options?): HighlightSegment[]","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#excerpt-text-query-options-excerpt","title":"excerpt(text, query, options?): Excerpt","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#definesearch-options-search","title":"defineSearch(options): Search","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#search-query-db-query-searchquery","title":"search.query(db, query): SearchQuery","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#search-predicate-query-alias-sqlstatement","title":"search.predicate(query, { alias? }): SqlStatement","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#search-reindex-db-after-limit-promise-result-reindexprogress-searcherror","title":"search.reindex(db, { after?, limit? }): Promise<Result<ReindexProgress, SearchError>>","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#searcherror","title":"SearchError","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#parameterbudgeterror","title":"ParameterBudgetError","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#constants","title":"Constants","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#types","title":"Types","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#pattern-storing-an-fts5-index","title":"Pattern: Storing an FTS5 index","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#pattern-a-search-page-with-filters","title":"Pattern: A search page with filters","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#pattern-search-as-you-type","title":"Pattern: Search as you type","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#pattern-substring-search-with-a-trigram-index","title":"Pattern: Substring search with a trigram index","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#pattern-search-narrowing-a-list-s-own-order","title":"Pattern: Search narrowing a list's own order","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#pattern-letting-a-query-pick-its-order","title":"Pattern: Letting a query pick its order","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#pattern-matching-inside-your-own-statement","title":"Pattern: Matching inside your own statement","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/search#pattern-reindexing-from-a-background-job","title":"Pattern: Reindexing from a background job","page":"@sdxc/search","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv","title":"@sdxc/session-storage-kv","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage","summary":"A remix/session SessionStorage backed by a Cloudflare Workers KV store"},{"href":"/api/session-storage-kv#installation","title":"Installation","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#usage","title":"Usage","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#create-the-storage","title":"Create the storage","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#wire-it-into-a-router","title":"Wire it into a router","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#choose-a-key-prefix-and-a-lifetime","title":"Choose a key prefix and a lifetime","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#type-the-session-data","title":"Type the session data","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#api","title":"API","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#new-kvsessionstorage-values-flash-kv-kvstore-options-kvsessionstorage-options","title":"new KVSessionStorage<Values, Flash>(kv: KVStore, options?: KVSessionStorage.Options)","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#storage-read-cookie-string-null-promise-session-values-flash","title":"storage.read(cookie: string | null): Promise<Session<Values, Flash>>","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#storage-save-session-session-values-flash-promise-string-null","title":"storage.save(session: Session<Values, Flash>): Promise<string | null>","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#types","title":"Types","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#pattern-sign-in-and-sign-out","title":"Pattern: Sign In And Sign Out","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#pattern-separate-sessions-in-one-namespace","title":"Pattern: Separate Sessions In One Namespace","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#pattern-testing-with-an-in-memory-store","title":"Pattern: Testing With An In-Memory Store","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/data-table-d1","title":"@sdxc/data-table-d1","page":"@sdxc/data-table-d1","section":"Packages · Data & storage","summary":"A remix/data-table DatabaseDriver backed by Cloudflare D1"},{"href":"/api/data-table-d1#installation","title":"Installation","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#usage","title":"Usage","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#open-a-database-on-a-d1-binding","title":"Open a database on a D1 binding","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#read-and-write-typed-columns","title":"Read and write typed columns","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#run-raw-sql","title":"Run raw SQL","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#observe-what-each-statement-costs","title":"Observe what each statement costs","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#api","title":"API","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#created1databaseadapter-db-d1database-options-databasedriver","title":"createD1DatabaseAdapter(db: D1Database, options?): DatabaseDriver","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#types","title":"Types","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#pattern-making-a-multi-row-write-atomic","title":"Pattern: Making A Multi-Row Write Atomic","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#pattern-claiming-work-from-a-queue","title":"Pattern: Claiming Work From A Queue","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#pattern-rows-read-and-written-per-request","title":"Pattern: Rows Read And Written Per Request","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#pattern-reusing-the-driver-across-requests","title":"Pattern: Reusing The Driver Across Requests","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#pattern-handing-the-driver-to-a-host-agnostic-library","title":"Pattern: Handing The Driver To A Host-Agnostic Library","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage","title":"@sdxc/data-table-sqlstorage","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage","summary":"A remix/data-table database driver backed by a Cloudflare Durable Object's SQL storage"},{"href":"/api/data-table-sqlstorage#installation","title":"Installation","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#usage","title":"Usage","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#build-a-database-inside-a-durable-object","title":"Build a database inside a Durable Object","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#read-and-write-json-and-boolean-columns","title":"Read and write JSON and boolean columns","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#run-raw-sql","title":"Run raw SQL","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#write-atomically-within-one-turn","title":"Write atomically within one turn","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#api","title":"API","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#createsqlstoragedatabaseadapter-db-sqlstorage-options-databasedriver","title":"createSQLStorageDatabaseAdapter(db: SqlStorage, options?): DatabaseDriver","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#pattern-apply-a-schema-when-the-object-boots","title":"Pattern: Apply A Schema When The Object Boots","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#pattern-keep-a-multi-step-write-atomic","title":"Pattern: Keep A Multi-Step Write Atomic","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#pattern-host-a-storage-agnostic-library-in-a-durable-object","title":"Pattern: Host A Storage-Agnostic Library In A Durable Object","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/ui","title":"@sdxc/ui","page":"@sdxc/ui","section":"Packages · Interface","summary":"Styled, accessible remix/component components rendered as server HTML"},{"href":"/api/u","title":"@sdxc/u","page":"@sdxc/u","section":"Packages · Interface","summary":"Utility-first styling for remix/component, composed from small, terse mixins"},{"href":"/api/icons","title":"@sdxc/icons","page":"@sdxc/icons","section":"Packages · Interface","summary":"Lucide icons as remix/component components, one tree-shakeable export per icon"},{"href":"/api/icons#installation","title":"Installation","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#usage","title":"Usage","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#render-an-icon","title":"Render an icon","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#set-size-color-and-stroke","title":"Set size, color and stroke","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#give-an-icon-an-accessible-name","title":"Give an icon an accessible name","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#render-an-icon-chosen-at-runtime","title":"Render an icon chosen at runtime","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#api","title":"API","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#pascalcasename-icon","title":"<PascalCaseName>Icon","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#icon","title":"Icon","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#iconexportnames","title":"iconExportNames","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#createlucideicon-iconname-string-iconnode-iconnode","title":"createLucideIcon(iconName: string, iconNode: IconNode)","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#types","title":"Types","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#pattern-building-an-icon-picker","title":"Pattern: Building An Icon Picker","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#pattern-validating-a-stored-icon-name","title":"Pattern: Validating A Stored Icon Name","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#pattern-keeping-icons-out-of-the-client-bundle","title":"Pattern: Keeping Icons Out Of The Client Bundle","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#pattern-adding-an-icon-lucide-doesn-t-ship","title":"Pattern: Adding An Icon Lucide Doesn't Ship","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/i18n","title":"@sdxc/i18n","page":"@sdxc/i18n","section":"Packages · Interface","summary":"Language detection and MessageFormat 2 translators for Remix routers and remix/component"},{"href":"/api/i18n#installation","title":"Installation","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#usage","title":"Usage","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#write-a-bundle-per-language","title":"Write a bundle per language","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#translate","title":"Translate","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#translate-per-request","title":"Translate per request","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#render-with-remix-component","title":"Render with remix/component","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#translate-without-a-request","title":"Translate without a request","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#api","title":"API","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#createi18n-options-i18noptions-i18n","title":"createI18n(options: I18nOptions): I18n","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#createtranslator-options-translatoroptions-translator","title":"createTranslator(options: TranslatorOptions): Translator","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#languagedetector","title":"LanguageDetector","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#getclientlocales-requestorheaders-request-headers-string-undefined","title":"getClientLocales(requestOrHeaders: Request | Headers): string | undefined","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#i18n-options-i18nmiddlewareoptions-middleware","title":"i18n(options: I18nMiddlewareOptions): Middleware","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#i18n-options-translatoroptions-commandmiddleware","title":"i18n(options: TranslatorOptions): CommandMiddleware","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#intlprovider","title":"IntlProvider","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#intl-handle-handle-i18n","title":"intl(handle: Handle): I18n","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#setintl-intl-i18n-void","title":"setIntl(intl: I18n): void","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#trans","title":"Trans","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#types","title":"Types","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#pattern-reading-the-language-from-the-session","title":"Pattern: Reading The Language From The Session","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#pattern-letting-the-user-pick-a-language","title":"Pattern: Letting The User Pick A Language","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#pattern-locale-in-the-url-path","title":"Pattern: Locale In The URL Path","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#pattern-translating-in-a-background-job","title":"Pattern: Translating In A Background Job","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#pattern-sending-a-translated-email-from-a-command","title":"Pattern: Sending A Translated Email From A Command","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#pattern-hydrating-islands-in-the-browser","title":"Pattern: Hydrating Islands In The Browser","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#pattern-formatting-dates-in-the-client-s-region","title":"Pattern: Formatting Dates In The Client's Region","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/messageformat","title":"@sdxc/messageformat","page":"@sdxc/messageformat","section":"Packages · Interface","summary":"Unicode MessageFormat 2 parser and formatter shaped like Intl.MessageFormat"},{"href":"/api/messageformat#installation","title":"Installation","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#usage","title":"Usage","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#format-a-message","title":"Format a message","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#choose-a-variant","title":"Choose a variant","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#collect-formatting-errors","title":"Collect formatting errors","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#check-a-message-without-throwing","title":"Check a message without throwing","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#api","title":"API","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#new-messageformat-locales-source-options","title":"new MessageFormat(locales, source, options?)","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#messageformat-format-values-onerror-string","title":"messageFormat.format(values?, onError?): string","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#messageformat-formattoparts-values-onerror-messagepart","title":"messageFormat.formatToParts(values?, onError?): MessagePart[]","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#messageformat-resolvedoptions-resolvedmessageformatoptions","title":"messageFormat.resolvedOptions(): ResolvedMessageFormatOptions","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#parse-source-string-result-messagedata-messageerror","title":"parse(source: string): Result<MessageData, MessageError>","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#messageerror","title":"MessageError","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#default-functions","title":"Default functions","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#types","title":"Types","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#pattern-validate-a-catalog-then-compile-it","title":"Pattern: Validate A Catalog, Then Compile It","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#pattern-ordinals-and-number-options","title":"Pattern: Ordinals And Number Options","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#pattern-right-to-left-values","title":"Pattern: Right-To-Left Values","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#pattern-a-custom-function","title":"Pattern: A Custom Function","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#pattern-folding-markup-into-elements","title":"Pattern: Folding Markup Into Elements","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/seo","title":"@sdxc/seo","page":"@sdxc/seo","section":"Packages · Interface","summary":"Canonical URLs, typed schema.org structured data and head metadata"},{"href":"/api/seo#installation","title":"Installation","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#usage","title":"Usage","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#configure-the-site-once","title":"Configure the site once","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#resolve-canonical-and-absolute-urls","title":"Resolve canonical and absolute URLs","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#build-structured-data","title":"Build structured data","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#render-the-head","title":"Render the head","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#api","title":"API","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#createseo-config-seoconfig-seoservice","title":"createSeo(config: SeoConfig): SeoService","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-canonical-url-string-url-string","title":"seo.canonical(url: string | URL): string","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-absolute-path-string-url-string","title":"seo.absolute(path: string | URL): string","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-robotstag-options-robotsoptions-string","title":"seo.robotsTag(options?: RobotsOptions): string","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-jsonldstring-schema-schemaorg-node-schemaorg-node-string","title":"seo.jsonLdString(schema: SchemaOrg.Node | SchemaOrg.Node[]): string","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-baseurl-string","title":"seo.baseUrl: string","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-site-seosite","title":"seo.site: SeoSite","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-schema-seoschema","title":"seo.schema: SeoSchema","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo","title":"Seo","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-meta","title":"Seo.Meta","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-jsonld","title":"Seo.JsonLd","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#types","title":"Types","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#pattern-a-shared-instance-and-a-layout-that-takes-metadata","title":"Pattern: A Shared Instance And A Layout That Takes Metadata","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#pattern-the-home-page-describes-the-site","title":"Pattern: The Home Page Describes The Site","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#pattern-an-article-page","title":"Pattern: An Article Page","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#pattern-a-product-page-with-pricing-and-faq","title":"Pattern: A Product Page With Pricing And FAQ","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#pattern-a-book-sold-as-several-packages","title":"Pattern: A Book Sold As Several Packages","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#pattern-keeping-a-page-out-of-the-index","title":"Pattern: Keeping A Page Out Of The Index","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#pattern-adding-structured-data-outside-remix-component","title":"Pattern: Adding Structured Data Outside remix/component","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/highlight","title":"@sdxc/highlight","page":"@sdxc/highlight","section":"Packages · Interface","summary":"Syntax highlighting as tokens, with a markdown walk visitor and a stylesheet"},{"href":"/api/highlight#installation","title":"Installation","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#usage","title":"Usage","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#tokenize-source","title":"Tokenize source","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#render-tokens-as-components","title":"Render tokens as components","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#render-a-string","title":"Render a string","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#paint-a-parsed-document","title":"Paint a parsed document","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#api","title":"API","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#tokenize-code-string-language-string-token","title":"tokenize(code: string, language: string): Token[]","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#highlight-code-string-language-string-string","title":"highlight(code: string, language: string): string","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#normalizelanguage-language-string-string","title":"normalizeLanguage(language: string): string","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#languages-record-string-grammar","title":"languages: Record<string, Grammar>","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#scan-code-string-grammar-grammar-token","title":"scan(code: string, grammar: Grammar): Token[]","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#compose-parts-array-record-string-rule-grammar","title":"compose(...parts: Array<Record<string, Rule[]>>): Grammar","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#highlight-from-sdxc-highlight-markdown","title":"highlight from @sdxc/highlight/markdown","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#sdxc-highlight-styles-css","title":"@sdxc/highlight/styles.css","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#types","title":"Types","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#pattern-server-rendered-code-blocks","title":"Pattern: Server-Rendered Code Blocks","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#pattern-paint-and-rewrite-in-one-walk","title":"Pattern: Paint And Rewrite In One Walk","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#pattern-inline-colours-without-a-stylesheet","title":"Pattern: Inline Colours Without A Stylesheet","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#pattern-theming-the-stylesheet","title":"Pattern: Theming The Stylesheet","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#pattern-writing-a-grammar","title":"Pattern: Writing A Grammar","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#pattern-nested-modes-and-composed-grammars","title":"Pattern: Nested Modes And Composed Grammars","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/lazy-route","title":"@sdxc/lazy-route","page":"@sdxc/lazy-route","section":"Packages · Interface","summary":"Maps a route to a module imported on the first request that reaches it"},{"href":"/api/lazy-route#installation","title":"Installation","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#usage","title":"Usage","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#defer-a-route","title":"Defer a route","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#map-actions-and-controllers-alike","title":"Map actions and controllers alike","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#keep-the-module-s-own-middleware","title":"Keep the module's own middleware","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#guard-a-route-before-it-loads","title":"Guard a route before it loads","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#load-a-named-export","title":"Load a named export","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#api","title":"API","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#lazy-load-middleware","title":"lazy(load, middleware?)","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#pattern-deferring-the-whole-route-table","title":"Pattern: Deferring The Whole Route Table","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#pattern-one-guard-for-a-route-group","title":"Pattern: One Guard For A Route Group","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#pattern-a-route-map-spread-across-modules","title":"Pattern: A Route Map Spread Across Modules","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-frame","title":"@sdxc/lazy-frame","page":"@sdxc/lazy-frame","section":"Packages · Interface","summary":"A remix/component frame that loads its page once the reader reaches it, by scrolling near it or opening the dialog around it"},{"href":"/api/lazy-frame#installation","title":"Installation","page":"@sdxc/lazy-frame","section":"Packages · Interface"},{"href":"/api/lazy-frame#usage","title":"Usage","page":"@sdxc/lazy-frame","section":"Packages · Interface"},{"href":"/api/lazy-frame#load-a-page-as-the-reader-scrolls-near-it","title":"Load a page as the reader scrolls near it","page":"@sdxc/lazy-frame","section":"Packages · Interface"},{"href":"/api/lazy-frame#load-a-page-when-its-dialog-opens","title":"Load a page when its dialog opens","page":"@sdxc/lazy-frame","section":"Packages · Interface"},{"href":"/api/lazy-frame#register-the-client-entry","title":"Register the client entry","page":"@sdxc/lazy-frame","section":"Packages · Interface"},{"href":"/api/lazy-frame#api","title":"API","page":"@sdxc/lazy-frame","section":"Packages · Interface"},{"href":"/api/lazy-frame#lazyframe-src-loadon-rootmargin-fallback-url-parenturl-sitsabove-opener","title":"<LazyFrame src loadOn? rootMargin? fallback? url? parentUrl? sitsAbove? opener?>","page":"@sdxc/lazy-frame","section":"Packages · Interface"},{"href":"/api/lazy-frame#types","title":"Types","page":"@sdxc/lazy-frame","section":"Packages · Interface"},{"href":"/api/lazy-frame#pattern-a-list-that-pages-in-both-directions","title":"Pattern: A list that pages in both directions","page":"@sdxc/lazy-frame","section":"Packages · Interface"},{"href":"/api/lazy-frame#pattern-details-behind-a-disclosure-or-popover","title":"Pattern: Details behind a disclosure or popover","page":"@sdxc/lazy-frame","section":"Packages · Interface"},{"href":"/api/lazy-frame#pattern-below-the-fold-sections-fetched-early","title":"Pattern: Below-the-fold sections fetched early","page":"@sdxc/lazy-frame","section":"Packages · Interface"},{"href":"/api/qr","title":"@sdxc/qr","page":"@sdxc/qr","section":"Packages · Interface","summary":"QR Code Model 2 encoder with optimal segmentation, SVG path data and a remix/component renderer"},{"href":"/api/qr#installation","title":"Installation","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#usage","title":"Usage","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#encode-text","title":"Encode text","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#render-it-with-remix-component","title":"Render it with remix/component","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#draw-into-your-own-markup","title":"Draw into your own markup","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#handle-a-failure","title":"Handle a failure","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#api","title":"API","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#qr","title":"QR","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#qrcode-from-sdxc-qr-ui","title":"QrCode from @sdxc/qr/ui","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#qrerror","title":"QrError","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#qrtoolongerror","title":"QrTooLongError","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#qroptionserror","title":"QrOptionsError","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#types","title":"Types","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#pattern-an-authenticator-enrolment-page","title":"Pattern: An Authenticator Enrolment Page","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#pattern-keeping-a-code-small-on-screen","title":"Pattern: Keeping A Code Small On Screen","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#pattern-a-printed-label-that-survives-damage","title":"Pattern: A Printed Label That Survives Damage","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#pattern-rendering-in-a-terminal","title":"Pattern: Rendering In A Terminal","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/qr#credits","title":"Credits","page":"@sdxc/qr","section":"Packages · Interface"},{"href":"/api/jobs","title":"@sdxc/jobs","page":"@sdxc/jobs","section":"Packages · Operations","summary":"Declared background jobs dispatched over a pluggable queue backend"},{"href":"/api/jobs#installation","title":"Installation","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#usage","title":"Usage","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#declare-the-jobs","title":"Declare the jobs","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#write-a-handler","title":"Write a handler","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#map-handlers-onto-a-dispatcher","title":"Map handlers onto a dispatcher","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#enqueue-a-job","title":"Enqueue a job","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#end-a-run","title":"End a run","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#api","title":"API","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#jobs-tree-jobtree-jobmap","title":"jobs(tree: JobTree): JobMap","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#job-options-joboptions-jobleaf","title":"job(options?: JobOptions): JobLeaf","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#createjobhandler-job-handler-jobhandler","title":"createJobHandler(job, handler): JobHandler","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#createjobcontext-job-init-jobcontextinit-jobhandlercontext","title":"createJobContext(job, init: JobContextInit): JobHandlerContext","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#messagebody-job-input-jsonvalue","title":"messageBody(job, input?): JSONValue","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#createjobdispatcher-options-jobdispatcheroptions-jobdispatcher","title":"createJobDispatcher(options?: JobDispatcherOptions): JobDispatcher","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#jobcontext","title":"JobContext","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#endings","title":"Endings","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#records","title":"Records","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#jobenqueuer-queue-jobqueue-middleware-from-router","title":"jobEnqueuer(queue: JobQueue): Middleware from ./router","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#jobenqueuer-queue-jobqueue-options-dispatcher-commandmiddleware-from-cli","title":"jobEnqueuer(queue: JobQueue, options?: { dispatcher }): CommandMiddleware from ./cli","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#queue-binding-and-worker-dispatcher-options-from-cloudflare","title":"queue(binding) and worker(dispatcher, options?) from ./cloudflare","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#queue-options-from-memory","title":"queue(options?) from ./memory","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#jobqueue-from-queue","title":"JobQueue from ./queue","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#createuptimereporter-token-url-from-uptime","title":"createUptimeReporter({ token, url? }) from ./uptime","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#conformance-options-from-conformance","title":"conformance(options) from ./conformance","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#types","title":"Types","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#pattern-middleware-that-provides-a-database","title":"Pattern: Middleware That Provides A Database","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#pattern-scheduled-jobs-watched-by-a-cron-monitor","title":"Pattern: Scheduled Jobs Watched By A Cron Monitor","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#pattern-retries-timeouts-and-cancellation","title":"Pattern: Retries, Timeouts And Cancellation","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#pattern-a-job-that-fans-out-work","title":"Pattern: A Job That Fans Out Work","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#pattern-testing-a-handler","title":"Pattern: Testing A Handler","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#pattern-running-jobs-without-a-platform","title":"Pattern: Running Jobs Without A Platform","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#pattern-running-enqueued-jobs-from-a-command","title":"Pattern: Running Enqueued Jobs From A Command","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#pattern-writing-a-queue-adapter","title":"Pattern: Writing A Queue Adapter","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/cron","title":"@sdxc/cron","page":"@sdxc/cron","section":"Packages · Operations","summary":"Cron schedules with zone-aware occurrences and descriptors"},{"href":"/api/cron#installation","title":"Installation","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#usage","title":"Usage","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#parse-an-expression","title":"Parse an expression","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#compute-occurrences","title":"Compute occurrences","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#describe-it","title":"Describe it","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#ask-whether-a-run-is-late","title":"Ask whether a run is late","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#api","title":"API","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-parse-expression-string-result-schedule-invalidcronexpression","title":"Schedule.parse(expression: string): Result<Schedule, InvalidCronExpression>","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-next-options-date-date","title":"schedule.next(options): Date | Date[]","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-prev-options-occurrenceoptions-date","title":"schedule.prev(options: OccurrenceOptions): Date","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-matches-date-date-options-matchoptions-boolean","title":"schedule.matches(date: Date, options: MatchOptions): boolean","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-describe-scheduledescriptor","title":"schedule.describe(): ScheduleDescriptor","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-tostring-string","title":"schedule.toString(): string","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-expectedby-lastrun-date-options-expectedbyoptions-date","title":"schedule.expectedBy(lastRun: Date, options: ExpectedByOptions): Date","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-isdue-lastrun-date-options-isdueoptions-boolean","title":"schedule.isDue(lastRun: Date, options: IsDueOptions): boolean","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#unknown-time-zones","title":"Unknown time zones","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#invalidcronexpression","title":"InvalidCronExpression","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#expression-syntax","title":"Expression syntax","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#types","title":"Types","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#pattern-validating-a-submitted-expression","title":"Pattern: Validating A Submitted Expression","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#pattern-translating-a-descriptor","title":"Pattern: Translating A Descriptor","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#pattern-a-dead-man-s-switch","title":"Pattern: A Dead Man's Switch","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#pattern-runs-across-a-daylight-saving-change","title":"Pattern: Runs Across A Daylight Saving Change","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#pattern-restricting-both-day-fields","title":"Pattern: Restricting Both Day Fields","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#pattern-counting-runs-in-a-window","title":"Pattern: Counting Runs In A Window","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/backoff","title":"@sdxc/backoff","page":"@sdxc/backoff","section":"Packages · Operations","summary":"Retry delay schedules with exponential, linear, constant or stepped growth, a ceiling, free attempts and seedable jitter"},{"href":"/api/backoff#installation","title":"Installation","page":"@sdxc/backoff","section":"Packages · Operations"},{"href":"/api/backoff#usage","title":"Usage","page":"@sdxc/backoff","section":"Packages · Operations"},{"href":"/api/backoff#build-a-schedule","title":"Build a schedule","page":"@sdxc/backoff","section":"Packages · Operations"},{"href":"/api/backoff#pick-the-growth","title":"Pick the growth","page":"@sdxc/backoff","section":"Packages · Operations"},{"href":"/api/backoff#spread-retries-with-jitter","title":"Spread retries with jitter","page":"@sdxc/backoff","section":"Packages · Operations"},{"href":"/api/backoff#allow-free-attempts","title":"Allow free attempts","page":"@sdxc/backoff","section":"Packages · Operations"},{"href":"/api/backoff#api","title":"API","page":"@sdxc/backoff","section":"Packages · Operations"},{"href":"/api/backoff#createbackoff-options-backoffoptions-backoff","title":"createBackoff(options: BackoffOptions): Backoff","page":"@sdxc/backoff","section":"Packages · Operations"},{"href":"/api/backoff#backoff","title":"Backoff","page":"@sdxc/backoff","section":"Packages · Operations"},{"href":"/api/backoff#types","title":"Types","page":"@sdxc/backoff","section":"Packages · Operations"},{"href":"/api/backoff#pattern-retrying-a-queue-message","title":"Pattern: Retrying A Queue Message","page":"@sdxc/backoff","section":"Packages · Operations"},{"href":"/api/backoff#pattern-retrying-a-request-and-honoring-retry-after","title":"Pattern: Retrying A Request And Honoring Retry-After","page":"@sdxc/backoff","section":"Packages · Operations"},{"href":"/api/backoff#pattern-locking-out-repeated-sign-in-failures","title":"Pattern: Locking Out Repeated Sign-In Failures","page":"@sdxc/backoff","section":"Packages · Operations"},{"href":"/api/backoff#pattern-exact-delays-in-tests","title":"Pattern: Exact Delays In Tests","page":"@sdxc/backoff","section":"Packages · Operations"},{"href":"/api/logger","title":"@sdxc/logger","page":"@sdxc/logger","section":"Packages · Operations","summary":"One wide event per Worker invocation, attached at the router and the job dispatcher"},{"href":"/api/logger#installation","title":"Installation","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#usage","title":"Usage","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#configure-once-attach-at-the-router","title":"Configure once, attach at the router","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#record-what-the-work-learned","title":"Record what the work learned","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#enrich-from-anywhere-inside-the-invocation","title":"Enrich from anywhere inside the invocation","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#open-a-log-for-any-other-entry-point","title":"Open a log for any other entry point","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#api","title":"API","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#createlogger-options-logger-options-logger","title":"createLogger(options: Logger.Options): Logger","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#logger","title":"Logger","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#log","title":"Log","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#currentlog-log-undefined","title":"currentLog(): Log | undefined","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#log-logger-logger-from-sdxc-logger-middleware","title":"log(logger?: Logger) from @sdxc/logger/middleware","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#log-logger-logger-from-sdxc-logger-middleware-cli","title":"log(logger?: Logger) from @sdxc/logger/middleware/cli","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#currentlog-from-sdxc-logger-middleware","title":"CurrentLog from @sdxc/logger/middleware","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#types","title":"Types","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#pattern-shared-namespaces-from-middleware","title":"Pattern: Shared Namespaces From Middleware","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#pattern-logging-jobs-through-the-dispatcher","title":"Pattern: Logging Jobs Through the Dispatcher","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#pattern-logging-a-command-line","title":"Pattern: Logging a Command Line","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#pattern-a-durable-object-alarm","title":"Pattern: A Durable Object Alarm","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#pattern-sampling-one-kind","title":"Pattern: Sampling One Kind","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#pattern-asserting-on-records-in-a-test","title":"Pattern: Asserting on Records in a Test","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/trace-context","title":"@sdxc/trace-context","page":"@sdxc/trace-context","section":"Packages · Operations","summary":"W3C Trace Context, carried from each invocation to its jobs and requests"},{"href":"/api/trace-context#installation","title":"Installation","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#usage","title":"Usage","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#give-every-request-a-trace","title":"Give every request a trace","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#give-every-command-run-a-trace","title":"Give every command run a trace","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#propagate-it-to-outbound-requests","title":"Propagate it to outbound requests","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#bind-a-trace-outside-a-router","title":"Bind a trace outside a router","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#read-and-write-the-headers","title":"Read and write the headers","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#api","title":"API","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#sdxc-trace-context","title":"@sdxc/trace-context","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#sdxc-trace-context-middleware","title":"@sdxc/trace-context/middleware","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#sdxc-trace-context-middleware-cli","title":"@sdxc/trace-context/middleware/cli","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#sdxc-trace-context-traceparent","title":"@sdxc/trace-context/traceparent","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#sdxc-trace-context-tracestate","title":"@sdxc/trace-context/tracestate","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#types","title":"Types","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#pattern-join-a-callee-reached-over-rpc","title":"Pattern: Join A Callee Reached Over RPC","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#pattern-refuse-caller-chosen-traces-on-a-public-endpoint","title":"Pattern: Refuse Caller-Chosen Traces On A Public Endpoint","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#pattern-keep-vendor-state-from-a-third-party","title":"Pattern: Keep Vendor State From A Third Party","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#pattern-add-your-own-vendor-entry","title":"Pattern: Add Your Own Vendor Entry","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/rate-limit","title":"@sdxc/rate-limit","page":"@sdxc/rate-limit","section":"Packages · Operations","summary":"Adapter-based rate limiting with standard response headers"},{"href":"/api/rate-limit#installation","title":"Installation","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#usage","title":"Usage","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#count-an-attempt","title":"Count an attempt","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#limit-a-router","title":"Limit a router","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#key-anonymous-callers-by-address","title":"Key anonymous callers by address","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#answer-a-denial-yourself","title":"Answer a denial yourself","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#api","title":"API","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#adapter","title":"Adapter","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#adapters","title":"Adapters","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#ratelimit-options-middleware","title":"rateLimit(options): Middleware","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#ratelimitheaders-decision-window-string-string","title":"rateLimitHeaders(decision, window): [string, string][]","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#applyratelimitheaders-response-decision-window-response","title":"applyRateLimitHeaders(response, decision, window): Response","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#toomanyrequests-decision-window-body-init-response","title":"tooManyRequests(decision, window, body?, init?): Response","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#addresskey-address-string","title":"addressKey(address): string","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#ratelimiterror","title":"RateLimitError","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#types","title":"Types","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#pattern-one-limiter-per-protected-surface","title":"Pattern: One Limiter Per Protected Surface","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#pattern-weighted-costs-exemptions-and-an-html-denial","title":"Pattern: Weighted Costs, Exemptions And An HTML Denial","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#pattern-failing-closed","title":"Pattern: Failing Closed","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#pattern-a-sliding-window-in-sql","title":"Pattern: A Sliding Window In SQL","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#pattern-lifting-a-limit-after-success","title":"Pattern: Lifting A Limit After Success","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#pattern-testing-a-limited-route","title":"Pattern: Testing A Limited Route","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/flags","title":"@sdxc/flags","page":"@sdxc/flags","section":"Packages · Operations","summary":"Feature flag evaluation implementing the OpenFeature specification"},{"href":"/api/flags#installation","title":"Installation","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#usage","title":"Usage","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#evaluate-a-flag","title":"Evaluate a flag","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#declare-a-catalog","title":"Declare a catalog","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#install-into-a-fetch-router","title":"Install into a fetch router","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#install-into-a-job-dispatcher","title":"Install into a job dispatcher","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#api","title":"API","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#createflags-options-flagsoptions-flags","title":"createFlags(options?: FlagsOptions): Flags","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#flags","title":"Flags","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#client","title":"Client","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#wideeventhook-hook","title":"wideEventHook(): Hook","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#redacthook-fields-string-hook","title":"redactHook(fields: string[]): Hook","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#asynclocalstoragepropagator-transactioncontextpropagator","title":"asyncLocalStoragePropagator(): TransactionContextPropagator","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#defineflags-catalog-and-flag","title":"defineFlags(catalog) and flag","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#provider","title":"Provider","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#resolved-value-details-and-failed-defaultvalue-errorcode-errormessage","title":"resolved(value, details?) and failed(defaultValue, errorCode, errorMessage?)","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#providerevents","title":"ProviderEvents","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#providererror","title":"ProviderError","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#noopprovider","title":"NoopProvider","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#new-inmemoryprovider-flags-flagset","title":"new InMemoryProvider(flags?: FlagSet)","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#conformance-name-create-options-conformanceoptions-void","title":"conformance(name, create, options: ConformanceOptions): void","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#flags-from-middleware","title":"Flags from ./middleware","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#featureflags-flags-options-from-middleware-router-and-middleware-dispatcher","title":"featureFlags(flags, options?) from ./middleware/router and ./middleware/dispatcher","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#types","title":"Types","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#pattern-a-provider-against-a-flag-service","title":"Pattern: A Provider Against A Flag Service","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#pattern-pinning-flags-in-a-test","title":"Pattern: Pinning Flags In A Test","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#pattern-context-at-every-level","title":"Pattern: Context At Every Level","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#pattern-separate-providers-per-domain","title":"Pattern: Separate Providers Per Domain","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#pattern-reacting-to-provider-status","title":"Pattern: Reacting To Provider Status","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#pattern-redacted-context-and-wide-event-records","title":"Pattern: Redacted Context And Wide-Event Records","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags-engine","title":"@sdxc/flags-engine","page":"@sdxc/flags-engine","section":"Packages · Operations","summary":"Flag evaluation engine: typed targeting rules, percentage splits and pluggable stores"},{"href":"/api/flags-engine#installation","title":"Installation","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#usage","title":"Usage","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#resolve-a-flag-from-a-set-in-memory","title":"Resolve a flag from a set in memory","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#target-subjects-with-rules-and-segments","title":"Target subjects with rules and segments","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#roll-out-to-a-percentage","title":"Roll out to a percentage","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#serve-flags-through-sdxc-flags","title":"Serve flags through @sdxc/flags","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#api","title":"API","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#createengine-options-engineoptions-engine","title":"createEngine(options: EngineOptions): Engine","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#engine","title":"Engine","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#evaluate-snapshot-key-defaultvalue-context-resolutiondetails-t","title":"evaluate(snapshot, key, defaultValue, context?): ResolutionDetails<T>","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#evaluateall-snapshot-context-record-string-resolutiondetails-flagvalue","title":"evaluateAll(snapshot, context?): Record<string, ResolutionDetails<FlagValue>>","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#parseflagset-stored-storedflagset-flagsnapshot","title":"parseFlagSet(stored: StoredFlagSet): FlagSnapshot","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#reasons","title":"Reasons","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#conditions","title":"Conditions","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#flagconditions","title":"flagConditions","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#schemas","title":"Schemas","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#flagstoreerror","title":"FlagStoreError","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#new-inmemoryflagstore-set-storedflagset","title":"new InMemoryFlagStore(set?: StoredFlagSet)","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#new-workerkvflagstore-kv-kvnamespace-options-key-string","title":"new WorkerKVFlagStore(kv: KVNamespace, options?: { key?: string })","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#conformance-options-conformanceoptions-void","title":"conformance(options: ConformanceOptions): void","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#new-engineprovider-engine-engine","title":"new EngineProvider(engine: Engine)","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#types","title":"Types","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#pattern-reloading-on-a-schedule-you-own","title":"Pattern: Reloading On A Schedule You Own","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#pattern-logging-refused-definitions","title":"Pattern: Logging Refused Definitions","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#pattern-multivariate-flags-and-a-kill-switch","title":"Pattern: Multivariate Flags And A Kill Switch","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#pattern-publishing-edits-from-an-admin-endpoint","title":"Pattern: Publishing Edits From An Admin Endpoint","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#pattern-editing-conditions-as-text","title":"Pattern: Editing Conditions As Text","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#pattern-a-store-of-your-own","title":"Pattern: A Store Of Your Own","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/billing","title":"@sdxc/billing","page":"@sdxc/billing","section":"Packages · Operations","summary":"Vendor-neutral billing providers and a webhook endpoint that verifies deliveries"},{"href":"/api/billing#installation","title":"Installation","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#usage","title":"Usage","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#construct-a-provider","title":"Construct a provider","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#open-a-hosted-checkout","title":"Open a hosted checkout","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#publish-the-provider-on-the-router","title":"Publish the provider on the router","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#receive-webhooks","title":"Receive webhooks","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#api","title":"API","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#billing","title":"Billing","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#billingerror","title":"BillingError","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#supports-billing-capability-boolean","title":"supports(billing, capability): boolean","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#minorunitdigits-currency-currency-number","title":"minorUnitDigits(currency: Currency): number","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#default-page-size","title":"DEFAULT_PAGE_SIZE","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#billingwebhook","title":"BillingWebhook","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#webhookstore-and-memorywebhookstore","title":"WebhookStore and MemoryWebhookStore","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#billing-options-from-middleware","title":"billing(options) from ./middleware","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#billing-options-from-middleware-cli","title":"billing(options) from ./middleware/cli","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#requireentitlement-feature-options-from-middleware","title":"requireEntitlement(feature, options?) from ./middleware","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#readentitlements-context-from-middleware","title":"readEntitlements(context) from ./middleware","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#polarbilling-from-providers-polar","title":"PolarBilling from ./providers/polar","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#stripebilling-from-providers-stripe","title":"StripeBilling from ./providers/stripe","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#mercadopagobilling-from-providers-mercado-pago","title":"MercadoPagoBilling from ./providers/mercado-pago","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#memorybilling-from-providers-memory","title":"MemoryBilling from ./providers/memory","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#conformance","title":"./conformance","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#types","title":"Types","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#pattern-keeping-an-entitlement-projection-in-sync","title":"Pattern: Keeping An Entitlement Projection In Sync","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#pattern-gating-a-route-on-an-entitlement","title":"Pattern: Gating A Route On An Entitlement","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#pattern-discount-codes-and-the-billing-portal","title":"Pattern: Discount Codes And The Billing Portal","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#pattern-metered-usage-from-a-scheduled-job","title":"Pattern: Metered Usage From A Scheduled Job","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#pattern-a-provider-per-tenant","title":"Pattern: A Provider Per Tenant","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#pattern-testing-a-billing-flow","title":"Pattern: Testing A Billing Flow","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#pattern-writing-a-provider","title":"Pattern: Writing A Provider","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/attribution","title":"@sdxc/attribution","page":"@sdxc/attribution","section":"Packages · Operations","summary":"Campaign parameters, click identifiers and referrers, kept as a visitor's first and last touch"},{"href":"/api/attribution#installation","title":"Installation","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#usage","title":"Usage","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#read-a-touch-off-a-url","title":"Read a touch off a URL","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#keep-the-first-and-last-touch-for-every-visitor","title":"Keep the first and last touch for every visitor","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#strip-tracking-parameters-from-a-link","title":"Strip tracking parameters from a link","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#api","title":"API","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#readtouch-url-url-options-readtouchoptions-touch","title":"readTouch(url: URL, options: ReadTouchOptions): Touch","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#normalizevalue-raw-string-string-undefined","title":"normalizeValue(raw: string): string | undefined","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#classifyreferrer-header-string-null-options-classifyreferreroptions-referrer-null","title":"classifyReferrer(header: string | null, options?: ClassifyReferrerOptions): Referrer | null","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#tometadata-attribution-pick-attribution-first-last-record-string-string","title":"toMetadata(attribution: Pick<Attribution, \"first\" | \"last\">): Record<string, string>","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#toutmparams-touch-touch-null-record-string-string","title":"toUtmParams(touch: Touch | null): Record<string, string>","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#tocampaign-touch-touch-null-url-url-string-campaign-undefined","title":"toCampaign(touch: Touch | null, url: URL | string): Campaign | undefined","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#attribution-options-attributionoptions-middleware","title":"attribution(options: AttributionOptions): Middleware","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#currentattribution","title":"CurrentAttribution","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#campaign-parameters-click-identifiers","title":"CAMPAIGN_PARAMETERS, CLICK_IDENTIFIERS","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#istrackingparameter-name-string-boolean","title":"isTrackingParameter(name: string): boolean","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#withouttracking-url-url-url","title":"withoutTracking(url: URL): URL","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#types","title":"Types","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#pattern-carry-the-campaign-into-a-checkout","title":"Pattern: Carry the campaign into a checkout","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#pattern-hand-campaign-fields-to-a-newsletter-or-crm","title":"Pattern: Hand campaign fields to a newsletter or CRM","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#pattern-store-the-record-in-the-session","title":"Pattern: Store the record in the session","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#pattern-ask-for-consent-before-storing","title":"Pattern: Ask for consent before storing","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#pattern-keep-tracking-parameters-out-of-shared-urls","title":"Pattern: Keep tracking parameters out of shared URLs","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/attribution#pattern-offline-conversions-and-custom-sources","title":"Pattern: Offline conversions and custom sources","page":"@sdxc/attribution","section":"Packages · Operations"},{"href":"/api/mail","title":"@sdxc/mail","page":"@sdxc/mail","section":"Packages · Operations","summary":"Transport-agnostic transactional email with pluggable transports and remix/component rendering"},{"href":"/api/mail#installation","title":"Installation","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#usage","title":"Usage","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#send-a-message","title":"Send a message","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#author-an-email-as-a-class","title":"Author an email as a class","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#publish-a-mailer-on-the-request-context","title":"Publish a mailer on the request context","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#test-against-the-memory-transport","title":"Test against the memory transport","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#api","title":"API","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#new-mailer-options-maileroptions","title":"new Mailer(options: MailerOptions)","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#mailer-send-input-message-email-overrides-sendoptions-promise-result-sentmessage-mailerror","title":"mailer.send(input: Message | Email, overrides?: SendOptions): Promise<Result<SentMessage, MailError>>","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#mailer-later-input-message-email-overrides-sendoptions-void","title":"mailer.later(input: Message | Email, overrides?: SendOptions): void","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#mailer-flush-promise-result-sentmessage-mailerror","title":"mailer.flush(): Promise<Result<SentMessage, MailError>[]>","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#mailer-pending-number","title":"mailer.pending: number","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#render-element-remixelement-promise-renderedemail","title":"render(element: RemixElement): Promise<RenderedEmail>","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#buildmimemessage-message-normalizedmessage-string","title":"buildMimeMessage(message: NormalizedMessage): string","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#isemail-value-message-email-value-is-email","title":"isEmail(value: Message | Email): value is Email","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#formataddress-address-address-string","title":"formatAddress(address: Address): string","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#toaddresslist-value-address-address-undefined-address","title":"toAddressList(value: Address | Address[] | undefined): Address[]","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#htmltotext-html-string-string","title":"htmlToText(html: string): string","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#mailerror","title":"MailError","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#email-layout-kit","title":"Email layout kit","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#types","title":"Types","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#sdxc-mail-markdown","title":"@sdxc/mail/markdown","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#sdxc-mail-memory","title":"@sdxc/mail/memory","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#sdxc-mail-print","title":"@sdxc/mail/print","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#sdxc-mail-cloudflare","title":"@sdxc/mail/cloudflare","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#sdxc-mail-middleware","title":"@sdxc/mail/middleware","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#sdxc-mail-middleware-cli","title":"@sdxc/mail/middleware/cli","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#sdxc-mail-unsubscribe","title":"@sdxc/mail/unsubscribe","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#pattern-choosing-between-send-and-later","title":"Pattern: Choosing Between send() And later()","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#pattern-one-click-unsubscribe-for-bulk-mail","title":"Pattern: One-Click Unsubscribe For Bulk Mail","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#pattern-calendar-invitations","title":"Pattern: Calendar Invitations","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#pattern-rendering-markdown-as-a-body","title":"Pattern: Rendering Markdown As A Body","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#pattern-brand-fonts-and-dark-mode","title":"Pattern: Brand Fonts And Dark Mode","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#pattern-a-transport-for-another-provider","title":"Pattern: A Transport For Another Provider","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/messaging","title":"@sdxc/messaging","page":"@sdxc/messaging","section":"Packages · Operations","summary":"Send one portable message to Slack, Discord, Teams, Google Chat, Telegram, WhatsApp, ntfy, Pushover, PagerDuty, Opsgenie, browser push or a signed webhook"},{"href":"/api/messaging#installation","title":"Installation","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#usage","title":"Usage","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#send-a-message","title":"Send a message","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#build-a-destination-from-stored-configuration","title":"Build a destination from stored configuration","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#validate-a-pasted-url","title":"Validate a pasted URL","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#edit-or-thread-under-the-original-message","title":"Edit or thread under the original message","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#api","title":"API","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#message","title":"Message","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#message-schema","title":"MESSAGE_SCHEMA","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#destination","title":"Destination","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#supports-destination-capability","title":"supports(destination, capability)","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#messagingerror","title":"MessagingError","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#writetext-markdown-dialect-maxlength-and-fittext-text-maxlength-escape","title":"writeText(markdown, dialect, maxLength?) and fitText(text, maxLength, escape?)","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#severity-colors","title":"SEVERITY_COLORS","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#providers","title":"Providers","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#memorydestination","title":"MemoryDestination","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#describedestination-options","title":"describeDestination(options)","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#types","title":"Types","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#pattern-retrying-from-a-job","title":"Pattern: Retrying From A Job","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#pattern-opening-and-resolving-an-incident","title":"Pattern: Opening And Resolving An Incident","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#pattern-notifying-a-browser","title":"Pattern: Notifying A Browser","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#pattern-sending-a-whatsapp-template","title":"Pattern: Sending A WhatsApp Template","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#pattern-changing-a-platform-s-layout","title":"Pattern: Changing A Platform's Layout","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#pattern-a-webhook-with-its-own-signature","title":"Pattern: A Webhook With Its Own Signature","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/messaging#pattern-testing-code-that-sends","title":"Pattern: Testing Code That Sends","page":"@sdxc/messaging","section":"Packages · Operations"},{"href":"/api/web-push","title":"@sdxc/web-push","page":"@sdxc/web-push","section":"Packages · Operations","summary":"Web Push from Workers: RFC 8291 encryption, VAPID signing, subscription checks and a browser subscribe helper"},{"href":"/api/web-push#installation","title":"Installation","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#usage","title":"Usage","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#generate-a-key-pair","title":"Generate a key pair","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#subscribe-in-the-browser","title":"Subscribe in the browser","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#accept-the-subscription","title":"Accept the subscription","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#send-a-message","title":"Send a message","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#api","title":"API","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#new-webpush-options-webpushoptions","title":"new WebPush(options: WebPushOptions)","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#push-send-subscription-payload-options-promise-result-pushed-webpusherror","title":"push.send(subscription, payload?, options?): Promise<Result<Pushed, WebPushError>>","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#push-request-subscription-payload-options-promise-result-request-webpusherror","title":"push.request(subscription, payload?, options?): Promise<Result<Request, WebPushError>>","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#webpush-generatekeys-promise-vapidkeypair","title":"WebPush.generateKeys(): Promise<VapidKeyPair>","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#subscriptionschema-policy-subscriptionpolicy-and-subscription-schema","title":"subscriptionSchema(policy?: SubscriptionPolicy) and SUBSCRIPTION_SCHEMA","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#push-service-hosts","title":"PUSH_SERVICE_HOSTS","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#max-payload-bytes","title":"MAX_PAYLOAD_BYTES","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#webpusherror","title":"WebPushError","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#issupported-boolean-from-browser","title":"isSupported(): boolean from ./browser","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#subscribe-options-subscribeoptions-promise-result-browsersubscription-webpushbrowsererror-from-browser","title":"subscribe(options: SubscribeOptions): Promise<Result<BrowserSubscription, WebPushBrowserError>> from ./browser","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#webpushbrowsererror-from-browser","title":"WebPushBrowserError from ./browser","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#types","title":"Types","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#pattern-applying-a-failure-to-the-stored-row","title":"Pattern: Applying A Failure To The Stored Row","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#pattern-fanning-out-to-many-devices","title":"Pattern: Fanning Out To Many Devices","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#pattern-accepting-only-known-push-services","title":"Pattern: Accepting Only Known Push Services","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#pattern-rotating-the-vapid-key","title":"Pattern: Rotating The VAPID Key","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#pattern-sending-through-your-own-transport","title":"Pattern: Sending Through Your Own Transport","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/web-push#pattern-a-service-worker-for-a-json-payload","title":"Pattern: A Service Worker For A JSON Payload","page":"@sdxc/web-push","section":"Packages · Operations"},{"href":"/api/hostname","title":"@sdxc/hostname","page":"@sdxc/hostname","section":"Packages · Operations","summary":"Cloudflare for SaaS custom-hostname client: register, poll and delete customer domains"},{"href":"/api/hostname#installation","title":"Installation","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#usage","title":"Usage","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#create-a-client","title":"Create a client","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#register-a-domain-and-show-the-txt-record","title":"Register a domain and show the TXT record","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#poll-until-it-goes-live","title":"Poll until it goes live","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#handle-a-failed-call","title":"Handle a failed call","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#api","title":"API","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#new-hostnameclient-options-hostnameclientoptions","title":"new HostnameClient(options: HostnameClientOptions)","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#client-create-hostname-string-entityid-string-region-string-promise-hostnameresult","title":"client.create(hostname: string, entityId: string, region?: string): Promise<HostnameResult>","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#client-status-id-string-promise-hostnameresult","title":"client.status(id: string): Promise<HostnameResult>","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#client-getbyname-hostname-string-promise-hostnameresult-null","title":"client.getByName(hostname: string): Promise<HostnameResult | null>","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#client-listbyentity-entityid-string-promise-hostnameresult","title":"client.listByEntity(entityId: string): Promise<HostnameResult[]>","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#client-delete-id-string-promise-void","title":"client.delete(id: string): Promise<void>","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#client-refresh-id-string-promise-hostnameresult","title":"client.refresh(id: string): Promise<HostnameResult>","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#client-createdefaultsubdomain-slug-string-string","title":"client.createDefaultSubdomain(slug: string): string","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#hostnameclient-isactive-result-hostnameresult-boolean","title":"HostnameClient.isActive(result: HostnameResult): boolean","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#hostnameclient-ispendingvalidation-result-hostnameresult-boolean","title":"HostnameClient.isPendingValidation(result: HostnameResult): boolean","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#hostnameclient-getvalidationtxtrecord-result-hostnameresult-name-string-value-string-null","title":"HostnameClient.getValidationTxtRecord(result: HostnameResult): { name: string; value: string } | null","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#hostnameclient-getstatusmessage-result-hostnameresult-string","title":"HostnameClient.getStatusMessage(result: HostnameResult): string","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#hostnameapierror","title":"HostnameApiError","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#types","title":"Types","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#pattern-walking-a-customer-through-setup","title":"Pattern: Walking A Customer Through Setup","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#pattern-connecting-a-domain-once","title":"Pattern: Connecting A Domain Once","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#pattern-default-subdomain-or-custom-domain","title":"Pattern: Default Subdomain Or Custom Domain","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#pattern-removing-an-account-s-domains","title":"Pattern: Removing An Account's Domains","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/doh","title":"@sdxc/doh","page":"@sdxc/doh","section":"Packages · Operations","summary":"Typed DNS over HTTPS lookups"},{"href":"/api/doh#installation","title":"Installation","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#usage","title":"Usage","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#look-up-records","title":"Look up records","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#tell-failures-apart","title":"Tell failures apart","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#verify-domain-ownership","title":"Verify domain ownership","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#check-whether-a-ca-may-issue","title":"Check whether a CA may issue","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#api","title":"API","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#resolve-name-type-options-promise-result-doh-answer-type-doherror","title":"resolve(name, type, options?): Promise<Result<DoH.Answer<Type>, DoHError>>","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#verifytxtrecord-name-expected-options-promise-result-boolean-doherror","title":"verifyTxtRecord(name, expected, options?): Promise<Result<boolean, DoHError>>","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#checkcname-name-target-options-promise-result-boolean-doherror","title":"checkCname(name, target, options?): Promise<Result<boolean, DoHError>>","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#cloudflare-google","title":"CLOUDFLARE / GOOGLE","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#errors","title":"Errors","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#parsecaaproperty-record-caa-property-from-caa","title":"parseCaaProperty(record): CAA.Property from ./caa","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#findrelevantcaa-domain-options-promise-result-caa-relevantset-doherror-from-caa","title":"findRelevantCaa(domain, options?): Promise<Result<CAA.RelevantSet, DoHError>> from ./caa","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#evaluatecaa-records-request-caa-decision-from-caa","title":"evaluateCaa(records, request): CAA.Decision from ./caa","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#mayissue-request-options-promise-caa-verdict-from-caa","title":"mayIssue(request, options?): Promise<CAA.Verdict> from ./caa","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#types","title":"Types","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#pattern-cache-answers-and-absences-by-ttl","title":"Pattern: Cache Answers And Absences By TTL","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#pattern-confirm-a-failure-with-a-second-resolver","title":"Pattern: Confirm A Failure With A Second Resolver","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#pattern-a-custom-domain-onboarding-check","title":"Pattern: A Custom Domain Onboarding Check","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#pattern-compare-a-zone-file-with-dns","title":"Pattern: Compare A Zone File With DNS","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#pattern-decide-a-caa-policy-before-publishing-it","title":"Pattern: Decide A CAA Policy Before Publishing It","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#pattern-explain-a-caa-refusal","title":"Pattern: Explain A CAA Refusal","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/zone-file","title":"@sdxc/zone-file","page":"@sdxc/zone-file","section":"Packages · Operations","summary":"Read and write RFC 1035 DNS zone files, with the record data codec for every typed record"},{"href":"/api/zone-file#installation","title":"Installation","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#usage","title":"Usage","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#read-a-zone-file","title":"Read a zone file","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#check-what-it-could-not-read","title":"Check what it could not read","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#write-a-zone-file","title":"Write a zone file","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#read-and-print-record-data-on-its-own","title":"Read and print record data on its own","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#api","title":"API","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#parse-text-string-options-parseoptions-result-zone-zonefileerror","title":"parse(text: string, options: ParseOptions): Result<Zone, ZoneFileError>","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#stringify-zone-zoneinput-options-stringifyoptions-string","title":"stringify(zone: ZoneInput, options?: StringifyOptions): string","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#parserecorddata-type-extends-recordtype-type-type-data-string-result-recorddata-type-recorddataerror","title":"parseRecordData<Type extends RecordType>(type: Type, data: string): Result<RecordData<Type>, RecordDataError>","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#formatrecorddata-data-recorddata-recordtype-string","title":"formatRecordData(data: RecordData<RecordType>): string","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#canonicaltype-type-string-string","title":"canonicalType(type: string): string","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#typename-code-number-string","title":"typeName(code: number): string","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#zonefileerror","title":"ZoneFileError","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#recorddataerror","title":"RecordDataError","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#types","title":"Types","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#pattern-import-only-the-records-you-track","title":"Pattern: Import Only The Records You Track","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#pattern-normalize-a-zone-file-for-review","title":"Pattern: Normalize A Zone File For Review","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#pattern-refuse-a-file-with-any-bad-line","title":"Pattern: Refuse A File With Any Bad Line","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#pattern-read-a-zone-with-includes","title":"Pattern: Read A Zone With Includes","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/zone-file#pattern-compare-a-zone-file-with-live-dns","title":"Pattern: Compare A Zone File With Live DNS","page":"@sdxc/zone-file","section":"Packages · Operations"},{"href":"/api/rdap","title":"@sdxc/rdap","page":"@sdxc/rdap","section":"Packages · Operations","summary":"Domain registration data over RDAP: expiry, status, registrar and nameservers from the registry"},{"href":"/api/rdap#installation","title":"Installation","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#usage","title":"Usage","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#create-a-client","title":"Create a client","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#look-up-a-domain","title":"Look up a domain","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#handle-failures","title":"Handle failures","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#ask-the-registrar-too","title":"Ask the registrar too","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#api","title":"API","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#new-rdap-options-rdap-options","title":"new RDAP(options: RDAP.Options)","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#rdap-domain-name-string-options-rdap-lookupoptions-promise-result-rdap-domain-rdaperror","title":"rdap.domain(name: string, options?: RDAP.LookupOptions): Promise<Result<RDAP.Domain, RDAPError>>","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#rdap-server-name-string-promise-result-url-null-rdaperror","title":"rdap.server(name: string): Promise<Result<URL | null, RDAPError>>","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#rdaperror","title":"RDAPError","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#epp-statuses","title":"EPP_STATUSES","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#types","title":"Types","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#pattern-a-client-in-a-cloudflare-worker","title":"Pattern: A Client In A Cloudflare Worker","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#pattern-a-registry-the-bootstrap-file-does-not-list","title":"Pattern: A Registry The Bootstrap File Does Not List","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#pattern-a-daily-expiry-check-paced-per-registry","title":"Pattern: A Daily Expiry Check Paced Per Registry","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#pattern-honoring-retry-after-from-a-queue","title":"Pattern: Honoring Retry-After From A Queue","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/rdap#pattern-alerting-on-statuses-that-stop-resolution","title":"Pattern: Alerting On Statuses That Stop Resolution","page":"@sdxc/rdap","section":"Packages · Operations"},{"href":"/api/mcp","title":"@sdxc/mcp","page":"@sdxc/mcp","section":"Packages · Operations","summary":"Model Context Protocol servers as remix/router actions over Streamable HTTP"},{"href":"/api/mcp#installation","title":"Installation","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#usage","title":"Usage","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#declare-a-tool","title":"Declare a tool","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#handle-it-and-serve-requests","title":"Handle it and serve requests","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#expose-a-resource","title":"Expose a resource","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#api","title":"API","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#createhandler-options-handleroptions-mcphandler","title":"createHandler(options: HandlerOptions): McpHandler","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#mcp-tools-map-tool-tool-action-actionorhandler-lazy-actionorhandler-void","title":"mcp.tools.map(tool: Tool, action: ActionOrHandler | Lazy<ActionOrHandler>): void","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#mcp-tools-map-group-toolgroup-controller-controller-lazy-controller-void","title":"mcp.tools.map(group: ToolGroup, controller: Controller | Lazy<Controller>): void","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#mcp-resources-map-resource-resource-action-resourceaction-lazy-resourceaction-void","title":"mcp.resources.map(resource: Resource, action: ResourceAction | Lazy<ResourceAction>): void","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#mcp-fetch-input-request-requestcontext-promise-response","title":"mcp.fetch(input: Request | RequestContext): Promise<Response>","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#tool-name-string-definition-tooldefinition-tool","title":"tool(name: string, definition: ToolDefinition): Tool","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#tools-group-toolgroup-toolgroup","title":"tools(group: ToolGroup): ToolGroup","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#walk-group-toolgroup-generator-tool","title":"walk(group: ToolGroup): Generator<Tool>","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#createtool-tool-action-and-createtoolcontroller-group-controller","title":"createTool(tool, action) and createToolController(group, controller)","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#resource-pattern-string-declaration-resourcedeclaration-resource","title":"resource(pattern: string, declaration: ResourceDeclaration): Resource","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#resource-href-variables-string","title":"resource.href(variables): string","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#resources-group-resourcegroup-resourcegroup","title":"resources(group: ResourceGroup): ResourceGroup","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#walkresources-group-resourcegroup-generator-resource","title":"walkResources(group: ResourceGroup): Generator<Resource>","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#createresource-resource-action","title":"createResource(resource, action)","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#lazy-load-promise-default-target-lazy-target","title":"lazy(load: () => Promise<{ default: Target }>): Lazy<Target>","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#validatearguments-tool-tool-value-unknown-result-input-invalidargumentserror","title":"validateArguments(tool: Tool, value: unknown): Result<Input, InvalidArgumentsError>","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#contextfor-input-request-requestcontext-requestcontext","title":"contextFor(input: Request | RequestContext): RequestContext","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#errors","title":"Errors","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#protocol-constants","title":"Protocol constants","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#context-keys","title":"Context keys","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#types","title":"Types","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#pattern-mounting-on-a-router-with-its-middleware","title":"Pattern: Mounting On A Router With Its Middleware","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#pattern-grouping-tools-under-one-controller","title":"Pattern: Grouping Tools Under One Controller","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#pattern-one-file-per-handler-imported-on-first-use","title":"Pattern: One File Per Handler, Imported On First Use","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#pattern-hiding-a-tool-from-a-caller","title":"Pattern: Hiding A Tool From A Caller","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#pattern-metering-and-guarding-calls-with-tool-middleware","title":"Pattern: Metering And Guarding Calls With Tool Middleware","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#pattern-structured-results-and-unexpected-failures","title":"Pattern: Structured Results And Unexpected Failures","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#pattern-resources-under-a-scheme-of-your-own","title":"Pattern: Resources Under A Scheme Of Your Own","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/cli","title":"@sdxc/cli","page":"@sdxc/cli","section":"Packages · Operations","summary":"Build command-line tools with generated help, prompts bound to flags, tasks and a test harness"},{"href":"/api/cli#installation","title":"Installation","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#usage","title":"Usage","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#a-command-with-an-argument-and-a-flag","title":"A command with an argument and a flag","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#ask-for-what-the-command-line-left-out","title":"Ask for what the command line left out","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#show-progress-while-work-runs","title":"Show progress while work runs","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#test-a-command","title":"Test a command","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#api","title":"API","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#declaring-commands","title":"Declaring commands","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#running-commands","title":"Running commands","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#the-handler-s-context","title":"The handler's context","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#results","title":"Results","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#testing","title":"Testing","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#other-exports","title":"Other exports","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#patterns","title":"Patterns","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#pattern-publish-a-database-to-every-command","title":"Pattern: Publish a database to every command","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#pattern-one-module-per-command","title":"Pattern: One module per command","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cli#pattern-test-prompts-and-child-processes-together","title":"Pattern: Test prompts and child processes together","page":"@sdxc/cli","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing","title":"@sdxc/cloudflare-pricing","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations","summary":"Cloudflare Developer Platform list prices, one module per service"},{"href":"/api/cloudflare-pricing#installation","title":"Installation","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#usage","title":"Usage","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#price-a-measured-quantity","title":"Price a measured quantity","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#price-a-day-of-storage","title":"Price a day of storage","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#read-what-a-plan-includes","title":"Read what a plan includes","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#price-quantities-with-a-rate-card","title":"Price quantities with a rate card","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#api","title":"API","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#centsperunit-meter-meter-number","title":"centsPerUnit(meter: Meter): number","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#centspergbday-meter-meter-gb-month-number","title":"centsPerGbDay(meter: Meter<\"GB-month\">): number","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#days-per-billing-month","title":"DAYS_PER_BILLING_MONTH","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#defineratecard-rates-record-r-number-ratecard-r","title":"defineRateCard(rates: Record<R, number>): RateCard<R>","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#service-entry-points","title":"Service entry points","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#types","title":"Types","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#pattern-a-rate-card-for-a-cost-ledger","title":"Pattern: A Rate Card For A Cost Ledger","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#pattern-estimating-a-monthly-bill","title":"Pattern: Estimating A Monthly Bill","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#pattern-checking-usage-against-the-free-plan","title":"Pattern: Checking Usage Against The Free Plan","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#pattern-metering-durable-object-time-in-milliseconds","title":"Pattern: Metering Durable Object Time In Milliseconds","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#pattern-metering-analytics-engine-before-it-bills","title":"Pattern: Metering Analytics Engine Before It Bills","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#pattern-comparing-r2-storage-classes","title":"Pattern: Comparing R2 Storage Classes","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/result","title":"@sdxc/result","page":"@sdxc/result","section":"Packages · Language & values","summary":"Result type for error handling"},{"href":"/api/result#installation","title":"Installation","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#usage","title":"Usage","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#return-a-result","title":"Return a Result","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#read-it","title":"Read it","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#wrap-code-that-throws","title":"Wrap code that throws","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#retry-a-failing-operation","title":"Retry a failing operation","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#api","title":"API","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#success-t-data-t-success-t","title":"success<T>(data: T): Success<T>","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#failure-e-extends-error-error-e-failure-e","title":"failure<E extends Error>(error: E): Failure<E>","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#issuccess-result-result-is-success-t-and-isfailure-result-result-is-failure-e","title":"isSuccess(result): result is Success<T> and isFailure(result): result is Failure<E>","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#succeeded-result-message-asserts-result-is-success-t","title":"succeeded(result, message?): asserts result is Success<T>","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#failed-result-message-asserts-result-is-failure-e","title":"failed(result, message?): asserts result is Failure<E>","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#unwrap-result-fallback-error-e-t-t","title":"unwrap(result, fallback?: (error: E) => T): T","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#match-result-success-failure-r","title":"match(result, { success, failure }): R","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#wrap-t-fn-t-wrap-returntype-t","title":"wrap<T>(fn: () => T): wrap.ReturnType<T>","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#retry-t-e-fn-promise-result-t-e-options-retry-options-e-promise-result-t-e-retryerror","title":"retry<T, E>(fn: () => Promise<Result<T, E>>, options: retry.Options<E>): Promise<Result<T, E | RetryError>>","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#partition-t-e-results-result-t-e-t-e","title":"partition<T, E>(results: Result<T, E>[]): [T[], E[]]","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#retryerror","title":"RetryError","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#types","title":"Types","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#pattern-chain-steps-that-can-fail","title":"Pattern: Chain steps that can fail","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#pattern-map-error-types-to-responses","title":"Pattern: Map error types to responses","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#pattern-retry-only-transient-failures-with-a-custom-schedule","title":"Pattern: Retry only transient failures with a custom schedule","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#pattern-process-a-batch-and-report-what-failed","title":"Pattern: Process a batch and report what failed","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#pattern-assert-outcomes-in-tests","title":"Pattern: Assert outcomes in tests","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/types","title":"@sdxc/types","page":"@sdxc/types","section":"Packages · Language & values","summary":"Shared TypeScript types"},{"href":"/api/types#installation","title":"Installation","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#usage","title":"Usage","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#name-what-an-async-function-resolves-to","title":"Name what an async function resolves to","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#accept-only-values-that-survive-json","title":"Accept only values that survive JSON","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#accept-anything-json-stringify-can-write","title":"Accept anything JSON.stringify can write","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#type-what-comes-back","title":"Type what comes back","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#api","title":"API","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#resolvedtype-t-extends-args-any-promise-any","title":"ResolvedType<T extends (...args: any) => Promise<any>>","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#jsonprimitive","title":"JSONPrimitive","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#jsonvalue","title":"JSONValue","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#jsonserializable","title":"JSONSerializable","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#jsonserialized-t","title":"JSONSerialized<T>","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#isany-t","title":"IsAny<T>","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#pattern-typing-a-consumer-from-its-data-function","title":"Pattern: Typing a consumer from its data function","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#pattern-a-typed-queue-across-a-json-boundary","title":"Pattern: A typed queue across a JSON boundary","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#pattern-a-cache-that-only-stores-round-trippable-values","title":"Pattern: A cache that only stores round-trippable values","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#pattern-filters-over-scalar-fields","title":"Pattern: Filters over scalar fields","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#pattern-turning-any-into-unknown","title":"Pattern: Turning any into unknown","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/dates","title":"@sdxc/dates","page":"@sdxc/dates","section":"Packages · Language & values","summary":"Zone-aware date operations with Intl-only formatting"},{"href":"/api/dates#installation","title":"Installation","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#usage","title":"Usage","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#format-for-a-reader","title":"Format for a reader","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#ask-a-calendar-question-in-a-zone","title":"Ask a calendar question in a zone","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#move-an-instant-by-a-length-of-time","title":"Move an instant by a length of time","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#read-untrusted-input","title":"Read untrusted input","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#api","title":"API","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#formatting","title":"Formatting","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#calendar-operations","title":"Calendar operations","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#instant-arithmetic","title":"Instant arithmetic","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#day-grids","title":"Day grids","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#day-keys-and-parsing","title":"Day keys and parsing","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#day-ranges","title":"Day ranges","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#time-zones","title":"Time zones","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#errors","title":"Errors","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#sdxc-dates-zone","title":"@sdxc/dates/zone","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#types","title":"Types","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#pattern-activity-per-day-over-a-week-grid","title":"Pattern: Activity Per Day Over A Week Grid","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#pattern-a-month-calendar","title":"Pattern: A Month Calendar","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#pattern-querying-one-day-s-rows","title":"Pattern: Querying One Day's Rows","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#pattern-a-datetime-local-field-in-the-reader-s-zone","title":"Pattern: A datetime-local Field In The Reader's Zone","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#pattern-a-report-range-from-the-query-string","title":"Pattern: A Report Range From The Query String","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#pattern-a-time-zone-picker","title":"Pattern: A Time-Zone Picker","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#pattern-a-stacked-date-badge","title":"Pattern: A Stacked Date Badge","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#pattern-wall-clocks-in-a-calendar-feed","title":"Pattern: Wall Clocks In A Calendar Feed","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/duration","title":"@sdxc/duration","page":"@sdxc/duration","section":"Packages · Language & values","summary":"Typed duration strings converted to milliseconds or seconds"},{"href":"/api/duration#installation","title":"Installation","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#usage","title":"Usage","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#convert-a-duration","title":"Convert a duration","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#accept-a-duration-in-your-own-api","title":"Accept a duration in your own API","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#parse-text-that-arrives-at-runtime","title":"Parse text that arrives at runtime","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#api","title":"API","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#toms-input-durationinput-number","title":"toMs(input: DurationInput): number","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#toseconds-input-durationinput-number","title":"toSeconds(input: DurationInput): number","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#parse-text-string-result-number-invaliddurationerror","title":"parse(text: string): Result<number, InvalidDurationError>","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#invaliddurationerror","title":"InvalidDurationError","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#types","title":"Types","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#pattern-one-value-several-units","title":"Pattern: One Value, Several Units","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#pattern-validate-configuration-at-startup","title":"Pattern: Validate Configuration at Startup","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#pattern-strings-in-code-numbers-in-storage","title":"Pattern: Strings in Code, Numbers in Storage","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/strings","title":"@sdxc/strings","page":"@sdxc/strings","section":"Packages · Language & values","summary":"English inflection, Chicago title case, slugs and grapheme-safe text"},{"href":"/api/strings#installation","title":"Installation","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#usage","title":"Usage","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#inflect-english-words-and-identifiers","title":"Inflect English words and identifiers","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#title-case-headings-and-build-slugs","title":"Title-case headings and build slugs","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#cut-and-measure-text-in-graphemes","title":"Cut and measure text in graphemes","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#add-your-own-vocabulary","title":"Add your own vocabulary","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#api","title":"API","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#pluralize-word-string-count-number-string","title":"pluralize(word: string, count?: number): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#singularize-word-string-string","title":"singularize(word: string): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#camelize-value-string-options-camelizeoptions-string","title":"camelize(value: string, options?: CamelizeOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#underscore-value-string-string","title":"underscore(value: string): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#dasherize-value-string-string","title":"dasherize(value: string): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#humanize-value-string-options-humanizeoptions-string","title":"humanize(value: string, options?: HumanizeOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#ordinalize-value-number-string","title":"ordinalize(value: number): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#createinflector-options-inflectoroptions-inflector","title":"createInflector(options?: InflectorOptions): Inflector","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#titleize-value-string-options-titleizeoptions-string","title":"titleize(value: string, options?: TitleizeOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#createtitleizer-options-titleizeoptions-titleizer","title":"createTitleizer(options?: TitleizeOptions): Titleizer","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#sentencecase-value-string-options-sentencecaseoptions-string","title":"sentenceCase(value: string, options?: SentenceCaseOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#slugify-value-string-options-slugifyoptions-string","title":"slugify(value: string, options?: SlugifyOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#truncate-text-string-options-truncateoptions-string","title":"truncate(text: string, options: TruncateOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#excerpt-text-string-options-excerptoptions-string","title":"excerpt(text: string, options: ExcerptOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#wordcount-text-string-options-localeoptions-number","title":"wordCount(text: string, options?: LocaleOptions): number","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#initials-name-string-options-initialsoptions-string","title":"initials(name: string, options?: InitialsOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#capitalize-value-string-options-localeoptions-string","title":"capitalize(value: string, options?: LocaleOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#types","title":"Types","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#pattern-stable-identifiers-from-class-names","title":"Pattern: Stable Identifiers From Class Names","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#pattern-one-slug-for-forms-and-jobs","title":"Pattern: One Slug For Forms And Jobs","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#pattern-labels-from-counts-and-field-names","title":"Pattern: Labels From Counts And Field Names","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#pattern-an-excerpt-and-reading-time-from-markdown","title":"Pattern: An Excerpt And Reading Time From Markdown","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#pattern-a-product-s-published-vocabulary","title":"Pattern: A Product's Published Vocabulary","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#pattern-avatars-and-previews-in-any-script","title":"Pattern: Avatars And Previews In Any Script","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/semver","title":"@sdxc/semver","page":"@sdxc/semver","section":"Packages · Language & values","summary":"SemVer 2.0.0 parsing, precedence ordering and range-free version comparisons"},{"href":"/api/semver#installation","title":"Installation","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#usage","title":"Usage","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#compare-two-versions","title":"Compare two versions","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#sort-a-list-of-versions","title":"Sort a list of versions","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#read-a-version-s-elements","title":"Read a version's elements","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#api","title":"API","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#parse-text-string-result-semver-invalidsemvererror","title":"parse(text: string): Result<SemVer, InvalidSemVerError>","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#compare-a-string-b-string-number","title":"compare(a: string, b: string): number","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#satisfies-value-string-comparison-semvercomparison-against-string-boolean","title":"satisfies(value: string, comparison: SemVerComparison, against: string): boolean","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#invalidsemvererror","title":"InvalidSemVerError","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#precedence","title":"Precedence","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#types","title":"Types","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#pattern-gating-a-feature-on-a-client-version","title":"Pattern: Gating A Feature On A Client Version","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#pattern-picking-the-newest-stable-version","title":"Pattern: Picking The Newest Stable Version","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#pattern-checking-whether-an-upgrade-is-compatible","title":"Pattern: Checking Whether An Upgrade Is Compatible","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#pattern-reporting-invalid-entries","title":"Pattern: Reporting Invalid Entries","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/location","title":"@sdxc/location","page":"@sdxc/location","section":"Packages · Language & values","summary":"URL-like Location class for URL paths without an origin"},{"href":"/api/location#installation","title":"Installation","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#usage","title":"Usage","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#build-a-path","title":"Build a path","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#parse-a-url-down-to-its-path","title":"Parse a URL down to its path","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#validate-an-untrusted-redirect-target","title":"Validate an untrusted redirect target","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#api","title":"API","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#new-location-input-url-location-location-options","title":"new Location(input: URL | Location | Location.Options)","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#location-pathname-location-search-location-searchparams-location-hash","title":"location.pathname, location.search, location.searchParams, location.hash","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#location-tostring-string-location-tojson-string","title":"location.toString(): string / location.toJSON(): string","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#location-from-input-string-url-location-location","title":"Location.from(input: string | URL | Location): Location","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#location-safe-input-options-location-safeoptions-location","title":"Location.safe(input, options: Location.SafeOptions): Location","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#location-issafe-input-unknown-options-location-originoptions-boolean","title":"Location.isSafe(input: unknown, options?: Location.OriginOptions): boolean","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#location-canparse-input-unknown-boolean","title":"Location.canParse(input: unknown): boolean","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#types","title":"Types","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#pattern-round-trip-a-sign-in-return-target","title":"Pattern: Round-Trip A Sign-In Return Target","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#pattern-rewrite-one-query-param-and-keep-the-rest","title":"Pattern: Rewrite One Query Param And Keep The Rest","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#pattern-send-a-form-back-where-it-came-from","title":"Pattern: Send A Form Back Where It Came From","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#pattern-reject-an-unsafe-target-instead-of-replacing-it","title":"Pattern: Reject An Unsafe Target Instead Of Replacing It","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/validate","title":"@sdxc/validate","page":"@sdxc/validate","section":"Packages · Language & values","summary":"Standard Schema validation utilities"},{"href":"/api/validate#installation","title":"Installation","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#usage","title":"Usage","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#validate-a-plain-object","title":"Validate a plain object","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#validate-a-form-submission","title":"Validate a form submission","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#validate-a-request","title":"Validate a request","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#read-the-failure","title":"Read the failure","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#api","title":"API","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#validate-schema-input-schema-promise-result-standardschemav1-inferoutput-schema-validationerror","title":"validate<Schema>(input, schema): Promise<Result<StandardSchemaV1.InferOutput<Schema>, ValidationError>>","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#validationerror","title":"ValidationError","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#pattern-one-schema-behind-every-entry-point","title":"Pattern: One Schema Behind Every Entry Point","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#pattern-normalizing-while-validating","title":"Pattern: Normalizing While Validating","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#pattern-uploads-with-a-form-data-schema","title":"Pattern: Uploads With a Form-Data Schema","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#pattern-refusing-on-a-business-rule","title":"Pattern: Refusing On a Business Rule","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#pattern-rendering-a-refused-submission","title":"Pattern: Rendering a Refused Submission","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#pattern-custom-messages","title":"Pattern: Custom Messages","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/expression","title":"@sdxc/expression","page":"@sdxc/expression","section":"Packages · Language & values","summary":"Boolean conditions over a context, stored as typed JSON or written as text, with operators you add"},{"href":"/api/expression#installation","title":"Installation","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#usage","title":"Usage","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#compile-and-evaluate-a-condition","title":"Compile and evaluate a condition","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#write-it-as-text","title":"Write it as text","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#compare-two-values-from-the-context","title":"Compare two values from the context","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#share-conditions-by-name","title":"Share conditions by name","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#api","title":"API","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#createlanguage-options-languageoptions-language","title":"createLanguage(options?: LanguageOptions): Language","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#language","title":"Language","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#built-in-operators","title":"Built-in operators","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#text-form","title":"Text form","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#defineoperator-definition-operatordefinition-operator","title":"defineOperator(definition: OperatorDefinition): Operator","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#expressionerror","title":"ExpressionError","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#read-context-object-path-string-contextvalue","title":"read(context: object, path: string): ContextValue","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#types","title":"Types","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#pattern-authorization-rules-that-fail-closed","title":"Pattern: Authorization Rules That Fail Closed","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#pattern-loading-only-the-facts-a-rule-reads","title":"Pattern: Loading Only The Facts A Rule Reads","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#pattern-a-custom-operator-with-a-compile-step","title":"Pattern: A Custom Operator With A Compile Step","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#pattern-a-restricted-dialect-for-user-written-rules","title":"Pattern: A Restricted Dialect For User-Written Rules","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#pattern-validating-a-rule-before-storing-it","title":"Pattern: Validating A Rule Before Storing It","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/expression#pattern-a-rule-from-configuration","title":"Pattern: A Rule From Configuration","page":"@sdxc/expression","section":"Packages · Language & values"},{"href":"/api/bracket-params","title":"@sdxc/bracket-params","page":"@sdxc/bracket-params","section":"Packages · Language & values","summary":"Read and write nested query strings and form data with bracket syntax, validated by a Standard Schema"},{"href":"/api/bracket-params#installation","title":"Installation","page":"@sdxc/bracket-params","section":"Packages · Language & values"},{"href":"/api/bracket-params#usage","title":"Usage","page":"@sdxc/bracket-params","section":"Packages · Language & values"},{"href":"/api/bracket-params#read-a-query-string","title":"Read a query string","page":"@sdxc/bracket-params","section":"Packages · Language & values"},{"href":"/api/bracket-params#read-a-request","title":"Read a request","page":"@sdxc/bracket-params","section":"Packages · Language & values"},{"href":"/api/bracket-params#write-a-value-back","title":"Write a value back","page":"@sdxc/bracket-params","section":"Packages · Language & values"},{"href":"/api/bracket-params#api","title":"API","page":"@sdxc/bracket-params","section":"Packages · Language & values"},{"href":"/api/bracket-params#parse-source-schema-options","title":"parse(source, schema, options?)","page":"@sdxc/bracket-params","section":"Packages · Language & values"},{"href":"/api/bracket-params#stringify-value","title":"stringify(value)","page":"@sdxc/bracket-params","section":"Packages · Language & values"},{"href":"/api/bracket-params#toformdata-value","title":"toFormData(value)","page":"@sdxc/bracket-params","section":"Packages · Language & values"},{"href":"/api/bracket-params#fieldname-path","title":"fieldName(path)","page":"@sdxc/bracket-params","section":"Packages · Language & values"},{"href":"/api/bracket-params#types","title":"Types","page":"@sdxc/bracket-params","section":"Packages · Language & values"},{"href":"/api/bracket-params#pattern-filter-links-that-keep-the-current-query","title":"Pattern: Filter Links That Keep The Current Query","page":"@sdxc/bracket-params","section":"Packages · Language & values"},{"href":"/api/bracket-params#pattern-show-each-issue-on-its-input","title":"Pattern: Show Each Issue On Its Input","page":"@sdxc/bracket-params","section":"Packages · Language & values"},{"href":"/api/bracket-params#pattern-send-nested-data-and-files-in-one-request","title":"Pattern: Send Nested Data And Files In One Request","page":"@sdxc/bracket-params","section":"Packages · Language & values"},{"href":"/api/uuid","title":"@sdxc/uuid","page":"@sdxc/uuid","section":"Packages · Language & values","summary":"Validate and assert UUIDs behind a branded UUID type, and generate v4 or v7 values"},{"href":"/api/uuid#installation","title":"Installation","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#usage","title":"Usage","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#generate-an-identifier","title":"Generate an identifier","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#check-a-string-you-received","title":"Check a string you received","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#assert-and-tell-the-failures-apart","title":"Assert and tell the failures apart","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#api","title":"API","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#isuuid-value-string-value-is-uuid","title":"isUUID(value: string): value is UUID","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#assertuuid-value-string-asserts-value-is-uuid","title":"assertUUID(value: string): asserts value is UUID","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#generateuuid-uuid-from-sdxc-uuid-v7","title":"generateUUID(): UUID from @sdxc/uuid/v7","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#generateuuid-uuid-from-sdxc-uuid-v4","title":"generateUUID(): UUID from @sdxc/uuid/v4","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#invaliduuidtypeerror","title":"InvalidUUIDTypeError","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#invaliduuidlengtherror","title":"InvalidUUIDLengthError","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#invaliduuidformaterror","title":"InvalidUUIDFormatError","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#types","title":"Types","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#pattern-narrow-once-at-the-edge","title":"Pattern: Narrow Once At The Edge","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#pattern-validate-a-form-field-without-throwing","title":"Pattern: Validate A Form Field Without Throwing","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#pattern-time-ordered-record-ids","title":"Pattern: Time-Ordered Record Ids","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#pattern-prefixed-identifiers","title":"Pattern: Prefixed Identifiers","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/typeid","title":"@sdxc/typeid","page":"@sdxc/typeid","section":"Packages · Language & values","summary":"Type-safe TypeID values: a UUID and the prefix that names what it identifies"},{"href":"/api/typeid#installation","title":"Installation","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#usage","title":"Usage","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#create-one-from-a-uuid","title":"Create one from a UUID","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#parse-one-back","title":"Parse one back","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#check-a-string-without-catching","title":"Check a string without catching","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#tell-the-failures-apart","title":"Tell the failures apart","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#api","title":"API","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-fromuuid-prefix-prefix-uuid-uuid-typeid-prefix","title":"TypeID.fromUUID(prefix: prefix, uuid: UUID): TypeID<prefix>","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-fromstring-value-string-prefix-prefix-typeid-prefix","title":"TypeID.fromString(value: string, prefix?: prefix): TypeID<prefix>","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-isvalid-value-string-prefix-prefix-boolean","title":"TypeID.isValid(value: string, prefix?: prefix): boolean","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#new-typeid-prefix-prefix-suffix-base32","title":"new TypeID(prefix: prefix, suffix: Base32)","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-prefix-and-typeid-suffix","title":"typeId.prefix and typeId.suffix","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-touuid-uuid","title":"typeId.toUUID(): UUID","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-tostring-string","title":"typeId.toString(): string","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-prefix-prefix-uuid-uuid-typeid-prefix","title":"typeid(prefix: prefix): (uuid: UUID) => TypeID<prefix>","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#errors-from-errors","title":"Errors from ./errors","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#pattern-parse-at-the-boundary","title":"Pattern: Parse At The Boundary","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#pattern-one-factory-per-resource","title":"Pattern: One Factory Per Resource","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#pattern-store-uuids-serve-typeids","title":"Pattern: Store UUIDs, Serve TypeIDs","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#pattern-one-uuid-under-several-prefixes","title":"Pattern: One UUID Under Several Prefixes","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/random","title":"@sdxc/random","page":"@sdxc/random","section":"Packages · Language & values","summary":"Seeded and system random streams with integer, float, pick and shuffle draws, and resumable state"},{"href":"/api/random#installation","title":"Installation","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#usage","title":"Usage","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#roll-from-a-seed","title":"Roll from a seed","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#accept-randomness-in-your-own-api","title":"Accept randomness in your own API","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#save-and-resume-a-stream","title":"Save and resume a stream","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#split-one-seed-into-independent-streams","title":"Split one seed into independent streams","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#api","title":"API","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#createrandom-seed-seed-seededrandom","title":"createRandom(seed: Seed): SeededRandom","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#restorerandom-state-randomstate-seededrandom","title":"restoreRandom(state: RandomState): SeededRandom","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#systemrandom-random","title":"systemRandom(): Random","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#systemseed-number","title":"systemSeed(): number","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#random-state-schema-schema-unknown-randomstate","title":"RANDOM_STATE_SCHEMA: Schema<unknown, RandomState>","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#types","title":"Types","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#pattern-a-reproducible-fuzz-test","title":"Pattern: A Reproducible Fuzz Test","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#pattern-stable-procedural-generation","title":"Pattern: Stable Procedural Generation","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/random#pattern-persisting-a-simulation","title":"Pattern: Persisting A Simulation","page":"@sdxc/random","section":"Packages · Language & values"},{"href":"/api/spec","title":"@sdxc/spec","page":"@sdxc/spec","section":"Packages · Testing","summary":"Executable specification runner for .spec files"},{"href":"/api/spec#installation","title":"Installation","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#usage","title":"Usage","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#write-a-spec","title":"Write a spec","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#run-it-and-grant-what-it-needs","title":"Run it and grant what it needs","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#share-steps-with-commands","title":"Share steps with commands","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#point-the-suite-at-your-app","title":"Point the suite at your app","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#run-a-suite-from-code","title":"Run a suite from code","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#api","title":"API","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#the-spec-language","title":"The .spec language","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#capabilities","title":"Capabilities","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#cli-1","title":"CLI","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#spec-config-jsonc","title":"spec/config.jsonc","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#running-suites","title":"Running suites","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#plugins","title":"Plugins","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#language-internals","title":"Language internals","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#errors","title":"Errors","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#sdxc-spec-workers","title":"@sdxc/spec/workers","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#types","title":"Types","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#pattern-test-an-http-api-and-its-pages-without-a-browser","title":"Pattern: Test an HTTP API and its pages without a browser","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#pattern-drive-a-sign-in-flow-in-a-browser","title":"Pattern: Drive a sign-in flow in a browser","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#pattern-seed-a-database-with-unique-reproducible-data","title":"Pattern: Seed a database with unique, reproducible data","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#pattern-boot-the-app-under-test","title":"Pattern: Boot the app under test","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#pattern-declare-permissions-with-the-suite","title":"Pattern: Declare permissions with the suite","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#pattern-write-a-plugin","title":"Pattern: Write a plugin","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#pattern-run-specs-inside-a-worker","title":"Pattern: Run specs inside a Worker","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/sample","title":"@sdxc/sample","page":"@sdxc/sample","section":"Packages · Testing","summary":"Seeded generation of believable people, places, prose, numbers and identifiers"},{"href":"/api/sample#installation","title":"Installation","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#usage","title":"Usage","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#open-a-generator-on-a-seed","title":"Open a generator on a seed","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#fix-the-reference-instant","title":"Fix the reference instant","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#bring-your-own-vocabulary","title":"Bring your own vocabulary","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#api","title":"API","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#createsample-options-sampleoptions-sample","title":"createSample(options: SampleOptions): Sample","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#sample","title":"Sample","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#types","title":"Types","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#pattern-reproducing-a-failed-run","title":"Pattern: Reproducing A Failed Run","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#pattern-a-fixture-that-keeps-growing","title":"Pattern: A Fixture That Keeps Growing","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#pattern-seeding-a-development-database","title":"Pattern: Seeding A Development Database","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#pattern-optional-and-weighted-fields","title":"Pattern: Optional And Weighted Fields","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#pattern-codes-identifiers-and-templates","title":"Pattern: Codes, Identifiers And Templates","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#pattern-one-seed-for-fake-data-and-other-draws","title":"Pattern: One Seed For Fake Data And Other Draws","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks","title":"@sdxc/cloudflare-mocks","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing","summary":"In-memory, behavior-accurate Cloudflare binding mocks for tests"},{"href":"/api/cloudflare-mocks#installation","title":"Installation","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#usage","title":"Usage","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#storage-that-really-stores","title":"Storage that really stores","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#assemble-an-env","title":"Assemble an env","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#record-what-a-worker-sent","title":"Record what a Worker sent","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#drain-deferred-work","title":"Drain deferred work","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#open-the-sqlite-engine-directly","title":"Open the SQLite engine directly","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#api","title":"API","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createkvnamespace-options-kvnamespacemockoptions-kvnamespace","title":"createKVNamespace(options?: KVNamespaceMockOptions): KVNamespace","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#created1database-options-d1databasemockoptions-d1database","title":"createD1Database(options?: D1DatabaseMockOptions): D1Database","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createsqlstorage-options-sqlstoragemockoptions-sqlstorage","title":"createSqlStorage(options?: SqlStorageMockOptions): SqlStorage","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#creater2bucket-r2bucketmock","title":"createR2Bucket(): R2BucketMock","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createqueue-body-options-queuemockoptions-queuemock-body","title":"createQueue<Body>(options?: QueueMockOptions): QueueMock<Body>","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createsendemail-options-sendemailmockoptions-sendemailmock","title":"createSendEmail(options?: SendEmailMockOptions): SendEmailMock","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createanalyticsengine-analyticsenginemock","title":"createAnalyticsEngine(): AnalyticsEngineMock","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createratelimit-options-ratelimitmockoptions-ratelimitmock","title":"createRateLimit(options?: RateLimitMockOptions): RateLimitMock","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createsecretsstoresecret-options-secretsstoresecretmockoptions-secretsstoresecretmock","title":"createSecretsStoreSecret(options?: SecretsStoreSecretMockOptions): SecretsStoreSecretMock","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createdurableobjectstate-props-options-durableobjectstatemockoptions-props-durableobjectstatemock-props","title":"createDurableObjectState<Props>(options?: DurableObjectStateMockOptions<Props>): DurableObjectStateMock<Props>","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createdurableobjectnamespace-t-createstub-durableobjectstubfactory-durableobjectnamespacemock-t","title":"createDurableObjectNamespace<T>(createStub: DurableObjectStubFactory): DurableObjectNamespaceMock<T>","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createfetcher-handler-fetcherhandler-fetchermock","title":"createFetcher(handler: FetcherHandler): FetcherMock","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createexecutioncontext-props-options-executioncontextmockoptions-props-executioncontextmock-props","title":"createExecutionContext<Props>(options?: ExecutionContextMockOptions<Props>): ExecutionContextMock<Props>","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createenv-env-bindings-options-envmockoptions-env","title":"createEnv<Env>(bindings, options?: EnvMockOptions): Env","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#opendatabase-filename-string-sqlitedatabase-from-sqlite","title":"openDatabase(filename: string): SqliteDatabase from ./sqlite","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#types","title":"Types","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#where-a-mock-differs-from-the-platform","title":"Where a mock differs from the platform","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#pattern-a-data-layer-against-real-sql","title":"Pattern: A Data Layer Against Real SQL","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#pattern-a-producer-and-its-consumer","title":"Pattern: A Producer And Its Consumer","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#pattern-background-work-and-deferred-acks","title":"Pattern: Background Work And Deferred Acks","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#pattern-a-durable-object-by-construction","title":"Pattern: A Durable Object By Construction","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#pattern-service-bindings-and-durable-object-namespaces","title":"Pattern: Service Bindings And Durable Object Namespaces","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#pattern-module-scoped-bindings-reset-per-test","title":"Pattern: Module-Scoped Bindings Reset Per Test","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#pattern-limits-on-a-clock","title":"Pattern: Limits On A Clock","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/u/debug","title":"debug","page":"debug","section":"@sdxc/u · a11y","summary":"Outlines the host in red during development and resolves to an empty style tree elsewhere, so the call is safe to leave in committed code."},{"href":"/api/u/forcedColorAdjust","title":"forced-color-adjust (forcedColorAdjust)","page":"forced-color-adjust (forcedColorAdjust)","section":"@sdxc/u · a11y","summary":"Applies `forced-color-adjust`, defaulting to `\"none\"` so author colours survive where colour itself carries the information — swatches, chart legends, syntax highlighting."},{"href":"/api/u/visuallyHidden","title":"visuallyHidden","page":"visuallyHidden","section":"@sdxc/u · a11y","summary":"Clips the host to a `1px` box taken out of layout flow, keeping its native focusability and tab order intact so screen readers and keyboard users still reach it."},{"href":"/api/u/animation","title":"animation","page":"animation","section":"@sdxc/u · animation","summary":"Emits an `@keyframes` rule under `name` together with the host `animation-*` declarations that reference it."},{"href":"/api/u/animationDelay","title":"animation-delay (animationDelay)","page":"animation-delay (animationDelay)","section":"@sdxc/u · animation","summary":"Applies the `animation-delay` property."},{"href":"/api/u/animationHost","title":"animationHost","page":"animationHost","section":"@sdxc/u · animation","summary":"Emits the host `animation-*` declarations alone, taking every AnimationConfig key but `keyframes`."},{"href":"/api/u/keyframes","title":"keyframes","page":"keyframes","section":"@sdxc/u · animation","summary":"Emits an `@keyframes` rule under `name` at the top level, where the serializer reads stop keys (`from`, `to`, `50%`) as stop selectors."},{"href":"/api/u/scrollTimelineName","title":"scroll-timeline-name (scrollTimelineName)","page":"scroll-timeline-name (scrollTimelineName)","section":"@sdxc/u · animation","summary":"Applies `scroll-timeline-name` to the scroll container itself, which needs an `overflow` value that scrolls."},{"href":"/api/u/timelineScope","title":"timeline-scope (timelineScope)","page":"timeline-scope (timelineScope)","section":"@sdxc/u · animation","summary":"Applies the `timeline-scope` property, raising a named timeline's visibility to a common ancestor's subtree so animations outside the declaring element can resolve the name; the subtree still declares it."},{"href":"/api/u/viewTimelineName","title":"view-timeline-name (viewTimelineName)","page":"view-timeline-name (viewTimelineName)","section":"@sdxc/u · animation","summary":"Applies `view-timeline-name` to the element being *watched* — the card, the section, the image."},{"href":"/api/u/accent","title":"accent-color (accent)","page":"accent-color (accent)","section":"@sdxc/u · color","summary":"Applies `accent-color`, the property native form controls (`checkbox`, `radio`, `range`, `progress`) read for their own painted color."},{"href":"/api/u/autofill","title":"autofill","page":"autofill","section":"@sdxc/u · color","summary":"Overrides the browser's autofill background and text color under `&:-webkit-autofill`, so an autofilled input keeps the appearance every other input has."},{"href":"/api/u/bg","title":"background-color (bg)","page":"background-color (bg)","section":"@sdxc/u · color","summary":"Applies `background-color`, or the full set of background properties when given an options object, of which only the given keys are set."},{"href":"/api/u/border","title":"border-color (border)","page":"border-color (border)","section":"@sdxc/u · color","summary":"Applies `border-color`, or the full set of border properties when given an options object, of which only the given keys are set."},{"href":"/api/u/borderEdge","title":"borderEdge","page":"borderEdge","section":"@sdxc/u · color","summary":"Applies a border to a single edge only, for a divider between two adjacent elements (e.g."},{"href":"/api/u/caretColor","title":"caret-color (caretColor)","page":"caret-color (caretColor)","section":"@sdxc/u · color","summary":"Sets `caret-color` for an editable field, resolving a tone at its `fg` weight."},{"href":"/api/u/colorMix","title":"colorMix","page":"colorMix","section":"@sdxc/u · color","summary":"Builds a `color-mix(...)` value string for any color-accepting property."},{"href":"/api/u/colorScheme","title":"color-scheme (colorScheme)","page":"color-scheme (colorScheme)","section":"@sdxc/u · color","summary":"Sets `color-scheme`, which tells the browser which schemes an element renders correctly in, so the chrome the browser paints itself — scrollbars, pickers, form controls — follows the theme."},{"href":"/api/u/conicGradient","title":"conicGradient","page":"conicGradient","section":"@sdxc/u · color","summary":"Builds a `conic-gradient(...)` value string for any `background-image` use."},{"href":"/api/u/fg","title":"color (fg)","page":"color (fg)","section":"@sdxc/u · color","summary":"Applies `color` (foreground text color)."},{"href":"/api/u/fill","title":"fill","page":"fill","section":"@sdxc/u · color","summary":"Applies the SVG `fill` paint property, resolving semantic tones the same way `color` does."},{"href":"/api/u/fillOpacity","title":"fill-opacity (fillOpacity)","page":"fill-opacity (fillOpacity)","section":"@sdxc/u · color","summary":"Sets the SVG `fill-opacity` paint property."},{"href":"/api/u/linearGradient","title":"linearGradient","page":"linearGradient","section":"@sdxc/u · color","summary":"Builds a `linear-gradient(...)` value string for any `background-image` use."},{"href":"/api/u/outline","title":"outline","page":"outline","section":"@sdxc/u · color","summary":"Applies an outline unconditionally, for a persistent or decorative edge."},{"href":"/api/u/outlineColor","title":"outline-color (outlineColor)","page":"outline-color (outlineColor)","section":"@sdxc/u · color","summary":"Sets `outline-color` alone, so a state such as `[aria-invalid]` can tint an outline while the width and style already in effect stay in force."},{"href":"/api/u/outlineStyle","title":"outline-style (outlineStyle)","page":"outline-style (outlineStyle)","section":"@sdxc/u · color","summary":"Sets `outline-style` alone, so a state can override the style while the color and width already in effect stay in force."},{"href":"/api/u/outlineWidth","title":"outline-width (outlineWidth)","page":"outline-width (outlineWidth)","section":"@sdxc/u · color","summary":"Sets `outline-width` alone, so a state can override the width while the color and style already in effect stay in force."},{"href":"/api/u/radialGradient","title":"radialGradient","page":"radialGradient","section":"@sdxc/u · color","summary":"Builds a `radial-gradient(...)` value string for any `background-image` use."},{"href":"/api/u/ring","title":"ring","page":"ring","section":"@sdxc/u · color","summary":"Applies a focus ring already scoped to `&:focus-visible`, so it shows for keyboard and assistive-tech focus and a component can apply it directly."},{"href":"/api/u/stroke","title":"stroke","page":"stroke","section":"@sdxc/u · color","summary":"Applies `stroke`, resolving a semantic tone to an SVG shape's outline color."},{"href":"/api/u/strokeLinecap","title":"stroke-linecap (strokeLinecap)","page":"stroke-linecap (strokeLinecap)","section":"@sdxc/u · color","summary":"Sets `stroke-linecap`, the SVG paint property controlling how a `<path>`/`<line>` shape's stroke renders at the two open ends of an unclosed subpath."},{"href":"/api/u/strokeLinejoin","title":"stroke-linejoin (strokeLinejoin)","page":"stroke-linejoin (strokeLinejoin)","section":"@sdxc/u · color","summary":"Sets `stroke-linejoin`, the SVG paint property controlling how a `<path>`/`<polyline>`/`<polygon>` shape's stroke renders at a corner between two segments."},{"href":"/api/u/strokeWidth","title":"stroke-width (strokeWidth)","page":"stroke-width (strokeWidth)","section":"@sdxc/u · color","summary":"Sets `stroke-width` on an SVG shape."},{"href":"/api/u/surface","title":"surface","page":"surface","section":"@sdxc/u · color","summary":"Composes `u.bg()`, `u.fg()`, and `u.border()` so a surface's contrast holds by construction."},{"href":"/api/u/translucent","title":"translucent","page":"translucent","section":"@sdxc/u · color","summary":"A see-through background plus backdrop blur, gated behind `prefers-reduced-transparency: no-preference`; a reduced-transparency preference gets the opaque `--ui-bg` background and stays legible."},{"href":"/api/u/vectorEffect","title":"vector-effect (vectorEffect)","page":"vector-effect (vectorEffect)","section":"@sdxc/u · color","summary":"Sets `vector-effect`, exempting an SVG shape from its ancestor transforms: `\"non-scaling-stroke\"` keeps a chart line's stroke width constant while the chart itself scales or zooms."},{"href":"/api/u/backdropBlur","title":"backdropBlur","page":"backdropBlur","section":"@sdxc/u · effects","summary":"Blurs the backdrop by a step from the blur scale, whatever the user's transparency preference; `u.translucent()` is the gated variant with a solid fallback."},{"href":"/api/u/backdropBrightness","title":"backdropBrightness","page":"backdropBrightness","section":"@sdxc/u · effects","summary":"Scales the backdrop's lightness — below `1` darkens, above `1` brightens — keeping overlaid text legible."},{"href":"/api/u/backdropContrast","title":"backdropContrast","page":"backdropContrast","section":"@sdxc/u · effects","summary":"Pushes the backdrop away from (above `1`) or toward (below `1`) mid-grey; flattening it to a uniform tone keeps overlaid text legible."},{"href":"/api/u/backdropDropShadow","title":"backdropDropShadow","page":"backdropDropShadow","section":"@sdxc/u · effects","summary":"Shadows the shapes showing through the host."},{"href":"/api/u/backdropGrayscale","title":"backdropGrayscale","page":"backdropGrayscale","section":"@sdxc/u · effects","summary":"Desaturates the backdrop toward grey (`1` fully, `0` untouched) so a coloured overlay reads as the only hue in the area."},{"href":"/api/u/backdropHueRotate","title":"backdropHueRotate","page":"backdropHueRotate","section":"@sdxc/u · effects","summary":"Rotates the backdrop's hue while preserving lightness and saturation, so a busy backdrop pulls toward one brand hue with its light/dark structure intact."},{"href":"/api/u/backdropInvert","title":"backdropInvert","page":"backdropInvert","section":"@sdxc/u · effects","summary":"Inverts the colours showing through the element's translucent background."},{"href":"/api/u/backdropOpacity","title":"backdropOpacity","page":"backdropOpacity","section":"@sdxc/u · effects","summary":"Fades what shows through the element's translucent background, taking CSS's native `0`–`1` range or a percentage string."},{"href":"/api/u/backdropSaturate","title":"backdropSaturate","page":"backdropSaturate","section":"@sdxc/u · effects","summary":"Boosts or mutes the saturation of what shows through the element's translucent background."},{"href":"/api/u/backdropSepia","title":"backdropSepia","page":"backdropSepia","section":"@sdxc/u · effects","summary":"Shifts what shows through the element's translucent background toward a warm brown monochrome."},{"href":"/api/u/backfaceVisibility","title":"backface-visibility (backfaceVisibility)","page":"backface-visibility (backfaceVisibility)","section":"@sdxc/u · effects","summary":"Controls whether the back face of a 3D-transformed element renders once it rotates away from the viewer; the `\"hidden\"` default keeps flip-card and page-turn effects showing only their front face."},{"href":"/api/u/blur","title":"blur","page":"blur","section":"@sdxc/u · effects","summary":"Applies a blur from the blur scale by writing only its own `--ui-filter-blur` custom property, so it combines with `u.grayscale()`, `u.brightness()`, and every other filter utility in one composite `filter`."},{"href":"/api/u/brightness","title":"brightness","page":"brightness","section":"@sdxc/u · effects","summary":"Applies a `filter: brightness(...)`, scaling every pixel's lightness."},{"href":"/api/u/contrast","title":"contrast","page":"contrast","section":"@sdxc/u · effects","summary":"Applies a `filter: contrast(...)`, pushing pixels away from (above `1`) or toward (below `1`) mid-grey; `0` flattens the element to uniform grey."},{"href":"/api/u/dropShadow","title":"dropShadow","page":"dropShadow","section":"@sdxc/u · effects","summary":"Applies `filter: drop-shadow(...)`, shadowing the element's rendered shape — a PNG's alpha channel, an SVG icon's outline — with offsets and a blur radius."},{"href":"/api/u/filterOpacity","title":"filterOpacity","page":"filterOpacity","section":"@sdxc/u · effects","summary":"Applies a `filter: opacity(...)`, fading the element inside the filter pipeline so one pass carries the fade along with any `blur()` or `grayscale()`."},{"href":"/api/u/grayscale","title":"grayscale","page":"grayscale","section":"@sdxc/u · effects","summary":"Applies a `filter: grayscale(...)`, desaturating toward grey; `1` (the default) is fully grey, dimming an inactive element while its layout holds."},{"href":"/api/u/hueRotate","title":"hueRotate","page":"hueRotate","section":"@sdxc/u · effects","summary":"Applies a `filter: hue-rotate(...)`, rotating every pixel's hue by the given angle while preserving lightness and saturation, so one source asset can be retinted per theme."},{"href":"/api/u/invert","title":"invert","page":"invert","section":"@sdxc/u · effects","summary":"Inverts colors (`1`, the default, fully) to flip single-color raster assets for dark mode."},{"href":"/api/u/mask","title":"mask-image (mask)","page":"mask-image (mask)","section":"@sdxc/u · effects","summary":"Applies a CSS mask image, or the given subset of mask properties when passed an options object."},{"href":"/api/u/mixBlendMode","title":"mix-blend-mode (mixBlendMode)","page":"mix-blend-mode (mixBlendMode)","section":"@sdxc/u · effects","summary":"Blends the element with the content painted behind it."},{"href":"/api/u/opacity","title":"opacity","page":"opacity","section":"@sdxc/u · effects","summary":"Applies opacity from a 0-100 integer."},{"href":"/api/u/ringShadow","title":"ringShadow","page":"ringShadow","section":"@sdxc/u · effects","summary":"Draws a selection ring that stays visible for as long as a component applies it, for persistently-selected swatches, chips, and thumbnails."},{"href":"/api/u/rounded","title":"border-radius (rounded)","page":"border-radius (rounded)","section":"@sdxc/u · effects","summary":"Applies a corner radius from the radius scale or a raw CSS length."},{"href":"/api/u/roundedCorner","title":"border-end-start-radius (roundedCorner)","page":"border-end-start-radius (roundedCorner)","section":"@sdxc/u · effects","summary":"Applies a radius from the radius scale, or a raw CSS length, to one logical corner — for shapes that round three corners uniformly and differentiate the fourth, like a chat bubble's tail."},{"href":"/api/u/saturate","title":"saturate","page":"saturate","section":"@sdxc/u · effects","summary":"Applies a `filter: saturate(...)` to the element itself, where `0` is fully desaturated and values above `1` oversaturate."},{"href":"/api/u/sepia","title":"sepia","page":"sepia","section":"@sdxc/u · effects","summary":"Applies a `filter: sepia(...)`, shifting the element toward a warm brown monochrome; `1` (the default) is a full conversion."},{"href":"/api/u/shadow","title":"shadow","page":"shadow","section":"@sdxc/u · effects","summary":"Applies a box shadow from the shadow scale, written to the `elevation` slot of the shared composite `boxShadow` declaration."},{"href":"/api/u/textShadow","title":"text-shadow (textShadow)","page":"text-shadow (textShadow)","section":"@sdxc/u · effects","summary":"Applies `text-shadow`, tracing the glyph forms themselves."},{"href":"/api/u/transition","title":"transition","page":"transition","section":"@sdxc/u · effects","summary":"Applies the `transition-property`/`transition-timing-function`/ `transition-duration` triplet behind most hover, focus, press and selection state changes, so a call site only names which properties animate."},{"href":"/api/u/transitionBehavior","title":"transition-behavior (transitionBehavior)","page":"transition-behavior (transitionBehavior)","section":"@sdxc/u · effects","summary":"Applies the `transition-behavior` property on its own; `\"allow-discrete\"` lets a discrete property such as `display` or `content-visibility` animate across a transition, commonly paired with `@starting-style`."},{"href":"/api/u/transitionDelay","title":"transition-delay (transitionDelay)","page":"transition-delay (transitionDelay)","section":"@sdxc/u · effects","summary":"Applies `transition-delay` on its own, so items sharing one transition can stagger by giving each an increasing delay."},{"href":"/api/u/transitionDuration","title":"transitionDuration","page":"transitionDuration","section":"@sdxc/u · effects","summary":"Applies `transition-duration` on its own, so a media query such as `prefers-reduced-motion` can shrink an already-declared transition to zero while its property list and timing function stay in place."},{"href":"/api/u/transitionProperty","title":"transition-property (transitionProperty)","page":"transition-property (transitionProperty)","section":"@sdxc/u · effects","summary":"Applies `transition-property` on its own, so a variant can change which properties animate while the duration and timing function declared elsewhere stay in place."},{"href":"/api/u/visibility","title":"visibility","page":"visibility","section":"@sdxc/u · effects","summary":"Controls the CSS `visibility` property: a `\"hidden\"` element keeps its layout box and can transition back to `\"visible\"`, which is what a selection indicator or hover-triggered surface needs to fade in place."},{"href":"/api/u/calc","title":"calc","page":"calc","section":"@sdxc/u · general","summary":"Wraps a CSS `calc()` expression: `calc({expression})`."},{"href":"/api/u/combine","title":"combine","page":"combine","section":"@sdxc/u · general","summary":"Flattens `input` and merges the flattened utilities' style trees into one declaration set at the host's own level, so unrelated utilities compose as a single mixin with each nested selector kept as a sibling."},{"href":"/api/u/counterIncrement","title":"counter-increment (counterIncrement)","page":"counter-increment (counterIncrement)","section":"@sdxc/u · general","summary":"Applies `counter-increment` to the element's CSS counter, named by the bare counter identifier `name`."},{"href":"/api/u/counterReset","title":"counter-reset (counterReset)","page":"counter-reset (counterReset)","section":"@sdxc/u · general","summary":"Applies `counter-reset`, creating or resetting the element's CSS counter named by the bare counter identifier `name`."},{"href":"/api/u/cursor","title":"cursor","page":"cursor","section":"@sdxc/u · general","summary":"Applies `cursor`."},{"href":"/api/u/env","title":"env","page":"env","section":"@sdxc/u · general","summary":"Resolves a CSS environment variable reference: `env({name})`, or `env({name}, {fallback})` when a fallback is given."},{"href":"/api/u/if","title":"if","page":"if","section":"@sdxc/u · general","summary":"Conditionally returns `input` as one mixin, or `false` when `condition` is falsy."},{"href":"/api/u/listStyle","title":"list-style (listStyle)","page":"list-style (listStyle)","section":"@sdxc/u · general","summary":"Applies `list-style`."},{"href":"/api/u/pointerEvents","title":"pointer-events (pointerEvents)","page":"pointer-events (pointerEvents)","section":"@sdxc/u · general","summary":"Applies `pointer-events`."},{"href":"/api/u/pseudoContent","title":"content (pseudoContent)","page":"content (pseudoContent)","section":"@sdxc/u · general","summary":"Applies the CSS `content` property, almost always on a `::before`/`::after` pseudo-element."},{"href":"/api/u/raw","title":"raw","page":"raw","section":"@sdxc/u · general","summary":"Wraps a plain style object as a utility mixin, so bespoke declarations — a property outside this package's surface, or a call-site-computed value — compose inside wrappers like `when()`, whose inputs are utility mixins."},{"href":"/api/u/touchAction","title":"touch-action (touchAction)","page":"touch-action (touchAction)","section":"@sdxc/u · general","summary":"Applies `touch-action`."},{"href":"/api/u/userSelect","title":"user-select (userSelect)","page":"user-select (userSelect)","section":"@sdxc/u · general","summary":"Applies `user-select`."},{"href":"/api/u/var","title":"var","page":"var","section":"@sdxc/u · general","summary":"Resolves a custom property reference: `var(--{name})`, or with a fallback, `var(--{name}, {fallback})`."},{"href":"/api/u/vars","title":"vars","page":"vars","section":"@sdxc/u · general","summary":"Sets custom properties on the host element, with the leading `--` omitted from each key so call sites read as plain option names."},{"href":"/api/u/willChange","title":"will-change (willChange)","page":"will-change (willChange)","section":"@sdxc/u · general","summary":"Applies `will-change`, hinting the browser to optimize for an upcoming animation on the given property/properties before it starts."},{"href":"/api/u/absolute","title":"position (absolute)","page":"position (absolute)","section":"@sdxc/u · layout","summary":"Sets `position: absolute`."},{"href":"/api/u/anchor","title":"anchor","page":"anchor","section":"@sdxc/u · layout","summary":"Resolves an `anchor()` reference to a plain string — the length an inset utility needs to pin an edge to the anchor's geometry."},{"href":"/api/u/anchorName","title":"anchor-name (anchorName)","page":"anchor-name (anchorName)","section":"@sdxc/u · layout","summary":"Applies `anchor-name`, the *declaring* half of anchor positioning: it goes on the element anchored **to**, and positionAnchor points back at this name."},{"href":"/api/u/anchorSize","title":"anchorSize","page":"anchorSize","section":"@sdxc/u · layout","summary":"Resolves an `anchor-size()` reference to a plain string, letting a panel track its trigger's size in one browser-maintained declaration."},{"href":"/api/u/appearance","title":"appearance","page":"appearance","section":"@sdxc/u · layout","summary":"Applies `appearance` to clear a form control's native platform chrome, which Safari and Firefox honor only with their own prefixed property alongside the standard one, so all three are emitted; `options` narrows that set."},{"href":"/api/u/basis","title":"flex-basis (basis)","page":"flex-basis (basis)","section":"@sdxc/u · layout","summary":"Applies `flex-basis`, defaulting to `\"auto\"` to match the property's own initial value — the remainder of a `flex: N N M` shorthand once `u.grow()`/`u.shrink()` have been extracted from it."},{"href":"/api/u/block","title":"display (block)","page":"display (block)","section":"@sdxc/u · layout","summary":"Sets `display: block`."},{"href":"/api/u/borderCollapse","title":"border-collapse (borderCollapse)","page":"border-collapse (borderCollapse)","section":"@sdxc/u · layout","summary":"Applies `border-collapse`."},{"href":"/api/u/borderSpacing","title":"border-spacing (borderSpacing)","page":"border-spacing (borderSpacing)","section":"@sdxc/u · layout","summary":"Applies the `border-spacing` property — the gap between adjacent table cell borders when `border-collapse: separate` is in effect (its default)."},{"href":"/api/u/boxSizing","title":"box-sizing (boxSizing)","page":"box-sizing (boxSizing)","section":"@sdxc/u · layout","summary":"Applies `box-sizing`, controlling whether `width`/`height` (and the logical `inline-size`/`block-size` pair) span padding and border (`\"border-box\"`) or the content area alone (`\"content-box\"`, the CSS default)."},{"href":"/api/u/center","title":"center","page":"center","section":"@sdxc/u · layout","summary":"A zero-argument convenience pattern that centers content both ways."},{"href":"/api/u/contain","title":"contain","page":"contain","section":"@sdxc/u · layout","summary":"Applies `contain`, letting the browser skip layout and paint work it can prove stays inside the subtree."},{"href":"/api/u/container","title":"container","page":"container","section":"@sdxc/u · layout","summary":"Declares the host as a named container query context via the `container` shorthand (`container-name` and `container-type` together), so a descendant's `u.at(size, name, ...)` query can target it by name."},{"href":"/api/u/content","title":"align-content (content)","page":"align-content (content)","section":"@sdxc/u · layout","summary":"Sets `align-content`, using the same accepted keywords and `between`/`around`/`evenly` aliasing as `u.justify()`."},{"href":"/api/u/contents","title":"display (contents)","page":"display (contents)","section":"@sdxc/u · layout","summary":"Sets `display: contents`, removing the host element's own box so its children participate directly in the parent's layout."},{"href":"/api/u/contentVisibility","title":"content-visibility (contentVisibility)","page":"content-visibility (contentVisibility)","section":"@sdxc/u · layout","summary":"Applies `content-visibility` so the browser skips rendering work for an element's contents; defaults to `\"auto\"`."},{"href":"/api/u/fieldSizing","title":"field-sizing (fieldSizing)","page":"field-sizing (fieldSizing)","section":"@sdxc/u · layout","summary":"Applies `field-sizing` to an `<input>`, `<textarea>`, or `<select>`."},{"href":"/api/u/fixed","title":"position (fixed)","page":"position (fixed)","section":"@sdxc/u · layout","summary":"Sets `position: fixed`."},{"href":"/api/u/flex","title":"display (flex)","page":"display (flex)","section":"@sdxc/u · layout","summary":"Sets `display: flex`."},{"href":"/api/u/flexCol","title":"flex-direction (flexCol)","page":"flex-direction (flexCol)","section":"@sdxc/u · layout","summary":"Sets `flex-direction: column`."},{"href":"/api/u/flexColReverse","title":"flexColReverse","page":"flexColReverse","section":"@sdxc/u · layout","summary":"Sets `display: flex; flex-direction: column-reverse`."},{"href":"/api/u/flexRow","title":"flex-direction (flexRow)","page":"flex-direction (flexRow)","section":"@sdxc/u · layout","summary":"Sets `flex-direction: row`."},{"href":"/api/u/flexRowReverse","title":"flexRowReverse","page":"flexRowReverse","section":"@sdxc/u · layout","summary":"Sets `display: flex; flex-direction: row-reverse`."},{"href":"/api/u/flexWrap","title":"flex-wrap (flexWrap)","page":"flex-wrap (flexWrap)","section":"@sdxc/u · layout","summary":"Sets `flex-wrap`, defaulting to `wrap`."},{"href":"/api/u/gap","title":"gap","page":"gap","section":"@sdxc/u · layout","summary":"Applies `gap` using the spacing scale or a raw CSS length."},{"href":"/api/u/grid","title":"display (grid)","page":"display (grid)","section":"@sdxc/u · layout","summary":"Sets `display: grid`."},{"href":"/api/u/gridArea","title":"grid-area (gridArea)","page":"grid-area (gridArea)","section":"@sdxc/u · layout","summary":"Applies `grid-area`, placing an element in a named area of its parent's `grid-template-areas`."},{"href":"/api/u/gridAutoColumns","title":"grid-auto-columns (gridAutoColumns)","page":"grid-auto-columns (gridAutoColumns)","section":"@sdxc/u · layout","summary":"Applies `grid-auto-columns` to the *implicit* columns a grid creates past its explicit tracks."},{"href":"/api/u/gridAutoFlow","title":"grid-auto-flow (gridAutoFlow)","page":"grid-auto-flow (gridAutoFlow)","section":"@sdxc/u · layout","summary":"Applies `grid-auto-flow`, the axis auto-placed items fill along; defaults to `\"row\"`."},{"href":"/api/u/gridAutoRows","title":"grid-auto-rows (gridAutoRows)","page":"grid-auto-rows (gridAutoRows)","section":"@sdxc/u · layout","summary":"Applies `grid-auto-rows` to the *implicit* rows a grid creates past its explicit tracks."},{"href":"/api/u/gridColumn","title":"grid-column (gridColumn)","page":"grid-column (gridColumn)","section":"@sdxc/u · layout","summary":"Applies `grid-column`, shorthand for `grid-column-start` / `grid-column-end`: one value sets the start line and spans one track, a `\"start / end\"` string sets both."},{"href":"/api/u/gridRow","title":"grid-row (gridRow)","page":"grid-row (gridRow)","section":"@sdxc/u · layout","summary":"Applies `grid-row`, placing or spanning a grid item along the block axis."},{"href":"/api/u/gridTemplate","title":"gridTemplate","page":"gridTemplate","section":"@sdxc/u · layout","summary":"Applies `grid-template-columns`/`-rows`/`-areas` from whichever option keys are given."},{"href":"/api/u/grow","title":"flex-grow (grow)","page":"flex-grow (grow)","section":"@sdxc/u · layout","summary":"Applies `flex-grow`."},{"href":"/api/u/hidden","title":"display (hidden)","page":"display (hidden)","section":"@sdxc/u · layout","summary":"Sets `display: none`, removing the host element from layout entirely."},{"href":"/api/u/hstack","title":"hstack","page":"hstack","section":"@sdxc/u · layout","summary":"A horizontal flex stack."},{"href":"/api/u/inline","title":"display (inline)","page":"display (inline)","section":"@sdxc/u · layout","summary":"Sets `display: inline`."},{"href":"/api/u/inlineBlock","title":"display (inlineBlock)","page":"display (inlineBlock)","section":"@sdxc/u · layout","summary":"Sets `display: inline-block`."},{"href":"/api/u/inlineFlex","title":"display (inlineFlex)","page":"display (inlineFlex)","section":"@sdxc/u · layout","summary":"Sets `display: inline-flex`."},{"href":"/api/u/inlineGrid","title":"display (inlineGrid)","page":"display (inlineGrid)","section":"@sdxc/u · layout","summary":"Sets `display: inline-grid`."},{"href":"/api/u/insBe","title":"inset-block-end (insBe)","page":"inset-block-end (insBe)","section":"@sdxc/u · layout","summary":"Applies `inset-block-end` — the trailing block edge, the bottom edge in a horizontal writing mode."},{"href":"/api/u/insBottom","title":"bottom (insBottom)","page":"bottom (insBottom)","section":"@sdxc/u · layout","summary":"Applies the physical `bottom` property."},{"href":"/api/u/insBs","title":"inset-block-start (insBs)","page":"inset-block-start (insBs)","section":"@sdxc/u · layout","summary":"Applies `inset-block-start` — the leading block edge, the top edge in a horizontal writing mode."},{"href":"/api/u/inset","title":"inset","page":"inset","section":"@sdxc/u · layout","summary":"Applies a logical `inset` shorthand from the spacing scale or a raw CSS length."},{"href":"/api/u/insIe","title":"inset-inline-end (insIe)","page":"inset-inline-end (insIe)","section":"@sdxc/u · layout","summary":"Applies `inset-inline-end` — the trailing inline edge, which is the right edge in `ltr` and the left edge in `rtl`."},{"href":"/api/u/insIs","title":"inset-inline-start (insIs)","page":"inset-inline-start (insIs)","section":"@sdxc/u · layout","summary":"Applies `inset-inline-start` — the leading inline edge, which is the left edge in `ltr` and the right edge in `rtl`."},{"href":"/api/u/insLeft","title":"left (insLeft)","page":"left (insLeft)","section":"@sdxc/u · layout","summary":"Applies the physical `left` property, for offsets genuinely tied to the viewport's left side."},{"href":"/api/u/insRight","title":"right (insRight)","page":"right (insRight)","section":"@sdxc/u · layout","summary":"Applies the physical `right` property, for offsets genuinely tied to the viewport's right side."},{"href":"/api/u/insTop","title":"top (insTop)","page":"top (insTop)","section":"@sdxc/u · layout","summary":"Applies the physical `top` property, for offsets genuinely tied to the viewport's top side."},{"href":"/api/u/interpolateSize","title":"interpolate-size (interpolateSize)","page":"interpolate-size (interpolateSize)","section":"@sdxc/u · layout","summary":"Opts the element into animating to and from keyword sizes (`auto`, `min-content`, `max-content`, `fit-content`), so a transition to `height: auto` or `block-size: auto` animates across its full duration."},{"href":"/api/u/items","title":"align-items (items)","page":"align-items (items)","section":"@sdxc/u · layout","summary":"Sets `align-items`."},{"href":"/api/u/justify","title":"justify-content (justify)","page":"justify-content (justify)","section":"@sdxc/u · layout","summary":"Sets `justify-content`, aliasing the short `between`/`around`/`evenly` forms to their `space-*` CSS keywords."},{"href":"/api/u/place","title":"place","page":"place","section":"@sdxc/u · layout","summary":"Sets item and/or content placement on both axes from whichever option keys are given, so a partial options object emits only the declarations belonging to the keys it carries."},{"href":"/api/u/positionAnchor","title":"position-anchor (positionAnchor)","page":"position-anchor (positionAnchor)","section":"@sdxc/u · layout","summary":"Points an absolutely or fixed positioned element (a tooltip, popover, or menu) at the anchor name anchorName declared on its target."},{"href":"/api/u/positionArea","title":"position-area (positionArea)","page":"position-area (positionArea)","section":"@sdxc/u · layout","summary":"Applies the CSS Anchor Positioning `position-area` property, placing an anchor-positioned element in a named region of the 3x3 grid around its anchor."},{"href":"/api/u/positionTryFallbacks","title":"position-try-fallbacks (positionTryFallbacks)","page":"position-try-fallbacks (positionTryFallbacks)","section":"@sdxc/u · layout","summary":"Applies the CSS Anchor Positioning `position-try-fallbacks` property, listing named tactics or `--custom-position-try` references tried in order when the preferred position overflows its containing block."},{"href":"/api/u/relative","title":"position (relative)","page":"position (relative)","section":"@sdxc/u · layout","summary":"Sets `position: relative`."},{"href":"/api/u/repeat","title":"grid-template-columns (repeat)","page":"grid-template-columns (repeat)","section":"@sdxc/u · layout","summary":"Builds a `repeat(...)` track-list value string for `u.gridTemplate()`'s `columns`/`rows` options, or any `grid-template-columns`/`-rows` use, since track sizing varies too continuously for a named scale to usefully cover."},{"href":"/api/u/resize","title":"resize","page":"resize","section":"@sdxc/u · layout","summary":"Applies `resize`, controlling which axes a user can drag the element's resize handle along."},{"href":"/api/u/self","title":"align-self (self)","page":"align-self (self)","section":"@sdxc/u · layout","summary":"Sets `align-self`."},{"href":"/api/u/shrink","title":"flex-shrink (shrink)","page":"flex-shrink (shrink)","section":"@sdxc/u · layout","summary":"Applies `flex-shrink`."},{"href":"/api/u/spacer","title":"flex (spacer)","page":"flex (spacer)","section":"@sdxc/u · layout","summary":"A flexible spacer: grows and shrinks to fill whatever room is left in a flex container, pushing siblings on either side of it apart — a toolbar's trailing action pinned to the end, or two row groups split to the edges."},{"href":"/api/u/sticky","title":"position (sticky)","page":"position (sticky)","section":"@sdxc/u · layout","summary":"Sets `position: sticky`."},{"href":"/api/u/virtualize","title":"virtualize","page":"virtualize","section":"@sdxc/u · layout","summary":"Applies `content-visibility: auto` with `contain-intrinsic-size` so the browser skips rendering off-screen rows in a long list or table, using `intrinsicSize` as a placeholder so the scrollbar doesn't jump on mount."},{"href":"/api/u/vstack","title":"vstack","page":"vstack","section":"@sdxc/u · layout","summary":"A vertical flex stack."},{"href":"/api/u/zstack","title":"zstack","page":"zstack","section":"@sdxc/u · layout","summary":"A grid-overlay stack for layering children on top of each other."},{"href":"/api/u/clip","title":"overflow (clip)","page":"overflow (clip)","section":"@sdxc/u · overflow","summary":"Applies `overflow: clip`, the modern alternative to `overflow: hidden`."},{"href":"/api/u/divide","title":"divide","page":"divide","section":"@sdxc/u · overflow","summary":"Applies a divider border between every child except the last, along `axis`."},{"href":"/api/u/noScrollbar","title":"noScrollbar","page":"noScrollbar","section":"@sdxc/u · overflow","summary":"Hides the scrollbar across Chrome/Safari, legacy Edge, and Firefox, while the element stays scrollable by wheel, touch, keyboard, and script."},{"href":"/api/u/overflow","title":"overflow","page":"overflow","section":"@sdxc/u · overflow","summary":"Applies `overflow`, defaulting to `\"hidden\"`."},{"href":"/api/u/overflowAnchor","title":"overflow-anchor (overflowAnchor)","page":"overflow-anchor (overflowAnchor)","section":"@sdxc/u · overflow","summary":"Applies `overflow-anchor`, the browser's choice of which element holds the scroll position steady as content above it resizes."},{"href":"/api/u/overflowBlock","title":"overflow-block (overflowBlock)","page":"overflow-block (overflowBlock)","section":"@sdxc/u · overflow","summary":"Applies `overflow-block`, independently of the inline axis."},{"href":"/api/u/overflowInline","title":"overflow-inline (overflowInline)","page":"overflow-inline (overflowInline)","section":"@sdxc/u · overflow","summary":"Applies `overflow-inline`, independently of the block axis."},{"href":"/api/u/overflowX","title":"overflow-x (overflowX)","page":"overflow-x (overflowX)","section":"@sdxc/u · overflow","summary":"Applies `overflow-x`, independently of the block axis."},{"href":"/api/u/overflowY","title":"overflow-y (overflowY)","page":"overflow-y (overflowY)","section":"@sdxc/u · overflow","summary":"Applies `overflow-y`, independently of the inline axis."},{"href":"/api/u/overscrollBehavior","title":"overscroll-behavior (overscrollBehavior)","page":"overscroll-behavior (overscrollBehavior)","section":"@sdxc/u · overflow","summary":"Applies `overscroll-behavior`, defaulting to `\"contain\"`: a scroll past the end stays inside this element and the platform affordance — iOS rubber-banding, Android pull-to-refresh — survives."},{"href":"/api/u/scroll","title":"scroll","page":"scroll","section":"@sdxc/u · overflow","summary":"Turns the element into a scroll container that reveals a scrollbar only where content actually overflows the given axis, defaulting to `\"both\"`."},{"href":"/api/u/scrollbarColor","title":"scrollbar-color (scrollbarColor)","page":"scrollbar-color (scrollbarColor)","section":"@sdxc/u · overflow","summary":"Themes a scroll container's scrollbar via the standard `scrollbar-color` property, supported by Firefox and modern Chromium alike through plain CSS."},{"href":"/api/u/scrollbarGutter","title":"scrollbar-gutter (scrollbarGutter)","page":"scrollbar-gutter (scrollbarGutter)","section":"@sdxc/u · overflow","summary":"Applies `scrollbar-gutter`, defaulting to `\"stable\"`, so the container is already the size it settles at and content holds its position the moment a scrollbar appears."},{"href":"/api/u/scrollBehavior","title":"scroll-behavior (scrollBehavior)","page":"scroll-behavior (scrollBehavior)","section":"@sdxc/u · overflow","summary":"Applies `scroll-behavior`, defaulting to `\"smooth\"`, so anchor jumps and programmatic scrolls animate."},{"href":"/api/u/scrollMargin","title":"scroll-margin (scrollMargin)","page":"scroll-margin (scrollMargin)","section":"@sdxc/u · overflow","summary":"Applies logical `scroll-margin` on a scroll item, growing the box the container aligns when it snaps to this item or an anchor jump targets it, so a sticky header clears only the items that need the extra room."},{"href":"/api/u/scrollPadding","title":"scroll-padding (scrollPadding)","page":"scroll-padding (scrollPadding)","section":"@sdxc/u · overflow","summary":"Applies logical `scroll-padding` so a scroll snap position or anchor jump lands clear of a sticky header — set it to the header's height."},{"href":"/api/u/scrollSnapAlign","title":"scroll-snap-align (scrollSnapAlign)","page":"scroll-snap-align (scrollSnapAlign)","section":"@sdxc/u · overflow","summary":"Applies `scroll-snap-align`, defaulting to `\"start\"`, on the snap *items* — the children of the scroll container — while `u.scrollSnapType()` goes on the *container*; swapping the two silently disables snapping either way."},{"href":"/api/u/scrollSnapStop","title":"scroll-snap-stop (scrollSnapStop)","page":"scroll-snap-stop (scrollSnapStop)","section":"@sdxc/u · overflow","summary":"Applies `scroll-snap-stop` to a snap item, defaulting to `\"always\"` so a fast flick rests on the item and one swipe advances exactly one page."},{"href":"/api/u/scrollSnapType","title":"scroll-snap-type (scrollSnapType)","page":"scroll-snap-type (scrollSnapType)","section":"@sdxc/u · overflow","summary":"Applies `scroll-snap-type` to a scroll container, defaulting to `\"inline mandatory\"`, the paged-carousel case; pass `\"none\"` to disable snapping."},{"href":"/api/u/thinScrollbar","title":"thinScrollbar","page":"thinScrollbar","section":"@sdxc/u · overflow","summary":"Requests a thin scrollbar that reserves its gutter up front, so layout stays put whether or not the scrollbar is showing."},{"href":"/api/u/at","title":"at","page":"at","section":"@sdxc/u · responsive","summary":"`size` compares against the nearest ancestor with `container-type` set."},{"href":"/api/u/atMax","title":"atMax","page":"atMax","section":"@sdxc/u · responsive","summary":"The `max-width` counterpart to at: applies while the nearest container's inline size is at most `size`."},{"href":"/api/u/atQuery","title":"atQuery","page":"atQuery","section":"@sdxc/u · responsive","summary":"The raw escape hatch for expressing a container condition directly — querying `height`, `orientation`, a style feature, or combining several with `and`/`or`."},{"href":"/api/u/contrastLess","title":"contrastLess","page":"contrastLess","section":"@sdxc/u · responsive","summary":"Sugar over `media(\"(prefers-contrast: less)\", input)`."},{"href":"/api/u/contrastMore","title":"contrastMore","page":"contrastMore","section":"@sdxc/u · responsive","summary":"Sugar over `media(\"(prefers-contrast: more)\", input)`."},{"href":"/api/u/dark","title":"dark","page":"dark","section":"@sdxc/u · responsive","summary":"Sugar over `scheme(\"dark\", input)`."},{"href":"/api/u/forcedColors","title":"forcedColors","page":"forcedColors","section":"@sdxc/u · responsive","summary":"Sugar over `media(\"(forced-colors: active)\", input)`."},{"href":"/api/u/light","title":"light","page":"light","section":"@sdxc/u · responsive","summary":"Sugar over `scheme(\"light\", input)`."},{"href":"/api/u/media","title":"media","page":"media","section":"@sdxc/u · responsive","summary":"The explicit escape hatch for a real viewport/feature media query, for a rule that must read the viewport or a user preference."},{"href":"/api/u/motionReduce","title":"motionReduce","page":"motionReduce","section":"@sdxc/u · responsive","summary":"Sugar over `media(\"(prefers-reduced-motion: reduce)\", input)`."},{"href":"/api/u/motionSafe","title":"motionSafe","page":"motionSafe","section":"@sdxc/u · responsive","summary":"Sugar over `media(\"(prefers-reduced-motion: no-preference)\", input)`."},{"href":"/api/u/print","title":"print","page":"print","section":"@sdxc/u · responsive","summary":"Sugar over `media(\"print\", input)`."},{"href":"/api/u/scheme","title":"scheme","page":"scheme","section":"@sdxc/u · responsive","summary":"Applies the given utilities under both the forced `.dark`/`.light` class and the system-preference `.system` class behind `prefers-color-scheme`, so both stay in sync."},{"href":"/api/u/startingStyle","title":"startingStyle","page":"startingStyle","section":"@sdxc/u · responsive","summary":"Wraps utilities in `@starting-style`, defining the values a transition animates from — for entry fade/scale-ins on dialogs, tooltips, popovers, and other elements starting `display: none` or in the top layer."},{"href":"/api/u/supports","title":"supports","page":"supports","section":"@sdxc/u · responsive","summary":"A feature-query wrapper, applying the given utilities only when the browser supports `query` — progressive enhancement for CSS features without a reliable fallback path other than \"don't apply this at all\"."},{"href":"/api/u/transparencyReduce","title":"transparencyReduce","page":"transparencyReduce","section":"@sdxc/u · responsive","summary":"Sugar over `media(\"(prefers-reduced-transparency: reduce)\", input)`."},{"href":"/api/u/transparencySafe","title":"transparencySafe","page":"transparencySafe","section":"@sdxc/u · responsive","summary":"Sugar over `media(\"(prefers-reduced-transparency: no-preference)\", input)`, the same gate `u.translucent()` uses internally."},{"href":"/api/u/aspect","title":"aspect-ratio (aspect)","page":"aspect-ratio (aspect)","section":"@sdxc/u · size","summary":"Applies `aspect-ratio`, either from a width/height pair or one of the named ratios in `AspectRatioName`."},{"href":"/api/u/bleed","title":"margin-inline (bleed)","page":"margin-inline (bleed)","section":"@sdxc/u · size","summary":"Pulls the host past its container's inline padding by `value` on both sides via a negative inline margin — for a full-bleed image or divider inside an otherwise padded section, composing `u.mi()` with a negated length."},{"href":"/api/u/bs","title":"block-size (bs)","page":"block-size (bs)","section":"@sdxc/u · size","summary":"Applies `block-size` — the logical height, which is the physical width in a vertical writing mode."},{"href":"/api/u/circle","title":"circle","page":"circle","section":"@sdxc/u · size","summary":"A shape pattern for circular boxes: a square aspect ratio plus full radius — an avatar frame, a status dot, an icon badge."},{"href":"/api/u/corner","title":"corner","page":"corner","section":"@sdxc/u · size","summary":"The primitive `corner-shape` utility."},{"href":"/api/u/fit","title":"object-fit (fit)","page":"object-fit (fit)","section":"@sdxc/u · size","summary":"Applies `object-fit`, shaping how a container-sized media element (`img`, `video`) fills its box."},{"href":"/api/u/height","title":"height","page":"height","section":"@sdxc/u · size","summary":"Applies the physical `height` property, keeping element size tied to the viewport axis across writing-modes and directions."},{"href":"/api/u/is","title":"inline-size (is)","page":"inline-size (is)","section":"@sdxc/u · size","summary":"Applies `inline-size` — the logical width, which is the physical height in a vertical writing mode."},{"href":"/api/u/m","title":"margin (m)","page":"margin (m)","section":"@sdxc/u · size","summary":"Applies logical margin using the spacing scale, `\"auto\"`, or a raw CSS length."},{"href":"/api/u/marginLeft","title":"margin-left (marginLeft)","page":"margin-left (marginLeft)","section":"@sdxc/u · size","summary":"Sets the physical `margin-left` property directly, pinned to the fixed left edge regardless of writing direction."},{"href":"/api/u/marginRight","title":"margin-right (marginRight)","page":"margin-right (marginRight)","section":"@sdxc/u · size","summary":"Sets the physical `margin-right` property directly, pinned to the fixed right edge regardless of writing direction."},{"href":"/api/u/maxBs","title":"max-block-size (maxBs)","page":"max-block-size (maxBs)","section":"@sdxc/u · size","summary":"Applies `max-block-size`."},{"href":"/api/u/maxHeight","title":"max-height (maxHeight)","page":"max-height (maxHeight)","section":"@sdxc/u · size","summary":"Applies the physical `max-height` property, for components whose sizing tracks the physical viewport axis."},{"href":"/api/u/maxIs","title":"max-inline-size (maxIs)","page":"max-inline-size (maxIs)","section":"@sdxc/u · size","summary":"Applies `max-inline-size`."},{"href":"/api/u/maxWidth","title":"max-width (maxWidth)","page":"max-width (maxWidth)","section":"@sdxc/u · size","summary":"Applies the physical `max-width` property, for elements whose sizing is genuinely tied to the physical viewport axis."},{"href":"/api/u/mb","title":"margin-block (mb)","page":"margin-block (mb)","section":"@sdxc/u · size","summary":"Applies `margin-block`."},{"href":"/api/u/mbe","title":"margin-block-end (mbe)","page":"margin-block-end (mbe)","section":"@sdxc/u · size","summary":"Applies `margin-block-end` — the trailing block edge, the bottom edge in a horizontal writing mode."},{"href":"/api/u/mbs","title":"margin-block-start (mbs)","page":"margin-block-start (mbs)","section":"@sdxc/u · size","summary":"Applies `margin-block-start` — the leading block edge, the top edge in a horizontal writing mode."},{"href":"/api/u/mi","title":"margin-inline (mi)","page":"margin-inline (mi)","section":"@sdxc/u · size","summary":"Applies `margin-inline`."},{"href":"/api/u/mie","title":"margin-inline-end (mie)","page":"margin-inline-end (mie)","section":"@sdxc/u · size","summary":"Applies `margin-inline-end` — the trailing inline edge, which is the right edge in `ltr` and the left edge in `rtl`."},{"href":"/api/u/minBs","title":"min-block-size (minBs)","page":"min-block-size (minBs)","section":"@sdxc/u · size","summary":"Applies `min-block-size`."},{"href":"/api/u/minHeight","title":"min-height (minHeight)","page":"min-height (minHeight)","section":"@sdxc/u · size","summary":"Applies the physical `min-height` property."},{"href":"/api/u/minIs","title":"min-inline-size (minIs)","page":"min-inline-size (minIs)","section":"@sdxc/u · size","summary":"Applies `min-inline-size`."},{"href":"/api/u/minWidth","title":"min-width (minWidth)","page":"min-width (minWidth)","section":"@sdxc/u · size","summary":"Applies the physical `min-width` property, for elements whose sizing is tied to the physical viewport axis."},{"href":"/api/u/mis","title":"margin-inline-start (mis)","page":"margin-inline-start (mis)","section":"@sdxc/u · size","summary":"Applies `margin-inline-start` — the leading inline edge, which is the left edge in `ltr` and the right edge in `rtl`."},{"href":"/api/u/objectPosition","title":"object-position (objectPosition)","page":"object-position (objectPosition)","section":"@sdxc/u · size","summary":"Applies `object-position`, choosing which part of a replaced element's cropped content stays visible, keeping a subject's face in frame once `u.fit(\"cover\")` crops it."},{"href":"/api/u/p","title":"padding (p)","page":"padding (p)","section":"@sdxc/u · size","summary":"Applies logical padding using the spacing scale or a raw CSS length."},{"href":"/api/u/paddingLeft","title":"padding-left (paddingLeft)","page":"padding-left (paddingLeft)","section":"@sdxc/u · size","summary":"Applies the physical `padding-left` property, for padding pinned to a fixed, physical viewport edge — such as a safe-area-inset offset on a docked panel."},{"href":"/api/u/paddingRight","title":"padding-right (paddingRight)","page":"padding-right (paddingRight)","section":"@sdxc/u · size","summary":"Applies the physical `padding-right` property, for padding pinned to a fixed, physical viewport edge — such as a safe-area-inset offset on a docked panel."},{"href":"/api/u/pb","title":"padding-block (pb)","page":"padding-block (pb)","section":"@sdxc/u · size","summary":"Applies `padding-block`."},{"href":"/api/u/pbe","title":"padding-block-end (pbe)","page":"padding-block-end (pbe)","section":"@sdxc/u · size","summary":"Applies `padding-block-end` — the trailing block edge, the bottom edge in a horizontal writing mode."},{"href":"/api/u/pbs","title":"padding-block-start (pbs)","page":"padding-block-start (pbs)","section":"@sdxc/u · size","summary":"Applies `padding-block-start` — the leading block edge, the top edge in a horizontal writing mode."},{"href":"/api/u/pi","title":"padding-inline (pi)","page":"padding-inline (pi)","section":"@sdxc/u · size","summary":"Applies `padding-inline`."},{"href":"/api/u/pie","title":"padding-inline-end (pie)","page":"padding-inline-end (pie)","section":"@sdxc/u · size","summary":"Applies `padding-inline-end` — the trailing inline edge, which is the right edge in `ltr` and the left edge in `rtl`."},{"href":"/api/u/pis","title":"padding-inline-start (pis)","page":"padding-inline-start (pis)","section":"@sdxc/u · size","summary":"Applies `padding-inline-start` — the leading inline edge, which is the left edge in `ltr` and the right edge in `rtl`."},{"href":"/api/u/safeAreaPadding","title":"padding-bottom (safeAreaPadding)","page":"padding-bottom (safeAreaPadding)","section":"@sdxc/u · size","summary":"Pads the given physical `side` by its `env(safe-area-inset-{side})` value, falling back to `fallback` (`\"0px\"` by default) on platforms with no safe area to avoid."},{"href":"/api/u/squircle","title":"squircle","page":"squircle","section":"@sdxc/u · size","summary":"A shape pattern for continuous rounded corners: sets a radius, then refines it with `corner-shape` where supported, so every browser renders at least the plain rounded shape."},{"href":"/api/u/width","title":"width","page":"width","section":"@sdxc/u · size","summary":"Applies the physical `width` property, for an element whose sizing is tied to the physical viewport axis; `u.is()` (`inline-size`) covers sizing along the logical inline axis."},{"href":"/api/u/isolate","title":"isolation (isolate)","page":"isolation (isolate)","section":"@sdxc/u · stacking","summary":"Creates a new stacking context on the host element while preserving its layout, so a later `z-index` on this element (or a descendant) stays confined here, isolated from unrelated siblings outside it."},{"href":"/api/u/layer","title":"layer","page":"layer","section":"@sdxc/u · stacking","summary":"Composes isolate and z so a single call gets both a new stacking context and a stacking order."},{"href":"/api/u/z","title":"z-index (z)","page":"z-index (z)","section":"@sdxc/u · stacking","summary":"Sets the host element's `z-index` from a plain number."},{"href":"/api/u/active","title":"active","page":"active","section":"@sdxc/u · state","summary":"Sugar over `when(\"&:active\", input)`."},{"href":"/api/u/after","title":"after","page":"after","section":"@sdxc/u · state","summary":"Applies the given utilities to an element's `::after` pseudo-element."},{"href":"/api/u/aria","title":"aria","page":"aria","section":"@sdxc/u · state","summary":"Sugar over `when(...)` for an element's `aria-*` attribute selector: two args match the attribute present with any value — including `\"false\"` — while three args match a value exactly; pass `\"true\"` for the truthy case."},{"href":"/api/u/backdrop","title":"backdrop","page":"backdrop","section":"@sdxc/u · state","summary":"Applies the given utilities to a top-layer element's `::backdrop`, the layer the browser paints behind a `<dialog>` or popover to dim the page with no overlay, z-index, or scroll container; pairs with `u.open()`."},{"href":"/api/u/before","title":"before","page":"before","section":"@sdxc/u · state","summary":"Applies the given utilities to an element's `::before` pseudo-element."},{"href":"/api/u/checked","title":"checked","page":"checked","section":"@sdxc/u · state","summary":"Sugar over `when('&:checked, &[aria-checked=\"true\"]', input)`, matching both native checked controls and ARIA-checked custom widgets."},{"href":"/api/u/data","title":"data","page":"data","section":"@sdxc/u · state","summary":"Sugar over an element's own `data-*` attribute selector: matches `&[data-{attribute}]` (any value, including a bare boolean attribute) with no `value` argument, or `&[data-{attribute}=\"{value}\"]` with one."},{"href":"/api/u/detailsContent","title":"detailsContent","page":"detailsContent","section":"@sdxc/u · state","summary":"Applies the given utilities to a `<details>` element's `::details-content` pseudo-element, the region holding everything after the `<summary>`."},{"href":"/api/u/disabled","title":"disabled","page":"disabled","section":"@sdxc/u · state","summary":"Sugar over `when('&:disabled, &[aria-disabled=\"true\"]', input)`, applying the given utilities under both the native and ARIA disabled selectors."},{"href":"/api/u/focusVisible","title":"focusVisible","page":"focusVisible","section":"@sdxc/u · state","summary":"Sugar over `when(\"&:focus-visible\", input)`."},{"href":"/api/u/focusWithin","title":"focusWithin","page":"focusWithin","section":"@sdxc/u · state","summary":"Sugar over `when(\"&:focus-within\", input)`."},{"href":"/api/u/has","title":"has","page":"has","section":"@sdxc/u · state","summary":"Sugar over `when(\"&:has({selector})\", input)`."},{"href":"/api/u/hasSibling","title":"hasSibling","page":"hasSibling","section":"@sdxc/u · state","summary":"Sugar over `when(\"&:has(~ {selector})\", input)`, styling an element by a sibling's state."},{"href":"/api/u/hover","title":"hover","page":"hover","section":"@sdxc/u · state","summary":"Sugar over `when(\"&:hover\", input)`."},{"href":"/api/u/indeterminate","title":"indeterminate","page":"indeterminate","section":"@sdxc/u · state","summary":"Matches indeterminate checkboxes and ARIA mixed-state widgets, painting a third visual state; it also matches radios in an unselected group and valueless `<progress>`, so scope it to the control you mean."},{"href":"/api/u/invalid","title":"invalid","page":"invalid","section":"@sdxc/u · state","summary":"Waits for user interaction before flagging a field invalid, matching `:user-invalid` alongside the ARIA fallback so validation only surfaces once it is meaningful to the person filling in the field."},{"href":"/api/u/marker","title":"marker","page":"marker","section":"@sdxc/u · state","summary":"Applies the given utilities to a list item's marker or a `<summary>` disclosure triangle via `::marker`; only `color`, `font-*`, and `content` apply."},{"href":"/api/u/not","title":"not","page":"not","section":"@sdxc/u · state","summary":"A selector wrapper for negated state: wraps `selector` in `:not(...)` and applies the given utilities there."},{"href":"/api/u/open","title":"open","page":"open","section":"@sdxc/u · state","summary":"Sugar over `when(\"&[open], &:popover-open\", input)`, matching both the `<details>`/`<dialog>` `open` attribute and the Popover API's `:popover-open` pseudo-class."},{"href":"/api/u/placeholder","title":"placeholder","page":"placeholder","section":"@sdxc/u · state","summary":"Styles an input or textarea's `::placeholder` text."},{"href":"/api/u/placeholderShown","title":"placeholderShown","page":"placeholderShown","section":"@sdxc/u · state","summary":"Sugar over `when(\"&:placeholder-shown\", input)`, matching an input or textarea while it is empty and therefore still showing its placeholder."},{"href":"/api/u/precededBy","title":"precededBy","page":"precededBy","section":"@sdxc/u · state","summary":"Sugar over `when(\":is({selector}) ~ &\", input)`, the backward-looking twin of `hasSibling()`."},{"href":"/api/u/readOnly","title":"readOnly","page":"readOnly","section":"@sdxc/u · state","summary":"Sugar over `when('&:read-only, &[aria-readonly=\"true\"]', input)`, matching native and ARIA read-only controls."},{"href":"/api/u/required","title":"required","page":"required","section":"@sdxc/u · state","summary":"Sugar over `when('&:required, &[aria-required=\"true\"]', input)`, matching required controls and widgets."},{"href":"/api/u/selection","title":"selection","page":"selection","section":"@sdxc/u · state","summary":"Applies utilities to the element's `::selection`; only `color`, `background-color`, `text-decoration`, and `text-shadow` take effect, and overriding the platform's contrast guarantee requires a high-contrast pair."},{"href":"/api/u/when","title":"when","page":"when","section":"@sdxc/u · state","summary":"The primitive selector wrapper every other state wrapper (`hover()`, `checked()`, ...) is sugar over."},{"href":"/api/u/where","title":"where","page":"where","section":"@sdxc/u · state","summary":"Sugar over `when(\"& :where({selector})\", input)`, targeting descendants of the host."},{"href":"/api/u/perspective","title":"perspective","page":"perspective","section":"@sdxc/u · transform","summary":"Sets how far the viewer is from the z=0 plane; without it, 3D rotation reads as a flat scale, not depth."},{"href":"/api/u/perspectiveOrigin","title":"perspective-origin (perspectiveOrigin)","page":"perspective-origin (perspectiveOrigin)","section":"@sdxc/u · transform","summary":"Moves the vanishing point that `u.perspective()` establishes, aiming the 3D effect off-centre; set it on the same parent element that carries `u.perspective()`."},{"href":"/api/u/rotate","title":"rotate","page":"rotate","section":"@sdxc/u · transform","summary":"Rotates the element in its own 2D plane."},{"href":"/api/u/rotateX","title":"rotateX","page":"rotateX","section":"@sdxc/u · transform","summary":"Rotates the element in 3D around its horizontal axis for a flip-card or page-turn effect."},{"href":"/api/u/rotateY","title":"rotateY","page":"rotateY","section":"@sdxc/u · transform","summary":"Rotates the element in 3D around its vertical axis — a flip-card or page-turn effect."},{"href":"/api/u/scale","title":"scale","page":"scale","section":"@sdxc/u · transform","summary":"Scales the element uniformly on both axes — sugar for setting `u.scaleX()` and `u.scaleY()` to the same factor in one call."},{"href":"/api/u/scaleProperty","title":"scale (scaleProperty)","page":"scale (scaleProperty)","section":"@sdxc/u · transform","summary":"Sets the standalone `scale` CSS property directly — distinct from `u.scale()`, which sets the `scale(...)` transform function through the composable `transform` mechanism; overwrites outright, matching its use."},{"href":"/api/u/scaleX","title":"scaleX","page":"scaleX","section":"@sdxc/u · transform","summary":"Scales the element along the horizontal axis only."},{"href":"/api/u/scaleY","title":"scaleY","page":"scaleY","section":"@sdxc/u · transform","summary":"Scales the element along the vertical axis only."},{"href":"/api/u/skewX","title":"skewX","page":"skewX","section":"@sdxc/u · transform","summary":"Skews the element along the horizontal axis."},{"href":"/api/u/skewY","title":"skewY","page":"skewY","section":"@sdxc/u · transform","summary":"Skews the element along the vertical axis."},{"href":"/api/u/transformOrigin","title":"transform-origin (transformOrigin)","page":"transform-origin (transformOrigin)","section":"@sdxc/u · transform","summary":"Sets the pivot point for every transform on the element."},{"href":"/api/u/transformStyle","title":"transform-style (transformStyle)","page":"transform-style (transformStyle)","section":"@sdxc/u · transform","summary":"Sets the standalone `transform-style` property outright on the **parent** of 3D-transformed children, since CSS defaults to `flat`; an `overflow`, `filter`, `mask`, or opacity below 1 on the element silently forces it back to `flat`."},{"href":"/api/u/translateProperty","title":"translate (translateProperty)","page":"translate (translateProperty)","section":"@sdxc/u · transform","summary":"Sets the standalone `translate` property outright, since at most one value is ever active at a time."},{"href":"/api/u/translateX","title":"translateX","page":"translateX","section":"@sdxc/u · transform","summary":"Translates the element along the inline axis using the spacing scale or a raw CSS length."},{"href":"/api/u/translateY","title":"translateY","page":"translateY","section":"@sdxc/u · transform","summary":"Translates the element along the block axis using the spacing scale or a raw CSS length."},{"href":"/api/u/balance","title":"text-wrap (balance)","page":"text-wrap (balance)","section":"@sdxc/u · typography","summary":"Balances line lengths across a wrapped block, best suited to short text such as headings, since browsers cap balancing to a small number of lines."},{"href":"/api/u/font","title":"font-family (font)","page":"font-family (font)","section":"@sdxc/u · typography","summary":"Applies `font-family` from the named font scale (`sans`, `serif`, `mono`, or an app-extended name) via `var(--ui-font-{name}, fallback)`."},{"href":"/api/u/fontSize","title":"font-size (fontSize)","page":"font-size (fontSize)","section":"@sdxc/u · typography","summary":"Applies `font-size` from the named text scale (`xs` through `9xl`, or an app-extended name), resolving the same token as `u.text()`'s font-size half but touching only `font-size`, leaving line-height fully caller-set."},{"href":"/api/u/fontVariantNumeric","title":"font-variant-numeric (fontVariantNumeric)","page":"font-variant-numeric (fontVariantNumeric)","section":"@sdxc/u · typography","summary":"Sets `font-variant-numeric`; `u.tabularNums()` covers the common tabular-nums case and shares the same declaration."},{"href":"/api/u/hyphens","title":"hyphens","page":"hyphens","section":"@sdxc/u · typography","summary":"Lets long words break with a hyphen instead of forcing the line short."},{"href":"/api/u/leading","title":"line-height (leading)","page":"line-height (leading)","section":"@sdxc/u · typography","summary":"Applies `line-height`."},{"href":"/api/u/lineClamp","title":"lineClamp","page":"lineClamp","section":"@sdxc/u · typography","summary":"Truncates text via the `-webkit-line-clamp` trick."},{"href":"/api/u/nowrap","title":"white-space (nowrap)","page":"white-space (nowrap)","section":"@sdxc/u · typography","summary":"Prevents text from wrapping onto multiple lines, letting it overflow its box instead."},{"href":"/api/u/overflowWrap","title":"overflow-wrap (overflowWrap)","page":"overflow-wrap (overflowWrap)","section":"@sdxc/u · typography","summary":"Applies `overflow-wrap`, breaking a word only when it would otherwise overflow a bounded inline size, while ordinary text keeps its normal break points — ideal for a long URL, hash, or identifier in a narrow column."},{"href":"/api/u/pretty","title":"text-wrap (pretty)","page":"text-wrap (pretty)","section":"@sdxc/u · typography","summary":"Avoids leaving a short orphan word alone on the last line of a wrapped block, scaling to long-form body copy since browsers don't cap how many lines it applies to."},{"href":"/api/u/tabSize","title":"tab-size (tabSize)","page":"tab-size (tabSize)","section":"@sdxc/u · typography","summary":"Applies `tab-size`."},{"href":"/api/u/tabularNums","title":"font-variant-numeric (tabularNums)","page":"font-variant-numeric (tabularNums)","section":"@sdxc/u · typography","summary":"Applies `font-variant-numeric: tabular-nums`, so digits render at a fixed width instead of their proportional metrics — a running total, countdown, or one-time-code field reads without its layout shifting as digits change."},{"href":"/api/u/text","title":"text","page":"text","section":"@sdxc/u · typography","summary":"Applies `font-size` and its paired `line-height` from the named text scale through matching `var(--ui-text-*)` / `var(--ui-leading-*)` properties, so an extended name inherits a sensible default leading before defining one."},{"href":"/api/u/textAlign","title":"text-align (textAlign)","page":"text-align (textAlign)","section":"@sdxc/u · typography","summary":"Applies `text-align` using the logical `start`/`end` keywords so alignment flips automatically under `dir=\"rtl\"`."},{"href":"/api/u/textDecoration","title":"text-decoration-line (textDecoration)","page":"text-decoration-line (textDecoration)","section":"@sdxc/u · typography","summary":"Applies `text-decoration-line` from a bare value, or sets only the given keys from a text-decoration options object."},{"href":"/api/u/textTransform","title":"text-transform (textTransform)","page":"text-transform (textTransform)","section":"@sdxc/u · typography","summary":"Applies `text-transform`."},{"href":"/api/u/tracking","title":"letter-spacing (tracking)","page":"letter-spacing (tracking)","section":"@sdxc/u · typography","summary":"Applies `letter-spacing` from the named tracking scale, resolving through `var(--ui-tracking-{name}, fallback)` so the scale works before an app defines the variable; any other string is treated as a raw `letter-spacing` value."},{"href":"/api/u/truncate","title":"truncate","page":"truncate","section":"@sdxc/u · typography","summary":"Truncates single-line text with an ellipsis once it overflows its box; requires a bounded inline size (`max-inline-size`, a flex/grid item with `min-inline-size: 0`, or similar) or there is nothing to overflow against."},{"href":"/api/u/type","title":"type","page":"type","section":"@sdxc/u · typography","summary":"Combines text's `font-size`/`line-height` pair with the base sans font family, always opinionating the style to `sans`."},{"href":"/api/u/verticalAlign","title":"vertical-align (verticalAlign)","page":"vertical-align (verticalAlign)","section":"@sdxc/u · typography","summary":"Applies `vertical-align`, e.g."},{"href":"/api/u/weight","title":"font-weight (weight)","page":"font-weight (weight)","section":"@sdxc/u · typography","summary":"Applies `font-weight`."},{"href":"/api/u/whiteSpace","title":"white-space (whiteSpace)","page":"white-space (whiteSpace)","section":"@sdxc/u · typography","summary":"Applies `white-space`; also written by `u.nowrap()`, `u.truncate()`, and `u.visuallyHidden()`, so pick one."},{"href":"/api/u/wordBreak","title":"word-break (wordBreak)","page":"word-break (wordBreak)","section":"@sdxc/u · typography","summary":"Applies `word-break`."},{"href":"/api/ui/theming","title":"Theming","page":"Theming","section":"@sdxc/ui · Components","summary":"Every theme variable the catalogue reads, and the two schemes that answer them."},{"href":"/api/ui/accordion","title":"Accordion","page":"Accordion","section":"@sdxc/ui · Components","summary":"A set of expand/collapse sections built on Disclosure, stacked into one divider-separated list."},{"href":"/api/ui/alert","title":"Alert","page":"Alert","section":"@sdxc/ui · Components","summary":"An inline status message rendered as a bordered, tinted panel, colored by one of five semantic tones and announced to assistive technology through `role=\"alert\"` plus a configurable `aria-live` politeness."},{"href":"/api/ui/alert-dialog","title":"AlertDialog","page":"AlertDialog","section":"@sdxc/ui · Components","summary":"An interruptive modal surface that demands an explicit response before a page continues — confirming a destructive action, surfacing a blocking error — built on the native `<dialog>` host of Dialog, widened for its two-button layout and sealed against light dismiss."},{"href":"/api/ui/aspect-ratio","title":"AspectRatio","page":"AspectRatio","section":"@sdxc/ui · Components","summary":"A layout primitive that locks its host to a fixed width-to-height ratio, clipping whatever content it wraps so the box keeps its shape regardless of the content's own intrinsic size."},{"href":"/api/ui/attachment","title":"Attachment","page":"Attachment","section":"@sdxc/ui · Components","summary":"A compound card presenting one attached file or image — media preview, name, supporting details, actions — plus a horizontally scrolling row for several cards side by side."},{"href":"/api/ui/avatar","title":"Avatar","page":"Avatar","section":"@sdxc/ui · Components","summary":"A person's or entity's picture rendered as a fixed-size, fully circular host stacking an image layer, an initials fallback, and an optional corner status badge, plus a way to overlap several instances into one group with a trailing overflow count."},{"href":"/api/ui/badge","title":"Badge","page":"Badge","section":"@sdxc/ui · Components","summary":"A compact pill communicating a short status, label, or count inline with surrounding content."},{"href":"/api/ui/breadcrumbs","title":"Breadcrumbs","page":"Breadcrumbs","section":"@sdxc/ui · Components","summary":"A trail of links marking the page's position within a hierarchy of parent sections, composing a `<nav>` root, an `<ol>` list, and `<li>` items around Breadcrumbs.Link, a restyled Link."},{"href":"/api/ui/bubble","title":"Bubble","page":"Bubble","section":"@sdxc/ui · Components","summary":"The framed message surface inside a conversational row's content slot, sized to its own content up to a share of the row's width."},{"href":"/api/ui/button","title":"Button","page":"Button","section":"@sdxc/ui · Components","summary":"An interactive control for a single, immediate action — submitting a form, triggering a command, opening a dialog."},{"href":"/api/ui/calendar","title":"Calendar","page":"Calendar","section":"@sdxc/ui · Components","summary":"A month-grid calendar surface composed from a navigable header and a native `<table>` of day cells, styled through the platform's own semantics."},{"href":"/api/ui/card","title":"Card","page":"Card","section":"@sdxc/ui · Components","summary":"A bounded container grouping a header, body content, and footer actions into one ring-edged, softly lifted panel tinted by a semantic color role."},{"href":"/api/ui/carousel","title":"Carousel","page":"Carousel","section":"@sdxc/ui · Components","summary":"A horizontally scrolling collection of slides riding native CSS scroll snap, so swiping or scrolling advances between slides with no script in the baseline."},{"href":"/api/ui/chart","title":"Chart","page":"Chart","section":"@sdxc/ui · Components","summary":"The `Chart` namespace's compound parts, covering Cartesian series (Chart, Chart.Line, Chart.Area, Chart.Bar) and the independent Chart.Pie root, each pairing with Chart.Legend for a script-free series switcher and Chart.Tooltip for a richer hover surface."},{"href":"/api/ui/checkbox","title":"Checkbox","page":"Checkbox","section":"@sdxc/ui · Components","summary":"A styled native checkbox: an `<input type=\"checkbox\">` paired with a decorative glyph box that renders its check or dash mark purely from the input's own state, wrapped in a `<label>` so clicking or tapping anywhere in the row — box, glyph, or label text alike — toggles the control."},{"href":"/api/ui/checkbox-group","title":"CheckboxGroup","page":"CheckboxGroup","section":"@sdxc/ui · Components","summary":"A landmark grouping independently toggled checkbox controls into one related set: a `role=\"group\"` host laying children out in a column, or a row when `orientation` is `\"horizontal\"`."},{"href":"/api/ui/color-area","title":"ColorArea","page":"ColorArea","section":"@sdxc/ui · Components","summary":"A two-dimensional saturation/brightness picking square for a given hue, built from two overlaid native `<input type=\"range\">` elements — one horizontal for saturation, one rotated vertical for brightness — whose native thumbs, each reshaped into a thin line, cross at the picked point."},{"href":"/api/ui/color-field","title":"ColorField","page":"ColorField","section":"@sdxc/ui · Components","summary":"A labeled, described, and validated color field in one call: every id and `aria-describedby` relationship comes from this instance's own stable identifier, so the composed parts stay associated on their own."},{"href":"/api/ui/color-picker","title":"ColorPicker","page":"ColorPicker","section":"@sdxc/ui · Components","summary":"A labeled color field composing ColorField's plain fallback with an optional ColorPicker.Group trigger row and ColorPicker.Dialog picking surface swapped in via `children`."},{"href":"/api/ui/color-slider","title":"ColorSlider","page":"ColorSlider","section":"@sdxc/ui · Components","summary":"A single-channel color control on a native `<input type=\"range\">`, pairing a track painting the channel's gradient with a thumb reporting the current value and an `<output>` for its formatted display."},{"href":"/api/ui/color-swatch","title":"ColorSwatch","page":"ColorSwatch","section":"@sdxc/ui · Components","summary":"A static preview box rendering one color value as a filled, shaped swatch, backed by a fixed checkerboard so a translucent value always reads correctly against whatever sits behind it on the page rather than blending invisibly away."},{"href":"/api/ui/color-swatch-picker","title":"ColorSwatchPicker","page":"ColorSwatchPicker","section":"@sdxc/ui · Components","summary":"A set of mutually exclusive color options built from native `<input type=\"radio\">` controls sharing one grouping name, rendered as a `role=\"radiogroup\"` host wrapping ColorSwatchPicker.Swatch instances styled from each input's own `:checked` state."},{"href":"/api/ui/color-wheel","title":"ColorWheel","page":"ColorWheel","section":"@sdxc/ui · Components","summary":"A circular hue picker."},{"href":"/api/ui/combobox","title":"ComboBox","page":"ComboBox","section":"@sdxc/ui · Components","summary":"A single-line text control paired with a native list of suggested values: a ComboBox.Group row housing the ComboBox.Input control and a trailing ComboBox.Button disclosure glyph, all stacked beneath a caption or above supporting copy in a single column with a small gap."},{"href":"/api/ui/command","title":"Command","page":"Command","section":"@sdxc/ui · Components","summary":"A bordered panel for searching and choosing among a list of actions: Command.Input holds the query row, Command.List scrolls through Command.Item rows, and Command.Empty holds a message for when nothing matches."},{"href":"/api/ui/confirm","title":"Confirm","page":"Confirm","section":"@sdxc/ui · Components","summary":"A convenience wrapper composing a two-control confirmation prompt in one call: an AlertDialog panel prefilled with a heading, an optional supporting passage, and a cancel/confirm control pair, so a single consequential decision needs no compound assembly of its own."},{"href":"/api/ui/context-menu","title":"ContextMenu","page":"ContextMenu","section":"@sdxc/ui · Components","summary":"A menu surface that opens at a right-click's pointer position, composing Menu's popover styling and `role=\"menu\"` wiring directly so its rows read and behave exactly like a standard menu's."},{"href":"/api/ui/date-field","title":"DateField","page":"DateField","section":"@sdxc/ui · Components","summary":"A convenience wrapper composing a labeled, described, and validated date field in one call: a caption through Label, a native `<input type=\"date\">` styled through Input, an optional supporting passage through Description, and an optional validation message through FieldError."},{"href":"/api/ui/date-picker","title":"DatePicker","page":"DatePicker","section":"@sdxc/ui · Components","summary":"A labeled date field built on DateField, with a DatePicker.Group row for composing more than one field into a single control."},{"href":"/api/ui/date-range-picker","title":"DateRangePicker","page":"DateRangePicker","section":"@sdxc/ui · Components","summary":"A paired-field date range control built on DateField — independent start-date and end-date fields, each fully labeled, described, and validated on its own — with a DateRangePicker.Group row for joining the two into one control."},{"href":"/api/ui/description","title":"Description","page":"Description","section":"@sdxc/ui · Components","summary":"A short passage of supporting copy beneath a form control, styled at the library's default text size and the neutral muted foreground color."},{"href":"/api/ui/dialog","title":"Dialog","page":"Dialog","section":"@sdxc/ui · Components","summary":"A modal surface built on the native `<dialog>` element, opened and closed declaratively through Invoker Commands (`commandfor`/`command`) instead of a JavaScript-tracked open state."},{"href":"/api/ui/disclosure","title":"Disclosure","page":"Disclosure","section":"@sdxc/ui · Components","summary":"A single expand/collapse section built on the native `<details>` and `<summary>` elements, so the show/hide state, keyboard handling, and find-in-page behavior all come from the platform itself."},{"href":"/api/ui/drawer","title":"Drawer","page":"Drawer","section":"@sdxc/ui · Components","summary":"A preset of Dialog docked flush against one physical edge of the viewport, sized to fill that edge, sliding into place from it on open and fading out with a short drift toward it on close."},{"href":"/api/ui/drop-indicator","title":"DropIndicator","page":"DropIndicator","section":"@sdxc/ui · Components","summary":"A thin bar rendered in the gap between two items of a reorderable list, marking where a dragged item will land."},{"href":"/api/ui/drop-zone","title":"DropZone","page":"DropZone","section":"@sdxc/ui · Components","summary":"A styled drop target for files: a dashed, centered surface wrapping a native `<input type=\"file\">`, so picking a file through the platform's own file picker works the moment the markup renders, with no script involved."},{"href":"/api/ui/empty","title":"Empty","page":"Empty","section":"@sdxc/ui · Components","summary":"A placeholder for a section that currently has nothing to show — a dashed-bordered panel that composes an icon, a title, a description, and an action into one empty-state layout."},{"href":"/api/ui/field-error","title":"FieldError","page":"FieldError","section":"@sdxc/ui · Components","summary":"A native form field's validation message, styled at a small size in the danger foreground color."},{"href":"/api/ui/file-trigger","title":"FileTrigger","page":"FileTrigger","section":"@sdxc/ui · Components","summary":"A pressable surface that opens the platform's file picker, backed by a native `<input type=\"file\">` wrapped in a `<label>` so the platform itself handles the trigger-to-picker wiring."},{"href":"/api/ui/form","title":"Form","page":"Form","section":"@sdxc/ui · Components","summary":"The wrapper every multi-field layout starts from: a native `<form>` laying its children out in a single spaced column, and the point where a parsed validation result enters the tree."},{"href":"/api/ui/grid-list","title":"GridList","page":"GridList","section":"@sdxc/ui · Components","summary":"An interactive row list built from plain, already-ordered markup: each GridList.Item carries a stable key a paired selection, keyboard-navigation, or reorder behavior can read, while the list itself renders as a fully static document by default."},{"href":"/api/ui/group","title":"Group","page":"Group","section":"@sdxc/ui · Components","summary":"A visual and semantic wrapper binding a cluster of related controls into one unit — a text input paired with its clear button, a row of segmented buttons, a search field with a trailing submit action."},{"href":"/api/ui/header","title":"Header","page":"Header","section":"@sdxc/ui · Components","summary":"A small, muted section label rendered inside a native `<header>` element — the heading that introduces a group of related items inside a listbox, menu, or combobox section."},{"href":"/api/ui/heading","title":"Heading","page":"Heading","section":"@sdxc/ui · Components","summary":"A section title rendered inside the native heading element matching its semantic depth — `<h1>` through `<h6>` — styled at one fixed emphasis size regardless of which level it renders."},{"href":"/api/ui/heading-scope","title":"HeadingScope","page":"HeadingScope","section":"@sdxc/ui · Components","summary":"Establishes an ambient heading level read by nested headings and scopes, keeping a document outline sequential without passing a level by hand."},{"href":"/api/ui/highlight","title":"Highlight","page":"Highlight","section":"@sdxc/ui · Components","summary":"Text with the stretches a search matched marked: a run of `{ text, match }` segments rendered as one inline `<span>`, each matched stretch a native `<mark>` tinted through a semantic color role."},{"href":"/api/ui/hover-card","title":"HoverCard","page":"HoverCard","section":"@sdxc/ui · Components","summary":"A supplementary detail panel that appears beside a trigger on hover or keyboard focus — a user card beneath an @mention, a definition beneath a term."},{"href":"/api/ui/image-placeholder","title":"ImagePlaceholder","page":"ImagePlaceholder","section":"@sdxc/ui · Components","summary":"The shared foundation for a fixed-size image-with-fallback box — a user avatar, a brand logo, or any other picture that needs a graceful stand-in before it loads or when it's missing."},{"href":"/api/ui/input","title":"Input","page":"Input","section":"@sdxc/ui · Components","summary":"A single-line native form field for free text entry, rendered as a bordered, rounded `<input>` whose border, background, and focus ring read from a semantic color role."},{"href":"/api/ui/item","title":"Item","page":"Item","section":"@sdxc/ui · Components","summary":"A single-line content row composing a leading media slot, a title and description content slot, and a trailing action slot along one horizontally centered line — the shape a settings row, a notification list entry, or a file row all share."},{"href":"/api/ui/keyboard","title":"Keyboard","page":"Keyboard","section":"@sdxc/ui · Components","summary":"A keyboard-shortcut hint rendered inside a native `<kbd>` element, drawn as the key it names: a tinted, bordered cap sized to read beside the row's own text."},{"href":"/api/ui/label","title":"Label","page":"Label","section":"@sdxc/ui · Components","summary":"A caption for a form control, associated with its field either through the native `for`/`id` relationship (set `htmlFor` to the field's `id`) or by wrapping the control as a child."},{"href":"/api/ui/link","title":"Link","page":"Link","section":"@sdxc/ui · Components","summary":"A native anchor for inline navigation, always underlined so its affordance never rests on color alone, and colored through a semantic color role that also drives its focus ring and disabled state."},{"href":"/api/ui/link-button","title":"LinkButton","page":"LinkButton","section":"@sdxc/ui · Components","summary":"A navigation action styled to read as a button rather than inline text — \"View project\", \"Download\", a dialog's \"Cancel\" that also navigates away."},{"href":"/api/ui/listbox","title":"ListBox","page":"ListBox","section":"@sdxc/ui · Components","summary":"A run of selectable option rows sharing one native grouping name — each ListBox.Item pairs a visually hidden `<input type=\"radio\">` or `<input type=\"checkbox\">` with its own visible content, so every focus, keyboard, and form-submission semantic keeps coming from the platform itself."},{"href":"/api/ui/logo","title":"Logo","page":"Logo","section":"@sdxc/ui · Components","summary":"A brand mark rendered as a fixed-size, softly rounded host stacking an image layer, an initials fallback, and an optional corner status badge, plus a way to overlap several instances into one group with a trailing overflow count."},{"href":"/api/ui/marker","title":"Marker","page":"Marker","section":"@sdxc/ui · Components","summary":"An inline row calling out a small event between two message rows — a delivery status, a system note, a highlighted callout, or a labeled divider — colored by a semantic tone and shaped by a variant."},{"href":"/api/ui/menu","title":"Menu","page":"Menu","section":"@sdxc/ui · Components","summary":"A menu surface anchored to whatever invoker opens it, riding the same native Popover API Popover does, sized to its own content and padded around a compact stack of Menu.Item rows, Menu.Separator dividers, or a `Section`/`Header` pair grouping related rows together."},{"href":"/api/ui/menubar","title":"Menubar","page":"Menubar","section":"@sdxc/ui · Components","summary":"A horizontal row of top-level triggers modeled on a native application's menu bar, where each trigger opens its own dropdown built from the existing Menu component."},{"href":"/api/ui/message","title":"Message","page":"Message","section":"@sdxc/ui · Components","summary":"A single conversational turn in a message log: a row composing a bottom-anchored avatar, a header for the sender's identity and timing, a content slot for the message's own surface, and an optional footer for its actions."},{"href":"/api/ui/message-scroller","title":"MessageScroller","page":"MessageScroller","section":"@sdxc/ui · Components","summary":"A scrollable frame for a conversational message log."},{"href":"/api/ui/meter","title":"Meter","page":"Meter","section":"@sdxc/ui · Components","summary":"A styled native `<meter>` gauge paired with an optional value label, stacked in a single column so a caption can sit alongside the bar it measures."},{"href":"/api/ui/modal","title":"Modal","page":"Modal","section":"@sdxc/ui · Components","summary":"A pre-animated preset of Dialog: the same native `<dialog>` panel, its `::backdrop` treatment, and every compound part, with the panel's own pop-in and pop-out motion — a fade paired with a scale, entering from slightly smaller than rest and leaving faster, shrinking only halfway back and blurring softly as it fades — already wired onto the host."},{"href":"/api/ui/navigation-menu","title":"NavigationMenu","page":"NavigationMenu","section":"@sdxc/ui · Components","summary":"A row of top-level navigation triggers, each either a plain link or a button that opens a floating panel of related links."},{"href":"/api/ui/nav-link","title":"NavLink","page":"NavLink","section":"@sdxc/ui · Components","summary":"An inline text link for site navigation, colored through a semantic color role and underlined to read as a link among surrounding prose."},{"href":"/api/ui/number-field","title":"NumberField","page":"NumberField","section":"@sdxc/ui · Components","summary":"A numeric field pairing a native `<input type=\"number\">` control with a decrement and an increment button, all three sharing one bordered, rounded frame."},{"href":"/api/ui/otp-field","title":"OtpField","page":"OtpField","section":"@sdxc/ui · Components","summary":"A one-time-code field: a native `<input>` defaulting to a numeric virtual keyboard and the platform's SMS/email autofill hint for one-time codes, built on Input for its box, color, and interaction-state styling."},{"href":"/api/ui/overlay-arrow","title":"OverlayArrow","page":"OverlayArrow","section":"@sdxc/ui · Components","summary":"A small pointer glyph anchoring an overlay surface — a popover, a menu, a tooltip — visually back to the trigger it floats beside."},{"href":"/api/ui/pagination","title":"Pagination","page":"Pagination","section":"@sdxc/ui · Components","summary":"A navigation landmark for moving between pages of results, composing a `<nav>` root, an `<ul>` list, and `<li>` items around two interactive parts: Pagination.Link for page-number destinations and Pagination.Button for previous/next controls."},{"href":"/api/ui/popover","title":"Popover","page":"Popover","section":"@sdxc/ui · Components","summary":"A floating surface anchored to whatever element opened it, built entirely on the native Popover API: the host carries the `popover` attribute and opens through `popovertarget` or a Command Invoker (`commandfor`/ `command=\"toggle-popover\"`) elsewhere on the page, with no positioning logic running in script."},{"href":"/api/ui/progress-bar","title":"ProgressBar","page":"ProgressBar","section":"@sdxc/ui · Components","summary":"A styled native `<progress>` control paired with an optional value label, stacked in a single column so a caption can sit alongside the bar it describes."},{"href":"/api/ui/radio-group","title":"RadioGroup","page":"RadioGroup","section":"@sdxc/ui · Components","summary":"A set of mutually exclusive options built from native `<input type=\"radio\">` controls sharing one grouping name, rendered as a `role=\"radiogroup\"` host wrapping a run of RadioGroup.Radio instances."},{"href":"/api/ui/range-calendar","title":"RangeCalendar","page":"RangeCalendar","section":"@sdxc/ui · Components","summary":"A calendar surface for choosing a start and end date as one connected range, sharing every header, grid, and row part with Calendar and layering range position on top of its day cell."},{"href":"/api/ui/resizable","title":"Resizable","page":"Resizable","section":"@sdxc/ui · Components","summary":"A split-pane layout arranging Resizable.Panel and Resizable.Handle parts along a shared axis, each panel taking up its own declared share of the group's main axis and each handle between two panels reserving a fixed track across the cross axis."},{"href":"/api/ui/scroll-area","title":"ScrollArea","page":"ScrollArea","section":"@sdxc/ui · Components","summary":"A scrollable region wrapping long or overflowing content — a chat log, a table, a tall list — so it scrolls its own axis inside a bordered panel instead of pushing the surrounding page."},{"href":"/api/ui/search-field","title":"SearchField","page":"SearchField","section":"@sdxc/ui · Components","summary":"A single-line search field: a `<search>` landmark stacking a caption, a decorated control, and optional supporting or validation copy, composed from whatever compound parts a given field needs."},{"href":"/api/ui/section","title":"Section","page":"Section","section":"@sdxc/ui · Components","summary":"A grouping wrapper for a set of related items inside a listbox, menu, or combobox — a native `<section>` element carrying the small block-axis padding that sets one group apart from the next."},{"href":"/api/ui/select","title":"Select","page":"Select","section":"@sdxc/ui · Components","summary":"A native `<select>` styled as a bordered, rounded field and progressively upgraded with customizable-select rendering — a custom trigger button, a value slot mirroring the current selection, and richly styled options and groups — wherever the browser resolves `appearance: base-select`."},{"href":"/api/ui/selection-indicator","title":"SelectionIndicator","page":"SelectionIndicator","section":"@sdxc/ui · Components","summary":"A small marker that stays invisible, while still reserving its own layout slot, until the element carrying it is the current selection."},{"href":"/api/ui/sentinel-row","title":"SentinelRow","page":"SentinelRow","section":"@sdxc/ui · Components","summary":"A decorative sentinel row shared by every list-shaped compound component that renders a trailing loading placeholder: a `<div>` styled as centered, muted small text, sized to match its enclosing list's own row rhythm."},{"href":"/api/ui/separator","title":"Separator","page":"Separator","section":"@sdxc/ui · Components","summary":"A thin visual divider marking a boundary between two groups of content — a menu's sections, a toolbar's clusters, a page's regions."},{"href":"/api/ui/shared-element","title":"SharedElement","page":"SharedElement","section":"@sdxc/ui · Components","summary":"A plain host that carries a stable view-transition identity across separate page loads, so a same-origin, cross-document navigation morphs it from its old position, size, and appearance into its new one instead of replacing it outright."},{"href":"/api/ui/sheet","title":"Sheet","page":"Sheet","section":"@sdxc/ui · Components","summary":"An edge-docked panel that renders through Dialog — the same native `<dialog>` host, Invoker Commands, backdrop dimming, and missing-`id` dev warning — repositioned from a centered panel to a fixed inline-side column entirely through CSS keyed off a `data-side` attribute."},{"href":"/api/ui/shortcut-list","title":"ShortcutList","page":"ShortcutList","section":"@sdxc/ui · Components","summary":"The list a keyboard-shortcuts panel shows: a native `<dl>` pairing each action with the key caps that run it, laid out in two columns so every key lands on one vertical line and the list reads down that line instead of across ragged hints."},{"href":"/api/ui/sidebar","title":"Sidebar","page":"Sidebar","section":"@sdxc/ui · Components","summary":"An application shell's primary navigation rail, composed from a layout root, a collapsible rail, a main-content inset, and a family of group/menu/item parts for organizing links."},{"href":"/api/ui/skeleton","title":"Skeleton","page":"Skeleton","section":"@sdxc/ui · Components","summary":"A decorative loading placeholder rendered as a single static block, sized to stand in for the content it precedes and showing a still, inert silhouette while data loads."},{"href":"/api/ui/slider","title":"Slider","page":"Slider","section":"@sdxc/ui · Components","summary":"A single-value range control built on a native `<input type=\"range\">`, paired with a track that draws its own background rail and a live fill bar, plus an `<output>` for reporting the current value."},{"href":"/api/ui/spinner","title":"Spinner","page":"Spinner","section":"@sdxc/ui · Components","summary":"A busy indicator rendered as a rotating icon inside a `role=\"progressbar\"` host, colored by a semantic color role and sized by a size variant."},{"href":"/api/ui/switch","title":"Switch","page":"Switch","section":"@sdxc/ui · Components","summary":"A native checkbox styled and wired as an on/off switch: a pill-shaped track whose thumb slides from the inline-start edge to the inline-end edge when checked, tinting with the semantic primary color along the way."},{"href":"/api/ui/table","title":"Table","page":"Table","section":"@sdxc/ui · Components","summary":"A tabular data display built on the native `<table>` element, with column headers that become sort links and a trailing row that becomes a \"load more\" link — both driven entirely by URLs a consumer computes, so the sorted or paginated result renders back from the server with no client state to track."},{"href":"/api/ui/tabs","title":"Tabs","page":"Tabs","section":"@sdxc/ui · Components","summary":"A set of tabs whose active view comes from routing rather than tracked selection state: each tab renders as a native link carrying the `tab` role, and whichever one points at the page currently being viewed carries `aria-selected=\"true\"` to read as the active tab."},{"href":"/api/ui/tag-group","title":"TagGroup","page":"TagGroup","section":"@sdxc/ui · Components","summary":"A labeled set of pill-shaped tags with an optional dismiss control per tag, composing a grouping host, a wrapped list, and each tag's own pill and remove button."},{"href":"/api/ui/text","title":"Text","page":"Text","section":"@sdxc/ui · Components","summary":"A run of small body copy, styled at the library's default text size and the neutral muted foreground color."},{"href":"/api/ui/textarea","title":"TextArea","page":"TextArea","section":"@sdxc/ui · Components","summary":"A multi-line native form field for free text entry, rendered as a bordered, rounded `<textarea>` that shares Input's border, background, and focus-ring contract."},{"href":"/api/ui/text-field","title":"TextField","page":"TextField","section":"@sdxc/ui · Components","summary":"A convenience wrapper composing a labeled, described, and validated field in one call: a caption through Label, the control through Input, an optional supporting passage through Description, and an optional validation message through FieldError."},{"href":"/api/ui/time-field","title":"TimeField","page":"TimeField","section":"@sdxc/ui · Components","summary":"A convenience wrapper composing a labeled, described, and validated time field in one call: a caption through Label, a native `<input type=\"time\">` control through Input, an optional supporting passage through Description, and an optional validation message through FieldError."},{"href":"/api/ui/toast","title":"Toast","page":"Toast","section":"@sdxc/ui · Components","summary":"A transient notification panel that floats above page content to report the outcome of an action, colored by one of five semantic tones and structured like an inline status panel: an optional leading icon or loading graphic, a title/description block, and trailing actions."},{"href":"/api/ui/toggle-button","title":"ToggleButton","page":"ToggleButton","section":"@sdxc/ui · Components","summary":"A native `<button>` that reflects an on/off state through its own `aria-pressed` attribute instead of a separate boolean prop — muting a track, toggling bold text, filtering a view."},{"href":"/api/ui/toolbar","title":"Toolbar","page":"Toolbar","section":"@sdxc/ui · Components","summary":"A bordered, tinted panel that groups a set of interactive controls — buttons, toggles, menus — along a single axis."},{"href":"/api/ui/tooltip","title":"Tooltip","page":"Tooltip","section":"@sdxc/ui · Components","summary":"A small floating label identifying an otherwise unlabeled control or adding a supplementary hint, riding the same `popover`-attributed host and CSS anchor positioning contract as Popover."},{"href":"/api/ui/tree","title":"Tree","page":"Tree","section":"@sdxc/ui · Components","summary":"A hierarchical list of nodes built from nested `<details>` and `<summary>` elements, so a branch's expand/collapse state, keyboard toggling, and content hiding all come from the platform rather than tracked state."},{"href":"/api/ui/typeset","title":"Typeset","page":"Typeset","section":"@sdxc/ui · Components","summary":"A typography layer wrapping already-rendered markdown or HTML content and supplying every size, weight, spacing, and color decision through three custom properties: `--ui-typeset-size`, `--ui-typeset-leading`, and `--ui-typeset-flow`."},{"href":"/api/ui/youtube-embed","title":"YouTubeEmbed","page":"YouTubeEmbed","section":"@sdxc/ui · Components","summary":"A YouTube player sized to its container: a 16:9 `<iframe>` served from YouTube's privacy-enhanced host, so a visitor receives no YouTube cookies until they press play, and lazy-loaded so a video below the fold costs nothing until it scrolls into view."},{"href":"/api/ui/mixins/aria-checked","title":"ariaChecked","page":"ariaChecked","section":"@sdxc/ui · Mixins","summary":"Keeps `aria-checked` on a native checked-state control in sync with its live checkedness, since the attribute is static and won't follow a control's state on its own."},{"href":"/api/ui/mixins/attachment-trigger","title":"attachmentTrigger","page":"attachmentTrigger","section":"@sdxc/ui · Mixins","summary":"Turns an Attachment.Trigger's whole card into a single activation target, following its `href` or opening the `<dialog>` its `commandfor` names."},{"href":"/api/ui/mixins/calendar-keys","title":"calendarKeys","page":"calendarKeys","section":"@sdxc/ui · Mixins","summary":"Day navigation for a Calendar grid: the Arrow/Page/Home/End keys and a click on a day cell both move a `CalendarModel`'s focused day, which mirrors back onto the grid as roving `tabindex` and DOM focus."},{"href":"/api/ui/mixins/carousel-controls","title":"carouselControls","page":"carouselControls","section":"@sdxc/ui · Mixins","summary":"Handles the `--ui-prev`, `--ui-next`, and `--ui-goto` commands a Carousel's invoker buttons dispatch at its viewport, turning each into an `Element.scrollBy()` call, and keeps every matching invoker's `disabled` state in sync with whichever scroll edge the viewport currently sits at."},{"href":"/api/ui/mixins/channel-sync","title":"channelSync","page":"channelSync","section":"@sdxc/ui · Mixins","summary":"Keeps every track in a group of sibling ColorSlider channels painting a gradient that reflects what every other channel is currently settled on, since none of the independent `<input type=\"range\">` thumbs can otherwise notice a sibling's value changing."},{"href":"/api/ui/mixins/chart-tooltip","title":"chartTooltip","page":"chartTooltip","section":"@sdxc/ui · Mixins","summary":"Bridges a Chart.Bar, Chart.Line, Chart.Area, or Chart.Pie root to its sibling Chart.Tooltip surface: tracks whichever plotted point the pointer or keyboard focus currently resolves to, and mirrors it onto Chart.Tooltip's rows and position."},{"href":"/api/ui/mixins/clear-field","title":"clearField","page":"clearField","section":"@sdxc/ui · Mixins","summary":"Wires a SearchField's clear button to empty its associated input alone, and keeps the button — shipped `hidden` in markup — showing exactly while that input holds a value."},{"href":"/api/ui/mixins/color-area-drag","title":"colorAreaDrag","page":"colorAreaDrag","section":"@sdxc/ui · Mixins","summary":"Drags a ColorArea root as one two-dimensional pointer gesture, mapping the pointer position onto paired horizontal- and vertical-axis range inputs and writing both together — the one update neither input's own drag handling can produce alone, since each tracks only its own axis."},{"href":"/api/ui/mixins/color-preview","title":"colorPreview","page":"colorPreview","section":"@sdxc/ui · Mixins","summary":"Live-updates a ColorField's paired swatch preview as the person typing into its text control lands on a value the chosen color notation actually accepts, reflecting every keystroke a script can observe that no CSS selector or HTML attribute can react to on its own."},{"href":"/api/ui/mixins/color-wheel-drag","title":"colorWheelDrag","page":"colorWheelDrag","section":"@sdxc/ui · Mixins","summary":"Reshapes a ColorWheel's underlying hue input into a ring the moment it attaches, then drags the root as one angular gesture: measures the pointer's clockwise angle around the root's center, converts it to a hue, and writes the hue input's `valueAsNumber`."},{"href":"/api/ui/mixins/combobox-filter","title":"comboboxFilter","page":"comboboxFilter","section":"@sdxc/ui · Mixins","summary":"Adapts `@remix-run/ui/combobox`'s input behavior onto a ComboBox's text input: narrows the popup's options to the typed text, moves the active option with arrow keys, and commits or clears the draft on blur and `Escape`, mirroring the result as `aria-activedescendant` and `aria-expanded`."},{"href":"/api/ui/mixins/command-filter","title":"commandFilter","page":"commandFilter","section":"@sdxc/ui · Mixins","summary":"Search-as-you-type filtering for a Command root: reads the query typed into the marked search input, hands it to a `FilterModel` instance, and mirrors the matched set onto the pre-rendered items as `hidden`, toggling the empty-state element."},{"href":"/api/ui/mixins/command-keys","title":"commandKeys","page":"commandKeys","section":"@sdxc/ui · Mixins","summary":"Arrow-key and Enter navigation for a Command root already paired with `commandFilter(model)`: arrow keys move `model`'s active match across the visible items, mirrored onto `aria-selected` and `aria-activedescendant`; Enter clicks whatever control the active item nests."},{"href":"/api/ui/mixins/context-menu","title":"contextMenu","page":"contextMenu","section":"@sdxc/ui · Mixins","summary":"Opens a ContextMenu's popover surface at the pointer position when its host receives a right-click, anchoring it with `@remix-run/ui/anchor`'s point-based positioning since no markup can anchor a floating surface to a pointer position."},{"href":"/api/ui/mixins/copy-to-clipboard","title":"copyToClipboard","page":"copyToClipboard","section":"@sdxc/ui · Mixins","summary":"Copies text from an element a Message footer copy button's `commandfor` targets onto the system clipboard."},{"href":"/api/ui/mixins/dismiss","title":"dismiss","page":"dismiss","section":"@sdxc/ui · Mixins","summary":"Auto-dismiss behavior for an alert or notification host: counts down to dismissal, pausing while the pointer or focus is inside, and answers the `--ui-dismiss` invoker command from any trigger targeting the host."},{"href":"/api/ui/mixins/drag-reorder","title":"dragReorder","page":"dragReorder","section":"@sdxc/ui · Mixins","summary":"Pointer-driven reorder for a GridList or Tree row list: turns a pointer press on a row's drag handle into a drag session, tracks the row under the pointer and the computed drop position, and dispatches `ui:reorder` once the pointer releases over a valid target."},{"href":"/api/ui/mixins/drop-zone","title":"dropZone","page":"dropZone","section":"@sdxc/ui · Mixins","summary":"Drag-and-drop file acceptance for a DropZone: tracks a file drag over the host through a shared `DragSession`, mirrors its target onto the host as a `data-*` attribute for the drag-over highlight, and turns a completed drop into a typed event carrying the dropped files."},{"href":"/api/ui/mixins/dual-range","title":"dualRange","page":"dualRange","section":"@sdxc/ui · Mixins","summary":"Coordinates a two-thumb Slider's pair of native `<input type=\"range\">` elements, clamping the moved thumb to its partner's value the instant it would cross it, then reporting the settled `{ min, max }` pair."},{"href":"/api/ui/mixins/grid-list-keys","title":"gridListKeys","page":"gridListKeys","section":"@sdxc/ui · Mixins","summary":"Adapts the WAI-ARIA grid pattern onto a GridList's rows and action cells: one roving focus position moves with the arrow and Home/End keys or a click, and Space, Shift and a click drive selection through a `SelectionModel` instance."},{"href":"/api/ui/mixins/heading-level-fallback","title":"headingLevelFallback","page":"headingLevelFallback","section":"@sdxc/ui · Mixins","summary":"Why JS: recovering an ambient level across an independently-hydrated island requires reading the DOM, which pure components cannot do."},{"href":"/api/ui/mixins/hotkey","title":"hotkey","page":"hotkey","section":"@sdxc/ui · Mixins","summary":"Global keyboard-shortcut mixin for a Command dialog or any dialog/popover host: opens the host when a key combination strikes anywhere in the document, and closes it again on the same combination while it's already open, adapting to whichever native open API the host exposes."},{"href":"/api/ui/mixins/image-fallback","title":"imageFallback","page":"imageFallback","section":"@sdxc/ui · Mixins","summary":"Flags an Avatar or Logo image the moment it fails to load by setting an attribute its own styling hides behind, revealing the fallback markup stacked beneath it; clears the attribute again once a later `src` loads successfully."},{"href":"/api/ui/mixins/keymap","title":"keymap","page":"keymap","section":"@sdxc/ui · Mixins","summary":"Why JS: a page-wide shortcut answers a key pressed anywhere in the document, and HTML has no declarative wiring from a keystroke to an action."},{"href":"/api/ui/mixins/listbox-keys","title":"listboxKeys","page":"listboxKeys","section":"@sdxc/ui · Mixins","summary":"Adapts `@remix-run/ui/listbox`'s ARIA listbox keyboard pattern onto a ListBox's option-list host, delegating arrow keys, `Home`/`End`, typeahead, and `Enter`/`Space` to `@remix-run/ui/listbox`'s own `list()` primitive, and reports the shared context's selected value and active option as a typed event."},{"href":"/api/ui/mixins/long-press","title":"longPress","page":"longPress","section":"@sdxc/ui · Mixins","summary":"Generic long-press detection for any host element: a `pointerdown` starts a timer, and once the pointer has held still for a configurable duration, the host dispatches a namespaced `ui:long-press` event carrying the pointer's position, so a consumer can anchor a menu, tooltip, or preview to the exact spot the press held."},{"href":"/api/ui/mixins/menubar-keys","title":"menubarKeys","page":"menubarKeys","section":"@sdxc/ui · Mixins","summary":"Why JS: the WAI-ARIA menubar pattern requires roving tabindex across the row's triggers, `ArrowLeft`/`ArrowRight` and Home/End navigation between them, typeahead, and handing focus straight into whichever Menu a trigger opens, none of which HTML or CSS express on their own."},{"href":"/api/ui/mixins/menu-keys","title":"menuKeys","page":"menuKeys","section":"@sdxc/ui · Mixins","summary":"Why JS: the WAI-ARIA menu pattern requires roving tabindex, arrow-key navigation, Home/End, and typeahead, which HTML does not provide."},{"href":"/api/ui/mixins/message-follow","title":"messageFollow","page":"messageFollow","section":"@sdxc/ui · Mixins","summary":"Bridges a message scroller's viewport to `ScrollFollowModel`, reporting live scroll position, viewport size, and turn visibility into the model and fulfilling its scroll intents by writing scroll position directly, so every visible part of the widget renders purely from state the model owns."},{"href":"/api/ui/mixins/mirror-selected-option","title":"mirrorSelectedOption","page":"mirrorSelectedOption","section":"@sdxc/ui · Mixins","summary":"Keeps a `<selectedcontent>` slot showing the option a `<select>` has selected, restoring the mirror the browser maintains whenever a re-render of the tree the field sits in clears it."},{"href":"/api/ui/mixins/otp-slots","title":"otpSlots","page":"otpSlots","section":"@sdxc/ui · Mixins","summary":"Focus coordination for an OtpField group: advances focus on each typed digit, retreats on `Backspace` from an empty slot, and splits a pasted code across every slot it fits, starting at the slot that received it."},{"href":"/api/ui/mixins/persist","title":"persist","page":"persist","section":"@sdxc/ui · Mixins","summary":"Why JS: remembering a Sidebar's collapsed state across a full page navigation means writing it somewhere the next server render can read back before any markup reaches the browser, and answering a `--ui-toggle` command dispatched from a trigger button elsewhere on the page — neither has an HTML or CSS equivalent."},{"href":"/api/ui/mixins/press-toggle","title":"pressToggle","page":"pressToggle","section":"@sdxc/ui · Mixins","summary":"Why JS: flipping `aria-pressed` the instant a ToggleButton is clicked needs a script to write the attribute back onto the host — the platform has no declarative way to toggle an ARIA state attribute on its own."},{"href":"/api/ui/mixins/range-preview","title":"rangePreview","page":"rangePreview","section":"@sdxc/ui · Mixins","summary":"Hover-and-focus range preview for a RangeCalendar grid: extends a `CalendarModel`'s pending range toward whichever day cell is under the pointer or focus, and mirrors the result onto the grid's day cells."},{"href":"/api/ui/mixins/resize-handle","title":"resizeHandle","page":"resizeHandle","section":"@sdxc/ui · Mixins","summary":"Pointer-driven resize for one handle of a Resizable panel group: turns a pointer press into a `ResizeSession`, feeds it pointer position along the group's axis, and mirrors solved panel sizes back as CSS custom properties."},{"href":"/api/ui/mixins/stepper","title":"stepper","page":"stepper","section":"@sdxc/ui · Mixins","summary":"Press-and-hold repeat for a NumberField group's increment/decrement buttons, calling the field's native `stepUp()`/`stepDown()` on an interval for as long as a button stays pressed."},{"href":"/api/ui/mixins/tab-keys","title":"tabKeys","page":"tabKeys","section":"@sdxc/ui · Mixins","summary":"Delegated arrow-key activation for a Tabs list: a single `keydown` listener on the tablist container reads the shared `@remix-run/ui/tabs` context to move the roving tab stop, instead of binding one listener per tab."},{"href":"/api/ui/mixins/theme-toggle","title":"themeToggle","page":"themeToggle","section":"@sdxc/ui · Mixins","summary":"Switches a theme switch control's page-wide scheme — light, dark, or system — and persists it in a cookie so a return visit's server render starts in the same mode."},{"href":"/api/ui/mixins/track-host-node","title":"trackHostNode","page":"trackHostNode","section":"@sdxc/ui · Mixins","summary":"The insert/remove lifecycle bookkeeping a mixin repeats on its own before it can read or write anything on its own host element from outside its render callback — a document-level listener, an observer callback, a queued task — since the host node doesn't exist yet while a mixin's setup function runs, and stops existing again once the host unmounts."},{"href":"/api/ui/mixins/tree-keys","title":"treeKeys","page":"treeKeys","section":"@sdxc/ui · Mixins","summary":"Adapts the WAI-ARIA tree keyboard pattern onto a Tree's rows: a roving focus position moves between visible rows, arrow keys expand, collapse, or step into and out of a subtree, and typed text matches labels, with every selection change delegated to a shared `SelectionModel`."},{"href":"/api/ui/mixins/validate","title":"validate","page":"validate","section":"@sdxc/ui · Mixins","summary":"Applies a shared `remix/data-schema` field schema to a native form control's current value, layering the verdict onto the field's Constraint Validation API state via `setCustomValidity()` and mirroring it into the field's `FieldError` slot once the browser flags it invalid, since no HTML constraint attribute expresses a schema-shaped check on its own."},{"href":"/api/ui/mixins/view-transition","title":"viewTransition","page":"viewTransition","section":"@sdxc/ui · Mixins","summary":"Bridges a SharedElement's enclosing Frame to the native View Transition API: each Frame reload now runs inside `document.startViewTransition()`, since the platform only opens one when script explicitly wraps an in-place update, so elements sharing a `view-transition-name` morph across the reload instead of popping, one transition shared per Frame."},{"href":"/api/ui/mixins/while-live","title":"whileLive","page":"whileLive","section":"@sdxc/ui · Mixins","summary":"Ties a subscription to a model, session, frame or global to the time a mixin's host or an island component is live in a document, so code that renders on a server as well as in a browser subscribes only in the browser, with a real signal that detaches the listeners."},{"href":"/api/ui/behaviors/announcer","title":"Announcer","page":"Announcer","section":"@sdxc/ui · Behaviors","summary":"Headless queue of aria-live announcements: a live-region island subscribes to its state and re-renders on change."},{"href":"/api/ui/behaviors/calendar-model","title":"CalendarModel","page":"CalendarModel","section":"@sdxc/ui · Behaviors","summary":"Headless state model for calendar grids: tracks the keyboard-focused day, the visible month page, and an in-progress range selection (anchor plus hover preview), leaving value storage and rendering to the consumer."},{"href":"/api/ui/behaviors/drag-session","title":"DragSession","page":"DragSession","section":"@sdxc/ui · Behaviors","summary":"Headless drag-and-drop session: owns the item being dragged, the drop candidate under the pointer, and the position of the pending drop computed against it."},{"href":"/api/ui/behaviors/filter-model","title":"FilterModel","page":"FilterModel","section":"@sdxc/ui · Behaviors","summary":"Headless filtering model for search-as-you-type option lists such as a command palette."},{"href":"/api/ui/behaviors/resize-session","title":"ResizeSession","page":"ResizeSession","section":"@sdxc/ui · Behaviors","summary":"Headless pointer-resize engine backing the `resizeHandle(axis)` mixin."},{"href":"/api/ui/behaviors/scroll-follow-model","title":"ScrollFollowModel","page":"ScrollFollowModel","section":"@sdxc/ui · Behaviors","summary":"Headless scroll-follow state for a conversational message viewport: the pinned live edge, the anchored turn, the visible messages, and the reachable scroll edges."},{"href":"/api/ui/behaviors/selection-model","title":"SelectionModel","page":"SelectionModel","section":"@sdxc/ui · Behaviors","summary":"Selection state for list-shaped widgets: a set of selected keys plus the toggle, contiguous-range, and select-all semantics behind row selection."},{"href":"/api/ui/behaviors/toaster","title":"Toaster","page":"Toaster","section":"@sdxc/ui · Behaviors","summary":"Headless queue of toast notifications a Toast.Region island subscribes to, re-rendering on change."},{"href":"/api/ui/animations/durations","title":"durations","page":"durations","section":"@sdxc/ui · Animations","summary":"Named `transition-duration` steps, in milliseconds, ordered from the snappiest anchored surface to the largest edge-docked one."},{"href":"/api/ui/animations/easings","title":"easings","page":"easings","section":"@sdxc/ui · Animations","summary":"Named `transition-timing-function` curves shared by every animation factory, component, and mixin that needs one, so every transition across the catalog settles into the same small set of curves."},{"href":"/api/ui/animations/enter-exit","title":"enterExit","page":"enterExit","section":"@sdxc/ui · Animations","summary":"Composes a CSS-only enter/exit transition mixin: `@starting-style` paints the first entered frame from the entry values, and closing transitions to the exit values on the exit timing."},{"href":"/api/ui/animations/fade","title":"fade","page":"fade","section":"@sdxc/ui · Animations","summary":"An opacity-only enter/exit transition: sugar over enterExit for a surface that fades in place."},{"href":"/api/ui/animations/pulse","title":"pulse","page":"pulse","section":"@sdxc/ui · Animations","summary":"Gentle opacity breathe for a skeleton placeholder, resolved entirely to `@keyframes` so it runs from server-rendered markup."},{"href":"/api/ui/animations/scroll-fade","title":"scrollFade","page":"scrollFade","section":"@sdxc/ui · Animations","summary":"Fades a scroll container's own edges through a mask on the scrolling element itself: each edge reads opaque once scroll reaches it and feathers while content lies beyond."},{"href":"/api/ui/animations/scroll-progress","title":"scrollProgress","page":"scrollProgress","section":"@sdxc/ui · Animations","summary":"Grows a fill element in lockstep with its scrollable ancestor's scroll position, from the inline-start edge so it reads correctly in both writing directions."},{"href":"/api/ui/animations/scroll-shadow","title":"scrollShadow","page":"scrollShadow","section":"@sdxc/ui · Animations","summary":"Gives a sticky header a scroll-driven shadow, so it reads as elevated only once content has scrolled beneath it."},{"href":"/api/ui/animations/shimmer","title":"shimmer","page":"shimmer","section":"@sdxc/ui · Animations","summary":"Sweeping highlight band for an indeterminate progress fill, resolved entirely to `@keyframes` so it runs from server-rendered markup and settles once the gate clears; reduced motion breathes the fill's opacity instead."},{"href":"/api/ui/animations/slide","title":"slide","page":"slide","section":"@sdxc/ui · Animations","summary":"A fade paired with a directional offset, entering from just off one edge of its resting position and exiting half that distance back toward it, so leaving reads quieter than arriving: sugar over enterExit."},{"href":"/api/ui/animations/spin","title":"spin","page":"spin","section":"@sdxc/ui · Animations","summary":"Continuous 360° rotation for a busy indicator's glyph, resolved entirely to `@keyframes` so it runs from server-rendered markup."},{"href":"/api/ui/animations/text-shimmer","title":"textShimmer","page":"textShimmer","section":"@sdxc/ui · Animations","summary":"Sweeping highlight through a run of text's own glyphs for a caption that stands in for a busy state."},{"href":"/api/ui/animations/view-reveal","title":"viewReveal","page":"viewReveal","section":"@sdxc/ui · Animations","summary":"Plays a translate-and-fade entry as the element scrolls into view; out and back replays it."},{"href":"/api/ui/animations/zoom","title":"zoom","page":"zoom","section":"@sdxc/ui · Animations","summary":"A fade paired with a scale, entering from slightly smaller than rest and exiting halfway back down to it, so leaving reads quieter than arriving: sugar over enterExit for the dialog/menu/popover \"pop\"."},{"href":"/api/ui/styles/chart-palette","title":"chartPalette","page":"chartPalette","section":"@sdxc/ui · Styles","summary":"The eight-slot categorical color contract shared by every chart's plotted elements, addressed everywhere through a `data-color` attribute."},{"href":"/api/ui/styles/concentric-radius","title":"concentricRadius","page":"concentricRadius","section":"@sdxc/ui · Styles","summary":"The radius a surface takes to stay concentric with rows set `padding` in from its 1px edge: the rows' own radius plus the padding and that edge."},{"href":"/api/ui/styles/field-stack-layout","title":"fieldStackLayout","page":"fieldStackLayout","section":"@sdxc/ui · Styles","summary":"The single-column stacking layout shared by every field convenience wrapper's outermost host: its caption, control, and optional supporting passage or validation message lay out in a narrow vertical stack with a small gap between them, keeping a label sitting close to the control it describes."},{"href":"/api/ui/styles/floating-surface","title":"floatingSurface","page":"floatingSurface","section":"@sdxc/ui · Styles","summary":"Composes the shared floating-surface edge, tint, and elevation as a mixin."},{"href":"/api/ui/styles/graphic-host-style","title":"graphicHostStyle","page":"graphicHostStyle","section":"@sdxc/ui · Styles","summary":"The flex-item layout and current-color declarations shared by a leading graphic slot — whichever of an icon or a loading graphic currently occupies that slot — so the two stay laid out identically and a host can swap between them without the rest of its layout shifting."},{"href":"/api/ui/styles/hit-area","title":"hitArea","page":"hitArea","section":"@sdxc/ui · Styles","summary":"The `hitArea()` style-mixin factory: an invisible `::after` box that grows a small control's pointer target to `--ui-target-size` on every side it falls short, keeping the visible control at its designed size."},{"href":"/api/ui/styles/interactive-transition","title":"interactiveTransition","page":"interactiveTransition","section":"@sdxc/ui · Styles","summary":"The `interactiveTransition()` style-mixin factory: the shared `transition-property`/`transition-timing-function`/`transition-duration` triplet composed into an interactive control's `mix` array, animating a hover, focus, press, selection, or validity change instead of snapping between states, sourced from the animation layer's shared tokens."},{"href":"/api/ui/styles/legend-toggle","title":"legendToggle","page":"legendToggle","section":"@sdxc/ui · Styles","summary":"Position-keyed visibility rules pairing a chart root with a later legend: hides each `[data-color]` slot once the legend's same-position `<label>` holds no checked input."},{"href":"/api/ui/styles/output-caption-text","title":"outputCaptionText","page":"outputCaptionText","section":"@sdxc/ui · Styles","summary":"The muted caption typography shared by every live readout rendered through a native `<output>` element: a small point size, a matching line height, the neutral muted foreground color, and tabular digits."},{"href":"/api/ui/styles/panel-chrome","title":"panelChrome","page":"panelChrome","section":"@sdxc/ui · Styles","summary":"The border and rounding a bordered, framed panel applies to its own host element — the outer frame a scrollable region, a hierarchical tree, an expand/collapse section, or a row list draws itself as, before any of its own padding, layout, or interaction styling layers on top."},{"href":"/api/ui/styles/range-thumb-appearance","title":"rangeThumbAppearance","page":"rangeThumbAppearance","section":"@sdxc/ui · Styles","summary":"The `rangeThumbAppearance()` style-mixin factory: the circular thumb a native `<input type=\"range\">` paints through its own `::-webkit-slider-thumb` and `::-moz-range-thumb` pseudo-elements — the appearance reset, fill and border colors, elevation shadow, pressed scale, focus-visible ring, and disabled dimming shared by every single-channel range control in the catalog, whichever pair of custom properties that control reads its own thumb size and border width from."},{"href":"/api/ui/styles/rtl-aware-gradient-direction","title":"rtlAwareGradientDirection","page":"rtlAwareGradientDirection","section":"@sdxc/ui · Styles","summary":"The custom-property declarations behind a linear-gradient direction that a rangeable gradient track shares with its own `&:dir(rtl)` mirror: the property lands at `\"right\"` by default and flips to `\"left\"` once the surrounding writing direction reads right-to-left, so the same gradient string paints correctly in either direction from one shared declaration."},{"href":"/api/ui/styles/semantic-color-panel","title":"semanticColorPanel","page":"semanticColorPanel","section":"@sdxc/ui · Styles","summary":"The border, tinted background, and emphasized foreground a bordered, tinted panel — a full-width status message or placeholder panel — takes on for each of the five semantic color roles, one `&[data-color=\"...\"]` branch per role, every branch driven by that color's own `--ui-*` variables."},{"href":"/api/ui/styles/surface-inset","title":"surfaceInset","page":"surfaceInset","section":"@sdxc/ui · Styles","summary":"Pads a surface around its rounded rows and rounds the surface concentric with them: its radius is the rows' `--ui-radius-md` plus that padding and the surface's edge, so the gap between the curves stays even under any tokens."},{"href":"/api/ui/styles/surface-padding","title":"surfacePadding","page":"surfacePadding","section":"@sdxc/ui · Styles","summary":"The padding surfaceInset applies for a given number of `--ui-surface-padding` steps, for a part that pads along one axis only."}]}