{
  "site": "https://veillette.github.io/Almanach",
  "title": "Almanach — SceneryStack Knowledge Base",
  "description": "A file-based knowledge base of SceneryStack knowledge: API guides, software patterns, styling, and accessibility conventions for building interactive simulations. Every page is plain Markdown with structured frontmatter.",
  "generated": "2026-07-06T06:01:58.006Z",
  "documentCount": 423,
  "documents": [
    {
      "path": "/getting-started/deploying-to-github-pages",
      "sourceFile": "docs/getting-started/deploying-to-github-pages.md",
      "title": "Deploying a Simulation to GitHub Pages",
      "description": "Building a static SceneryStack simulation and publishing it to GitHub Pages via the gh-pages branch or GitHub Actions.",
      "category": "getting-started",
      "tags": [
        "deployment",
        "github-pages",
        "build",
        "ci"
      ],
      "status": "verified",
      "related": [
        "/getting-started/running-and-building-a-simulation",
        "/getting-started/troubleshooting-common-setup-errors",
        "/getting-started/supported-browsers"
      ],
      "prerequisites": [
        "/getting-started/installation-and-setup",
        "/getting-started/running-and-building-a-simulation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://vite.dev/guide/static-deploy.html"
      ],
      "wordCount": 948,
      "url": "https://veillette.github.io/Almanach/getting-started/deploying-to-github-pages"
    },
    {
      "path": "/getting-started/installation-and-setup",
      "sourceFile": "docs/getting-started/installation-and-setup.md",
      "title": "Installation and Setup",
      "description": "Setting up a new SceneryStack project - npm install, TypeScript config, and dev tooling.",
      "category": "getting-started",
      "tags": [
        "setup",
        "installation",
        "tooling",
        "typescript"
      ],
      "status": "verified",
      "related": [
        "/getting-started/what-is-scenerystack",
        "/getting-started/your-first-simulation",
        "/getting-started/scenery-application-vs-standalone-library",
        "/getting-started/project-structure-conventions"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/learn/setup/"
      ],
      "wordCount": 411,
      "url": "https://veillette.github.io/Almanach/getting-started/installation-and-setup"
    },
    {
      "path": "/getting-started/project-structure-conventions",
      "sourceFile": "docs/getting-started/project-structure-conventions.md",
      "title": "Project Structure Conventions",
      "description": "Standard folder/file layout of a SceneryStack repo (model/view split, strings, images).",
      "category": "getting-started",
      "tags": [
        "conventions",
        "project-structure",
        "repo-layout"
      ],
      "status": "verified",
      "related": [
        "/getting-started/running-and-building-a-simulation",
        "/patterns/model-view-separation",
        "/guides/translation-and-localization"
      ],
      "prerequisites": [
        "/getting-started/installation-and-setup"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 432,
      "url": "https://veillette.github.io/Almanach/getting-started/project-structure-conventions"
    },
    {
      "path": "/getting-started/running-and-building-a-simulation",
      "sourceFile": "docs/getting-started/running-and-building-a-simulation.md",
      "title": "Running and Building a Simulation",
      "description": "Dev server workflow and production build output for a SceneryStack sim.",
      "category": "getting-started",
      "tags": [
        "build",
        "tooling",
        "dev-server"
      ],
      "status": "verified",
      "related": [
        "/getting-started/installation-and-setup",
        "/getting-started/project-structure-conventions",
        "/getting-started/supported-browsers"
      ],
      "prerequisites": [
        "/getting-started/installation-and-setup"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 368,
      "url": "https://veillette.github.io/Almanach/getting-started/running-and-building-a-simulation"
    },
    {
      "path": "/getting-started/scenery-application-vs-standalone-library",
      "sourceFile": "docs/getting-started/scenery-application-vs-standalone-library.md",
      "title": "Scenery Application vs. Standalone Library",
      "description": "Choosing between a full joist-based Sim application and using scenery as a standalone rendering library.",
      "category": "getting-started",
      "tags": [
        "joist",
        "scenery",
        "standalone",
        "architecture"
      ],
      "status": "verified",
      "related": [
        "/getting-started/your-first-simulation",
        "/guides/scenery-basics",
        "/api/scenery/display",
        "/api/scenery/node",
        "/api/joist/sim"
      ],
      "prerequisites": [
        "/getting-started/installation-and-setup"
      ],
      "sourceRefs": [
        "https://scenerystack.org/learn/scenery-application/",
        "https://scenerystack.org/learn/standalone-library/"
      ],
      "wordCount": 518,
      "url": "https://veillette.github.io/Almanach/getting-started/scenery-application-vs-standalone-library"
    },
    {
      "path": "/getting-started/supported-browsers",
      "sourceFile": "docs/getting-started/supported-browsers.md",
      "title": "Supported Browsers",
      "description": "Browser/platform support matrix and graceful-degradation considerations.",
      "category": "getting-started",
      "tags": [
        "browsers",
        "compatibility",
        "deployment"
      ],
      "status": "verified",
      "related": [
        "/getting-started/running-and-building-a-simulation",
        "/guides/scenery-basics"
      ],
      "prerequisites": [
        "/getting-started/installation-and-setup"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 394,
      "url": "https://veillette.github.io/Almanach/getting-started/supported-browsers"
    },
    {
      "path": "/getting-started/troubleshooting-common-setup-errors",
      "sourceFile": "docs/getting-started/troubleshooting-common-setup-errors.md",
      "title": "Troubleshooting Common Setup Errors",
      "description": "The most likely failure modes when starting a new scenerystack project - Node version mismatches, wrong import subpaths, missing peer deps, and TypeScript module resolution.",
      "category": "getting-started",
      "tags": [
        "troubleshooting",
        "setup",
        "typescript",
        "tooling"
      ],
      "status": "verified",
      "related": [
        "/getting-started/installation-and-setup",
        "/getting-started/supported-browsers",
        "/getting-started/running-and-building-a-simulation"
      ],
      "prerequisites": [
        "/getting-started/installation-and-setup"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 943,
      "url": "https://veillette.github.io/Almanach/getting-started/troubleshooting-common-setup-errors"
    },
    {
      "path": "/getting-started/what-is-scenerystack",
      "sourceFile": "docs/getting-started/what-is-scenerystack.md",
      "title": "What is SceneryStack?",
      "description": "Overview of the SceneryStack framework, its constituent libraries, and how to install and import it.",
      "category": "getting-started",
      "tags": [
        "overview",
        "installation",
        "scenery",
        "axon",
        "dot",
        "sun",
        "joist"
      ],
      "status": "verified",
      "related": [
        "/patterns/model-view-separation",
        "/api/phetcommon/model-view-transform"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 352,
      "url": "https://veillette.github.io/Almanach/getting-started/what-is-scenerystack"
    },
    {
      "path": "/getting-started/your-first-simulation",
      "sourceFile": "docs/getting-started/your-first-simulation.md",
      "title": "Your First Simulation",
      "description": "Scaffolding a minimal one-screen simulation with Sim, Screen, and ScreenView.",
      "category": "getting-started",
      "tags": [
        "joist",
        "sim",
        "screen",
        "tutorial"
      ],
      "status": "verified",
      "related": [
        "/getting-started/scenery-application-vs-standalone-library",
        "/guides/building-your-first-screen",
        "/patterns/model-view-separation",
        "/api/joist/sim",
        "/api/joist/screen",
        "/api/joist/screen-view"
      ],
      "prerequisites": [
        "/getting-started/installation-and-setup",
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/learn/simulation/"
      ],
      "wordCount": 508,
      "url": "https://veillette.github.io/Almanach/getting-started/your-first-simulation"
    },
    {
      "path": "/guides/accessible-interaction-tutorial",
      "sourceFile": "docs/guides/accessible-interaction-tutorial.md",
      "title": "Accessible Interaction Tutorial",
      "description": "Making a custom draggable Node fully accessible end-to-end.",
      "category": "guides",
      "tags": [
        "accessibility",
        "tutorial",
        "pdom",
        "keyboard"
      ],
      "status": "verified",
      "related": [
        "/accessibility/pdom",
        "/patterns/drag-listeners",
        "/guides/scenery-input",
        "/patterns/model-view-separation"
      ],
      "prerequisites": [
        "/accessibility/pdom",
        "/patterns/drag-listeners"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 717,
      "url": "https://veillette.github.io/Almanach/guides/accessible-interaction-tutorial"
    },
    {
      "path": "/guides/advanced-layout-techniques",
      "sourceFile": "docs/guides/advanced-layout-techniques.md",
      "title": "Advanced Layout Techniques",
      "description": "Nesting FlowBox/GridBox containers, escaping to ManualConstraint for one-off positioning, and using AlignGroup to size content consistently across containers.",
      "category": "guides",
      "tags": [
        "scenery",
        "layout",
        "manual-constraint",
        "align-group"
      ],
      "status": "verified",
      "related": [
        "/guides/scenery-layout",
        "/guides/scenery-basics",
        "/api/scenery/align-box",
        "/api/scenery/flow-box",
        "/api/scenery/grid-box"
      ],
      "prerequisites": [
        "/guides/scenery-layout"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/learn/scenery-layout/"
      ],
      "wordCount": 1157,
      "url": "https://veillette.github.io/Almanach/guides/advanced-layout-techniques"
    },
    {
      "path": "/guides/building-your-first-screen",
      "sourceFile": "docs/guides/building-your-first-screen.md",
      "title": "Building Your First Screen",
      "description": "Step-by-step model/view/Screen wiring for a new screen in a multi-screen sim.",
      "category": "guides",
      "tags": [
        "screen",
        "tutorial",
        "joist"
      ],
      "status": "verified",
      "related": [
        "/getting-started/your-first-simulation",
        "/patterns/model-view-separation",
        "/guides/scenery-layout",
        "/guides/phet-io-and-instrumentation",
        "/api/joist/screen",
        "/api/joist/screen-view"
      ],
      "prerequisites": [
        "/getting-started/your-first-simulation",
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 698,
      "url": "https://veillette.github.io/Almanach/guides/building-your-first-screen"
    },
    {
      "path": "/guides/chart-and-data-visualization-with-bamboo",
      "sourceFile": "docs/guides/chart-and-data-visualization-with-bamboo.md",
      "title": "Chart and Data Visualization with Bamboo",
      "description": "Subsystem overview of bamboo - the ChartTransform every plot shares, the family of Plot Node types built on it, and axis/gridline decoration.",
      "category": "guides",
      "tags": [
        "bamboo",
        "chart",
        "data-visualization",
        "ChartTransform"
      ],
      "status": "complete",
      "related": [
        "/api/bamboo/chart-transform",
        "/api/bamboo/line-plot",
        "/api/bamboo/bar-plot",
        "/api/bamboo/scatter-plot",
        "/api/bamboo/area-plot",
        "/api/bamboo/linear-equation-plot",
        "/api/bamboo/axis-nodes",
        "/api/bamboo/gridlines-and-tick-marks",
        "/api/bamboo/canvas-line-plot",
        "/guides/performance-and-profiling",
        "/patterns/dispose-and-memory-management"
      ],
      "prerequisites": [
        "/guides/scenery-basics",
        "/api/bamboo/chart-transform"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1057,
      "url": "https://veillette.github.io/Almanach/guides/chart-and-data-visualization-with-bamboo"
    },
    {
      "path": "/guides/continuous-integration-for-scenerystack-projects",
      "sourceFile": "docs/guides/continuous-integration-for-scenerystack-projects.md",
      "title": "Continuous Integration for SceneryStack Projects",
      "description": "What a CI pipeline for a SceneryStack simulation repository typically checks - type-checking, linting, a production build, unit tests, and automated fuzzing.",
      "category": "guides",
      "tags": [
        "ci",
        "testing",
        "build",
        "tooling",
        "quality"
      ],
      "status": "complete",
      "related": [
        "/guides/testing-and-qa-strategy-overview",
        "/getting-started/running-and-building-a-simulation",
        "/patterns/testing-model-logic-headlessly",
        "/cookbook/fuzz-testing-a-simulation-locally"
      ],
      "prerequisites": [
        "/getting-started/running-and-building-a-simulation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 833,
      "url": "https://veillette.github.io/Almanach/guides/continuous-integration-for-scenerystack-projects"
    },
    {
      "path": "/guides/debugging-common-scenery-rendering-issues",
      "sourceFile": "docs/guides/debugging-common-scenery-rendering-issues.md",
      "title": "Debugging Common Scenery Rendering Issues",
      "description": "A walkthrough of the most common visual bugs in a scenery scene graph - Nodes that won't show, layout that won't update, and z-order surprises - and the debug tools that narrow each one down.",
      "category": "guides",
      "tags": [
        "scenery",
        "debugging",
        "rendering",
        "layout",
        "troubleshooting"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/display",
        "/guides/scenery-basics",
        "/guides/scenery-layout",
        "/guides/performance-and-profiling",
        "/api/scenery/node",
        "/api/scenery/hit-testing-and-picking"
      ],
      "prerequisites": [
        "/guides/scenery-basics"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1077,
      "url": "https://veillette.github.io/Almanach/guides/debugging-common-scenery-rendering-issues"
    },
    {
      "path": "/guides/haptics-and-alternative-feedback-channels",
      "sourceFile": "docs/guides/haptics-and-alternative-feedback-channels.md",
      "title": "Haptics and Alternative Feedback Channels",
      "description": "Sound (tambo) and vibration (tappi) as feedback channels beyond the visual scene graph - when a simulation benefits from each, and how they relate to accessibility.",
      "category": "guides",
      "tags": [
        "tambo",
        "tappi",
        "sound",
        "vibration",
        "haptics",
        "accessibility"
      ],
      "status": "verified",
      "related": [
        "/guides/working-with-sound",
        "/accessibility/sound-design",
        "/api/tappi/vibration-manager-and-patterns",
        "/api/tappi/vibration-indicator-and-controller",
        "/guides/scenery-basics"
      ],
      "prerequisites": [
        "/guides/scenery-basics"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 732,
      "url": "https://veillette.github.io/Almanach/guides/haptics-and-alternative-feedback-channels"
    },
    {
      "path": "/guides/internationalization-deep-dive",
      "sourceFile": "docs/guides/internationalization-deep-dive.md",
      "title": "Internationalization Deep Dive",
      "description": "Runtime locale switching, right-to-left layout, and PatternStringProperty for pluralization and placeholders, building on the translation pipeline basics.",
      "category": "guides",
      "tags": [
        "localization",
        "i18n",
        "rtl",
        "strings"
      ],
      "status": "verified",
      "related": [
        "/guides/translation-and-localization",
        "/api/axon/pattern-string-property",
        "/api/axon/string-property"
      ],
      "prerequisites": [
        "/guides/translation-and-localization"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 920,
      "url": "https://veillette.github.io/Almanach/guides/internationalization-deep-dive"
    },
    {
      "path": "/guides/modifying-scenerystack",
      "sourceFile": "docs/guides/modifying-scenerystack.md",
      "title": "Modifying SceneryStack",
      "description": "Workflow for patching or contributing to the underlying common-code libraries.",
      "category": "guides",
      "tags": [
        "contributing",
        "open-source",
        "workflow"
      ],
      "status": "verified",
      "related": [
        "/getting-started/installation-and-setup",
        "/getting-started/what-is-scenerystack"
      ],
      "prerequisites": [
        "/getting-started/installation-and-setup"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://github.com/phetsims"
      ],
      "wordCount": 404,
      "url": "https://veillette.github.io/Almanach/guides/modifying-scenerystack"
    },
    {
      "path": "/guides/performance-and-profiling",
      "sourceFile": "docs/guides/performance-and-profiling.md",
      "title": "Performance and Profiling",
      "description": "Finding and fixing slow rendering or update-loop performance in a SceneryStack simulation - profiling query parameters, Node/Property overhead, and Canvas/SVG/WebGL tradeoffs.",
      "category": "guides",
      "tags": [
        "scenery",
        "performance",
        "profiling",
        "rendering"
      ],
      "status": "verified",
      "related": [
        "/guides/scenery-basics",
        "/guides/scenery-layout",
        "/getting-started/supported-browsers",
        "/api/axon/property",
        "/api/axon/derived-property"
      ],
      "prerequisites": [
        "/guides/scenery-basics"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1165,
      "url": "https://veillette.github.io/Almanach/guides/performance-and-profiling"
    },
    {
      "path": "/guides/phet-io-and-instrumentation",
      "sourceFile": "docs/guides/phet-io-and-instrumentation.md",
      "title": "PhET-iO and Instrumentation",
      "description": "Conceptual guide to PhET-iO - what instrumentation buys you and how Tandem fits in.",
      "category": "guides",
      "tags": [
        "phet-io",
        "tandem",
        "instrumentation"
      ],
      "status": "verified",
      "related": [
        "/getting-started/your-first-simulation",
        "/patterns/model-view-separation",
        "/guides/building-your-first-screen"
      ],
      "prerequisites": [
        "/getting-started/your-first-simulation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 686,
      "url": "https://veillette.github.io/Almanach/guides/phet-io-and-instrumentation"
    },
    {
      "path": "/guides/phet-io-deep-dive",
      "sourceFile": "docs/guides/phet-io-deep-dive.md",
      "title": "PhET-iO Deep Dive",
      "description": "PhetioGroup and PhetioCapsule for dynamically created elements, authoring a custom IOType, and how PhET-iO state save/restore actually works.",
      "category": "guides",
      "tags": [
        "phet-io",
        "tandem",
        "instrumentation",
        "phetio-group",
        "phetio-capsule"
      ],
      "status": "verified",
      "related": [
        "/guides/phet-io-and-instrumentation",
        "/patterns/phet-io-instrumentation-pattern",
        "/api/tandem/tandem"
      ],
      "prerequisites": [
        "/guides/phet-io-and-instrumentation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1213,
      "url": "https://veillette.github.io/Almanach/guides/phet-io-deep-dive"
    },
    {
      "path": "/guides/preferences-and-feature-flags",
      "sourceFile": "docs/guides/preferences-and-feature-flags.md",
      "title": "Preferences and Feature Flags",
      "description": "Using the Preferences dialog and query parameters to configure sim behavior.",
      "category": "guides",
      "tags": [
        "preferences",
        "query-parameters",
        "joist"
      ],
      "status": "verified",
      "related": [
        "/getting-started/your-first-simulation",
        "/guides/translation-and-localization",
        "/getting-started/running-and-building-a-simulation"
      ],
      "prerequisites": [
        "/getting-started/your-first-simulation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 581,
      "url": "https://veillette.github.io/Almanach/guides/preferences-and-feature-flags"
    },
    {
      "path": "/guides/publishing-and-distributing-a-simulation",
      "sourceFile": "docs/guides/publishing-and-distributing-a-simulation.md",
      "title": "Publishing and Distributing a Simulation",
      "description": "What a SceneryStack production build produces and the common ways to host it - static hosting, GitHub Pages, or a project's own server.",
      "category": "guides",
      "tags": [
        "deployment",
        "build",
        "hosting",
        "distribution"
      ],
      "status": "complete",
      "related": [
        "/getting-started/running-and-building-a-simulation",
        "/getting-started/deploying-to-github-pages",
        "/getting-started/supported-browsers"
      ],
      "prerequisites": [
        "/getting-started/running-and-building-a-simulation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 745,
      "url": "https://veillette.github.io/Almanach/guides/publishing-and-distributing-a-simulation"
    },
    {
      "path": "/guides/scenery-basics",
      "sourceFile": "docs/guides/scenery-basics.md",
      "title": "Scenery Basics",
      "description": "Introduction to the scene graph - the Node tree, render layers, and coordinate frames.",
      "category": "guides",
      "tags": [
        "scenery",
        "scene-graph",
        "rendering"
      ],
      "status": "verified",
      "related": [
        "/getting-started/scenery-application-vs-standalone-library",
        "/guides/scenery-layout",
        "/guides/scenery-input",
        "/api/scenery/node",
        "/api/scenery/rectangle",
        "/api/scenery/text"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 717,
      "url": "https://veillette.github.io/Almanach/guides/scenery-basics"
    },
    {
      "path": "/guides/scenery-input",
      "sourceFile": "docs/guides/scenery-input.md",
      "title": "Scenery Input",
      "description": "Overview of scenery's input system - pointers, listeners, and event phases.",
      "category": "guides",
      "tags": [
        "scenery",
        "input",
        "pointers",
        "listeners"
      ],
      "status": "verified",
      "related": [
        "/guides/scenery-basics",
        "/patterns/drag-listeners",
        "/accessibility/pdom",
        "/api/scenery/node"
      ],
      "prerequisites": [
        "/guides/scenery-basics"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 745,
      "url": "https://veillette.github.io/Almanach/guides/scenery-input"
    },
    {
      "path": "/guides/scenery-layout",
      "sourceFile": "docs/guides/scenery-layout.md",
      "title": "Scenery Layout",
      "description": "Overview of scenery's auto-layout system - FlowBox, GridBox, AlignBox, and layout options.",
      "category": "guides",
      "tags": [
        "scenery",
        "layout",
        "flow-box",
        "grid-box"
      ],
      "status": "verified",
      "related": [
        "/guides/scenery-basics",
        "/guides/building-your-first-screen",
        "/api/scenery/node"
      ],
      "prerequisites": [
        "/guides/scenery-basics"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 746,
      "url": "https://veillette.github.io/Almanach/guides/scenery-layout"
    },
    {
      "path": "/guides/sim-lifecycle-and-startup-sequence",
      "sourceFile": "docs/guides/sim-lifecycle-and-startup-sequence.md",
      "title": "Sim Lifecycle and Startup Sequence",
      "description": "The real sequence from Sim construction through start(), screen selection, and the running animation loop that steps Properties and listeners every frame.",
      "category": "guides",
      "tags": [
        "joist",
        "Sim",
        "Screen",
        "lifecycle",
        "animation-loop"
      ],
      "status": "complete",
      "related": [
        "/api/joist/sim",
        "/api/joist/screen",
        "/api/joist/screen-view",
        "/guides/scenery-basics",
        "/api/axon/timer"
      ],
      "prerequisites": [
        "/api/joist/sim",
        "/getting-started/your-first-simulation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 800,
      "url": "https://veillette.github.io/Almanach/guides/sim-lifecycle-and-startup-sequence"
    },
    {
      "path": "/guides/testing-and-qa-strategy-overview",
      "sourceFile": "docs/guides/testing-and-qa-strategy-overview.md",
      "title": "Testing and QA Strategy Overview",
      "description": "The layers of testing a SceneryStack simulation benefits from - headless unit tests, manual QA passes, and automated fuzz-testing.",
      "category": "guides",
      "tags": [
        "testing",
        "qa",
        "fuzz-testing",
        "qunit",
        "quality"
      ],
      "status": "complete",
      "related": [
        "/patterns/testing-model-logic-headlessly",
        "/cookbook/fuzz-testing-a-simulation-locally",
        "/guides/continuous-integration-for-scenerystack-projects",
        "/patterns/query-parameters-pattern"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 818,
      "url": "https://veillette.github.io/Almanach/guides/testing-and-qa-strategy-overview"
    },
    {
      "path": "/guides/translation-and-localization",
      "sourceFile": "docs/guides/translation-and-localization.md",
      "title": "Translation and Localization",
      "description": "String management with StringProperty and the PhET translation pipeline.",
      "category": "guides",
      "tags": [
        "localization",
        "i18n",
        "strings"
      ],
      "status": "verified",
      "related": [
        "/api/axon/string-property",
        "/guides/preferences-and-feature-flags",
        "/getting-started/project-structure-conventions"
      ],
      "prerequisites": [
        "/api/axon/string-property",
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 566,
      "url": "https://veillette.github.io/Almanach/guides/translation-and-localization"
    },
    {
      "path": "/guides/ui-components-overview",
      "sourceFile": "docs/guides/ui-components-overview.md",
      "title": "UI Components Overview",
      "description": "Tour of the sun and scenery-phet component libraries and when to reach for each.",
      "category": "guides",
      "tags": [
        "sun",
        "scenery-phet",
        "ui-components"
      ],
      "status": "verified",
      "related": [
        "/guides/scenery-layout",
        "/patterns/reset-all-pattern",
        "/api/sun/checkbox",
        "/api/sun/hslider",
        "/api/sun/panel",
        "/api/sun/accordion-box",
        "/api/sun/combo-box",
        "/api/sun/rectangular-push-button",
        "/api/sun/radio-button-group",
        "/api/scenery-phet/reset-all-button",
        "/api/scenery-phet/number-control",
        "/api/scenery-phet/thermometer-node",
        "/api/scenery-phet/arrow-node"
      ],
      "prerequisites": [
        "/guides/scenery-basics"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 633,
      "url": "https://veillette.github.io/Almanach/guides/ui-components-overview"
    },
    {
      "path": "/guides/working-with-model-view-transforms",
      "sourceFile": "docs/guides/working-with-model-view-transforms.md",
      "title": "Working with Model-View Transforms",
      "description": "Why SceneryStack simulations separate model coordinates from view pixels, and the common ModelViewTransform2 usage patterns that follow from it.",
      "category": "guides",
      "tags": [
        "phetcommon",
        "dot",
        "coordinates",
        "transform",
        "ModelViewTransform2"
      ],
      "status": "complete",
      "related": [
        "/api/phetcommon/model-view-transform",
        "/patterns/model-view-separation",
        "/patterns/drag-listeners",
        "/guides/scenery-basics"
      ],
      "prerequisites": [
        "/patterns/model-view-separation",
        "/api/phetcommon/model-view-transform"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 795,
      "url": "https://veillette.github.io/Almanach/guides/working-with-model-view-transforms"
    },
    {
      "path": "/guides/working-with-sound",
      "sourceFile": "docs/guides/working-with-sound.md",
      "title": "Working with Sound (tambo Overview)",
      "description": "How tambo fits into a SceneryStack simulation - soundManager as the central mixer, and the sound-generator classes you compose to drive it.",
      "category": "guides",
      "tags": [
        "tambo",
        "sound",
        "audio"
      ],
      "status": "verified",
      "related": [
        "/accessibility/sound-design",
        "/guides/scenery-basics",
        "/patterns/dispose-and-memory-management"
      ],
      "prerequisites": [
        "/guides/scenery-basics"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 894,
      "url": "https://veillette.github.io/Almanach/guides/working-with-sound"
    },
    {
      "path": "/api/axon/boolean-property",
      "sourceFile": "docs/api/axon/boolean-property.md",
      "title": "BooleanProperty",
      "description": "A Property<boolean> with a toggle() convenience method.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "BooleanProperty"
      ],
      "status": "verified",
      "related": [
        "/api/axon/number-property",
        "/api/axon/derived-property"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 218,
      "url": "https://veillette.github.io/Almanach/api/axon/boolean-property"
    },
    {
      "path": "/api/axon/derived-property",
      "sourceFile": "docs/api/axon/derived-property.md",
      "title": "DerivedProperty",
      "description": "A read-only Property computed from one or more dependencies.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "DerivedProperty"
      ],
      "status": "verified",
      "related": [
        "/api/axon/multilink",
        "/api/axon/boolean-property",
        "/api/axon/number-property"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 543,
      "url": "https://veillette.github.io/Almanach/api/axon/derived-property"
    },
    {
      "path": "/api/axon/derived-string-property",
      "sourceFile": "docs/api/axon/derived-string-property.md",
      "title": "DerivedStringProperty",
      "description": "A DerivedProperty specialized for building translated or formatted string values, with the right PhET-iO metadata baked in.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "DerivedStringProperty",
        "DerivedProperty",
        "PatternStringProperty",
        "i18n",
        "strings"
      ],
      "status": "complete",
      "related": [
        "/api/axon/derived-property",
        "/api/axon/pattern-string-property",
        "/api/axon/string-property"
      ],
      "prerequisites": [
        "/api/axon/derived-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 353,
      "url": "https://veillette.github.io/Almanach/api/axon/derived-string-property"
    },
    {
      "path": "/api/axon/dynamic-property",
      "sourceFile": "docs/api/axon/dynamic-property.md",
      "title": "DynamicProperty",
      "description": "A Property that re-points itself to follow whichever inner Property a source Property currently holds.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "DynamicProperty",
        "Property",
        "MappedProperty"
      ],
      "status": "verified",
      "related": [
        "/api/axon/property",
        "/api/axon/derived-property",
        "/api/axon/tiny-property",
        "/api/axon/unit-conversion-property"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 465,
      "url": "https://veillette.github.io/Almanach/api/axon/dynamic-property"
    },
    {
      "path": "/api/axon/emitter",
      "sourceFile": "docs/api/axon/emitter.md",
      "title": "Emitter",
      "description": "Discrete events that are not state.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "Emitter",
        "events"
      ],
      "status": "verified",
      "related": [
        "/api/axon/property",
        "/api/axon/derived-property",
        "/api/axon/observable-array",
        "/patterns/emitter-vs-property"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 421,
      "url": "https://veillette.github.io/Almanach/api/axon/emitter"
    },
    {
      "path": "/api/axon/enabled-component",
      "sourceFile": "docs/api/axon/enabled-component.md",
      "title": "EnabledComponent and EnabledProperty",
      "description": "The standard mixin-free pattern for giving any object a settable enabledProperty, with PhET-iO instrumentation baked in.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "EnabledComponent",
        "EnabledProperty",
        "BooleanProperty",
        "Disposable"
      ],
      "status": "complete",
      "related": [
        "/api/axon/boolean-property",
        "/api/axon/property"
      ],
      "prerequisites": [
        "/api/axon/boolean-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 446,
      "url": "https://veillette.github.io/Almanach/api/axon/enabled-component"
    },
    {
      "path": "/api/axon/enumeration-property",
      "sourceFile": "docs/api/axon/enumeration-property.md",
      "title": "EnumerationProperty",
      "description": "A Property restricted to the values of an EnumerationValue subclass.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "EnumerationProperty"
      ],
      "status": "verified",
      "related": [
        "/api/axon/string-property",
        "/api/axon/derived-property",
        "/patterns/enumeration-pattern",
        "/api/phet-core/enumeration-value"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 298,
      "url": "https://veillette.github.io/Almanach/api/axon/enumeration-property"
    },
    {
      "path": "/api/axon/multilink",
      "sourceFile": "docs/api/axon/multilink.md",
      "title": "Multilink",
      "description": "Reacting to several Properties at once without manually chaining links.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "Multilink"
      ],
      "status": "verified",
      "related": [
        "/api/axon/derived-property",
        "/patterns/multilink-pattern"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 377,
      "url": "https://veillette.github.io/Almanach/api/axon/multilink"
    },
    {
      "path": "/api/axon/number-property",
      "sourceFile": "docs/api/axon/number-property.md",
      "title": "NumberProperty",
      "description": "A Property<number> with an optional range for validation and UI binding.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "NumberProperty",
        "range"
      ],
      "status": "verified",
      "related": [
        "/api/axon/boolean-property",
        "/api/axon/derived-property",
        "/api/dot/range"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 383,
      "url": "https://veillette.github.io/Almanach/api/axon/number-property"
    },
    {
      "path": "/api/axon/observable-array",
      "sourceFile": "docs/api/axon/observable-array.md",
      "title": "Observable Array",
      "description": "createObservableArray: a Property-like array with add/remove item emitters.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "observable-array",
        "collections"
      ],
      "status": "verified",
      "related": [
        "/api/axon/number-property",
        "/api/axon/derived-property"
      ],
      "prerequisites": [
        "/api/axon/property",
        "/api/axon/emitter"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 631,
      "url": "https://veillette.github.io/Almanach/api/axon/observable-array"
    },
    {
      "path": "/api/axon/pattern-string-property",
      "sourceFile": "docs/api/axon/pattern-string-property.md",
      "title": "PatternStringProperty",
      "description": "A derived string Property that fills a translated pattern string's placeholders from other Properties or plain values.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "PatternStringProperty",
        "DerivedProperty",
        "i18n",
        "strings"
      ],
      "status": "verified",
      "related": [
        "/api/axon/derived-property",
        "/api/axon/string-property",
        "/api/phetcommon/string-utils",
        "/guides/internationalization-deep-dive"
      ],
      "prerequisites": [
        "/api/axon/derived-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 411,
      "url": "https://veillette.github.io/Almanach/api/axon/pattern-string-property"
    },
    {
      "path": "/api/axon/property",
      "sourceFile": "docs/api/axon/property.md",
      "title": "Property",
      "description": "The base observable value wrapper underlying all reactive state.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "Property",
        "reactive"
      ],
      "status": "verified",
      "related": [
        "/api/axon/boolean-property",
        "/api/axon/number-property",
        "/api/axon/string-property",
        "/api/axon/enumeration-property",
        "/api/axon/derived-property",
        "/api/axon/multilink",
        "/patterns/emitter-vs-property"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 608,
      "url": "https://veillette.github.io/Almanach/api/axon/property"
    },
    {
      "path": "/api/axon/read-only-property",
      "sourceFile": "docs/api/axon/read-only-property.md",
      "title": "ReadOnlyProperty",
      "description": "The base observable class Property extends — the public type exposed by anything that shouldn't be externally settable.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "ReadOnlyProperty",
        "Property",
        "DerivedProperty",
        "reactive"
      ],
      "status": "complete",
      "related": [
        "/api/axon/property",
        "/api/axon/derived-property",
        "/api/axon/dynamic-property"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 493,
      "url": "https://veillette.github.io/Almanach/api/axon/read-only-property"
    },
    {
      "path": "/api/axon/string-property",
      "sourceFile": "docs/api/axon/string-property.md",
      "title": "StringProperty",
      "description": "A Property<string>'s role in localizable, translatable values.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "StringProperty",
        "localization"
      ],
      "status": "verified",
      "related": [
        "/api/axon/enumeration-property",
        "/api/axon/derived-property"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 270,
      "url": "https://veillette.github.io/Almanach/api/axon/string-property"
    },
    {
      "path": "/api/axon/string-union-property",
      "sourceFile": "docs/api/axon/string-union-property.md",
      "title": "StringUnionProperty",
      "description": "A Property constrained to a fixed union of string literal values, with validValues and PhET-iO serialization set up automatically.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "StringUnionProperty",
        "Property",
        "enumeration",
        "TypeScript"
      ],
      "status": "verified",
      "related": [
        "/api/axon/property",
        "/api/axon/enumeration-property",
        "/patterns/enumeration-pattern"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 292,
      "url": "https://veillette.github.io/Almanach/api/axon/string-union-property"
    },
    {
      "path": "/api/axon/timer",
      "sourceFile": "docs/api/axon/timer.md",
      "title": "Timer, animationFrameTimer, and stepTimer",
      "description": "The shared Timer class and its two singleton instances — setTimeout/setInterval-alike scheduling driven by the sim's own frame loop instead of the browser clock.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "Timer",
        "animationFrameTimer",
        "stepTimer",
        "scheduling"
      ],
      "status": "complete",
      "related": [
        "/api/axon/emitter",
        "/api/axon/property"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 508,
      "url": "https://veillette.github.io/Almanach/api/axon/timer"
    },
    {
      "path": "/api/axon/tiny-emitter",
      "sourceFile": "docs/api/axon/tiny-emitter.md",
      "title": "TinyEmitter",
      "description": "The dependency-free, no-PhET-iO Emitter core that axon uses internally for hot paths.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "TinyEmitter",
        "Emitter",
        "events",
        "performance"
      ],
      "status": "verified",
      "related": [
        "/api/axon/emitter",
        "/api/axon/tiny-property",
        "/patterns/emitter-vs-property"
      ],
      "prerequisites": [
        "/api/axon/emitter"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 454,
      "url": "https://veillette.github.io/Almanach/api/axon/tiny-emitter"
    },
    {
      "path": "/api/axon/tiny-property",
      "sourceFile": "docs/api/axon/tiny-property.md",
      "title": "TinyProperty",
      "description": "The minimal Property base, without phet-io instrumentation or validation, that Property and scenery internals build on.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "TinyProperty",
        "Property",
        "performance"
      ],
      "status": "verified",
      "related": [
        "/api/axon/property",
        "/api/axon/tiny-emitter",
        "/api/axon/dynamic-property"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 437,
      "url": "https://veillette.github.io/Almanach/api/axon/tiny-property"
    },
    {
      "path": "/api/axon/unit-conversion-property",
      "sourceFile": "docs/api/axon/unit-conversion-property.md",
      "title": "UnitConversionProperty",
      "description": "A derived, bidirectional Property that converts a numeric Property's value (and range) between units via a fixed multiplicative factor.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "UnitConversionProperty",
        "MappedProperty",
        "Property",
        "units"
      ],
      "status": "verified",
      "related": [
        "/api/axon/dynamic-property",
        "/api/axon/number-property",
        "/api/dot/range"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 366,
      "url": "https://veillette.github.io/Almanach/api/axon/unit-conversion-property"
    },
    {
      "path": "/api/axon/validation",
      "sourceFile": "docs/api/axon/validation.md",
      "title": "Validation and validate",
      "description": "The shared validator schema and checking utility that Property's valueType/validValues/isValidValue options are built on.",
      "category": "api",
      "library": "axon",
      "tags": [
        "axon",
        "Validation",
        "validate",
        "Property"
      ],
      "status": "complete",
      "related": [
        "/api/axon/property",
        "/api/axon/derived-property"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 536,
      "url": "https://veillette.github.io/Almanach/api/axon/validation"
    },
    {
      "path": "/api/bamboo/area-plot",
      "sourceFile": "docs/api/bamboo/area-plot.md",
      "title": "AreaPlot",
      "description": "Renders a dataset as a filled, shaded region between the data and a baseline value on a bamboo chart.",
      "category": "api",
      "library": "bamboo",
      "tags": [
        "bamboo",
        "AreaPlot",
        "chart",
        "plot"
      ],
      "status": "complete",
      "related": [
        "/api/bamboo/line-plot",
        "/api/bamboo/bar-plot",
        "/api/bamboo/scatter-plot",
        "/api/bamboo/axis-nodes",
        "/api/scenery/path"
      ],
      "prerequisites": [
        "/api/bamboo/chart-transform"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 484,
      "url": "https://veillette.github.io/Almanach/api/bamboo/area-plot"
    },
    {
      "path": "/api/bamboo/axis-nodes",
      "sourceFile": "docs/api/bamboo/axis-nodes.md",
      "title": "AxisLine and AxisArrowNode",
      "description": "Draws a bamboo chart's x or y axis as a plain line or an arrow-tipped line, positioned and auto-hidden by a ChartTransform.",
      "category": "api",
      "library": "bamboo",
      "tags": [
        "bamboo",
        "AxisLine",
        "AxisArrowNode",
        "chart",
        "axis"
      ],
      "status": "verified",
      "related": [
        "/api/bamboo/line-plot",
        "/api/bamboo/bar-plot",
        "/api/bamboo/scatter-plot",
        "/api/scenery/line"
      ],
      "prerequisites": [
        "/api/bamboo/chart-transform"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 482,
      "url": "https://veillette.github.io/Almanach/api/bamboo/axis-nodes"
    },
    {
      "path": "/api/bamboo/bar-plot",
      "sourceFile": "docs/api/bamboo/bar-plot.md",
      "title": "BarPlot",
      "description": "Draws one rectangular bar per data point on a bamboo chart, growing from a shared baseline value.",
      "category": "api",
      "library": "bamboo",
      "tags": [
        "bamboo",
        "BarPlot",
        "chart",
        "plot"
      ],
      "status": "verified",
      "related": [
        "/api/bamboo/line-plot",
        "/api/bamboo/scatter-plot",
        "/api/bamboo/axis-nodes",
        "/api/scenery/rectangle"
      ],
      "prerequisites": [
        "/api/bamboo/chart-transform"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 419,
      "url": "https://veillette.github.io/Almanach/api/bamboo/bar-plot"
    },
    {
      "path": "/api/bamboo/canvas-line-plot",
      "sourceFile": "docs/api/bamboo/canvas-line-plot.md",
      "title": "CanvasLinePlot",
      "description": "A Canvas-rendered equivalent of LinePlot, painted by a shared ChartCanvasNode for charts with too many points for per-point scenery Nodes to stay fast.",
      "category": "api",
      "library": "bamboo",
      "tags": [
        "bamboo",
        "CanvasLinePlot",
        "ChartCanvasNode",
        "chart",
        "plot",
        "canvas",
        "performance"
      ],
      "status": "complete",
      "related": [
        "/api/bamboo/line-plot",
        "/api/bamboo/area-plot",
        "/api/bamboo/gridlines-and-tick-marks"
      ],
      "prerequisites": [
        "/api/bamboo/chart-transform",
        "/api/bamboo/line-plot"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 531,
      "url": "https://veillette.github.io/Almanach/api/bamboo/canvas-line-plot"
    },
    {
      "path": "/api/bamboo/chart-transform",
      "sourceFile": "docs/api/bamboo/chart-transform.md",
      "title": "ChartTransform",
      "description": "Maps chart data between model coordinates and view (pixel) coordinates, and is the shared object every bamboo plot and axis is built around.",
      "category": "api",
      "library": "bamboo",
      "tags": [
        "bamboo",
        "ChartTransform",
        "coordinates",
        "chart"
      ],
      "status": "verified",
      "related": [
        "/api/bamboo/line-plot",
        "/api/bamboo/bar-plot",
        "/api/bamboo/scatter-plot",
        "/api/bamboo/axis-nodes",
        "/patterns/dispose-and-memory-management"
      ],
      "prerequisites": [
        "/api/dot/range",
        "/api/dot/vector2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 619,
      "url": "https://veillette.github.io/Almanach/api/bamboo/chart-transform"
    },
    {
      "path": "/api/bamboo/gridlines-and-tick-marks",
      "sourceFile": "docs/api/bamboo/gridlines-and-tick-marks.md",
      "title": "GridLineSet, TickMarkSet, and TickLabelSet",
      "description": "The three bamboo Path/Node sets that draw a chart's repeating gridlines, tick marks, and tick labels at a fixed model-coordinate spacing.",
      "category": "api",
      "library": "bamboo",
      "tags": [
        "bamboo",
        "GridLineSet",
        "TickMarkSet",
        "TickLabelSet",
        "chart",
        "axis"
      ],
      "status": "complete",
      "related": [
        "/api/bamboo/chart-transform",
        "/api/bamboo/axis-nodes",
        "/api/bamboo/canvas-line-plot",
        "/api/scenery/path"
      ],
      "prerequisites": [
        "/api/bamboo/chart-transform"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 706,
      "url": "https://veillette.github.io/Almanach/api/bamboo/gridlines-and-tick-marks"
    },
    {
      "path": "/api/bamboo/linear-equation-plot",
      "sourceFile": "docs/api/bamboo/linear-equation-plot.md",
      "title": "LinearEquationPlot",
      "description": "Draws the straight line y = mx + b (or a vertical line, for infinite slope) across a bamboo chart's model x-range.",
      "category": "api",
      "library": "bamboo",
      "tags": [
        "bamboo",
        "LinearEquationPlot",
        "chart",
        "plot"
      ],
      "status": "complete",
      "related": [
        "/api/bamboo/line-plot",
        "/api/bamboo/gridlines-and-tick-marks",
        "/api/bamboo/axis-nodes",
        "/api/scenery/line"
      ],
      "prerequisites": [
        "/api/bamboo/chart-transform"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 425,
      "url": "https://veillette.github.io/Almanach/api/bamboo/linear-equation-plot"
    },
    {
      "path": "/api/bamboo/line-plot",
      "sourceFile": "docs/api/bamboo/line-plot.md",
      "title": "LinePlot",
      "description": "Draws a polyline through a dataset of points on a bamboo chart, with null entries producing gaps.",
      "category": "api",
      "library": "bamboo",
      "tags": [
        "bamboo",
        "LinePlot",
        "chart",
        "plot"
      ],
      "status": "verified",
      "related": [
        "/api/bamboo/bar-plot",
        "/api/bamboo/scatter-plot",
        "/api/bamboo/axis-nodes",
        "/api/scenery/path"
      ],
      "prerequisites": [
        "/api/bamboo/chart-transform"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 355,
      "url": "https://veillette.github.io/Almanach/api/bamboo/line-plot"
    },
    {
      "path": "/api/bamboo/scatter-plot",
      "sourceFile": "docs/api/bamboo/scatter-plot.md",
      "title": "ScatterPlot",
      "description": "Draws a dataset of points as filled circles on a bamboo chart.",
      "category": "api",
      "library": "bamboo",
      "tags": [
        "bamboo",
        "ScatterPlot",
        "chart",
        "plot"
      ],
      "status": "verified",
      "related": [
        "/api/bamboo/line-plot",
        "/api/bamboo/bar-plot",
        "/api/bamboo/axis-nodes",
        "/api/scenery/path"
      ],
      "prerequisites": [
        "/api/bamboo/chart-transform"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 358,
      "url": "https://veillette.github.io/Almanach/api/bamboo/scatter-plot"
    },
    {
      "path": "/api/dot/bounds2",
      "sourceFile": "docs/api/dot/bounds2.md",
      "title": "Bounds2",
      "description": "An axis-aligned rectangle used for layout, drag bounds, and hit-testing.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Bounds2",
        "bounds"
      ],
      "status": "verified",
      "related": [
        "/api/dot/vector2",
        "/api/dot/range",
        "/api/dot/matrix3",
        "/patterns/drag-listeners"
      ],
      "prerequisites": [
        "/api/dot/vector2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 674,
      "url": "https://veillette.github.io/Almanach/api/dot/bounds2"
    },
    {
      "path": "/api/dot/bounds3",
      "sourceFile": "docs/api/dot/bounds3.md",
      "title": "Bounds3",
      "description": "An axis-aligned cuboid (3D bounding box), the 3D counterpart to Bounds2.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Bounds3",
        "bounds"
      ],
      "status": "verified",
      "related": [
        "/api/dot/bounds2",
        "/api/dot/vector3",
        "/api/dot/matrix4"
      ],
      "prerequisites": [
        "/api/dot/bounds2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 692,
      "url": "https://veillette.github.io/Almanach/api/dot/bounds3"
    },
    {
      "path": "/api/dot/complex",
      "sourceFile": "docs/api/dot/complex.md",
      "title": "Complex",
      "description": "A complex number type with immutable and mutable arithmetic, including polar form and polynomial root-solving.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Complex",
        "math"
      ],
      "status": "verified",
      "related": [
        "/api/dot/dot-utils"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 582,
      "url": "https://veillette.github.io/Almanach/api/dot/complex"
    },
    {
      "path": "/api/dot/convex-hull2",
      "sourceFile": "docs/api/dot/convex-hull2.md",
      "title": "ConvexHull2",
      "description": "A Graham Scan implementation computing the 2D convex hull (minimal enclosing polygon) of a set of Vector2 points.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "ConvexHull2",
        "Vector2",
        "geometry",
        "math"
      ],
      "status": "complete",
      "related": [
        "/api/dot/vector2",
        "/api/dot/permutation-and-combination",
        "/api/kite/shape"
      ],
      "prerequisites": [
        "/api/dot/vector2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 341,
      "url": "https://veillette.github.io/Almanach/api/dot/convex-hull2"
    },
    {
      "path": "/api/dot/damped-harmonic",
      "sourceFile": "docs/api/dot/damped-harmonic.md",
      "title": "DampedHarmonic",
      "description": "A closed-form solver for the damped harmonic oscillator differential equation, useful for spring, pendulum, and oscillation sims.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "DampedHarmonic",
        "differential-equations",
        "physics",
        "math"
      ],
      "status": "complete",
      "related": [
        "/api/dot/linear-function"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 489,
      "url": "https://veillette.github.io/Almanach/api/dot/damped-harmonic"
    },
    {
      "path": "/api/dot/dimension2",
      "sourceFile": "docs/api/dot/dimension2.md",
      "title": "Dimension2",
      "description": "A plain width/height pair, like Bounds2 without a position.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Dimension2",
        "bounds"
      ],
      "status": "verified",
      "related": [
        "/api/dot/bounds2"
      ],
      "prerequisites": [
        "/api/dot/bounds2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 346,
      "url": "https://veillette.github.io/Almanach/api/dot/dimension2"
    },
    {
      "path": "/api/dot/dot-random",
      "sourceFile": "docs/api/dot/dot-random.md",
      "title": "dotRandom",
      "description": "The shared, globally-seeded Random singleton simulations should use for every \"random\" call, instead of Math.random() or a private Random instance.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "dotRandom",
        "Random",
        "seeding",
        "phet-io"
      ],
      "status": "complete",
      "related": [
        "/api/dot/random"
      ],
      "prerequisites": [
        "/api/dot/random"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 332,
      "url": "https://veillette.github.io/Almanach/api/dot/dot-random"
    },
    {
      "path": "/api/dot/linear-function",
      "sourceFile": "docs/api/dot/linear-function.md",
      "title": "LinearFunction",
      "description": "A reusable object that maps values between two linear numeric domains, with an invertible mapping.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "LinearFunction",
        "math"
      ],
      "status": "verified",
      "related": [
        "/api/dot/dot-utils",
        "/api/dot/range"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 476,
      "url": "https://veillette.github.io/Almanach/api/dot/linear-function"
    },
    {
      "path": "/api/dot/matrix-decompositions",
      "sourceFile": "docs/api/dot/matrix-decompositions.md",
      "title": "Matrix Decompositions",
      "description": "A practical survey of dot's LUDecomposition, QRDecomposition, EigenvalueDecomposition, and SingularValueDecomposition, and when a sim author would ever reach for one.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Matrix",
        "LUDecomposition",
        "QRDecomposition",
        "EigenvalueDecomposition",
        "SingularValueDecomposition",
        "linear-algebra"
      ],
      "status": "complete",
      "related": [
        "/api/dot/matrix3",
        "/api/dot/matrix4"
      ],
      "prerequisites": [
        "/api/dot/matrix3"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 929,
      "url": "https://veillette.github.io/Almanach/api/dot/matrix-decompositions"
    },
    {
      "path": "/api/dot/matrix3",
      "sourceFile": "docs/api/dot/matrix3.md",
      "title": "Matrix3",
      "description": "The 3x3 transform matrix behind Node transforms and ModelViewTransform2.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Matrix3",
        "transform"
      ],
      "status": "verified",
      "related": [
        "/api/dot/vector2",
        "/api/dot/bounds2",
        "/api/phetcommon/model-view-transform"
      ],
      "prerequisites": [
        "/api/dot/vector2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 592,
      "url": "https://veillette.github.io/Almanach/api/dot/matrix3"
    },
    {
      "path": "/api/dot/matrix4",
      "sourceFile": "docs/api/dot/matrix4.md",
      "title": "Matrix4",
      "description": "The 4x4 homogeneous transform matrix used for 3D affine math.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Matrix4",
        "transform"
      ],
      "status": "verified",
      "related": [
        "/api/dot/matrix3",
        "/api/dot/vector3",
        "/api/dot/vector4",
        "/api/dot/bounds3"
      ],
      "prerequisites": [
        "/api/dot/matrix3"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 627,
      "url": "https://veillette.github.io/Almanach/api/dot/matrix4"
    },
    {
      "path": "/api/dot/permutation-and-combination",
      "sourceFile": "docs/api/dot/permutation-and-combination.md",
      "title": "Permutation and Combination",
      "description": "Immutable combinatorics helpers for reordering (Permutation) or selecting a subset of (Combination) an array.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Permutation",
        "Combination",
        "combinatorics",
        "math"
      ],
      "status": "complete",
      "related": [
        "/api/dot/convex-hull2"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 589,
      "url": "https://veillette.github.io/Almanach/api/dot/permutation-and-combination"
    },
    {
      "path": "/api/dot/quaternion-and-plane3",
      "sourceFile": "docs/api/dot/quaternion-and-plane3.md",
      "title": "Quaternion and Plane3",
      "description": "A rotation quaternion class and an infinite-plane primitive used together for 3D rotation and plane/ray geometry.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Quaternion",
        "Plane3",
        "Vector3",
        "Matrix3",
        "rotation",
        "math"
      ],
      "status": "complete",
      "related": [
        "/api/dot/vector3",
        "/api/dot/matrix3",
        "/api/dot/ray3"
      ],
      "prerequisites": [
        "/api/dot/vector3",
        "/api/dot/matrix3"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 670,
      "url": "https://veillette.github.io/Almanach/api/dot/quaternion-and-plane3"
    },
    {
      "path": "/api/dot/random",
      "sourceFile": "docs/api/dot/random.md",
      "title": "Random",
      "description": "A seedable pseudo-random number generator class, plus the shared dotRandom singleton sims should use instead of Math.random().",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Random",
        "dotRandom",
        "math"
      ],
      "status": "verified",
      "related": [
        "/api/dot/vector2",
        "/api/dot/bounds2",
        "/api/dot/range"
      ],
      "prerequisites": [
        "/api/dot/vector2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 491,
      "url": "https://veillette.github.io/Almanach/api/dot/random"
    },
    {
      "path": "/api/dot/range",
      "sourceFile": "docs/api/dot/range.md",
      "title": "Range",
      "description": "A min/max pair used for NumberProperty validation and slider ranges.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Range"
      ],
      "status": "verified",
      "related": [
        "/api/axon/number-property",
        "/api/dot/bounds2",
        "/api/dot/dot-utils"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 533,
      "url": "https://veillette.github.io/Almanach/api/dot/range"
    },
    {
      "path": "/api/dot/range-with-value",
      "sourceFile": "docs/api/dot/range-with-value.md",
      "title": "RangeWithValue",
      "description": "A Range subclass that also tracks a required default value within the min/max interval.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "RangeWithValue",
        "Range"
      ],
      "status": "verified",
      "related": [
        "/api/dot/range",
        "/api/axon/number-property"
      ],
      "prerequisites": [
        "/api/dot/range"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 391,
      "url": "https://veillette.github.io/Almanach/api/dot/range-with-value"
    },
    {
      "path": "/api/dot/ray2",
      "sourceFile": "docs/api/dot/ray2.md",
      "title": "Ray2",
      "description": "A 2D ray (origin position plus a unit direction vector), used for hit-testing and intersection queries.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Ray2",
        "math",
        "hit-testing"
      ],
      "status": "verified",
      "related": [
        "/api/dot/vector2",
        "/api/dot/transform3"
      ],
      "prerequisites": [
        "/api/dot/vector2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 386,
      "url": "https://veillette.github.io/Almanach/api/dot/ray2"
    },
    {
      "path": "/api/dot/ray3",
      "sourceFile": "docs/api/dot/ray3.md",
      "title": "Ray3",
      "description": "A 3D ray (origin plus unit direction) used for picking and intersection queries in 3D-flavored code such as mobius.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Ray3",
        "Vector3",
        "Plane3",
        "math",
        "hit-testing"
      ],
      "status": "complete",
      "related": [
        "/api/dot/ray2",
        "/api/dot/vector3",
        "/api/dot/quaternion-and-plane3"
      ],
      "prerequisites": [
        "/api/dot/ray2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 371,
      "url": "https://veillette.github.io/Almanach/api/dot/ray3"
    },
    {
      "path": "/api/dot/transform3",
      "sourceFile": "docs/api/dot/transform3.md",
      "title": "Transform3",
      "description": "A cached, observable wrapper around a Matrix3, providing forward/inverse transform methods for points, deltas, bounds, and shapes.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Transform3",
        "transform",
        "matrix"
      ],
      "status": "verified",
      "related": [
        "/api/dot/matrix3",
        "/api/dot/vector2",
        "/api/dot/bounds2",
        "/api/dot/ray2",
        "/api/phetcommon/model-view-transform"
      ],
      "prerequisites": [
        "/api/dot/matrix3"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 713,
      "url": "https://veillette.github.io/Almanach/api/dot/transform3"
    },
    {
      "path": "/api/dot/dot-utils",
      "sourceFile": "docs/api/dot/dot-utils.md",
      "title": "Utils",
      "description": "dot's numeric helper functions: clamp, linear, roundSymmetric, and friends.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Utils",
        "math"
      ],
      "status": "verified",
      "related": [
        "/api/dot/range",
        "/api/dot/vector2"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 444,
      "url": "https://veillette.github.io/Almanach/api/dot/dot-utils"
    },
    {
      "path": "/api/dot/vector2",
      "sourceFile": "docs/api/dot/vector2.md",
      "title": "Vector2",
      "description": "The 2D vector/point class used throughout SceneryStack's math and positioning APIs.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Vector2",
        "math"
      ],
      "status": "verified",
      "related": [
        "/api/dot/vector3",
        "/api/dot/bounds2",
        "/api/dot/matrix3",
        "/api/phetcommon/model-view-transform"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 772,
      "url": "https://veillette.github.io/Almanach/api/dot/vector2"
    },
    {
      "path": "/api/dot/vector2-property",
      "sourceFile": "docs/api/dot/vector2-property.md",
      "title": "Vector2Property",
      "description": "A Property<Vector2> subclass with built-in NaN and optional-bounds validation, the standard type for model positions.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Vector2Property",
        "Vector2",
        "Property",
        "position"
      ],
      "status": "complete",
      "related": [
        "/api/dot/vector2",
        "/api/axon/property",
        "/api/dot/bounds2"
      ],
      "prerequisites": [
        "/api/axon/property",
        "/api/dot/vector2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 307,
      "url": "https://veillette.github.io/Almanach/api/dot/vector2-property"
    },
    {
      "path": "/api/dot/vector3",
      "sourceFile": "docs/api/dot/vector3.md",
      "title": "Vector3",
      "description": "The 3D vector class used for color math and 3D-flavored simulations.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Vector3",
        "math"
      ],
      "status": "verified",
      "related": [
        "/api/dot/vector2",
        "/api/dot/matrix3"
      ],
      "prerequisites": [
        "/api/dot/vector2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 543,
      "url": "https://veillette.github.io/Almanach/api/dot/vector3"
    },
    {
      "path": "/api/dot/vector4",
      "sourceFile": "docs/api/dot/vector4.md",
      "title": "Vector4",
      "description": "The 4D vector class used for homogeneous coordinates and RGBA-style color math.",
      "category": "api",
      "library": "dot",
      "tags": [
        "dot",
        "Vector4",
        "math"
      ],
      "status": "verified",
      "related": [
        "/api/dot/vector2",
        "/api/dot/vector3",
        "/api/dot/matrix4"
      ],
      "prerequisites": [
        "/api/dot/vector2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 676,
      "url": "https://veillette.github.io/Almanach/api/dot/vector4"
    },
    {
      "path": "/api/joist/credits-node",
      "sourceFile": "docs/api/joist/credits-node.md",
      "title": "CreditsNode",
      "description": "Renders a simulation's credits (design, development, team, contributors, translation-independent thanks, etc.) as the content of the About dialog.",
      "category": "api",
      "library": "joist",
      "tags": [
        "joist",
        "CreditsNode",
        "credits",
        "AboutDialog",
        "Sim"
      ],
      "status": "complete",
      "related": [
        "/api/joist/sim"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 447,
      "url": "https://veillette.github.io/Almanach/api/joist/credits-node"
    },
    {
      "path": "/api/joist/highlight-node",
      "sourceFile": "docs/api/joist/highlight-node.md",
      "title": "HighlightNode",
      "description": "An HBox of two gradient-faded vertical bars used as the press/hover highlight behind navigation bar buttons.",
      "category": "api",
      "library": "joist",
      "tags": [
        "joist",
        "HighlightNode",
        "navigation-bar",
        "highlight"
      ],
      "status": "complete",
      "related": [
        "/api/joist/navigation-bar",
        "/api/joist/joist-button"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 288,
      "url": "https://veillette.github.io/Almanach/api/joist/highlight-node"
    },
    {
      "path": "/api/joist/home-screen",
      "sourceFile": "docs/api/joist/home-screen.md",
      "title": "HomeScreen",
      "description": "The auto-created Screen showing icon buttons for every screen in a multi-screen Sim.",
      "category": "api",
      "library": "joist",
      "tags": [
        "joist",
        "HomeScreen",
        "Screen",
        "Sim"
      ],
      "status": "verified",
      "related": [
        "/api/joist/sim",
        "/api/joist/screen",
        "/api/joist/screen-icon",
        "/api/joist/navigation-bar"
      ],
      "prerequisites": [
        "/api/joist/sim",
        "/api/joist/screen"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 395,
      "url": "https://veillette.github.io/Almanach/api/joist/home-screen"
    },
    {
      "path": "/api/joist/joist-button",
      "sourceFile": "docs/api/joist/joist-button.md",
      "title": "JoistButton",
      "description": "The base class behind chrome buttons like HomeButton - custom black/white highlighting instead of the standard sun button look.",
      "category": "api",
      "library": "joist",
      "tags": [
        "joist",
        "JoistButton",
        "Sim",
        "NavigationBar",
        "button"
      ],
      "status": "complete",
      "related": [
        "/api/joist/navigation-bar",
        "/api/joist/home-screen",
        "/api/tandem/tandem"
      ],
      "prerequisites": [
        "/api/joist/sim",
        "/api/joist/navigation-bar"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 471,
      "url": "https://veillette.github.io/Almanach/api/joist/joist-button"
    },
    {
      "path": "/api/joist/look-and-feel",
      "sourceFile": "docs/api/joist/look-and-feel.md",
      "title": "LookAndFeel",
      "description": "The Sim-wide manager of the current screen's background color and the derived navigation-bar colors that keep it readable against either black or white.",
      "category": "api",
      "library": "joist",
      "tags": [
        "joist",
        "LookAndFeel",
        "Sim",
        "Screen",
        "color",
        "navigation-bar"
      ],
      "status": "complete",
      "related": [
        "/api/joist/sim",
        "/api/joist/screen",
        "/api/joist/navigation-bar",
        "/api/scenery/color-property-and-profile-color-property"
      ],
      "prerequisites": [
        "/api/joist/sim"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 396,
      "url": "https://veillette.github.io/Almanach/api/joist/look-and-feel"
    },
    {
      "path": "/api/joist/navigation-bar",
      "sourceFile": "docs/api/joist/navigation-bar.md",
      "title": "NavigationBar",
      "description": "The bar of screen buttons, title, and PhET menu shown at the bottom of every running Sim.",
      "category": "api",
      "library": "joist",
      "tags": [
        "joist",
        "NavigationBar",
        "Screen",
        "Sim"
      ],
      "status": "verified",
      "related": [
        "/api/joist/sim",
        "/api/joist/screen",
        "/api/joist/screen-icon",
        "/api/joist/home-screen"
      ],
      "prerequisites": [
        "/api/joist/sim",
        "/api/joist/screen"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 398,
      "url": "https://veillette.github.io/Almanach/api/joist/navigation-bar"
    },
    {
      "path": "/api/joist/preferences-model-and-dialog",
      "sourceFile": "docs/api/joist/preferences-model-and-dialog.md",
      "title": "PreferencesModel and PreferencesDialog",
      "description": "PreferencesModel declares which Preferences tabs a Sim supports; PreferencesDialog is the tabbed dialog Sim builds automatically from it.",
      "category": "api",
      "library": "joist",
      "tags": [
        "joist",
        "PreferencesModel",
        "PreferencesDialog",
        "Sim",
        "preferences"
      ],
      "status": "verified",
      "related": [
        "/api/joist/sim",
        "/guides/preferences-and-feature-flags"
      ],
      "prerequisites": [
        "/api/joist/sim"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 665,
      "url": "https://veillette.github.io/Almanach/api/joist/preferences-model-and-dialog"
    },
    {
      "path": "/api/joist/preferences-panel-components",
      "sourceFile": "docs/api/joist/preferences-panel-components.md",
      "title": "PreferencesPanel, PreferencesPanelSection, PreferencesControl, PreferencesTabs, and PreferencesTab",
      "description": "The building blocks the Preferences Dialog is assembled from, and the two of them (PreferencesPanelSection, PreferencesControl) sim authors use to build custom Preferences content.",
      "category": "api",
      "library": "joist",
      "tags": [
        "joist",
        "PreferencesPanel",
        "PreferencesPanelSection",
        "PreferencesControl",
        "PreferencesTabs",
        "PreferencesTab",
        "PreferencesModel",
        "PreferencesDialog"
      ],
      "status": "complete",
      "related": [
        "/api/joist/preferences-model-and-dialog",
        "/api/joist/look-and-feel"
      ],
      "prerequisites": [
        "/api/joist/preferences-model-and-dialog"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 851,
      "url": "https://veillette.github.io/Almanach/api/joist/preferences-panel-components"
    },
    {
      "path": "/api/joist/region-culture-and-locale-selection",
      "sourceFile": "docs/api/joist/region-culture-and-locale-selection.md",
      "title": "Region, Culture, and Locale Selection UI",
      "description": "The runtime language/locale Property, the region-and-culture Property and its localized-image helper, and the Preferences UI built on top of both.",
      "category": "api",
      "library": "joist",
      "tags": [
        "joist",
        "LocalizedImageProperty",
        "RegionAndCultureComboBox",
        "LanguageSelectionNode",
        "LocalePanel",
        "localeProperty",
        "regionAndCultureProperty",
        "i18n"
      ],
      "status": "complete",
      "related": [
        "/guides/translation-and-localization",
        "/api/joist/preferences-model-and-dialog",
        "/api/axon/derived-property"
      ],
      "prerequisites": [
        "/guides/translation-and-localization",
        "/api/joist/preferences-model-and-dialog"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 653,
      "url": "https://veillette.github.io/Almanach/api/joist/region-culture-and-locale-selection"
    },
    {
      "path": "/api/joist/screen",
      "sourceFile": "docs/api/joist/screen.md",
      "title": "Screen",
      "description": "Pairing a model factory and view factory into one selectable unit of a Sim.",
      "category": "api",
      "library": "joist",
      "tags": [
        "joist",
        "Screen"
      ],
      "status": "verified",
      "related": [
        "/api/joist/sim",
        "/api/joist/screen-view",
        "/api/tandem/tandem",
        "/getting-started/your-first-simulation"
      ],
      "prerequisites": [
        "/api/joist/sim",
        "/api/joist/screen-view"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 624,
      "url": "https://veillette.github.io/Almanach/api/joist/screen"
    },
    {
      "path": "/api/joist/screen-icon",
      "sourceFile": "docs/api/joist/screen-icon.md",
      "title": "ScreenIcon",
      "description": "A Node wrapper that centers and scales an icon onto a fixed-size background, for use as a Screen's homeScreenIcon or navigationBarIcon.",
      "category": "api",
      "library": "joist",
      "tags": [
        "joist",
        "ScreenIcon",
        "Screen"
      ],
      "status": "verified",
      "related": [
        "/api/joist/screen",
        "/api/joist/home-screen",
        "/api/joist/navigation-bar"
      ],
      "prerequisites": [
        "/api/joist/screen"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 431,
      "url": "https://veillette.github.io/Almanach/api/joist/screen-icon"
    },
    {
      "path": "/api/joist/screen-view",
      "sourceFile": "docs/api/joist/screen-view.md",
      "title": "ScreenView",
      "description": "The root Node of a Screen's view, with layoutBounds and visibleBoundsProperty.",
      "category": "api",
      "library": "joist",
      "tags": [
        "joist",
        "ScreenView"
      ],
      "status": "verified",
      "related": [
        "/api/joist/screen",
        "/api/joist/sim",
        "/api/scenery-phet/reset-all-button",
        "/getting-started/your-first-simulation"
      ],
      "prerequisites": [
        "/api/joist/screen"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 433,
      "url": "https://veillette.github.io/Almanach/api/joist/screen-view"
    },
    {
      "path": "/api/joist/sim",
      "sourceFile": "docs/api/joist/sim.md",
      "title": "Sim",
      "description": "The top-level application object owning Screens, the navigation bar, and the sim loop.",
      "category": "api",
      "library": "joist",
      "tags": [
        "joist",
        "Sim"
      ],
      "status": "verified",
      "related": [
        "/api/joist/screen",
        "/api/joist/screen-view",
        "/api/tandem/tandem",
        "/getting-started/your-first-simulation"
      ],
      "prerequisites": [
        "/getting-started/your-first-simulation",
        "/api/joist/screen"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 592,
      "url": "https://veillette.github.io/Almanach/api/joist/sim"
    },
    {
      "path": "/api/joist/sim-info",
      "sourceFile": "docs/api/joist/sim-info.md",
      "title": "SimInfo",
      "description": "A snapshot of runtime/browser/simulation diagnostic data, built once per Sim and surfaced via the About dialog and PhET-iO data stream.",
      "category": "api",
      "library": "joist",
      "tags": [
        "joist",
        "SimInfo",
        "Sim",
        "phet-io"
      ],
      "status": "verified",
      "related": [
        "/api/joist/sim"
      ],
      "prerequisites": [
        "/api/joist/sim"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 327,
      "url": "https://veillette.github.io/Almanach/api/joist/sim-info"
    },
    {
      "path": "/api/kite/arc",
      "sourceFile": "docs/api/kite/arc.md",
      "title": "Arc",
      "description": "A circular arc segment defined by center, radius, and start/end angles — one of the pieces a Shape's subpaths are built from.",
      "category": "api",
      "library": "kite",
      "tags": [
        "kite",
        "Arc",
        "segment",
        "path"
      ],
      "status": "verified",
      "related": [
        "/api/kite/shape",
        "/api/kite/elliptical-arc",
        "/api/kite/line-segment",
        "/api/kite/line-styles",
        "/api/dot/vector2"
      ],
      "prerequisites": [
        "/api/kite/shape"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 539,
      "url": "https://veillette.github.io/Almanach/api/kite/arc"
    },
    {
      "path": "/api/kite/cubic",
      "sourceFile": "docs/api/kite/cubic.md",
      "title": "Cubic",
      "description": "A cubic Bezier curve segment defined by a start point, two control points, and an end point.",
      "category": "api",
      "library": "kite",
      "tags": [
        "kite",
        "Cubic",
        "bezier",
        "segment",
        "path"
      ],
      "status": "verified",
      "related": [
        "/api/kite/shape",
        "/api/kite/quadratic",
        "/api/kite/line-segment",
        "/api/dot/vector2"
      ],
      "prerequisites": [
        "/api/kite/shape"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 475,
      "url": "https://veillette.github.io/Almanach/api/kite/cubic"
    },
    {
      "path": "/api/kite/elliptical-arc",
      "sourceFile": "docs/api/kite/elliptical-arc.md",
      "title": "EllipticalArc",
      "description": "A generalization of Arc that sweeps an ellipse (independent x/y radii, plus rotation) rather than a circle.",
      "category": "api",
      "library": "kite",
      "tags": [
        "kite",
        "EllipticalArc",
        "segment",
        "path"
      ],
      "status": "verified",
      "related": [
        "/api/kite/shape",
        "/api/kite/arc",
        "/api/kite/line-styles",
        "/api/dot/vector2"
      ],
      "prerequisites": [
        "/api/kite/arc"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 508,
      "url": "https://veillette.github.io/Almanach/api/kite/elliptical-arc"
    },
    {
      "path": "/api/kite/graph-and-boolean-operations",
      "sourceFile": "docs/api/kite/graph-and-boolean-operations.md",
      "title": "Graph and Boolean Shape Operations",
      "description": "The Graph machinery powering Shape.union/intersection/xor and clipping — how to combine two Shapes, at a practical level.",
      "category": "api",
      "library": "kite",
      "tags": [
        "kite",
        "Graph",
        "Shape",
        "Face",
        "HalfEdge",
        "Loop",
        "Boundary",
        "Edge",
        "Vertex",
        "boolean-operations"
      ],
      "status": "complete",
      "related": [
        "/api/kite/shape",
        "/api/kite/subpath",
        "/api/kite/segment"
      ],
      "prerequisites": [
        "/api/kite/shape"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 659,
      "url": "https://veillette.github.io/Almanach/api/kite/graph-and-boolean-operations"
    },
    {
      "path": "/api/kite/line-segment",
      "sourceFile": "docs/api/kite/line-segment.md",
      "title": "Line",
      "description": "kite's straight-line path segment (pure geometry, not a renderable Node) — one of the pieces a Shape's subpaths are built from.",
      "category": "api",
      "library": "kite",
      "tags": [
        "kite",
        "Line",
        "KiteLine",
        "segment",
        "path"
      ],
      "status": "verified",
      "related": [
        "/api/kite/shape",
        "/api/kite/arc",
        "/api/kite/line-styles",
        "/api/kite/subpath",
        "/api/scenery/line",
        "/api/dot/vector2"
      ],
      "prerequisites": [
        "/api/kite/shape"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 473,
      "url": "https://veillette.github.io/Almanach/api/kite/line-segment"
    },
    {
      "path": "/api/kite/line-styles",
      "sourceFile": "docs/api/kite/line-styles.md",
      "title": "LineStyles",
      "description": "The stroke-rendering options (width, cap, join, dash, miter limit) used to turn a Shape's outline into a stroked shape.",
      "category": "api",
      "library": "kite",
      "tags": [
        "kite",
        "LineStyles",
        "stroke",
        "path"
      ],
      "status": "verified",
      "related": [
        "/api/kite/shape",
        "/api/kite/arc",
        "/api/kite/line-segment",
        "/api/kite/subpath"
      ],
      "prerequisites": [
        "/api/kite/shape"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 552,
      "url": "https://veillette.github.io/Almanach/api/kite/line-styles"
    },
    {
      "path": "/api/kite/quadratic",
      "sourceFile": "docs/api/kite/quadratic.md",
      "title": "Quadratic",
      "description": "A quadratic Bezier curve segment defined by a start point, one control point, and an end point.",
      "category": "api",
      "library": "kite",
      "tags": [
        "kite",
        "Quadratic",
        "bezier",
        "segment",
        "path"
      ],
      "status": "verified",
      "related": [
        "/api/kite/shape",
        "/api/kite/cubic",
        "/api/kite/line-segment",
        "/api/dot/vector2"
      ],
      "prerequisites": [
        "/api/kite/shape"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 470,
      "url": "https://veillette.github.io/Almanach/api/kite/quadratic"
    },
    {
      "path": "/api/kite/ray-and-segment-intersections",
      "sourceFile": "docs/api/kite/ray-and-segment-intersections.md",
      "title": "RayIntersection and SegmentIntersection",
      "description": "The two small result types returned by kite's ray-casting and segment/segment intersection queries.",
      "category": "api",
      "library": "kite",
      "tags": [
        "kite",
        "RayIntersection",
        "SegmentIntersection",
        "Segment",
        "Shape",
        "intersection"
      ],
      "status": "complete",
      "related": [
        "/api/kite/segment",
        "/api/kite/shape",
        "/api/dot/ray2"
      ],
      "prerequisites": [
        "/api/kite/segment"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 539,
      "url": "https://veillette.github.io/Almanach/api/kite/ray-and-segment-intersections"
    },
    {
      "path": "/api/kite/segment",
      "sourceFile": "docs/api/kite/segment.md",
      "title": "Segment",
      "description": "The abstract base class Arc, Cubic, Quadratic, Line, and EllipticalArc all extend — the shared parametric contract every segment type implements.",
      "category": "api",
      "library": "kite",
      "tags": [
        "kite",
        "Segment",
        "Arc",
        "Cubic",
        "Quadratic",
        "Line",
        "EllipticalArc",
        "path"
      ],
      "status": "complete",
      "related": [
        "/api/kite/arc",
        "/api/kite/cubic",
        "/api/kite/quadratic",
        "/api/kite/line-segment",
        "/api/kite/elliptical-arc",
        "/api/kite/shape",
        "/api/kite/subpath"
      ],
      "prerequisites": [
        "/api/kite/shape",
        "/api/kite/subpath"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 855,
      "url": "https://veillette.github.io/Almanach/api/kite/segment"
    },
    {
      "path": "/api/kite/shape",
      "sourceFile": "docs/api/kite/shape.md",
      "title": "Shape",
      "description": "kite's path-description class behind Path, and its common construction/query methods.",
      "category": "api",
      "library": "kite",
      "tags": [
        "kite",
        "Shape",
        "path"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/path",
        "/api/dot/bounds2",
        "/api/dot/matrix3",
        "/api/dot/vector2"
      ],
      "prerequisites": [
        "/api/dot/vector2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 714,
      "url": "https://veillette.github.io/Almanach/api/kite/shape"
    },
    {
      "path": "/api/kite/subpath",
      "sourceFile": "docs/api/kite/subpath.md",
      "title": "Subpath",
      "description": "An ordered, connected run of segments within a Shape — the container between individual segments and the whole Shape.",
      "category": "api",
      "library": "kite",
      "tags": [
        "kite",
        "Subpath",
        "path"
      ],
      "status": "verified",
      "related": [
        "/api/kite/shape",
        "/api/kite/line-segment",
        "/api/kite/line-styles",
        "/api/dot/vector2",
        "/api/dot/matrix3"
      ],
      "prerequisites": [
        "/api/kite/shape"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 580,
      "url": "https://veillette.github.io/Almanach/api/kite/subpath"
    },
    {
      "path": "/api/kite/svg-path-parsing-and-serialization",
      "sourceFile": "docs/api/kite/svg-path-parsing-and-serialization.md",
      "title": "SVG Path Parsing and Serialization",
      "description": "How Shape parses an SVG path-data string into segments, serializes back out with getSVGPath(), and the svgNumber/svgPath exports underneath both directions.",
      "category": "api",
      "library": "kite",
      "tags": [
        "kite",
        "svgPath",
        "svgNumber",
        "Shape",
        "SVG"
      ],
      "status": "complete",
      "related": [
        "/api/kite/shape",
        "/api/kite/segment"
      ],
      "prerequisites": [
        "/api/kite/shape"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 525,
      "url": "https://veillette.github.io/Almanach/api/kite/svg-path-parsing-and-serialization"
    },
    {
      "path": "/api/mobius/three-isometric-node",
      "sourceFile": "docs/api/mobius/three-isometric-node.md",
      "title": "ThreeIsometricNode",
      "description": "A scenery Node that fills a ScreenView's layout bounds with an isometric-scaled three.js viewport for full-screen 3D content.",
      "category": "api",
      "library": "mobius",
      "tags": [
        "mobius",
        "ThreeIsometricNode",
        "ThreeNode",
        "three.js",
        "3d",
        "isometric"
      ],
      "status": "verified",
      "related": [
        "/api/mobius/node-wrapping-conventions",
        "/examples/three-js-integration",
        "/api/dot/bounds2"
      ],
      "prerequisites": [
        "/api/mobius/scene-and-camera-setup",
        "/api/mobius/node-wrapping-conventions"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 351,
      "url": "https://veillette.github.io/Almanach/api/mobius/three-isometric-node"
    },
    {
      "path": "/api/mobius/node-wrapping-conventions",
      "sourceFile": "docs/api/mobius/node-wrapping-conventions.md",
      "title": "ThreeNode, ThreeInstrumentable, and ThreeObject3DPhetioObject",
      "description": "The scenery Node that hosts a fixed-size three.js viewport, and the mixin/PhetioObject pair used to give individual three.js objects a PhET-iO address.",
      "category": "api",
      "library": "mobius",
      "tags": [
        "mobius",
        "ThreeNode",
        "ThreeInstrumentable",
        "ThreeObject3DPhetioObject",
        "three.js",
        "phet-io"
      ],
      "status": "verified",
      "related": [
        "/api/mobius/scene-and-camera-setup",
        "/api/mobius/three-isometric-node",
        "/api/mobius/three-utils-helpers",
        "/patterns/phet-io-instrumentation-pattern",
        "/examples/three-js-integration",
        "/api/tandem/phetio-object"
      ],
      "prerequisites": [
        "/api/mobius/scene-and-camera-setup",
        "/examples/three-js-integration"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 702,
      "url": "https://veillette.github.io/Almanach/api/mobius/node-wrapping-conventions"
    },
    {
      "path": "/api/mobius/scene-and-camera-setup",
      "sourceFile": "docs/api/mobius/scene-and-camera-setup.md",
      "title": "ThreeStage",
      "description": "The three.js scene, camera, and WebGLRenderer that every mobius 3D view is built around.",
      "category": "api",
      "library": "mobius",
      "tags": [
        "mobius",
        "ThreeStage",
        "three.js",
        "webgl",
        "3d"
      ],
      "status": "verified",
      "related": [
        "/api/mobius/three-utils-helpers",
        "/api/mobius/node-wrapping-conventions",
        "/examples/three-js-integration",
        "/api/dot/vector3"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack",
        "/getting-started/scenery-application-vs-standalone-library"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 664,
      "url": "https://veillette.github.io/Almanach/api/mobius/scene-and-camera-setup"
    },
    {
      "path": "/api/mobius/three-utils-helpers",
      "sourceFile": "docs/api/mobius/three-utils-helpers.md",
      "title": "ThreeUtils",
      "description": "Static helpers for converting between dot and three.js vector types, building quad geometry, loading textures, and detecting WebGL support.",
      "category": "api",
      "library": "mobius",
      "tags": [
        "mobius",
        "ThreeUtils",
        "three.js",
        "webgl",
        "3d"
      ],
      "status": "verified",
      "related": [
        "/api/mobius/scene-and-camera-setup",
        "/api/mobius/node-wrapping-conventions",
        "/api/dot/vector3"
      ],
      "prerequisites": [
        "/api/mobius/scene-and-camera-setup"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 445,
      "url": "https://veillette.github.io/Almanach/api/mobius/three-utils-helpers"
    },
    {
      "path": "/api/nitroglycerin/atom-and-element",
      "sourceFile": "docs/api/nitroglycerin/atom-and-element.md",
      "title": "Atom, Element, and AtomNode",
      "description": "The model layer for a single atom - immutable per-element physical constants (Element), a lightweight per-instance wrapper (Atom), and its shaded-sphere view (AtomNode).",
      "category": "api",
      "library": "nitroglycerin",
      "tags": [
        "nitroglycerin",
        "Atom",
        "Element",
        "AtomNode",
        "chemistry"
      ],
      "status": "verified",
      "related": [
        "/api/nitroglycerin/molecule-node",
        "/api/nitroglycerin/chem-utils",
        "/patterns/model-view-separation"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 542,
      "url": "https://veillette.github.io/Almanach/api/nitroglycerin/atom-and-element"
    },
    {
      "path": "/api/nitroglycerin/chem-utils",
      "sourceFile": "docs/api/nitroglycerin/chem-utils.md",
      "title": "ChemUtils",
      "description": "Plain-object chemistry helpers for molecular formulas, Hill-system sorting, and HTML subscript formatting in nitroglycerin sims.",
      "category": "api",
      "library": "nitroglycerin",
      "tags": [
        "nitroglycerin",
        "ChemUtils",
        "Element",
        "chemistry",
        "formula"
      ],
      "status": "verified",
      "related": [
        "/api/nitroglycerin/atom-and-element",
        "/api/nitroglycerin/molecule-node"
      ],
      "prerequisites": [
        "/api/nitroglycerin/atom-and-element"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 320,
      "url": "https://veillette.github.io/Almanach/api/nitroglycerin/chem-utils"
    },
    {
      "path": "/api/nitroglycerin/molecule-node",
      "sourceFile": "docs/api/nitroglycerin/molecule-node.md",
      "title": "MoleculeNode",
      "description": "The base class every pre-built molecule Node (H2ONode, CO2Node, and ~40 others) extends, composing a fixed arrangement of AtomNodes centered at the origin.",
      "category": "api",
      "library": "nitroglycerin",
      "tags": [
        "nitroglycerin",
        "MoleculeNode",
        "AtomNode",
        "chemistry"
      ],
      "status": "verified",
      "related": [
        "/api/nitroglycerin/atom-and-element",
        "/patterns/model-view-separation",
        "/patterns/composing-view-nodes"
      ],
      "prerequisites": [
        "/api/nitroglycerin/atom-and-element"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 446,
      "url": "https://veillette.github.io/Almanach/api/nitroglycerin/molecule-node"
    },
    {
      "path": "/api/phet-core/collection-utilities",
      "sourceFile": "docs/api/phet-core/collection-utilities.md",
      "title": "arrayRemove, arrayDifference, and cleanArray",
      "description": "Small, dependency-free array helpers for mutation-in-place, set-style comparison, and resetting an array without reallocating it.",
      "category": "api",
      "library": "phet-core",
      "tags": [
        "phet-core",
        "arrayRemove",
        "arrayDifference",
        "cleanArray",
        "array",
        "collections"
      ],
      "status": "verified",
      "related": [
        "/api/phet-core/optionize-and-merge",
        "/api/phet-core/assertion-helpers"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 478,
      "url": "https://veillette.github.io/Almanach/api/phet-core/collection-utilities"
    },
    {
      "path": "/api/phet-core/assertion-helpers",
      "sourceFile": "docs/api/phet-core/assertion-helpers.md",
      "title": "assertHasProperties and assertMutuallyExclusiveOptions",
      "description": "Two development-time assertion helpers for validating shape - that an object has certain members, and that certain option keys are never combined.",
      "category": "api",
      "library": "phet-core",
      "tags": [
        "phet-core",
        "assertHasProperties",
        "assertMutuallyExclusiveOptions",
        "assertions",
        "options"
      ],
      "status": "verified",
      "related": [
        "/patterns/options-pattern",
        "/api/phet-core/optionize-and-merge"
      ],
      "prerequisites": [
        "/patterns/options-pattern"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 452,
      "url": "https://veillette.github.io/Almanach/api/phet-core/assertion-helpers"
    },
    {
      "path": "/api/phet-core/enumeration-value",
      "sourceFile": "docs/api/phet-core/enumeration-value.md",
      "title": "EnumerationValue",
      "description": "The base class instances of a PhET-style closed enumeration extend, providing name/enumeration bookkeeping once paired with Enumeration.",
      "category": "api",
      "library": "phet-core",
      "tags": [
        "phet-core",
        "EnumerationValue",
        "Enumeration",
        "enumeration"
      ],
      "status": "verified",
      "related": [
        "/patterns/enumeration-pattern",
        "/api/phet-core/optionize-and-merge",
        "/api/axon/enumeration-property"
      ],
      "prerequisites": [
        "/patterns/enumeration-pattern"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 351,
      "url": "https://veillette.github.io/Almanach/api/phet-core/enumeration-value"
    },
    {
      "path": "/api/phet-core/optionize-and-merge",
      "sourceFile": "docs/api/phet-core/optionize-and-merge.md",
      "title": "optionize and merge",
      "description": "The two building blocks behind the options pattern - optionize for type-checked defaulting, merge for its untyped runtime engine.",
      "category": "api",
      "library": "phet-core",
      "tags": [
        "phet-core",
        "optionize",
        "merge",
        "combineOptions",
        "options"
      ],
      "status": "verified",
      "related": [
        "/patterns/options-pattern",
        "/api/phet-core/enumeration-value",
        "/api/phet-core/assertion-helpers"
      ],
      "prerequisites": [
        "/patterns/options-pattern"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 534,
      "url": "https://veillette.github.io/Almanach/api/phet-core/optionize-and-merge"
    },
    {
      "path": "/api/phet-core/orientation",
      "sourceFile": "docs/api/phet-core/orientation.md",
      "title": "Orientation",
      "description": "The HORIZONTAL/VERTICAL enumeration threaded through layout code (FlowBox, sliders, bamboo charts) to write orientation-agnostic logic.",
      "category": "api",
      "library": "phet-core",
      "tags": [
        "phet-core",
        "Orientation",
        "EnumerationValue",
        "layout",
        "enumeration"
      ],
      "status": "complete",
      "related": [
        "/api/phet-core/enumeration-value",
        "/api/bamboo/gridlines-and-tick-marks",
        "/api/bamboo/axis-nodes"
      ],
      "prerequisites": [
        "/api/phet-core/enumeration-value"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 526,
      "url": "https://veillette.github.io/Almanach/api/phet-core/orientation"
    },
    {
      "path": "/api/phet-core/platform-detection",
      "sourceFile": "docs/api/phet-core/platform-detection.md",
      "title": "platform",
      "description": "A plain object of boolean browser/OS/engine feature-detection flags, computed once from navigator.userAgent at import time.",
      "category": "api",
      "library": "phet-core",
      "tags": [
        "phet-core",
        "platform",
        "browser",
        "useragent"
      ],
      "status": "complete",
      "related": [
        "/api/phet-core/assertion-helpers"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 380,
      "url": "https://veillette.github.io/Almanach/api/phet-core/platform-detection"
    },
    {
      "path": "/api/phet-core/pool",
      "sourceFile": "docs/api/phet-core/pool.md",
      "title": "Pool",
      "description": "A generic object-pooling utility that reuses instances instead of constructing new ones, reducing GC churn for objects created and discarded at high frequency.",
      "category": "api",
      "library": "phet-core",
      "tags": [
        "phet-core",
        "Pool",
        "Poolable",
        "performance",
        "memory"
      ],
      "status": "complete",
      "related": [
        "/api/phet-core/optionize-and-merge",
        "/patterns/dispose-and-memory-management"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 631,
      "url": "https://veillette.github.io/Almanach/api/phet-core/pool"
    },
    {
      "path": "/api/phetcommon/bucket",
      "sourceFile": "docs/api/phetcommon/bucket.md",
      "title": "Bucket",
      "description": "The model for a container UI element that other model objects can be dropped into and stacked within, as used in build-a-molecule-style sims.",
      "category": "api",
      "library": "phetcommon",
      "tags": [
        "phetcommon",
        "Bucket",
        "SphereBucket",
        "model"
      ],
      "status": "verified",
      "related": [
        "/api/phetcommon/model-view-transform",
        "/api/phetcommon/string-utils"
      ],
      "prerequisites": [
        "/api/tandem/phetio-object"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 503,
      "url": "https://veillette.github.io/Almanach/api/phetcommon/bucket"
    },
    {
      "path": "/api/phetcommon/fraction",
      "sourceFile": "docs/api/phetcommon/fraction.md",
      "title": "Fraction",
      "description": "An exact-arithmetic numerator/denominator fraction class with add/subtract/multiply/divide and reduction, used throughout PhET's fraction and ratio sims.",
      "category": "api",
      "library": "phetcommon",
      "tags": [
        "phetcommon",
        "Fraction",
        "model",
        "math"
      ],
      "status": "complete",
      "related": [
        "/api/phetcommon/model-view-transform",
        "/api/phetcommon/bucket"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 656,
      "url": "https://veillette.github.io/Almanach/api/phetcommon/fraction"
    },
    {
      "path": "/api/phetcommon/model-view-transform",
      "sourceFile": "docs/api/phetcommon/model-view-transform.md",
      "title": "ModelViewTransform2",
      "description": "Mapping between model coordinates (physical units, y-up) and view coordinates (pixels, y-down) with ModelViewTransform2.",
      "category": "api",
      "library": "phetcommon",
      "tags": [
        "phetcommon",
        "dot",
        "coordinates",
        "transform",
        "ModelViewTransform2"
      ],
      "status": "verified",
      "related": [
        "/patterns/drag-listeners"
      ],
      "prerequisites": [
        "/patterns/model-view-separation",
        "/api/dot/vector2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 447,
      "url": "https://veillette.github.io/Almanach/api/phetcommon/model-view-transform"
    },
    {
      "path": "/api/phetcommon/string-utils",
      "sourceFile": "docs/api/phetcommon/string-utils.md",
      "title": "StringUtils",
      "description": "phetcommon's small collection of string-handling helpers for translated pattern strings and bidirectional (LTR/RTL) text safety.",
      "category": "api",
      "library": "phetcommon",
      "tags": [
        "phetcommon",
        "StringUtils",
        "i18n",
        "strings"
      ],
      "status": "verified",
      "related": [
        "/api/axon/pattern-string-property",
        "/patterns/query-parameters-pattern"
      ],
      "prerequisites": [
        "/guides/internationalization-deep-dive"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 467,
      "url": "https://veillette.github.io/Almanach/api/phetcommon/string-utils"
    },
    {
      "path": "/api/query-string-machine/query-parameter-schema-conventions",
      "sourceFile": "docs/api/query-string-machine/query-parameter-schema-conventions.md",
      "title": "Query parameter schema conventions (QSMSchemaObject)",
      "description": "The shape of an individual QueryStringMachine schema entry - required and optional fields per type, and the validation rules the parser enforces.",
      "category": "api",
      "library": "query-string-machine",
      "tags": [
        "query-string-machine",
        "QSMSchemaObject",
        "schema",
        "validValues",
        "elementSchema",
        "query-parameters"
      ],
      "status": "verified",
      "related": [
        "/api/query-string-machine/query-string-machine-getall",
        "/patterns/query-parameters-pattern"
      ],
      "prerequisites": [
        "/patterns/query-parameters-pattern"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 662,
      "url": "https://veillette.github.io/Almanach/api/query-string-machine/query-parameter-schema-conventions"
    },
    {
      "path": "/api/query-string-machine/query-string-machine-getall",
      "sourceFile": "docs/api/query-string-machine/query-string-machine-getall.md",
      "title": "QueryStringMachine.getAll",
      "description": "Parsing every URL query parameter for a sim in one call, plus the related single-key and non-URL-string variants on the same object.",
      "category": "api",
      "library": "query-string-machine",
      "tags": [
        "query-string-machine",
        "QueryStringMachine",
        "getAll",
        "query-parameters"
      ],
      "status": "verified",
      "related": [
        "/patterns/query-parameters-pattern",
        "/api/query-string-machine/query-parameter-schema-conventions"
      ],
      "prerequisites": [
        "/patterns/query-parameters-pattern"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 545,
      "url": "https://veillette.github.io/Almanach/api/query-string-machine/query-string-machine-getall"
    },
    {
      "path": "/api/scenery/align-box",
      "sourceFile": "docs/api/scenery/align-box.md",
      "title": "AlignBox",
      "description": "A single-child container for alignment and fixed-size placement within layouts.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "AlignBox",
        "layout"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/api/scenery/flow-box",
        "/api/scenery/grid-box",
        "/api/dot/bounds2",
        "/guides/scenery-layout"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 549,
      "url": "https://veillette.github.io/Almanach/api/scenery/align-box"
    },
    {
      "path": "/api/scenery/align-group",
      "sourceFile": "docs/api/scenery/align-group.md",
      "title": "AlignGroup",
      "description": "Coordinates multiple independent AlignBoxes so they all share one common size.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "AlignGroup",
        "AlignBox",
        "layout"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/align-box",
        "/api/scenery/node",
        "/api/scenery/flow-box",
        "/guides/scenery-layout"
      ],
      "prerequisites": [
        "/api/scenery/align-box"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 509,
      "url": "https://veillette.github.io/Almanach/api/scenery/align-group"
    },
    {
      "path": "/api/scenery/animated-pan-zoom-listener",
      "sourceFile": "docs/api/scenery/animated-pan-zoom-listener.md",
      "title": "AnimatedPanZoomListener",
      "description": "A pan/zoom listener supporting trackpad, wheel, and keyboard gestures that animates a target Node toward its destination pan/scale.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "AnimatedPanZoomListener",
        "input",
        "pan",
        "zoom",
        "accessibility"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/api/scenery/display",
        "/api/scenery/trail",
        "/guides/scenery-input"
      ],
      "prerequisites": [
        "/api/scenery/node",
        "/api/scenery/display"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 562,
      "url": "https://veillette.github.io/Almanach/api/scenery/animated-pan-zoom-listener"
    },
    {
      "path": "/api/scenery/circle",
      "sourceFile": "docs/api/scenery/circle.md",
      "title": "Circle",
      "description": "A Path subclass for drawing circles by radius.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Circle",
        "Path"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/path",
        "/api/scenery/rectangle"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 181,
      "url": "https://veillette.github.io/Almanach/api/scenery/circle"
    },
    {
      "path": "/api/scenery/color",
      "sourceFile": "docs/api/scenery/color.md",
      "title": "Color",
      "description": "Scenery's RGBA color object - construction from RGB, hex, or CSS keywords, and mutation/derivation methods used as a Node's fill or stroke.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Color",
        "paint",
        "fill",
        "stroke"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/styling/color-profiles"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 590,
      "url": "https://veillette.github.io/Almanach/api/scenery/color"
    },
    {
      "path": "/api/scenery/color-property-and-profile-color-property",
      "sourceFile": "docs/api/scenery/color-property-and-profile-color-property.md",
      "title": "ColorProperty, ProfileColorProperty, and PaintColorProperty",
      "description": "The Property-driven pattern for colors that can change (by color profile, by derivation from another paint, or just by being observable) instead of being fixed values.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "ColorProperty",
        "ProfileColorProperty",
        "PaintColorProperty",
        "Color",
        "Property",
        "theming"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/color",
        "/api/scenery/node",
        "/api/joist/look-and-feel"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 677,
      "url": "https://veillette.github.io/Almanach/api/scenery/color-property-and-profile-color-property"
    },
    {
      "path": "/api/scenery/display",
      "sourceFile": "docs/api/scenery/display.md",
      "title": "Display",
      "description": "The root object that turns a Node tree into rendered/attached DOM output.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Display",
        "rendering",
        "input"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/guides/scenery-input"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 631,
      "url": "https://veillette.github.io/Almanach/api/scenery/display"
    },
    {
      "path": "/api/scenery/drag-listener",
      "sourceFile": "docs/api/scenery/drag-listener.md",
      "title": "DragListener",
      "description": "The pointer-driven drag listener that most draggable Nodes are built on.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "DragListener",
        "PressListener",
        "input",
        "drag"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/fire-listener",
        "/api/scenery/rich-drag-listener",
        "/api/scenery/keyboard-drag-listener",
        "/api/scenery/transform-tracker",
        "/api/scenery/hit-testing-and-picking"
      ],
      "prerequisites": [
        "/api/scenery/node",
        "/api/scenery/fire-listener"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 800,
      "url": "https://veillette.github.io/Almanach/api/scenery/drag-listener"
    },
    {
      "path": "/api/scenery/visual-filters",
      "sourceFile": "docs/api/scenery/visual-filters.md",
      "title": "Filter and the Node.filters visual effects",
      "description": "The Filter base class and its named subtypes (Brightness, Contrast, Grayscale, Invert, Sepia, HueRotate, Saturate) applied via Node.filters.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Filter",
        "Brightness",
        "Contrast",
        "Grayscale",
        "Invert",
        "Sepia",
        "HueRotate",
        "Saturate",
        "ColorMatrixFilter",
        "Node"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/node",
        "/api/scenery/color-property-and-profile-color-property"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 795,
      "url": "https://veillette.github.io/Almanach/api/scenery/visual-filters"
    },
    {
      "path": "/api/scenery/flow-box",
      "sourceFile": "docs/api/scenery/flow-box.md",
      "title": "FlowBox",
      "description": "A single-axis (row/column) auto-layout container.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "FlowBox",
        "HBox",
        "VBox",
        "layout"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/api/scenery/grid-box",
        "/api/scenery/align-box",
        "/guides/scenery-layout"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 616,
      "url": "https://veillette.github.io/Almanach/api/scenery/flow-box"
    },
    {
      "path": "/api/scenery/focus-manager",
      "sourceFile": "docs/api/scenery/focus-manager.md",
      "title": "FocusManager",
      "description": "The static class that tracks DOM focus, pointer focus, and reading-block focus across a scenery application.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "FocusManager",
        "focus",
        "accessibility",
        "pdomFocus"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/parallel-dom-deep-dive",
        "/api/scenery/interactive-highlighting",
        "/accessibility/pdom",
        "/accessibility/focus-highlights"
      ],
      "prerequisites": [
        "/accessibility/pdom"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 499,
      "url": "https://veillette.github.io/Almanach/api/scenery/focus-manager"
    },
    {
      "path": "/api/scenery/font",
      "sourceFile": "docs/api/scenery/font.md",
      "title": "Font",
      "description": "Scenery's immutable font-description object used by Text and RichText, and the lower-level class PhetFont builds on.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Font",
        "typography",
        "text"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/text",
        "/styling/typography-and-fonts"
      ],
      "prerequisites": [
        "/api/scenery/text"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 435,
      "url": "https://veillette.github.io/Almanach/api/scenery/font"
    },
    {
      "path": "/api/scenery/grid-box",
      "sourceFile": "docs/api/scenery/grid-box.md",
      "title": "GridBox",
      "description": "A two-dimensional grid auto-layout container.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "GridBox",
        "layout"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/api/scenery/flow-box",
        "/api/scenery/align-box",
        "/guides/scenery-layout"
      ],
      "prerequisites": [
        "/api/scenery/node",
        "/api/scenery/flow-box"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 637,
      "url": "https://veillette.github.io/Almanach/api/scenery/grid-box"
    },
    {
      "path": "/api/scenery/h-box",
      "sourceFile": "docs/api/scenery/h-box.md",
      "title": "HBox",
      "description": "A FlowBox convenience subclass fixed to horizontal orientation, for laying children out in a row.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "HBox",
        "VBox",
        "FlowBox",
        "layout"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/flow-box",
        "/api/scenery/v-box",
        "/api/scenery/grid-box",
        "/guides/scenery-layout"
      ],
      "prerequisites": [
        "/api/scenery/flow-box"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 259,
      "url": "https://veillette.github.io/Almanach/api/scenery/h-box"
    },
    {
      "path": "/api/scenery/highlight-rendering",
      "sourceFile": "docs/api/scenery/highlight-rendering.md",
      "title": "Highlight Rendering: HighlightPath and HighlightOverlay",
      "description": "The Path subclass and per-Display overlay that actually draw focus, interactive, and reading-block highlights.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "HighlightPath",
        "HighlightOverlay",
        "HighlightFromNode",
        "accessibility",
        "focus"
      ],
      "status": "complete",
      "related": [
        "/accessibility/focus-highlights",
        "/api/scenery/focus-manager",
        "/api/scenery/interactive-highlighting",
        "/api/scenery/voicing",
        "/api/scenery/transform-tracker",
        "/api/scenery/path"
      ],
      "prerequisites": [
        "/accessibility/focus-highlights"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 681,
      "url": "https://veillette.github.io/Almanach/api/scenery/highlight-rendering"
    },
    {
      "path": "/api/scenery/hit-testing-and-picking",
      "sourceFile": "docs/api/scenery/hit-testing-and-picking.md",
      "title": "Hit-Testing and Picking",
      "description": "How scenery decides what a pointer is over, and the Node options that shape it.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Picker",
        "pickable",
        "mouse-area",
        "touch-area",
        "cursor",
        "input"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/node",
        "/api/scenery/drag-listener",
        "/api/scenery/fire-listener",
        "/api/scenery/scenery-event"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 517,
      "url": "https://veillette.github.io/Almanach/api/scenery/hit-testing-and-picking"
    },
    {
      "path": "/api/scenery/hotkeys",
      "sourceFile": "docs/api/scenery/hotkeys.md",
      "title": "Hotkey, HotkeyData, and globalHotkeyRegistry",
      "description": "The declarative building blocks underneath KeyboardListener for defining keyboard shortcuts.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Hotkey",
        "HotkeyData",
        "globalHotkeyRegistry",
        "input",
        "keyboard",
        "accessibility"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/keyboard-listener",
        "/api/scenery/keyboard-drag-listener",
        "/api/scenery/node"
      ],
      "prerequisites": [
        "/api/scenery/keyboard-listener"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 719,
      "url": "https://veillette.github.io/Almanach/api/scenery/hotkeys"
    },
    {
      "path": "/api/scenery/separators-and-struts",
      "sourceFile": "docs/api/scenery/separators-and-struts.md",
      "title": "HSeparator, VSeparator, HStrut, and VStrut",
      "description": "Small layout-helper Nodes for adding a visible dividing line or invisible fixed-size gap inside a FlowBox/VBox/HBox.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "HSeparator",
        "VSeparator",
        "HStrut",
        "VStrut",
        "Separator",
        "FlowBox",
        "layout"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/spacer",
        "/api/scenery/flow-box",
        "/api/scenery/v-box",
        "/api/scenery/h-box"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 559,
      "url": "https://veillette.github.io/Almanach/api/scenery/separators-and-struts"
    },
    {
      "path": "/api/scenery/image",
      "sourceFile": "docs/api/scenery/image.md",
      "title": "Image",
      "description": "A Node that renders a raster image with optional Property-driven swapping.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Image",
        "mipmap"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/api/scenery/flow-box",
        "/api/scenery/grid-box"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 318,
      "url": "https://veillette.github.io/Almanach/api/scenery/image"
    },
    {
      "path": "/api/scenery/interactive-highlighting",
      "sourceFile": "docs/api/scenery/interactive-highlighting.md",
      "title": "InteractiveHighlighting",
      "description": "The trait that shows a highlight on pointer hover for interactive Nodes, mirroring keyboard focus highlights.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "InteractiveHighlighting",
        "highlight",
        "accessibility",
        "pointer"
      ],
      "status": "verified",
      "related": [
        "/accessibility/focus-highlights",
        "/api/scenery/voicing",
        "/api/scenery/focus-manager"
      ],
      "prerequisites": [
        "/accessibility/focus-highlights"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 380,
      "url": "https://veillette.github.io/Almanach/api/scenery/interactive-highlighting"
    },
    {
      "path": "/api/scenery/keyboard-drag-listener",
      "sourceFile": "docs/api/scenery/keyboard-drag-listener.md",
      "title": "KeyboardDragListener",
      "description": "The keyboard-driven equivalent of pointer dragging, moving a positionProperty with arrow keys or WASD.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "KeyboardDragListener",
        "input",
        "keyboard",
        "accessibility",
        "drag"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/api/scenery/keyboard-listener",
        "/api/scenery/rich-drag-listener",
        "/patterns/drag-listeners",
        "/guides/scenery-input"
      ],
      "prerequisites": [
        "/api/scenery/node",
        "/patterns/drag-listeners"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 436,
      "url": "https://veillette.github.io/Almanach/api/scenery/keyboard-drag-listener"
    },
    {
      "path": "/api/scenery/keyboard-listener",
      "sourceFile": "docs/api/scenery/keyboard-listener.md",
      "title": "KeyboardListener",
      "description": "A declarative hotkey listener that fires a callback when a specific combination of keys is pressed.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "KeyboardListener",
        "input",
        "keyboard",
        "accessibility",
        "hotkey"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/api/scenery/keyboard-drag-listener",
        "/api/scenery/fire-listener",
        "/guides/scenery-input"
      ],
      "prerequisites": [
        "/api/scenery/node",
        "/guides/scenery-input"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 580,
      "url": "https://veillette.github.io/Almanach/api/scenery/keyboard-listener"
    },
    {
      "path": "/api/scenery/line",
      "sourceFile": "docs/api/scenery/line.md",
      "title": "Line",
      "description": "A Path subclass for drawing single line segments.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Line",
        "Path"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/path",
        "/api/scenery/circle",
        "/api/scenery/rectangle"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 267,
      "url": "https://veillette.github.io/Almanach/api/scenery/line"
    },
    {
      "path": "/api/scenery/linear-gradient",
      "sourceFile": "docs/api/scenery/linear-gradient.md",
      "title": "LinearGradient",
      "description": "A paint type for straight-line color gradients, usable anywhere a Node accepts a fill or stroke.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "LinearGradient",
        "gradient",
        "paint",
        "fill",
        "stroke"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/color",
        "/api/scenery/radial-gradient",
        "/api/scenery/node"
      ],
      "prerequisites": [
        "/api/scenery/color"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 310,
      "url": "https://veillette.github.io/Almanach/api/scenery/linear-gradient"
    },
    {
      "path": "/api/scenery/manual-constraint",
      "sourceFile": "docs/api/scenery/manual-constraint.md",
      "title": "ManualConstraint",
      "description": "A low-level layout constraint for one-off imperative positioning logic that should automatically rerun when the involved Nodes' bounds change.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "ManualConstraint",
        "layout",
        "constraint"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/api/scenery/flow-box",
        "/api/scenery/grid-box",
        "/guides/scenery-layout"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 438,
      "url": "https://veillette.github.io/Almanach/api/scenery/manual-constraint"
    },
    {
      "path": "/api/scenery/node",
      "sourceFile": "docs/api/scenery/node.md",
      "title": "Node",
      "description": "The base class of every item in the scene graph and its core options.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Node",
        "scene-graph",
        "transform",
        "bounds"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/path",
        "/api/scenery/display",
        "/api/scenery/flow-box",
        "/guides/scenery-layout"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 679,
      "url": "https://veillette.github.io/Almanach/api/scenery/node"
    },
    {
      "path": "/api/scenery/parallel-dom-deep-dive",
      "sourceFile": "docs/api/scenery/parallel-dom-deep-dive.md",
      "title": "ParallelDOM",
      "description": "The trait every Node mixes in that provides its Parallel DOM options, such as tagName and accessibleName.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "ParallelDOM",
        "pdom",
        "accessibility",
        "tagName",
        "accessibleName"
      ],
      "status": "verified",
      "related": [
        "/accessibility/pdom",
        "/api/scenery/focus-manager",
        "/api/scenery/node"
      ],
      "prerequisites": [
        "/accessibility/pdom"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 712,
      "url": "https://veillette.github.io/Almanach/api/scenery/parallel-dom-deep-dive"
    },
    {
      "path": "/api/scenery/path",
      "sourceFile": "docs/api/scenery/path.md",
      "title": "Path",
      "description": "A Node that renders a kite Shape with fill/stroke.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Path",
        "Shape",
        "fill",
        "stroke"
      ],
      "status": "verified",
      "related": [
        "/api/kite/shape",
        "/api/scenery/circle",
        "/api/scenery/rectangle",
        "/api/scenery/line"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 344,
      "url": "https://veillette.github.io/Almanach/api/scenery/path"
    },
    {
      "path": "/api/scenery/pattern-paint",
      "sourceFile": "docs/api/scenery/pattern-paint.md",
      "title": "Pattern",
      "description": "The image-tiling paint type usable as a Node's fill or stroke - unrelated to the software-design conventions in the patterns/ section.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Pattern",
        "paint",
        "fill",
        "stroke",
        "image"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/color",
        "/api/scenery/node",
        "/api/scenery/image"
      ],
      "prerequisites": [
        "/api/scenery/color"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 322,
      "url": "https://veillette.github.io/Almanach/api/scenery/pattern-paint"
    },
    {
      "path": "/api/scenery/pointer-mouse-touch-pen",
      "sourceFile": "docs/api/scenery/pointer-mouse-touch-pen.md",
      "title": "Pointer, Mouse, Touch, and Pen",
      "description": "The abstract input-device abstraction behind every scenery pointer event, and its Mouse/Touch/Pen subclasses.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Pointer",
        "Mouse",
        "Touch",
        "Pen",
        "input"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/scenery-event",
        "/api/scenery/drag-listener",
        "/api/scenery/fire-listener",
        "/api/scenery/hit-testing-and-picking"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 604,
      "url": "https://veillette.github.io/Almanach/api/scenery/pointer-mouse-touch-pen"
    },
    {
      "path": "/api/scenery/press-listener",
      "sourceFile": "docs/api/scenery/press-listener.md",
      "title": "PressListener (direct usage)",
      "description": "Using PressListener directly for custom pressable interactions, and the PDOM/focus-aware state it exposes beyond what FireListener and DragListener summarize.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "PressListener",
        "DragListener",
        "FireListener",
        "input",
        "accessibility",
        "PDOM"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/fire-listener",
        "/api/scenery/drag-listener",
        "/api/scenery/node"
      ],
      "prerequisites": [
        "/api/scenery/fire-listener"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 704,
      "url": "https://veillette.github.io/Almanach/api/scenery/press-listener"
    },
    {
      "path": "/api/scenery/fire-listener",
      "sourceFile": "docs/api/scenery/fire-listener.md",
      "title": "PressListener and FireListener",
      "description": "The base classes behind clickable/pressable Nodes.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "FireListener",
        "PressListener",
        "input"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/api/scenery/display",
        "/guides/scenery-input"
      ],
      "prerequisites": [
        "/api/scenery/node",
        "/api/scenery/display"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 708,
      "url": "https://veillette.github.io/Almanach/api/scenery/fire-listener"
    },
    {
      "path": "/api/scenery/radial-gradient",
      "sourceFile": "docs/api/scenery/radial-gradient.md",
      "title": "RadialGradient",
      "description": "A paint type for circular color gradients between two circles, usable anywhere a Node accepts a fill or stroke.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "RadialGradient",
        "gradient",
        "paint",
        "fill",
        "stroke"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/color",
        "/api/scenery/linear-gradient",
        "/api/scenery/node"
      ],
      "prerequisites": [
        "/api/scenery/color"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 301,
      "url": "https://veillette.github.io/Almanach/api/scenery/radial-gradient"
    },
    {
      "path": "/api/scenery/rectangle",
      "sourceFile": "docs/api/scenery/rectangle.md",
      "title": "Rectangle",
      "description": "A Path subclass for drawing (optionally rounded) rectangles.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Rectangle",
        "Path"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/path",
        "/api/scenery/circle"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 361,
      "url": "https://veillette.github.io/Almanach/api/scenery/rectangle"
    },
    {
      "path": "/api/scenery/rich-drag-listener",
      "sourceFile": "docs/api/scenery/rich-drag-listener.md",
      "title": "RichDragListener",
      "description": "A single input listener that composes a DragListener and a KeyboardDragListener, giving one draggable object both pointer and keyboard support.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "RichDragListener",
        "input",
        "drag",
        "keyboard",
        "accessibility"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/api/scenery/keyboard-drag-listener",
        "/api/scenery/fire-listener",
        "/patterns/drag-listeners",
        "/guides/scenery-input"
      ],
      "prerequisites": [
        "/api/scenery/node",
        "/patterns/drag-listeners"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 394,
      "url": "https://veillette.github.io/Almanach/api/scenery/rich-drag-listener"
    },
    {
      "path": "/api/scenery/rich-text",
      "sourceFile": "docs/api/scenery/rich-text.md",
      "title": "RichText",
      "description": "A Text-like Node supporting a constrained markup subset for mixed styling.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "RichText",
        "markup",
        "links"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/text",
        "/api/scenery-phet/phet-font"
      ],
      "prerequisites": [
        "/api/scenery/node",
        "/api/scenery/text"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 419,
      "url": "https://veillette.github.io/Almanach/api/scenery/rich-text"
    },
    {
      "path": "/api/scenery/scenery-event",
      "sourceFile": "docs/api/scenery/scenery-event.md",
      "title": "SceneryEvent",
      "description": "The event object scenery passes to input listeners, wrapping the native DOM event, the pointer, and the hit trail.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "SceneryEvent",
        "input",
        "Trail"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/pointer-mouse-touch-pen",
        "/api/scenery/fire-listener",
        "/api/scenery/drag-listener",
        "/api/scenery/trail"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 477,
      "url": "https://veillette.github.io/Almanach/api/scenery/scenery-event"
    },
    {
      "path": "/api/scenery/sizable-mixins",
      "sourceFile": "docs/api/scenery/sizable-mixins.md",
      "title": "Sizable, WidthSizable, and HeightSizable",
      "description": "The mixins that let a custom Node expose a settable preferred/minimum size so layout containers can resize it.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Sizable",
        "WidthSizable",
        "HeightSizable",
        "layout"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/flow-box",
        "/api/scenery/grid-box",
        "/api/scenery/node",
        "/guides/scenery-layout"
      ],
      "prerequisites": [
        "/api/scenery/node",
        "/api/scenery/flow-box"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 597,
      "url": "https://veillette.github.io/Almanach/api/scenery/sizable-mixins"
    },
    {
      "path": "/api/scenery/spacer",
      "sourceFile": "docs/api/scenery/spacer.md",
      "title": "Spacer",
      "description": "An invisible, childless Node that reserves a fixed rectangular area of layout space.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Spacer",
        "layout",
        "bounds"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/api/scenery/flow-box",
        "/api/scenery/grid-box",
        "/api/scenery/v-box",
        "/api/scenery/h-box",
        "/guides/scenery-layout"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 338,
      "url": "https://veillette.github.io/Almanach/api/scenery/spacer"
    },
    {
      "path": "/api/scenery/sprites",
      "sourceFile": "docs/api/scenery/sprites.md",
      "title": "Sprites, Sprite, SpriteImage, and SpriteSheet",
      "description": "The high-performance rendering system for drawing many instances of a small set of images in a single Node, instead of one scenery Node per instance.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Sprites",
        "Sprite",
        "SpriteImage",
        "SpriteSheet",
        "SpriteInstance",
        "performance",
        "particles",
        "webgl",
        "canvas"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/node",
        "/api/scenery/image",
        "/api/scenery/visual-filters"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 951,
      "url": "https://veillette.github.io/Almanach/api/scenery/sprites"
    },
    {
      "path": "/api/scenery/text",
      "sourceFile": "docs/api/scenery/text.md",
      "title": "Text",
      "description": "A Node that renders a single string of plain text.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Text",
        "PhetFont",
        "font"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/phet-font",
        "/api/scenery/rich-text",
        "/api/axon/string-property"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 350,
      "url": "https://veillette.github.io/Almanach/api/scenery/text"
    },
    {
      "path": "/api/scenery/trail",
      "sourceFile": "docs/api/scenery/trail.md",
      "title": "Trail",
      "description": "An indexed path of Nodes from a root to a descendant, used for hit-testing, ordering, and coordinate transforms across the scene graph.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Trail",
        "scene-graph",
        "hit-testing",
        "coordinates"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/api/scenery/display",
        "/guides/scenery-input"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 643,
      "url": "https://veillette.github.io/Almanach/api/scenery/trail"
    },
    {
      "path": "/api/scenery/transform-tracker",
      "sourceFile": "docs/api/scenery/transform-tracker.md",
      "title": "TransformTracker",
      "description": "Efficiently watches a Trail's cumulative transform for changes, without re-deriving it from scratch on every check.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "TransformTracker",
        "Trail",
        "transform"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/trail",
        "/api/scenery/drag-listener",
        "/api/scenery/highlight-rendering",
        "/api/scenery/node"
      ],
      "prerequisites": [
        "/api/scenery/trail"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 361,
      "url": "https://veillette.github.io/Almanach/api/scenery/transform-tracker"
    },
    {
      "path": "/api/scenery/v-box",
      "sourceFile": "docs/api/scenery/v-box.md",
      "title": "VBox",
      "description": "A FlowBox convenience subclass fixed to vertical orientation, for stacking children in a column.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "VBox",
        "HBox",
        "FlowBox",
        "layout"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/flow-box",
        "/api/scenery/h-box",
        "/api/scenery/grid-box",
        "/guides/scenery-layout"
      ],
      "prerequisites": [
        "/api/scenery/flow-box"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 257,
      "url": "https://veillette.github.io/Almanach/api/scenery/v-box"
    },
    {
      "path": "/api/scenery/voicing",
      "sourceFile": "docs/api/scenery/voicing.md",
      "title": "Voicing",
      "description": "The Voicing trait's class-level API - response Properties, speak methods, and how to compose it into a Node.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "Voicing",
        "voicing",
        "speech",
        "accessibility"
      ],
      "status": "verified",
      "related": [
        "/accessibility/voicing",
        "/api/scenery/interactive-highlighting",
        "/api/scenery/parallel-dom-deep-dive"
      ],
      "prerequisites": [
        "/accessibility/voicing"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 467,
      "url": "https://veillette.github.io/Almanach/api/scenery/voicing"
    },
    {
      "path": "/api/scenery/rendering-backends",
      "sourceFile": "docs/api/scenery/rendering-backends.md",
      "title": "WebGLNode, CanvasNode, and DOM",
      "description": "The three alternate rendering-backend Node subclasses for custom drawing outside scenery's default SVG/Canvas pipeline, compared.",
      "category": "api",
      "library": "scenery",
      "tags": [
        "scenery",
        "WebGLNode",
        "CanvasNode",
        "DOM",
        "rendering",
        "renderer"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/node",
        "/api/scenery/display"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 705,
      "url": "https://veillette.github.io/Almanach/api/scenery/rendering-backends"
    },
    {
      "path": "/api/scenery-phet/arrow-node",
      "sourceFile": "docs/api/scenery-phet/arrow-node.md",
      "title": "ArrowNode",
      "description": "A configurable arrow shape used for vectors, force diagrams, and callouts.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "ArrowNode"
      ],
      "status": "verified",
      "related": [
        "/api/phetcommon/model-view-transform",
        "/api/dot/vector2"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 468,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/arrow-node"
    },
    {
      "path": "/api/scenery-phet/back-button",
      "sourceFile": "docs/api/scenery-phet/back-button.md",
      "title": "BackButton",
      "description": "A rectangular button with a leftward arrow icon, used for navigating back (e.g. to a level-selection screen).",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "BackButton",
        "button"
      ],
      "status": "verified",
      "related": [
        "/api/sun/rectangular-push-button",
        "/api/scenery-phet/eraser-button",
        "/api/scenery-phet/close-button"
      ],
      "prerequisites": [
        "/api/sun/rectangular-push-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 264,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/back-button"
    },
    {
      "path": "/api/scenery-phet/background-nodes",
      "sourceFile": "docs/api/scenery-phet/background-nodes.md",
      "title": "Background Nodes",
      "description": "Small building blocks for scene backgrounds — the sky/ground gradient family (SkyNode, GroundNode, OutsideBackgroundNode) plus BackgroundNode and GradientRectangle.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "BackgroundNode",
        "GradientBackgroundNode",
        "GradientRectangle",
        "SkyNode",
        "GroundNode",
        "OutsideBackgroundNode",
        "background",
        "gradient"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/rectangle",
        "/api/scenery/linear-gradient",
        "/api/scenery/radial-gradient",
        "/api/scenery/node"
      ],
      "prerequisites": [
        "/api/scenery/rectangle"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 875,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/background-nodes"
    },
    {
      "path": "/api/scenery-phet/banned-node",
      "sourceFile": "docs/api/scenery-phet/banned-node.md",
      "title": "BannedNode",
      "description": "The universal \"no\"/prohibition icon — a circle with a diagonal slash through it.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "BannedNode",
        "icon",
        "prohibition"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/stop-sign-node",
        "/api/scenery/circle",
        "/api/scenery/line"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 275,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/banned-node"
    },
    {
      "path": "/api/scenery-phet/bicycle-pump-node",
      "sourceFile": "docs/api/scenery-phet/bicycle-pump-node.md",
      "title": "BicyclePumpNode",
      "description": "An animated bicycle-pump graphic whose handle, when dragged down, injects discrete units (particles, air, etc.) into a model quantity.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "BicyclePumpNode",
        "pump",
        "particles"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/faucet-node",
        "/api/dot/range",
        "/api/axon/boolean-property",
        "/patterns/drag-listeners"
      ],
      "prerequisites": [
        "/api/axon/number-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 558,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/bicycle-pump-node"
    },
    {
      "path": "/api/scenery-phet/box-node",
      "sourceFile": "docs/api/scenery-phet/box-node.md",
      "title": "BoxNode",
      "description": "A pseudo-3D box drawn as three flat parallelograms (top, front, right side), used for capacitor and battery visualizations.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "BoxNode",
        "BoxShapeCreator",
        "capacitor",
        "pseudo-3d"
      ],
      "status": "complete",
      "related": [
        "/api/dot/bounds3",
        "/api/scenery/path",
        "/api/scenery/color"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 583,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/box-node"
    },
    {
      "path": "/api/scenery-phet/bracket-node",
      "sourceFile": "docs/api/scenery-phet/bracket-node.md",
      "title": "BracketNode",
      "description": "A curly-brace-like bracket Path with a single tip, optionally labeled, pointing in one of four directions.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "BracketNode",
        "bracket",
        "label"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/path",
        "/api/scenery/node"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 448,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/bracket-node"
    },
    {
      "path": "/api/scenery-phet/bucket-front-and-hole",
      "sourceFile": "docs/api/scenery-phet/bucket-front-and-hole.md",
      "title": "BucketFront and BucketHole",
      "description": "The two view Nodes that render a phetcommon Bucket model — a hole behind draggable contents and a front in front of them.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "BucketFront",
        "BucketHole",
        "bucket",
        "drag-and-drop"
      ],
      "status": "complete",
      "related": [
        "/api/phetcommon/bucket",
        "/api/phetcommon/model-view-transform",
        "/api/scenery/node"
      ],
      "prerequisites": [
        "/api/phetcommon/bucket"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 590,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/bucket-front-and-hole"
    },
    {
      "path": "/api/scenery-phet/capacitor-visualization-nodes",
      "sourceFile": "docs/api/scenery-phet/capacitor-visualization-nodes.md",
      "title": "Capacitor Visualization Nodes",
      "description": "The CapacitorNode family — a pseudo-3D capacitor visualization (plates, plate charge, and E-field lines) shared by Capacitor Lab and Circuit Construction Kit-style sims.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "CapacitorNode",
        "PlateNode",
        "PlateChargeNode",
        "EFieldNode",
        "ElectronChargeNode",
        "CapacitorConstants",
        "capacitor"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/yaw-pitch-model-view-transform3",
        "/api/dot/bounds3",
        "/api/dot/range-with-value",
        "/api/phet-core/orientation"
      ],
      "prerequisites": [
        "/api/scenery-phet/yaw-pitch-model-view-transform3"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1103,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/capacitor-visualization-nodes"
    },
    {
      "path": "/api/scenery-phet/close-button",
      "sourceFile": "docs/api/scenery-phet/close-button.md",
      "title": "CloseButton",
      "description": "A red rectangular button with a white \"X\" icon, the standard control for dismissing a dialog or panel.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "CloseButton",
        "button"
      ],
      "status": "verified",
      "related": [
        "/api/sun/rectangular-push-button",
        "/api/scenery-phet/back-button"
      ],
      "prerequisites": [
        "/api/sun/rectangular-push-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 278,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/close-button"
    },
    {
      "path": "/api/scenery-phet/combo-box-display",
      "sourceFile": "docs/api/scenery-phet/combo-box-display.md",
      "title": "ComboBoxDisplay",
      "description": "A ComboBox whose items are live NumberDisplay readouts instead of static labels - pick which of several dynamic quantities to show.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "ComboBoxDisplay",
        "NumberDisplay",
        "ComboBox"
      ],
      "status": "complete",
      "related": [
        "/api/sun/combo-box",
        "/api/scenery-phet/number-display",
        "/api/dot/range"
      ],
      "prerequisites": [
        "/api/sun/combo-box",
        "/api/scenery-phet/number-display"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 527,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/combo-box-display"
    },
    {
      "path": "/api/scenery-phet/conductivity-tester-node",
      "sourceFile": "docs/api/scenery-phet/conductivity-tester-node.md",
      "title": "ConductivityTesterNode",
      "description": "A light bulb wired to a battery and two draggable probes, visualizing circuit conductivity for chemistry sims.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "ConductivityTesterNode",
        "chemistry",
        "probe",
        "wire"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/probe-node",
        "/api/scenery-phet/wire-node",
        "/api/phetcommon/model-view-transform",
        "/api/tandem/tandem"
      ],
      "prerequisites": [
        "/api/phetcommon/model-view-transform",
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 445,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/conductivity-tester-node"
    },
    {
      "path": "/api/scenery-phet/dev-overlay-nodes",
      "sourceFile": "docs/api/scenery-phet/dev-overlay-nodes.md",
      "title": "Developer Overlay Nodes",
      "description": "CanvasWarningNode and PointerCoordinatesNode — two debug/developer-only overlay Nodes for surfacing a WebGL fallback warning and live pointer coordinates.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "CanvasWarningNode",
        "PointerCoordinatesNode",
        "debug",
        "developer"
      ],
      "status": "complete",
      "related": [
        "/api/phetcommon/model-view-transform",
        "/api/scenery-phet/phet-font"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 637,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/dev-overlay-nodes"
    },
    {
      "path": "/api/scenery-phet/drawer",
      "sourceFile": "docs/api/scenery-phet/drawer.md",
      "title": "Drawer",
      "description": "A container that animates open and closed, revealing or hiding an arbitrary contents Node, toggled by a handle.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "Drawer",
        "animation"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/handle-node",
        "/api/twixt/animation",
        "/api/axon/boolean-property",
        "/api/sun/accordion-box"
      ],
      "prerequisites": [
        "/api/axon/boolean-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 599,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/drawer"
    },
    {
      "path": "/api/scenery-phet/eraser-button",
      "sourceFile": "docs/api/scenery-phet/eraser-button.md",
      "title": "EraserButton",
      "description": "A standard rectangular button with an eraser icon, typically wired to a \"clear\" or \"reset the drawing\" action.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "EraserButton",
        "button"
      ],
      "status": "verified",
      "related": [
        "/api/sun/rectangular-push-button",
        "/api/scenery-phet/reset-all-button"
      ],
      "prerequisites": [
        "/api/sun/rectangular-push-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 248,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/eraser-button"
    },
    {
      "path": "/api/scenery-phet/eye-dropper-node",
      "sourceFile": "docs/api/scenery-phet/eye-dropper-node.md",
      "title": "EyeDropperNode",
      "description": "An eye-dropper graphic with a squeeze-bulb button for dispensing colored fluid, driven by dispensing/empty Properties.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "EyeDropperNode",
        "fluid",
        "dropper"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/faucet-node",
        "/api/axon/property"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 503,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/eye-dropper-node"
    },
    {
      "path": "/api/scenery-phet/face-node",
      "sourceFile": "docs/api/scenery-phet/face-node.md",
      "title": "FaceNode",
      "description": "A simple smiling/frowning face graphic, typically shown as feedback for a correct or incorrect answer.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "FaceNode",
        "feedback",
        "face"
      ],
      "status": "verified",
      "related": [
        "/api/scenery/circle",
        "/api/scenery/path",
        "/api/axon/derived-property"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 311,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/face-node"
    },
    {
      "path": "/api/scenery-phet/faucet-node",
      "sourceFile": "docs/api/scenery-phet/faucet-node.md",
      "title": "FaucetNode",
      "description": "A faucet control with a draggable pinball-shooter-style handle that drives a flow-rate Property, used in fluid/flow simulations.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "FaucetNode",
        "faucet",
        "fluid",
        "flow-rate"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/bicycle-pump-node",
        "/api/dot/range",
        "/patterns/drag-listeners",
        "/patterns/phet-io-instrumentation-pattern"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 423,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/faucet-node"
    },
    {
      "path": "/api/scenery-phet/fine-coarse-spinner",
      "sourceFile": "docs/api/scenery-phet/fine-coarse-spinner.md",
      "title": "FineCoarseSpinner",
      "description": "A five-part numeric spinner - fine decrement, coarse decrement, a NumberDisplay readout, coarse increment, fine increment.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "FineCoarseSpinner",
        "spinner",
        "NumberDisplay"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/number-display",
        "/api/scenery-phet/number-control",
        "/api/axon/number-property"
      ],
      "prerequisites": [
        "/api/axon/number-property",
        "/api/scenery-phet/number-display"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 396,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/fine-coarse-spinner"
    },
    {
      "path": "/api/scenery-phet/formula-node",
      "sourceFile": "docs/api/scenery-phet/formula-node.md",
      "title": "FormulaNode",
      "description": "Renders a LaTeX-style math formula via KaTeX, as a DOM Node embedded in the scene graph.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "FormulaNode",
        "katex",
        "latex",
        "math"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/math-symbol-font"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 404,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/formula-node"
    },
    {
      "path": "/api/scenery-phet/fraction-display-nodes",
      "sourceFile": "docs/api/scenery-phet/fraction-display-nodes.md",
      "title": "Fraction Display Nodes",
      "description": "A small family of Nodes for rendering fractions, mixed numbers, and hand-drawn plus/minus signs without relying on Text glyphs.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "MixedFractionNode",
        "PropertyFractionNode",
        "MinusNode",
        "PlusNode",
        "fraction",
        "math"
      ],
      "status": "complete",
      "related": [
        "/api/phetcommon/fraction",
        "/api/scenery-phet/phet-font",
        "/api/axon/property"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 710,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/fraction-display-nodes"
    },
    {
      "path": "/api/scenery-phet/gauge-node",
      "sourceFile": "docs/api/scenery-phet/gauge-node.md",
      "title": "GaugeNode",
      "description": "A circular dial gauge with a needle, tick marks, and a label, driven by a numeric value Property within a fixed range.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "GaugeNode",
        "gauge",
        "dial",
        "meter"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/thermometer-node",
        "/api/dot/range",
        "/patterns/model-view-separation",
        "/api/scenery-phet/number-display"
      ],
      "prerequisites": [
        "/api/axon/property",
        "/api/dot/range"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 489,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/gauge-node"
    },
    {
      "path": "/api/scenery-phet/grab-drag-interaction",
      "sourceFile": "docs/api/scenery-phet/grab-drag-interaction.md",
      "title": "GrabDragInteraction",
      "description": "The accessible \"grab with Enter/Space, arrow-key drag, release with Escape\" interaction pattern that mixes into an existing draggable Node's PDOM content.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "GrabDragInteraction",
        "GrabDragUsageTracker",
        "GrabReleaseCueNode",
        "keyboard",
        "accessibility",
        "drag"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/keyboard-help-sections",
        "/api/scenery-phet/group-sort-interaction",
        "/api/scenery-phet/sound-drag-listeners",
        "/accessibility/pdom",
        "/accessibility/focus-highlights"
      ],
      "prerequisites": [
        "/accessibility/pdom",
        "/api/scenery/keyboard-drag-listener"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 776,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/grab-drag-interaction"
    },
    {
      "path": "/api/scenery-phet/grid-checkbox",
      "sourceFile": "docs/api/scenery-phet/grid-checkbox.md",
      "title": "GridCheckbox and GridIcon",
      "description": "A Checkbox pre-built with a small NxN-grid icon, for toggling a coordinate grid's visibility.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "GridCheckbox",
        "GridIcon",
        "checkbox",
        "grid"
      ],
      "status": "complete",
      "related": [
        "/api/sun/checkbox",
        "/api/scenery-phet/grid-node",
        "/api/axon/boolean-property"
      ],
      "prerequisites": [
        "/api/sun/checkbox",
        "/api/axon/boolean-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 375,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/grid-checkbox"
    },
    {
      "path": "/api/scenery-phet/grid-node",
      "sourceFile": "docs/api/scenery-phet/grid-node.md",
      "title": "GridNode",
      "description": "A Path drawing an evenly-spaced coordinate grid, positioned and re-projected via a ModelViewTransform2 Property.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "GridNode",
        "grid",
        "coordinates"
      ],
      "status": "complete",
      "related": [
        "/api/phetcommon/model-view-transform",
        "/api/scenery/path",
        "/api/dot/vector2"
      ],
      "prerequisites": [
        "/api/phetcommon/model-view-transform",
        "/api/scenery/path"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 347,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/grid-node"
    },
    {
      "path": "/api/scenery-phet/group-sort-interaction",
      "sourceFile": "docs/api/scenery-phet/group-sort-interaction.md",
      "title": "Group Sort Interaction",
      "description": "The accessible keyboard pattern for selecting an item within a group and then sorting it by changing its value — GroupSelectModel/GroupSelectView for selection alone, GroupSortInteractionView adding sorting.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "GroupSelectModel",
        "GroupSelectView",
        "GroupSortInteractionView",
        "SortCueArrowNode",
        "keyboard",
        "accessibility"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/grab-drag-interaction",
        "/api/scenery-phet/movement-and-border-alerters",
        "/accessibility/pdom",
        "/accessibility/focus-highlights"
      ],
      "prerequisites": [
        "/accessibility/pdom",
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 977,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/group-sort-interaction"
    },
    {
      "path": "/api/scenery-phet/handle-node",
      "sourceFile": "docs/api/scenery-phet/handle-node.md",
      "title": "HandleNode",
      "description": "A purely decorative graphic of a grippable handle attached to a surface by one or two elbow-shaped mounts.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "HandleNode",
        "handle"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/drawer",
        "/api/scenery/path"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 405,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/handle-node"
    },
    {
      "path": "/api/scenery-phet/heater-cooler-node",
      "sourceFile": "docs/api/scenery-phet/heater-cooler-node.md",
      "title": "HeaterCoolerNode",
      "description": "A stove-style heating/cooling control driven by a bidirectional -1-to-+1 Property, with an embedded vertical slider.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "HeaterCoolerNode",
        "heat-cool-control",
        "heater",
        "cooler",
        "slider"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/gauge-node",
        "/api/axon/number-property",
        "/patterns/model-view-separation"
      ],
      "prerequisites": [
        "/api/axon/number-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 391,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/heater-cooler-node"
    },
    {
      "path": "/api/scenery-phet/icon-toggle-buttons",
      "sourceFile": "docs/api/scenery-phet/icon-toggle-buttons.md",
      "title": "Icon Toggle Buttons",
      "description": "SoundToggleButton, TimerToggleButton, and EyeToggleButton — toggle buttons bound to a boolean Property that swap between two pre-built icons.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "SoundToggleButton",
        "TimerToggleButton",
        "EyeToggleButton",
        "button"
      ],
      "status": "complete",
      "related": [
        "/api/sun/toggle-button",
        "/api/scenery-phet/round-icon-buttons"
      ],
      "prerequisites": [
        "/api/axon/boolean-property",
        "/api/sun/toggle-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 418,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/icon-toggle-buttons"
    },
    {
      "path": "/api/scenery-phet/info-button",
      "sourceFile": "docs/api/scenery-phet/info-button.md",
      "title": "InfoButton",
      "description": "The standard round grey button bearing an \"i\" info-circle icon, typically used to open an informational dialog.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "InfoButton",
        "button"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/reset-all-button",
        "/api/sun/round-push-button"
      ],
      "prerequisites": [
        "/api/sun/round-push-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 275,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/info-button"
    },
    {
      "path": "/api/scenery-phet/keyboard-help-node-basics",
      "sourceFile": "docs/api/scenery-phet/keyboard-help-node-basics.md",
      "title": "Keyboard Help Node Basics",
      "description": "KeyNode and its subclasses render individual keycap icons; KeyboardHelpIconFactory composes them into the rows used by a Keyboard Help Dialog.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "KeyNode",
        "LetterKeyNode",
        "NumberKeyNode",
        "TextKeyNode",
        "ArrowKeyNode",
        "KeyboardHelpIconFactory",
        "keyboard",
        "accessibility"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/keyboard-help-sections",
        "/accessibility/keyboard-input-and-hotkeys",
        "/accessibility/pdom"
      ],
      "prerequisites": [
        "/accessibility/keyboard-input-and-hotkeys"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 926,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/keyboard-help-node-basics"
    },
    {
      "path": "/api/scenery-phet/keyboard-help-sections",
      "sourceFile": "docs/api/scenery-phet/keyboard-help-sections.md",
      "title": "Keyboard Help Sections",
      "description": "KeyboardHelpSection and KeyboardHelpSectionRow lay out one labeled group of shortcuts; a family of ready-made sections covers sliders, spinners, time controls, combo boxes, and more.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "KeyboardHelpSection",
        "KeyboardHelpSectionRow",
        "BasicActionsKeyboardHelpSection",
        "MoveDraggableItemsKeyboardHelpSection",
        "SliderControlsAndBasicActionsKeyboardHelpContent",
        "SpinnerControlsKeyboardHelpSection",
        "TimeControlsKeyboardHelpSection",
        "ComboBoxKeyboardHelpSection",
        "FaucetControlsKeyboardHelpSection",
        "HeatCoolControlsKeyboardHelpSection",
        "GrabReleaseKeyboardHelpSection",
        "TwoColumnKeyboardHelpContent",
        "WASDCueNode",
        "keyboard",
        "accessibility"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/keyboard-help-node-basics",
        "/api/scenery-phet/faucet-node",
        "/api/scenery-phet/heater-cooler-node",
        "/api/scenery-phet/time-control-node",
        "/api/scenery-phet/reset-all-button",
        "/accessibility/keyboard-input-and-hotkeys"
      ],
      "prerequisites": [
        "/api/scenery-phet/keyboard-help-node-basics"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 929,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/keyboard-help-sections"
    },
    {
      "path": "/api/scenery-phet/keypad",
      "sourceFile": "docs/api/scenery-phet/keypad.md",
      "title": "Keypad",
      "description": "A calculator-like on-screen numeric keypad, driven by a pluggable key-accumulator that interprets key presses into a value.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "Keypad",
        "NumberAccumulator",
        "AbstractKeyAccumulator",
        "BidirectionalControlChars",
        "input"
      ],
      "status": "complete",
      "related": [
        "/accessibility/keyboard-input-and-hotkeys",
        "/api/tandem/tandem",
        "/api/axon/derived-string-property"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1161,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/keypad"
    },
    {
      "path": "/api/scenery-phet/laser-pointer-node",
      "sourceFile": "docs/api/scenery-phet/laser-pointer-node.md",
      "title": "LaserPointerNode",
      "description": "A laser-pointer-styled Node with an optional on/off button, used to represent a light source in optics sims.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "LaserPointerNode",
        "optics",
        "button"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/probe-node",
        "/api/tandem/tandem",
        "/api/axon/property"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 463,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/laser-pointer-node"
    },
    {
      "path": "/api/scenery-phet/light-bulb-node",
      "sourceFile": "docs/api/scenery-phet/light-bulb-node.md",
      "title": "LightBulbNode",
      "description": "A bulb image that glows and casts light rays as a function of a 0-1 brightness Property.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "LightBulbNode",
        "LightRaysNode",
        "light",
        "bulb"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/light-rays-node",
        "/api/axon/number-property"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 334,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/light-bulb-node"
    },
    {
      "path": "/api/scenery-phet/light-rays-node",
      "sourceFile": "docs/api/scenery-phet/light-rays-node.md",
      "title": "LightRaysNode",
      "description": "A Path of radiating line segments whose count and length scale with a 0-1 brightness value.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "LightRaysNode",
        "light",
        "rays"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/light-bulb-node"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 340,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/light-rays-node"
    },
    {
      "path": "/api/scenery-phet/line-arrow-node",
      "sourceFile": "docs/api/scenery-phet/line-arrow-node.md",
      "title": "LineArrowNode",
      "description": "A lightweight, stroke-only arrow built from three line segments, as opposed to the filled-shape ArrowNode.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "LineArrowNode",
        "arrow",
        "vector"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/arrow-node",
        "/api/dot/vector2"
      ],
      "prerequisites": [
        "/api/scenery-phet/arrow-node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 536,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/line-arrow-node"
    },
    {
      "path": "/api/scenery-phet/lock-node",
      "sourceFile": "docs/api/scenery-phet/lock-node.md",
      "title": "LockNode",
      "description": "A padlock icon that swaps between locked and unlocked graphics based on a boolean Property.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "LockNode",
        "icon",
        "toggle",
        "padlock"
      ],
      "status": "complete",
      "related": [
        "/api/axon/boolean-property",
        "/api/sun/checkbox"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 290,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/lock-node"
    },
    {
      "path": "/api/scenery-phet/magnifying-glass-node",
      "sourceFile": "docs/api/scenery-phet/magnifying-glass-node.md",
      "title": "MagnifyingGlassNode",
      "description": "A simple magnifying-glass icon (circular glass plus a handle) that can center an arbitrary icon Node inside the glass.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "MagnifyingGlassNode"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/zoom-button-groups"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 294,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/magnifying-glass-node"
    },
    {
      "path": "/api/scenery-phet/math-symbol-font",
      "sourceFile": "docs/api/scenery-phet/math-symbol-font.md",
      "title": "MathSymbolFont",
      "description": "The italic serif font PhET sims use for math symbols and variables, kept visually distinct from PhetFont.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "MathSymbolFont",
        "typography"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/phet-font"
      ],
      "prerequisites": [
        "/api/scenery-phet/phet-font"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 398,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/math-symbol-font"
    },
    {
      "path": "/api/scenery-phet/matrix-node",
      "sourceFile": "docs/api/scenery-phet/matrix-node.md",
      "title": "MatrixNode",
      "description": "Renders an MxN matrix of numbers or strings between bracket glyphs, in row-major order.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "MatrixNode",
        "matrix",
        "math"
      ],
      "status": "complete",
      "related": [
        "/api/dot/matrix3",
        "/api/scenery-phet/phet-font"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 412,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/matrix-node"
    },
    {
      "path": "/api/scenery-phet/measuring-tape-node",
      "sourceFile": "docs/api/scenery-phet/measuring-tape-node.md",
      "title": "MeasuringTapeNode",
      "description": "A draggable measuring tape with a base, an extendable tip, and a live distance readout, common in physics sims.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "MeasuringTapeNode",
        "measurement",
        "drag"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/ruler-node",
        "/api/phetcommon/model-view-transform",
        "/api/axon/derived-property",
        "/api/tandem/tandem"
      ],
      "prerequisites": [
        "/api/axon/property",
        "/api/phetcommon/model-view-transform"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 710,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/measuring-tape-node"
    },
    {
      "path": "/api/scenery-phet/movement-and-border-alerters",
      "sourceFile": "docs/api/scenery-phet/movement-and-border-alerters.md",
      "title": "Movement and Border Alerters",
      "description": "Alerter, MovementAlerter, and BorderAlertsDescriber — utilities that announce which direction a dragged object moved and when it has hit the edge of its movement bounds.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "Alerter",
        "MovementAlerter",
        "BorderAlertsDescriber",
        "voicing",
        "description",
        "accessibility"
      ],
      "status": "complete",
      "related": [
        "/accessibility/voicing",
        "/accessibility/describing-dynamic-state",
        "/api/utterance-queue/utterance",
        "/api/scenery/keyboard-drag-listener"
      ],
      "prerequisites": [
        "/accessibility/voicing",
        "/accessibility/describing-dynamic-state"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 803,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/movement-and-border-alerters"
    },
    {
      "path": "/api/scenery-phet/number-control",
      "sourceFile": "docs/api/scenery-phet/number-control.md",
      "title": "NumberControl",
      "description": "A composite slider + label + value-readout control bound to a NumberProperty.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "NumberControl"
      ],
      "status": "verified",
      "related": [
        "/api/axon/number-property",
        "/api/scenery-phet/phet-font",
        "/patterns/model-view-separation"
      ],
      "prerequisites": [
        "/api/axon/number-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 480,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/number-control"
    },
    {
      "path": "/api/scenery-phet/number-display",
      "sourceFile": "docs/api/scenery-phet/number-display.md",
      "title": "NumberDisplay",
      "description": "A labeled, fixed-width numeric readout in a background rectangle, bound to a number Property.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "NumberDisplay"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/number-control",
        "/api/scenery-phet/phet-font",
        "/api/dot/range"
      ],
      "prerequisites": [
        "/api/axon/number-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 496,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/number-display"
    },
    {
      "path": "/api/scenery-phet/off-scale-indicator-node",
      "sourceFile": "docs/api/scenery-phet/off-scale-indicator-node.md",
      "title": "OffScaleIndicatorNode",
      "description": "A labeled arrow-in-a-panel indicator that points toward data which has gone off the edge of a plot.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "OffScaleIndicatorNode",
        "plot",
        "chart",
        "accessibility"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/arrow-node",
        "/accessibility/voicing",
        "/api/sun/panel"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 433,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/off-scale-indicator-node"
    },
    {
      "path": "/api/scenery-phet/paper-airplane-and-simple-clock-icon",
      "sourceFile": "docs/api/scenery-phet/paper-airplane-and-simple-clock-icon.md",
      "title": "PaperAirplaneNode and SimpleClockIcon",
      "description": "Two small, static decorative icon Nodes — the PhET-logo paper airplane, and a plain analog clock face.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "PaperAirplaneNode",
        "SimpleClockIcon",
        "icon"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/phet-font",
        "/api/scenery/circle",
        "/api/scenery/path"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 390,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/paper-airplane-and-simple-clock-icon"
    },
    {
      "path": "/api/scenery-phet/parametric-spring-node",
      "sourceFile": "docs/api/scenery-phet/parametric-spring-node.md",
      "title": "ParametricSpringNode",
      "description": "A coiled spring drawn from a parametric (cycloid-like) equation, with live-adjustable loop count, radius, and phase.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "ParametricSpringNode",
        "spring",
        "coil"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/gauge-node"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 540,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/parametric-spring-node"
    },
    {
      "path": "/api/scenery-phet/phet-color-scheme-and-constants",
      "sourceFile": "docs/api/scenery-phet/phet-color-scheme-and-constants.md",
      "title": "PhetColorScheme, SceneryPhetColors, and SceneryPhetConstants",
      "description": "The shared default colors and numeric constants reused across scenery-phet components, so common physics-quantity colors and button sizing stay consistent across sims.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "PhetColorScheme",
        "SceneryPhetColors",
        "SceneryPhetConstants",
        "colors",
        "constants"
      ],
      "status": "complete",
      "related": [
        "/api/sun/color-constants",
        "/api/scenery-phet/reset-all-button",
        "/api/scenery-phet/gauge-node"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 833,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/phet-color-scheme-and-constants"
    },
    {
      "path": "/api/scenery-phet/phet-font",
      "sourceFile": "docs/api/scenery-phet/phet-font.md",
      "title": "PhetFont",
      "description": "The standard font class used across every SceneryStack simulation.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "PhetFont",
        "typography"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/number-control",
        "/api/scenery-phet/stopwatch-node",
        "/api/scenery-phet/math-symbol-font"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 262,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/phet-font"
    },
    {
      "path": "/api/scenery-phet/phet-unit",
      "sourceFile": "docs/api/scenery-phet/phet-unit.md",
      "title": "PhetUnit",
      "description": "A rich enumeration-style unit value (e.g. meters, newtons) that a Property can carry to drive automatic value-plus-units string formatting.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "PhetUnit",
        "units",
        "i18n",
        "formatting"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/number-display",
        "/api/scenery-phet/number-control",
        "/api/axon/number-property",
        "/api/axon/unit-conversion-property",
        "/api/axon/string-property"
      ],
      "prerequisites": [
        "/api/axon/number-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 726,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/phet-unit"
    },
    {
      "path": "/api/scenery-phet/play-control-buttons",
      "sourceFile": "docs/api/scenery-phet/play-control-buttons.md",
      "title": "Play Control Buttons",
      "description": "PlayControlButton, PlayStopButton, RecordStopButton, and PlayPauseStepButtonGroup — the round toggle buttons and layout group behind time/recording controls.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "PlayControlButton",
        "PlayStopButton",
        "RecordStopButton",
        "PlayPauseStepButtonGroup",
        "PlayPauseButton",
        "button"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/play-pause-button",
        "/api/scenery-phet/time-control-node",
        "/api/scenery-phet/step-forward-button",
        "/api/scenery-phet/step-backward-button",
        "/api/sun/toggle-button"
      ],
      "prerequisites": [
        "/api/axon/boolean-property",
        "/api/scenery-phet/play-pause-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 748,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/play-control-buttons"
    },
    {
      "path": "/api/scenery-phet/play-pause-button",
      "sourceFile": "docs/api/scenery-phet/play-pause-button.md",
      "title": "PlayPauseButton",
      "description": "The round toggle button that starts and stops time in a simulation, swapping between a play triangle and a pause icon.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "PlayPauseButton",
        "button"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/time-control-node",
        "/api/scenery-phet/step-forward-button",
        "/api/scenery-phet/step-backward-button",
        "/api/sun/toggle-button"
      ],
      "prerequisites": [
        "/api/axon/boolean-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 358,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/play-pause-button"
    },
    {
      "path": "/api/scenery-phet/probe-node",
      "sourceFile": "docs/api/scenery-phet/probe-node.md",
      "title": "ProbeNode",
      "description": "A physical-looking sensor probe graphic — a circular sensing head on a handle — typically wired to a readout body via WireNode.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "ProbeNode",
        "sensor",
        "probe"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/wire-node",
        "/styling/color-profiles"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 478,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/probe-node"
    },
    {
      "path": "/api/scenery-phet/protractor-node",
      "sourceFile": "docs/api/scenery-phet/protractor-node.md",
      "title": "ProtractorNode",
      "description": "A draggable, rotatable protractor image for measuring angles, backed by an angleProperty.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "ProtractorNode",
        "protractor",
        "angle",
        "measurement"
      ],
      "status": "complete",
      "related": [
        "/api/dot/vector2",
        "/patterns/drag-listeners"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 298,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/protractor-node"
    },
    {
      "path": "/api/scenery-phet/question-bar",
      "sourceFile": "docs/api/scenery-phet/question-bar.md",
      "title": "QuestionBar",
      "description": "A StatusBar that floats a single bold framing question at the top of a screen.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "QuestionBar"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/status-bar",
        "/api/vegas/status-bars"
      ],
      "prerequisites": [
        "/api/scenery-phet/status-bar"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 352,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/question-bar"
    },
    {
      "path": "/api/scenery-phet/reset-all-button",
      "sourceFile": "docs/api/scenery-phet/reset-all-button.md",
      "title": "ResetAllButton",
      "description": "The standard circular reset control wired to a model's reset() method.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "ResetAllButton"
      ],
      "status": "verified",
      "related": [
        "/api/joist/screen-view",
        "/api/tandem/tandem",
        "/patterns/reset-all-pattern"
      ],
      "prerequisites": [
        "/api/joist/screen-view",
        "/patterns/reset-all-pattern"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 335,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/reset-all-button"
    },
    {
      "path": "/api/scenery-phet/ruler-node",
      "sourceFile": "docs/api/scenery-phet/ruler-node.md",
      "title": "RulerNode",
      "description": "A ruler graphic with major/minor tick marks and a units label, for measurement-style interactions.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "RulerNode",
        "ruler",
        "measurement",
        "ticks"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/phet-font",
        "/styling/typography-and-fonts",
        "/patterns/dispose-and-memory-management"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 494,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/ruler-node"
    },
    {
      "path": "/api/scenery-phet/scenery-phet-query-parameters",
      "sourceFile": "docs/api/scenery-phet/scenery-phet-query-parameters.md",
      "title": "sceneryPhetQueryParameters and isResettingAllProperty",
      "description": "scenery-phet's own demo-app query parameters, and a global TinyProperty flag that's true while any reset-all is in progress.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "sceneryPhetQueryParameters",
        "isResettingAllProperty",
        "query-parameters",
        "QueryStringMachine"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/reset-all-button",
        "/api/query-string-machine/query-string-machine-getall",
        "/patterns/query-parameters-pattern"
      ],
      "prerequisites": [
        "/patterns/query-parameters-pattern"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 426,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/scenery-phet-query-parameters"
    },
    {
      "path": "/api/scenery-phet/scientific-notation-node",
      "sourceFile": "docs/api/scenery-phet/scientific-notation-node.md",
      "title": "ScientificNotationNode",
      "description": "Renders a number Property as mantissa x 10^exponent, updating live as the value changes.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "ScientificNotationNode",
        "number-formatting"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/number-display",
        "/api/scenery-phet/phet-font",
        "/api/axon/property"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 413,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/scientific-notation-node"
    },
    {
      "path": "/api/scenery-phet/screen-summary-layout-nodes",
      "sourceFile": "docs/api/scenery-phet/screen-summary-layout-nodes.md",
      "title": "Screen Summary Layout Nodes",
      "description": "PlayAreaNode, ControlAreaNode, and ScreenSummaryNode — the standard PDOM structural sections ScreenView uses to organize a screen's accessible description tree.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "PlayAreaNode",
        "ControlAreaNode",
        "ScreenSummaryNode",
        "pdom",
        "accessibility"
      ],
      "status": "complete",
      "related": [
        "/accessibility/pdom",
        "/api/joist/screen-view",
        "/accessibility/describing-dynamic-state"
      ],
      "prerequisites": [
        "/accessibility/pdom",
        "/api/joist/screen-view"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 542,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/screen-summary-layout-nodes"
    },
    {
      "path": "/api/scenery-phet/shaded-rectangle-and-sphere",
      "sourceFile": "docs/api/scenery-phet/shaded-rectangle-and-sphere.md",
      "title": "ShadedRectangle and ShadedSphereNode",
      "description": "Two pseudo-3D shading primitives - a beveled rounded rectangle and a specular-highlighted sphere - built from gradients rather than images.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "ShadedRectangle",
        "ShadedSphereNode",
        "shading",
        "gradient",
        "pseudo-3d"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/gauge-node"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 517,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/shaded-rectangle-and-sphere"
    },
    {
      "path": "/api/scenery-phet/shadow-text",
      "sourceFile": "docs/api/scenery-phet/shadow-text.md",
      "title": "ShadowText",
      "description": "A Text node rendered twice - an offset dark copy behind a foreground copy - to fake a drop shadow.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "ShadowText",
        "text",
        "shadow"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/phet-font"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 282,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/shadow-text"
    },
    {
      "path": "/api/scenery-phet/round-icon-buttons",
      "sourceFile": "docs/api/scenery-phet/round-icon-buttons.md",
      "title": "Small Icon Utility Buttons",
      "description": "RefreshButton, RestartButton, ReturnButton, CameraButton, ClapperboardButton, and StarButton — one-shot push buttons distinguished mainly by a fixed icon.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "RefreshButton",
        "RestartButton",
        "ReturnButton",
        "CameraButton",
        "ClapperboardButton",
        "StarButton",
        "button"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/trash-buttons",
        "/api/scenery-phet/back-button",
        "/api/scenery-phet/close-button",
        "/api/sun/rectangular-push-button",
        "/api/sun/round-push-button"
      ],
      "prerequisites": [
        "/api/sun/rectangular-push-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 464,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/round-icon-buttons"
    },
    {
      "path": "/api/scenery-phet/sound-drag-listeners",
      "sourceFile": "docs/api/scenery-phet/sound-drag-listeners.md",
      "title": "Sound Drag Listeners",
      "description": "SoundDragListener, SoundKeyboardDragListener, and SoundRichDragListener — drop-in replacements for scenery's drag listeners that also play grab/release sounds.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "SoundDragListener",
        "SoundKeyboardDragListener",
        "SoundRichDragListener",
        "sound",
        "drag",
        "tambo"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/drag-listener",
        "/api/scenery/keyboard-drag-listener",
        "/api/scenery/rich-drag-listener",
        "/accessibility/sound-design",
        "/api/tambo/sound-clip-player"
      ],
      "prerequisites": [
        "/api/scenery/drag-listener",
        "/api/scenery/rich-drag-listener"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 426,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/sound-drag-listeners"
    },
    {
      "path": "/api/scenery-phet/spectrum-node",
      "sourceFile": "docs/api/scenery-phet/spectrum-node.md",
      "title": "SpectrumNode",
      "description": "A Node that rasterizes a value range into a horizontal color gradient bar via a client-supplied value-to-color function.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "SpectrumNode",
        "gradient",
        "color",
        "spectrum"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/color",
        "/api/dot/dimension2",
        "/api/scenery-phet/gauge-node"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 365,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/spectrum-node"
    },
    {
      "path": "/api/scenery-phet/spinning-indicator-node",
      "sourceFile": "docs/api/scenery-phet/spinning-indicator-node.md",
      "title": "SpinningIndicatorNode",
      "description": "A ring of elements whose fill colors cycle to simulate spinning, for indicating indeterminate progress.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "SpinningIndicatorNode",
        "spinner",
        "loading",
        "progress"
      ],
      "status": "complete",
      "related": [
        "/api/axon/timer"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 414,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/spinning-indicator-node"
    },
    {
      "path": "/api/scenery-phet/star-node",
      "sourceFile": "docs/api/scenery-phet/star-node.md",
      "title": "StarNode and StarShape",
      "description": "A five-pointed star that fills in from left to right by a 0-to-1 value, used as PhET's standard game score indicator.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "StarNode",
        "StarShape"
      ],
      "status": "complete",
      "related": [
        "/api/vegas/score-display-family"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 480,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/star-node"
    },
    {
      "path": "/api/scenery-phet/status-bar",
      "sourceFile": "docs/api/scenery-phet/status-bar.md",
      "title": "StatusBar",
      "description": "The scenery-phet base class for a resizing bar pinned to the top of a screen, handling only geometry — subclasses decide what content goes in it.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "StatusBar"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/question-bar",
        "/api/vegas/status-bars",
        "/api/joist/screen-view"
      ],
      "prerequisites": [
        "/api/dot/bounds2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 520,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/status-bar"
    },
    {
      "path": "/api/scenery-phet/step-backward-button",
      "sourceFile": "docs/api/scenery-phet/step-backward-button.md",
      "title": "StepBackwardButton",
      "description": "A round push button with a backward-step icon, used to rewind a paused simulation by one fixed increment.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "StepBackwardButton",
        "button"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/time-control-node",
        "/api/scenery-phet/play-pause-button",
        "/api/scenery-phet/step-forward-button"
      ],
      "prerequisites": [
        "/api/scenery-phet/time-control-node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 304,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/step-backward-button"
    },
    {
      "path": "/api/scenery-phet/step-forward-button",
      "sourceFile": "docs/api/scenery-phet/step-forward-button.md",
      "title": "StepForwardButton",
      "description": "A round push button with a forward-step icon, used to advance a paused simulation by one fixed increment.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "StepForwardButton",
        "button"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/time-control-node",
        "/api/scenery-phet/play-pause-button",
        "/api/scenery-phet/step-backward-button"
      ],
      "prerequisites": [
        "/api/scenery-phet/time-control-node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 286,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/step-forward-button"
    },
    {
      "path": "/api/scenery-phet/stop-sign-node",
      "sourceFile": "docs/api/scenery-phet/stop-sign-node.md",
      "title": "StopSignNode",
      "description": "An octagonal red stop-sign icon with a white inner border and black outer border.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "StopSignNode",
        "icon",
        "stop"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/banned-node",
        "/api/tandem/tandem"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 263,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/stop-sign-node"
    },
    {
      "path": "/api/scenery-phet/stopwatch-node",
      "sourceFile": "docs/api/scenery-phet/stopwatch-node.md",
      "title": "StopwatchNode",
      "description": "A draggable digital stopwatch bound to a Stopwatch model element.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "StopwatchNode"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/time-control-node",
        "/api/dot/bounds2",
        "/patterns/model-view-separation"
      ],
      "prerequisites": [
        "/api/dot/bounds2"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 548,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/stopwatch-node"
    },
    {
      "path": "/api/scenery-phet/temperature-and-color-sensor-node",
      "sourceFile": "docs/api/scenery-phet/temperature-and-color-sensor-node.md",
      "title": "TemperatureAndColorSensorNode",
      "description": "A composite Node pairing a ThermometerNode with a triangular color-swatch indicator, for sensors that report both a temperature and a sampled color.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "TemperatureAndColorSensorNode",
        "ThermometerNode",
        "sensor"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/thermometer-node",
        "/api/dot/range"
      ],
      "prerequisites": [
        "/api/scenery-phet/thermometer-node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 440,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/temperature-and-color-sensor-node"
    },
    {
      "path": "/api/scenery-phet/thermometer-node",
      "sourceFile": "docs/api/scenery-phet/thermometer-node.md",
      "title": "ThermometerNode",
      "description": "A fluid-level thermometer visualization bound to a temperature Property.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "ThermometerNode"
      ],
      "status": "verified",
      "related": [
        "/api/axon/derived-property",
        "/api/scenery-phet/gauge-node"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 489,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/thermometer-node"
    },
    {
      "path": "/api/scenery-phet/time-control-node",
      "sourceFile": "docs/api/scenery-phet/time-control-node.md",
      "title": "TimeControlNode",
      "description": "The standard play/pause/step-forward control for time-based simulations.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "TimeControlNode"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/stopwatch-node",
        "/api/axon/property",
        "/api/scenery-phet/play-pause-button"
      ],
      "prerequisites": [
        "/api/scenery-phet/play-pause-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 425,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/time-control-node"
    },
    {
      "path": "/api/scenery-phet/time-speed-radio-button-group",
      "sourceFile": "docs/api/scenery-phet/time-speed-radio-button-group.md",
      "title": "TimeSpeedRadioButtonGroup",
      "description": "A vertical Aqua radio button group for selecting among the TimeSpeed enumeration values (SLOW, NORMAL, FAST).",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "TimeSpeedRadioButtonGroup",
        "TimeSpeed"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/time-control-node",
        "/api/axon/enumeration-property"
      ],
      "prerequisites": [
        "/api/axon/enumeration-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 352,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/time-speed-radio-button-group"
    },
    {
      "path": "/api/scenery-phet/trash-buttons",
      "sourceFile": "docs/api/scenery-phet/trash-buttons.md",
      "title": "Trash Buttons",
      "description": "MoveToTrashButton, MoveToTrashLegendButton, and TrashButton — the standard trash-can icon buttons, with and without a \"move to\" arrow.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "MoveToTrashButton",
        "MoveToTrashLegendButton",
        "TrashButton",
        "button"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/round-icon-buttons",
        "/api/scenery-phet/eraser-button",
        "/api/sun/rectangular-push-button"
      ],
      "prerequisites": [
        "/api/sun/rectangular-push-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 376,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/trash-buttons"
    },
    {
      "path": "/api/scenery-phet/triangle-node",
      "sourceFile": "docs/api/scenery-phet/triangle-node.md",
      "title": "TriangleNode",
      "description": "An equilateral or isosceles triangle Path, pointing in any of the four cardinal directions.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "TriangleNode",
        "triangle",
        "shape",
        "marker"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/x-node"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 248,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/triangle-node"
    },
    {
      "path": "/api/scenery-phet/value-gauge-node",
      "sourceFile": "docs/api/scenery-phet/value-gauge-node.md",
      "title": "ValueGaugeNode",
      "description": "A GaugeNode subclass with a built-in, centered NumberDisplay showing the gauge's numeric value.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "ValueGaugeNode",
        "GaugeNode",
        "NumberDisplay",
        "gauge",
        "dial"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/gauge-node",
        "/api/scenery-phet/number-display"
      ],
      "prerequisites": [
        "/api/scenery-phet/gauge-node",
        "/api/axon/property",
        "/api/dot/range"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 302,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/value-gauge-node"
    },
    {
      "path": "/api/scenery-phet/view-synchronizer",
      "sourceFile": "docs/api/scenery-phet/view-synchronizer.md",
      "title": "ViewSynchronizer",
      "description": "A small utility that keeps a container Node's children in sync with an array of model elements, via a view factory function.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "ViewSynchronizer",
        "model-view",
        "dynamic-elements"
      ],
      "status": "complete",
      "related": [
        "/api/axon/observable-array",
        "/patterns/dispose-and-memory-management",
        "/patterns/composing-view-nodes"
      ],
      "prerequisites": [
        "/api/axon/observable-array"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 401,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/view-synchronizer"
    },
    {
      "path": "/api/scenery-phet/wavelength-and-spectrum-sliders",
      "sourceFile": "docs/api/scenery-phet/wavelength-and-spectrum-sliders.md",
      "title": "Wavelength and Spectrum Sliders",
      "description": "SpectrumSliderThumb and SpectrumSliderTrack build a color-gradient Slider; WavelengthNumberControl and WavelengthSpectrumNode specialize that for visible-light wavelength; VisibleColor converts between wavelength and RGB.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "SpectrumSliderThumb",
        "SpectrumSliderTrack",
        "WavelengthNumberControl",
        "WavelengthSpectrumNode",
        "VisibleColor",
        "wavelength",
        "color",
        "slider"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/spectrum-node",
        "/api/scenery-phet/number-control",
        "/api/sun/slider-track-and-thumb",
        "/api/sun/slider",
        "/api/dot/range"
      ],
      "prerequisites": [
        "/api/scenery-phet/spectrum-node",
        "/api/dot/range"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 785,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/wavelength-and-spectrum-sliders"
    },
    {
      "path": "/api/scenery-phet/wire-node",
      "sourceFile": "docs/api/scenery-phet/wire-node.md",
      "title": "WireNode",
      "description": "A cubic-bezier wire Path that continuously reconnects two moving points, typically a ProbeNode and its readout body.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "WireNode",
        "wire",
        "cable",
        "circuit"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/probe-node",
        "/api/axon/multilink",
        "/patterns/multilink-pattern",
        "/api/axon/derived-property"
      ],
      "prerequisites": [
        "/api/scenery-phet/probe-node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 363,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/wire-node"
    },
    {
      "path": "/api/scenery-phet/x-node",
      "sourceFile": "docs/api/scenery-phet/x-node.md",
      "title": "XNode",
      "description": "A simple 'x' mark Node, drawn as a PlusNode rotated 45 degrees.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "XNode",
        "PlusNode",
        "marker",
        "icon"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/triangle-node"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 234,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/x-node"
    },
    {
      "path": "/api/scenery-phet/yaw-pitch-model-view-transform3",
      "sourceFile": "docs/api/scenery-phet/yaw-pitch-model-view-transform3.md",
      "title": "YawPitchModelViewTransform3",
      "description": "A pseudo-3D model-view transform that projects 3D model coordinates onto a 2D view plane using a fixed yaw/pitch/scale, for capacitor-style oblique visualizations.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "YawPitchModelViewTransform3",
        "transform",
        "capacitor",
        "coordinates"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/capacitor-visualization-nodes",
        "/api/phetcommon/model-view-transform",
        "/api/dot/vector2",
        "/api/dot/vector3",
        "/api/dot/matrix3"
      ],
      "prerequisites": [
        "/api/phetcommon/model-view-transform"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 590,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/yaw-pitch-model-view-transform3"
    },
    {
      "path": "/api/scenery-phet/zoom-button-groups",
      "sourceFile": "docs/api/scenery-phet/zoom-button-groups.md",
      "title": "Zoom Button Groups",
      "description": "ZoomButton, ZoomButtonGroup, PlusMinusZoomButtonGroup, and MagnifyingGlassZoomButtonGroup — the standard zoom-in/zoom-out button pair bound to a ranged numeric Property.",
      "category": "api",
      "library": "scenery-phet",
      "tags": [
        "scenery-phet",
        "ZoomButton",
        "ZoomButtonGroup",
        "PlusMinusZoomButtonGroup",
        "MagnifyingGlassZoomButtonGroup",
        "button"
      ],
      "status": "complete",
      "related": [
        "/api/scenery-phet/magnifying-glass-node",
        "/api/sun/rectangular-push-button",
        "/api/dot/range"
      ],
      "prerequisites": [
        "/api/dot/range",
        "/api/sun/rectangular-push-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 686,
      "url": "https://veillette.github.io/Almanach/api/scenery-phet/zoom-button-groups"
    },
    {
      "path": "/api/sun/ab-switch",
      "sourceFile": "docs/api/sun/ab-switch.md",
      "title": "ABSwitch",
      "description": "A labeled two-option toggle switch bound to a Property over exactly two named values.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "ABSwitch",
        "HBox"
      ],
      "status": "complete",
      "related": [
        "/api/sun/on-off-switch",
        "/api/sun/checkbox",
        "/api/scenery/h-box"
      ],
      "prerequisites": [
        "/api/sun/on-off-switch",
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 494,
      "url": "https://veillette.github.io/Almanach/api/sun/ab-switch"
    },
    {
      "path": "/api/sun/accessible-number-spinner",
      "sourceFile": "docs/api/sun/accessible-number-spinner.md",
      "title": "AccessibleNumberSpinner",
      "description": "The trait/mixin that gives NumberSpinner its keyboard and PDOM behavior, with press-and-hold repeat.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "AccessibleNumberSpinner",
        "NumberSpinner",
        "PDOM"
      ],
      "status": "complete",
      "related": [
        "/api/sun/number-spinner",
        "/api/sun/accessible-slider",
        "/api/scenery/parallel-dom-deep-dive"
      ],
      "prerequisites": [
        "/api/sun/number-spinner"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 447,
      "url": "https://veillette.github.io/Almanach/api/sun/accessible-number-spinner"
    },
    {
      "path": "/api/sun/accessible-slider",
      "sourceFile": "docs/api/sun/accessible-slider.md",
      "title": "AccessibleSlider",
      "description": "The trait/mixin that gives Slider (and HSlider/VSlider) its keyboard and PDOM behavior.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "AccessibleSlider",
        "Slider",
        "HSlider",
        "VSlider",
        "PDOM"
      ],
      "status": "complete",
      "related": [
        "/api/sun/slider",
        "/api/sun/hslider",
        "/api/sun/accessible-number-spinner",
        "/api/scenery/parallel-dom-deep-dive"
      ],
      "prerequisites": [
        "/api/sun/slider"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 459,
      "url": "https://veillette.github.io/Almanach/api/sun/accessible-slider"
    },
    {
      "path": "/api/sun/accordion-box",
      "sourceFile": "docs/api/sun/accordion-box.md",
      "title": "AccordionBox",
      "description": "An expandable/collapsible titled container bound to an expandedProperty.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "AccordionBox"
      ],
      "status": "verified",
      "related": [
        "/api/sun/panel",
        "/api/axon/boolean-property",
        "/api/sun/expand-collapse-button"
      ],
      "prerequisites": [
        "/api/sun/panel"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 479,
      "url": "https://veillette.github.io/Almanach/api/sun/accordion-box"
    },
    {
      "path": "/api/sun/aqua-radio-button",
      "sourceFile": "docs/api/sun/aqua-radio-button.md",
      "title": "AquaRadioButton",
      "description": "A single flat, circular radio button with a label Node, the building block behind AquaRadioButtonGroup.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "AquaRadioButton",
        "RadioButtonGroup"
      ],
      "status": "complete",
      "related": [
        "/api/sun/aqua-radio-button-group",
        "/api/sun/rectangular-radio-button",
        "/api/sun/checkbox"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 413,
      "url": "https://veillette.github.io/Almanach/api/sun/aqua-radio-button"
    },
    {
      "path": "/api/sun/aqua-radio-button-group",
      "sourceFile": "docs/api/sun/aqua-radio-button-group.md",
      "title": "AquaRadioButtonGroup",
      "description": "Aqua-style radio button groups bound to a Property, plus the Horizontal/VerticalAquaRadioButtonGroup orientation convenience subclasses.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "AquaRadioButtonGroup",
        "HorizontalAquaRadioButtonGroup",
        "VerticalAquaRadioButtonGroup",
        "RadioButtonGroup"
      ],
      "status": "complete",
      "related": [
        "/api/sun/radio-button-group",
        "/api/sun/aqua-radio-button",
        "/api/sun/checkbox"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 525,
      "url": "https://veillette.github.io/Almanach/api/sun/aqua-radio-button-group"
    },
    {
      "path": "/api/sun/arrow-button",
      "sourceFile": "docs/api/sun/arrow-button.md",
      "title": "ArrowButton",
      "description": "A small rectangular push button whose content is an arrow, with built-in press-and-hold repeat firing.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "ArrowButton",
        "button"
      ],
      "status": "complete",
      "related": [
        "/api/sun/rectangular-push-button",
        "/api/sun/rectangular-button",
        "/api/sun/number-spinner"
      ],
      "prerequisites": [
        "/api/axon/boolean-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 352,
      "url": "https://veillette.github.io/Almanach/api/sun/arrow-button"
    },
    {
      "path": "/api/sun/carousel",
      "sourceFile": "docs/api/sun/carousel.md",
      "title": "Carousel",
      "description": "A paged, scrollable strip of items with next/previous buttons, animated between pages.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "Carousel",
        "layout"
      ],
      "status": "verified",
      "related": [
        "/api/sun/panel",
        "/api/sun/combo-box"
      ],
      "prerequisites": [
        "/patterns/dispose-and-memory-management"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 481,
      "url": "https://veillette.github.io/Almanach/api/sun/carousel"
    },
    {
      "path": "/api/sun/carousel-button",
      "sourceFile": "docs/api/sun/carousel-button.md",
      "title": "CarouselButton",
      "description": "The flat-styled next/previous arrow button Carousel builds and manages internally.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "CarouselButton",
        "Carousel",
        "button"
      ],
      "status": "complete",
      "related": [
        "/api/sun/carousel",
        "/api/sun/rectangular-push-button",
        "/api/sun/rectangular-button",
        "/api/sun/arrow-button"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 422,
      "url": "https://veillette.github.io/Almanach/api/sun/carousel-button"
    },
    {
      "path": "/api/sun/carousel-combo-box",
      "sourceFile": "docs/api/sun/carousel-combo-box.md",
      "title": "CarouselComboBox",
      "description": "A ComboBox-like dropdown whose popup is a scrollable Carousel, for item lists too long for a plain list box.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "CarouselComboBox",
        "ComboBox",
        "Carousel",
        "PageControl"
      ],
      "status": "complete",
      "related": [
        "/api/sun/combo-box",
        "/api/sun/carousel",
        "/api/sun/page-control",
        "/api/sun/carousel-button"
      ],
      "prerequisites": [
        "/api/axon/property",
        "/api/sun/combo-box"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 465,
      "url": "https://veillette.github.io/Almanach/api/sun/carousel-combo-box"
    },
    {
      "path": "/api/sun/checkbox",
      "sourceFile": "docs/api/sun/checkbox.md",
      "title": "Checkbox",
      "description": "A checkbox bound to a BooleanProperty, with label-Node composition.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "Checkbox",
        "BooleanProperty"
      ],
      "status": "verified",
      "related": [
        "/api/sun/hslider",
        "/api/sun/radio-button-group",
        "/patterns/reset-all-pattern"
      ],
      "prerequisites": [
        "/api/axon/boolean-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 340,
      "url": "https://veillette.github.io/Almanach/api/sun/checkbox"
    },
    {
      "path": "/api/sun/color-constants",
      "sourceFile": "docs/api/sun/color-constants.md",
      "title": "ColorConstants and SunConstants",
      "description": "The small set of shared default colors and constant values reused across sun's UI components.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "ColorConstants",
        "SunConstants"
      ],
      "status": "complete",
      "related": [
        "/api/sun/rectangular-radio-button",
        "/api/sun/hslider",
        "/api/scenery/color"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 324,
      "url": "https://veillette.github.io/Almanach/api/sun/color-constants"
    },
    {
      "path": "/api/sun/combo-box",
      "sourceFile": "docs/api/sun/combo-box.md",
      "title": "ComboBox",
      "description": "A dropdown selector bound to a Property over an enumerated set of items.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "ComboBox"
      ],
      "status": "verified",
      "related": [
        "/api/sun/radio-button-group",
        "/api/sun/checkbox",
        "/api/sun/list-box"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 495,
      "url": "https://veillette.github.io/Almanach/api/sun/combo-box"
    },
    {
      "path": "/api/sun/list-box",
      "sourceFile": "docs/api/sun/list-box.md",
      "title": "ComboBoxListBox",
      "description": "The popup list-box Panel that ComboBox creates internally to display its items.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "ComboBoxListBox",
        "ComboBox",
        "listbox"
      ],
      "status": "verified",
      "related": [
        "/api/sun/combo-box",
        "/api/sun/panel"
      ],
      "prerequisites": [
        "/api/sun/combo-box"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 479,
      "url": "https://veillette.github.io/Almanach/api/sun/list-box"
    },
    {
      "path": "/api/sun/expand-collapse-button",
      "sourceFile": "docs/api/sun/expand-collapse-button.md",
      "title": "ExpandCollapseButton",
      "description": "The square plus/minus toggle button that AccordionBox uses internally for its expand/collapse control.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "ExpandCollapseButton",
        "button"
      ],
      "status": "verified",
      "related": [
        "/api/sun/accordion-box",
        "/api/sun/toggle-button"
      ],
      "prerequisites": [
        "/api/axon/boolean-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 304,
      "url": "https://veillette.github.io/Almanach/api/sun/expand-collapse-button"
    },
    {
      "path": "/api/sun/hslider",
      "sourceFile": "docs/api/sun/hslider.md",
      "title": "HSlider",
      "description": "The horizontal slider bound to a NumberProperty and Range.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "HSlider",
        "slider"
      ],
      "status": "verified",
      "related": [
        "/api/sun/checkbox",
        "/api/dot/range"
      ],
      "prerequisites": [
        "/api/axon/number-property",
        "/api/dot/range"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 464,
      "url": "https://veillette.github.io/Almanach/api/sun/hslider"
    },
    {
      "path": "/api/sun/menu-item",
      "sourceFile": "docs/api/sun/menu-item.md",
      "title": "MenuItem",
      "description": "A single row in PhET's popup PhetMenu — a width-sizable, Voicing-enabled, optionally-checkable menu row.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "MenuItem",
        "FireListener",
        "Voicing"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/fire-listener",
        "/api/scenery/voicing",
        "/api/scenery/sizable-mixins"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 386,
      "url": "https://veillette.github.io/Almanach/api/sun/menu-item"
    },
    {
      "path": "/api/sun/momentary-button",
      "sourceFile": "docs/api/sun/momentary-button.md",
      "title": "Momentary Buttons",
      "description": "Press-and-hold buttons that set a Property to an \"on\" value only while pressed, reverting when released.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "RectangularMomentaryButton",
        "RoundMomentaryButton",
        "MomentaryButtonModel",
        "button"
      ],
      "status": "complete",
      "related": [
        "/api/sun/push-button-model",
        "/api/sun/sticky-toggle-button",
        "/api/sun/toggle-button",
        "/api/sun/rectangular-button",
        "/api/sun/round-button"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 368,
      "url": "https://veillette.github.io/Almanach/api/sun/momentary-button"
    },
    {
      "path": "/api/sun/number-picker",
      "sourceFile": "docs/api/sun/number-picker.md",
      "title": "NumberPicker",
      "description": "A compact up/down arrow spinner bound to a NumberProperty, with its arrows drawn directly on the value display.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "NumberPicker",
        "NumberProperty"
      ],
      "status": "complete",
      "related": [
        "/api/sun/number-spinner",
        "/api/sun/hslider",
        "/api/dot/range"
      ],
      "prerequisites": [
        "/api/sun/number-spinner",
        "/api/axon/number-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 599,
      "url": "https://veillette.github.io/Almanach/api/sun/number-picker"
    },
    {
      "path": "/api/sun/number-spinner",
      "sourceFile": "docs/api/sun/number-spinner.md",
      "title": "NumberSpinner",
      "description": "An integer value display flanked by increment/decrement arrow buttons, bound to a Property and a dynamic Range.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "NumberSpinner",
        "NumberProperty"
      ],
      "status": "verified",
      "related": [
        "/api/sun/hslider",
        "/api/dot/range"
      ],
      "prerequisites": [
        "/api/axon/number-property",
        "/api/dot/range"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 402,
      "url": "https://veillette.github.io/Almanach/api/sun/number-spinner"
    },
    {
      "path": "/api/sun/on-off-switch",
      "sourceFile": "docs/api/sun/on-off-switch.md",
      "title": "OnOffSwitch",
      "description": "The iOS-style sliding toggle for a boolean Property, one of three sun affordances for the same on/off pattern.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "OnOffSwitch",
        "BooleanProperty"
      ],
      "status": "verified",
      "related": [
        "/api/sun/checkbox",
        "/api/sun/toggle-button"
      ],
      "prerequisites": [
        "/api/axon/boolean-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 434,
      "url": "https://veillette.github.io/Almanach/api/sun/on-off-switch"
    },
    {
      "path": "/api/sun/page-control",
      "sourceFile": "docs/api/sun/page-control.md",
      "title": "PageControl",
      "description": "An iOS-style row of dots indicating the current page, typically paired with Carousel.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "PageControl",
        "Carousel"
      ],
      "status": "complete",
      "related": [
        "/api/sun/carousel",
        "/api/sun/carousel-combo-box"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 409,
      "url": "https://veillette.github.io/Almanach/api/sun/page-control"
    },
    {
      "path": "/api/sun/panel",
      "sourceFile": "docs/api/sun/panel.md",
      "title": "Panel",
      "description": "A bordered/background container used to group related controls.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "Panel"
      ],
      "status": "verified",
      "related": [
        "/api/sun/accordion-box",
        "/api/sun/checkbox",
        "/api/sun/hslider",
        "/styling/panels-and-backgrounds"
      ],
      "prerequisites": [
        "/guides/scenery-basics"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 329,
      "url": "https://veillette.github.io/Almanach/api/sun/panel"
    },
    {
      "path": "/api/sun/push-button-model",
      "sourceFile": "docs/api/sun/push-button-model.md",
      "title": "PushButtonModel",
      "description": "The non-visual press/fire state machine behind RectangularPushButton and RoundPushButton, and its ButtonModel base.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "PushButtonModel",
        "ButtonModel",
        "button"
      ],
      "status": "complete",
      "related": [
        "/api/sun/rectangular-push-button",
        "/api/sun/round-push-button",
        "/api/sun/rectangular-button",
        "/api/sun/round-button",
        "/api/sun/momentary-button",
        "/api/sun/sticky-toggle-button"
      ],
      "prerequisites": [
        "/api/axon/emitter"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 565,
      "url": "https://veillette.github.io/Almanach/api/sun/push-button-model"
    },
    {
      "path": "/api/sun/radio-button-group",
      "sourceFile": "docs/api/sun/radio-button-group.md",
      "title": "Radio Button Groups",
      "description": "Mutually-exclusive selection bound to a Property (rectangular and Aqua styles).",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "radio-button-group"
      ],
      "status": "verified",
      "related": [
        "/api/sun/combo-box",
        "/api/sun/checkbox",
        "/api/sun/toggle-button"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 531,
      "url": "https://veillette.github.io/Almanach/api/sun/radio-button-group"
    },
    {
      "path": "/api/sun/rectangular-button",
      "sourceFile": "docs/api/sun/rectangular-button.md",
      "title": "RectangularButton",
      "description": "The abstract rectangular button shape and appearance layer that every rectangular sun button builds on.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "RectangularButton",
        "ButtonNode",
        "button"
      ],
      "status": "complete",
      "related": [
        "/api/sun/round-button",
        "/api/sun/push-button-model",
        "/api/sun/rectangular-push-button",
        "/api/sun/toggle-button",
        "/api/sun/radio-button-group"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 602,
      "url": "https://veillette.github.io/Almanach/api/sun/rectangular-button"
    },
    {
      "path": "/api/sun/rectangular-push-button",
      "sourceFile": "docs/api/sun/rectangular-push-button.md",
      "title": "RectangularPushButton",
      "description": "The standard rectangular momentary-action button.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "RectangularPushButton",
        "button"
      ],
      "status": "verified",
      "related": [
        "/api/sun/text-push-button",
        "/api/sun/toggle-button",
        "/api/sun/panel"
      ],
      "prerequisites": [
        "/api/axon/boolean-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 431,
      "url": "https://veillette.github.io/Almanach/api/sun/rectangular-push-button"
    },
    {
      "path": "/api/sun/rectangular-radio-button",
      "sourceFile": "docs/api/sun/rectangular-radio-button.md",
      "title": "RectangularRadioButton",
      "description": "A single boxed radio button, the building block behind RectangularRadioButtonGroup.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "RectangularRadioButton",
        "RadioButtonGroup"
      ],
      "status": "complete",
      "related": [
        "/api/sun/radio-button-group",
        "/api/sun/aqua-radio-button",
        "/api/sun/rectangular-push-button"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 371,
      "url": "https://veillette.github.io/Almanach/api/sun/rectangular-radio-button"
    },
    {
      "path": "/api/sun/round-button",
      "sourceFile": "docs/api/sun/round-button.md",
      "title": "RoundButton",
      "description": "The abstract round button shape and appearance layer that every circular sun button builds on.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "RoundButton",
        "ButtonNode",
        "button"
      ],
      "status": "complete",
      "related": [
        "/api/sun/rectangular-button",
        "/api/sun/push-button-model",
        "/api/sun/round-push-button",
        "/api/sun/toggle-button"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 424,
      "url": "https://veillette.github.io/Almanach/api/sun/round-button"
    },
    {
      "path": "/api/sun/round-push-button",
      "sourceFile": "docs/api/sun/round-push-button.md",
      "title": "RoundPushButton",
      "description": "The circular momentary-action button, sharing PushButtonModel with RectangularPushButton.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "RoundPushButton",
        "button"
      ],
      "status": "verified",
      "related": [
        "/api/sun/rectangular-push-button",
        "/api/sun/toggle-button"
      ],
      "prerequisites": [
        "/api/axon/boolean-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 455,
      "url": "https://veillette.github.io/Almanach/api/sun/round-push-button"
    },
    {
      "path": "/api/sun/slider",
      "sourceFile": "docs/api/sun/slider.md",
      "title": "Slider",
      "description": "The orientation-agnostic base class behind HSlider and VSlider.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "Slider",
        "HSlider",
        "VSlider",
        "Orientation"
      ],
      "status": "complete",
      "related": [
        "/api/sun/hslider",
        "/api/sun/v-slider",
        "/api/scenery/sizable-mixins",
        "/api/scenery/drag-listener",
        "/api/dot/range"
      ],
      "prerequisites": [
        "/api/sun/hslider",
        "/api/axon/number-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 475,
      "url": "https://veillette.github.io/Almanach/api/sun/slider"
    },
    {
      "path": "/api/sun/slider-track-and-thumb",
      "sourceFile": "docs/api/sun/slider-track-and-thumb.md",
      "title": "SliderTrack, DefaultSliderTrack, and SliderThumb",
      "description": "The pluggable track and thumb pieces you swap out to customize a Slider/HSlider/VSlider's visual appearance.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "SliderTrack",
        "DefaultSliderTrack",
        "SliderThumb",
        "Slider"
      ],
      "status": "complete",
      "related": [
        "/api/sun/hslider",
        "/api/sun/slider",
        "/api/dot/range"
      ],
      "prerequisites": [
        "/api/sun/hslider"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 771,
      "url": "https://veillette.github.io/Almanach/api/sun/slider-track-and-thumb"
    },
    {
      "path": "/api/sun/sticky-toggle-button",
      "sourceFile": "docs/api/sun/sticky-toggle-button.md",
      "title": "Sticky Toggle Buttons",
      "description": "Press-to-latch, press-again-to-release buttons bound to a two-value Property.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "RectangularStickyToggleButton",
        "RoundStickyToggleButton",
        "StickyToggleButtonModel",
        "button"
      ],
      "status": "complete",
      "related": [
        "/api/sun/push-button-model",
        "/api/sun/momentary-button",
        "/api/sun/toggle-button",
        "/api/sun/on-off-switch"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 412,
      "url": "https://veillette.github.io/Almanach/api/sun/sticky-toggle-button"
    },
    {
      "path": "/api/sun/text-push-button",
      "sourceFile": "docs/api/sun/text-push-button.md",
      "title": "TextPushButton",
      "description": "A push button whose content is a text label.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "TextPushButton",
        "button"
      ],
      "status": "verified",
      "related": [
        "/api/sun/rectangular-push-button",
        "/api/sun/toggle-button"
      ],
      "prerequisites": [
        "/api/sun/rectangular-push-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 281,
      "url": "https://veillette.github.io/Almanach/api/sun/text-push-button"
    },
    {
      "path": "/api/sun/toggle-button",
      "sourceFile": "docs/api/sun/toggle-button.md",
      "title": "Toggle Buttons",
      "description": "The rectangular/round toggle-button family bound to a BooleanProperty or two-state value.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "toggle-button",
        "BooleanProperty"
      ],
      "status": "verified",
      "related": [
        "/api/sun/rectangular-push-button",
        "/api/sun/radio-button-group",
        "/patterns/reset-all-pattern"
      ],
      "prerequisites": [
        "/api/axon/boolean-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 416,
      "url": "https://veillette.github.io/Almanach/api/sun/toggle-button"
    },
    {
      "path": "/api/sun/toggle-node",
      "sourceFile": "docs/api/sun/toggle-node.md",
      "title": "ToggleNode and BooleanToggleNode",
      "description": "Show exactly one of several child Nodes, chosen by the current value of a Property.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "ToggleNode",
        "BooleanToggleNode"
      ],
      "status": "complete",
      "related": [
        "/api/sun/checkbox",
        "/api/sun/on-off-switch",
        "/api/axon/derived-property"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 478,
      "url": "https://veillette.github.io/Almanach/api/sun/toggle-node"
    },
    {
      "path": "/api/sun/toggle-switch",
      "sourceFile": "docs/api/sun/toggle-switch.md",
      "title": "ToggleSwitch",
      "description": "The generic two-value sliding switch that OnOffSwitch specializes to boolean on/off.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "ToggleSwitch",
        "OnOffSwitch"
      ],
      "status": "complete",
      "related": [
        "/api/sun/on-off-switch",
        "/api/sun/checkbox",
        "/api/sun/toggle-button"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 438,
      "url": "https://veillette.github.io/Almanach/api/sun/toggle-switch"
    },
    {
      "path": "/api/sun/vertical-checkbox-group",
      "sourceFile": "docs/api/sun/vertical-checkbox-group.md",
      "title": "VerticalCheckboxGroup",
      "description": "A convenience VBox layout of several independent Checkboxes, one per boolean Property.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "VerticalCheckboxGroup",
        "Checkbox"
      ],
      "status": "complete",
      "related": [
        "/api/sun/checkbox",
        "/api/scenery/v-box"
      ],
      "prerequisites": [
        "/api/sun/checkbox",
        "/api/axon/boolean-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 385,
      "url": "https://veillette.github.io/Almanach/api/sun/vertical-checkbox-group"
    },
    {
      "path": "/api/sun/v-slider",
      "sourceFile": "docs/api/sun/v-slider.md",
      "title": "VSlider",
      "description": "The vertical counterpart to HSlider, bound to the same NumberProperty/Range pattern.",
      "category": "api",
      "library": "sun",
      "tags": [
        "sun",
        "VSlider",
        "slider"
      ],
      "status": "verified",
      "related": [
        "/api/sun/hslider",
        "/api/dot/range"
      ],
      "prerequisites": [
        "/api/axon/number-property",
        "/api/dot/range"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 295,
      "url": "https://veillette.github.io/Almanach/api/sun/v-slider"
    },
    {
      "path": "/api/tambo/sound-generation-guide",
      "sourceFile": "docs/api/tambo/sound-generation-guide.md",
      "title": "How tambo's Sound Generation Fits Together",
      "description": "A conceptual overview of how soundManager, SoundGenerator subclasses, and enabled-state gating compose into tambo's sonification model.",
      "category": "api",
      "library": "tambo",
      "tags": [
        "tambo",
        "sound",
        "WebAudio",
        "soundManager",
        "SoundGenerator",
        "overview"
      ],
      "status": "verified",
      "related": [
        "/api/tambo/sound-manager",
        "/api/tambo/sound-clip",
        "/api/tambo/sound-clip-player",
        "/api/tambo/pitched-pop-generator",
        "/accessibility/sound-design"
      ],
      "prerequisites": [
        "/guides/working-with-sound"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 580,
      "url": "https://veillette.github.io/Almanach/api/tambo/sound-generation-guide"
    },
    {
      "path": "/api/tambo/pitched-pop-generator",
      "sourceFile": "docs/api/tambo/pitched-pop-generator.md",
      "title": "PitchedPopGenerator",
      "description": "A tambo sound generator that synthesizes a short \"pop\" sound at a controllable pitch, useful for sonifying discrete value changes.",
      "category": "api",
      "library": "tambo",
      "tags": [
        "tambo",
        "PitchedPopGenerator",
        "sound",
        "WebAudio",
        "oscillator"
      ],
      "status": "verified",
      "related": [
        "/api/tambo/sound-manager",
        "/api/tambo/sound-clip",
        "/accessibility/sound-design"
      ],
      "prerequisites": [
        "/api/tambo/sound-generation-guide"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 377,
      "url": "https://veillette.github.io/Almanach/api/tambo/pitched-pop-generator"
    },
    {
      "path": "/api/tambo/sound-clip",
      "sourceFile": "docs/api/tambo/sound-clip.md",
      "title": "SoundClip",
      "description": "A tambo sound generator that plays a decoded audio buffer as a one-shot or looping clip.",
      "category": "api",
      "library": "tambo",
      "tags": [
        "tambo",
        "SoundClip",
        "sound",
        "WebAudio"
      ],
      "status": "verified",
      "related": [
        "/api/tambo/sound-manager",
        "/api/tambo/sound-clip-player",
        "/accessibility/sound-design"
      ],
      "prerequisites": [
        "/api/tambo/sound-generation-guide"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 470,
      "url": "https://veillette.github.io/Almanach/api/tambo/sound-clip"
    },
    {
      "path": "/api/tambo/sound-clip-player",
      "sourceFile": "docs/api/tambo/sound-clip-player.md",
      "title": "SoundClipPlayer",
      "description": "A lightweight, self-registering wrapper around SoundClip for sounds shared across many places in a sim.",
      "category": "api",
      "library": "tambo",
      "tags": [
        "tambo",
        "SoundClipPlayer",
        "sound",
        "WebAudio"
      ],
      "status": "verified",
      "related": [
        "/api/tambo/sound-manager",
        "/accessibility/sound-design"
      ],
      "prerequisites": [
        "/api/tambo/sound-generation-guide",
        "/api/tambo/sound-clip"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 277,
      "url": "https://veillette.github.io/Almanach/api/tambo/sound-clip-player"
    },
    {
      "path": "/api/tambo/sound-manager",
      "sourceFile": "docs/api/tambo/sound-manager.md",
      "title": "soundManager",
      "description": "The singleton that registers tambo sound generators, routes them to the Web Audio output, and controls global enable/disable, per-category gain, and reverb.",
      "category": "api",
      "library": "tambo",
      "tags": [
        "tambo",
        "soundManager",
        "sound",
        "singleton",
        "WebAudio"
      ],
      "status": "verified",
      "related": [
        "/api/tambo/sound-clip",
        "/api/tambo/sound-clip-player",
        "/api/tambo/pitched-pop-generator",
        "/accessibility/sound-design"
      ],
      "prerequisites": [
        "/api/tambo/sound-generation-guide"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 521,
      "url": "https://veillette.github.io/Almanach/api/tambo/sound-manager"
    },
    {
      "path": "/api/tandem/built-in-io-types",
      "sourceFile": "docs/api/tandem/built-in-io-types.md",
      "title": "Built-in IOTypes",
      "description": "A survey of tandem's ready-made IOType instances for JS primitives and common container shapes, and when to reach for one instead of writing a custom IOType.",
      "category": "api",
      "library": "tandem",
      "tags": [
        "tandem",
        "phet-io",
        "IOType",
        "BooleanIO",
        "NumberIO",
        "StringIO",
        "ReferenceIO",
        "ArrayIO",
        "EnumerationIO",
        "MapIO",
        "NullableIO",
        "ObjectLiteralIO",
        "OrIO",
        "Float64ArrayIO",
        "VoidIO"
      ],
      "status": "complete",
      "related": [
        "/api/tandem/io-type",
        "/api/tandem/phetio-object",
        "/api/axon/property"
      ],
      "prerequisites": [
        "/api/tandem/io-type"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 654,
      "url": "https://veillette.github.io/Almanach/api/tandem/built-in-io-types"
    },
    {
      "path": "/api/tandem/disposable",
      "sourceFile": "docs/api/tandem/disposable.md",
      "title": "Disposable",
      "description": "The base dispose-lifecycle class that PhetioObject (and therefore Node and every instrumented type) builds on.",
      "category": "api",
      "library": "tandem",
      "tags": [
        "tandem",
        "axon",
        "Disposable",
        "dispose",
        "lifecycle"
      ],
      "status": "verified",
      "related": [
        "/api/tandem/phetio-object",
        "/patterns/dispose-and-memory-management"
      ],
      "prerequisites": [
        "/patterns/dispose-and-memory-management"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 469,
      "url": "https://veillette.github.io/Almanach/api/tandem/disposable"
    },
    {
      "path": "/api/tandem/io-type",
      "sourceFile": "docs/api/tandem/io-type.md",
      "title": "IOType",
      "description": "Declares a class's PhET-iO serialization - state schema, methods, and documentation - independent of its runtime implementation.",
      "category": "api",
      "library": "tandem",
      "tags": [
        "tandem",
        "phet-io",
        "IOType"
      ],
      "status": "verified",
      "related": [
        "/api/tandem/phetio-object",
        "/api/tandem/phetio-group",
        "/api/tandem/phetio-capsule",
        "/guides/phet-io-and-instrumentation"
      ],
      "prerequisites": [
        "/guides/phet-io-and-instrumentation",
        "/api/tandem/phetio-object"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 541,
      "url": "https://veillette.github.io/Almanach/api/tandem/io-type"
    },
    {
      "path": "/api/tandem/phetio-capsule",
      "sourceFile": "docs/api/tandem/phetio-capsule.md",
      "title": "PhetioCapsule",
      "description": "A PhET-iO-aware container for a single, lazily-created instrumented element, like an on-demand dialog.",
      "category": "api",
      "library": "tandem",
      "tags": [
        "tandem",
        "phet-io",
        "PhetioCapsule",
        "dynamic-elements"
      ],
      "status": "verified",
      "related": [
        "/api/tandem/phetio-group",
        "/api/tandem/phetio-object"
      ],
      "prerequisites": [
        "/api/tandem/phetio-object",
        "/guides/phet-io-and-instrumentation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 451,
      "url": "https://veillette.github.io/Almanach/api/tandem/phetio-capsule"
    },
    {
      "path": "/api/tandem/phetio-group",
      "sourceFile": "docs/api/tandem/phetio-group.md",
      "title": "PhetioGroup",
      "description": "A PhET-iO-aware container for a dynamically-growing/shrinking collection of instrumented elements, like electrons created during a sim.",
      "category": "api",
      "library": "tandem",
      "tags": [
        "tandem",
        "phet-io",
        "PhetioGroup",
        "dynamic-elements"
      ],
      "status": "verified",
      "related": [
        "/api/tandem/phetio-capsule",
        "/api/tandem/phetio-object",
        "/api/tandem/io-type"
      ],
      "prerequisites": [
        "/api/tandem/phetio-object",
        "/guides/phet-io-and-instrumentation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 490,
      "url": "https://veillette.github.io/Almanach/api/tandem/phetio-group"
    },
    {
      "path": "/api/tandem/phetio-id-utils-and-naming",
      "sourceFile": "docs/api/tandem/phetio-id-utils-and-naming.md",
      "title": "PhetioIDUtils and Tandem Naming Conventions",
      "description": "Static string utilities for building and inspecting phetioIDs, and the naming conventions a tree of Tandems produces.",
      "category": "api",
      "library": "tandem",
      "tags": [
        "tandem",
        "phet-io",
        "PhetioIDUtils",
        "Tandem",
        "phetioID"
      ],
      "status": "complete",
      "related": [
        "/api/tandem/tandem",
        "/api/tandem/phetio-object"
      ],
      "prerequisites": [
        "/api/tandem/tandem"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 609,
      "url": "https://veillette.github.io/Almanach/api/tandem/phetio-id-utils-and-naming"
    },
    {
      "path": "/api/tandem/phetio-object",
      "sourceFile": "docs/api/tandem/phetio-object.md",
      "title": "PhetioObject",
      "description": "The base class giving any object PhET-iO instrumentation - a tandem, an IOType, and metadata like phetioState/phetioReadOnly.",
      "category": "api",
      "library": "tandem",
      "tags": [
        "tandem",
        "phet-io",
        "PhetioObject"
      ],
      "status": "verified",
      "related": [
        "/api/tandem/tandem",
        "/api/tandem/io-type",
        "/api/tandem/disposable",
        "/guides/phet-io-and-instrumentation",
        "/patterns/phet-io-instrumentation-pattern"
      ],
      "prerequisites": [
        "/api/tandem/tandem",
        "/guides/phet-io-and-instrumentation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 611,
      "url": "https://veillette.github.io/Almanach/api/tandem/phetio-object"
    },
    {
      "path": "/api/tandem/tandem",
      "sourceFile": "docs/api/tandem/tandem.md",
      "title": "Tandem",
      "description": "The naming/instrumentation handle giving every PhET-iO-tracked element a stable tree address.",
      "category": "api",
      "library": "tandem",
      "tags": [
        "tandem",
        "phet-io",
        "Tandem"
      ],
      "status": "verified",
      "related": [
        "/api/joist/sim",
        "/api/joist/screen",
        "/api/scenery-phet/reset-all-button",
        "/api/tandem/phetio-object",
        "/guides/phet-io-deep-dive"
      ],
      "prerequisites": [
        "/guides/phet-io-and-instrumentation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 519,
      "url": "https://veillette.github.io/Almanach/api/tandem/tandem"
    },
    {
      "path": "/api/tappi/vibration-indicator-and-controller",
      "sourceFile": "docs/api/tappi/vibration-indicator-and-controller.md",
      "title": "VibrationIndicator and ContinuousPatternVibrationController",
      "description": "An on-screen phone icon that visualizes vibration state, and a pattern-transition controller built on top of the (deprecated, iOS-only) native vibration bridge.",
      "category": "api",
      "library": "tappi",
      "tags": [
        "tappi",
        "VibrationIndicator",
        "ContinuousPatternVibrationController",
        "vibration",
        "haptics"
      ],
      "status": "verified",
      "related": [
        "/api/tappi/vibration-manager-and-patterns",
        "/guides/haptics-and-alternative-feedback-channels"
      ],
      "prerequisites": [
        "/api/tappi/vibration-manager-and-patterns",
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 644,
      "url": "https://veillette.github.io/Almanach/api/tappi/vibration-indicator-and-controller"
    },
    {
      "path": "/api/tappi/vibration-manager-and-patterns",
      "sourceFile": "docs/api/tappi/vibration-manager-and-patterns.md",
      "title": "vibrationManager and VibrationPatterns",
      "description": "The shared singleton that drives device vibration through the Web Vibration API, plus a library of reusable on/off interval patterns to feed it.",
      "category": "api",
      "library": "tappi",
      "tags": [
        "tappi",
        "vibrationManager",
        "VibrationPatterns",
        "Intensity",
        "vibration",
        "haptics"
      ],
      "status": "verified",
      "related": [
        "/api/tappi/vibration-indicator-and-controller",
        "/guides/haptics-and-alternative-feedback-channels"
      ],
      "prerequisites": [
        "/guides/scenery-basics"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 590,
      "url": "https://veillette.github.io/Almanach/api/tappi/vibration-manager-and-patterns"
    },
    {
      "path": "/api/twixt/animation",
      "sourceFile": "docs/api/twixt/animation.md",
      "title": "Animation and Easing",
      "description": "Animating a Property's value smoothly over time instead of setting it instantly.",
      "category": "api",
      "library": "twixt",
      "tags": [
        "twixt",
        "Animation",
        "Easing"
      ],
      "status": "verified",
      "related": [
        "/api/axon/property",
        "/api/axon/number-property",
        "/api/twixt/transition-node"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 739,
      "url": "https://veillette.github.io/Almanach/api/twixt/animation"
    },
    {
      "path": "/api/twixt/animation-target-and-easing",
      "sourceFile": "docs/api/twixt/animation-target-and-easing.md",
      "title": "AnimationTarget and Easing",
      "description": "The per-value binding object and interpolation-curve class that Animation is built from internally, and how to use AnimationTarget directly for multi-target animations.",
      "category": "api",
      "library": "twixt",
      "tags": [
        "twixt",
        "AnimationTarget",
        "Easing",
        "Animation"
      ],
      "status": "complete",
      "related": [
        "/api/twixt/animation"
      ],
      "prerequisites": [
        "/api/twixt/animation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 843,
      "url": "https://veillette.github.io/Almanach/api/twixt/animation-target-and-easing"
    },
    {
      "path": "/api/twixt/damped-animation",
      "sourceFile": "docs/api/twixt/damped-animation.md",
      "title": "DampedAnimation",
      "description": "A single-dimension damped-harmonic-oscillator animation that pulls a value toward a target, as an alternative to Animation's fixed-duration easing curves.",
      "category": "api",
      "library": "twixt",
      "tags": [
        "twixt",
        "DampedAnimation",
        "animation",
        "physics"
      ],
      "status": "complete",
      "related": [
        "/api/twixt/animation",
        "/api/axon/property"
      ],
      "prerequisites": [
        "/api/twixt/animation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 536,
      "url": "https://veillette.github.io/Almanach/api/twixt/damped-animation"
    },
    {
      "path": "/api/twixt/transition-node",
      "sourceFile": "docs/api/twixt/transition-node.md",
      "title": "TransitionNode",
      "description": "A Node that swaps between two child Nodes using an animated slide, wipe, or dissolve transition.",
      "category": "api",
      "library": "twixt",
      "tags": [
        "twixt",
        "TransitionNode",
        "Transition",
        "Animation",
        "Node"
      ],
      "status": "verified",
      "related": [
        "/api/twixt/animation",
        "/api/scenery/node"
      ],
      "prerequisites": [
        "/api/twixt/animation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 592,
      "url": "https://veillette.github.io/Almanach/api/twixt/transition-node"
    },
    {
      "path": "/api/utterance-queue/announcers",
      "sourceFile": "docs/api/utterance-queue/announcers.md",
      "title": "Announcer, AriaLiveAnnouncer, and SpeechSynthesisAnnouncer",
      "description": "The Announcer hierarchy that UtteranceQueue hands resolved alert text to — aria-live DOM updates and Web Speech API synthesis.",
      "category": "api",
      "library": "utterance-queue",
      "tags": [
        "utterance-queue",
        "Announcer",
        "AriaLiveAnnouncer",
        "SpeechSynthesisAnnouncer",
        "voicing",
        "accessibility"
      ],
      "status": "verified",
      "related": [
        "/api/utterance-queue/utterance-queue",
        "/api/utterance-queue/response-packet-and-patterns",
        "/accessibility/voicing",
        "/accessibility/describing-dynamic-state"
      ],
      "prerequisites": [
        "/api/utterance-queue/utterance-queue",
        "/api/utterance-queue/utterance"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 398,
      "url": "https://veillette.github.io/Almanach/api/utterance-queue/announcers"
    },
    {
      "path": "/api/utterance-queue/response-packet-and-patterns",
      "sourceFile": "docs/api/utterance-queue/response-packet-and-patterns.md",
      "title": "ResponsePacket and ResponsePatternCollection",
      "description": "Structuring a spoken response into name/object/context/hint categories, and controlling how those categories are combined into one string.",
      "category": "api",
      "library": "utterance-queue",
      "tags": [
        "utterance-queue",
        "ResponsePacket",
        "ResponsePatternCollection",
        "voicing",
        "accessibility"
      ],
      "status": "verified",
      "related": [
        "/api/utterance-queue/utterance",
        "/api/utterance-queue/utterance-queue",
        "/accessibility/voicing",
        "/accessibility/describing-dynamic-state"
      ],
      "prerequisites": [
        "/api/utterance-queue/utterance",
        "/api/utterance-queue/utterance-queue"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 615,
      "url": "https://veillette.github.io/Almanach/api/utterance-queue/response-packet-and-patterns"
    },
    {
      "path": "/api/utterance-queue/utterance",
      "sourceFile": "docs/api/utterance-queue/utterance.md",
      "title": "Utterance",
      "description": "A wrapper around alert content that tracks stability, priority, and per-feature announcing control before it reaches an UtteranceQueue.",
      "category": "api",
      "library": "utterance-queue",
      "tags": [
        "utterance-queue",
        "Utterance",
        "voicing",
        "description",
        "accessibility"
      ],
      "status": "verified",
      "related": [
        "/api/utterance-queue/utterance-queue",
        "/api/utterance-queue/response-packet-and-patterns",
        "/accessibility/voicing",
        "/accessibility/describing-dynamic-state"
      ],
      "prerequisites": [
        "/accessibility/voicing"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 603,
      "url": "https://veillette.github.io/Almanach/api/utterance-queue/utterance"
    },
    {
      "path": "/api/utterance-queue/utterance-queue",
      "sourceFile": "docs/api/utterance-queue/utterance-queue.md",
      "title": "UtteranceQueue",
      "description": "The FIFO queue that manages timing, priority, and interruption for Utterances before handing text off to an Announcer.",
      "category": "api",
      "library": "utterance-queue",
      "tags": [
        "utterance-queue",
        "UtteranceQueue",
        "Announcer",
        "voicing",
        "description",
        "accessibility"
      ],
      "status": "verified",
      "related": [
        "/api/utterance-queue/utterance",
        "/api/utterance-queue/announcers",
        "/api/utterance-queue/response-packet-and-patterns",
        "/accessibility/voicing",
        "/accessibility/describing-dynamic-state"
      ],
      "prerequisites": [
        "/api/utterance-queue/utterance"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 668,
      "url": "https://veillette.github.io/Almanach/api/utterance-queue/utterance-queue"
    },
    {
      "path": "/api/vegas/all-levels-completed-node",
      "sourceFile": "docs/api/vegas/all-levels-completed-node.md",
      "title": "AllLevelsCompletedNode",
      "description": "A pseudo-dialog Node shown when a player has completed every level in a game, with a smiley face and a Done button.",
      "category": "api",
      "library": "vegas",
      "tags": [
        "vegas",
        "AllLevelsCompletedNode",
        "game",
        "dialog",
        "Panel"
      ],
      "status": "verified",
      "related": [
        "/api/vegas/level-selection-button",
        "/api/vegas/game-audio-player",
        "/api/sun/panel",
        "/api/scenery-phet/face-node"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 322,
      "url": "https://veillette.github.io/Almanach/api/vegas/all-levels-completed-node"
    },
    {
      "path": "/api/vegas/elapsed-time-node",
      "sourceFile": "docs/api/vegas/elapsed-time-node.md",
      "title": "ElapsedTimeNode",
      "description": "An HBox that displays a clock icon next to a formatted H:MM:SS (or M:SS) elapsed-time readout, driven by a numeric Property.",
      "category": "api",
      "library": "vegas",
      "tags": [
        "vegas",
        "ElapsedTimeNode",
        "GameTimer",
        "game",
        "HBox"
      ],
      "status": "verified",
      "related": [
        "/api/vegas/game-timer",
        "/api/vegas/status-bars"
      ],
      "prerequisites": [
        "/api/vegas/game-timer"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 278,
      "url": "https://veillette.github.io/Almanach/api/vegas/elapsed-time-node"
    },
    {
      "path": "/api/vegas/status-bars",
      "sourceFile": "docs/api/vegas/status-bars.md",
      "title": "FiniteStatusBar and InfiniteStatusBar",
      "description": "The standard game-screen status bars that pin a score display (and optionally level/challenge/timer info) to the top of a ScreenView.",
      "category": "api",
      "library": "vegas",
      "tags": [
        "vegas",
        "FiniteStatusBar",
        "InfiniteStatusBar",
        "StatusBar",
        "game",
        "score"
      ],
      "status": "verified",
      "related": [
        "/api/vegas/score-display-family",
        "/api/vegas/level-completed-node",
        "/api/vegas/all-levels-completed-node"
      ],
      "prerequisites": [
        "/api/vegas/score-display-family"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 657,
      "url": "https://veillette.github.io/Almanach/api/vegas/status-bars"
    },
    {
      "path": "/api/vegas/game-audio-player",
      "sourceFile": "docs/api/vegas/game-audio-player.md",
      "title": "GameAudioPlayer",
      "description": "A small helper class that plays the standard set of vegas game-feedback sounds (correct/wrong answer, challenge complete, game-over variants).",
      "category": "api",
      "library": "vegas",
      "tags": [
        "vegas",
        "GameAudioPlayer",
        "sound",
        "game",
        "tambo"
      ],
      "status": "verified",
      "related": [
        "/api/vegas/score-display-number-and-star",
        "/api/tambo/sound-clip",
        "/api/tambo/sound-manager",
        "/accessibility/sound-design"
      ],
      "prerequisites": [
        "/api/tambo/sound-generation-guide"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 296,
      "url": "https://veillette.github.io/Almanach/api/vegas/game-audio-player"
    },
    {
      "path": "/api/vegas/game-timer",
      "sourceFile": "docs/api/vegas/game-timer.md",
      "title": "GameTimer",
      "description": "A simple wall-clock-driven timer, ticking once per second, used to drive a game level's elapsed-time display.",
      "category": "api",
      "library": "vegas",
      "tags": [
        "vegas",
        "GameTimer",
        "game",
        "timer"
      ],
      "status": "verified",
      "related": [
        "/api/vegas/elapsed-time-node",
        "/api/axon/number-property"
      ],
      "prerequisites": [
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 424,
      "url": "https://veillette.github.io/Almanach/api/vegas/game-timer"
    },
    {
      "path": "/api/vegas/level-completed-node",
      "sourceFile": "docs/api/vegas/level-completed-node.md",
      "title": "LevelCompletedNode",
      "description": "A Panel shown when a player finishes a single game level, summarizing score, stars, and (optionally) elapsed/best time.",
      "category": "api",
      "library": "vegas",
      "tags": [
        "vegas",
        "LevelCompletedNode",
        "game",
        "Panel",
        "score"
      ],
      "status": "verified",
      "related": [
        "/api/vegas/all-levels-completed-node",
        "/api/vegas/score-display-family",
        "/api/vegas/status-bars",
        "/api/sun/panel"
      ],
      "prerequisites": [
        "/api/vegas/score-display-family"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 575,
      "url": "https://veillette.github.io/Almanach/api/vegas/level-completed-node"
    },
    {
      "path": "/api/vegas/level-selection-button",
      "sourceFile": "docs/api/vegas/level-selection-button.md",
      "title": "LevelSelectionButton",
      "description": "A push button for a game's level-selection screen, combining an icon, a score display, and a level-specific sound.",
      "category": "api",
      "library": "vegas",
      "tags": [
        "vegas",
        "LevelSelectionButton",
        "game",
        "button",
        "RectangularPushButton"
      ],
      "status": "verified",
      "related": [
        "/api/vegas/game-audio-player",
        "/api/tambo/sound-clip"
      ],
      "prerequisites": [
        "/api/vegas/score-display-number-and-star"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 433,
      "url": "https://veillette.github.io/Almanach/api/vegas/level-selection-button"
    },
    {
      "path": "/api/vegas/level-selection-button-group",
      "sourceFile": "docs/api/vegas/level-selection-button-group.md",
      "title": "LevelSelectionButtonGroup",
      "description": "Instantiates and lays out a row (or custom arrangement) of LevelSelectionButtons from a declarative list of items, with built-in support for a gameLevels query parameter.",
      "category": "api",
      "library": "vegas",
      "tags": [
        "vegas",
        "LevelSelectionButtonGroup",
        "LevelSelectionButton",
        "game",
        "FlowBox"
      ],
      "status": "verified",
      "related": [
        "/api/vegas/level-selection-button",
        "/api/vegas/game-audio-player"
      ],
      "prerequisites": [
        "/api/vegas/level-selection-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 614,
      "url": "https://veillette.github.io/Almanach/api/vegas/level-selection-button-group"
    },
    {
      "path": "/api/vegas/score-display-family",
      "sourceFile": "docs/api/vegas/score-display-family.md",
      "title": "ScoreDisplay Family",
      "description": "The three sibling score-display Nodes alongside ScoreDisplayNumberAndStar -- a plain labeled number, a labeled star row, and a bare star row.",
      "category": "api",
      "library": "vegas",
      "tags": [
        "vegas",
        "ScoreDisplayLabeledNumber",
        "ScoreDisplayLabeledStars",
        "ScoreDisplayStars",
        "score",
        "game",
        "HBox"
      ],
      "status": "verified",
      "related": [
        "/api/vegas/score-display-number-and-star",
        "/api/vegas/status-bars",
        "/api/vegas/level-completed-node"
      ],
      "prerequisites": [
        "/api/vegas/score-display-number-and-star"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 518,
      "url": "https://veillette.github.io/Almanach/api/vegas/score-display-family"
    },
    {
      "path": "/api/vegas/score-display-number-and-star",
      "sourceFile": "docs/api/vegas/score-display-number-and-star.md",
      "title": "ScoreDisplayNumberAndStar",
      "description": "A compact vegas score display showing a number and a single star, used where space is tight (e.g. inside a LevelSelectionButton).",
      "category": "api",
      "library": "vegas",
      "tags": [
        "vegas",
        "ScoreDisplayNumberAndStar",
        "score",
        "game",
        "HBox"
      ],
      "status": "verified",
      "related": [
        "/api/vegas/level-selection-button",
        "/api/vegas/game-audio-player"
      ],
      "prerequisites": [
        "/api/scenery/h-box"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 308,
      "url": "https://veillette.github.io/Almanach/api/vegas/score-display-number-and-star"
    },
    {
      "path": "/patterns/avoiding-property-leaks",
      "sourceFile": "docs/patterns/avoiding-property-leaks.md",
      "title": "Avoiding Property Leaks",
      "description": "Listener-unlinking discipline for Properties, DerivedProperties, and Multilinks so dynamically created objects don't leak their whole dependency chain.",
      "category": "patterns",
      "tags": [
        "axon",
        "Property",
        "memory",
        "dispose",
        "listeners"
      ],
      "status": "verified",
      "related": [
        "/patterns/dispose-and-memory-management",
        "/patterns/multilink-pattern",
        "/api/axon/property",
        "/api/axon/derived-property"
      ],
      "prerequisites": [
        "/patterns/dispose-and-memory-management"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 633,
      "url": "https://veillette.github.io/Almanach/patterns/avoiding-property-leaks"
    },
    {
      "path": "/patterns/command-undo-pattern",
      "sourceFile": "docs/patterns/command-undo-pattern.md",
      "title": "Command/Undo Pattern for Interactive Sims",
      "description": "Structuring a reversible user action as a command object with do/undo so a simulation can support undo, if it needs to - built on the same Property-based state that reset() and dispose() already rely on.",
      "category": "patterns",
      "tags": [
        "architecture",
        "undo",
        "Property",
        "state",
        "command-pattern"
      ],
      "status": "complete",
      "related": [
        "/patterns/reset-all-pattern",
        "/patterns/dispose-and-memory-management",
        "/patterns/state-persistence-and-save-restore-patterns",
        "/patterns/model-view-separation"
      ],
      "prerequisites": [
        "/patterns/model-view-separation",
        "/patterns/state-persistence-and-save-restore-patterns"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 727,
      "url": "https://veillette.github.io/Almanach/patterns/command-undo-pattern"
    },
    {
      "path": "/patterns/composing-view-nodes",
      "sourceFile": "docs/patterns/composing-view-nodes.md",
      "title": "Composing View Nodes",
      "description": "Building a screen's view as small, composed Node subclasses instead of one giant ScreenView.",
      "category": "patterns",
      "tags": [
        "scenery",
        "Node",
        "ScreenView",
        "composition",
        "architecture"
      ],
      "status": "verified",
      "related": [
        "/patterns/model-view-separation",
        "/guides/building-your-first-screen",
        "/patterns/dispose-and-memory-management"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 682,
      "url": "https://veillette.github.io/Almanach/patterns/composing-view-nodes"
    },
    {
      "path": "/patterns/constants-file-pattern",
      "sourceFile": "docs/patterns/constants-file-pattern.md",
      "title": "Constants File Pattern",
      "description": "The convention of one MySimConstants.ts module holding every shared magic number, color, and font - the same convention scenery-phet/sun's own SceneryPhetConstants and SunConstants follow.",
      "category": "patterns",
      "tags": [
        "conventions",
        "constants",
        "architecture",
        "SceneryPhetConstants",
        "SunConstants"
      ],
      "status": "complete",
      "related": [
        "/styling/spacing-and-sizing-constants",
        "/patterns/multi-screen-sim-structure",
        "/patterns/options-pattern"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 610,
      "url": "https://veillette.github.io/Almanach/patterns/constants-file-pattern"
    },
    {
      "path": "/patterns/derived-enablement-pattern",
      "sourceFile": "docs/patterns/derived-enablement-pattern.md",
      "title": "Derived-Enablement Pattern",
      "description": "Computing a control's enabledProperty from a DerivedProperty over other model state, instead of imperatively setting .enabled from scattered call sites.",
      "category": "patterns",
      "tags": [
        "axon",
        "DerivedProperty",
        "EnabledComponent",
        "EnabledProperty",
        "enablement"
      ],
      "status": "complete",
      "related": [
        "/api/axon/derived-property",
        "/api/axon/enabled-component",
        "/patterns/multilink-pattern",
        "/patterns/model-view-separation"
      ],
      "prerequisites": [
        "/patterns/model-view-separation",
        "/api/axon/derived-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 645,
      "url": "https://veillette.github.io/Almanach/patterns/derived-enablement-pattern"
    },
    {
      "path": "/patterns/dispose-and-memory-management",
      "sourceFile": "docs/patterns/dispose-and-memory-management.md",
      "title": "Dispose and Memory Management",
      "description": "The dispose() convention - when Nodes/Properties/listeners must clean up.",
      "category": "patterns",
      "tags": [
        "dispose",
        "memory",
        "lifecycle"
      ],
      "status": "verified",
      "related": [
        "/patterns/model-view-separation",
        "/api/axon/property",
        "/api/axon/derived-property",
        "/patterns/multilink-pattern"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 498,
      "url": "https://veillette.github.io/Almanach/patterns/dispose-and-memory-management"
    },
    {
      "path": "/patterns/drag-listeners",
      "sourceFile": "docs/patterns/drag-listeners.md",
      "title": "Drag Listeners",
      "description": "Making nodes draggable with DragListener, KeyboardDragListener, and RichDragListener, wired to a model positionProperty through a transform.",
      "category": "patterns",
      "tags": [
        "scenery",
        "input",
        "DragListener",
        "KeyboardDragListener",
        "RichDragListener",
        "interaction"
      ],
      "status": "verified",
      "related": [
        "/api/phetcommon/model-view-transform",
        "/patterns/model-view-separation",
        "/accessibility/pdom",
        "/api/scenery/rich-drag-listener",
        "/api/scenery/keyboard-drag-listener"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 458,
      "url": "https://veillette.github.io/Almanach/patterns/drag-listeners"
    },
    {
      "path": "/patterns/emitter-vs-property",
      "sourceFile": "docs/patterns/emitter-vs-property.md",
      "title": "Emitter vs. Property",
      "description": "When to model state as a Property versus a discrete event as an Emitter.",
      "category": "patterns",
      "tags": [
        "axon",
        "Emitter",
        "Property",
        "architecture"
      ],
      "status": "verified",
      "related": [
        "/patterns/model-view-separation",
        "/api/axon/property",
        "/api/axon/emitter",
        "/api/axon/derived-property"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 449,
      "url": "https://veillette.github.io/Almanach/patterns/emitter-vs-property"
    },
    {
      "path": "/patterns/feature-flags-and-preferences-pattern",
      "sourceFile": "docs/patterns/feature-flags-and-preferences-pattern.md",
      "title": "Feature Flags and Preferences Pattern",
      "description": "The narrow convention of gating an in-development or optional feature behind a single, consistently-named boolean Property.",
      "category": "patterns",
      "tags": [
        "query-parameters",
        "Property",
        "feature-flag",
        "preferences"
      ],
      "status": "verified",
      "related": [
        "/guides/preferences-and-feature-flags",
        "/patterns/model-view-separation",
        "/patterns/query-parameters-pattern"
      ],
      "prerequisites": [
        "/guides/preferences-and-feature-flags"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 475,
      "url": "https://veillette.github.io/Almanach/patterns/feature-flags-and-preferences-pattern"
    },
    {
      "path": "/patterns/grid-snapping-and-constrained-dragging-pattern",
      "sourceFile": "docs/patterns/grid-snapping-and-constrained-dragging-pattern.md",
      "title": "Grid-Snapping and Constrained-Dragging Pattern",
      "description": "When and why to constrain a draggable Node's input - snapping to a grid, clamping to bounds, or restricting to one axis - as distinct decisions layered on top of the ordinary drag-listener pattern.",
      "category": "patterns",
      "tags": [
        "scenery",
        "DragListener",
        "drag",
        "constraint",
        "grid-snapping"
      ],
      "status": "complete",
      "related": [
        "/patterns/drag-listeners",
        "/cookbook/snapping-a-draggable-node-to-a-grid",
        "/api/scenery/drag-listener",
        "/api/phetcommon/model-view-transform",
        "/patterns/model-view-separation"
      ],
      "prerequisites": [
        "/patterns/drag-listeners"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 706,
      "url": "https://veillette.github.io/Almanach/patterns/grid-snapping-and-constrained-dragging-pattern"
    },
    {
      "path": "/patterns/immutable-vs-mutable-model-data",
      "sourceFile": "docs/patterns/immutable-vs-mutable-model-data.md",
      "title": "Immutable vs. Mutable Model Data",
      "description": "When model state should be an immutable value object replaced wholesale via property.value = newValue, versus mutated in place - and why SceneryStack's math types default to returning new instances.",
      "category": "patterns",
      "tags": [
        "dot",
        "Vector2",
        "Bounds2",
        "Property",
        "immutability",
        "performance"
      ],
      "status": "complete",
      "related": [
        "/api/dot/vector2",
        "/api/dot/bounds2",
        "/api/axon/property",
        "/patterns/model-view-separation"
      ],
      "prerequisites": [
        "/patterns/model-view-separation",
        "/api/axon/property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 793,
      "url": "https://veillette.github.io/Almanach/patterns/immutable-vs-mutable-model-data"
    },
    {
      "path": "/patterns/lazy-initialization-pattern",
      "sourceFile": "docs/patterns/lazy-initialization-pattern.md",
      "title": "Lazy Initialization Pattern",
      "description": "Deferring an expensive object's construction until it's actually needed, instead of paying its cost unconditionally at startup.",
      "category": "patterns",
      "tags": [
        "performance",
        "architecture",
        "lazy-initialization"
      ],
      "status": "complete",
      "related": [
        "/cookbook/lazily-creating-an-expensive-node",
        "/api/joist/screen",
        "/guides/performance-and-profiling"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 617,
      "url": "https://veillette.github.io/Almanach/patterns/lazy-initialization-pattern"
    },
    {
      "path": "/patterns/model-view-separation",
      "sourceFile": "docs/patterns/model-view-separation.md",
      "title": "Model-View Separation",
      "description": "The foundational SceneryStack architecture - axon Properties form the model, scenery Nodes observe it, and nothing flows the other way.",
      "category": "patterns",
      "tags": [
        "architecture",
        "axon",
        "Property",
        "DerivedProperty",
        "MVC"
      ],
      "status": "verified",
      "related": [
        "/api/phetcommon/model-view-transform",
        "/getting-started/what-is-scenerystack",
        "/patterns/multilink-pattern",
        "/patterns/reset-all-pattern"
      ],
      "prerequisites": [
        "/getting-started/your-first-simulation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 473,
      "url": "https://veillette.github.io/Almanach/patterns/model-view-separation"
    },
    {
      "path": "/patterns/multi-screen-sim-structure",
      "sourceFile": "docs/patterns/multi-screen-sim-structure.md",
      "title": "Multi-Screen Sim Structure",
      "description": "Structuring model/view code across multiple Screens in one Sim.",
      "category": "patterns",
      "tags": [
        "joist",
        "Screen",
        "Sim",
        "architecture"
      ],
      "status": "verified",
      "related": [
        "/api/joist/sim",
        "/api/joist/screen",
        "/api/joist/screen-view",
        "/patterns/model-view-separation",
        "/patterns/phet-io-instrumentation-pattern"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 660,
      "url": "https://veillette.github.io/Almanach/patterns/multi-screen-sim-structure"
    },
    {
      "path": "/patterns/phet-io-instrumentation-pattern",
      "sourceFile": "docs/patterns/phet-io-instrumentation-pattern.md",
      "title": "PhET-iO Instrumentation Pattern",
      "description": "Deciding what to instrument with Tandem and structuring a PhET-iO-ready model.",
      "category": "patterns",
      "tags": [
        "tandem",
        "phet-io",
        "architecture"
      ],
      "status": "verified",
      "related": [
        "/api/tandem/tandem",
        "/api/joist/sim",
        "/api/joist/screen",
        "/patterns/model-view-separation",
        "/patterns/reset-all-pattern",
        "/patterns/multi-screen-sim-structure"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 699,
      "url": "https://veillette.github.io/Almanach/patterns/phet-io-instrumentation-pattern"
    },
    {
      "path": "/patterns/query-parameters-pattern",
      "sourceFile": "docs/patterns/query-parameters-pattern.md",
      "title": "Query Parameters Pattern",
      "description": "Using query parameters to drive optional/debug behavior.",
      "category": "patterns",
      "tags": [
        "query-parameters",
        "conventions"
      ],
      "status": "verified",
      "related": [
        "/patterns/phet-io-instrumentation-pattern",
        "/patterns/model-view-separation",
        "/patterns/feature-flags-and-preferences-pattern"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [
        "https://github.com/phetsims/query-string-machine",
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 479,
      "url": "https://veillette.github.io/Almanach/patterns/query-parameters-pattern"
    },
    {
      "path": "/patterns/singleton-and-namespace-conventions",
      "sourceFile": "docs/patterns/singleton-and-namespace-conventions.md",
      "title": "Singleton and Namespace Conventions",
      "description": "When a library exposes a ready-made shared-instance singleton (like dotRandom or animationFrameTimer) versus when you construct and own your own instance.",
      "category": "patterns",
      "tags": [
        "singleton",
        "conventions",
        "dotRandom",
        "animationFrameTimer",
        "Namespace",
        "architecture"
      ],
      "status": "verified",
      "related": [
        "/api/dot/random",
        "/api/axon/timer",
        "/guides/working-with-sound",
        "/patterns/dispose-and-memory-management"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 1007,
      "url": "https://veillette.github.io/Almanach/patterns/singleton-and-namespace-conventions"
    },
    {
      "path": "/patterns/state-persistence-and-save-restore-patterns",
      "sourceFile": "docs/patterns/state-persistence-and-save-restore-patterns.md",
      "title": "State Persistence and Save/Restore Patterns",
      "description": "Structuring model state as enumerable Properties so it can be saved and restored, whether by PhET-iO or by a simulation's own save/load feature.",
      "category": "patterns",
      "tags": [
        "tandem",
        "phet-io",
        "Property",
        "state",
        "persistence"
      ],
      "status": "verified",
      "related": [
        "/patterns/phet-io-instrumentation-pattern",
        "/patterns/model-view-separation",
        "/patterns/reset-all-pattern"
      ],
      "prerequisites": [
        "/patterns/model-view-separation",
        "/patterns/phet-io-instrumentation-pattern"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 697,
      "url": "https://veillette.github.io/Almanach/patterns/state-persistence-and-save-restore-patterns"
    },
    {
      "path": "/patterns/testing-model-logic-headlessly",
      "sourceFile": "docs/patterns/testing-model-logic-headlessly.md",
      "title": "Testing Model Logic Headlessly",
      "description": "Unit-testing model classes without instantiating scenery Nodes or a Display, so tests run fast and in plain Node.js.",
      "category": "patterns",
      "tags": [
        "testing",
        "axon",
        "Property",
        "model",
        "node.js"
      ],
      "status": "verified",
      "related": [
        "/patterns/model-view-separation",
        "/patterns/dispose-and-memory-management"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 662,
      "url": "https://veillette.github.io/Almanach/patterns/testing-model-logic-headlessly"
    },
    {
      "path": "/patterns/enumeration-pattern",
      "sourceFile": "docs/patterns/enumeration-pattern.md",
      "title": "The Enumeration Pattern",
      "description": "Modeling closed sets of values instead of string literals.",
      "category": "patterns",
      "tags": [
        "axon",
        "EnumerationProperty",
        "enumeration"
      ],
      "status": "verified",
      "related": [
        "/api/axon/enumeration-property",
        "/patterns/options-pattern",
        "/patterns/model-view-separation",
        "/api/phet-core/enumeration-value"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 420,
      "url": "https://veillette.github.io/Almanach/patterns/enumeration-pattern"
    },
    {
      "path": "/patterns/multilink-pattern",
      "sourceFile": "docs/patterns/multilink-pattern.md",
      "title": "The Multilink Pattern",
      "description": "Combining multiple Properties into one derived reaction.",
      "category": "patterns",
      "tags": [
        "axon",
        "Multilink",
        "DerivedProperty"
      ],
      "status": "verified",
      "related": [
        "/api/axon/multilink",
        "/api/axon/derived-property",
        "/api/axon/property",
        "/patterns/model-view-separation"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 428,
      "url": "https://veillette.github.io/Almanach/patterns/multilink-pattern"
    },
    {
      "path": "/patterns/options-pattern",
      "sourceFile": "docs/patterns/options-pattern.md",
      "title": "The Options Pattern",
      "description": "The options-object convention for configuring Nodes and components.",
      "category": "patterns",
      "tags": [
        "options",
        "typescript",
        "conventions"
      ],
      "status": "verified",
      "related": [
        "/patterns/model-view-separation",
        "/patterns/dispose-and-memory-management",
        "/api/scenery-phet/arrow-node"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 469,
      "url": "https://veillette.github.io/Almanach/patterns/options-pattern"
    },
    {
      "path": "/patterns/reset-all-pattern",
      "sourceFile": "docs/patterns/reset-all-pattern.md",
      "title": "The Reset-All Pattern",
      "description": "Wiring every model Property's reset() through one ResetAllButton.",
      "category": "patterns",
      "tags": [
        "reset",
        "ResetAllButton",
        "Property"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/reset-all-button",
        "/api/axon/property",
        "/patterns/model-view-separation"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 479,
      "url": "https://veillette.github.io/Almanach/patterns/reset-all-pattern"
    },
    {
      "path": "/styling/animation-and-motion-design-conventions",
      "sourceFile": "docs/styling/animation-and-motion-design-conventions.md",
      "title": "Animation and Motion Design Conventions",
      "description": "When to animate a transition instead of snapping it instantly, how long an animation should run, which Easing curve to reach for, and how to avoid overusing motion.",
      "category": "styling",
      "tags": [
        "twixt",
        "Animation",
        "Easing",
        "motion",
        "transitions",
        "conventions"
      ],
      "status": "complete",
      "related": [
        "/api/twixt/animation",
        "/api/twixt/transition-node",
        "/styling/color-profiles",
        "/patterns/feature-flags-and-preferences-pattern"
      ],
      "prerequisites": [
        "/api/twixt/animation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1097,
      "url": "https://veillette.github.io/Almanach/styling/animation-and-motion-design-conventions"
    },
    {
      "path": "/styling/color-profiles",
      "sourceFile": "docs/styling/color-profiles.md",
      "title": "Color Profiles",
      "description": "Centralizing colors with ProfileColorProperty so an application can switch between default and projector color schemes at runtime.",
      "category": "styling",
      "tags": [
        "scenery",
        "ProfileColorProperty",
        "colorProfileProperty",
        "projector-mode",
        "colors"
      ],
      "status": "verified",
      "related": [
        "/patterns/model-view-separation",
        "/styling/high-contrast-projector-mode",
        "/api/scenery/color"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 349,
      "url": "https://veillette.github.io/Almanach/styling/color-profiles"
    },
    {
      "path": "/styling/high-contrast-projector-mode",
      "sourceFile": "docs/styling/high-contrast-projector-mode.md",
      "title": "High-Contrast / Projector-Mode Deep Dive",
      "description": "Palette-design considerations specific to projector mode - contrast ratios, saturation, and what breaks on a washed-out classroom projector.",
      "category": "styling",
      "tags": [
        "scenery",
        "ProfileColorProperty",
        "projector-mode",
        "contrast",
        "colors"
      ],
      "status": "verified",
      "related": [
        "/styling/color-profiles",
        "/guides/preferences-and-feature-flags"
      ],
      "prerequisites": [
        "/styling/color-profiles"
      ],
      "sourceRefs": [],
      "wordCount": 699,
      "url": "https://veillette.github.io/Almanach/styling/high-contrast-projector-mode"
    },
    {
      "path": "/styling/icon-sizing-and-button-padding-standards",
      "sourceFile": "docs/styling/icon-sizing-and-button-padding-standards.md",
      "title": "Icon Sizing and Button Padding Standards",
      "description": "Standardizing icon dimensions and button touch-target padding once you already have icons and buttons, so a sim's controls read as one consistent set rather than a collection of individually-reasonable sizes.",
      "category": "styling",
      "tags": [
        "sun",
        "styling",
        "icons",
        "touchArea",
        "conventions",
        "spacing"
      ],
      "status": "complete",
      "related": [
        "/styling/iconography-conventions",
        "/styling/spacing-and-sizing-constants",
        "/styling/layout-container-conventions",
        "/api/sun/rectangular-push-button"
      ],
      "prerequisites": [
        "/styling/iconography-conventions",
        "/styling/spacing-and-sizing-constants"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 831,
      "url": "https://veillette.github.io/Almanach/styling/icon-sizing-and-button-padding-standards"
    },
    {
      "path": "/styling/iconography-conventions",
      "sourceFile": "docs/styling/iconography-conventions.md",
      "title": "Iconography Conventions",
      "description": "Building consistent icons for buttons and controls.",
      "category": "styling",
      "tags": [
        "icons",
        "styling",
        "sun"
      ],
      "status": "verified",
      "related": [
        "/api/sun/rectangular-push-button",
        "/api/scenery-phet/arrow-node",
        "/styling/stroke-and-line-styling",
        "/styling/color-profiles"
      ],
      "prerequisites": [
        "/api/sun/rectangular-push-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 561,
      "url": "https://veillette.github.io/Almanach/styling/iconography-conventions"
    },
    {
      "path": "/styling/layout-container-conventions",
      "sourceFile": "docs/styling/layout-container-conventions.md",
      "title": "Layout Container Conventions",
      "description": "Styling conventions when composing FlowBox/GridBox/AlignBox layouts.",
      "category": "styling",
      "tags": [
        "scenery",
        "layout",
        "styling"
      ],
      "status": "verified",
      "related": [
        "/styling/panels-and-backgrounds",
        "/styling/typography-and-fonts",
        "/api/sun/panel"
      ],
      "prerequisites": [
        "/api/scenery/node"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 605,
      "url": "https://veillette.github.io/Almanach/styling/layout-container-conventions"
    },
    {
      "path": "/styling/panels-and-backgrounds",
      "sourceFile": "docs/styling/panels-and-backgrounds.md",
      "title": "Panels and Backgrounds",
      "description": "Conventions for grouping controls with Panel/AccordionBox.",
      "category": "styling",
      "tags": [
        "sun",
        "Panel",
        "styling"
      ],
      "status": "verified",
      "related": [
        "/api/sun/panel",
        "/api/sun/accordion-box",
        "/styling/layout-container-conventions",
        "/styling/color-profiles"
      ],
      "prerequisites": [
        "/api/sun/panel"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 465,
      "url": "https://veillette.github.io/Almanach/styling/panels-and-backgrounds"
    },
    {
      "path": "/styling/responsive-layout-strategies",
      "sourceFile": "docs/styling/responsive-layout-strategies.md",
      "title": "Responsive Layout Strategies",
      "description": "How a ScreenView's fixed layoutBounds and scenery's layout containers together handle windows of different sizes and aspect ratios.",
      "category": "styling",
      "tags": [
        "scenery",
        "ScreenView",
        "layoutBounds",
        "FlowBox",
        "GridBox",
        "responsive"
      ],
      "status": "verified",
      "related": [
        "/styling/layout-container-conventions",
        "/guides/building-your-first-screen",
        "/guides/scenery-layout"
      ],
      "prerequisites": [
        "/styling/layout-container-conventions"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 702,
      "url": "https://veillette.github.io/Almanach/styling/responsive-layout-strategies"
    },
    {
      "path": "/styling/spacing-and-sizing-constants",
      "sourceFile": "docs/styling/spacing-and-sizing-constants.md",
      "title": "Spacing and Sizing Constants",
      "description": "Centralizing margins, spacing, and icon sizes in one constants file instead of hardcoding magic numbers throughout view code.",
      "category": "styling",
      "tags": [
        "scenery",
        "constants",
        "spacing",
        "layout",
        "conventions"
      ],
      "status": "verified",
      "related": [
        "/styling/layout-container-conventions",
        "/patterns/options-pattern",
        "/styling/panels-and-backgrounds"
      ],
      "prerequisites": [
        "/styling/layout-container-conventions"
      ],
      "sourceRefs": [],
      "wordCount": 550,
      "url": "https://veillette.github.io/Almanach/styling/spacing-and-sizing-constants"
    },
    {
      "path": "/styling/stroke-and-line-styling",
      "sourceFile": "docs/styling/stroke-and-line-styling.md",
      "title": "Stroke and Line Styling",
      "description": "Conventions for stroke width, dash patterns, and line joins/caps.",
      "category": "styling",
      "tags": [
        "kite",
        "scenery",
        "stroke",
        "styling"
      ],
      "status": "verified",
      "related": [
        "/api/kite/shape",
        "/api/scenery/path",
        "/styling/iconography-conventions"
      ],
      "prerequisites": [
        "/api/kite/shape"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 568,
      "url": "https://veillette.github.io/Almanach/styling/stroke-and-line-styling"
    },
    {
      "path": "/styling/typography-and-fonts",
      "sourceFile": "docs/styling/typography-and-fonts.md",
      "title": "Typography and Fonts",
      "description": "Using PhetFont consistently and font-size/weight conventions.",
      "category": "styling",
      "tags": [
        "scenery-phet",
        "PhetFont",
        "typography"
      ],
      "status": "verified",
      "related": [
        "/api/scenery-phet/phet-font",
        "/styling/panels-and-backgrounds",
        "/styling/layout-container-conventions"
      ],
      "prerequisites": [
        "/api/scenery-phet/phet-font"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 501,
      "url": "https://veillette.github.io/Almanach/styling/typography-and-fonts"
    },
    {
      "path": "/styling/visual-debugging-aids",
      "sourceFile": "docs/styling/visual-debugging-aids.md",
      "title": "Visual Debugging Aids",
      "description": "Using scenery's built-in debug query parameters to visualize hit areas, pointer areas, and rendering-block boundaries while tracking down layout and input problems.",
      "category": "styling",
      "tags": [
        "scenery",
        "debugging",
        "query-parameters",
        "showPointerAreas",
        "showHitAreas",
        "dev"
      ],
      "status": "complete",
      "related": [
        "/guides/performance-and-profiling",
        "/patterns/query-parameters-pattern",
        "/patterns/drag-listeners",
        "/api/scenery/hit-testing-and-picking"
      ],
      "prerequisites": [
        "/getting-started/running-and-building-a-simulation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 622,
      "url": "https://veillette.github.io/Almanach/styling/visual-debugging-aids"
    },
    {
      "path": "/accessibility/accessible-descriptions-for-charts-and-graphs",
      "sourceFile": "docs/accessibility/accessible-descriptions-for-charts-and-graphs.md",
      "title": "Accessible Descriptions for Charts and Graphs",
      "description": "Writing PDOM description content for a bamboo chart that conveys the data's trend and key values, not just the fact that a chart exists.",
      "category": "accessibility",
      "tags": [
        "bamboo",
        "pdom",
        "description",
        "ChartTransform",
        "accessibility",
        "charts"
      ],
      "status": "complete",
      "related": [
        "/accessibility/describing-dynamic-state",
        "/accessibility/pdom",
        "/api/bamboo/chart-transform",
        "/api/bamboo/line-plot"
      ],
      "prerequisites": [
        "/accessibility/describing-dynamic-state",
        "/api/bamboo/chart-transform"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 854,
      "url": "https://veillette.github.io/Almanach/accessibility/accessible-descriptions-for-charts-and-graphs"
    },
    {
      "path": "/accessibility/alternative-input-overview",
      "sourceFile": "docs/accessibility/alternative-input-overview.md",
      "title": "Alternative Input Overview",
      "description": "How pointer, keyboard, and switch/AT input all route through the same listeners.",
      "category": "accessibility",
      "tags": [
        "scenery",
        "alternative-input"
      ],
      "status": "verified",
      "related": [
        "/accessibility/pdom",
        "/accessibility/keyboard-input-and-hotkeys",
        "/accessibility/focus-highlights"
      ],
      "prerequisites": [
        "/accessibility/pdom"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 541,
      "url": "https://veillette.github.io/Almanach/accessibility/alternative-input-overview"
    },
    {
      "path": "/accessibility/cognitive-accessibility-considerations",
      "sourceFile": "docs/accessibility/cognitive-accessibility-considerations.md",
      "title": "Cognitive Accessibility Considerations",
      "description": "Reducing cognitive load - clear language, consistent layout, and avoiding unnecessary complexity or timers - as an accessibility axis distinct from screen-reader and keyboard support.",
      "category": "accessibility",
      "tags": [
        "accessibility",
        "cognitive-load",
        "plain-language",
        "conventions"
      ],
      "status": "complete",
      "related": [
        "/accessibility/pdom",
        "/accessibility/internationalized-accessible-names",
        "/styling/layout-container-conventions",
        "/patterns/feature-flags-and-preferences-pattern"
      ],
      "prerequisites": [
        "/accessibility/pdom"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 904,
      "url": "https://veillette.github.io/Almanach/accessibility/cognitive-accessibility-considerations"
    },
    {
      "path": "/accessibility/describing-dynamic-state",
      "sourceFile": "docs/accessibility/describing-dynamic-state.md",
      "title": "Describing Dynamic State",
      "description": "Writing description content that updates as model state changes.",
      "category": "accessibility",
      "tags": [
        "pdom",
        "description",
        "accessibility"
      ],
      "status": "verified",
      "related": [
        "/accessibility/pdom",
        "/accessibility/voicing",
        "/accessibility/internationalized-accessible-names"
      ],
      "prerequisites": [
        "/accessibility/pdom"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 618,
      "url": "https://veillette.github.io/Almanach/accessibility/describing-dynamic-state"
    },
    {
      "path": "/accessibility/focus-highlights",
      "sourceFile": "docs/accessibility/focus-highlights.md",
      "title": "Focus Highlights",
      "description": "Customizing focus highlights for focusable Nodes.",
      "category": "accessibility",
      "tags": [
        "scenery",
        "focus",
        "accessibility"
      ],
      "status": "verified",
      "related": [
        "/accessibility/pdom",
        "/accessibility/alternative-input-overview",
        "/accessibility/voicing"
      ],
      "prerequisites": [
        "/accessibility/pdom"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 554,
      "url": "https://veillette.github.io/Almanach/accessibility/focus-highlights"
    },
    {
      "path": "/accessibility/internationalized-accessible-names",
      "sourceFile": "docs/accessibility/internationalized-accessible-names.md",
      "title": "Internationalized Accessible Names",
      "description": "Routing accessibleName and other PDOM strings through the same StringProperty translation pipeline as visible text, instead of hardcoding them in English.",
      "category": "accessibility",
      "tags": [
        "accessibility",
        "pdom",
        "accessibleName",
        "localization",
        "i18n",
        "StringProperty"
      ],
      "status": "verified",
      "related": [
        "/guides/translation-and-localization",
        "/accessibility/pdom",
        "/api/axon/string-property"
      ],
      "prerequisites": [
        "/accessibility/pdom",
        "/guides/translation-and-localization"
      ],
      "sourceRefs": [],
      "wordCount": 581,
      "url": "https://veillette.github.io/Almanach/accessibility/internationalized-accessible-names"
    },
    {
      "path": "/accessibility/keyboard-input-and-hotkeys",
      "sourceFile": "docs/accessibility/keyboard-input-and-hotkeys.md",
      "title": "Keyboard Input and Hotkeys",
      "description": "KeyboardListener and Hotkey for custom keyboard shortcuts beyond dragging.",
      "category": "accessibility",
      "tags": [
        "scenery",
        "KeyboardListener",
        "keyboard"
      ],
      "status": "verified",
      "related": [
        "/accessibility/pdom",
        "/accessibility/alternative-input-overview",
        "/accessibility/focus-highlights"
      ],
      "prerequisites": [
        "/accessibility/pdom"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 620,
      "url": "https://veillette.github.io/Almanach/accessibility/keyboard-input-and-hotkeys"
    },
    {
      "path": "/accessibility/mobile-screen-reader-testing-notes",
      "sourceFile": "docs/accessibility/mobile-screen-reader-testing-notes.md",
      "title": "Mobile Screen-Reader Testing Notes",
      "description": "Practical notes on testing VoiceOver (iOS) and TalkBack (Android) with a sim, and the specific ways mobile screen-reader testing differs from testing on desktop.",
      "category": "accessibility",
      "tags": [
        "accessibility",
        "pdom",
        "screen-reader",
        "voiceover",
        "talkback",
        "mobile",
        "testing"
      ],
      "status": "verified",
      "related": [
        "/accessibility/screen-reader-testing-checklist",
        "/accessibility/pdom",
        "/accessibility/alternative-input-overview",
        "/getting-started/supported-browsers"
      ],
      "prerequisites": [
        "/accessibility/screen-reader-testing-checklist"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 788,
      "url": "https://veillette.github.io/Almanach/accessibility/mobile-screen-reader-testing-notes"
    },
    {
      "path": "/accessibility/screen-reader-testing-checklist",
      "sourceFile": "docs/accessibility/screen-reader-testing-checklist.md",
      "title": "Screen-Reader Testing Checklist",
      "description": "A practical checklist for manually testing a sim's PDOM with a real screen reader instead of relying on automated checks alone.",
      "category": "accessibility",
      "tags": [
        "accessibility",
        "pdom",
        "screen-reader",
        "voiceover",
        "nvda",
        "testing"
      ],
      "status": "verified",
      "related": [
        "/accessibility/pdom",
        "/accessibility/voicing",
        "/accessibility/focus-highlights",
        "/accessibility/alternative-input-overview"
      ],
      "prerequisites": [
        "/accessibility/pdom"
      ],
      "sourceRefs": [],
      "wordCount": 751,
      "url": "https://veillette.github.io/Almanach/accessibility/screen-reader-testing-checklist"
    },
    {
      "path": "/accessibility/sound-design",
      "sourceFile": "docs/accessibility/sound-design.md",
      "title": "Sound Design",
      "description": "Using scenery-phet/tambo sound generators for non-speech audio feedback.",
      "category": "accessibility",
      "tags": [
        "tambo",
        "sound",
        "accessibility"
      ],
      "status": "verified",
      "related": [
        "/accessibility/voicing",
        "/accessibility/describing-dynamic-state",
        "/accessibility/screen-reader-testing-checklist"
      ],
      "prerequisites": [
        "/accessibility/pdom"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 550,
      "url": "https://veillette.github.io/Almanach/accessibility/sound-design"
    },
    {
      "path": "/accessibility/pdom",
      "sourceFile": "docs/accessibility/pdom.md",
      "title": "The Parallel DOM (PDOM)",
      "description": "How scenery renders an invisible, semantic HTML tree alongside the canvas so screen readers and keyboards can use the application.",
      "category": "accessibility",
      "tags": [
        "scenery",
        "pdom",
        "accessibility",
        "a11y",
        "screen-reader",
        "tagName",
        "accessibleName"
      ],
      "status": "verified",
      "related": [
        "/patterns/drag-listeners",
        "/accessibility/focus-highlights",
        "/accessibility/alternative-input-overview",
        "/accessibility/internationalized-accessible-names",
        "/api/scenery/parallel-dom-deep-dive"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [],
      "wordCount": 495,
      "url": "https://veillette.github.io/Almanach/accessibility/pdom"
    },
    {
      "path": "/accessibility/voicing",
      "sourceFile": "docs/accessibility/voicing.md",
      "title": "Voicing",
      "description": "Speech-synthesis descriptions triggered by interaction, layered on the PDOM.",
      "category": "accessibility",
      "tags": [
        "scenery",
        "voicing",
        "speech"
      ],
      "status": "verified",
      "related": [
        "/accessibility/pdom",
        "/accessibility/describing-dynamic-state",
        "/accessibility/focus-highlights"
      ],
      "prerequisites": [
        "/accessibility/pdom"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 613,
      "url": "https://veillette.github.io/Almanach/accessibility/voicing"
    },
    {
      "path": "/examples/3d-scene-with-mobius",
      "sourceFile": "docs/examples/3d-scene-with-mobius.md",
      "title": "A 3D Scene with Mobius",
      "description": "A worked example setting up a basic mobius 3D scene and camera two ways - a full-screen isometric stage via MobiusScreenView, and a fixed-size viewport via ThreeNode - built entirely from already-documented mobius classes.",
      "category": "examples",
      "tags": [
        "example",
        "mobius",
        "ThreeStage",
        "ThreeNode",
        "three.js",
        "3d",
        "webgl"
      ],
      "status": "complete",
      "related": [
        "/api/mobius/scene-and-camera-setup",
        "/api/mobius/three-utils-helpers",
        "/api/mobius/node-wrapping-conventions",
        "/examples/three-js-integration",
        "/api/dot/vector3"
      ],
      "prerequisites": [
        "/examples/three-js-integration",
        "/api/mobius/scene-and-camera-setup"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://github.com/phetsims/mobius"
      ],
      "wordCount": 1029,
      "url": "https://veillette.github.io/Almanach/examples/3d-scene-with-mobius"
    },
    {
      "path": "/examples/chart-driven-simulation-with-bamboo",
      "sourceFile": "docs/examples/chart-driven-simulation-with-bamboo.md",
      "title": "A Chart-Driven Simulation with Bamboo",
      "description": "A worked mini-sim where a model Property drives a live bamboo LinePlot through a ChartTransform, with an accessible description that tracks the trend.",
      "category": "examples",
      "tags": [
        "example",
        "bamboo",
        "ChartTransform",
        "LinePlot",
        "chart"
      ],
      "status": "complete",
      "related": [
        "/api/bamboo/chart-transform",
        "/api/bamboo/line-plot",
        "/api/bamboo/axis-nodes",
        "/api/bamboo/gridlines-and-tick-marks",
        "/accessibility/accessible-descriptions-for-charts-and-graphs",
        "/patterns/model-view-separation"
      ],
      "prerequisites": [
        "/getting-started/your-first-simulation",
        "/api/bamboo/chart-transform"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1050,
      "url": "https://veillette.github.io/Almanach/examples/chart-driven-simulation-with-bamboo"
    },
    {
      "path": "/examples/full-accessible-multi-screen-sim",
      "sourceFile": "docs/examples/full-accessible-multi-screen-sim.md",
      "title": "A Full Accessible Multi-Screen Sim",
      "description": "Threading PDOM, keyboard, and Voicing support through every screen of a multi-screen sim from the first line of code, instead of retrofitting it later.",
      "category": "examples",
      "tags": [
        "example",
        "accessibility",
        "joist",
        "pdom",
        "voicing",
        "multi-screen"
      ],
      "status": "verified",
      "related": [
        "/examples/building-a-two-screen-simulation",
        "/examples/accessible-control-panel-example",
        "/accessibility/pdom",
        "/accessibility/voicing",
        "/accessibility/keyboard-input-and-hotkeys",
        "/accessibility/focus-highlights",
        "/accessibility/describing-dynamic-state",
        "/patterns/multi-screen-sim-structure",
        "/patterns/drag-listeners",
        "/api/joist/screen-view"
      ],
      "prerequisites": [
        "/examples/building-a-two-screen-simulation",
        "/accessibility/pdom"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1384,
      "url": "https://veillette.github.io/Almanach/examples/full-accessible-multi-screen-sim"
    },
    {
      "path": "/examples/game-style-sim-with-vegas-scoring",
      "sourceFile": "docs/examples/game-style-sim-with-vegas-scoring.md",
      "title": "A Game-Style Sim with Vegas Scoring",
      "description": "A worked example combining vegas's LevelSelectionButton, ScoreDisplayNumberAndStar, GameAudioPlayer, and AllLevelsCompletedNode into a minimal level-selection and gameplay screen.",
      "category": "examples",
      "tags": [
        "example",
        "vegas",
        "LevelSelectionButton",
        "ScoreDisplayNumberAndStar",
        "GameAudioPlayer",
        "AllLevelsCompletedNode",
        "game"
      ],
      "status": "complete",
      "related": [
        "/api/vegas/level-selection-button",
        "/api/vegas/score-display-number-and-star",
        "/api/vegas/game-audio-player",
        "/api/vegas/all-levels-completed-node",
        "/patterns/model-view-separation",
        "/patterns/reset-all-pattern"
      ],
      "prerequisites": [
        "/getting-started/your-first-simulation",
        "/api/vegas/level-selection-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 995,
      "url": "https://veillette.github.io/Almanach/examples/game-style-sim-with-vegas-scoring"
    },
    {
      "path": "/examples/phet-io-state-restorable-sim",
      "sourceFile": "docs/examples/phet-io-state-restorable-sim.md",
      "title": "A PhET-iO State-Restorable Sim",
      "description": "A worked example that goes past basic instrumentation to a model whose ENTIRE state - including a runtime-created list of elements via PhetioGroup - can be saved and restored by PhET-iO with no bespoke save/restore code.",
      "category": "examples",
      "tags": [
        "example",
        "tandem",
        "phet-io",
        "PhetioGroup",
        "state",
        "persistence"
      ],
      "status": "complete",
      "related": [
        "/examples/phet-io-instrumented-sim-example",
        "/patterns/state-persistence-and-save-restore-patterns",
        "/guides/phet-io-deep-dive",
        "/patterns/phet-io-instrumentation-pattern",
        "/patterns/reset-all-pattern"
      ],
      "prerequisites": [
        "/examples/phet-io-instrumented-sim-example",
        "/patterns/state-persistence-and-save-restore-patterns"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1131,
      "url": "https://veillette.github.io/Almanach/examples/phet-io-state-restorable-sim"
    },
    {
      "path": "/examples/sim-using-cookbook-recipes-end-to-end",
      "sourceFile": "docs/examples/sim-using-cookbook-recipes-end-to-end.md",
      "title": "A Sim Using Cookbook Recipes End-to-End",
      "description": "A worked mini-scenario combining four cookbook recipes - a bounded draggable, grid snapping, a sound effect on interaction, and a hover tooltip - into one coherent grid-placement tool.",
      "category": "examples",
      "tags": [
        "example",
        "cookbook",
        "DragListener",
        "mapPosition",
        "SoundClip",
        "tooltip"
      ],
      "status": "complete",
      "related": [
        "/cookbook/draggable-node-bounded-to-an-area",
        "/cookbook/snapping-a-draggable-node-to-a-grid",
        "/cookbook/custom-sound-effect-on-interaction",
        "/cookbook/tooltip-style-hover-node",
        "/patterns/drag-listeners",
        "/patterns/model-view-separation"
      ],
      "prerequisites": [
        "/patterns/drag-listeners",
        "/cookbook/draggable-node-bounded-to-an-area"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1070,
      "url": "https://veillette.github.io/Almanach/examples/sim-using-cookbook-recipes-end-to-end"
    },
    {
      "path": "/examples/sound-rich-simulation-with-tambo",
      "sourceFile": "docs/examples/sound-rich-simulation-with-tambo.md",
      "title": "A Sound-Rich Simulation with Tambo",
      "description": "A worked example wiring SoundClip, PitchedPopGenerator, and sharedSoundPlayers to several distinct interaction points in one small sim.",
      "category": "examples",
      "tags": [
        "example",
        "tambo",
        "SoundClip",
        "PitchedPopGenerator",
        "soundManager",
        "sound"
      ],
      "status": "complete",
      "related": [
        "/api/tambo/sound-generation-guide",
        "/api/tambo/sound-clip",
        "/api/tambo/sound-manager",
        "/api/tambo/pitched-pop-generator",
        "/accessibility/sound-design",
        "/patterns/drag-listeners"
      ],
      "prerequisites": [
        "/getting-started/your-first-simulation",
        "/api/tambo/sound-generation-guide"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1054,
      "url": "https://veillette.github.io/Almanach/examples/sound-rich-simulation-with-tambo"
    },
    {
      "path": "/examples/accessible-control-panel-example",
      "sourceFile": "docs/examples/accessible-control-panel-example.md",
      "title": "Accessible Control Panel Example",
      "description": "A fully accessible control panel combining sun components with PDOM.",
      "category": "examples",
      "tags": [
        "example",
        "accessibility",
        "sun"
      ],
      "status": "verified",
      "related": [
        "/accessibility/pdom",
        "/patterns/reset-all-pattern",
        "/patterns/model-view-separation",
        "/api/sun/panel",
        "/api/sun/hslider",
        "/api/sun/checkbox",
        "/api/sun/radio-button-group",
        "/api/scenery-phet/reset-all-button"
      ],
      "prerequisites": [
        "/accessibility/pdom",
        "/api/sun/checkbox"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 800,
      "url": "https://veillette.github.io/Almanach/examples/accessible-control-panel-example"
    },
    {
      "path": "/examples/building-a-two-screen-simulation",
      "sourceFile": "docs/examples/building-a-two-screen-simulation.md",
      "title": "Building a Two-Screen Simulation",
      "description": "Full example wiring two Screens with shared and per-screen model code.",
      "category": "examples",
      "tags": [
        "example",
        "joist",
        "multi-screen"
      ],
      "status": "verified",
      "related": [
        "/getting-started/your-first-simulation",
        "/examples/demo-simulation-walkthrough",
        "/patterns/model-view-separation",
        "/patterns/options-pattern",
        "/api/axon/number-property"
      ],
      "prerequisites": [
        "/getting-started/your-first-simulation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1077,
      "url": "https://veillette.github.io/Almanach/examples/building-a-two-screen-simulation"
    },
    {
      "path": "/examples/demo-simulation-walkthrough",
      "sourceFile": "docs/examples/demo-simulation-walkthrough.md",
      "title": "Demo Simulation Walkthrough",
      "description": "Annotated tour of a minimal end-to-end demo sim.",
      "category": "examples",
      "tags": [
        "example",
        "joist",
        "walkthrough"
      ],
      "status": "verified",
      "related": [
        "/getting-started/your-first-simulation",
        "/patterns/model-view-separation",
        "/patterns/reset-all-pattern",
        "/accessibility/pdom",
        "/api/scenery-phet/reset-all-button",
        "/api/axon/number-property",
        "/api/sun/hslider"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack",
        "/getting-started/your-first-simulation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 742,
      "url": "https://veillette.github.io/Almanach/examples/demo-simulation-walkthrough"
    },
    {
      "path": "/examples/migrating-to-rich-drag-listener",
      "sourceFile": "docs/examples/migrating-to-rich-drag-listener.md",
      "title": "Migrating a Legacy Sim to RichDragListener",
      "description": "A before/after walkthrough of replacing a pointer-only DragListener with RichDragListener to add keyboard dragging without restructuring the model.",
      "category": "examples",
      "tags": [
        "example",
        "scenery",
        "DragListener",
        "RichDragListener",
        "KeyboardDragListener",
        "migration",
        "accessibility"
      ],
      "status": "verified",
      "related": [
        "/patterns/drag-listeners",
        "/api/scenery/rich-drag-listener",
        "/api/scenery/keyboard-drag-listener",
        "/accessibility/alternative-input-overview",
        "/accessibility/pdom",
        "/api/tandem/tandem"
      ],
      "prerequisites": [
        "/patterns/drag-listeners"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1025,
      "url": "https://veillette.github.io/Almanach/examples/migrating-to-rich-drag-listener"
    },
    {
      "path": "/examples/phet-io-instrumented-sim-example",
      "sourceFile": "docs/examples/phet-io-instrumented-sim-example.md",
      "title": "PhET-iO Instrumented Sim Example",
      "description": "A minimal simulation instrumented end-to-end with Tandem.",
      "category": "examples",
      "tags": [
        "example",
        "tandem",
        "phet-io"
      ],
      "status": "verified",
      "related": [
        "/getting-started/your-first-simulation",
        "/examples/demo-simulation-walkthrough",
        "/patterns/reset-all-pattern",
        "/api/axon/number-property",
        "/api/axon/derived-property",
        "/api/sun/checkbox"
      ],
      "prerequisites": [
        "/getting-started/your-first-simulation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1100,
      "url": "https://veillette.github.io/Almanach/examples/phet-io-instrumented-sim-example"
    },
    {
      "path": "/examples/scenery-layout-examples",
      "sourceFile": "docs/examples/scenery-layout-examples.md",
      "title": "Scenery Layout Examples",
      "description": "Worked FlowBox/GridBox layouts for common UI arrangements.",
      "category": "examples",
      "tags": [
        "example",
        "scenery",
        "layout"
      ],
      "status": "verified",
      "related": [
        "/patterns/options-pattern",
        "/accessibility/pdom",
        "/api/sun/panel",
        "/api/sun/hslider",
        "/api/sun/combo-box",
        "/api/scenery-phet/phet-font"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 941,
      "url": "https://veillette.github.io/Almanach/examples/scenery-layout-examples"
    },
    {
      "path": "/examples/standalone-scenery-app-example",
      "sourceFile": "docs/examples/standalone-scenery-app-example.md",
      "title": "Standalone Scenery App Example",
      "description": "Using scenery as a standalone rendering library outside the joist shell.",
      "category": "examples",
      "tags": [
        "example",
        "scenery",
        "standalone"
      ],
      "status": "verified",
      "related": [
        "/patterns/model-view-separation",
        "/patterns/drag-listeners",
        "/patterns/dispose-and-memory-management",
        "/accessibility/pdom",
        "/api/scenery/node"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 581,
      "url": "https://veillette.github.io/Almanach/examples/standalone-scenery-app-example"
    },
    {
      "path": "/examples/three-js-integration",
      "sourceFile": "docs/examples/three-js-integration.md",
      "title": "Three.js Integration",
      "description": "Embedding a Three.js WebGL scene inside a scenery Node.",
      "category": "examples",
      "tags": [
        "example",
        "three.js",
        "webgl"
      ],
      "status": "verified",
      "related": [
        "/getting-started/your-first-simulation",
        "/patterns/model-view-separation",
        "/api/dot/vector2",
        "/api/dot/vector3"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://github.com/phetsims/mobius"
      ],
      "wordCount": 552,
      "url": "https://veillette.github.io/Almanach/examples/three-js-integration"
    },
    {
      "path": "/cookbook/colorblind-safe-palette",
      "sourceFile": "docs/cookbook/colorblind-safe-palette.md",
      "title": "A Colorblind-Safe Palette",
      "description": "Practical guidance and a worked ProfileColorProperty palette that stays distinguishable under common color-vision deficiencies.",
      "category": "cookbook",
      "tags": [
        "scenery",
        "Color",
        "ProfileColorProperty",
        "accessibility",
        "styling"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/color",
        "/styling/color-profiles"
      ],
      "prerequisites": [
        "/styling/color-profiles"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 740,
      "url": "https://veillette.github.io/Almanach/cookbook/colorblind-safe-palette"
    },
    {
      "path": "/cookbook/custom-focus-highlight-shape",
      "sourceFile": "docs/cookbook/custom-focus-highlight-shape.md",
      "title": "A Custom Focus Highlight Shape",
      "description": "Overriding a Node's default rectangular focus highlight with a custom kite Shape via HighlightPath.",
      "category": "cookbook",
      "tags": [
        "scenery",
        "HighlightPath",
        "HighlightFromNode",
        "focus",
        "accessibility",
        "kite",
        "Shape"
      ],
      "status": "complete",
      "related": [
        "/accessibility/focus-highlights",
        "/api/scenery/highlight-rendering",
        "/api/kite/shape"
      ],
      "prerequisites": [
        "/accessibility/focus-highlights"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 590,
      "url": "https://veillette.github.io/Almanach/cookbook/custom-focus-highlight-shape"
    },
    {
      "path": "/cookbook/custom-slider-thumb-and-track",
      "sourceFile": "docs/cookbook/custom-slider-thumb-and-track.md",
      "title": "A Custom Slider Thumb and Track",
      "description": "Replacing HSlider's default thumb/track Nodes with custom artwork via the thumbNode/trackNode options.",
      "category": "cookbook",
      "tags": [
        "sun",
        "HSlider",
        "VSlider",
        "slider"
      ],
      "status": "complete",
      "related": [
        "/api/sun/hslider",
        "/api/sun/v-slider"
      ],
      "prerequisites": [
        "/api/sun/hslider"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 582,
      "url": "https://veillette.github.io/Almanach/cookbook/custom-slider-thumb-and-track"
    },
    {
      "path": "/cookbook/resizable-collapsible-panel",
      "sourceFile": "docs/cookbook/resizable-collapsible-panel.md",
      "title": "A Resizable/Collapsible Panel",
      "description": "Combining AccordionBox and Panel so a control group can be collapsed down to just its title bar.",
      "category": "cookbook",
      "tags": [
        "sun",
        "Panel",
        "AccordionBox",
        "BooleanProperty"
      ],
      "status": "complete",
      "related": [
        "/api/sun/panel",
        "/api/sun/accordion-box",
        "/api/axon/boolean-property"
      ],
      "prerequisites": [
        "/api/sun/panel",
        "/api/sun/accordion-box"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 599,
      "url": "https://veillette.github.io/Almanach/cookbook/resizable-collapsible-panel"
    },
    {
      "path": "/cookbook/simple-score-and-level-selection-screen",
      "sourceFile": "docs/cookbook/simple-score-and-level-selection-screen.md",
      "title": "A Simple Score/Level-Selection Screen",
      "description": "Combining vegas's LevelSelectionButton with a score display into a minimal level-selection screen.",
      "category": "cookbook",
      "tags": [
        "vegas",
        "LevelSelectionButton",
        "ScoreDisplayNumberAndStar",
        "game",
        "HBox"
      ],
      "status": "complete",
      "related": [
        "/api/vegas/level-selection-button",
        "/api/vegas/score-display-number-and-star",
        "/api/vegas/score-display-family",
        "/api/vegas/status-bars",
        "/patterns/multi-screen-sim-structure"
      ],
      "prerequisites": [
        "/api/vegas/level-selection-button"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 638,
      "url": "https://veillette.github.io/Almanach/cookbook/simple-score-and-level-selection-screen"
    },
    {
      "path": "/cookbook/tooltip-style-hover-node",
      "sourceFile": "docs/cookbook/tooltip-style-hover-node.md",
      "title": "A Tooltip-Style Hover Node",
      "description": "Showing and hiding a small info Node on pointer-over using scenery's enter/exit input events.",
      "category": "cookbook",
      "tags": [
        "scenery",
        "Node",
        "input",
        "tooltip"
      ],
      "status": "complete",
      "related": [
        "/guides/scenery-input",
        "/api/scenery/node",
        "/cookbook/detecting-touch-mouse-keyboard-input"
      ],
      "prerequisites": [
        "/guides/scenery-input"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 668,
      "url": "https://veillette.github.io/Almanach/cookbook/tooltip-style-hover-node"
    },
    {
      "path": "/cookbook/custom-sound-effect-on-interaction",
      "sourceFile": "docs/cookbook/custom-sound-effect-on-interaction.md",
      "title": "Adding a Custom Sound Effect on Interaction",
      "description": "Wiring a tambo SoundClip to a button press and to a Property change, registered through soundManager.",
      "category": "cookbook",
      "tags": [
        "tambo",
        "SoundClip",
        "soundManager",
        "sound",
        "RectangularPushButton"
      ],
      "status": "complete",
      "related": [
        "/api/tambo/sound-clip",
        "/api/tambo/sound-manager",
        "/api/sun/rectangular-push-button",
        "/accessibility/sound-design"
      ],
      "prerequisites": [
        "/api/tambo/sound-clip"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 544,
      "url": "https://veillette.github.io/Almanach/cookbook/custom-sound-effect-on-interaction"
    },
    {
      "path": "/cookbook/adding-a-screen-to-an-existing-multi-screen-sim",
      "sourceFile": "docs/cookbook/adding-a-screen-to-an-existing-multi-screen-sim.md",
      "title": "Adding a Screen to an Existing Multi-Screen Sim",
      "description": "The concrete steps to add a new Screen to an existing Sim's screens array, without disturbing the existing screens.",
      "category": "cookbook",
      "tags": [
        "joist",
        "Screen",
        "Sim",
        "ScreenIcon",
        "Tandem"
      ],
      "status": "complete",
      "related": [
        "/patterns/multi-screen-sim-structure",
        "/api/joist/screen",
        "/api/joist/sim",
        "/cookbook/building-a-custom-screen-icon"
      ],
      "prerequisites": [
        "/patterns/multi-screen-sim-structure"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 722,
      "url": "https://veillette.github.io/Almanach/cookbook/adding-a-screen-to-an-existing-multi-screen-sim"
    },
    {
      "path": "/cookbook/animating-a-property-value-on-a-timer",
      "sourceFile": "docs/cookbook/animating-a-property-value-on-a-timer.md",
      "title": "Animating a Property Value on a Timer",
      "description": "Using twixt's Animation to tween a NumberProperty smoothly from one value to another instead of jumping instantly.",
      "category": "cookbook",
      "tags": [
        "twixt",
        "Animation",
        "Easing",
        "NumberProperty"
      ],
      "status": "complete",
      "related": [
        "/api/twixt/animation",
        "/api/axon/number-property"
      ],
      "prerequisites": [
        "/api/twixt/animation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 592,
      "url": "https://veillette.github.io/Almanach/cookbook/animating-a-property-value-on-a-timer"
    },
    {
      "path": "/cookbook/binding-a-bamboo-chart-axis-to-live-data",
      "sourceFile": "docs/cookbook/binding-a-bamboo-chart-axis-to-live-data.md",
      "title": "Binding a Bamboo Chart Axis to Live Model Data",
      "description": "Wiring a bamboo ChartTransform's modelXRange to a model Property so the visible range tracks live, growing data.",
      "category": "cookbook",
      "tags": [
        "bamboo",
        "ChartTransform",
        "LinePlot",
        "NumberProperty",
        "chart"
      ],
      "status": "complete",
      "related": [
        "/api/bamboo/chart-transform",
        "/api/bamboo/line-plot",
        "/api/axon/number-property"
      ],
      "prerequisites": [
        "/api/bamboo/chart-transform"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 703,
      "url": "https://veillette.github.io/Almanach/cookbook/binding-a-bamboo-chart-axis-to-live-data"
    },
    {
      "path": "/cookbook/building-a-custom-screen-icon",
      "sourceFile": "docs/cookbook/building-a-custom-screen-icon.md",
      "title": "Building a Custom ScreenIcon",
      "description": "Composing a Node into a ScreenIcon for use as a Screen's home-screen or navigation-bar icon.",
      "category": "cookbook",
      "tags": [
        "joist",
        "ScreenIcon",
        "Screen",
        "sim"
      ],
      "status": "complete",
      "related": [
        "/api/joist/screen-icon",
        "/api/joist/screen",
        "/styling/iconography-conventions"
      ],
      "prerequisites": [
        "/api/joist/screen-icon"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 610,
      "url": "https://veillette.github.io/Almanach/cookbook/building-a-custom-screen-icon"
    },
    {
      "path": "/cookbook/debugging-a-layout-that-wont-auto-size",
      "sourceFile": "docs/cookbook/debugging-a-layout-that-wont-auto-size.md",
      "title": "Debugging a Layout That Won't Auto-Size",
      "description": "A troubleshooting checklist for FlowBox/GridBox children that refuse to stretch or shrink as expected.",
      "category": "cookbook",
      "tags": [
        "scenery",
        "FlowBox",
        "GridBox",
        "Sizable",
        "layout",
        "layoutOptions",
        "debugging"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/flow-box",
        "/api/scenery/grid-box",
        "/api/scenery/sizable-mixins",
        "/guides/scenery-layout",
        "/guides/advanced-layout-techniques"
      ],
      "prerequisites": [
        "/guides/scenery-layout"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 1031,
      "url": "https://veillette.github.io/Almanach/cookbook/debugging-a-layout-that-wont-auto-size"
    },
    {
      "path": "/cookbook/detecting-touch-mouse-keyboard-input",
      "sourceFile": "docs/cookbook/detecting-touch-mouse-keyboard-input.md",
      "title": "Detecting Touch vs. Mouse vs. Keyboard Input",
      "description": "Branching interaction behavior on the input modality using a SceneryEvent's Pointer type or type-specific listener callbacks.",
      "category": "cookbook",
      "tags": [
        "scenery",
        "Pointer",
        "SceneryEvent",
        "Mouse",
        "Touch",
        "input"
      ],
      "status": "complete",
      "related": [
        "/guides/scenery-input",
        "/accessibility/alternative-input-overview",
        "/api/scenery/pointer-mouse-touch-pen",
        "/api/scenery/scenery-event"
      ],
      "prerequisites": [
        "/guides/scenery-input"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 630,
      "url": "https://veillette.github.io/Almanach/cookbook/detecting-touch-mouse-keyboard-input"
    },
    {
      "path": "/cookbook/fuzz-testing-a-simulation-locally",
      "sourceFile": "docs/cookbook/fuzz-testing-a-simulation-locally.md",
      "title": "Fuzz-Testing a Simulation Locally",
      "description": "Using the ?fuzz query parameter (and its variants) during local development to catch input-handling bugs before release.",
      "category": "cookbook",
      "tags": [
        "query-parameters",
        "fuzz",
        "testing",
        "qa"
      ],
      "status": "verified",
      "related": [
        "/patterns/query-parameters-pattern",
        "/guides/testing-and-qa-strategy-overview",
        "/guides/continuous-integration-for-scenerystack-projects"
      ],
      "prerequisites": [
        "/patterns/query-parameters-pattern"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 655,
      "url": "https://veillette.github.io/Almanach/cookbook/fuzz-testing-a-simulation-locally"
    },
    {
      "path": "/cookbook/keyboard-shortcuts-on-a-custom-node",
      "sourceFile": "docs/cookbook/keyboard-shortcuts-on-a-custom-node.md",
      "title": "Keyboard Shortcuts on a Custom Node",
      "description": "Attaching a KeyboardListener to a focusable custom Node to add a hotkey beyond dragging.",
      "category": "cookbook",
      "tags": [
        "scenery",
        "KeyboardListener",
        "keyboard",
        "accessibility",
        "hotkey"
      ],
      "status": "complete",
      "related": [
        "/api/scenery/keyboard-listener",
        "/accessibility/keyboard-input-and-hotkeys",
        "/accessibility/alternative-input-overview"
      ],
      "prerequisites": [
        "/api/scenery/keyboard-listener"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 599,
      "url": "https://veillette.github.io/Almanach/cookbook/keyboard-shortcuts-on-a-custom-node"
    },
    {
      "path": "/cookbook/lazily-creating-an-expensive-node",
      "sourceFile": "docs/cookbook/lazily-creating-an-expensive-node.md",
      "title": "Lazily Creating an Expensive Node",
      "description": "Deferring construction of a costly child Node until it's first needed, instead of building it eagerly at startup.",
      "category": "cookbook",
      "tags": [
        "scenery",
        "Node",
        "dispose",
        "lazy-initialization"
      ],
      "status": "complete",
      "related": [
        "/patterns/dispose-and-memory-management",
        "/patterns/composing-view-nodes",
        "/api/scenery/node"
      ],
      "prerequisites": [
        "/patterns/dispose-and-memory-management"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 702,
      "url": "https://veillette.github.io/Almanach/cookbook/lazily-creating-an-expensive-node"
    },
    {
      "path": "/cookbook/draggable-node-bounded-to-an-area",
      "sourceFile": "docs/cookbook/draggable-node-bounded-to-an-area.md",
      "title": "Making Any Node Draggable and Bounded to an Area",
      "description": "Attaching a DragListener to a Node so it writes a model positionProperty, clamped to a region with dragBoundsProperty.",
      "category": "cookbook",
      "tags": [
        "scenery",
        "DragListener",
        "dragBoundsProperty",
        "drag",
        "Bounds2"
      ],
      "status": "complete",
      "related": [
        "/patterns/drag-listeners",
        "/api/scenery/drag-listener",
        "/api/dot/bounds2",
        "/patterns/model-view-separation"
      ],
      "prerequisites": [
        "/patterns/model-view-separation"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 630,
      "url": "https://veillette.github.io/Almanach/cookbook/draggable-node-bounded-to-an-area"
    },
    {
      "path": "/cookbook/placeholder-values-in-a-translated-string",
      "sourceFile": "docs/cookbook/placeholder-values-in-a-translated-string.md",
      "title": "Placeholder Values in a Translated String",
      "description": "Using PatternStringProperty to build \"{{count}} items\"-style strings that stay translatable and update reactively.",
      "category": "cookbook",
      "tags": [
        "axon",
        "PatternStringProperty",
        "DerivedProperty",
        "i18n",
        "strings"
      ],
      "status": "complete",
      "related": [
        "/api/axon/pattern-string-property",
        "/guides/internationalization-deep-dive"
      ],
      "prerequisites": [
        "/api/axon/pattern-string-property"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 689,
      "url": "https://veillette.github.io/Almanach/cookbook/placeholder-values-in-a-translated-string"
    },
    {
      "path": "/cookbook/snapping-a-draggable-node-to-a-grid",
      "sourceFile": "docs/cookbook/snapping-a-draggable-node-to-a-grid.md",
      "title": "Snapping a Draggable Node to a Grid",
      "description": "Using DragListener's mapPosition hook to round a dragged position onto fixed grid cells.",
      "category": "cookbook",
      "tags": [
        "scenery",
        "DragListener",
        "mapPosition",
        "drag",
        "dot",
        "roundToInterval"
      ],
      "status": "complete",
      "related": [
        "/patterns/drag-listeners",
        "/api/scenery/drag-listener",
        "/api/dot/dot-utils",
        "/api/dot/vector2",
        "/cookbook/draggable-node-bounded-to-an-area"
      ],
      "prerequisites": [
        "/patterns/drag-listeners"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 562,
      "url": "https://veillette.github.io/Almanach/cookbook/snapping-a-draggable-node-to-a-grid"
    },
    {
      "path": "/cookbook/wiring-a-new-phet-io-instrumented-control",
      "sourceFile": "docs/cookbook/wiring-a-new-phet-io-instrumented-control.md",
      "title": "Wiring Up a New PhET-iO Instrumented Control",
      "description": "Giving a new UI control a Tandem (and, if needed, an IOType) so it shows up correctly in PhET-iO state.",
      "category": "cookbook",
      "tags": [
        "tandem",
        "phet-io",
        "Tandem",
        "IOType",
        "Checkbox"
      ],
      "status": "complete",
      "related": [
        "/api/tandem/tandem",
        "/api/tandem/io-type",
        "/patterns/phet-io-instrumentation-pattern"
      ],
      "prerequisites": [
        "/patterns/phet-io-instrumentation-pattern"
      ],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack"
      ],
      "wordCount": 712,
      "url": "https://veillette.github.io/Almanach/cookbook/wiring-a-new-phet-io-instrumented-control"
    },
    {
      "path": "/meta/authoring-guide",
      "sourceFile": "docs/meta/authoring-guide.md",
      "title": "Authoring Guide",
      "description": "Conventions for adding documents to Almanach - folder taxonomy, required frontmatter schema, and how the generated indexes work.",
      "category": "meta",
      "tags": [
        "conventions",
        "frontmatter",
        "contributing"
      ],
      "status": "complete",
      "related": [
        "/meta/roadmap",
        "/meta/page-template",
        "/meta/scenerystack-version-compatibility"
      ],
      "prerequisites": [],
      "sourceRefs": [],
      "wordCount": 1246,
      "url": "https://veillette.github.io/Almanach/meta/authoring-guide"
    },
    {
      "path": "/meta/faq",
      "sourceFile": "docs/meta/faq.md",
      "title": "FAQ",
      "description": "Answers to the questions a newcomer to Almanach or to SceneryStack itself would plausibly ask first.",
      "category": "meta",
      "tags": [
        "faq",
        "conventions",
        "contributing"
      ],
      "status": "complete",
      "related": [
        "/meta/glossary",
        "/meta/roadmap",
        "/meta/authoring-guide",
        "/meta/page-template",
        "/getting-started/what-is-scenerystack"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [],
      "wordCount": 964,
      "url": "https://veillette.github.io/Almanach/meta/faq"
    },
    {
      "path": "/meta/glossary",
      "sourceFile": "docs/meta/glossary.md",
      "title": "Glossary",
      "description": "Alphabetical definitions of SceneryStack and PhET-specific terms used throughout Almanach, each linked to the page that covers it in depth.",
      "category": "meta",
      "tags": [
        "glossary",
        "reference",
        "terminology",
        "conventions"
      ],
      "status": "complete",
      "related": [
        "/meta/faq",
        "/meta/authoring-guide",
        "/meta/page-template",
        "/getting-started/what-is-scenerystack"
      ],
      "prerequisites": [
        "/getting-started/what-is-scenerystack"
      ],
      "sourceRefs": [],
      "wordCount": 1022,
      "url": "https://veillette.github.io/Almanach/meta/glossary"
    },
    {
      "path": "/meta/page-template",
      "sourceFile": "docs/meta/page-template.md",
      "title": "Page Template",
      "description": "A copy-pasteable frontmatter and section skeleton for authors starting a new page.",
      "category": "meta",
      "tags": [
        "template",
        "contributing",
        "conventions"
      ],
      "status": "complete",
      "related": [
        "/meta/authoring-guide",
        "/meta/roadmap",
        "/meta/faq"
      ],
      "prerequisites": [
        "/meta/authoring-guide"
      ],
      "sourceRefs": [],
      "wordCount": 325,
      "url": "https://veillette.github.io/Almanach/meta/page-template"
    },
    {
      "path": "/meta/roadmap",
      "sourceFile": "docs/meta/roadmap.md",
      "title": "Roadmap",
      "description": "What Almanach currently covers, the taxonomy behind that coverage, and the concrete work that remains open.",
      "category": "meta",
      "tags": [
        "roadmap",
        "planning",
        "contributing",
        "conventions"
      ],
      "status": "complete",
      "related": [
        "/meta/authoring-guide",
        "/meta/page-template",
        "/meta/scenerystack-version-compatibility"
      ],
      "prerequisites": [],
      "sourceRefs": [],
      "wordCount": 737,
      "url": "https://veillette.github.io/Almanach/meta/roadmap"
    },
    {
      "path": "/meta/scenerystack-version-compatibility",
      "sourceFile": "docs/meta/scenerystack-version-compatibility.md",
      "title": "SceneryStack Version Compatibility Notes",
      "description": "Which scenerystack package version Almanach's content was checked against, and when a page's status/sourceRefs should be revisited as SceneryStack releases new versions.",
      "category": "meta",
      "tags": [
        "conventions",
        "versioning",
        "sourceRefs",
        "contributing"
      ],
      "status": "complete",
      "related": [
        "/meta/roadmap",
        "/meta/authoring-guide",
        "/meta/faq"
      ],
      "prerequisites": [],
      "sourceRefs": [
        "https://www.npmjs.com/package/scenerystack",
        "https://scenerystack.org/reference/"
      ],
      "wordCount": 623,
      "url": "https://veillette.github.io/Almanach/meta/scenerystack-version-compatibility"
    }
  ]
}
