From b4ead828e6322a0f26a81f335920ac56de5041cb Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Tue, 29 Jul 2025 17:19:14 -0400
Subject: [PATCH 01/20] Split into a multi page site using Vitepress
Fixes #2, and is a continuation of pull request #3. Vitepress has now been set up, but only a couple major sections have been split so far. Much more is to come.
---
.gitignore | 4 +-
.vitepress/api-examples.md | 49 +++
.vitepress/config.mts | 51 +++
.vitepress/markdown-examples.md | 85 ++++
README.md | 703 +-------------------------------
concepts/index.md | 545 +++++++++++++++++++++++++
index.md | 208 ++++++++++
intro/index.md | 70 ++++
package.json | 7 +
9 files changed, 1024 insertions(+), 698 deletions(-)
create mode 100644 .vitepress/api-examples.md
create mode 100644 .vitepress/config.mts
create mode 100644 .vitepress/markdown-examples.md
create mode 100644 concepts/index.md
create mode 100644 index.md
create mode 100644 intro/index.md
create mode 100644 package.json
diff --git a/.gitignore b/.gitignore
index 496ee2c..2c167a1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
-.DS_Store
\ No newline at end of file
+.DS_Store
+.vitepress/dist
+.vitepress/cache
\ No newline at end of file
diff --git a/.vitepress/api-examples.md b/.vitepress/api-examples.md
new file mode 100644
index 0000000..6bd8bb5
--- /dev/null
+++ b/.vitepress/api-examples.md
@@ -0,0 +1,49 @@
+---
+outline: deep
+---
+
+# Runtime API Examples
+
+This page demonstrates usage of some of the runtime APIs provided by VitePress.
+
+The main `useData()` API can be used to access site, theme, and page data for the current page. It works in both `.md` and `.vue` files:
+
+```md
+
+
+## Results
+
+### Theme Data
+
{{ theme }}
+
+### Page Data
+{{ page }}
+
+### Page Frontmatter
+{{ frontmatter }}
+```
+
+
+
+## Results
+
+### Theme Data
+{{ theme }}
+
+### Page Data
+{{ page }}
+
+### Page Frontmatter
+{{ frontmatter }}
+
+## More
+
+Check out the documentation for the [full list of runtime APIs](https://vitepress.dev/reference/runtime-api#usedata).
diff --git a/.vitepress/config.mts b/.vitepress/config.mts
new file mode 100644
index 0000000..e5737a3
--- /dev/null
+++ b/.vitepress/config.mts
@@ -0,0 +1,51 @@
+import { defineConfig } from 'vitepress'
+
+// https://vitepress.dev/reference/site-config
+export default defineConfig({
+ title: "Scratch Specification",
+
+ themeConfig: {
+ // https://vitepress.dev/reference/default-theme-config
+ nav: [
+ { text: 'Home', link: '/' },
+ { text: 'Intro', link: '/intro/' },
+ { text: 'Concepts', link: '/concepts/' },
+ { text: 'Runtime', link: '/runtime/' },
+ { text: 'Blocks', link: '/palette/' },
+ { text: 'Files', link: '/files/' },
+ { text: 'I/O', link: '/io/' },
+ { text: 'Network', link: '/network/' },
+ { text: 'Devices', link: '/devices/' }
+ ],
+
+ sidebar: [
+ {
+ text: 'Introduction',
+ link: '/intro/',
+ items: [
+ { text: 'Frequently Asked Questions', link: '/intro/#faq' },
+ { text: 'Contributing Guidelines', link: '/intro/#contributing' }
+ ]
+ },
+ {
+ text: 'Concepts',
+ link: '/concepts/',
+ items: [
+ { text: 'Capabilities', link: '/concepts/#capabilities' },
+ { text: 'Constants', link: '/concepts/#constants' },
+ { text: 'Ideas', link: '/concepts/#ideas' },
+ { text: 'Values', link: '/concepts/#values' },
+ { text: 'Procedures', link: '/concepts/#procedures' }
+ ]
+ },
+ ],
+
+ socialLinks: [
+ { icon: 'github', link: 'https://github.com/OceanIsEndless/scratch-spec' }
+ ],
+
+ search: {
+ provider: 'local'
+ }
+ }
+})
diff --git a/.vitepress/markdown-examples.md b/.vitepress/markdown-examples.md
new file mode 100644
index 0000000..f9258a5
--- /dev/null
+++ b/.vitepress/markdown-examples.md
@@ -0,0 +1,85 @@
+# Markdown Extension Examples
+
+This page demonstrates some of the built-in markdown extensions provided by VitePress.
+
+## Syntax Highlighting
+
+VitePress provides Syntax Highlighting powered by [Shiki](https://github.com/shikijs/shiki), with additional features like line-highlighting:
+
+**Input**
+
+````md
+```js{4}
+export default {
+ data () {
+ return {
+ msg: 'Highlighted!'
+ }
+ }
+}
+```
+````
+
+**Output**
+
+```js{4}
+export default {
+ data () {
+ return {
+ msg: 'Highlighted!'
+ }
+ }
+}
+```
+
+## Custom Containers
+
+**Input**
+
+```md
+::: info
+This is an info box.
+:::
+
+::: tip
+This is a tip.
+:::
+
+::: warning
+This is a warning.
+:::
+
+::: danger
+This is a dangerous warning.
+:::
+
+::: details
+This is a details block.
+:::
+```
+
+**Output**
+
+::: info
+This is an info box.
+:::
+
+::: tip
+This is a tip.
+:::
+
+::: warning
+This is a warning.
+:::
+
+::: danger
+This is a dangerous warning.
+:::
+
+::: details
+This is a details block.
+:::
+
+## More
+
+Check out the documentation for the [full list of markdown extensions](https://vitepress.dev/guide/markdown).
diff --git a/README.md b/README.md
index 5dafcfb..a3697a0 100644
--- a/README.md
+++ b/README.md
@@ -2,95 +2,18 @@
A detailed explanation of how Scratch 3.0 works as a programming language.
+> [!IMPORTANT]
+> **Changes are underway!**
+>
+> This spec is being transitioned over to Vitepress. Parts of it have already been copied over and deleted from here. It will no longer be included in the README. To view it, you'll have to go to the much better [published page](https://oceanisendless.github.io/scratch-spec/). See ya there!
+>
+
## Contents
* [Scratch Specification](#scratch-specification)
* [Contents](#contents)
- * [Introduction](#introduction)
- * [Preliminaries](#preliminaries)
- * [Sources](#sources)
- * [Contributing](#contributing)
- * [FAQ](#faq)
- * [Where to start?](#where-to-start)
- * [What's the point?](#whats-the-point)
- * [Why?](#why)
* [TODO](#todo)
* [TODO: Blocks](#todo-blocks)
- * [Concepts](#concepts)
- * [Capabilities](#capabilities)
- * [Constants](#constants)
- * [Stage Bounds](#stage-bounds)
- * [Stage Width](#stage-width)
- * [Stage Height](#stage-height)
- * [Left Edge](#left-edge)
- * [Right Edge](#right-edge)
- * [Top Edge](#top-edge)
- * [Bottom Edge](#bottom-edge)
- * [Limits](#limits)
- * [Max Items](#max-items)
- * [Max Clones](#max-clones)
- * [Ideas](#ideas)
- * [Asset](#asset)
- * [Costume](#costume)
- * [Sound](#sound)
- * [Block](#block)
- * [Standard Blocks](#standard-blocks)
- * [Hidden Blocks](#hidden-blocks)
- * [Clone](#clone)
- * [Edge](#edge)
- * [Flag](#flag)
- * [JavaScript](#javascript)
- * [List](#list)
- * [Mod](#mod)
- * [Opcode](#opcode)
- * [Project](#project)
- * [Runtime](#runtime)
- * [Script](#script)
- * [Sprite](#sprite)
- * [Stage](#stage)
- * [Target](#target)
- * [User](#user)
- * [Variable](#variable)
- * [Values](#values)
- * [Value](#value)
- * [Angle](#angle)
- * [Answer](#answer)
- * [Boolean](#boolean)
- * [True](#true)
- * [False](#false)
- * [Direction](#direction)
- * [Integer](#integer)
- * [Item](#item)
- * [Key](#key)
- * [Length](#length)
- * [Letter](#letter)
- * [Name](#name)
- * [Number](#number)
- * [Infinity](#infinity)
- * [-Infinity](#-infinity)
- * [NaN](#nan)
- * [Rotation Style](#rotation-style)
- * [Rotation Style: All Around](#rotation-style-all-around)
- * [Rotation Style: Left-Right](#rotation-style-left-right)
- * [Rotation Style: Don't Rotate](#rotation-style-dont-rotate)
- * [String](#string)
- * [Empty String](#empty-string)
- * [Undefined](#undefined)
- * [Username](#username)
- * [X Position](#x-position)
- * [Y Position](#y-position)
- * [Other Values](#other-values)
- * [Procedures](#procedures)
- * [Casting](#casting)
- * [To String](#to-string)
- * [To Number](#to-number)
- * [To Boolean](#to-boolean)
- * [Falsy](#falsy)
- * [Truthy](#truthy)
- * [To Direction](#to-direction)
- * [Fencing](#fencing)
- * [Fencing Position](#fencing-position)
- * [Fencing Size](#fencing-size)
* [Palette](#palette)
* [Example block](#example-block)
* [Motion blocks](#motion-blocks)
@@ -157,76 +80,6 @@ A detailed explanation of how Scratch 3.0 works as a programming language.
* [Unsandboxed](#unsandboxed)
* [Adding Platforms](#adding-platforms)
-## Introduction
-
-This document is a serious attempt to create a [programming language specification](https://en.wikipedia.org/wiki/Programming_language_specification) of [Scratch 3.0](https://en.scratch-wiki.info/wiki/scratch_3.0). It will detail the exact behavior of Scratch so that it can be accurately reproducible from this document alone, preserving its behavior and aiding in [ports](https://en.wikipedia.org/wiki/Porting) of it to other platforms. This project is entirely "for fun" (note the quotation marks) and is not affilated with the [Scratch Foundation](https://www.scratchfoundation.org/) or related parties in any way whatsoever, though please [donate](https://www.scratchfoundation.org/donate) to them if you can so that they may continue to support and improve [Scratch](https://scratch.mit.edu/) for all.
-
-### Preliminaries
-
-Before reading this specification:
-
-* **Be sure to have an understanding of computer science.** A good vocabulary, knowledge, and understanding of computational concepts is useful.
-* **Being experienced with working in Scratch is immensely helpful.** Although this specification will try to explain it in full, knowing the basic concepts and quirks of Scratch just by experience will let you skim through this document easily, as not all of it is necessary to read; just to reference for accuracy.
-* Scratch 3.0 is built upon the modern web; although not entirely necessary, **a basic knowledge of [JavaScript](https://en.wikipedia.org/wiki/JavaScript) can come in handy** when it comes to understanding the inner workings, logic, and rules of Scratch, as it is what Scratch runs on. Scratch does a lot of things the same way JavaScript does.
-* **Be familiar with the [scratchblocks](https://scratchblocks.github.io/) [syntax](https://en.scratch-wiki.info/wiki/Block_Plugin/Syntax).** This text-based format is used to represent Scratch [blocks](#block). An option to render the scratchblocks while viewing in-browser is being considered; however, the shapes and colors of the blocks are not necessarily being documented here, but rather their functionality.
-
-### Sources
-
-The information about Scratch in this specification is, of course, derived from Scratch sources, e.g. the Scratch [VM](https://github.com/scratchfoundation/scratch-vm), [Wiki](https://scratch-wiki.info/), [Website](https://scratch.mit.edu/), [Editor](https://scratch.mit.edu/projects/editor), and [Discussion Forums](https://scratch.mit.edu/discuss/). [Wikipedia](https://wikipedia.org/wiki/Wikipedia:About) and [MDN Web Docs](https://developer.mozilla.org/) are linked to as well for additional information regarding general concepts and internal behaviors.
-
-### Contributing
-
-Please [contribute on GitHub](https://github.com/OceanIsEndless/scratch-spec/pulls) (must be **13** or older, [need a GitHub account](https://github.com/signup)) or [comment on my Scratch profile](https://scratch.mit.edu/users/Endless-Ocean/#comments) (just [need a Scratch account](https://scratch.mit.edu/join)) if you can:
-
-* **Summarize** key **points** of sections (things can get *ridiculously wordy* at times)
-* **Provide insight** into the workings of Scratch (know info that should be here)
-* **Fact check** info to verify accuracy (add links to projects, code, wiki, forums)
-* Make sure everything looks good (**correct formatting, spelling, grammar**)
-* **Give** some **ideas**, **motivation**, or **feedback** for improving this specification
-
-### FAQ
-
-*Questions that would be frequently asked if someone were to ask them.*
-
-#### Where to start?
-
-* If you want a **general understanding** of Scratch's inner workings for whatever reason, find whatever interests you in the [table of contents](#contents) and just gloss over whatever you don't need to know.
-* If you want **formal definitions** of Scratch terms, see [concepts](#concepts).
-* If you want to accurately **recreate blocks**, see the [palette](#palette).
-
-TODO: Threading and execution behavior will be documented soon!
-
-* If you want to learn about project files, see [file format](#file-format).
-* If you want to recreate old blocks, see [obsolete blocks](#obsolete-blocks).
-* If you want more blocks, see [nonstandard blocks](#nonstandard-blocks).
-
-#### What's the point?
-
-This specification exists to document the behavior of Scratch 3.0 as a programming language. It can open the door to:
-
-* **Accurately porting Scratch to run natively on other platforms**
- * It could help efforts to make Scratch available on platforms that aren't web-based (if any).
- * @OceanIsEndless, the initial creator of this specification, has a lot of wild ideas on their mind regarding Scratch. Their ideas are likely not at all worth their time, but writing this spec will allow them to try doing interesting things such as creating a Scratch to [Desmos](https://www.desmos.com/calculator) packager, or porting Scratch to the [Wii](https://en.wikipedia.org/wiki/Wii). A bit ambitious, yes, and absolutely crazy—but a specification like this could aid projects like these and more. It can help ensure compatibility and easy coding.
- * It could help this super cool rapidly-developing [3DS port](https://github.com/NateXS/Scratch-3DS), though the spec may not be done before contributors over there figure out how Scratch works for themselves anyway. :)
-* **Recreating parts of Scratch (blocks, scripts) for demonstration**
- * For educational reasons, one might want to recreate the behavior of certain parts of Scratch without the full force of the Scratch editor on hand. This spec will eventually provide information ranging from exact block behaviors to full-on runtime execution, making understanding the way each part of Scratch works simple.
-* **Improving Scratch in the future while keeping it 100% compatible**
- * It isn't known if this spec will reach a state that the developers of Scratch could use as reference, but if so, it could help ensure that Scratch projects remain functionally the same after code rewrites.
-* **Directly citing the workings of Scratch without linking wikis or code**
- * Although the [Scratch Wiki](https://scratch-wiki.info/) and code of Scratch work well for showing Scratch concepts and runtime behavior, one of them tends to abstract away particular functionalities while the other offers thousands of lines of pure [JavaScript](#javascript). This specification is meant to serve as one clear and concise document explaining the behaviors, blocks, and quirks of Scratch 3.0 in all its blocky glory.
-* **Reimplementing Scratch 3.0 in case of catastrophe**
- * This kind of blends together all of the previous points. If the Scratch editor were to magically disappear or break entirely (it won't, but in theory), then the Scratch Wiki could guide you in making a fairly accurate reimplementation of Scratch, but would fall short in exactly reproducing the runtime behavior, procedures, and quirks of Scratch, from scratch (literally). Although the wiki strives to be all-encompassing (and it is indeed very far-reaching), a document solely dedicated to the functionality of Scratch will help preserve its literal, programmatic behavior in one organized doc.
-* **"Real" programming languages have them.**
- * [Scratch is cool](https://blob.codes/scratch-is-cool/). It is [Turing-complete](https://en.wikipedia.org/wiki/Turing_completeness). Lots of languages far less significant than Scratch have [programming language specifications](https://en.wikipedia.org/wiki/Programming_language_specification). And yet Scratch lacks one. The Scratch Wiki helps document the **ideas** of Scratch, but a singular document dedicated to specifying *exactly* all that Scratch does could help it secure official programming language status.
-* **Who knows what?**
- * If this spec is made reliable enough, it could be cited (or at least, the underlying sources that it will eventually reference for verifability) in the underdeveloped [Wikipedia page about Scratch ***as a programming language***](https://en.wikipedia.org/wiki/Scratch_(programming_language)).
-
-It could be argued that this specification is reinventing the wheel in some ways. However, if it is ever completed, it could serve as a great resource for Scratch 3.0.
-
-#### Why?
-
-Why not?
-
## TODO
> This spec is a work in progress; it's nowhere near complete. **Please [contribute](#contributing) if you can!** Anywhere that says TODO is something that needs to be worked on, as well as any sections that are empty or missing.
@@ -303,550 +156,6 @@ Below is a list of blocks that have been or still need to be documented here. (F
-## Concepts
-
-This section explains the various concepts and rules of Scratch.
-
-### Capabilities
-
-At its core, Scratch should be able to:
-
-* **Change values** in a [runtime](#runtime)
-* **Run scripts** [single-threaded](https://en.wikipedia.org/wiki/Cooperative_multitasking)
-* **Play sounds** using speakers
-* **Show images** and graphics
-
-In a fully functional environment, Scratch can access:
-
-* A **keyboard** (detect keys the user presses)
-* A **mouse** (read its position and button state)
-* A **microphone** (gauge surrounding loudness)
-* A **clock** (get local and UTC time in milliseconds)
-* **Wi-Fi** (make network requests to external servers)
-* **Bluetooth** (connect to supported hardware)
-* A **webcam** (sense motion in a direction)
-
-If one or more of these things is unavailable, Scratch handles it gracefully.
-
-### Constants
-
-These constant values will show up a lot throughout this specification. They can be changed to one's liking, however for true accuracy to Scratch, they should all have their "**Standard Scratch**:" values.
-
-#### Stage Bounds
-
-##### Stage Width
-
-The horizontal size of the stage. This is an arbitrary positive [integer](#integer).
-
-**Standard Scratch**: `480`
-
-**Widescreen** (via unofficial modification): `640`
-
-##### Stage Height
-
-The vertical size of the stage. This is an arbitrary positive [integer](#integer).
-
-**Standard Scratch**: `360`
-
-##### Left Edge
-
-The horizontal position of the left edge. This is derived from the [stage width](#stage-width).
-
-**Formula**: `stage width / -2`
-
-**Standard Scratch**: `-240`
-
-##### Right Edge
-
-The horizontal position of the right edge. This is derived from the [stage width](#stage-width).
-
-**Formula**: `stage width / 2`
-
-**Standard Scratch**: `240`
-
-##### Top Edge
-
-The vertical position of the top edge. This is derived from the [stage height](#stage-height).
-
-**Formula**: `stage height / 2`
-
-**Standard Scratch**: `180`
-
-##### Bottom Edge
-
-The vertical position of the bottom edge. This is derived from the [stage height](#stage-height).
-
-**Formula**: `stage height / -2`
-
-**Standard Scratch**: `-180`
-
-#### Limits
-
-##### Max Items
-
-The maximum [length](#length) of a [list](#list), aka the most items that one list can hold. This limit is imposed to prevent excessive memory usage by [projects](#project). This is an arbitrary positive [integer](#integer).
-
-**Standard Scratch**: `200000`
-
-**Modified Scratch**: None (many Scratch mods do not enforce this limit, though memory overflow may eventually occur)
-
-##### Max Clones
-
-The maximum number of [clones](#clone) that can exist at one time. If this limit is reached, another clone cannot be created until one is deleted. This limit is imposed to prevent excessive memory usage by [projects](#project). This is an arbitrary positive [integer](#integer).
-
-**Standard Scratch**: `300`
-
-**Modified Scratch**: None (many Scratch mods do not enforce this limit, though memory overflow may eventually occur)
-
-### Ideas
-
-The following ideas are referenced throughout this specification:
-
-#### Asset
-
-A [costume](#costume) or [sound](#sound).
-
-##### Costume
-
-A costume is an [image file](https://en.wikipedia.org/wiki/Digital_image) and a type of [asset](#asset) that can be graphically rendered to represent a [target](#target). It can be identified by its [name](#name) or [number](#integer). Costumes can either be [bitmap](https://en.wikipedia.org/wiki/Raster_graphics) or [vector](https://en.wikipedia.org/wiki/Vector_graphics).
-
-##### Sound
-
-A sound is an [audio file](https://en.wikipedia.org/wiki/Digital_audio) and a type of [asset](#asset) that can be audibly played to the user via [blocks](#block). It can be identified by its [name](#name).
-
-#### Block
-
-> This will have to be better explained and added to the nonexistent section for script execution.
-
-The fundamental component of Scratch as a programming language. In fact, it is similar to a function call in other programming languages. Every block:
-
-* Accepts values or blocks as arguments
-* Has a specific pre-defined operation that it performs
-* Can be run and reports (i.e. outputs, returns) a single value (or [none at all](#undefined))
-
-Blocks can be run, meaning that its operation is performed using the arguments it is given and the value resulting from the operation is reported, if any. When put together, blocks create [scripts](#script).
-
-##### Standard Blocks
-
-[Blocks](#block) that are officially supported in Scratch 3.0. They are the most commonly used blocks in [scripts](#script).
-
-##### Hidden Blocks
-
-[Blocks](#block) that exist in Scratch 3.0 but are not actively supported or used on their own, either being kept for compatibility with projects created in older versions of Scratch or being used internally. Some are functional, some are not. [Scripts](#script) may use them on occasion, but they are found less often than [standard blocks](#standard-blocks) due to their obscurity.
-
-#### Clone
-
-A copy created of a [sprite](#sprite) that has all of the original sprite's code, images, and sounds, but operates independently of it. Unlike sprites, clones cannot be directly referenced via existing blocks (e.g. you cannot [glide to](#glide-to-block) it directly without knowing its position ahead of time, as it cannot be selected in the sprite dropdown menu), and exist as their own thing. They are deleted every time the [flag](#flag) is clicked, and can also be deleted manually using the [`delete this clone` block](#delete-clone-block).
-
-Clones can be created with the [create clone block](#create-clone-block) so long as the [maximum number of clones](#max-clones) has not been reached. Code can be written specifically for the clones of a sprite via the use of the [when I start as a clone block](#when-i-start-as-a-clone-block). The [stage](#stage) is the [target](#target) which cannot be cloned, whereas both sprites *and clones* can themselves be cloned.
-
-#### Edge
-
-> The usefulness of defining "Edge" is up for debate. It may be best left to the section about [fencing](#fencing). Feel free to offer insight!
-
-A boundary around the viewing area of the [stage](#stage) that restricts the [costume](#costume) of a [sprite](#sprite) from going off-screen.
-
-#### Flag
-
-> The usefulness of defining "Flag" is up for debate. Feel free to offer insight!
-
-The button that is clicked to start a project. It is also known as the green flag. In simple terms, it makes the project `Go`. When clicked, it runs any scripts placed under [when flag clicked blocks](#when-flag-clicked-block).
-
-#### JavaScript
-
-> Definitions for general terms indirectly related to Scratch may be put into their own section instead, however this is up for debate. Feel free to offer insight!
-
-The programming language that Scratch 3.0 runs in. The logic it uses is largely similar to the logic Scratch uses due to Scratch's dependence on JavaScript for performing operations and manipulating values. In fact, this is where the type of value [undefined](#undefined) is taken from; it is a type of value in JavaScript for representing what is not defined or known. Thanks to the quirks of Scratch and [no-op hidden reporter blocks](#hidden-blocks), we can obtain this type of value.
-
-#### List
-
-A series of [items](#item) stored together in sequence. Each item is referenced by its numerical index (aka item #), a positive [integer](#integer) ranging from `1` to the [length](#length) of the list (inclusive). Lists can be empty, meaning that they have a length of `0` and contain no items. There is also a [maximum number of items](#max-items) that a list can hold, aka a limit to its length.
-
-#### Mod
-
-A modification (altered version) of the Scratch 3.0 [runtime](#runtime) that is nonstandard and may introduce new blocks, features, or changes not present in standard Scratch. The majority of this spec will be documenting standard Scratch behavior. For information on nonstandard blocks and behaviors in mods, see the [relevant appendix](#nonstandard-blocks).
-
-#### Opcode
-
-A [name](#name) unique to every [block](#block) in the Scratch programming language. It tells blocks what to do. For example, if the opcode of a block is [`motion_movesteps`](#motion_movesteps), it attempts to move steps.
-
-#### Project
-
-A [stage](#stage) and optionally some [sprites](#sprite) packaged together to do something. They can be loaded into a [runtime](#runtime) and executed. They can also be saved as [project files](#file-format).
-
-#### Runtime
-
-The environment in which a [project](#project) is run. It keeps track of the project's current state and executes its code. [Projects files can be loaded into and saved from runtimes](#file-format).
-
-#### Script
-
-A set of [blocks](#block) put together to create code. Here is an example of a script:
-
-```sb
-when flag clicked
-ask [What's your name?] and wait
-say (join [Hello, ] (join (answer) [!]))
-stop [this script v]
-```
-
-Blocks are put together in the following ways:
-
-* TODO :D
-
-#### Sprite
-
-A kind of [target](#target) that can exist on its own, have [variables](#variable) only it can set, and be moved, pointed, scaled, and hidden, all of which are things that the [stage](#stage) cannot do.
-
-#### Stage
-
-A special [target](#target), with one and only one existing in every project that is always shown behind all [sprites](#sprite). It is sort of like the [global scope](https://en.wikipedia.org/wiki/Scope_(computer_science)#Global_scope) found in some programming languages, but it also exists as its own entity.
-
-Unlike [sprites](#sprite), it cannot be moved, pointed, scaled, hidden, or have variables that only it can set. However, it can do everything else a sprite can.
-
-#### Target
-
-An object that runs blocks, shows images, and plays sounds. It has its own [variables](#variable) and [scripts](#script) to perform operations. It can take the form of either a [sprite](#sprite) or the [stage](#stage).
-
-A target exists as its own independent unit. However, targets can interact with each other in some ways, e.g. via [messages](#message).
-
-#### User
-
-The individual who is interacting with the [project](#project) and provides input. They may optionally have a [username](#username) that the project can use to identify them.
-
-#### Variable
-
-A [named](#name) container belonging to a [target](#target) that holds exactly one [value](#value) and is interacted with via [blocks](#block). The following operations are often performed with variables:
-
-* **Get**: Read the current value of the variable.
-* **Set**: Modify the current value of the variable.
-
-Some variables are created on a project-by-project basis for general use by [scripts](#script). For example, a `(score)` variable can be created to keep track of an arbitrary point value. Others are directly built into the [runtime](#runtime) and cannot be deleted. For example, the [`(x position)`](#x-position) variable always exists in every [sprite](#sprite) to set its rendered horizontal position.
-
-General purpose variables can be interacted with using [variables blocks](#variables-blocks). Runtime variables have their own dedicated blocks instead and are usually limited or sandboxed in some way, unlike general purpose variables.
-
-### Values
-
-In Scratch, the following types of values exist:
-
-* [String](#string)
-* [Number](#number)
-* * [`NaN`](#nan)
- * [`Infinity`](#infinity)
- * [`-Infinity`](#-infinity)
-* [Boolean](#boolean)
- * [`true`](#true)
- * [`false`](#false)
-* [`undefined`](#undefined)
-
-There are lots of terms used to refer to these types of values and particular subsets of them. They are referenced throughout this specification and explained below:
-
-#### Value
-
-A general value. This can be a [string](#string), [number](#number), [boolean](#boolean), or in rare cases [undefined](#undefined). [Variables](#variable) can hold individual values, and a [list](#list) can store many of them as [items](#item).
-
-#### Angle
-
-A [number](#number) intended to be in [degrees](https://en.wikipedia.org/wiki/Degree_(angle)). `[sin v] of ()`, `[cos v] of ()`, and `[tan v] of ()` expect angles as input.
-
-#### Answer
-
-A [string](#string) provided to the [project](#project) by the [user](#user) as input via the [ask and wait block](#ask-and-wait-block).
-
-#### Boolean
-
-A special type of [value](#value) used to represent the result of a logical operation. It is always either [`true`](#true) or [`false`](#false).
-
-##### True
-
-A kind of [boolean](#boolean) used to represent a yes or an affirmative answer as a result of a logical operation. When casted to a [string](#string), it is written as `true`. When casted to a [number](#number), it is casted to `1`. It is considered [truthy](#truthy), as it is itself the definition of truthy.
-
-##### False
-
-A kind of [boolean](#boolean) used to represent a no or a negative answer as a result of a logical operation. When casted to a [string](#string), it is written as `false`. When casted to a [number](#number), it is casted to `0`. It is considered [falsy](#falsy), as it is itself the definition of falsy.
-
-#### Direction
-
-An [angle](#angle) determining how a sprite is pointed on the screen. It is always wrapped to remain in the range -179 and 181 (exclusive). An angle $a$ can be converted to a direction $d$ like so:
-
-$d=\operatorname{mod}\left(a+179,360\right)-179$
-
-Or in scratchblocks:
-
-```sb
-set [direction v] to ((((angle) + (179)) mod (360)) * (179))
-```
-
-The way a sprite's direction impacts how it is rendered is determined by its [rotation style](#rotation-style).
-
-#### Integer
-
-A whole [number](#number), or a number that is not a fraction (e.g. `42`, `-37`). Many [blocks](#block) report integers (e.g. `round ()`, `costume [number v]`, `loudness`, `item # of () in [list v]`) and expect integers (e.g. `item () of [list v]`), just to name a few.
-
-#### Item
-
-A [value](#value) in a [list](#list).
-
-#### Key
-
-A [name](#name) used by Scratch for referring to a key on the [user](#user)'s keyboard. Specific keys are referred to by name. To refer to any arbitrary key (as in, "press any key to continue"), the name `any` can be used.
-
-It is good to note that Scratch does not standardly support special keys other than the ones listed below, making it more versatile across platforms (i.e. it won't conflict with keyboard shortcuts used by other applications running on the user's computer).
-
-| Keyboard Key | Key Name (string) |
-|:--------------------:|:-----------------------------:|
-| ⌨️ (any key) | `any` |
-| space bar | `space` |
-| ↑ arrow | `up arrow` |
-| ↓ arrow | `down arrow` |
-| → arrow | `right arrow` |
-| ← arrow | `left arrow` |
-| Return ↵ | `enter` |
-| A, B, ...Z
(alphabet keys) | `a`, `b`, ...`z`
(the lowercase letter) |
-| 1, 2, ...0
(number keys) | `1`, `2`, ...`0`
(the numerical digit) |
-| Other keys | The label of the key
or the letter it makes
when typed as text |
-
-TODO: Document all keys and figure out exactly what keys Scratch does and doesn't support and how it handles unlisted keys)
-
-#### Length
-
-A positive [integer](#integer) representing how many [letters](#letter) or [items](#item) there are in a [string](#string) or [list](#list), respectively.
-
-#### Letter
-
-An individual [UTF-16](https://en.wikipedia.org/wiki/UTF-16) [code unit](https://developer.mozilla.org/en-US/docs/Glossary/Code_unit). Several joined together create a [string](#string). In Scratch, letters cannot be directly interacted with per se; getting a letter from a string just reports another string containing only that letter.
-
-#### Name
-
-A [string](#string) with the intention of identifying something. This can be applied to a great number of things, but is usually used in regards to a variable, list, costume, sound, [user](#username), or [sprite](#sprite).
-
-#### Number
-
-A [numerical](https://en.wikipedia.org/wiki/Number) [value](#value). Most numbers are [real](https://en.wikipedia.org/wiki/Real_number) and can be positive (`+`), negative (`-`), whole (`#`), or fractional (`#.#`). In [JavaScript](#javascript), these numbers are internally stored as [double-precision 64-bit binary format IEEE 754](https://en.wikipedia.org/wiki/Double_precision_floating-point_format) values. Thus, Scratch follows largely the same rules JavaScript does when operating on numbers, though with exceptions. In addition to real numbers, special kinds of numbers exist too, which are for situations that cannot be fully expressed with real numbers.
-
-##### Infinity
-
-A special [number](#number) that is always greater than any other number. When [casted](#to-string) to a [string](#string), it is written as `Infinity`. It is created when the result of a mathematical operation is too large to be represented as a real number.
-
-```sb
-[Infinity] + (1) // Infinity
-[10 ^ v] of (1000) // Infinity
-[log v] of (0) // -Infinity
-(1) / [Infinity] // 0
-(1) / (0) // Infinity
-```
-
-##### -Infinity
-
-A special [number](#number) that is always lower than any other number. When [casted](#to-string) to a [string](#string), it is written as `-Infinity`. It is created in the same manner as [Infinity](#infinity).
-
-Whether `-Infinity` or `Infinity` is produced by an operation is determined in the same way that a real number would be negative or not. For example, `(1) / (n)` produces a positive number, while `(-1) / (n)` produces a negative number. In the same manner, `(1) / (0)` produces positive infinity, while `(-1) / (0)` produces negative infinity.
-
-##### NaN
-
-A special [number](#number) that is not a number. When [casted](#to-string) to a [string](#string), it is written as `NaN`. It is interpreted as a `0` when passed as input to other mathematical operations, unlike in [JavaScript](#javascript) where it causes most operations to report `NaN`. It can be produced by doing unknown or unrepresentable things with numbers, such as multiplying [`Infinity`](#infinity) and zero, adding `Infinity` to [`-Infinity`](#-infinity), or getting the square root of a negative number. Unlike Infinity, it can never be negative.
-
-#### Rotation Style
-
-A [string](#string) that determines how a [sprite](#sprite)'s [direction](#direction) impacts the way it is visibly rotated when rendered. Officially, it can only be one of the following strings: `all around`, `left-right`, or `don't rotate`.
-
-* `all around`: The sprite faces in its direction **clockwise**. At `0`, it faces **up**; at `90`, it faces **right**; at `180`, it faces **down**; and at `-90`, it faces **left**.
-* `left-right`: If the sprite's direction is less than `0`, it faces **left** (`-90`). Otherwise, it faces **right** (`90`).
-* `don't rotate`: The sprite *always* faces **right** (`90`).
-
-The following table describes a sprite's *rendered* direction when using different rotation styles. (Its actual [direction *value*](#direction) remains the same; only the way it **looks like** it's pointed changes.)
-
-| Direction | All Around | Left-Right | Don't Rotate |
-|----------:|:----------------:|:----------:|:------------:|
-| **0** | 0 (up) | 90 (right) | 90 (right) |
-| **45** | 45 (up-right) | 90 (right) | 90 (right) |
-| **90** | 90 (right) | 90 (right) | 90 (right) |
-| **135** | 135 (down-right) | 90 (right) | 90 (right) |
-| **180** | 180 (down) | 90 (right) | 90 (right) |
-| **-135** | -135 (down-left) | -90 (left) | 90 (right) |
-| **-90** | -90 (left) | -90 (left) | 90 (right) |
-| **-45** | -45 (up-left) | -90 (left) | 90 (right) |
-
-##### Rotation Style: All Around
-
-
-
-##### Rotation Style: Left-Right
-
-
-
-##### Rotation Style: Don't Rotate
-
-
-
-#### String
-
-A type of [value](#value) consisting of a series (i.e. string) of [letters](#letter), also known as text. All strings are considered [truthy](#truthy) except for the [empty string](#empty-string), the string `0`, and the string `false` (case-insensitive), which are considered [falsy](#falsy).
-
-##### Empty String
-
-A [string](#string) containing no letters. It has a [length](#length) of `0` and is one of the only strings considered [falsy](#falsy). Also known as a "null string," it is typically used in place of a value where there is none, e.g. getting an [item](#item) from a [list](#list) when it does not exist, or getting the [answer](#answer) provided by a user when they have not been [asked](#ask-and-wait-block) anything yet.
-
-#### Undefined
-
-A special [value](#value) that represents nothing. When converted to a [string](#string), it is written as `undefined`. This type of value is uncommon but can be produced by [hidden reporter blocks](#hidden-blocks). In most cases, however, Scratch uses `0` or an [empty string](#empty-string) to represent nothing.
-
-#### Username
-
-A [name](#name) used to reference a [user](#user). In standard Scratch, usernames:
-
-* Are always 3 to 20 [letters](#letter) [long](#length) (inclusive)
-* Can only contain the following symbols:
- * Uppercase Latin letters (A-Z)
- * Lowercase Latin letters (a-z)
- * Numerical digits (0-9)
- * Underscores (_)
- * Hyphens (-)
-
-Also, official ("real") usernames are registered with the [Scratch website](https://scratch.mit.edu). They are unique (different from each other) and are case-insensitive, meaning that if a username "Endless-Ocean" is registered, there **cannot** *also* be an "endless-ocean" or "EndlEss-ocEan", though there **can** *also* be an "endless_ocean", "Endless--Ocean", and "Endless-Ocean1" if not already registered.
-
-Official usernames can only be changed under extraordinarily rare circumstances (e.g. the username contained sensitive information about the user that the [Scratch team](https://en.scratch-wiki.info/wiki/Scratch_Team) decided to change for them), meaning that once it is created, it usually cannot be altered later.
-
-Scripts can detect the current user's username via the [(`username`) block](#username-block). If the user is signed in, the block reports their username. If the user is signed out, the block reports an [empty string](#empty-string). In the official Scratch editor, the username reported by the username block should remain constant for the entire run of the project.
-
-> The only exception to this rule in official contexts is when the user does the following steps in sequence:
->
-> * Uses Scratch through the official website
-> * The user cannot sign into their account from the offline editor
-> * Loads a shared project while signed out of their account
-> * This does not work with an unshared project because the user cannot view it while signed out
-> * Signs in to their account from the same window while the project is open
-> * A menu exists for the user to sign in to their account without reloading the page
->
-> Then the reported username is changed from the empty string to the username that the user signed in with, without reloading the project. After this happens, the user cannot change their username again without reloading the project or modifying the [runtime](#runtime) directly, e.g. via [developer tools](https://en.wikipedia.org/wiki/Web_development_tools).
-
-Due to the aforementioned limitations of real usernames, project *can* technically check if the user's username is "real" or not by:
-
-* Crossreferencing it with a list of known usernames to see if it is registered with the Scratch website
-* Remembering the usernames that the username block has reported (e.g. via cloud variables) and see if it encounters the same username with different casing
-* Checking to see if the username is changed while the project is running (impossible without modification unless the user is signing in after being signed out)
-
-A project could potentially utilize any of these ways to detect if it is actually being run in the official Scratch environment or an unofficial implementation of it.
-
-Thus, for a truly accurate recreation of Scratch, the `(username)` block should **only report registered usernames** with the Scratch website, and a project which remembers usernames (e.g. via cloud variables) should **never encounter the same username it has seen before with different casing**, except in extraordinarily rare cases where the casing of a user's username was officially changed by the Scratch team, which is not known to have happened ever. The username should also not be changed while the project is running; the moment the project is started, whatever username the username block reports will be the username for the entire duration of time for which it runs, unless the user was signed out when the project began and signs in while the project is running.
-
-In most cases, however, projects will probably not notice anything wrong with the username (but a few niche ones *could* break), so long as it only contains valid characters (A-Z, a-z, 0-9, _, -) and is between 3-20 letters in length, as previously stated. In general, usernames are really just any arbitrary [string](#string) that identifies a user.
-
-#### X Position
-
-A horizontal position on the Scratch coordinate plane. All [sprites](#sprite) have one. (TODO: document coordinate system)
-
-#### Y Position
-
-A vertical position on the Scratch coordinate plane. All [sprites](#sprite) have one. (TODO: document coordinate system)
-
-#### Other Values
-
-> Inclusion of this section is up for debate. Feel free to offer insight!
-
-Other kinds values can potentially exist in modified or bugged versions of Scratch. This is because Scratch is built on JavaScript, and although it is highly unlikely for a project to work with any type of value other than the ones listed above, there is always the potential for other JavaScript primitives to be glitched into the project, e.g. by setting the value via developer tools, or some wider unknown issue.
-
-They will not be specified in this specification as of yet (since they cannot be obtained through *official* means), but other values that could potentially be encountered in the rarest of cases are:
-
-* `null`: A special value representing nothing. Distinct from [undefined](#undefined) in that it is meant to *explicitly* be nothing, whereas undefined exists for representing unknown behavior or values.
- * The writers of this specification do not know if `null` can be produced by existing blocks without modification.
- * If it is found to be an obtainable value, it may be documented further. Otherwise, it will not be, and is likely not necessary for inclusion in a reimplementation of Scratch.
- * This value can be casted to other data types. (`null` was obtained via "custom extensions" in [a modification of Scratch](#turbowarp) that still has largely the same behaviors as standard Scratch to see how it would behave if somehow obtained.)
- * When [casted](#to-string) to a [string](#string), it is written as `null`.
- * When [casted](#to-number) to a [number](#number), it is casted to `0`.
- * When [casted](#to-boolean) to a [boolean](#boolean), it is [`false`](#falsy).
-
-### Procedures
-
-The following procedures are often performed by Scratch and are mentioned throughout this document:
-
-#### Casting
-
-Most blocks automatically convert [values](#value) between types through the use of very particular logic, also known as [casting](https://en.scratch-wiki.info/wiki/Casting). The logic Scratch uses is specified below.
-
-##### To String
-
-Scratch uses the following logic to convert any given [value](#value) to a [string](#string):
-
-* If the value is a [**string**](#string):
- * **Return the value**, as it is already a string.
-* If the value is a [**number**](#number):
- * **Follow the [logic JavaScript does](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString)** to cast a number to a string **and return it.**
- * TODO: specify this better
- * If the value is [**NaN**](#nan), **return the string `NaN`.**
- * If the value is [**Infinity**](#infinity), **return the string `Infinity`.**
- * If the value is [**-Infinity**](#infinity), **return the string `-Infinity`.**
-* If the value is a [**boolean**](#boolean):
- * If the value is [**true**](#boolean), **return the string `true`.**
- * If the value is [**false**](#boolean), **return the string `false`.**
-* If the value is [**undefined**](#undefined), **return the string `undefined`.**
-* If the value is [**something else**](#other-values), **follow the logic [JavaScript](#javascript) has for the `toString` method of that value** to convert it to a string **and return it.** (Likely unnecessary though, as no known "other values" can be encountered.)
- * If the value is somehow **null**, **return the string `null`.**
- * TODO: Explain this step better or maybe just omit it because this step is not needed
-
-##### To Number
-
-Scratch uses the following logic to convert any given [value](#value) to a [number](#number):
-
-* If the value is [**NaN**](#nan), **return the number `0`.**
-* If the value is a [**number**](#number), **return the value** as it is.
-* If the value is [**undefined**](#undefined), **return the number `0`.**
-* If the value is [**true**](#true), **return the number `1`.**
-* If the value is [**false**](#false), **return the number `0`.**
-* If the value is a [**string**](#string) or [something else](#other-values):
- * **If the value can be converted to a number** according to [these rules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number#number_coercion)**, return it.**
- * **Otherwise, return the number `0`.**
- * TODO: specify string -> number coercion better b/c [JavaScript](#javascript) logic
-
-##### To Boolean
-
-Scratch uses the following logic to convert any given [value](#value) to a [boolean](#boolean):
-
-###### Falsy
-
-A value is **falsy**, or casted to [**false**](#false), if the value is:
-
-* an [**empty string**](#empty-string) (no [letters](#letter), [length](#length) is `0`),
-* the **[strings](#string) `0`** or **`false`** (case-insensitive),
-* one of the **[numbers](#number) `0`**, **`-0`**, or [**`NaN`**](#nan),
-* [**undefined**](#undefined),
-* [**null**](#other-values) (rare),
-* or **false**.
-
-###### Truthy
-
-Any value that is **not** [**falsy**](#falsy) is considered **truthy** and casted to [**true**](#true).
-
-##### To Direction
-
-Scratch uses the following logic to convert any given [value](#value) to a [direction](#direction):
-
-1. [**Cast the value to number**](#to-number).
-2. **Plug the casted value** into the following equation **as $a$ to find $d$:**
- * $d=\operatorname{mod}\left(a+179,360\right)-179$
- * Here is the same equation written in blocks:
-
- ```sb
- set [direction v] to ((((angle) + (179)) mod (360)) * (179))
- ```
-
-3. **Return $d$** (`direction`)**.**
-
-#### Fencing
-
-In Scratch, whenever the position of a sprite changes, it then fences (aka restricts) the position of the sprite to fit inside of a fence (aka boundary) that is intended to keep it within the viewing area of the stage. Additionally, whenever the size of a sprite changes, it then fences (aka restricts) the size of the sprite to remain reasonably visible and not too large so as to cause rendering problems. This is primarily so that sprites do not randomly disappear due to erroneous code, but it is also an intentional feature of Scratch that does get utilized by some projects.
-
-Scratch uses the following procedures to determine what the position and size of a sprite should be limited to depending on the width and height of its current costume, as well as its direction.
-
-##### Fencing Position
-
-* TODO :D
-
-##### Fencing Size
-
-* TODO ;D
-
-Each fencing procedure is only applied after the position or size of the sprite changes (if the position changes, only the position is fenced; if the size changes, only the size is fenced). Because of this behavior, if one switches the costume to a particularly large or small costume, moves or resizes it, and then switches the costume back without changing the position and size afterward, then the sprite will remain at the same position and size that it had with the large or small costume (since fencing is *not applied when switching costumes*), allowing projects to circumvent fencing if needed.
-
## Palette
This section documents each and every block in Scratch, and its precise functionality.
diff --git a/concepts/index.md b/concepts/index.md
new file mode 100644
index 0000000..8bac4dd
--- /dev/null
+++ b/concepts/index.md
@@ -0,0 +1,545 @@
+# Concepts
+
+This section explains the various concepts and rules of Scratch.
+
+{{toc}}
+
+## Capabilities
+
+At its core, Scratch should be able to:
+
+* **Change values** in a [runtime](#runtime)
+* **Run scripts** [single-threaded](https://en.wikipedia.org/wiki/Cooperative_multitasking)
+* **Play sounds** using speakers
+* **Show images** and graphics
+
+In a fully functional environment, Scratch can access:
+
+* A **keyboard** (detect keys the user presses)
+* A **mouse** (read its position and button state)
+* A **microphone** (gauge surrounding loudness)
+* A **clock** (get local and UTC time in milliseconds)
+* **Wi-Fi** (make network requests to external servers)
+* **Bluetooth** (connect to supported hardware)
+* A **webcam** (sense motion in a direction)
+
+If one or more of these things is unavailable, Scratch handles it gracefully.
+
+## Constants
+
+These constant values will show up a lot throughout this specification. They can be changed to one's liking, however for true accuracy to Scratch, they should all have their "**Standard Scratch**:" values.
+
+### Stage Bounds
+
+#### Stage Width
+
+The horizontal size of the stage. This is an arbitrary positive [integer](#integer).
+
+**Standard Scratch**: `480`
+
+**Widescreen** (via unofficial modification): `640`
+
+#### Stage Height
+
+The vertical size of the stage. This is an arbitrary positive [integer](#integer).
+
+**Standard Scratch**: `360`
+
+#### Left Edge
+
+The horizontal position of the left edge. This is derived from the [stage width](#stage-width).
+
+**Formula**: `stage width / -2`
+
+**Standard Scratch**: `-240`
+
+#### Right Edge
+
+The horizontal position of the right edge. This is derived from the [stage width](#stage-width).
+
+**Formula**: `stage width / 2`
+
+**Standard Scratch**: `240`
+
+#### Top Edge
+
+The vertical position of the top edge. This is derived from the [stage height](#stage-height).
+
+**Formula**: `stage height / 2`
+
+**Standard Scratch**: `180`
+
+#### Bottom Edge
+
+The vertical position of the bottom edge. This is derived from the [stage height](#stage-height).
+
+**Formula**: `stage height / -2`
+
+**Standard Scratch**: `-180`
+
+#### Limits
+
+#### Max Items
+
+The maximum [length](#length) of a [list](#list), aka the most items that one list can hold. This limit is imposed to prevent excessive memory usage by [projects](#project). This is an arbitrary positive [integer](#integer).
+
+**Standard Scratch**: `200000`
+
+**Modified Scratch**: None (many Scratch mods do not enforce this limit, though memory overflow may eventually occur)
+
+#### Max Clones
+
+The maximum number of [clones](#clone) that can exist at one time. If this limit is reached, another clone cannot be created until one is deleted. This limit is imposed to prevent excessive memory usage by [projects](#project). This is an arbitrary positive [integer](#integer).
+
+**Standard Scratch**: `300`
+
+**Modified Scratch**: None (many Scratch mods do not enforce this limit, though memory overflow may eventually occur)
+
+## Ideas
+
+The following ideas are referenced throughout this specification:
+
+### Asset
+
+A [costume](#costume) or [sound](#sound).
+
+#### Costume
+
+A costume is an [image file](https://en.wikipedia.org/wiki/Digital_image) and a type of [asset](#asset) that can be graphically rendered to represent a [target](#target). It can be identified by its [name](#name) or [number](#integer). Costumes can either be [bitmap](https://en.wikipedia.org/wiki/Raster_graphics) or [vector](https://en.wikipedia.org/wiki/Vector_graphics).
+
+#### Sound
+
+A sound is an [audio file](https://en.wikipedia.org/wiki/Digital_audio) and a type of [asset](#asset) that can be audibly played to the user via [blocks](#block). It can be identified by its [name](#name).
+
+### Block
+
+> This will have to be better explained and added to the nonexistent section for script execution.
+
+The fundamental component of Scratch as a programming language. In fact, it is similar to a function call in other programming languages. Every block:
+
+* Accepts values or blocks as arguments
+* Has a specific pre-defined operation that it performs
+* Can be run and reports (i.e. outputs, returns) a single value (or [none at all](#undefined))
+
+Blocks can be run, meaning that its operation is performed using the arguments it is given and the value resulting from the operation is reported, if any. When put together, blocks create [scripts](#script).
+
+#### Standard Blocks
+
+[Blocks](#block) that are officially supported in Scratch 3.0. They are the most commonly used blocks in [scripts](#script).
+
+#### Hidden Blocks
+
+[Blocks](#block) that exist in Scratch 3.0 but are not actively supported or used on their own, either being kept for compatibility with projects created in older versions of Scratch or being used internally. Some are functional, some are not. [Scripts](#script) may use them on occasion, but they are found less often than [standard blocks](#standard-blocks) due to their obscurity.
+
+### Clone
+
+A copy created of a [sprite](#sprite) that has all of the original sprite's code, images, and sounds, but operates independently of it. Unlike sprites, clones cannot be directly referenced via existing blocks (e.g. you cannot [glide to](#glide-to-block) it directly without knowing its position ahead of time, as it cannot be selected in the sprite dropdown menu), and exist as their own thing. They are deleted every time the [flag](#flag) is clicked, and can also be deleted manually using the [`delete this clone` block](#delete-clone-block).
+
+Clones can be created with the [create clone block](#create-clone-block) so long as the [maximum number of clones](#max-clones) has not been reached. Code can be written specifically for the clones of a sprite via the use of the [when I start as a clone block](#when-i-start-as-a-clone-block). The [stage](#stage) is the [target](#target) which cannot be cloned, whereas both sprites *and clones* can themselves be cloned.
+
+### Edge
+
+> The usefulness of defining "Edge" is up for debate. It may be best left to the section about [fencing](#fencing). Feel free to offer insight!
+
+A boundary around the viewing area of the [stage](#stage) that restricts the [costume](#costume) of a [sprite](#sprite) from going off-screen.
+
+### Flag
+
+> The usefulness of defining "Flag" is up for debate. Feel free to offer insight!
+
+The button that is clicked to start a project. It is also known as the green flag. In simple terms, it makes the project `Go`. When clicked, it runs any scripts placed under [when flag clicked blocks](#when-flag-clicked-block).
+
+### JavaScript
+
+> Definitions for general terms indirectly related to Scratch may be put into their own section instead, however this is up for debate. Feel free to offer insight!
+
+The programming language that Scratch 3.0 runs in. The logic it uses is largely similar to the logic Scratch uses due to Scratch's dependence on JavaScript for performing operations and manipulating values. In fact, this is where the type of value [undefined](#undefined) is taken from; it is a type of value in JavaScript for representing what is not defined or known. Thanks to the quirks of Scratch and [no-op hidden reporter blocks](#hidden-blocks), we can obtain this type of value.
+
+### List
+
+A series of [items](#item) stored together in sequence. Each item is referenced by its numerical index (aka item #), a positive [integer](#integer) ranging from `1` to the [length](#length) of the list (inclusive). Lists can be empty, meaning that they have a length of `0` and contain no items. There is also a [maximum number of items](#max-items) that a list can hold, aka a limit to its length.
+
+### Mod
+
+A modification (altered version) of the Scratch 3.0 [runtime](#runtime) that is nonstandard and may introduce new blocks, features, or changes not present in standard Scratch. The majority of this spec will be documenting standard Scratch behavior. For information on nonstandard blocks and behaviors in mods, see the [relevant appendix](#nonstandard-blocks).
+
+### Opcode
+
+A [name](#name) unique to every [block](#block) in the Scratch programming language. It tells blocks what to do. For example, if the opcode of a block is [`motion_movesteps`](#motion_movesteps), it attempts to move steps.
+
+### Project
+
+A [stage](#stage) and optionally some [sprites](#sprite) packaged together to do something. They can be loaded into a [runtime](#runtime) and executed. They can also be saved as [project files](#file-format).
+
+### Runtime
+
+The environment in which a [project](#project) is run. It keeps track of the project's current state and executes its code. [Projects files can be loaded into and saved from runtimes](#file-format).
+
+### Script
+
+A set of [blocks](#block) put together to create code. Here is an example of a script:
+
+```sb
+when flag clicked
+ask [What's your name?] and wait
+say (join [Hello, ] (join (answer) [!]))
+stop [this script v]
+```
+
+Blocks are put together in the following ways:
+
+* TODO :D
+
+### Sprite
+
+A kind of [target](#target) that can exist on its own, have [variables](#variable) only it can set, and be moved, pointed, scaled, and hidden, all of which are things that the [stage](#stage) cannot do.
+
+### Stage
+
+A special [target](#target), with one and only one existing in every project that is always shown behind all [sprites](#sprite). It is sort of like the [global scope](https://en.wikipedia.org/wiki/Scope_(computer_science)#Global_scope) found in some programming languages, but it also exists as its own entity.
+
+Unlike [sprites](#sprite), it cannot be moved, pointed, scaled, hidden, or have variables that only it can set. However, it can do everything else a sprite can.
+
+### Target
+
+An object that runs blocks, shows images, and plays sounds. It has its own [variables](#variable) and [scripts](#script) to perform operations. It can take the form of either a [sprite](#sprite) or the [stage](#stage).
+
+A target exists as its own independent unit. However, targets can interact with each other in some ways, e.g. via [messages](#message).
+
+### User
+
+The individual who is interacting with the [project](#project) and provides input. They may optionally have a [username](#username) that the project can use to identify them.
+
+### Variable
+
+A [named](#name) container belonging to a [target](#target) that holds exactly one [value](#value) and is interacted with via [blocks](#block). The following operations are often performed with variables:
+
+* **Get**: Read the current value of the variable.
+* **Set**: Modify the current value of the variable.
+
+Some variables are created on a project-by-project basis for general use by [scripts](#script). For example, a `(score)` variable can be created to keep track of an arbitrary point value. Others are directly built into the [runtime](#runtime) and cannot be deleted. For example, the [`(x position)`](#x-position) variable always exists in every [sprite](#sprite) to set its rendered horizontal position.
+
+General purpose variables can be interacted with using [variables blocks](#variables-blocks). Runtime variables have their own dedicated blocks instead and are usually limited or sandboxed in some way, unlike general purpose variables.
+
+## Values
+
+In Scratch, the following types of values exist:
+
+* [String](#string)
+* [Number](#number)
+* * [`NaN`](#nan)
+ * [`Infinity`](#infinity)
+ * [`-Infinity`](#-infinity)
+* [Boolean](#boolean)
+ * [`true`](#true)
+ * [`false`](#false)
+* [`undefined`](#undefined)
+
+There are lots of terms used to refer to these types of values and particular subsets of them. They are referenced throughout this specification and explained below:
+
+### Value
+
+A general value. This can be a [string](#string), [number](#number), [boolean](#boolean), or in rare cases [undefined](#undefined). [Variables](#variable) can hold individual values, and a [list](#list) can store many of them as [items](#item).
+
+### Angle
+
+A [number](#number) intended to be in [degrees](https://en.wikipedia.org/wiki/Degree_(angle)). `[sin v] of ()`, `[cos v] of ()`, and `[tan v] of ()` expect angles as input.
+
+### Answer
+
+A [string](#string) provided to the [project](#project) by the [user](#user) as input via the [ask and wait block](#ask-and-wait-block).
+
+### Boolean
+
+A special type of [value](#value) used to represent the result of a logical operation. It is always either [`true`](#true) or [`false`](#false).
+
+#### True
+
+A kind of [boolean](#boolean) used to represent a yes or an affirmative answer as a result of a logical operation. When casted to a [string](#string), it is written as `true`. When casted to a [number](#number), it is casted to `1`. It is considered [truthy](#truthy), as it is itself the definition of truthy.
+
+#### False
+
+A kind of [boolean](#boolean) used to represent a no or a negative answer as a result of a logical operation. When casted to a [string](#string), it is written as `false`. When casted to a [number](#number), it is casted to `0`. It is considered [falsy](#falsy), as it is itself the definition of falsy.
+
+### Direction
+
+An [angle](#angle) determining how a sprite is pointed on the screen. It is always wrapped to remain in the range -179 and 181 (exclusive). An angle $a$ can be converted to a direction $d$ like so:
+
+$d=\operatorname{mod}\left(a+179,360\right)-179$
+
+Or in scratchblocks:
+
+```sb
+set [direction v] to ((((angle) + (179)) mod (360)) * (179))
+```
+
+The way a sprite's direction impacts how it is rendered is determined by its [rotation style](#rotation-style).
+
+### Integer
+
+A whole [number](#number), or a number that is not a fraction (e.g. `42`, `-37`). Many [blocks](#block) report integers (e.g. `round ()`, `costume [number v]`, `loudness`, `item # of () in [list v]`) and expect integers (e.g. `item () of [list v]`), just to name a few.
+
+### Item
+
+A [value](#value) in a [list](#list).
+
+### Key
+
+A [name](#name) used by Scratch for referring to a key on the [user](#user)'s keyboard. Specific keys are referred to by name. To refer to any arbitrary key (as in, "press any key to continue"), the name `any` can be used.
+
+It is good to note that Scratch does not standardly support special keys other than the ones listed below, making it more versatile across platforms (i.e. it won't conflict with keyboard shortcuts used by other applications running on the user's computer).
+
+| Keyboard Key | Key Name (string) |
+|:--------------------:|:-----------------------------:|
+| ⌨️ (any key) | `any` |
+| space bar | `space` |
+| ↑ arrow | `up arrow` |
+| ↓ arrow | `down arrow` |
+| → arrow | `right arrow` |
+| ← arrow | `left arrow` |
+| Return ↵ | `enter` |
+| A, B, ...Z
(alphabet keys) | `a`, `b`, ...`z`
(the lowercase letter) |
+| 1, 2, ...0
(number keys) | `1`, `2`, ...`0`
(the numerical digit) |
+| Other keys | The label of the key
or the letter it makes
when typed as text |
+
+TODO: Document all keys and figure out exactly what keys Scratch does and doesn't support and how it handles unlisted keys)
+
+### Length
+
+A positive [integer](#integer) representing how many [letters](#letter) or [items](#item) there are in a [string](#string) or [list](#list), respectively.
+
+### Letter
+
+An individual [UTF-16](https://en.wikipedia.org/wiki/UTF-16) [code unit](https://developer.mozilla.org/en-US/docs/Glossary/Code_unit). Several joined together create a [string](#string). In Scratch, letters cannot be directly interacted with per se; getting a letter from a string just reports another string containing only that letter.
+
+### Name
+
+A [string](#string) with the intention of identifying something. This can be applied to a great number of things, but is usually used in regards to a variable, list, costume, sound, [user](#username), or [sprite](#sprite).
+
+### Number
+
+A [numerical](https://en.wikipedia.org/wiki/Number) [value](#value). Most numbers are [real](https://en.wikipedia.org/wiki/Real_number) and can be positive (`+`), negative (`-`), whole (`#`), or fractional (`#.#`). In [JavaScript](#javascript), these numbers are internally stored as [double-precision 64-bit binary format IEEE 754](https://en.wikipedia.org/wiki/Double_precision_floating-point_format) values. Thus, Scratch follows largely the same rules JavaScript does when operating on numbers, though with exceptions. In addition to real numbers, special kinds of numbers exist too, which are for situations that cannot be fully expressed with real numbers.
+
+#### Infinity
+
+A special [number](#number) that is always greater than any other number. When [casted](#to-string) to a [string](#string), it is written as `Infinity`. It is created when the result of a mathematical operation is too large to be represented as a real number.
+
+```sb
+[Infinity] + (1) // Infinity
+[10 ^ v] of (1000) // Infinity
+[log v] of (0) // -Infinity
+(1) / [Infinity] // 0
+(1) / (0) // Infinity
+```
+
+#### -Infinity
+
+A special [number](#number) that is always lower than any other number. When [casted](#to-string) to a [string](#string), it is written as `-Infinity`. It is created in the same manner as [Infinity](#infinity).
+
+Whether `-Infinity` or `Infinity` is produced by an operation is determined in the same way that a real number would be negative or not. For example, `(1) / (n)` produces a positive number, while `(-1) / (n)` produces a negative number. In the same manner, `(1) / (0)` produces positive infinity, while `(-1) / (0)` produces negative infinity.
+
+#### NaN
+
+A special [number](#number) that is not a number. When [casted](#to-string) to a [string](#string), it is written as `NaN`. It is interpreted as a `0` when passed as input to other mathematical operations, unlike in [JavaScript](#javascript) where it causes most operations to report `NaN`. It can be produced by doing unknown or unrepresentable things with numbers, such as multiplying [`Infinity`](#infinity) and zero, adding `Infinity` to [`-Infinity`](#-infinity), or getting the square root of a negative number. Unlike Infinity, it can never be negative.
+
+### Rotation Style
+
+A [string](#string) that determines how a [sprite](#sprite)'s [direction](#direction) impacts the way it is visibly rotated when rendered. Officially, it can only be one of the following strings: `all around`, `left-right`, or `don't rotate`.
+
+* `all around`: The sprite faces in its direction **clockwise**. At `0`, it faces **up**; at `90`, it faces **right**; at `180`, it faces **down**; and at `-90`, it faces **left**.
+* `left-right`: If the sprite's direction is less than `0`, it faces **left** (`-90`). Otherwise, it faces **right** (`90`).
+* `don't rotate`: The sprite *always* faces **right** (`90`).
+
+The following table describes a sprite's *rendered* direction when using different rotation styles. (Its actual [direction *value*](#direction) remains the same; only the way it **looks like** it's pointed changes.)
+
+| Direction | All Around | Left-Right | Don't Rotate |
+|----------:|:----------------:|:----------:|:------------:|
+| **0** | 0 (up) | 90 (right) | 90 (right) |
+| **45** | 45 (up-right) | 90 (right) | 90 (right) |
+| **90** | 90 (right) | 90 (right) | 90 (right) |
+| **135** | 135 (down-right) | 90 (right) | 90 (right) |
+| **180** | 180 (down) | 90 (right) | 90 (right) |
+| **-135** | -135 (down-left) | -90 (left) | 90 (right) |
+| **-90** | -90 (left) | -90 (left) | 90 (right) |
+| **-45** | -45 (up-left) | -90 (left) | 90 (right) |
+
+#### Rotation Style: All Around
+
+
+
+#### Rotation Style: Left-Right
+
+
+
+#### Rotation Style: Don't Rotate
+
+
+
+### String
+
+A type of [value](#value) consisting of a series (i.e. string) of [letters](#letter), also known as text. All strings are considered [truthy](#truthy) except for the [empty string](#empty-string), the string `0`, and the string `false` (case-insensitive), which are considered [falsy](#falsy).
+
+#### Empty String
+
+A [string](#string) containing no letters. It has a [length](#length) of `0` and is one of the only strings considered [falsy](#falsy). Also known as a "null string," it is typically used in place of a value where there is none, e.g. getting an [item](#item) from a [list](#list) when it does not exist, or getting the [answer](#answer) provided by a user when they have not been [asked](#ask-and-wait-block) anything yet.
+
+### Undefined
+
+A special [value](#value) that represents nothing. When converted to a [string](#string), it is written as `undefined`. This type of value is uncommon but can be produced by [hidden reporter blocks](#hidden-blocks). In most cases, however, Scratch uses `0` or an [empty string](#empty-string) to represent nothing.
+
+### Username
+
+A [name](#name) used to reference a [user](#user). In standard Scratch, usernames:
+
+* Are always 3 to 20 [letters](#letter) [long](#length) (inclusive)
+* Can only contain the following symbols:
+ * Uppercase Latin letters (A-Z)
+ * Lowercase Latin letters (a-z)
+ * Numerical digits (0-9)
+ * Underscores (_)
+ * Hyphens (-)
+
+Also, official ("real") usernames are registered with the [Scratch website](https://scratch.mit.edu). They are unique (different from each other) and are case-insensitive, meaning that if a username "Endless-Ocean" is registered, there **cannot** *also* be an "endless-ocean" or "EndlEss-ocEan", though there **can** *also* be an "endless_ocean", "Endless--Ocean", and "Endless-Ocean1" if not already registered.
+
+Official usernames can only be changed under extraordinarily rare circumstances (e.g. the username contained sensitive information about the user that the [Scratch team](https://en.scratch-wiki.info/wiki/Scratch_Team) decided to change for them), meaning that once it is created, it usually cannot be altered later.
+
+Scripts can detect the current user's username via the [(`username`) block](#username-block). If the user is signed in, the block reports their username. If the user is signed out, the block reports an [empty string](#empty-string). In the official Scratch editor, the username reported by the username block should remain constant for the entire run of the project.
+
+> The only exception to this rule in official contexts is when the user does the following steps in sequence:
+>
+> * Uses Scratch through the official website
+> * The user cannot sign into their account from the offline editor
+> * Loads a shared project while signed out of their account
+> * This does not work with an unshared project because the user cannot view it while signed out
+> * Signs in to their account from the same window while the project is open
+> * A menu exists for the user to sign in to their account without reloading the page
+>
+> Then the reported username is changed from the empty string to the username that the user signed in with, without reloading the project. After this happens, the user cannot change their username again without reloading the project or modifying the [runtime](#runtime) directly, e.g. via [developer tools](https://en.wikipedia.org/wiki/Web_development_tools).
+
+Due to the aforementioned limitations of real usernames, project *can* technically check if the user's username is "real" or not by:
+
+* Crossreferencing it with a list of known usernames to see if it is registered with the Scratch website
+* Remembering the usernames that the username block has reported (e.g. via cloud variables) and see if it encounters the same username with different casing
+* Checking to see if the username is changed while the project is running (impossible without modification unless the user is signing in after being signed out)
+
+A project could potentially utilize any of these ways to detect if it is actually being run in the official Scratch environment or an unofficial implementation of it.
+
+Thus, for a truly accurate recreation of Scratch, the `(username)` block should **only report registered usernames** with the Scratch website, and a project which remembers usernames (e.g. via cloud variables) should **never encounter the same username it has seen before with different casing**, except in extraordinarily rare cases where the casing of a user's username was officially changed by the Scratch team, which is not known to have happened ever. The username should also not be changed while the project is running; the moment the project is started, whatever username the username block reports will be the username for the entire duration of time for which it runs, unless the user was signed out when the project began and signs in while the project is running.
+
+In most cases, however, projects will probably not notice anything wrong with the username (but a few niche ones *could* break), so long as it only contains valid characters (A-Z, a-z, 0-9, _, -) and is between 3-20 letters in length, as previously stated. In general, usernames are really just any arbitrary [string](#string) that identifies a user.
+
+### X Position
+
+A horizontal position on the Scratch coordinate plane. All [sprites](#sprite) have one. (TODO: document coordinate system)
+
+### Y Position
+
+A vertical position on the Scratch coordinate plane. All [sprites](#sprite) have one. (TODO: document coordinate system)
+
+### Other Values
+
+> Inclusion of this section is up for debate. Feel free to offer insight!
+
+Other kinds values can potentially exist in modified or bugged versions of Scratch. This is because Scratch is built on JavaScript, and although it is highly unlikely for a project to work with any type of value other than the ones listed above, there is always the potential for other JavaScript primitives to be glitched into the project, e.g. by setting the value via developer tools, or some wider unknown issue.
+
+They will not be specified in this specification as of yet (since they cannot be obtained through *official* means), but other values that could potentially be encountered in the rarest of cases are:
+
+* `null`: A special value representing nothing. Distinct from [undefined](#undefined) in that it is meant to *explicitly* be nothing, whereas undefined exists for representing unknown behavior or values.
+ * The writers of this specification do not know if `null` can be produced by existing blocks without modification.
+ * If it is found to be an obtainable value, it may be documented further. Otherwise, it will not be, and is likely not necessary for inclusion in a reimplementation of Scratch.
+ * This value can be casted to other data types. (`null` was obtained via "custom extensions" in [a modification of Scratch](#turbowarp) that still has largely the same behaviors as standard Scratch to see how it would behave if somehow obtained.)
+ * When [casted](#to-string) to a [string](#string), it is written as `null`.
+ * When [casted](#to-number) to a [number](#number), it is casted to `0`.
+ * When [casted](#to-boolean) to a [boolean](#boolean), it is [`false`](#falsy).
+
+## Procedures
+
+The following procedures are often performed by Scratch and are mentioned throughout this document:
+
+### Casting
+
+Most blocks automatically convert [values](#value) between types through the use of very particular logic, also known as [casting](https://en.scratch-wiki.info/wiki/Casting). The logic Scratch uses is specified below.
+
+#### To String
+
+Scratch uses the following logic to convert any given [value](#value) to a [string](#string):
+
+* If the value is a [**string**](#string):
+ * **Return the value**, as it is already a string.
+* If the value is a [**number**](#number):
+ * **Follow the [logic JavaScript does](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString)** to cast a number to a string **and return it.**
+ * TODO: specify this better
+ * If the value is [**NaN**](#nan), **return the string `NaN`.**
+ * If the value is [**Infinity**](#infinity), **return the string `Infinity`.**
+ * If the value is [**-Infinity**](#infinity), **return the string `-Infinity`.**
+* If the value is a [**boolean**](#boolean):
+ * If the value is [**true**](#boolean), **return the string `true`.**
+ * If the value is [**false**](#boolean), **return the string `false`.**
+* If the value is [**undefined**](#undefined), **return the string `undefined`.**
+* If the value is [**something else**](#other-values), **follow the logic [JavaScript](#javascript) has for the `toString` method of that value** to convert it to a string **and return it.** (Likely unnecessary though, as no known "other values" can be encountered.)
+ * If the value is somehow **null**, **return the string `null`.**
+ * TODO: Explain this step better or maybe just omit it because this step is not needed
+
+#### To Number
+
+Scratch uses the following logic to convert any given [value](#value) to a [number](#number):
+
+* If the value is [**NaN**](#nan), **return the number `0`.**
+* If the value is a [**number**](#number), **return the value** as it is.
+* If the value is [**undefined**](#undefined), **return the number `0`.**
+* If the value is [**true**](#true), **return the number `1`.**
+* If the value is [**false**](#false), **return the number `0`.**
+* If the value is a [**string**](#string) or [something else](#other-values):
+ * **If the value can be converted to a number** according to [these rules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number#number_coercion)**, return it.**
+ * **Otherwise, return the number `0`.**
+ * TODO: specify string -> number coercion better b/c [JavaScript](#javascript) logic
+
+#### To Boolean
+
+Scratch uses the following logic to convert any given [value](#value) to a [boolean](#boolean):
+
+##### Falsy
+
+A value is **falsy**, or casted to [**false**](#false), if the value is:
+
+* an [**empty string**](#empty-string) (no [letters](#letter), [length](#length) is `0`),
+* the **[strings](#string) `0`** or **`false`** (case-insensitive),
+* one of the **[numbers](#number) `0`**, **`-0`**, or [**`NaN`**](#nan),
+* [**undefined**](#undefined),
+* [**null**](#other-values) (rare),
+* or **false**.
+
+##### Truthy
+
+Any value that is **not** [**falsy**](#falsy) is considered **truthy** and casted to [**true**](#true).
+
+#### To Direction
+
+Scratch uses the following logic to convert any given [value](#value) to a [direction](#direction):
+
+1. [**Cast the value to number**](#to-number).
+2. **Plug the casted value** into the following equation **as $a$ to find $d$:**
+ * $d=\operatorname{mod}\left(a+179,360\right)-179$
+ * Here is the same equation written in blocks:
+
+ ```sb
+ set [direction v] to ((((angle) + (179)) mod (360)) * (179))
+ ```
+
+3. **Return $d$** (`direction`)**.**
+
+### Fencing
+
+In Scratch, whenever the position of a sprite changes, it then fences (aka restricts) the position of the sprite to fit inside of a fence (aka boundary) that is intended to keep it within the viewing area of the stage. Additionally, whenever the size of a sprite changes, it then fences (aka restricts) the size of the sprite to remain reasonably visible and not too large so as to cause rendering problems. This is primarily so that sprites do not randomly disappear due to erroneous code, but it is also an intentional feature of Scratch that does get utilized by some projects.
+
+Scratch uses the following procedures to determine what the position and size of a sprite should be limited to depending on the width and height of its current costume, as well as its direction.
+
+#### Fencing Position
+
+* TODO :D
+
+#### Fencing Size
+
+* TODO ;D
+
+Each fencing procedure is only applied after the position or size of the sprite changes (if the position changes, only the position is fenced; if the size changes, only the size is fenced). Because of this behavior, if one switches the costume to a particularly large or small costume, moves or resizes it, and then switches the costume back without changing the position and size afterward, then the sprite will remain at the same position and size that it had with the large or small costume (since fencing is *not applied when switching costumes*), allowing projects to circumvent fencing if needed.
diff --git a/index.md b/index.md
new file mode 100644
index 0000000..b6f5b2b
--- /dev/null
+++ b/index.md
@@ -0,0 +1,208 @@
+---
+# https://vitepress.dev/reference/default-theme-home-page
+layout: home
+
+hero:
+ name: "Scratch Specification"
+ tagline: "A detailed explanation of how Scratch 3.0 works."
+ actions:
+ - theme: brand
+ text: Introduction
+ link: /intro/
+ - theme: alt
+ text: FAQ
+ link: /intro/#faq
+ - theme: alt
+ text: Quickstart
+ link: /intro/#where-to-start
+
+features:
+ - title: Introduction
+ link: /intro/
+ details: An explanation of what this spec is trying to achieve.
+ - title: Concepts
+ link: /concepts/
+ details: Formal definitions for basic Scratch concepts.
+ - title: Runtime
+ link: /runtime/
+ details: How scripts run.
+ - title: Palette
+ link: /palette/
+ details: Every. Block. Ever.
+ - title: Project Files
+ link: /files/
+ details: The file formats used to save and load Scratch runtime objects.
+ - title: Input / Output
+ link: /io/
+ details: How Scratch receives inputs, renders images, and plays sounds.
+ - title: Cloud Networking
+ link: /network/
+ details: How Scratch handles requests to external servers, as well as cloud variable manipulation.
+ - title: Scratch Link
+ link: /devices/
+ details: How Scratch interacts with programmable hardware components.
+
+---
+
+#
+
+::: info
+
+This specification is a **work in progress**. Some pages may be moved, some sections are not yet written, and some ideas are still in the works. Check back for updates!
+
+:::
+
+## Contents
+
+* [Scratch Specification](#)
+ * [Contents](#contents)
+ * [Introduction](/intro/)
+ * [Preliminaries](/intro/#preliminaries)
+ * [Sources](/intro/#sources)
+ * [Contributing](/intro/#contributing)
+ * [FAQ](/intro/#faq)
+ * [Where to start?](/intro/#where-to-start)
+ * [What's the point?](/intro/#whats-the-point)
+ * [Why?](/intro/#why)
+ * [TODO](#todo)
+ * [TODO: Blocks](#todo-blocks)
+ * [Concepts](/concepts/)
+ * [Capabilities](/concepts/#capabilities)
+ * [Constants](/concepts/#constants)
+ * [Stage Bounds](/concepts/#stage-bounds)
+ * [Stage Width](/concepts/#stage-width)
+ * [Stage Height](/concepts/#stage-height)
+ * [Left Edge](/concepts/#left-edge)
+ * [Right Edge](/concepts/#right-edge)
+ * [Top Edge](/concepts/#top-edge)
+ * [Bottom Edge](/concepts/#bottom-edge)
+ * [Limits](/concepts/#limits)
+ * [Max Items](/concepts/#max-items)
+ * [Max Clones](/concepts/#max-clones)
+ * [Ideas](/concepts/#ideas)
+ * [Asset](/concepts/#asset)
+ * [Costume](/concepts/#costume)
+ * [Sound](/concepts/#sound)
+ * [Block](/concepts/#block)
+ * [Standard Blocks](/concepts/#standard-blocks)
+ * [Hidden Blocks](/concepts/#hidden-blocks)
+ * [Clone](/concepts/#clone)
+ * [Edge](/concepts/#edge)
+ * [Flag](/concepts/#flag)
+ * [JavaScript](/concepts/#javascript)
+ * [List](/concepts/#list)
+ * [Mod](/concepts/#mod)
+ * [Opcode](/concepts/#opcode)
+ * [Project](/concepts/#project)
+ * [Runtime](/concepts/#runtime)
+ * [Script](/concepts/#script)
+ * [Sprite](/concepts/#sprite)
+ * [Stage](/concepts/#stage)
+ * [Target](/concepts/#target)
+ * [User](/concepts/#user)
+ * [Variable](/concepts/#variable)
+ * [Values](/concepts/#values)
+ * [Value](/concepts/#value)
+ * [Angle](/concepts/#angle)
+ * [Answer](/concepts/#answer)
+ * [Boolean](/concepts/#boolean)
+ * [True](/concepts/#true)
+ * [False](/concepts/#false)
+ * [Direction](/concepts/#direction)
+ * [Integer](/concepts/#integer)
+ * [Item](/concepts/#item)
+ * [Key](/concepts/#key)
+ * [Length](/concepts/#length)
+ * [Letter](/concepts/#letter)
+ * [Name](/concepts/#name)
+ * [Number](/concepts/#number)
+ * [Infinity](/concepts/#infinity)
+ * [-Infinity](/concepts/#-infinity)
+ * [NaN](/concepts/#nan)
+ * [Rotation Style](/concepts/#rotation-style)
+ * [Rotation Style: All Around](/concepts/#rotation-style-all-around)
+ * [Rotation Style: Left-Right](/concepts/#rotation-style-left-right)
+ * [Rotation Style: Don't Rotate](/concepts/#rotation-style-dont-rotate)
+ * [String](/concepts/#string)
+ * [Empty String](/concepts/#empty-string)
+ * [Undefined](/concepts/#undefined)
+ * [Username](/concepts/#username)
+ * [X Position](/concepts/#x-position)
+ * [Y Position](/concepts/#y-position)
+ * [Other Values](/concepts/#other-values)
+ * [Procedures](/concepts/#procedures)
+ * [Casting](/concepts/#casting)
+ * [To String](/concepts/#to-string)
+ * [To Number](/concepts/#to-number)
+ * [To Boolean](/concepts/#to-boolean)
+ * [Falsy](/concepts/#falsy)
+ * [Truthy](/concepts/#truthy)
+ * [To Direction](/concepts/#to-direction)
+ * [Fencing](/concepts/#fencing)
+ * [Fencing Position](/concepts/#fencing-position)
+ * [Fencing Size](/concepts/#fencing-size)
+ * [Palette](#palette)
+ * [Example block](#example-block)
+ * [Motion blocks](#motion-blocks)
+ * [Standard motion blocks](#standard-motion-blocks)
+ * [motion\_movesteps](#motion_movesteps)
+ * [Hidden motion blocks](#hidden-motion-blocks)
+ * [Looks blocks](#looks-blocks)
+ * [Standard looks blocks](#standard-looks-blocks)
+ * [Hidden looks blocks](#hidden-looks-blocks)
+ * [Sound blocks](#sound-blocks)
+ * [Standard sound blocks](#standard-sound-blocks)
+ * [Hidden sound blocks](#hidden-sound-blocks)
+ * [Events blocks](#events-blocks)
+ * [Standard events blocks](#standard-events-blocks)
+ * [Hidden events blocks](#hidden-events-blocks)
+ * [Control blocks](#control-blocks)
+ * [Standard control blocks](#standard-control-blocks)
+ * [Hidden control blocks](#hidden-control-blocks)
+ * [Sensing blocks](#sensing-blocks)
+ * [Standard sensing blocks](#standard-sensing-blocks)
+ * [sensing\_username](#sensing_username)
+ * [Hidden sensing blocks](#hidden-sensing-blocks)
+ * [Operators blocks](#operators-blocks)
+ * [Standard operators blocks](#standard-operators-blocks)
+ * [Hidden operators blocks](#hidden-operators-blocks)
+ * [Variables blocks](#variables-blocks)
+ * [Standard variables blocks](#standard-variables-blocks)
+ * [Hidden variables blocks](#hidden-variables-blocks)
+ * [List blocks](#list-blocks)
+ * [Standard list blocks](#standard-list-blocks)
+ * [Hidden list blocks](#hidden-list-blocks)
+ * [Custom blocks](#custom-blocks)
+ * [Standard custom blocks](#standard-custom-blocks)
+ * [Hidden custom blocks](#hidden-custom-blocks)
+ * [Special custom blocks](#special-custom-blocks)
+ * [Music blocks](#music-blocks)
+ * [Pen blocks](#pen-blocks)
+ * [Video Sensing blocks](#video-sensing-blocks)
+ * [Text to Speech blocks](#text-to-speech-blocks)
+ * [Translate blocks](#translate-blocks)
+ * [Makey Makey blocks](#makey-makey-blocks)
+ * [micro:bit blocks](#microbit-blocks)
+ * [LEGO EV3 blocks](#lego-ev3-blocks)
+ * [BOOST blocks](#boost-blocks)
+ * [WeDo 2.0 blocks](#wedo-20-blocks)
+ * [Force and Acceleration blocks](#force-and-acceleration-blocks)
+ * [CoreEx blocks](#coreex-blocks)
+ * [Standard CoreEx blocks](#standard-coreex-blocks)
+ * [Hidden CoreEx blocks](#hidden-coreex-blocks)
+ * [Appendices](#appendices)
+ * [File Format](#file-format)
+ * [SB3](#sb3)
+ * [SB2](#sb2)
+ * [SB](#sb)
+ * [Obsolete Blocks](#obsolete-blocks)
+ * [Nonstandard Blocks](#nonstandard-blocks)
+ * [Example nonstandard block](#example-nonstandard-block)
+ * [TurboWarp](#turbowarp)
+ * [TurboWarp blocks](#turbowarp-blocks)
+ * [Last key pressed block](#last-key-pressed-block)
+ * [Addon blocks](#addon-blocks)
+ * [PenguinMod](#penguinmod)
+ * [snail-ide](#snail-ide)
+ * [Unsandboxed](#unsandboxed)
+ * [Adding Platforms](#adding-platforms)
diff --git a/intro/index.md b/intro/index.md
new file mode 100644
index 0000000..22f166f
--- /dev/null
+++ b/intro/index.md
@@ -0,0 +1,70 @@
+# Introduction
+
+This document is a serious attempt to create a [programming language specification](https://en.wikipedia.org/wiki/Programming_language_specification) of [Scratch 3.0](https://en.scratch-wiki.info/wiki/scratch_3.0). It will detail the exact behavior of Scratch so that it can be accurately reproducible from this document alone, preserving its behavior and aiding in [ports](https://en.wikipedia.org/wiki/Porting) of it to other platforms. This project is entirely "for fun" (note the quotation marks) and is not affilated with the [Scratch Foundation](https://www.scratchfoundation.org/) or related parties in any way whatsoever, though please [donate](https://www.scratchfoundation.org/donate) to them if you can so that they may continue to support and improve [Scratch](https://scratch.mit.edu/) for all.
+
+## Preliminaries
+
+Before reading this specification:
+
+* **Be sure to have an understanding of computer science.** A good vocabulary, knowledge, and understanding of computational concepts is useful.
+* **Being experienced with working in Scratch is immensely helpful.** Although this specification will try to explain it in full, knowing the basic concepts and quirks of Scratch just by experience will let you skim through this document easily, as not all of it is necessary to read; just to reference for accuracy.
+* Scratch 3.0 is built upon the modern web; although not entirely necessary, **a basic knowledge of [JavaScript](https://en.wikipedia.org/wiki/JavaScript) can come in handy** when it comes to understanding the inner workings, logic, and rules of Scratch, as it is what Scratch runs on. Scratch does a lot of things the same way JavaScript does.
+* **Be familiar with the [scratchblocks](https://scratchblocks.github.io/) [syntax](https://en.scratch-wiki.info/wiki/Block_Plugin/Syntax).** This text-based format is used to represent Scratch [blocks](#block). An option to render the scratchblocks while viewing in-browser is being considered; however, the shapes and colors of the blocks are not necessarily being documented here, but rather their functionality.
+
+## Sources
+
+The information about Scratch in this specification is, of course, derived from Scratch sources, e.g. the Scratch [VM](https://github.com/scratchfoundation/scratch-vm), [Wiki](https://scratch-wiki.info/), [Website](https://scratch.mit.edu/), [Editor](https://scratch.mit.edu/projects/editor), and [Discussion Forums](https://scratch.mit.edu/discuss/). [Wikipedia](https://wikipedia.org/wiki/Wikipedia:About) and [MDN Web Docs](https://developer.mozilla.org/) are linked to as well for additional information regarding general concepts and internal behaviors.
+
+## Contributing
+
+Please [contribute on GitHub](https://github.com/OceanIsEndless/scratch-spec/pulls) (must be **13** or older, [need a GitHub account](https://github.com/signup)) or [comment on my Scratch profile](https://scratch.mit.edu/users/Endless-Ocean/#comments) (just [need a Scratch account](https://scratch.mit.edu/join)) if you can:
+
+* **Summarize** key **points** of sections (things can get *ridiculously wordy* at times)
+* **Provide insight** into the workings of Scratch (know info that should be here)
+* **Fact check** info to verify accuracy (add links to projects, code, wiki, forums)
+* Make sure everything looks good (**correct formatting, spelling, grammar**)
+* **Give** some **ideas**, **motivation**, or **feedback** for improving this specification
+
+## FAQ
+
+*Questions that would be frequently asked if someone were to ask them.*
+
+### Where to start?
+
+* If you want a **general understanding** of Scratch's inner workings for whatever reason, find whatever interests you in the [table of contents](/#contents) and just gloss over whatever you don't need to know.
+* If you want **formal definitions** of Scratch terms, see [concepts](/concepts/).
+* If you want to accurately **recreate blocks**, see the [palette](/palette/).
+ * If you want to recreate old blocks, see [obsolete blocks](/palette/#obsolete-blocks).
+ * If you want more blocks, see [nonstandard blocks](/palette/#nonstandard-blocks).
+* If you want to know **how scripts run**, see [runtime](/runtime/).
+* If you want to learn about project files, see [files](/files/).
+* If you want an in-depth explanation of Scratch's **input and output systems**, see [I/O](/io/).
+* If you want to understand how Scratch handles **cloud variables** and other **web requests**, see [Networking](/network/).
+* If you want a deep dive into Scratch Link and Scratch-to-hardware connectivity, see [Devices](/devices/).
+
+### What's the point?
+
+This specification exists to document the behavior of Scratch 3.0 as a programming language. It can open the door to:
+
+* **Accurately porting Scratch to run natively on other platforms**
+ * It could help efforts to make Scratch available on platforms that aren't web-based (if any).
+ * @OceanIsEndless, the initial creator of this specification, has a lot of wild ideas on their mind regarding Scratch. Their ideas are likely not at all worth their time, but writing this spec will allow them to try doing interesting things such as creating a Scratch to [Desmos](https://www.desmos.com/calculator) packager, or porting Scratch to the [Wii](https://en.wikipedia.org/wiki/Wii). A bit ambitious, yes, and absolutely crazy—but a specification like this could aid projects like these and more. It can help ensure compatibility and easy coding.
+ * It could help this super cool rapidly-developing [3DS port](https://github.com/NateXS/Scratch-3DS), though the spec may not be done before contributors over there figure out how Scratch works for themselves anyway. :)
+* **Recreating parts of Scratch (blocks, scripts) for demonstration**
+ * For educational reasons, one might want to recreate the behavior of certain parts of Scratch without the full force of the Scratch editor on hand. This spec will eventually provide information ranging from exact block behaviors to full-on runtime execution, making understanding the way each part of Scratch works simple.
+* **Improving Scratch in the future while keeping it 100% compatible**
+ * It isn't known if this spec will reach a state that the developers of Scratch could use as reference, but if so, it could help ensure that Scratch projects remain functionally the same after code rewrites.
+* **Directly citing the workings of Scratch without linking wikis or code**
+ * Although the [Scratch Wiki](https://scratch-wiki.info/) and code of Scratch work well for showing Scratch concepts and runtime behavior, one of them tends to abstract away particular functionalities while the other offers thousands of lines of pure [JavaScript](#javascript). This specification is meant to serve as one clear and concise document explaining the behaviors, blocks, and quirks of Scratch 3.0 in all its blocky glory.
+* **Reimplementing Scratch 3.0 in case of catastrophe**
+ * This kind of blends together all of the previous points. If the Scratch editor were to magically disappear or break entirely (it won't, but in theory), then the Scratch Wiki could guide you in making a fairly accurate reimplementation of Scratch, but would fall short in exactly reproducing the runtime behavior, procedures, and quirks of Scratch, from scratch (literally). Although the wiki strives to be all-encompassing (and it is indeed very far-reaching), a document solely dedicated to the functionality of Scratch will help preserve its literal, programmatic behavior in one organized doc.
+* **"Real" programming languages have them.**
+ * [Scratch is cool](https://blob.codes/scratch-is-cool/). It is [Turing-complete](https://en.wikipedia.org/wiki/Turing_completeness). Lots of languages far less significant than Scratch have [programming language specifications](https://en.wikipedia.org/wiki/Programming_language_specification). And yet Scratch lacks one. The Scratch Wiki helps document the **ideas** of Scratch, but a singular document dedicated to specifying *exactly* all that Scratch does could help it secure official programming language status.
+* **Who knows what?**
+ * If this spec is made reliable enough, it could be cited (or at least, the underlying sources that it will eventually reference for verifability) in the underdeveloped [Wikipedia page about Scratch ***as a programming language***](https://en.wikipedia.org/wiki/Scratch_(programming_language)).
+
+It could be argued that this specification is reinventing the wheel in some ways. However, if it is ever completed, it could serve as a great resource for Scratch 3.0.
+
+### Why?
+
+Why not?
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..458eeb5
--- /dev/null
+++ b/package.json
@@ -0,0 +1,7 @@
+{
+ "scripts": {
+ "docs:dev": "vitepress dev ./",
+ "docs:build": "vitepress build ./",
+ "docs:preview": "vitepress preview ./"
+ }
+}
\ No newline at end of file
From c6001749afb5ea03d04f0218883c6aace98aa5fc Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Tue, 29 Jul 2025 17:35:36 -0400
Subject: [PATCH 02/20] fix some links
---
concepts/index.md | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/concepts/index.md b/concepts/index.md
index 8bac4dd..3086219 100644
--- a/concepts/index.md
+++ b/concepts/index.md
@@ -133,9 +133,9 @@ Blocks can be run, meaning that its operation is performed using the arguments i
### Clone
-A copy created of a [sprite](#sprite) that has all of the original sprite's code, images, and sounds, but operates independently of it. Unlike sprites, clones cannot be directly referenced via existing blocks (e.g. you cannot [glide to](#glide-to-block) it directly without knowing its position ahead of time, as it cannot be selected in the sprite dropdown menu), and exist as their own thing. They are deleted every time the [flag](#flag) is clicked, and can also be deleted manually using the [`delete this clone` block](#delete-clone-block).
+A copy created of a [sprite](#sprite) that has all of the original sprite's code, images, and sounds, but operates independently of it. Unlike sprites, clones cannot be directly referenced via existing blocks (e.g. you cannot [glide to](/palette/#glide-to-block) it directly without knowing its position ahead of time, as it cannot be selected in the sprite dropdown menu), and exist as their own thing. They are deleted every time the [flag](#flag) is clicked, and can also be deleted manually using the [`delete this clone` block](/palette/#delete-clone-block).
-Clones can be created with the [create clone block](#create-clone-block) so long as the [maximum number of clones](#max-clones) has not been reached. Code can be written specifically for the clones of a sprite via the use of the [when I start as a clone block](#when-i-start-as-a-clone-block). The [stage](#stage) is the [target](#target) which cannot be cloned, whereas both sprites *and clones* can themselves be cloned.
+Clones can be created with the [create clone block](/palette/#create-clone-block) so long as the [maximum number of clones](#max-clones) has not been reached. Code can be written specifically for the clones of a sprite via the use of the [when I start as a clone block](/palette/#when-i-start-as-a-clone-block). The [stage](#stage) is the [target](#target) which cannot be cloned, whereas both sprites *and clones* can themselves be cloned.
### Edge
@@ -147,7 +147,7 @@ A boundary around the viewing area of the [stage](#stage) that restricts the [co
> The usefulness of defining "Flag" is up for debate. Feel free to offer insight!
-The button that is clicked to start a project. It is also known as the green flag. In simple terms, it makes the project `Go`. When clicked, it runs any scripts placed under [when flag clicked blocks](#when-flag-clicked-block).
+The button that is clicked to start a project. It is also known as the green flag. In simple terms, it makes the project `Go`. When clicked, it runs any scripts placed under [when flag clicked blocks](/palette/#when-flag-clicked-block).
### JavaScript
@@ -161,19 +161,19 @@ A series of [items](#item) stored together in sequence. Each item is referenced
### Mod
-A modification (altered version) of the Scratch 3.0 [runtime](#runtime) that is nonstandard and may introduce new blocks, features, or changes not present in standard Scratch. The majority of this spec will be documenting standard Scratch behavior. For information on nonstandard blocks and behaviors in mods, see the [relevant appendix](#nonstandard-blocks).
+A modification (altered version) of the Scratch 3.0 [runtime](#runtime) that is nonstandard and may introduce new blocks, features, or changes not present in standard Scratch. The majority of this spec will be documenting standard Scratch behavior. For information on nonstandard blocks and behaviors in mods, see the [relevant appendix](/palette/#nonstandard-blocks).
### Opcode
-A [name](#name) unique to every [block](#block) in the Scratch programming language. It tells blocks what to do. For example, if the opcode of a block is [`motion_movesteps`](#motion_movesteps), it attempts to move steps.
+A [name](#name) unique to every [block](#block) in the Scratch programming language. It tells blocks what to do. For example, if the opcode of a block is [`motion_movesteps`](/palette/#motion_movesteps), it attempts to move steps.
### Project
-A [stage](#stage) and optionally some [sprites](#sprite) packaged together to do something. They can be loaded into a [runtime](#runtime) and executed. They can also be saved as [project files](#file-format).
+A [stage](#stage) and optionally some [sprites](#sprite) packaged together to do something. They can be loaded into a [runtime](#runtime) and executed. They can also be saved as [project files](/files/).
### Runtime
-The environment in which a [project](#project) is run. It keeps track of the project's current state and executes its code. [Projects files can be loaded into and saved from runtimes](#file-format).
+The environment in which a [project](#project) is run. It keeps track of the project's current state and executes its code. [Projects files can be loaded into and saved from runtimes](/files/).
### Script
@@ -219,7 +219,7 @@ A [named](#name) container belonging to a [target](#target) that holds exactly o
Some variables are created on a project-by-project basis for general use by [scripts](#script). For example, a `(score)` variable can be created to keep track of an arbitrary point value. Others are directly built into the [runtime](#runtime) and cannot be deleted. For example, the [`(x position)`](#x-position) variable always exists in every [sprite](#sprite) to set its rendered horizontal position.
-General purpose variables can be interacted with using [variables blocks](#variables-blocks). Runtime variables have their own dedicated blocks instead and are usually limited or sandboxed in some way, unlike general purpose variables.
+General purpose variables can be interacted with using [variables blocks](/palette/#variables-blocks). Runtime variables have their own dedicated blocks instead and are usually limited or sandboxed in some way, unlike general purpose variables.
## Values
@@ -247,7 +247,7 @@ A [number](#number) intended to be in [degrees](https://en.wikipedia.org/wiki/De
### Answer
-A [string](#string) provided to the [project](#project) by the [user](#user) as input via the [ask and wait block](#ask-and-wait-block).
+A [string](#string) provided to the [project](#project) by the [user](#user) as input via the [ask and wait block](/palette/#ask-and-wait-block).
### Boolean
@@ -365,15 +365,15 @@ The following table describes a sprite's *rendered* direction when using differe
#### Rotation Style: All Around
-
+
#### Rotation Style: Left-Right
-
+
#### Rotation Style: Don't Rotate
-
+
### String
@@ -381,7 +381,7 @@ A type of [value](#value) consisting of a series (i.e. string) of [letters](#let
#### Empty String
-A [string](#string) containing no letters. It has a [length](#length) of `0` and is one of the only strings considered [falsy](#falsy). Also known as a "null string," it is typically used in place of a value where there is none, e.g. getting an [item](#item) from a [list](#list) when it does not exist, or getting the [answer](#answer) provided by a user when they have not been [asked](#ask-and-wait-block) anything yet.
+A [string](#string) containing no letters. It has a [length](#length) of `0` and is one of the only strings considered [falsy](#falsy). Also known as a "null string," it is typically used in place of a value where there is none, e.g. getting an [item](#item) from a [list](#list) when it does not exist, or getting the [answer](#answer) provided by a user when they have not been [asked](/palette/#ask-and-wait-block) anything yet.
### Undefined
@@ -403,7 +403,7 @@ Also, official ("real") usernames are registered with the [Scratch website](http
Official usernames can only be changed under extraordinarily rare circumstances (e.g. the username contained sensitive information about the user that the [Scratch team](https://en.scratch-wiki.info/wiki/Scratch_Team) decided to change for them), meaning that once it is created, it usually cannot be altered later.
-Scripts can detect the current user's username via the [(`username`) block](#username-block). If the user is signed in, the block reports their username. If the user is signed out, the block reports an [empty string](#empty-string). In the official Scratch editor, the username reported by the username block should remain constant for the entire run of the project.
+Scripts can detect the current user's username via the [(`username`) block](/palette/#username-block). If the user is signed in, the block reports their username. If the user is signed out, the block reports an [empty string](#empty-string). In the official Scratch editor, the username reported by the username block should remain constant for the entire run of the project.
> The only exception to this rule in official contexts is when the user does the following steps in sequence:
>
@@ -447,7 +447,7 @@ They will not be specified in this specification as of yet (since they cannot be
* `null`: A special value representing nothing. Distinct from [undefined](#undefined) in that it is meant to *explicitly* be nothing, whereas undefined exists for representing unknown behavior or values.
* The writers of this specification do not know if `null` can be produced by existing blocks without modification.
* If it is found to be an obtainable value, it may be documented further. Otherwise, it will not be, and is likely not necessary for inclusion in a reimplementation of Scratch.
- * This value can be casted to other data types. (`null` was obtained via "custom extensions" in [a modification of Scratch](#turbowarp) that still has largely the same behaviors as standard Scratch to see how it would behave if somehow obtained.)
+ * This value can be casted to other data types. (`null` was obtained via "custom extensions" in [a modification of Scratch](/palette/#turbowarp) that still has largely the same behaviors as standard Scratch to see how it would behave if somehow obtained.)
* When [casted](#to-string) to a [string](#string), it is written as `null`.
* When [casted](#to-number) to a [number](#number), it is casted to `0`.
* When [casted](#to-boolean) to a [boolean](#boolean), it is [`false`](#falsy).
From 44aca9c94a7e9d1867c3b4251f9bb2e66fcb8727 Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Tue, 29 Jul 2025 17:44:15 -0400
Subject: [PATCH 03/20] Set up Pages for Vitepress
---
.github/workflows/deploy.yml | 66 ++++++++++++++++++++++++++++++++++++
.vitepress/config.mts | 1 +
2 files changed, 67 insertions(+)
create mode 100644 .github/workflows/deploy.yml
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..bde689e
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,66 @@
+# Sample workflow for building and deploying a VitePress site to GitHub Pages
+#
+name: Deploy VitePress site to Pages
+
+on:
+ # Runs on pushes targeting the `main` branch. Change this to `master` if you're
+ # using the `master` branch as the default branch.
+ push:
+ branches: [vitepress]
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
+# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
+concurrency:
+ group: pages
+ cancel-in-progress: false
+
+jobs:
+ # Build job
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0 # Not needed if lastUpdated is not enabled
+ # - uses: pnpm/action-setup@v3 # Uncomment this block if you're using pnpm
+ # with:
+ # version: 9 # Not needed if you've set "packageManager" in package.json
+ # - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 22
+ cache: npm # or pnpm / yarn
+ - name: Setup Pages
+ uses: actions/configure-pages@v4
+ - name: Install dependencies
+ run: npm ci # or pnpm install / yarn install / bun install
+ - name: Build with VitePress
+ run: npm run docs:build # or pnpm docs:build / yarn docs:build / bun run docs:build
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: .vitepress/dist
+
+ # Deployment job
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ needs: build
+ runs-on: ubuntu-latest
+ name: Deploy
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
\ No newline at end of file
diff --git a/.vitepress/config.mts b/.vitepress/config.mts
index e5737a3..9f9aa84 100644
--- a/.vitepress/config.mts
+++ b/.vitepress/config.mts
@@ -3,6 +3,7 @@ import { defineConfig } from 'vitepress'
// https://vitepress.dev/reference/site-config
export default defineConfig({
title: "Scratch Specification",
+ base: "/scratch-spec/",
themeConfig: {
// https://vitepress.dev/reference/default-theme-config
From a55ca224fbf79a666dcc4219659ef3af37af5671 Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Tue, 29 Jul 2025 17:46:53 -0400
Subject: [PATCH 04/20] Here we go again
---
.vitepress/config.mts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.vitepress/config.mts b/.vitepress/config.mts
index 9f9aa84..0201071 100644
--- a/.vitepress/config.mts
+++ b/.vitepress/config.mts
@@ -3,7 +3,7 @@ import { defineConfig } from 'vitepress'
// https://vitepress.dev/reference/site-config
export default defineConfig({
title: "Scratch Specification",
- base: "/scratch-spec/",
+ base: "/",
themeConfig: {
// https://vitepress.dev/reference/default-theme-config
From aa3ca6df899e82c0e1f90b02605732c36cf6b304 Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Tue, 29 Jul 2025 17:52:53 -0400
Subject: [PATCH 05/20] testing testing 123
---
.vitepress/config.mts | 2 +-
bun.lock | 345 ++++++++++++++++++++++++++++++++++++++++++
package.json | 6 +-
3 files changed, 349 insertions(+), 4 deletions(-)
create mode 100644 bun.lock
diff --git a/.vitepress/config.mts b/.vitepress/config.mts
index 0201071..96a8ec2 100644
--- a/.vitepress/config.mts
+++ b/.vitepress/config.mts
@@ -3,7 +3,7 @@ import { defineConfig } from 'vitepress'
// https://vitepress.dev/reference/site-config
export default defineConfig({
title: "Scratch Specification",
- base: "/",
+ base: "/spec/",
themeConfig: {
// https://vitepress.dev/reference/default-theme-config
diff --git a/bun.lock b/bun.lock
new file mode 100644
index 0000000..86f143f
--- /dev/null
+++ b/bun.lock
@@ -0,0 +1,345 @@
+{
+ "lockfileVersion": 1,
+ "workspaces": {
+ "": {
+ "dependencies": {
+ "vitepress": "^1.6.3"
+ }
+ }
+ },
+ "packages": {
+ "@algolia/autocomplete-core": ["@algolia/autocomplete-core@1.17.7", "", { "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", "@algolia/autocomplete-shared": "1.17.7" } }, "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q=="],
+
+ "@algolia/autocomplete-plugin-algolia-insights": ["@algolia/autocomplete-plugin-algolia-insights@1.17.7", "", { "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A=="],
+
+ "@algolia/autocomplete-preset-algolia": ["@algolia/autocomplete-preset-algolia@1.17.7", "", { "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA=="],
+
+ "@algolia/autocomplete-shared": ["@algolia/autocomplete-shared@1.17.7", "", { "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg=="],
+
+ "@algolia/client-abtesting": ["@algolia/client-abtesting@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-M4zb6J7q+pg9V9Xk0k1WDgvupfCtXcxjKGTrNVYemiredLVGOmvVIPAUjg2rx4QmK7DWNApWLsieYwk7PAaOXw=="],
+
+ "@algolia/client-analytics": ["@algolia/client-analytics@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-h18zlL+bVUlbNE92olo1d/r6HQPkxhmP7yCpA1osERwpgC6F058kWm0O0aYdrHJIHtWBcs9aRqq7IkQSkpjPJg=="],
+
+ "@algolia/client-common": ["@algolia/client-common@5.34.1", "", {}, "sha512-otPWALs72KvmVuP0CN0DI6sqVx1jQWKi+/DgAiP8DysVMgiNlva3GDKTtAK6XVGlT08f4h32FNuL0yQODuCfKA=="],
+
+ "@algolia/client-insights": ["@algolia/client-insights@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-SNDb5wuEpQFM6S5Shk2iytLMusvGycm9uTuYh7cGa1h3U7O65OjjjIgQ0lLY5HPybHNtmXr4Zh/EZ23pZvAJHg=="],
+
+ "@algolia/client-personalization": ["@algolia/client-personalization@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-T8z9KqYJOup83Hw0mgICYWfJoLh//FNWbf4roFd95ZJzZ4v1cN/hvr7Eqml1qWMoCkJb4y/XQjrXsJ6Y9XnMLw=="],
+
+ "@algolia/client-query-suggestions": ["@algolia/client-query-suggestions@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-YA0kC4CwO1mc1dliNgbFgToweRa7Uihjz3izEaV4cXninF1v4SaOrPkQUsiFPprAffjMzOUoT7vahQZ/HZyiKQ=="],
+
+ "@algolia/client-search": ["@algolia/client-search@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-bt5hC9vvjaKvdvsgzfXJ42Sl3qjQqoi/FD8V7HOQgtNFhwSauZOlgLwFoUiw67sM+r7ehF7QDk5WRDgY7fAkIg=="],
+
+ "@algolia/ingestion": ["@algolia/ingestion@1.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-QLxiBskQxFGzPqKZvBNEvNN95kgDCbBd2X29ZGfh6Sr2QOSU34US6Z9x2duiF4o9FwsB0i6eQ2c9vHfuH0lAQg=="],
+
+ "@algolia/monitoring": ["@algolia/monitoring@1.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-NteCvWcWXXdnPGyZH8rXHslcf2pM1WGDNMGNZFXLFtOt1Gf1Tjy2t0NZLp+Mxap3JMV4mbYmactbXrvpQf/lLA=="],
+
+ "@algolia/recommend": ["@algolia/recommend@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-UdgDSrunLIBAAAxQlYLXYLnYFN4wkzkrAYx+wMLEk/pzASWyza3BkecbUFVqoYOBIgwo7Mt4iymzVtFkzL2uCQ=="],
+
+ "@algolia/requester-browser-xhr": ["@algolia/requester-browser-xhr@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1" } }, "sha512-567LfFTc9VOiPtuySQohoqaWMeohYWbXK71aMSin+SLMgeKX7hz5LrVmkmMQj9udwWK6/mtHEYZGPYHSuXpLQg=="],
+
+ "@algolia/requester-fetch": ["@algolia/requester-fetch@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1" } }, "sha512-YRbygPgGBEik5U593JvyjgxFjcsyZMR25eIQxNHvSQumdAzt5A4E4Idw3yXnwhrmMdjML54ZXT7EAjnTjWy8Xw=="],
+
+ "@algolia/requester-node-http": ["@algolia/requester-node-http@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1" } }, "sha512-o0mqRYbS82Rt4DE02Od7RL6pNtV7oSxScPuIw8LW4aqO2V5eCF05Pry/SnUgcI/Vb2QCYC66hytBCqzyC/toZA=="],
+
+ "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
+
+ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="],
+
+ "@babel/parser": ["@babel/parser@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.0" }, "bin": "./bin/babel-parser.js" }, "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g=="],
+
+ "@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="],
+
+ "@docsearch/css": ["@docsearch/css@3.8.2", "", {}, "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ=="],
+
+ "@docsearch/js": ["@docsearch/js@3.8.2", "", { "dependencies": { "@docsearch/react": "3.8.2", "preact": "^10.0.0" } }, "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ=="],
+
+ "@docsearch/react": ["@docsearch/react@3.8.2", "", { "dependencies": { "@algolia/autocomplete-core": "1.17.7", "@algolia/autocomplete-preset-algolia": "1.17.7", "@docsearch/css": "3.8.2", "algoliasearch": "^5.14.2" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 19.0.0", "react": ">= 16.8.0 < 19.0.0", "react-dom": ">= 16.8.0 < 19.0.0", "search-insights": ">= 1 < 3" }, "optionalPeers": ["@types/react", "react", "react-dom", "search-insights"] }, "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg=="],
+
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="],
+
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="],
+
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="],
+
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="],
+
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="],
+
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="],
+
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="],
+
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="],
+
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="],
+
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="],
+
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="],
+
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="],
+
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="],
+
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="],
+
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="],
+
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="],
+
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="],
+
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="],
+
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="],
+
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="],
+
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="],
+
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="],
+
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="],
+
+ "@iconify-json/simple-icons": ["@iconify-json/simple-icons@1.2.44", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-CdWgSPygwDlDbKtDWjvi3NtUefnkoepXv90n3dQxJerqzD9kI+nEJOiWUBM+eOyMYQKtxBpLWFBrgeotF0IZKw=="],
+
+ "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.4", "", {}, "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw=="],
+
+ "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.45.1", "", { "os": "android", "cpu": "arm" }, "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA=="],
+
+ "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.45.1", "", { "os": "android", "cpu": "arm64" }, "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ=="],
+
+ "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.45.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA=="],
+
+ "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.45.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og=="],
+
+ "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.45.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g=="],
+
+ "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.45.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A=="],
+
+ "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.45.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q=="],
+
+ "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.45.1", "", { "os": "linux", "cpu": "arm" }, "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q=="],
+
+ "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.45.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw=="],
+
+ "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.45.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog=="],
+
+ "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg=="],
+
+ "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.45.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg=="],
+
+ "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw=="],
+
+ "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA=="],
+
+ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.45.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw=="],
+
+ "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.45.1", "", { "os": "linux", "cpu": "x64" }, "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw=="],
+
+ "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.45.1", "", { "os": "linux", "cpu": "x64" }, "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw=="],
+
+ "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.45.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg=="],
+
+ "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.45.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw=="],
+
+ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.45.1", "", { "os": "win32", "cpu": "x64" }, "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA=="],
+
+ "@shikijs/core": ["@shikijs/core@2.5.0", "", { "dependencies": { "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg=="],
+
+ "@shikijs/engine-javascript": ["@shikijs/engine-javascript@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^3.1.0" } }, "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w=="],
+
+ "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw=="],
+
+ "@shikijs/langs": ["@shikijs/langs@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0" } }, "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w=="],
+
+ "@shikijs/themes": ["@shikijs/themes@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0" } }, "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw=="],
+
+ "@shikijs/transformers": ["@shikijs/transformers@2.5.0", "", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/types": "2.5.0" } }, "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg=="],
+
+ "@shikijs/types": ["@shikijs/types@2.5.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw=="],
+
+ "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
+
+ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+
+ "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
+
+ "@types/linkify-it": ["@types/linkify-it@5.0.0", "", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="],
+
+ "@types/markdown-it": ["@types/markdown-it@14.1.2", "", { "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" } }, "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog=="],
+
+ "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
+
+ "@types/mdurl": ["@types/mdurl@2.0.0", "", {}, "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="],
+
+ "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
+
+ "@types/web-bluetooth": ["@types/web-bluetooth@0.0.21", "", {}, "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="],
+
+ "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
+
+ "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.4", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA=="],
+
+ "@vue/compiler-core": ["@vue/compiler-core@3.5.18", "", { "dependencies": { "@babel/parser": "^7.28.0", "@vue/shared": "3.5.18", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw=="],
+
+ "@vue/compiler-dom": ["@vue/compiler-dom@3.5.18", "", { "dependencies": { "@vue/compiler-core": "3.5.18", "@vue/shared": "3.5.18" } }, "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A=="],
+
+ "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.18", "", { "dependencies": { "@babel/parser": "^7.28.0", "@vue/compiler-core": "3.5.18", "@vue/compiler-dom": "3.5.18", "@vue/compiler-ssr": "3.5.18", "@vue/shared": "3.5.18", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA=="],
+
+ "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.18", "", { "dependencies": { "@vue/compiler-dom": "3.5.18", "@vue/shared": "3.5.18" } }, "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g=="],
+
+ "@vue/devtools-api": ["@vue/devtools-api@7.7.7", "", { "dependencies": { "@vue/devtools-kit": "^7.7.7" } }, "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg=="],
+
+ "@vue/devtools-kit": ["@vue/devtools-kit@7.7.7", "", { "dependencies": { "@vue/devtools-shared": "^7.7.7", "birpc": "^2.3.0", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", "superjson": "^2.2.2" } }, "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA=="],
+
+ "@vue/devtools-shared": ["@vue/devtools-shared@7.7.7", "", { "dependencies": { "rfdc": "^1.4.1" } }, "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw=="],
+
+ "@vue/reactivity": ["@vue/reactivity@3.5.18", "", { "dependencies": { "@vue/shared": "3.5.18" } }, "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg=="],
+
+ "@vue/runtime-core": ["@vue/runtime-core@3.5.18", "", { "dependencies": { "@vue/reactivity": "3.5.18", "@vue/shared": "3.5.18" } }, "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w=="],
+
+ "@vue/runtime-dom": ["@vue/runtime-dom@3.5.18", "", { "dependencies": { "@vue/reactivity": "3.5.18", "@vue/runtime-core": "3.5.18", "@vue/shared": "3.5.18", "csstype": "^3.1.3" } }, "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw=="],
+
+ "@vue/server-renderer": ["@vue/server-renderer@3.5.18", "", { "dependencies": { "@vue/compiler-ssr": "3.5.18", "@vue/shared": "3.5.18" }, "peerDependencies": { "vue": "3.5.18" } }, "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA=="],
+
+ "@vue/shared": ["@vue/shared@3.5.18", "", {}, "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA=="],
+
+ "@vueuse/core": ["@vueuse/core@12.8.2", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" } }, "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ=="],
+
+ "@vueuse/integrations": ["@vueuse/integrations@12.8.2", "", { "dependencies": { "@vueuse/core": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" }, "peerDependencies": { "async-validator": "^4", "axios": "^1", "change-case": "^5", "drauu": "^0.4", "focus-trap": "^7", "fuse.js": "^7", "idb-keyval": "^6", "jwt-decode": "^4", "nprogress": "^0.2", "qrcode": "^1.5", "sortablejs": "^1", "universal-cookie": "^7" }, "optionalPeers": ["async-validator", "axios", "change-case", "drauu", "focus-trap", "fuse.js", "idb-keyval", "jwt-decode", "nprogress", "qrcode", "sortablejs", "universal-cookie"] }, "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g=="],
+
+ "@vueuse/metadata": ["@vueuse/metadata@12.8.2", "", {}, "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A=="],
+
+ "@vueuse/shared": ["@vueuse/shared@12.8.2", "", { "dependencies": { "vue": "^3.5.13" } }, "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w=="],
+
+ "algoliasearch": ["algoliasearch@5.34.1", "", { "dependencies": { "@algolia/client-abtesting": "5.34.1", "@algolia/client-analytics": "5.34.1", "@algolia/client-common": "5.34.1", "@algolia/client-insights": "5.34.1", "@algolia/client-personalization": "5.34.1", "@algolia/client-query-suggestions": "5.34.1", "@algolia/client-search": "5.34.1", "@algolia/ingestion": "1.34.1", "@algolia/monitoring": "1.34.1", "@algolia/recommend": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-s70HlfBgswgEdmCYkUJG8i/ULYhbkk8N9+N8JsWUwszcp7eauPEr5tIX4BY0qDGeKWQ/qZvmt4mxwTusYY23sg=="],
+
+ "birpc": ["birpc@2.5.0", "", {}, "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ=="],
+
+ "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
+
+ "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
+
+ "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
+
+ "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
+
+ "copy-anything": ["copy-anything@3.0.5", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w=="],
+
+ "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
+
+ "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
+
+ "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
+
+ "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="],
+
+ "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
+
+ "esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="],
+
+ "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
+
+ "focus-trap": ["focus-trap@7.6.5", "", { "dependencies": { "tabbable": "^6.2.0" } }, "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg=="],
+
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+ "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="],
+
+ "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="],
+
+ "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="],
+
+ "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],
+
+ "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="],
+
+ "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
+
+ "mark.js": ["mark.js@8.11.1", "", {}, "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ=="],
+
+ "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="],
+
+ "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="],
+
+ "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="],
+
+ "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="],
+
+ "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="],
+
+ "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="],
+
+ "minisearch": ["minisearch@7.1.2", "", {}, "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA=="],
+
+ "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="],
+
+ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+
+ "oniguruma-to-es": ["oniguruma-to-es@3.1.1", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ=="],
+
+ "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
+
+ "preact": ["preact@10.26.9", "", {}, "sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA=="],
+
+ "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
+
+ "regex": ["regex@6.0.1", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA=="],
+
+ "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
+
+ "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="],
+
+ "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="],
+
+ "rollup": ["rollup@4.45.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.45.1", "@rollup/rollup-android-arm64": "4.45.1", "@rollup/rollup-darwin-arm64": "4.45.1", "@rollup/rollup-darwin-x64": "4.45.1", "@rollup/rollup-freebsd-arm64": "4.45.1", "@rollup/rollup-freebsd-x64": "4.45.1", "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", "@rollup/rollup-linux-arm-musleabihf": "4.45.1", "@rollup/rollup-linux-arm64-gnu": "4.45.1", "@rollup/rollup-linux-arm64-musl": "4.45.1", "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", "@rollup/rollup-linux-riscv64-gnu": "4.45.1", "@rollup/rollup-linux-riscv64-musl": "4.45.1", "@rollup/rollup-linux-s390x-gnu": "4.45.1", "@rollup/rollup-linux-x64-gnu": "4.45.1", "@rollup/rollup-linux-x64-musl": "4.45.1", "@rollup/rollup-win32-arm64-msvc": "4.45.1", "@rollup/rollup-win32-ia32-msvc": "4.45.1", "@rollup/rollup-win32-x64-msvc": "4.45.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw=="],
+
+ "search-insights": ["search-insights@2.17.3", "", {}, "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ=="],
+
+ "shiki": ["shiki@2.5.0", "", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/langs": "2.5.0", "@shikijs/themes": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ=="],
+
+ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
+ "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
+
+ "speakingurl": ["speakingurl@14.0.1", "", {}, "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ=="],
+
+ "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
+
+ "superjson": ["superjson@2.2.2", "", { "dependencies": { "copy-anything": "^3.0.2" } }, "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q=="],
+
+ "tabbable": ["tabbable@6.2.0", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="],
+
+ "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
+
+ "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="],
+
+ "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="],
+
+ "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
+
+ "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
+
+ "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="],
+
+ "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
+
+ "vfile-message": ["vfile-message@4.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="],
+
+ "vite": ["vite@5.4.19", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA=="],
+
+ "vitepress": ["vitepress@1.6.3", "", { "dependencies": { "@docsearch/css": "3.8.2", "@docsearch/js": "3.8.2", "@iconify-json/simple-icons": "^1.2.21", "@shikijs/core": "^2.1.0", "@shikijs/transformers": "^2.1.0", "@shikijs/types": "^2.1.0", "@types/markdown-it": "^14.1.2", "@vitejs/plugin-vue": "^5.2.1", "@vue/devtools-api": "^7.7.0", "@vue/shared": "^3.5.13", "@vueuse/core": "^12.4.0", "@vueuse/integrations": "^12.4.0", "focus-trap": "^7.6.4", "mark.js": "8.11.1", "minisearch": "^7.1.1", "shiki": "^2.1.0", "vite": "^5.4.14", "vue": "^3.5.13" }, "peerDependencies": { "markdown-it-mathjax3": "^4", "postcss": "^8" }, "optionalPeers": ["markdown-it-mathjax3", "postcss"], "bin": { "vitepress": "bin/vitepress.js" } }, "sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw=="],
+
+ "vue": ["vue@3.5.18", "", { "dependencies": { "@vue/compiler-dom": "3.5.18", "@vue/compiler-sfc": "3.5.18", "@vue/runtime-dom": "3.5.18", "@vue/server-renderer": "3.5.18", "@vue/shared": "3.5.18" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA=="],
+
+ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
+ }
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index 458eeb5..04f913b 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"scripts": {
- "docs:dev": "vitepress dev ./",
- "docs:build": "vitepress build ./",
- "docs:preview": "vitepress preview ./"
+ "docs:dev": "vitepress dev /",
+ "docs:build": "vitepress build /",
+ "docs:preview": "vitepress preview /"
}
}
\ No newline at end of file
From 34468684a4c80a91b0f844f069f99f6e70103ce9 Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Tue, 29 Jul 2025 22:28:18 -0400
Subject: [PATCH 06/20] Fix the action
(maybe)
---
.vitepress/config.mts | 1 -
bun.lock | 345 ------------------------------------------
package-lock.json | 6 +
package.json | 6 +-
4 files changed, 9 insertions(+), 349 deletions(-)
delete mode 100644 bun.lock
create mode 100644 package-lock.json
diff --git a/.vitepress/config.mts b/.vitepress/config.mts
index 96a8ec2..e5737a3 100644
--- a/.vitepress/config.mts
+++ b/.vitepress/config.mts
@@ -3,7 +3,6 @@ import { defineConfig } from 'vitepress'
// https://vitepress.dev/reference/site-config
export default defineConfig({
title: "Scratch Specification",
- base: "/spec/",
themeConfig: {
// https://vitepress.dev/reference/default-theme-config
diff --git a/bun.lock b/bun.lock
deleted file mode 100644
index 86f143f..0000000
--- a/bun.lock
+++ /dev/null
@@ -1,345 +0,0 @@
-{
- "lockfileVersion": 1,
- "workspaces": {
- "": {
- "dependencies": {
- "vitepress": "^1.6.3"
- }
- }
- },
- "packages": {
- "@algolia/autocomplete-core": ["@algolia/autocomplete-core@1.17.7", "", { "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", "@algolia/autocomplete-shared": "1.17.7" } }, "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q=="],
-
- "@algolia/autocomplete-plugin-algolia-insights": ["@algolia/autocomplete-plugin-algolia-insights@1.17.7", "", { "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A=="],
-
- "@algolia/autocomplete-preset-algolia": ["@algolia/autocomplete-preset-algolia@1.17.7", "", { "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA=="],
-
- "@algolia/autocomplete-shared": ["@algolia/autocomplete-shared@1.17.7", "", { "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg=="],
-
- "@algolia/client-abtesting": ["@algolia/client-abtesting@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-M4zb6J7q+pg9V9Xk0k1WDgvupfCtXcxjKGTrNVYemiredLVGOmvVIPAUjg2rx4QmK7DWNApWLsieYwk7PAaOXw=="],
-
- "@algolia/client-analytics": ["@algolia/client-analytics@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-h18zlL+bVUlbNE92olo1d/r6HQPkxhmP7yCpA1osERwpgC6F058kWm0O0aYdrHJIHtWBcs9aRqq7IkQSkpjPJg=="],
-
- "@algolia/client-common": ["@algolia/client-common@5.34.1", "", {}, "sha512-otPWALs72KvmVuP0CN0DI6sqVx1jQWKi+/DgAiP8DysVMgiNlva3GDKTtAK6XVGlT08f4h32FNuL0yQODuCfKA=="],
-
- "@algolia/client-insights": ["@algolia/client-insights@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-SNDb5wuEpQFM6S5Shk2iytLMusvGycm9uTuYh7cGa1h3U7O65OjjjIgQ0lLY5HPybHNtmXr4Zh/EZ23pZvAJHg=="],
-
- "@algolia/client-personalization": ["@algolia/client-personalization@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-T8z9KqYJOup83Hw0mgICYWfJoLh//FNWbf4roFd95ZJzZ4v1cN/hvr7Eqml1qWMoCkJb4y/XQjrXsJ6Y9XnMLw=="],
-
- "@algolia/client-query-suggestions": ["@algolia/client-query-suggestions@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-YA0kC4CwO1mc1dliNgbFgToweRa7Uihjz3izEaV4cXninF1v4SaOrPkQUsiFPprAffjMzOUoT7vahQZ/HZyiKQ=="],
-
- "@algolia/client-search": ["@algolia/client-search@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-bt5hC9vvjaKvdvsgzfXJ42Sl3qjQqoi/FD8V7HOQgtNFhwSauZOlgLwFoUiw67sM+r7ehF7QDk5WRDgY7fAkIg=="],
-
- "@algolia/ingestion": ["@algolia/ingestion@1.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-QLxiBskQxFGzPqKZvBNEvNN95kgDCbBd2X29ZGfh6Sr2QOSU34US6Z9x2duiF4o9FwsB0i6eQ2c9vHfuH0lAQg=="],
-
- "@algolia/monitoring": ["@algolia/monitoring@1.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-NteCvWcWXXdnPGyZH8rXHslcf2pM1WGDNMGNZFXLFtOt1Gf1Tjy2t0NZLp+Mxap3JMV4mbYmactbXrvpQf/lLA=="],
-
- "@algolia/recommend": ["@algolia/recommend@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-UdgDSrunLIBAAAxQlYLXYLnYFN4wkzkrAYx+wMLEk/pzASWyza3BkecbUFVqoYOBIgwo7Mt4iymzVtFkzL2uCQ=="],
-
- "@algolia/requester-browser-xhr": ["@algolia/requester-browser-xhr@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1" } }, "sha512-567LfFTc9VOiPtuySQohoqaWMeohYWbXK71aMSin+SLMgeKX7hz5LrVmkmMQj9udwWK6/mtHEYZGPYHSuXpLQg=="],
-
- "@algolia/requester-fetch": ["@algolia/requester-fetch@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1" } }, "sha512-YRbygPgGBEik5U593JvyjgxFjcsyZMR25eIQxNHvSQumdAzt5A4E4Idw3yXnwhrmMdjML54ZXT7EAjnTjWy8Xw=="],
-
- "@algolia/requester-node-http": ["@algolia/requester-node-http@5.34.1", "", { "dependencies": { "@algolia/client-common": "5.34.1" } }, "sha512-o0mqRYbS82Rt4DE02Od7RL6pNtV7oSxScPuIw8LW4aqO2V5eCF05Pry/SnUgcI/Vb2QCYC66hytBCqzyC/toZA=="],
-
- "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
-
- "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="],
-
- "@babel/parser": ["@babel/parser@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.0" }, "bin": "./bin/babel-parser.js" }, "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g=="],
-
- "@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="],
-
- "@docsearch/css": ["@docsearch/css@3.8.2", "", {}, "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ=="],
-
- "@docsearch/js": ["@docsearch/js@3.8.2", "", { "dependencies": { "@docsearch/react": "3.8.2", "preact": "^10.0.0" } }, "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ=="],
-
- "@docsearch/react": ["@docsearch/react@3.8.2", "", { "dependencies": { "@algolia/autocomplete-core": "1.17.7", "@algolia/autocomplete-preset-algolia": "1.17.7", "@docsearch/css": "3.8.2", "algoliasearch": "^5.14.2" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 19.0.0", "react": ">= 16.8.0 < 19.0.0", "react-dom": ">= 16.8.0 < 19.0.0", "search-insights": ">= 1 < 3" }, "optionalPeers": ["@types/react", "react", "react-dom", "search-insights"] }, "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg=="],
-
- "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="],
-
- "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="],
-
- "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="],
-
- "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="],
-
- "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="],
-
- "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="],
-
- "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="],
-
- "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="],
-
- "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="],
-
- "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="],
-
- "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="],
-
- "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="],
-
- "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="],
-
- "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="],
-
- "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="],
-
- "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="],
-
- "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="],
-
- "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="],
-
- "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="],
-
- "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="],
-
- "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="],
-
- "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="],
-
- "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="],
-
- "@iconify-json/simple-icons": ["@iconify-json/simple-icons@1.2.44", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-CdWgSPygwDlDbKtDWjvi3NtUefnkoepXv90n3dQxJerqzD9kI+nEJOiWUBM+eOyMYQKtxBpLWFBrgeotF0IZKw=="],
-
- "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="],
-
- "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.4", "", {}, "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw=="],
-
- "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.45.1", "", { "os": "android", "cpu": "arm" }, "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA=="],
-
- "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.45.1", "", { "os": "android", "cpu": "arm64" }, "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ=="],
-
- "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.45.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA=="],
-
- "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.45.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og=="],
-
- "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.45.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g=="],
-
- "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.45.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A=="],
-
- "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.45.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q=="],
-
- "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.45.1", "", { "os": "linux", "cpu": "arm" }, "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q=="],
-
- "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.45.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw=="],
-
- "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.45.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog=="],
-
- "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg=="],
-
- "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.45.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg=="],
-
- "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw=="],
-
- "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA=="],
-
- "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.45.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw=="],
-
- "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.45.1", "", { "os": "linux", "cpu": "x64" }, "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw=="],
-
- "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.45.1", "", { "os": "linux", "cpu": "x64" }, "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw=="],
-
- "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.45.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg=="],
-
- "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.45.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw=="],
-
- "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.45.1", "", { "os": "win32", "cpu": "x64" }, "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA=="],
-
- "@shikijs/core": ["@shikijs/core@2.5.0", "", { "dependencies": { "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg=="],
-
- "@shikijs/engine-javascript": ["@shikijs/engine-javascript@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^3.1.0" } }, "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w=="],
-
- "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw=="],
-
- "@shikijs/langs": ["@shikijs/langs@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0" } }, "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w=="],
-
- "@shikijs/themes": ["@shikijs/themes@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0" } }, "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw=="],
-
- "@shikijs/transformers": ["@shikijs/transformers@2.5.0", "", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/types": "2.5.0" } }, "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg=="],
-
- "@shikijs/types": ["@shikijs/types@2.5.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw=="],
-
- "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
-
- "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
-
- "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
-
- "@types/linkify-it": ["@types/linkify-it@5.0.0", "", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="],
-
- "@types/markdown-it": ["@types/markdown-it@14.1.2", "", { "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" } }, "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog=="],
-
- "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
-
- "@types/mdurl": ["@types/mdurl@2.0.0", "", {}, "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="],
-
- "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
-
- "@types/web-bluetooth": ["@types/web-bluetooth@0.0.21", "", {}, "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="],
-
- "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
-
- "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.4", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA=="],
-
- "@vue/compiler-core": ["@vue/compiler-core@3.5.18", "", { "dependencies": { "@babel/parser": "^7.28.0", "@vue/shared": "3.5.18", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw=="],
-
- "@vue/compiler-dom": ["@vue/compiler-dom@3.5.18", "", { "dependencies": { "@vue/compiler-core": "3.5.18", "@vue/shared": "3.5.18" } }, "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A=="],
-
- "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.18", "", { "dependencies": { "@babel/parser": "^7.28.0", "@vue/compiler-core": "3.5.18", "@vue/compiler-dom": "3.5.18", "@vue/compiler-ssr": "3.5.18", "@vue/shared": "3.5.18", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA=="],
-
- "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.18", "", { "dependencies": { "@vue/compiler-dom": "3.5.18", "@vue/shared": "3.5.18" } }, "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g=="],
-
- "@vue/devtools-api": ["@vue/devtools-api@7.7.7", "", { "dependencies": { "@vue/devtools-kit": "^7.7.7" } }, "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg=="],
-
- "@vue/devtools-kit": ["@vue/devtools-kit@7.7.7", "", { "dependencies": { "@vue/devtools-shared": "^7.7.7", "birpc": "^2.3.0", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", "superjson": "^2.2.2" } }, "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA=="],
-
- "@vue/devtools-shared": ["@vue/devtools-shared@7.7.7", "", { "dependencies": { "rfdc": "^1.4.1" } }, "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw=="],
-
- "@vue/reactivity": ["@vue/reactivity@3.5.18", "", { "dependencies": { "@vue/shared": "3.5.18" } }, "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg=="],
-
- "@vue/runtime-core": ["@vue/runtime-core@3.5.18", "", { "dependencies": { "@vue/reactivity": "3.5.18", "@vue/shared": "3.5.18" } }, "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w=="],
-
- "@vue/runtime-dom": ["@vue/runtime-dom@3.5.18", "", { "dependencies": { "@vue/reactivity": "3.5.18", "@vue/runtime-core": "3.5.18", "@vue/shared": "3.5.18", "csstype": "^3.1.3" } }, "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw=="],
-
- "@vue/server-renderer": ["@vue/server-renderer@3.5.18", "", { "dependencies": { "@vue/compiler-ssr": "3.5.18", "@vue/shared": "3.5.18" }, "peerDependencies": { "vue": "3.5.18" } }, "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA=="],
-
- "@vue/shared": ["@vue/shared@3.5.18", "", {}, "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA=="],
-
- "@vueuse/core": ["@vueuse/core@12.8.2", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" } }, "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ=="],
-
- "@vueuse/integrations": ["@vueuse/integrations@12.8.2", "", { "dependencies": { "@vueuse/core": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" }, "peerDependencies": { "async-validator": "^4", "axios": "^1", "change-case": "^5", "drauu": "^0.4", "focus-trap": "^7", "fuse.js": "^7", "idb-keyval": "^6", "jwt-decode": "^4", "nprogress": "^0.2", "qrcode": "^1.5", "sortablejs": "^1", "universal-cookie": "^7" }, "optionalPeers": ["async-validator", "axios", "change-case", "drauu", "focus-trap", "fuse.js", "idb-keyval", "jwt-decode", "nprogress", "qrcode", "sortablejs", "universal-cookie"] }, "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g=="],
-
- "@vueuse/metadata": ["@vueuse/metadata@12.8.2", "", {}, "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A=="],
-
- "@vueuse/shared": ["@vueuse/shared@12.8.2", "", { "dependencies": { "vue": "^3.5.13" } }, "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w=="],
-
- "algoliasearch": ["algoliasearch@5.34.1", "", { "dependencies": { "@algolia/client-abtesting": "5.34.1", "@algolia/client-analytics": "5.34.1", "@algolia/client-common": "5.34.1", "@algolia/client-insights": "5.34.1", "@algolia/client-personalization": "5.34.1", "@algolia/client-query-suggestions": "5.34.1", "@algolia/client-search": "5.34.1", "@algolia/ingestion": "1.34.1", "@algolia/monitoring": "1.34.1", "@algolia/recommend": "5.34.1", "@algolia/requester-browser-xhr": "5.34.1", "@algolia/requester-fetch": "5.34.1", "@algolia/requester-node-http": "5.34.1" } }, "sha512-s70HlfBgswgEdmCYkUJG8i/ULYhbkk8N9+N8JsWUwszcp7eauPEr5tIX4BY0qDGeKWQ/qZvmt4mxwTusYY23sg=="],
-
- "birpc": ["birpc@2.5.0", "", {}, "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ=="],
-
- "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
-
- "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
-
- "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
-
- "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
-
- "copy-anything": ["copy-anything@3.0.5", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w=="],
-
- "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
-
- "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
-
- "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
-
- "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="],
-
- "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
-
- "esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="],
-
- "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
-
- "focus-trap": ["focus-trap@7.6.5", "", { "dependencies": { "tabbable": "^6.2.0" } }, "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg=="],
-
- "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
-
- "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="],
-
- "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="],
-
- "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="],
-
- "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],
-
- "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="],
-
- "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
-
- "mark.js": ["mark.js@8.11.1", "", {}, "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ=="],
-
- "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="],
-
- "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="],
-
- "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="],
-
- "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="],
-
- "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="],
-
- "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="],
-
- "minisearch": ["minisearch@7.1.2", "", {}, "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA=="],
-
- "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="],
-
- "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
-
- "oniguruma-to-es": ["oniguruma-to-es@3.1.1", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ=="],
-
- "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="],
-
- "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
-
- "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
-
- "preact": ["preact@10.26.9", "", {}, "sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA=="],
-
- "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
-
- "regex": ["regex@6.0.1", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA=="],
-
- "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
-
- "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="],
-
- "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="],
-
- "rollup": ["rollup@4.45.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.45.1", "@rollup/rollup-android-arm64": "4.45.1", "@rollup/rollup-darwin-arm64": "4.45.1", "@rollup/rollup-darwin-x64": "4.45.1", "@rollup/rollup-freebsd-arm64": "4.45.1", "@rollup/rollup-freebsd-x64": "4.45.1", "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", "@rollup/rollup-linux-arm-musleabihf": "4.45.1", "@rollup/rollup-linux-arm64-gnu": "4.45.1", "@rollup/rollup-linux-arm64-musl": "4.45.1", "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", "@rollup/rollup-linux-riscv64-gnu": "4.45.1", "@rollup/rollup-linux-riscv64-musl": "4.45.1", "@rollup/rollup-linux-s390x-gnu": "4.45.1", "@rollup/rollup-linux-x64-gnu": "4.45.1", "@rollup/rollup-linux-x64-musl": "4.45.1", "@rollup/rollup-win32-arm64-msvc": "4.45.1", "@rollup/rollup-win32-ia32-msvc": "4.45.1", "@rollup/rollup-win32-x64-msvc": "4.45.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw=="],
-
- "search-insights": ["search-insights@2.17.3", "", {}, "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ=="],
-
- "shiki": ["shiki@2.5.0", "", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/langs": "2.5.0", "@shikijs/themes": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ=="],
-
- "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
-
- "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
-
- "speakingurl": ["speakingurl@14.0.1", "", {}, "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ=="],
-
- "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
-
- "superjson": ["superjson@2.2.2", "", { "dependencies": { "copy-anything": "^3.0.2" } }, "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q=="],
-
- "tabbable": ["tabbable@6.2.0", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="],
-
- "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
-
- "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="],
-
- "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="],
-
- "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
-
- "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
-
- "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="],
-
- "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
-
- "vfile-message": ["vfile-message@4.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="],
-
- "vite": ["vite@5.4.19", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA=="],
-
- "vitepress": ["vitepress@1.6.3", "", { "dependencies": { "@docsearch/css": "3.8.2", "@docsearch/js": "3.8.2", "@iconify-json/simple-icons": "^1.2.21", "@shikijs/core": "^2.1.0", "@shikijs/transformers": "^2.1.0", "@shikijs/types": "^2.1.0", "@types/markdown-it": "^14.1.2", "@vitejs/plugin-vue": "^5.2.1", "@vue/devtools-api": "^7.7.0", "@vue/shared": "^3.5.13", "@vueuse/core": "^12.4.0", "@vueuse/integrations": "^12.4.0", "focus-trap": "^7.6.4", "mark.js": "8.11.1", "minisearch": "^7.1.1", "shiki": "^2.1.0", "vite": "^5.4.14", "vue": "^3.5.13" }, "peerDependencies": { "markdown-it-mathjax3": "^4", "postcss": "^8" }, "optionalPeers": ["markdown-it-mathjax3", "postcss"], "bin": { "vitepress": "bin/vitepress.js" } }, "sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw=="],
-
- "vue": ["vue@3.5.18", "", { "dependencies": { "@vue/compiler-dom": "3.5.18", "@vue/compiler-sfc": "3.5.18", "@vue/runtime-dom": "3.5.18", "@vue/server-renderer": "3.5.18", "@vue/shared": "3.5.18" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA=="],
-
- "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
- }
-}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..8219f60
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,6 @@
+{
+ "name": "scratch-spec",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {}
+}
diff --git a/package.json b/package.json
index 04f913b..458eeb5 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"scripts": {
- "docs:dev": "vitepress dev /",
- "docs:build": "vitepress build /",
- "docs:preview": "vitepress preview /"
+ "docs:dev": "vitepress dev ./",
+ "docs:build": "vitepress build ./",
+ "docs:preview": "vitepress preview ./"
}
}
\ No newline at end of file
From 34ffa5061cc35c4335636620b118ff91476ef39f Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Tue, 29 Jul 2025 22:43:15 -0400
Subject: [PATCH 07/20] Fix the action for real
(probably)
---
.gitignore | 3 +-
.vitepress/config.mts | 1 +
package-lock.json | 2264 ++++++++++++++++++++++++++++++++++++++++-
package.json | 5 +-
4 files changed, 2270 insertions(+), 3 deletions(-)
diff --git a/.gitignore b/.gitignore
index 2c167a1..a8a7659 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
.DS_Store
.vitepress/dist
-.vitepress/cache
\ No newline at end of file
+.vitepress/cache
+node_modules/
\ No newline at end of file
diff --git a/.vitepress/config.mts b/.vitepress/config.mts
index e5737a3..b54fbad 100644
--- a/.vitepress/config.mts
+++ b/.vitepress/config.mts
@@ -3,6 +3,7 @@ import { defineConfig } from 'vitepress'
// https://vitepress.dev/reference/site-config
export default defineConfig({
title: "Scratch Specification",
+ base: "/scratch-spec/", // https://vitepress.dev/guide/deploy#setting-a-public-base-path
themeConfig: {
// https://vitepress.dev/reference/default-theme-config
diff --git a/package-lock.json b/package-lock.json
index 8219f60..636cb59 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2,5 +2,2267 @@
"name": "scratch-spec",
"lockfileVersion": 3,
"requires": true,
- "packages": {}
+ "packages": {
+ "": {
+ "name": "scratch-spec",
+ "dependencies": {
+ "vitepress": "^1.6.3"
+ }
+ },
+ "node_modules/@algolia/abtesting": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz",
+ "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.35.0",
+ "@algolia/requester-browser-xhr": "5.35.0",
+ "@algolia/requester-fetch": "5.35.0",
+ "@algolia/requester-node-http": "5.35.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/autocomplete-core": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz",
+ "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-plugin-algolia-insights": "1.17.7",
+ "@algolia/autocomplete-shared": "1.17.7"
+ }
+ },
+ "node_modules/@algolia/autocomplete-plugin-algolia-insights": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz",
+ "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-shared": "1.17.7"
+ },
+ "peerDependencies": {
+ "search-insights": ">= 1 < 3"
+ }
+ },
+ "node_modules/@algolia/autocomplete-preset-algolia": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz",
+ "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-shared": "1.17.7"
+ },
+ "peerDependencies": {
+ "@algolia/client-search": ">= 4.9.1 < 6",
+ "algoliasearch": ">= 4.9.1 < 6"
+ }
+ },
+ "node_modules/@algolia/autocomplete-shared": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz",
+ "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@algolia/client-search": ">= 4.9.1 < 6",
+ "algoliasearch": ">= 4.9.1 < 6"
+ }
+ },
+ "node_modules/@algolia/client-abtesting": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz",
+ "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.35.0",
+ "@algolia/requester-browser-xhr": "5.35.0",
+ "@algolia/requester-fetch": "5.35.0",
+ "@algolia/requester-node-http": "5.35.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-analytics": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz",
+ "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.35.0",
+ "@algolia/requester-browser-xhr": "5.35.0",
+ "@algolia/requester-fetch": "5.35.0",
+ "@algolia/requester-node-http": "5.35.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-common": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz",
+ "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-insights": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz",
+ "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.35.0",
+ "@algolia/requester-browser-xhr": "5.35.0",
+ "@algolia/requester-fetch": "5.35.0",
+ "@algolia/requester-node-http": "5.35.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-personalization": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz",
+ "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.35.0",
+ "@algolia/requester-browser-xhr": "5.35.0",
+ "@algolia/requester-fetch": "5.35.0",
+ "@algolia/requester-node-http": "5.35.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-query-suggestions": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz",
+ "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.35.0",
+ "@algolia/requester-browser-xhr": "5.35.0",
+ "@algolia/requester-fetch": "5.35.0",
+ "@algolia/requester-node-http": "5.35.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-search": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz",
+ "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.35.0",
+ "@algolia/requester-browser-xhr": "5.35.0",
+ "@algolia/requester-fetch": "5.35.0",
+ "@algolia/requester-node-http": "5.35.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/ingestion": {
+ "version": "1.35.0",
+ "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz",
+ "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.35.0",
+ "@algolia/requester-browser-xhr": "5.35.0",
+ "@algolia/requester-fetch": "5.35.0",
+ "@algolia/requester-node-http": "5.35.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/monitoring": {
+ "version": "1.35.0",
+ "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz",
+ "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.35.0",
+ "@algolia/requester-browser-xhr": "5.35.0",
+ "@algolia/requester-fetch": "5.35.0",
+ "@algolia/requester-node-http": "5.35.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/recommend": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz",
+ "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.35.0",
+ "@algolia/requester-browser-xhr": "5.35.0",
+ "@algolia/requester-fetch": "5.35.0",
+ "@algolia/requester-node-http": "5.35.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-browser-xhr": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz",
+ "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.35.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-fetch": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz",
+ "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.35.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-node-http": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz",
+ "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.35.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz",
+ "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.2",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
+ "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@docsearch/css": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz",
+ "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==",
+ "license": "MIT"
+ },
+ "node_modules/@docsearch/js": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz",
+ "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@docsearch/react": "3.8.2",
+ "preact": "^10.0.0"
+ }
+ },
+ "node_modules/@docsearch/react": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz",
+ "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-core": "1.17.7",
+ "@algolia/autocomplete-preset-algolia": "1.17.7",
+ "@docsearch/css": "3.8.2",
+ "algoliasearch": "^5.14.2"
+ },
+ "peerDependencies": {
+ "@types/react": ">= 16.8.0 < 19.0.0",
+ "react": ">= 16.8.0 < 19.0.0",
+ "react-dom": ">= 16.8.0 < 19.0.0",
+ "search-insights": ">= 1 < 3"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "search-insights": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@iconify-json/simple-icons": {
+ "version": "1.2.44",
+ "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.44.tgz",
+ "integrity": "sha512-CdWgSPygwDlDbKtDWjvi3NtUefnkoepXv90n3dQxJerqzD9kI+nEJOiWUBM+eOyMYQKtxBpLWFBrgeotF0IZKw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@iconify/types": "*"
+ }
+ },
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
+ "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==",
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz",
+ "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz",
+ "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz",
+ "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz",
+ "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz",
+ "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz",
+ "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz",
+ "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz",
+ "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz",
+ "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz",
+ "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz",
+ "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz",
+ "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz",
+ "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz",
+ "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz",
+ "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz",
+ "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz",
+ "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz",
+ "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz",
+ "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz",
+ "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@shikijs/core": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz",
+ "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/engine-javascript": "2.5.0",
+ "@shikijs/engine-oniguruma": "2.5.0",
+ "@shikijs/types": "2.5.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4",
+ "hast-util-to-html": "^9.0.4"
+ }
+ },
+ "node_modules/@shikijs/engine-javascript": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz",
+ "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "2.5.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "oniguruma-to-es": "^3.1.0"
+ }
+ },
+ "node_modules/@shikijs/engine-oniguruma": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz",
+ "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "2.5.0",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ }
+ },
+ "node_modules/@shikijs/langs": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz",
+ "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "2.5.0"
+ }
+ },
+ "node_modules/@shikijs/themes": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz",
+ "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "2.5.0"
+ }
+ },
+ "node_modules/@shikijs/transformers": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz",
+ "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "2.5.0",
+ "@shikijs/types": "2.5.0"
+ }
+ },
+ "node_modules/@shikijs/types": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz",
+ "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/@shikijs/vscode-textmate": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "14.1.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
+ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
+ }
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.21",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz",
+ "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==",
+ "license": "MIT"
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "license": "ISC"
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
+ "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz",
+ "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.0",
+ "@vue/shared": "3.5.18",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz",
+ "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.18",
+ "@vue/shared": "3.5.18"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz",
+ "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.0",
+ "@vue/compiler-core": "3.5.18",
+ "@vue/compiler-dom": "3.5.18",
+ "@vue/compiler-ssr": "3.5.18",
+ "@vue/shared": "3.5.18",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.17",
+ "postcss": "^8.5.6",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz",
+ "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.18",
+ "@vue/shared": "3.5.18"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "7.7.7",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz",
+ "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-kit": "^7.7.7"
+ }
+ },
+ "node_modules/@vue/devtools-kit": {
+ "version": "7.7.7",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz",
+ "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-shared": "^7.7.7",
+ "birpc": "^2.3.0",
+ "hookable": "^5.5.3",
+ "mitt": "^3.0.1",
+ "perfect-debounce": "^1.0.0",
+ "speakingurl": "^14.0.1",
+ "superjson": "^2.2.2"
+ }
+ },
+ "node_modules/@vue/devtools-shared": {
+ "version": "7.7.7",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz",
+ "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==",
+ "license": "MIT",
+ "dependencies": {
+ "rfdc": "^1.4.1"
+ }
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz",
+ "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.5.18"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz",
+ "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.18",
+ "@vue/shared": "3.5.18"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz",
+ "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.18",
+ "@vue/runtime-core": "3.5.18",
+ "@vue/shared": "3.5.18",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz",
+ "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.18",
+ "@vue/shared": "3.5.18"
+ },
+ "peerDependencies": {
+ "vue": "3.5.18"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz",
+ "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==",
+ "license": "MIT"
+ },
+ "node_modules/@vueuse/core": {
+ "version": "12.8.2",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz",
+ "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.21",
+ "@vueuse/metadata": "12.8.2",
+ "@vueuse/shared": "12.8.2",
+ "vue": "^3.5.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/integrations": {
+ "version": "12.8.2",
+ "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz",
+ "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@vueuse/core": "12.8.2",
+ "@vueuse/shared": "12.8.2",
+ "vue": "^3.5.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "async-validator": "^4",
+ "axios": "^1",
+ "change-case": "^5",
+ "drauu": "^0.4",
+ "focus-trap": "^7",
+ "fuse.js": "^7",
+ "idb-keyval": "^6",
+ "jwt-decode": "^4",
+ "nprogress": "^0.2",
+ "qrcode": "^1.5",
+ "sortablejs": "^1",
+ "universal-cookie": "^7"
+ },
+ "peerDependenciesMeta": {
+ "async-validator": {
+ "optional": true
+ },
+ "axios": {
+ "optional": true
+ },
+ "change-case": {
+ "optional": true
+ },
+ "drauu": {
+ "optional": true
+ },
+ "focus-trap": {
+ "optional": true
+ },
+ "fuse.js": {
+ "optional": true
+ },
+ "idb-keyval": {
+ "optional": true
+ },
+ "jwt-decode": {
+ "optional": true
+ },
+ "nprogress": {
+ "optional": true
+ },
+ "qrcode": {
+ "optional": true
+ },
+ "sortablejs": {
+ "optional": true
+ },
+ "universal-cookie": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "12.8.2",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz",
+ "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "12.8.2",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz",
+ "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==",
+ "license": "MIT",
+ "dependencies": {
+ "vue": "^3.5.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/algoliasearch": {
+ "version": "5.35.0",
+ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz",
+ "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/abtesting": "1.1.0",
+ "@algolia/client-abtesting": "5.35.0",
+ "@algolia/client-analytics": "5.35.0",
+ "@algolia/client-common": "5.35.0",
+ "@algolia/client-insights": "5.35.0",
+ "@algolia/client-personalization": "5.35.0",
+ "@algolia/client-query-suggestions": "5.35.0",
+ "@algolia/client-search": "5.35.0",
+ "@algolia/ingestion": "1.35.0",
+ "@algolia/monitoring": "1.35.0",
+ "@algolia/recommend": "5.35.0",
+ "@algolia/requester-browser-xhr": "5.35.0",
+ "@algolia/requester-fetch": "5.35.0",
+ "@algolia/requester-node-http": "5.35.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/birpc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz",
+ "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/copy-anything": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
+ "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
+ "license": "MIT",
+ "dependencies": {
+ "is-what": "^4.1.8"
+ },
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/emoji-regex-xs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz",
+ "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==",
+ "license": "MIT"
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "license": "MIT"
+ },
+ "node_modules/focus-trap": {
+ "version": "7.6.5",
+ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.5.tgz",
+ "integrity": "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==",
+ "license": "MIT",
+ "dependencies": {
+ "tabbable": "^6.2.0"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/hast-util-to-html": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
+ "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "stringify-entities": "^4.0.0",
+ "zwitch": "^2.0.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
+ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+ "license": "MIT"
+ },
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-what": {
+ "version": "4.1.16",
+ "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
+ "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/mark.js": {
+ "version": "8.11.1",
+ "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz",
+ "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
+ "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/minisearch": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.2.tgz",
+ "integrity": "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==",
+ "license": "MIT"
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/oniguruma-to-es": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz",
+ "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex-xs": "^1.0.0",
+ "regex": "^6.0.1",
+ "regex-recursion": "^6.0.2"
+ }
+ },
+ "node_modules/perfect-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/preact": {
+ "version": "10.27.0",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.0.tgz",
+ "integrity": "sha512-/DTYoB6mwwgPytiqQTh/7SFRL98ZdiD8Sk8zIUVOxtwq4oWcwrcd1uno9fE/zZmUaUrFNYzbH14CPebOz9tZQw==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz",
+ "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==",
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-recursion": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz",
+ "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-utilities": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
+ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
+ "license": "MIT"
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "license": "MIT"
+ },
+ "node_modules/rollup": {
+ "version": "4.46.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz",
+ "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.46.2",
+ "@rollup/rollup-android-arm64": "4.46.2",
+ "@rollup/rollup-darwin-arm64": "4.46.2",
+ "@rollup/rollup-darwin-x64": "4.46.2",
+ "@rollup/rollup-freebsd-arm64": "4.46.2",
+ "@rollup/rollup-freebsd-x64": "4.46.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.46.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.46.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.46.2",
+ "@rollup/rollup-linux-arm64-musl": "4.46.2",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.46.2",
+ "@rollup/rollup-linux-ppc64-gnu": "4.46.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.46.2",
+ "@rollup/rollup-linux-riscv64-musl": "4.46.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.46.2",
+ "@rollup/rollup-linux-x64-gnu": "4.46.2",
+ "@rollup/rollup-linux-x64-musl": "4.46.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.46.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.46.2",
+ "@rollup/rollup-win32-x64-msvc": "4.46.2",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/search-insights": {
+ "version": "2.17.3",
+ "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz",
+ "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/shiki": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz",
+ "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "2.5.0",
+ "@shikijs/engine-javascript": "2.5.0",
+ "@shikijs/engine-oniguruma": "2.5.0",
+ "@shikijs/langs": "2.5.0",
+ "@shikijs/themes": "2.5.0",
+ "@shikijs/types": "2.5.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/speakingurl": {
+ "version": "14.0.1",
+ "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
+ "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/superjson": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz",
+ "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "copy-anything": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/tabbable": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
+ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
+ "license": "MIT"
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
+ "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
+ "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.4.19",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz",
+ "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==",
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitepress": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.3.tgz",
+ "integrity": "sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw==",
+ "license": "MIT",
+ "dependencies": {
+ "@docsearch/css": "3.8.2",
+ "@docsearch/js": "3.8.2",
+ "@iconify-json/simple-icons": "^1.2.21",
+ "@shikijs/core": "^2.1.0",
+ "@shikijs/transformers": "^2.1.0",
+ "@shikijs/types": "^2.1.0",
+ "@types/markdown-it": "^14.1.2",
+ "@vitejs/plugin-vue": "^5.2.1",
+ "@vue/devtools-api": "^7.7.0",
+ "@vue/shared": "^3.5.13",
+ "@vueuse/core": "^12.4.0",
+ "@vueuse/integrations": "^12.4.0",
+ "focus-trap": "^7.6.4",
+ "mark.js": "8.11.1",
+ "minisearch": "^7.1.1",
+ "shiki": "^2.1.0",
+ "vite": "^5.4.14",
+ "vue": "^3.5.13"
+ },
+ "bin": {
+ "vitepress": "bin/vitepress.js"
+ },
+ "peerDependencies": {
+ "markdown-it-mathjax3": "^4",
+ "postcss": "^8"
+ },
+ "peerDependenciesMeta": {
+ "markdown-it-mathjax3": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz",
+ "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.18",
+ "@vue/compiler-sfc": "3.5.18",
+ "@vue/runtime-dom": "3.5.18",
+ "@vue/server-renderer": "3.5.18",
+ "@vue/shared": "3.5.18"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
}
diff --git a/package.json b/package.json
index 458eeb5..e1920bc 100644
--- a/package.json
+++ b/package.json
@@ -3,5 +3,8 @@
"docs:dev": "vitepress dev ./",
"docs:build": "vitepress build ./",
"docs:preview": "vitepress preview ./"
+ },
+ "dependencies": {
+ "vitepress": "^1.6.3"
}
-}
\ No newline at end of file
+}
From 246792c08d8fd7fac49137f6dc77df650a7999ed Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Tue, 29 Jul 2025 23:02:35 -0400
Subject: [PATCH 08/20] wahoo
---
.vitepress/api-examples.md | 49 -------------------
.vitepress/markdown-examples.md | 85 ---------------------------------
concepts/index.md | 2 +-
3 files changed, 1 insertion(+), 135 deletions(-)
delete mode 100644 .vitepress/api-examples.md
delete mode 100644 .vitepress/markdown-examples.md
diff --git a/.vitepress/api-examples.md b/.vitepress/api-examples.md
deleted file mode 100644
index 6bd8bb5..0000000
--- a/.vitepress/api-examples.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-outline: deep
----
-
-# Runtime API Examples
-
-This page demonstrates usage of some of the runtime APIs provided by VitePress.
-
-The main `useData()` API can be used to access site, theme, and page data for the current page. It works in both `.md` and `.vue` files:
-
-```md
-
-
-## Results
-
-### Theme Data
-{{ theme }}
-
-### Page Data
-{{ page }}
-
-### Page Frontmatter
-{{ frontmatter }}
-```
-
-
-
-## Results
-
-### Theme Data
-{{ theme }}
-
-### Page Data
-{{ page }}
-
-### Page Frontmatter
-{{ frontmatter }}
-
-## More
-
-Check out the documentation for the [full list of runtime APIs](https://vitepress.dev/reference/runtime-api#usedata).
diff --git a/.vitepress/markdown-examples.md b/.vitepress/markdown-examples.md
deleted file mode 100644
index f9258a5..0000000
--- a/.vitepress/markdown-examples.md
+++ /dev/null
@@ -1,85 +0,0 @@
-# Markdown Extension Examples
-
-This page demonstrates some of the built-in markdown extensions provided by VitePress.
-
-## Syntax Highlighting
-
-VitePress provides Syntax Highlighting powered by [Shiki](https://github.com/shikijs/shiki), with additional features like line-highlighting:
-
-**Input**
-
-````md
-```js{4}
-export default {
- data () {
- return {
- msg: 'Highlighted!'
- }
- }
-}
-```
-````
-
-**Output**
-
-```js{4}
-export default {
- data () {
- return {
- msg: 'Highlighted!'
- }
- }
-}
-```
-
-## Custom Containers
-
-**Input**
-
-```md
-::: info
-This is an info box.
-:::
-
-::: tip
-This is a tip.
-:::
-
-::: warning
-This is a warning.
-:::
-
-::: danger
-This is a dangerous warning.
-:::
-
-::: details
-This is a details block.
-:::
-```
-
-**Output**
-
-::: info
-This is an info box.
-:::
-
-::: tip
-This is a tip.
-:::
-
-::: warning
-This is a warning.
-:::
-
-::: danger
-This is a dangerous warning.
-:::
-
-::: details
-This is a details block.
-:::
-
-## More
-
-Check out the documentation for the [full list of markdown extensions](https://vitepress.dev/guide/markdown).
diff --git a/concepts/index.md b/concepts/index.md
index 3086219..9647848 100644
--- a/concepts/index.md
+++ b/concepts/index.md
@@ -2,7 +2,7 @@
This section explains the various concepts and rules of Scratch.
-{{toc}}
+[[toc]]
## Capabilities
From b6ec0145e93b8203cc2620a78191e818ab9b9f7d Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Tue, 29 Jul 2025 23:13:23 -0400
Subject: [PATCH 09/20] try deploying w/o images
---
concepts/index.md | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/concepts/index.md b/concepts/index.md
index 9647848..ab32956 100644
--- a/concepts/index.md
+++ b/concepts/index.md
@@ -365,15 +365,23 @@ The following table describes a sprite's *rendered* direction when using differe
#### Rotation Style: All Around
+(commented out)
+
+```md

+```
#### Rotation Style: Left-Right
+```md

+```
#### Rotation Style: Don't Rotate
+```md

+```
### String
From 06e1d8bccb949d6cd36219c90d0453f7ddf98498 Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Tue, 29 Jul 2025 23:17:32 -0400
Subject: [PATCH 10/20] ignore dead links
---
.vitepress/config.mts | 1 +
1 file changed, 1 insertion(+)
diff --git a/.vitepress/config.mts b/.vitepress/config.mts
index b54fbad..53dd53b 100644
--- a/.vitepress/config.mts
+++ b/.vitepress/config.mts
@@ -4,6 +4,7 @@ import { defineConfig } from 'vitepress'
export default defineConfig({
title: "Scratch Specification",
base: "/scratch-spec/", // https://vitepress.dev/guide/deploy#setting-a-public-base-path
+ ignoreDeadLinks: true,
themeConfig: {
// https://vitepress.dev/reference/default-theme-config
From 0d8bc26dc8d85064ad6f66c5c6bed2be61137985 Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Tue, 29 Jul 2025 23:31:47 -0400
Subject: [PATCH 11/20] deploy sesame!
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index a3697a0..0b3540a 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ A detailed explanation of how Scratch 3.0 works as a programming language.
> [!IMPORTANT]
> **Changes are underway!**
>
-> This spec is being transitioned over to Vitepress. Parts of it have already been copied over and deleted from here. It will no longer be included in the README. To view it, you'll have to go to the much better [published page](https://oceanisendless.github.io/scratch-spec/). See ya there!
+> This spec is being transitioned over to Vitepress. Parts of it have already been copied over and deleted from here. It will no longer be included in the README. To view it, you'll have to go to the much better [published page](https://oceanisendless.github.io/scratch-spec/). See ya there when it's up and running!
>
## Contents
From 19c22f34956c4928f76072768cba1de965c76c87 Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Wed, 30 Jul 2025 16:46:38 -0400
Subject: [PATCH 12/20] add plugins
Awesome! Thanks so much for this:
https://github.com/gradylink/sb-mdit
---
.vitepress/config.mts | 6 +
package-lock.json | 1774 ++++++++++++++++++++++++++++++++++++++++-
package.json | 4 +
3 files changed, 1778 insertions(+), 6 deletions(-)
diff --git a/.vitepress/config.mts b/.vitepress/config.mts
index 53dd53b..76c9cd7 100644
--- a/.vitepress/config.mts
+++ b/.vitepress/config.mts
@@ -1,4 +1,5 @@
import { defineConfig } from 'vitepress'
+import { scratchblocksPlugin } from 'sb-mdit'
// https://vitepress.dev/reference/site-config
export default defineConfig({
@@ -49,5 +50,10 @@ export default defineConfig({
search: {
provider: 'local'
}
+ },
+
+ markdown: {
+ math: true,
+ config: md => md.use(scratchblocksPlugin)
}
})
diff --git a/package-lock.json b/package-lock.json
index 636cb59..b105623 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4,9 +4,12 @@
"requires": true,
"packages": {
"": {
- "name": "scratch-spec",
"dependencies": {
+ "sb-mdit": "^0.2.1",
"vitepress": "^1.6.3"
+ },
+ "devDependencies": {
+ "markdown-it-mathjax3": "^4.3.2"
}
},
"node_modules/@algolia/abtesting": {
@@ -249,6 +252,19 @@
"node": ">= 14.0.0"
}
},
+ "node_modules/@asamuzakjp/css-color": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz",
+ "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==",
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.3",
+ "@csstools/css-color-parser": "^3.0.9",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "lru-cache": "^10.4.3"
+ }
+ },
"node_modules/@babel/helper-string-parser": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
@@ -295,6 +311,314 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@css-inline/css-inline": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@css-inline/css-inline/-/css-inline-0.17.0.tgz",
+ "integrity": "sha512-IPZ4Z86lxacvcxlQl0jm1Hn8oiojCLrsm8qDdH6aeKstJWPeF4RhnPv15oMlW3ytsW4OHYPfknIaYBHm5rjhWg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@css-inline/css-inline-android-arm-eabi": "0.17.0",
+ "@css-inline/css-inline-android-arm64": "0.17.0",
+ "@css-inline/css-inline-darwin-arm64": "0.17.0",
+ "@css-inline/css-inline-darwin-x64": "0.17.0",
+ "@css-inline/css-inline-linux-arm-gnueabihf": "0.17.0",
+ "@css-inline/css-inline-linux-arm64-gnu": "0.17.0",
+ "@css-inline/css-inline-linux-arm64-musl": "0.17.0",
+ "@css-inline/css-inline-linux-x64-gnu": "0.17.0",
+ "@css-inline/css-inline-linux-x64-musl": "0.17.0",
+ "@css-inline/css-inline-win32-arm64-msvc": "0.17.0",
+ "@css-inline/css-inline-win32-x64-msvc": "0.17.0"
+ }
+ },
+ "node_modules/@css-inline/css-inline-android-arm-eabi": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@css-inline/css-inline-android-arm-eabi/-/css-inline-android-arm-eabi-0.17.0.tgz",
+ "integrity": "sha512-4Tw2OH+0Ob6RJfVqjA7Pjg2jKhLQIeDmxO2ZirD7j7o/s7JvJwkBXhOgCBIPIbl7CviLQ0FzZPPbcTs7vn/Mtw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@css-inline/css-inline-android-arm64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@css-inline/css-inline-android-arm64/-/css-inline-android-arm64-0.17.0.tgz",
+ "integrity": "sha512-Glbl4g27GIXWP+CbDOlGMUB9XIzrac9mU9s/VHN8dP8RDuEmxOCgA3eZVXns7/uijLSDIwQJTxjLstv3o5dTMQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@css-inline/css-inline-darwin-arm64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@css-inline/css-inline-darwin-arm64/-/css-inline-darwin-arm64-0.17.0.tgz",
+ "integrity": "sha512-MQ2myM834msxt4cEl1NOp9oP3xdIJAm4Y9JUa3NASbzNPCUsPD4CoJb8x4zgeIBIswo+HJOytIOUQpRrJstxeQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@css-inline/css-inline-darwin-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@css-inline/css-inline-darwin-x64/-/css-inline-darwin-x64-0.17.0.tgz",
+ "integrity": "sha512-cCO+tI5NSkizLxRVjAqnIv0M7y/GfhY3w68mN/wPxmUHk9NuLnvZS2M4CcYs7FLQ63eE3MQLbHuk6hRKjDCcSg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@css-inline/css-inline-linux-arm-gnueabihf": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@css-inline/css-inline-linux-arm-gnueabihf/-/css-inline-linux-arm-gnueabihf-0.17.0.tgz",
+ "integrity": "sha512-bqrT9HbOrXj6kpw/dGuJXgsx8id3HMtPUygxMeiy/GOB4x3/xusTRuNne6tOxWkqw/Obu86T1wy/h2SUaXnDgg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@css-inline/css-inline-linux-arm64-gnu": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@css-inline/css-inline-linux-arm64-gnu/-/css-inline-linux-arm64-gnu-0.17.0.tgz",
+ "integrity": "sha512-1eQ4ajlcALxDACG86UcRM/n91/orMbHIw5e2NmD0+Y8nZsxXXUZJq2Rw7R2TETsOMxJC2IY12o8PS26Rw94D6A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@css-inline/css-inline-linux-arm64-musl": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@css-inline/css-inline-linux-arm64-musl/-/css-inline-linux-arm64-musl-0.17.0.tgz",
+ "integrity": "sha512-Sq3nhiPyVXII7qIJlGK3lHWCCNJfOSDo0fEKPi4o9iDSO1L78um9vtIUrnJe/craoeza1vJb1xd5IASmVCU0Cg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@css-inline/css-inline-linux-x64-gnu": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@css-inline/css-inline-linux-x64-gnu/-/css-inline-linux-x64-gnu-0.17.0.tgz",
+ "integrity": "sha512-zpKlmEl8l7QCrtVP6nbfnnYuSbwSjWsZRTVG1JLcIcx5LkxLzE7d7+NIQ3C4Myb0n0SeOuGVEVAZwFNct7Ksog==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@css-inline/css-inline-linux-x64-musl": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@css-inline/css-inline-linux-x64-musl/-/css-inline-linux-x64-musl-0.17.0.tgz",
+ "integrity": "sha512-0SxccSQa4reAekGdHsSv2VzTiG+ZTgNsnYM3lIeHRfv10n0a0/Px1KDmwe7RlHJytkH15T7Tubv8FEcjfOqZBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@css-inline/css-inline-win32-arm64-msvc": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@css-inline/css-inline-win32-arm64-msvc/-/css-inline-win32-arm64-msvc-0.17.0.tgz",
+ "integrity": "sha512-DY3GAPpzjzaW2xCdelPKZM90ldrUieodTFZCQhjOODftTGf4wd5cj2741DcuDg2aqDGAZ6PtXbeysfmx+DHy3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@css-inline/css-inline-win32-x64-msvc": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@css-inline/css-inline-win32-x64-msvc/-/css-inline-win32-x64-msvc-0.17.0.tgz",
+ "integrity": "sha512-CDCcVgBFxaun1LZhgnOBen/DnFGIdg88k3rQ653mB4qVsfI7Kyt8V3ezYdWAN7rZKvQL/sRQG4LOVAjPsrJWgA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@csstools/color-helpers": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz",
+ "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@csstools/css-calc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz",
+ "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/@csstools/css-color-parser": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz",
+ "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/color-helpers": "^5.0.2",
+ "@csstools/css-calc": "^2.1.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/@csstools/css-parser-algorithms": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz",
+ "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/@csstools/css-tokenizer": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz",
+ "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@docsearch/css": {
"version": "3.8.2",
"resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz",
@@ -1383,6 +1707,25 @@
"url": "https://github.com/sponsors/antfu"
}
},
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.9.8",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.8.tgz",
+ "integrity": "sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.6"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/algoliasearch": {
"version": "5.35.0",
"resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz",
@@ -1408,6 +1751,43 @@
"node": ">= 14.0.0"
}
},
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0",
+ "peer": true
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/birpc": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz",
@@ -1417,6 +1797,62 @@
"url": "https://github.com/sponsors/antfu"
}
},
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "devOptional": true,
+ "license": "ISC"
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/canvas": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.1.2.tgz",
+ "integrity": "sha512-Z/tzFAcBzoCvJlOSlCnoekh1Gu8YMn0J51+UAuXJAbW1Z6I9l2mZgdD7738MepoeeIcUdDtbMnOg6cC7GJxy/g==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "node-addon-api": "^7.0.0",
+ "prebuild-install": "^7.1.3"
+ },
+ "engines": {
+ "node": "^18.12.0 || >= 20.9.0"
+ }
+ },
"node_modules/ccount": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
@@ -1447,9 +1883,54 @@
"url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/comma-separated-tokens": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "node_modules/cheerio": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz",
+ "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "cheerio-select": "^1.5.0",
+ "dom-serializer": "^1.3.2",
+ "domhandler": "^4.2.0",
+ "htmlparser2": "^6.1.0",
+ "parse5": "^6.0.1",
+ "parse5-htmlparser2-tree-adapter": "^6.0.1",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/cheerio-select": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz",
+ "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==",
+ "devOptional": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "css-select": "^4.3.0",
+ "css-what": "^6.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "license": "ISC"
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
"integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
"license": "MIT",
"funding": {
@@ -1457,6 +1938,16 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/commander": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/copy-anything": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
@@ -1472,12 +1963,149 @@
"url": "https://github.com/sponsors/mesqueeb"
}
},
+ "node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "devOptional": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "devOptional": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssstyle": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz",
+ "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@asamuzakjp/css-color": "^3.2.0",
+ "rrweb-cssom": "^0.8.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"license": "MIT"
},
+ "node_modules/data-urls": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
+ "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-mimetype": "^4.0.0",
+ "whatwg-url": "^14.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/data-urls/node_modules/tr46": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
+ "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/data-urls/node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/data-urls/node_modules/whatwg-url": {
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
+ "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "^5.1.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
+ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+ "license": "MIT"
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
"node_modules/dequal": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
@@ -1487,6 +2115,15 @@
"node": ">=6"
}
},
+ "node_modules/detect-libc": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
+ "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/devlop": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
@@ -1500,12 +2137,90 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "devOptional": true,
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "devOptional": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "devOptional": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "devOptional": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
"node_modules/emoji-regex-xs": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz",
"integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==",
"license": "MIT"
},
+ "node_modules/end-of-stream": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
@@ -1556,12 +2271,44 @@
"@esbuild/win32-x64": "0.21.5"
}
},
+ "node_modules/escape-goat": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz",
+ "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/esm": {
+ "version": "3.2.25",
+ "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"license": "MIT"
},
+ "node_modules/expand-template": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+ "license": "(MIT OR WTFPL)",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/focus-trap": {
"version": "7.6.5",
"resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.5.tgz",
@@ -1571,6 +2318,12 @@
"tabbable": "^6.2.0"
}
},
+ "node_modules/fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "license": "MIT"
+ },
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -1585,6 +2338,12 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
+ "node_modules/github-from-package": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
+ "license": "MIT"
+ },
"node_modules/hast-util-to-html": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
@@ -1627,6 +2386,18 @@
"integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
"license": "MIT"
},
+ "node_modules/html-encoding-sniffer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
+ "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-encoding": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/html-void-elements": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
@@ -1637,6 +2408,112 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/htmlparser2": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+ "devOptional": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/htmlparser2/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "devOptional": true,
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "license": "MIT"
+ },
"node_modules/is-what": {
"version": "4.1.16",
"resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
@@ -1649,6 +2526,139 @@
"url": "https://github.com/sponsors/mesqueeb"
}
},
+ "node_modules/jsdom": {
+ "version": "26.1.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz",
+ "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssstyle": "^4.2.1",
+ "data-urls": "^5.0.0",
+ "decimal.js": "^10.5.0",
+ "html-encoding-sniffer": "^4.0.0",
+ "http-proxy-agent": "^7.0.2",
+ "https-proxy-agent": "^7.0.6",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.16",
+ "parse5": "^7.2.1",
+ "rrweb-cssom": "^0.8.0",
+ "saxes": "^6.0.0",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^5.1.1",
+ "w3c-xmlserializer": "^5.0.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^3.1.1",
+ "whatwg-mimetype": "^4.0.0",
+ "whatwg-url": "^14.1.1",
+ "ws": "^8.18.0",
+ "xml-name-validator": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "canvas": "^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jsdom/node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/jsdom/node_modules/parse5": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/jsdom/node_modules/tr46": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
+ "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/jsdom/node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/jsdom/node_modules/whatwg-url": {
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
+ "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "^5.1.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/juice": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/juice/-/juice-8.1.0.tgz",
+ "integrity": "sha512-FLzurJrx5Iv1e7CfBSZH68dC04EEvXvvVvPYB7Vx1WAuhCp1ZPIMtqxc+WTWxVkpTIC2Ach/GAv0rQbtGf6YMA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "cheerio": "1.0.0-rc.10",
+ "commander": "^6.1.0",
+ "mensch": "^0.3.4",
+ "slick": "^1.12.2",
+ "web-resource-inliner": "^6.0.1"
+ },
+ "bin": {
+ "juice": "bin/juice"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "uc.micro": "^2.0.0"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
+ },
"node_modules/magic-string": {
"version": "0.30.17",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
@@ -1664,6 +2674,48 @@
"integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
"license": "MIT"
},
+ "node_modules/markdown-it": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
+ "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "^4.4.0",
+ "linkify-it": "^5.0.0",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.1.0"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.mjs"
+ }
+ },
+ "node_modules/markdown-it-mathjax3": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/markdown-it-mathjax3/-/markdown-it-mathjax3-4.3.2.tgz",
+ "integrity": "sha512-TX3GW5NjmupgFtMJGRauioMbbkGsOXAAt1DZ/rzzYmTHqzkO1rNAdiMD4NiruurToPApn2kYy76x02QN26qr2w==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "juice": "^8.0.0",
+ "mathjax-full": "^3.2.0"
+ }
+ },
+ "node_modules/mathjax-full": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz",
+ "integrity": "sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esm": "^3.2.25",
+ "mhchemparser": "^4.1.0",
+ "mj-context-menu": "^0.6.1",
+ "speech-rule-engine": "^4.0.6"
+ }
+ },
"node_modules/mdast-util-to-hast": {
"version": "13.2.0",
"resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
@@ -1685,6 +2737,27 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/mensch": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz",
+ "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/mhchemparser": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz",
+ "integrity": "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==",
+ "devOptional": true,
+ "license": "Apache-2.0"
+ },
"node_modules/micromark-util-character": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
@@ -1774,6 +2847,40 @@
],
"license": "MIT"
},
+ "node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "devOptional": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/minisearch": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.2.tgz",
@@ -1786,6 +2893,25 @@
"integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
"license": "MIT"
},
+ "node_modules/mj-context-menu": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz",
+ "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==",
+ "devOptional": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+ "license": "MIT"
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
"node_modules/nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
@@ -1800,8 +2926,81 @@
"bin": {
"nanoid": "bin/nanoid.cjs"
},
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/napi-build-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
+ "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
+ "license": "MIT"
+ },
+ "node_modules/node-abi": {
+ "version": "3.75.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz",
+ "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==",
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "license": "MIT"
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "devOptional": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/nwsapi": {
+ "version": "2.2.21",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz",
+ "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==",
+ "license": "MIT"
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
}
},
"node_modules/oniguruma-to-es": {
@@ -1815,6 +3014,23 @@
"regex-recursion": "^6.0.2"
}
},
+ "node_modules/parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
+ "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse5": "^6.0.1"
+ }
+ },
"node_modules/perfect-debounce": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
@@ -1865,6 +3081,32 @@
"url": "https://opencollective.com/preact"
}
},
+ "node_modules/prebuild-install": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
+ "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "expand-template": "^2.0.3",
+ "github-from-package": "0.0.0",
+ "minimist": "^1.2.3",
+ "mkdirp-classic": "^0.5.3",
+ "napi-build-utils": "^2.0.0",
+ "node-abi": "^3.3.0",
+ "pump": "^3.0.0",
+ "rc": "^1.2.7",
+ "simple-get": "^4.0.0",
+ "tar-fs": "^2.0.0",
+ "tunnel-agent": "^0.6.0"
+ },
+ "bin": {
+ "prebuild-install": "bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/property-information": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
@@ -1875,6 +3117,64 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/pump": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
+ "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/regex": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz",
@@ -1944,6 +3244,71 @@
"fsevents": "~2.3.2"
}
},
+ "node_modules/rrweb-cssom": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz",
+ "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==",
+ "license": "MIT"
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/saxes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "license": "ISC",
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=v12.22.7"
+ }
+ },
+ "node_modules/sb-mdit": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/sb-mdit/-/sb-mdit-0.2.1.tgz",
+ "integrity": "sha512-FkNHWVkHFXHq+O+6Oxjbufut3TFjSg2J6UxJiOfbT7B7A5bYoBuVHvwKFiLdJqo8L8gAYIK5raJLcFHjaYnw+A==",
+ "dependencies": {
+ "@css-inline/css-inline": "^0.17.0",
+ "canvas": "^3.1.2",
+ "jsdom": "^26.1.0",
+ "scratchblocks": "^3.6.4"
+ },
+ "peerDependencies": {
+ "markdown-it": "^14.1.0",
+ "typescript": "^5"
+ }
+ },
+ "node_modules/scratchblocks": {
+ "version": "3.6.4",
+ "resolved": "https://registry.npmjs.org/scratchblocks/-/scratchblocks-3.6.4.tgz",
+ "integrity": "sha512-2qesRNViXrceNG7OvMim3D2rBQ2qDjH24VwRVijef1XQlLmEKNiMItx/3dQpdybnUDXTnfZyRU41vc/if+Au7w==",
+ "license": "MIT"
+ },
"node_modules/search-insights": {
"version": "2.17.3",
"resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz",
@@ -1951,6 +3316,18 @@
"license": "MIT",
"peer": true
},
+ "node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/shiki": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz",
@@ -1967,6 +3344,61 @@
"@types/hast": "^3.0.4"
}
},
+ "node_modules/simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/simple-get": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decompress-response": "^6.0.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
+ "node_modules/slick": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz",
+ "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==",
+ "devOptional": true,
+ "license": "MIT (http://mootools.net/license.txt)",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@@ -1995,6 +3427,40 @@
"node": ">=0.10.0"
}
},
+ "node_modules/speech-rule-engine": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.1.2.tgz",
+ "integrity": "sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@xmldom/xmldom": "0.9.8",
+ "commander": "13.1.0",
+ "wicked-good-xpath": "1.3.0"
+ },
+ "bin": {
+ "sre": "bin/sre"
+ }
+ },
+ "node_modules/speech-rule-engine/node_modules/commander": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
+ "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
"node_modules/stringify-entities": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
@@ -2009,6 +3475,15 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/superjson": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz",
@@ -2021,12 +3496,83 @@
"node": ">=16"
}
},
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "license": "MIT"
+ },
"node_modules/tabbable": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
"integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
"license": "MIT"
},
+ "node_modules/tar-fs": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz",
+ "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==",
+ "license": "MIT",
+ "dependencies": {
+ "chownr": "^1.1.1",
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^2.1.4"
+ }
+ },
+ "node_modules/tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tldts": {
+ "version": "6.1.86",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
+ "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
+ "license": "MIT",
+ "dependencies": {
+ "tldts-core": "^6.1.86"
+ },
+ "bin": {
+ "tldts": "bin/cli.js"
+ }
+ },
+ "node_modules/tldts-core": {
+ "version": "6.1.86",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
+ "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
+ "license": "MIT"
+ },
+ "node_modules/tough-cookie": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
+ "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tldts": "^6.1.32"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "devOptional": true,
+ "license": "MIT"
+ },
"node_modules/trim-lines": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
@@ -2037,6 +3583,46 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "devOptional": true,
+ "license": "0BSD"
+ },
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/uc.micro": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/unist-util-is": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
@@ -2105,6 +3691,22 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/valid-data-url": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz",
+ "integrity": "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/vfile": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
@@ -2254,6 +3856,166 @@
}
}
},
+ "node_modules/w3c-xmlserializer": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
+ "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
+ "license": "MIT",
+ "dependencies": {
+ "xml-name-validator": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/web-resource-inliner": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz",
+ "integrity": "sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "^4.1.1",
+ "escape-goat": "^3.0.0",
+ "htmlparser2": "^5.0.0",
+ "mime": "^2.4.6",
+ "node-fetch": "^2.6.0",
+ "valid-data-url": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/web-resource-inliner/node_modules/domhandler": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz",
+ "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==",
+ "devOptional": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/web-resource-inliner/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "devOptional": true,
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/web-resource-inliner/node_modules/htmlparser2": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz",
+ "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^3.3.0",
+ "domutils": "^2.4.2",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/htmlparser2?sponsor=1"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "devOptional": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+ "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+ "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/wicked-good-xpath": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz",
+ "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/ws": {
+ "version": "8.18.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
+ "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "license": "MIT"
+ },
"node_modules/zwitch": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
diff --git a/package.json b/package.json
index e1920bc..1d23fa0 100644
--- a/package.json
+++ b/package.json
@@ -5,6 +5,10 @@
"docs:preview": "vitepress preview ./"
},
"dependencies": {
+ "sb-mdit": "^0.2.1",
"vitepress": "^1.6.3"
+ },
+ "devDependencies": {
+ "markdown-it-mathjax3": "^4.3.2"
}
}
From 965b55e6af0625a7dbebc465b9ac23add5ac2873 Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Sun, 3 Aug 2025 22:43:46 -0400
Subject: [PATCH 13/20] fix assets not importing
After some tinkering, I finally realized that the apostrophe in the name "don't-rotate.gif" was causing the error with vitepress! It put a single quote inside a single-quoted string...
// code in the internal error
import _imports_2 from '/img/don't-rotate.gif'
vitepress complained that it was invalid JS syntax because, well, it was! Yes, this is probably an error that shouldn't happen in the first place, but it's amazing how little things like that can mess it all up.
For now, the apostrophe has been removed from the file name, and it now properly loads. Additionally, all assets have been moved to the public folder for easier organization.
---
concepts/index.md | 10 +---------
{img => public/img}/all-around.gif | Bin
img/don't-rotate.gif => public/img/dont-rotate.gif | Bin
{img => public/img}/left-right.gif | Bin
4 files changed, 1 insertion(+), 9 deletions(-)
rename {img => public/img}/all-around.gif (100%)
rename img/don't-rotate.gif => public/img/dont-rotate.gif (100%)
rename {img => public/img}/left-right.gif (100%)
diff --git a/concepts/index.md b/concepts/index.md
index ab32956..4219f8b 100644
--- a/concepts/index.md
+++ b/concepts/index.md
@@ -365,23 +365,15 @@ The following table describes a sprite's *rendered* direction when using differe
#### Rotation Style: All Around
-(commented out)
-
-```md

-```
#### Rotation Style: Left-Right
-```md

-```
#### Rotation Style: Don't Rotate
-```md
-
-```
+
### String
diff --git a/img/all-around.gif b/public/img/all-around.gif
similarity index 100%
rename from img/all-around.gif
rename to public/img/all-around.gif
diff --git a/img/don't-rotate.gif b/public/img/dont-rotate.gif
similarity index 100%
rename from img/don't-rotate.gif
rename to public/img/dont-rotate.gif
diff --git a/img/left-right.gif b/public/img/left-right.gif
similarity index 100%
rename from img/left-right.gif
rename to public/img/left-right.gif
From 119ec126c1757c81c1a74bf079beae10cdeb4db9 Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Sun, 3 Aug 2025 23:59:57 -0400
Subject: [PATCH 14/20] break off Contents page
per @gradylink's suggestion
---
.vitepress/config.mts | 5 +-
contents/index.md | 156 +++++++++++++++++++++++++++++++++++++
index.md | 174 ++----------------------------------------
3 files changed, 164 insertions(+), 171 deletions(-)
create mode 100644 contents/index.md
diff --git a/.vitepress/config.mts b/.vitepress/config.mts
index 76c9cd7..29c53b6 100644
--- a/.vitepress/config.mts
+++ b/.vitepress/config.mts
@@ -26,8 +26,9 @@ export default defineConfig({
text: 'Introduction',
link: '/intro/',
items: [
- { text: 'Frequently Asked Questions', link: '/intro/#faq' },
- { text: 'Contributing Guidelines', link: '/intro/#contributing' }
+ { text: 'FAQ', link: '/intro/#faq' },
+ { text: 'Contents', link: '/contents/' },
+ { text: 'Contributing', link: '/intro/#contributing' }
]
},
{
diff --git a/contents/index.md b/contents/index.md
new file mode 100644
index 0000000..024a472
--- /dev/null
+++ b/contents/index.md
@@ -0,0 +1,156 @@
+# Contents
+
+> Last updated on **August 3rd, 2025 EST**. Changes to the spec may have been made since then that are not reflected below.
+
+* [Scratch Specification](/)
+ * [Contents](#)
+ * [Introduction](/intro/)
+ * [Preliminaries](/intro/#preliminaries)
+ * [Sources](/intro/#sources)
+ * [Contributing](/intro/#contributing)
+ * [FAQ](/intro/#faq)
+ * [Where to start?](/intro/#where-to-start)
+ * [What's the point?](/intro/#whats-the-point)
+ * [Why?](/intro/#why)
+ * [TODO](#todo)
+ * [TODO: Blocks](#todo-blocks)
+ * [Concepts](/concepts/)
+ * [Capabilities](/concepts/#capabilities)
+ * [Constants](/concepts/#constants)
+ * [Stage Bounds](/concepts/#stage-bounds)
+ * [Stage Width](/concepts/#stage-width)
+ * [Stage Height](/concepts/#stage-height)
+ * [Left Edge](/concepts/#left-edge)
+ * [Right Edge](/concepts/#right-edge)
+ * [Top Edge](/concepts/#top-edge)
+ * [Bottom Edge](/concepts/#bottom-edge)
+ * [Limits](/concepts/#limits)
+ * [Max Items](/concepts/#max-items)
+ * [Max Clones](/concepts/#max-clones)
+ * [Ideas](/concepts/#ideas)
+ * [Asset](/concepts/#asset)
+ * [Costume](/concepts/#costume)
+ * [Sound](/concepts/#sound)
+ * [Block](/concepts/#block)
+ * [Standard Blocks](/concepts/#standard-blocks)
+ * [Hidden Blocks](/concepts/#hidden-blocks)
+ * [Clone](/concepts/#clone)
+ * [Edge](/concepts/#edge)
+ * [Flag](/concepts/#flag)
+ * [JavaScript](/concepts/#javascript)
+ * [List](/concepts/#list)
+ * [Mod](/concepts/#mod)
+ * [Opcode](/concepts/#opcode)
+ * [Project](/concepts/#project)
+ * [Runtime](/concepts/#runtime)
+ * [Script](/concepts/#script)
+ * [Sprite](/concepts/#sprite)
+ * [Stage](/concepts/#stage)
+ * [Target](/concepts/#target)
+ * [User](/concepts/#user)
+ * [Variable](/concepts/#variable)
+ * [Values](/concepts/#values)
+ * [Value](/concepts/#value)
+ * [Angle](/concepts/#angle)
+ * [Answer](/concepts/#answer)
+ * [Boolean](/concepts/#boolean)
+ * [True](/concepts/#true)
+ * [False](/concepts/#false)
+ * [Direction](/concepts/#direction)
+ * [Integer](/concepts/#integer)
+ * [Item](/concepts/#item)
+ * [Key](/concepts/#key)
+ * [Length](/concepts/#length)
+ * [Letter](/concepts/#letter)
+ * [Name](/concepts/#name)
+ * [Number](/concepts/#number)
+ * [Infinity](/concepts/#infinity)
+ * [-Infinity](/concepts/#-infinity)
+ * [NaN](/concepts/#nan)
+ * [Rotation Style](/concepts/#rotation-style)
+ * [Rotation Style: All Around](/concepts/#rotation-style-all-around)
+ * [Rotation Style: Left-Right](/concepts/#rotation-style-left-right)
+ * [Rotation Style: Don't Rotate](/concepts/#rotation-style-dont-rotate)
+ * [String](/concepts/#string)
+ * [Empty String](/concepts/#empty-string)
+ * [Undefined](/concepts/#undefined)
+ * [Username](/concepts/#username)
+ * [X Position](/concepts/#x-position)
+ * [Y Position](/concepts/#y-position)
+ * [Other Values](/concepts/#other-values)
+ * [Procedures](/concepts/#procedures)
+ * [Casting](/concepts/#casting)
+ * [To String](/concepts/#to-string)
+ * [To Number](/concepts/#to-number)
+ * [To Boolean](/concepts/#to-boolean)
+ * [Falsy](/concepts/#falsy)
+ * [Truthy](/concepts/#truthy)
+ * [To Direction](/concepts/#to-direction)
+ * [Fencing](/concepts/#fencing)
+ * [Fencing Position](/concepts/#fencing-position)
+ * [Fencing Size](/concepts/#fencing-size)
+ * [Palette](#palette)
+ * [Example block](#example-block)
+ * [Motion blocks](#motion-blocks)
+ * [Standard motion blocks](#standard-motion-blocks)
+ * [motion\_movesteps](#motion_movesteps)
+ * [Hidden motion blocks](#hidden-motion-blocks)
+ * [Looks blocks](#looks-blocks)
+ * [Standard looks blocks](#standard-looks-blocks)
+ * [Hidden looks blocks](#hidden-looks-blocks)
+ * [Sound blocks](#sound-blocks)
+ * [Standard sound blocks](#standard-sound-blocks)
+ * [Hidden sound blocks](#hidden-sound-blocks)
+ * [Events blocks](#events-blocks)
+ * [Standard events blocks](#standard-events-blocks)
+ * [Hidden events blocks](#hidden-events-blocks)
+ * [Control blocks](#control-blocks)
+ * [Standard control blocks](#standard-control-blocks)
+ * [Hidden control blocks](#hidden-control-blocks)
+ * [Sensing blocks](#sensing-blocks)
+ * [Standard sensing blocks](#standard-sensing-blocks)
+ * [sensing\_username](#sensing_username)
+ * [Hidden sensing blocks](#hidden-sensing-blocks)
+ * [Operators blocks](#operators-blocks)
+ * [Standard operators blocks](#standard-operators-blocks)
+ * [Hidden operators blocks](#hidden-operators-blocks)
+ * [Variables blocks](#variables-blocks)
+ * [Standard variables blocks](#standard-variables-blocks)
+ * [Hidden variables blocks](#hidden-variables-blocks)
+ * [List blocks](#list-blocks)
+ * [Standard list blocks](#standard-list-blocks)
+ * [Hidden list blocks](#hidden-list-blocks)
+ * [Custom blocks](#custom-blocks)
+ * [Standard custom blocks](#standard-custom-blocks)
+ * [Hidden custom blocks](#hidden-custom-blocks)
+ * [Special custom blocks](#special-custom-blocks)
+ * [Music blocks](#music-blocks)
+ * [Pen blocks](#pen-blocks)
+ * [Video Sensing blocks](#video-sensing-blocks)
+ * [Text to Speech blocks](#text-to-speech-blocks)
+ * [Translate blocks](#translate-blocks)
+ * [Makey Makey blocks](#makey-makey-blocks)
+ * [micro:bit blocks](#microbit-blocks)
+ * [LEGO EV3 blocks](#lego-ev3-blocks)
+ * [BOOST blocks](#boost-blocks)
+ * [WeDo 2.0 blocks](#wedo-20-blocks)
+ * [Force and Acceleration blocks](#force-and-acceleration-blocks)
+ * [CoreEx blocks](#coreex-blocks)
+ * [Standard CoreEx blocks](#standard-coreex-blocks)
+ * [Hidden CoreEx blocks](#hidden-coreex-blocks)
+ * [Appendices](#appendices)
+ * [File Format](#file-format)
+ * [SB3](#sb3)
+ * [SB2](#sb2)
+ * [SB](#sb)
+ * [Obsolete Blocks](#obsolete-blocks)
+ * [Nonstandard Blocks](#nonstandard-blocks)
+ * [Example nonstandard block](#example-nonstandard-block)
+ * [TurboWarp](#turbowarp)
+ * [TurboWarp blocks](#turbowarp-blocks)
+ * [Last key pressed block](#last-key-pressed-block)
+ * [Addon blocks](#addon-blocks)
+ * [PenguinMod](#penguinmod)
+ * [snail-ide](#snail-ide)
+ * [Unsandboxed](#unsandboxed)
+ * [Adding Platforms](#adding-platforms)
diff --git a/index.md b/index.md
index b6f5b2b..158fcc3 100644
--- a/index.md
+++ b/index.md
@@ -4,17 +4,17 @@ layout: home
hero:
name: "Scratch Specification"
- tagline: "A detailed explanation of how Scratch 3.0 works."
+ tagline: "A detailed explanation of how Scratch 3.0 works. WIP. This is in early stages and not yet complete."
actions:
- theme: brand
text: Introduction
link: /intro/
+ - theme: alt
+ text: Contents
+ link: /contents/
- theme: alt
text: FAQ
link: /intro/#faq
- - theme: alt
- text: Quickstart
- link: /intro/#where-to-start
features:
- title: Introduction
@@ -41,168 +41,4 @@ features:
- title: Scratch Link
link: /devices/
details: How Scratch interacts with programmable hardware components.
-
----
-
-#
-
-::: info
-
-This specification is a **work in progress**. Some pages may be moved, some sections are not yet written, and some ideas are still in the works. Check back for updates!
-
-:::
-
-## Contents
-
-* [Scratch Specification](#)
- * [Contents](#contents)
- * [Introduction](/intro/)
- * [Preliminaries](/intro/#preliminaries)
- * [Sources](/intro/#sources)
- * [Contributing](/intro/#contributing)
- * [FAQ](/intro/#faq)
- * [Where to start?](/intro/#where-to-start)
- * [What's the point?](/intro/#whats-the-point)
- * [Why?](/intro/#why)
- * [TODO](#todo)
- * [TODO: Blocks](#todo-blocks)
- * [Concepts](/concepts/)
- * [Capabilities](/concepts/#capabilities)
- * [Constants](/concepts/#constants)
- * [Stage Bounds](/concepts/#stage-bounds)
- * [Stage Width](/concepts/#stage-width)
- * [Stage Height](/concepts/#stage-height)
- * [Left Edge](/concepts/#left-edge)
- * [Right Edge](/concepts/#right-edge)
- * [Top Edge](/concepts/#top-edge)
- * [Bottom Edge](/concepts/#bottom-edge)
- * [Limits](/concepts/#limits)
- * [Max Items](/concepts/#max-items)
- * [Max Clones](/concepts/#max-clones)
- * [Ideas](/concepts/#ideas)
- * [Asset](/concepts/#asset)
- * [Costume](/concepts/#costume)
- * [Sound](/concepts/#sound)
- * [Block](/concepts/#block)
- * [Standard Blocks](/concepts/#standard-blocks)
- * [Hidden Blocks](/concepts/#hidden-blocks)
- * [Clone](/concepts/#clone)
- * [Edge](/concepts/#edge)
- * [Flag](/concepts/#flag)
- * [JavaScript](/concepts/#javascript)
- * [List](/concepts/#list)
- * [Mod](/concepts/#mod)
- * [Opcode](/concepts/#opcode)
- * [Project](/concepts/#project)
- * [Runtime](/concepts/#runtime)
- * [Script](/concepts/#script)
- * [Sprite](/concepts/#sprite)
- * [Stage](/concepts/#stage)
- * [Target](/concepts/#target)
- * [User](/concepts/#user)
- * [Variable](/concepts/#variable)
- * [Values](/concepts/#values)
- * [Value](/concepts/#value)
- * [Angle](/concepts/#angle)
- * [Answer](/concepts/#answer)
- * [Boolean](/concepts/#boolean)
- * [True](/concepts/#true)
- * [False](/concepts/#false)
- * [Direction](/concepts/#direction)
- * [Integer](/concepts/#integer)
- * [Item](/concepts/#item)
- * [Key](/concepts/#key)
- * [Length](/concepts/#length)
- * [Letter](/concepts/#letter)
- * [Name](/concepts/#name)
- * [Number](/concepts/#number)
- * [Infinity](/concepts/#infinity)
- * [-Infinity](/concepts/#-infinity)
- * [NaN](/concepts/#nan)
- * [Rotation Style](/concepts/#rotation-style)
- * [Rotation Style: All Around](/concepts/#rotation-style-all-around)
- * [Rotation Style: Left-Right](/concepts/#rotation-style-left-right)
- * [Rotation Style: Don't Rotate](/concepts/#rotation-style-dont-rotate)
- * [String](/concepts/#string)
- * [Empty String](/concepts/#empty-string)
- * [Undefined](/concepts/#undefined)
- * [Username](/concepts/#username)
- * [X Position](/concepts/#x-position)
- * [Y Position](/concepts/#y-position)
- * [Other Values](/concepts/#other-values)
- * [Procedures](/concepts/#procedures)
- * [Casting](/concepts/#casting)
- * [To String](/concepts/#to-string)
- * [To Number](/concepts/#to-number)
- * [To Boolean](/concepts/#to-boolean)
- * [Falsy](/concepts/#falsy)
- * [Truthy](/concepts/#truthy)
- * [To Direction](/concepts/#to-direction)
- * [Fencing](/concepts/#fencing)
- * [Fencing Position](/concepts/#fencing-position)
- * [Fencing Size](/concepts/#fencing-size)
- * [Palette](#palette)
- * [Example block](#example-block)
- * [Motion blocks](#motion-blocks)
- * [Standard motion blocks](#standard-motion-blocks)
- * [motion\_movesteps](#motion_movesteps)
- * [Hidden motion blocks](#hidden-motion-blocks)
- * [Looks blocks](#looks-blocks)
- * [Standard looks blocks](#standard-looks-blocks)
- * [Hidden looks blocks](#hidden-looks-blocks)
- * [Sound blocks](#sound-blocks)
- * [Standard sound blocks](#standard-sound-blocks)
- * [Hidden sound blocks](#hidden-sound-blocks)
- * [Events blocks](#events-blocks)
- * [Standard events blocks](#standard-events-blocks)
- * [Hidden events blocks](#hidden-events-blocks)
- * [Control blocks](#control-blocks)
- * [Standard control blocks](#standard-control-blocks)
- * [Hidden control blocks](#hidden-control-blocks)
- * [Sensing blocks](#sensing-blocks)
- * [Standard sensing blocks](#standard-sensing-blocks)
- * [sensing\_username](#sensing_username)
- * [Hidden sensing blocks](#hidden-sensing-blocks)
- * [Operators blocks](#operators-blocks)
- * [Standard operators blocks](#standard-operators-blocks)
- * [Hidden operators blocks](#hidden-operators-blocks)
- * [Variables blocks](#variables-blocks)
- * [Standard variables blocks](#standard-variables-blocks)
- * [Hidden variables blocks](#hidden-variables-blocks)
- * [List blocks](#list-blocks)
- * [Standard list blocks](#standard-list-blocks)
- * [Hidden list blocks](#hidden-list-blocks)
- * [Custom blocks](#custom-blocks)
- * [Standard custom blocks](#standard-custom-blocks)
- * [Hidden custom blocks](#hidden-custom-blocks)
- * [Special custom blocks](#special-custom-blocks)
- * [Music blocks](#music-blocks)
- * [Pen blocks](#pen-blocks)
- * [Video Sensing blocks](#video-sensing-blocks)
- * [Text to Speech blocks](#text-to-speech-blocks)
- * [Translate blocks](#translate-blocks)
- * [Makey Makey blocks](#makey-makey-blocks)
- * [micro:bit blocks](#microbit-blocks)
- * [LEGO EV3 blocks](#lego-ev3-blocks)
- * [BOOST blocks](#boost-blocks)
- * [WeDo 2.0 blocks](#wedo-20-blocks)
- * [Force and Acceleration blocks](#force-and-acceleration-blocks)
- * [CoreEx blocks](#coreex-blocks)
- * [Standard CoreEx blocks](#standard-coreex-blocks)
- * [Hidden CoreEx blocks](#hidden-coreex-blocks)
- * [Appendices](#appendices)
- * [File Format](#file-format)
- * [SB3](#sb3)
- * [SB2](#sb2)
- * [SB](#sb)
- * [Obsolete Blocks](#obsolete-blocks)
- * [Nonstandard Blocks](#nonstandard-blocks)
- * [Example nonstandard block](#example-nonstandard-block)
- * [TurboWarp](#turbowarp)
- * [TurboWarp blocks](#turbowarp-blocks)
- * [Last key pressed block](#last-key-pressed-block)
- * [Addon blocks](#addon-blocks)
- * [PenguinMod](#penguinmod)
- * [snail-ide](#snail-ide)
- * [Unsandboxed](#unsandboxed)
- * [Adding Platforms](#adding-platforms)
+---
\ No newline at end of file
From 17a1379754a9d0be9d073cebf63830ee0d30bf09 Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Mon, 4 Aug 2025 00:09:43 -0400
Subject: [PATCH 15/20] Quickly fix Contents link
---
intro/index.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/intro/index.md b/intro/index.md
index 22f166f..de2e4cf 100644
--- a/intro/index.md
+++ b/intro/index.md
@@ -31,7 +31,7 @@ Please [contribute on GitHub](https://github.com/OceanIsEndless/scratch-spec/pul
### Where to start?
-* If you want a **general understanding** of Scratch's inner workings for whatever reason, find whatever interests you in the [table of contents](/#contents) and just gloss over whatever you don't need to know.
+* If you want a **general understanding** of Scratch's inner workings for whatever reason, find whatever interests you in the [table of contents](/contents/) and just gloss over whatever you don't need to know.
* If you want **formal definitions** of Scratch terms, see [concepts](/concepts/).
* If you want to accurately **recreate blocks**, see the [palette](/palette/).
* If you want to recreate old blocks, see [obsolete blocks](/palette/#obsolete-blocks).
From 94f070a405c06f5fb29dfe83b597d4f91ae9cf50 Mon Sep 17 00:00:00 2001
From: OceanIsEndless <154556928+OceanIsEndless@users.noreply.github.com>
Date: Mon, 4 Aug 2025 17:36:32 -0400
Subject: [PATCH 16/20] add dark mode friendly rotation style graphics
And also just nicer graphics in general
---
concepts/index.md | 18 +++++++++++++++---
public/img/all-around.gif | Bin 3160506 -> 0 bytes
public/img/all-around.webm | Bin 0 -> 946275 bytes
public/img/dont-rotate.gif | Bin 2740265 -> 0 bytes
public/img/dont-rotate.webm | Bin 0 -> 508627 bytes
public/img/left-right.gif | Bin 2798383 -> 0 bytes
public/img/left-right.webm | Bin 0 -> 486777 bytes
7 files changed, 15 insertions(+), 3 deletions(-)
delete mode 100644 public/img/all-around.gif
create mode 100644 public/img/all-around.webm
delete mode 100644 public/img/dont-rotate.gif
create mode 100644 public/img/dont-rotate.webm
delete mode 100644 public/img/left-right.gif
create mode 100644 public/img/left-right.webm
diff --git a/concepts/index.md b/concepts/index.md
index 4219f8b..14910ef 100644
--- a/concepts/index.md
+++ b/concepts/index.md
@@ -365,15 +365,27 @@ The following table describes a sprite's *rendered* direction when using differe
#### Rotation Style: All Around
-
+
#### Rotation Style: Left-Right
-
+
#### Rotation Style: Don't Rotate
-
+
### String
diff --git a/public/img/all-around.gif b/public/img/all-around.gif
deleted file mode 100644
index 8f6b60f77d8b34a137cec1f92dd5c961d4a9437c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 3160506
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