From b63db4f0153a42777fad19530879cb9c3aa847ee Mon Sep 17 00:00:00 2001 From: Andrew Hull Date: Sat, 20 Jan 2024 14:57:45 -0500 Subject: [PATCH] more game docs, ui playground --- .gitignore | 2 +- docs/game/_category_.json | 2 +- docs/game/actions.md | 461 ++++++++++++++- docs/game/board.md | 243 ++++++++ docs/game/core-concepts.md | 68 +++ docs/game/create-a-blog-post.md | 34 -- docs/game/create-a-document.md | 8 - docs/game/creating-a-game.md | 30 + docs/game/define-flow.md | 7 - docs/game/flow.md | 416 ++++++++++++++ docs/game/markdown-features.mdx | 123 ---- docs/game/players.md | 91 +++ docs/game/ui.mdx | 26 + docs/introduction/intro.md | 15 +- docusaurus.config.js | 15 +- package.json | 7 +- src/components/Layout.jsx | 99 ++++ src/components/layout.module.css | 19 + static/img/move.png | Bin 0 -> 8323 bytes yarn.lock | 932 ++++++++++++++++++++++++++++++- 20 files changed, 2384 insertions(+), 214 deletions(-) create mode 100644 docs/game/board.md create mode 100644 docs/game/core-concepts.md delete mode 100644 docs/game/create-a-blog-post.md delete mode 100644 docs/game/create-a-document.md create mode 100644 docs/game/creating-a-game.md delete mode 100644 docs/game/define-flow.md create mode 100644 docs/game/flow.md delete mode 100644 docs/game/markdown-features.mdx create mode 100644 docs/game/players.md create mode 100644 docs/game/ui.mdx create mode 100644 src/components/Layout.jsx create mode 100644 src/components/layout.module.css create mode 100644 static/img/move.png diff --git a/.gitignore b/.gitignore index c9be649..2ba4c7e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ # Generated files .docusaurus .cache-loader -/docs +docs/api # Misc .DS_Store diff --git a/docs/game/_category_.json b/docs/game/_category_.json index e37256f..ad750ee 100644 --- a/docs/game/_category_.json +++ b/docs/game/_category_.json @@ -1,5 +1,5 @@ { - "label": "Game logic", + "label": "Building a game", "position": 2, "link": { "type": "generated-index", diff --git a/docs/game/actions.md b/docs/game/actions.md index 8432b86..c0ad19f 100644 --- a/docs/game/actions.md +++ b/docs/game/actions.md @@ -1,31 +1,462 @@ --- -sidebar_position: 2 +sidebar_position: 5 --- +# Actions +Actions are the building blocks of your game as it relates to its players. A +player will play the game by selecting and taking actions. It's your job to +define the possible actions and when each player can perform each. -# Deploy your site +## What constitutes an Action? -Docusaurus is a **static-site-generator** (also called **[Jamstack](https://jamstack.org/)**). +An Action is a discrete unit of choice for a player. Even if an action has +several different choices, it must be taken altogether or not at all. If a +player makes one of the choices but then changes their mind, they can freely +cancel the action without an undo, and no other player will be aware of their +"partial" action. -It builds your site as simple **static HTML, JavaScript and CSS files**. +:::info Actions are units of choice +A chess move as a Boardzilla Action would have two **selections**: +- Piece to move +- Space to move it to -## Build your site +You can select them each in turn (or both at once by dragging) but you if you +select a pawn and change your mind, you can unselect it and select a +knight. Selecting the piece by itself does not constitute an action until the +destination space is selected. -Build your site **for production**: +::: -```bash -npm run build +Each action may contain several selections for the player to make, but they must +all be available to the player with the information they have at the time they +begin the action. If an action requires more choices as information is revealed, +that must be a separate action. (see [follow-ups](#follow-ups)). + +:::tip Actions are like functions + +Think of actions like function calls. An action for a chess move would be like a +function named `move` that takes two arguments `piece` and `space`. This is a +single action, not two. The player's client would essentially make a call like: + + + +For this reason, you will sometimes see the values selected by the players +called "arguments". +::: + +## Anatomy of an action + +An action consists of several properties. +- a unique **name** by which it will be refered to, e.g. `playCard` +- a series of zero or more **selections** that a player must make to perform the + action +- **behaviour** of the action such as moving or changing the board or sending a + message +- any other special **properites** of the action, such as prompts, conditions, + confirmations and validations + +Actions are all created in a single place inside the +[createGame](../api/modules#creategame) when you call +[`game.defineActions`](../api/classes/game#defineactions). Each action is listed +with it's name, and the selections and behaviours of the action are chained onto +it, e.g.: + +```ts title="Chaining action methods" + game.defineActions({ + bid: player => action({ + prompt: 'Make a bid', + condition: !player.passedThisAuction + }).chooseNumber( + 'amount', { + min: board.lastBid ?? 1 + max: player.money, + } + ).do( + ({ amount }) => board.lastBid = amount + ).message( + `{{player}} bid {{amount}}` + ), + }); +``` + +There's quite a bit going on with this action. Let's break it down: + +- The **name** of the action is `"bid"`, defined as the key of the object. +- Notice that the action function accepts a `player` argument. This is the + player performing this action, which is why later in the action we can refer + to the player's `money` and use their name in the message. +- This action has one **selection** which is named `"amount"`. This is a number + selection created with [`chooseNumber`](../api/classes/Action#choosenumber). +- This action has two **behaviour** function. One is a + [`do`](../api/classes/Action#do) that records the bid amount as + `board.lastBid` and one is a [`message`](../api/classes/Action#message) sent + to the players. +- This action also has two **properties**. We've added a string `prompt`, and + also a `condition` for performing this action, which is that the player must + not have been marked as passing this auction. + +## Selections + +Selections are individual units of choice for the player. There are 5 +fundamental types of selections available in Boardzilla, plus a `chooseGroup` +that can combine these: + +| Type | Method | Description | Appearance | +|:----------|:-------------------------------------------------------|:----------------------------------------------------------------------------------------|:----------------------------------------------------------------| +| number | [`chooseNumber`](../api/classes/Action#choosenumber) | Select from a range of numbers, such as when spending an arbitrary amount of resources. | Number picker | +| text | [`enterText`](../api/classes/Action#entertext) | Enter text, such as in word-guessing games. | Input box | +| choices | [`chooseFrom`](../api/classes/Action#choosefrom) | Select from a list of choices. | List of buttons | +| board | [`chooseOnBoard`](../api/classes/Action#chooseonboard) | Select something on the board, a piece or space | Selectable elements on the board can be clicked | +| placement | [`placePiece`](../api/classes/Action#placepiece) | Select the exact position for a piece | The selected piece becomes movable and snaps to valid positions | +| group | [`chooseGroup`](../api/classes/Action#choosegroup) | Combination of any of the selections above | Form combining the above | + +Each selection added to an Action must be one of these types, and must have a +name unique to this action. The methods above are called one by one, chained +onto the action in the order the player must select them. You can think of these +methods like [Chained +Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise#chained_promises) +that are resolved by the choice the player makes. All the values selected by the +player become available to function calls later in the action, as a single +argument with key-value pairs for the selections. For example: +```ts + action({ + prompt: "Pick a number and a word" + }).chooseNumber( + 'amount' + }).enterText( + 'guess' + }).do( + ({ amount, guess }) => { + // amount equals the number the player chose + // guess equals the text the player entered + } + ); +``` + +Because of this, many of the properties of actions can be expressions *or +functions that return expressions based on the player selections up to that +point*. Whenever you're working with Boardzilla actions, and a property accepts +a function, the function will be called with the player selections up to that +point. In fact, often one selection will depend on the choices made in previous +selections. + +Let's use an example. Suppose the player needs to select a type of resource to +purchase and the amount they wish to purchase. The `chooseNumber` method accepts +`min` and `max` to set the range of allowed values. We might set the `max` based +on the amount available for the resource they chose. + +```ts + action({ + prompt: "Purchase resources" + }).chooseFrom( + 'resource', ['Lumber', 'Steel', 'Wheat'] + ).chooseNumber( + 'amount', { + min: 1, + // here the "resource" chosen is available to limit the range for the 2nd selection + max: ({ resource }) => board.availableResources(resource) + } + ); +``` + +:::tip Using Typescript for actions + +Because the choose functions declare the type of selection, Typescript will +correctly type these arguments later when you use them. This is useful to double +check that you have entered the selections correctly. + +::: + +## Behaviours + +After a player has made all the necessary choices and submitted the action, it's +time to actually do something! + +### Moving +The most common behaviour is to move a Piece or +Pieces into a new location. For most moves, we can just call +[`move`](../api/classes/Action#move) after the selections, e.g. + +```ts + player => action({ + prompt: 'Play a card' + }).chooseOnBoard( + 'card', player.allMy(Card), + // highlight-start + ).move( + // move the card selected into the "play" Space + 'card', $.play + ) + // highlight-end +``` + +Notice that in this example we use a string as the **first argument**, meaning +"use the piece(s) the player selected in the selection with this name". For the +**second argument** we specify a predetermined location with a literal +Space. Both the piece(s) moved, or the location they're moved to, can either be +player choices (string names), or predetermined game elements (`GameElement` +expressions). + +Boardzilla will make this move when the player has made all their selctions, and +will additionally permit a mouse drag if using a desktop browser. + +:::tip placing pieces + +[`placePiece`](../api/classes/Action#placepiece) is a special method that is +**both** a selection and a behaviour. The player selects the exact position to place +the element, and Boardzilla moves it to this location as part of the action. + +::: + +### Messaging +It's usually good to send a message to all players explaining what the action +just did. The easiest way to do this is by chaining a +[`message`](../api/classes/Action#message) call onto the end of the action. The +`message` function takes a string and can interpolate either the player name or +any of the items selected by using `{{handlebars}}`. For example in the play +card action above we can add a message like this: + +```ts + player => action({ + prompt: 'Play a card' + }).chooseOnBoard( + 'card', player.allMy(Card), + ).move( + 'card', $.play + // highlight-start + ).message( + "{{player}} played {{card}}" + ) + // highlight-end +``` + +We can add other expressions in the message string using concatenation or +template literals. We can also add more `{{handlebar}}` variables using the second argument, e.g.: + +```ts + .message( + "{{player}} played {{card}} and now has a score of {{score}}", + { score: player.score() } + ) ``` -The static files are generated in the `build` folder. +:::tip Using {{handlebars}} -## Deploy your site +It is good to use Boardzilla's `{{handlebar}}` syntax in messages when +referencing Players or Game objects or anything important in the message, as +Boardzilla will apply special formatting to this part of the message, +appropriate to the item referenced. -Test your production build locally: +::: -```bash -npm run serve +:::tip Message strings + +Boardzilla provides string representations of Players and Game Elements that use +their `"name"` using the standard `toString()`. You are free to override these +and provide your own `toString()` if you want these thing represented with more +appropriate strings in messages. + +::: + +### Other behaviour + +All other behaviour can be acheived with the general +[`do`](../api/classes/Action#do) method. This just lets us add arbitrary code +to an action. Suppose that in our card play example above, we additionally want +to perform some logic if the drawn card is something special. An additonal `do` +clause might look like: + +```ts + player => action({ + prompt: 'Play a card' + }).chooseOnBoard( + 'card', player.allMy(Card), + ).move( + 'card', $.play + ).message( + "{{player}} played {{card}}" + // highlight-start + ).do( + ({ card }) => { + if (card.isSomethingSpecial()) { + game.somethingSpecialHappened = true; + game.message("Something special happened!"); + } + } + ) + // highlight-end +``` + +We can add anything we want here, mutating and moving items on the board or +changing state in any way. Note that just like in all action-related functions, +the player's selections are passed to the `do` function in a single object of +key-value pairs using the names provided for each [Selection](#selections). + +:::tip Order matters + +Order matters! When mixing `message` and `do` or `move` keep in mind that if you +mutate the board, the `message` call will use the state *before or after* the +mutation depending on which order you chain the methods. + +::: + + +## Tree-shaking and Skipping +Where possible, Boardzilla analyzes each possible action based on the state of +the board to determine what is possible or impossible, or what might be +forced. For example, if you have a `playCard` action that has a selection of any +card in the player's hand, if that player has no cards, then `playCard` will be +removed from the list of possible actions. Also if a player has only *one* card, +then Boardzilla will consider that when looking at what actions are possible. + +In the example above with choosing `"resource"` and `"amount"`, consider what +would happen if `board.availableResources("Lumber")` returned `0`. In this case, +`min` would be `1` and the `max` would be `0`, an impossible choice. Boardzilla +would therefore eliminate `"Lumber"` from the possible resource to choose +from. It's possible that only one resource is selectable, in this case the +`"resource"` selection can be skipped and the player would be prompted only for +the `"amount"` when trying to perform this action. + +:::tip Skipping forced selections + +If there is ***only one*** possible action to move the game forward, the client +will automatically make this move. + +For example, if a player is presented with options to play cards, use items, or +pass, if they have neither cards nor items, then the game will automatically +"pass". + +This behaviour can be changed using `skipIf`. +::: + +This is called "tree-shaking" the actions and it's a powerful aspect of +Boardzilla. This means you can add several possible actions to the list of +available actions, even if some of them depend on unusual circumstances. Perhaps +an action can only be taken if you have a particular card, or if the game is in +a particular phase, etc. Boardzilla will prune the tree of possible actions to +present the choices to the player that make sense under the circumstances. + +### Customizing the tree-shaking + +There are several ways Boardzilla can tree-shake an action, and ways you can +customize this behaviour. The principal way is by looking at the possible +selections. If you present a list of possible choices dynamically, e.g. the +cards in the player's hand, then Boardzilla will automatically evaluate that to +see if the selection can be removed or skipped. + +You can also declare that an entire action is impossible based on other reasons +by adding a `condition` to the action. In the example above we set a condition +for the "bid" action, which is that the player must have not passed the auction, +which was recorded as `player.passedThisAuction`. In this case, the "bid" action +should be pruned from the player's choices, which we do by adding: + +```ts + action({ + prompt: 'Make a bid', + // highlight-next-line + condition: !player.passedThisAuction + })... +``` + +### Skipping + +Boardzilla has 3 different strategies it follows for choosing what to skip and +applies them by default to different actions and selections. Generally the +defaults create an intuitive set of prompts for players regardless of +situations, but it is easy to modify which strategy is used as it suits the +action. To modify the strategy, add a `skipIf` parameter to either a [selection +function](#selections), or to the +[`playerActions`](../api/modules#playeractions) function. + +| Strategy | `skipIf` value | Description | Default | +|------------------|----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------| +| Never Skip | `'never'` | Boardzilla will always present this selection for choosing by the player even if the choice is forced. | n/a | +| Skip if Only One | `'always'` | Boardzilla will skip this selection if there is only one viable option. | Default for all [selection functions](#selections) | +| Always Skip | `'only-one'` | Rather than present this choice directly, the player will be prompted with choices from the *next choice* in the action for each possible choice here, essentially expanding the choices ahead of time to save the player a step. This option only has relevance if there are subsequent choices in the action. | Default for [`playerActions`](../api/modules#playeractions) | + +For example, if you want the player to play a card from hand but want the player +to explicitly click the card, **even if there is only one card** in hand to +play, your action might look like: + +```ts + player => action({ + prompt: 'Play a card' + }).chooseOnBoard( + 'card', player.allMy(Card), + // highlight-next-line + { skipIf: 'never' } + ) ``` -The `build` folder is now served at [http://localhost:3000/](http://localhost:3000/). +## Follow-ups + +Sometimes an action will trigger other actions based on new information, such as +when revealing a card that requires some choices and actions for the player. In +these cases the action can trigger additional actions using +[`game.followUp`](../api/classes/Game#followUp). This can be called anywhere +that is triggered directly by the action, usually in the action `do`. This +causes Boardzilla to immediately prompt this action following the completion of +the current action. + +```ts + player => action({ + prompt: 'Play a card' + }).chooseOnBoard( + 'card', player.allMy(Card), + ).move( + 'card', $.play + ).do( + ({ card }) => { + // highlight-start + if (card.hasSpecialAction) { + game.followUp({ name: 'specialAction' }); + } + // highlight-end + } + ) +``` + +In this example, certain cards trigger another action named +"specialAction". This action must be defined elsewhere in the `defineActions` +call with this name. + +Often a variety of ways to trigger this follow-up will exist in play with +variations. Imagine a card game where drawing certain cards lets you take +resources of your choice, but different cards let you take different +amounts. Rather than define different actions for each amount, we can pass +arguments to the follow-up action. The triggering action might look like this: + +```ts + player => action({ + prompt: 'Play a card' + }).chooseOnBoard( + 'card', player.allMy(Card), + ).move( + 'card', $.play + ).do( + ({ card }) => { + // highlight-start + if (card.takeResources > 0) { + game.followUp({ name: 'takeResources', amount: card.takeResources }); + } + // highlight-end + } + ) +``` + +In this case the `"amount"` becomes just another argument in the action named +`"takeResources"` except that instead of being a player selection, this one is +passed in. The `"takeResources"` action then might look something like this: + +```ts + player => action<{amount: number}>({ + prompt: 'Take resources' + }).chooseFrom( + 'resource', ['Lumber', 'Steel', 'Wheat'] + ).do( + ({ resource, amount }) => player.addResources(resource, amount) + ) +``` -You can now deploy the `build` folder **almost anywhere** easily, **for free** or very small cost (read the **[Deployment Guide](https://docusaurus.io/docs/deployment)**). +Note the use of the Typescript generic here `<{amount: number}>`. This is not +required but ensures that Typescript correctly types `amount` later in the `do` +call since it has no other way of knowing what that argument is. diff --git a/docs/game/board.md b/docs/game/board.md new file mode 100644 index 0000000..469f86e --- /dev/null +++ b/docs/game/board.md @@ -0,0 +1,243 @@ +--- +sidebar_position: 3 +--- +# Board Structure + +The board is a singleton class that is declared as the first step of creating a +game. Installing Boardzilla automatically creates this class and you can add +properties and methods to it as you progress. Your board extends the base +[Board](../api/classes/board) class. + +Boards contains [Spaces](../api/classes/space) (fixed regions) and +[Pieces](../api/classes/piece) (movable game objects). This is essentially a +data tree, with Board as the root branch and the spaces and pieces within in as +branches. For example, a Board may have spaces for each player's tableau, and +inside those are spaces for the player's hand, and inside those are their +cards. All of these spaces and pieces are called the +[Elements](../api/classes/GameElement) of the game. Elements in Boardzilla +always have a parent-child relationship within the board. + +```mermaid +graph TD; + Board["`**Board**`"]-->mat1["`**Space** + Player 1 Tableau + `"]; + Board-->mat2["`**Space** + Player 2 Tableau + `"]; + mat1-->coins["`**Space** + Player 1 Coins + `"]; + mat1-->hand1["`**Space** + Player 1 Hand + `"]; + hand1-->card1["`**Piece** + Ace of hearts + `"]; + hand1-->card2["`**Piece** + Two of clubs + `"]; +``` + +Spaces can contain other spaces and pieces. Pieces can even contain other +pieces, e.g. as when placing tokens onto a card. + +## Subclassing + +Typically, a game will declare a few classes of game pieces, e.g. Cards, Tokens +and the like. Each of these will be a subclass of Piece. These subclasses can +add properties and methods that you can use in the rules of game. E.g. a `Card` +class, that might have `suit` and `number` properties, and special methods like +`isTrump()`. + +```ts title="Example Card class" +export class Card extends Piece { + suit: 'S' | 'H' | 'D' | 'C'; + number: number; + + isTrump() { + return this.suit === this.game.trump; + } +} +``` + +Spaces can be subclassed as well. This is less common, but helpful if you have +several spaces of a particular type that have special properties or behaviour. + +Defining subclasses like this also makes it easy to customize their appearance +later and give the different classes of Pieces entirely different visuals. + +## Querying + +Accessing parts of the board is done using the Query API on the board and the +spaces and pieces you add. The two most important methods are +[`all`](../api/classes/GameElement#all) and +[`first`](../api/classes/GameElement#first). +- `all` Search the tree recursively and return *all* matches +- `first` Search the tree recursively and return only the *first* match + +In the example tree above, calling `board.all(Piece)` would return the two cards +at the bottom of the tree. If we used the Card class above, we could also have +used `board.all(Card)` to return the same thing but typed correctly to the Card +class. We can then also search by name, e.g. `board.first(Card, '2C')` to return +the Card named '2C', or add properties to the search, e.g. `board.first(Card, { +number: 1 })` to return the first ace in the game. + +Any methods that return lists of elements, like `all`, actually return an +[ElementCollection](../api/classes/ElementCollection). This is an Array-like +class that can be treated like an array but also contains many other methods. + +:::warning first can return undefined +Note that `first` can return `undefined` if matching element is found. When using +`first`, you will frequently add `!` or `?` depending on the situation, which is +a good reminder to not assume that a piece is always where you expect, e.g. + +```ts +// flip the top Card of the deck, if there are any +$.deck.first(Card)?.showToAll(); +``` +::: + +For convenience, all uniquely named spaces are also accessible from a global `$` +object that contains all spaces by name, e.g. `$.deck`. + +There are many more methods and options for finding particular game +elements. See the [API documentation](../api/classes/GameElement#queries) for +more. + +## Creation + +Spaces and pieces are created using the +[create](../api/classes/GameElement#create) method. All Game Elements have a +class and a name. The Class can be one of the based classes or one of the +subclasses you've declared. The name can be any string. It is used for searches, +determining uniqueness, and also appears in the HTML for CSS targetting. e.g.: + +```ts + const tableau = board.create(Space, 'tableau'); + const hand = tableau.create(Space, 'hand'); + hand.create(Card, '2C'); +``` + +You can also specify the properties during their creation with a 3rd argument: + +```ts + hand.create(Card, '2C', { suit: 'C', number: 2 }); + hand.create(Card, 'JS', { suit: 'S', number: 1 1}); +``` + +## Ownership +All Game Elements also have an optional `player` property built-in. Setting this +property assigns the element to a [Player](../api/classes/Player). This is +useful for pieces and spaces that permanently belong to them, like their player +mat, or their unique player token. These elements can be created and queried +using the `player` property. + +```ts + // create 2 tableaus for each player + board.create(Space, 'tableau', { player: game.players[0] }); + board.create(Space, 'tableau', { player: game.players[1] }); + + // get player 1's tableau + board.first(Space, 'tableau', { player: game.players[0] }); +``` + +Any elements that are contained within an element assigned to a player are also +considered to be "owned" by that player, e.g. a card in their hand. These +elements can be queried using the `owner` property. + +```ts + // get player 1's cards + board.all(Card { player: game.players[0] }); +``` + +:::warning player vs owner +Rememeber the difference between `player` and `owner`. They are related but distinct. +- `player` is a property you set that assigns a game element to that player, and is usually permanent. Think of it like a name tag, or the color of the element. +- `owner` is a read-only property that indicates where the piece currently resides. A Card might be owned by a player while they hold it, but the card "doesn't have their name on it" so to speak, and may change hands. +::: + +The Player object also conveniently has methods for retrieving these elements: +[my](../api/classes/Player#my) and [allMy](../api/classes/Player#allmy) for +retrieving one or many elements respectively + +```ts + // get player 1's tableau + game.players[0].my('tableau'); + + // get player 1's cards + game.players[0].allMy(Card); +``` + +## Visibility +All elements are visible to all players by default. Often a game will require +that pieces are visible only to some players and hidden from others. In +Boardzilla, "hiding" a Game Element means that the properties of that element +are no longer visible. For example if one of our example `Card` instances was +flipped over, the player would be able to see that it was an instance of the +`Card` class, but `card.suit` and `card.number` would be `undefined`. + +This can be accomplished in a number of ways, the simplest being +[`hideFromAll`](../api/classes/GameElement#hidefromall). There are many [other +methods](../api/classes/GameElement#visibility) for managing visibilty. It may +also be that some properties should be visible even when the element is hidden, +e.g. a Card may belong to different decks, and this is represented by +`Card#deck`. If the card back art indicates what deck it belongs to, then this +property should be revealed even if the card is hidden. You can set these +properties with the static method +[`revealWhenHidden`](../api/classes/GameElement#revealwhenhidden), e.g.: + +```ts +Card.revealWhenHidden('deck'); +``` + +## Movement +Pieces can be created in a particular place on the board, but will move around +as players take their actions. There are several ways to do this but the +simplest is [`putInto`](../api/classes/Piece#putinto). + +```ts +// discard a card +card.putInto($.discard); + +// draw the top card of the deck into the field +$.deck.first(Card).putInto($.field); +``` + +When cards move from space to space, you may want to change their +properties. These can be done automatically by adding event handlers to spaces. The most common type is to have spaces that change the visibility of their elements. E.g. when a card enters the deck, it should automatically be turned face down. When it enters a player's hand, it becomes visibile only to that player. This can be done with [`onEnter`](../api/classes/Space#onenter): + +```ts +// the deck's cards are always face down +$.deck.onEnter(Card, card => card.hideFromAll(); + +// the player's hand always reveals their cards to `player` +const hand = board.create(Space, 'hand', { player }); +hand.onEnter(Card, card => card.showTo(player)); +``` + +There is also a corresponding [`onExit`](../api/classes/Space#onexit) handler. + +## The pile and removing pieces + +There is a special invisible region of the board called the "pile" available at +[`board.pile`](../api/classes/Board#pile). This is the holding area for any +pieces that are not in use. The pile is never rendered, but is always available +to the API for querying. Pieces are never created or destroyed once the game has +started, and instead are simply moved to or retrieved from the pile. + +Remove a piece (move it to the pile) simply by calling it's +[`remove`](../api/classes/GameElement#remove) method, or for a list of items, +the [ElementCollection#remove](../api/classes/ElementCollection#remove) can be +used. For example, to remove all cards from the deck that are lower than 5, we +can say: + +```ts +$.deck.all(Card, card => card.number < 5).remove(); +``` + +to put all the unused cards from the pile into the deck, we would say: + +```ts +board.pile.all(Card).putInto($.deck); +``` diff --git a/docs/game/core-concepts.md b/docs/game/core-concepts.md new file mode 100644 index 0000000..eca3404 --- /dev/null +++ b/docs/game/core-concepts.md @@ -0,0 +1,68 @@ +--- +sidebar_position: 1 +--- +# Core concepts + +These are some of the basic core concepts of Boardzilla that will be refered to +throughout the documentation. + +## Board +The Board is the class that defines the overall layout of the game. It is +composed of **Spaces** and **Pieces**. It itself is a Space but with special +behaviour. + +### Space +Spaces are regions of the Board. They are **stable** and never change once the +game starts. They can be nested within each other. + +### Piece +Pieces are **movable** objects in the game. They can freely move around to spaces, +and can also be placed inside other Pieces, such as when tokens are placed onto +a card. + +Learn more in [Board Structure](./board). + +## Player +The player is a core class that represents a user playing the game. Each game +will have a player class. Players can have pieces and spaces assigned to them, +and any piece that enters these becomes "owned" by the player. + +Learn more in [Players](./player). + +## Action +An Action is a discrete unit of choice for a player. An action has a **name**, +any possible **selections** for the action, and **behaviour**. In chess an +action might be called "move". It has two choices: the piece being moved, and +space it's moved to. It's behaviour would be to move the piece to its +destination and a message to the game log. + +Learn more in [Actions](./actions). + +## Flow +The Flow of your game is how the game runs from beginning to end. This describes +the phases, rounds and turns of the game, and what actions are avaiable to +players at which point in the Flow. + +Learn more in [Flow](./flow). + +## UI +Boardzilla renders and animated the board on the player's browser according to +the rules of your game. By default everything appears in a very raw but usable +format. You can gradually customize how your game appears. + +### Layout +The layout of the game is the definition of where the Spaces and Pieces appear +in the player's browser, and how they change as Pieces are added into an area +and start to fill it up. + +### Appearance +The appearance of each visible space and piece can be customized using JSX that +you provide and you can apply your own CSS to these. You can also supply special +effects that will be applied when things happen to these elements. + +### Controls +Controls are what we call any floating boxes above the game board. These include: +- Prompts +- Button choices +- Inputs for text or numbers +- Confirmation text and buttons diff --git a/docs/game/create-a-blog-post.md b/docs/game/create-a-blog-post.md deleted file mode 100644 index ea472bb..0000000 --- a/docs/game/create-a-blog-post.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Create a Blog Post - -Docusaurus creates a **page for each blog post**, but also a **blog index page**, a **tag system**, an **RSS** feed... - -## Create your first Post - -Create a file at `blog/2021-02-28-greetings.md`: - -```md title="blog/2021-02-28-greetings.md" ---- -slug: greetings -title: Greetings! -authors: - - name: Joel Marcey - title: Co-creator of Docusaurus 1 - url: https://github.com/JoelMarcey - image_url: https://github.com/JoelMarcey.png - - name: Sébastien Lorber - title: Docusaurus maintainer - url: https://sebastienlorber.com - image_url: https://github.com/slorber.png -tags: [greetings] ---- - -Congratulations, you have made your first post! - -Feel free to play around and edit this post as much you like. -``` - -A new blog post is now available at [http://localhost:3000/blog/greetings](http://localhost:3000/blog/greetings). diff --git a/docs/game/create-a-document.md b/docs/game/create-a-document.md deleted file mode 100644 index a9c63ae..0000000 --- a/docs/game/create-a-document.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -sidebar_position: 2 -title: Defining actions for your game ---- - -# Actions - -... \ No newline at end of file diff --git a/docs/game/creating-a-game.md b/docs/game/creating-a-game.md new file mode 100644 index 0000000..25c86b1 --- /dev/null +++ b/docs/game/creating-a-game.md @@ -0,0 +1,30 @@ +--- +sidebar_position: 2 +--- +# Creating a game + +After [installing](../introduction/installation) Boardzilla, creating a game in +Boardzilla usually follows these steps in this general order: + +- Create the [Spaces](core-concepts#space) of your board +- Create the [Pieces](core-concepts#piece) of your game and add them onto the board +- Define some [Actions](core-concepts#action) that the player(s) can take +- Add these actions into the [Flow](core-concepts#flow) +- Test the action in the browser +- Add more actions +- Customize the flow to add rounds, phases, turns etc. +- Customize the [UI](core-concepts#ui) by adding game art, custom HTML/CSS and animations + +:::tip[UI Last] +It is generally best to customize the UI last. Boardzilla's default UI may not be pretty but it's the easiest way to see exactly what's going on, or why a rule is not behaving as you expect. +::: + +From the moment you install Boardzilla, your game is runnable in the browser and +as you progress through the steps above, the browser instantly shows you how +your changes appear. You can "play" your game as soon as actions are added. You +can run the game backwards and forward to test it. As you progress the game +updates in real-time, even reflecting how the game in-progress would change +based on the new rules you enter. + +In this way, a game can be created iteratively, testing each rule and revising +before adding more. diff --git a/docs/game/define-flow.md b/docs/game/define-flow.md deleted file mode 100644 index f2f680a..0000000 --- a/docs/game/define-flow.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Define your flow - -Some stuff about flow \ No newline at end of file diff --git a/docs/game/flow.md b/docs/game/flow.md new file mode 100644 index 0000000..11dab63 --- /dev/null +++ b/docs/game/flow.md @@ -0,0 +1,416 @@ +--- +sidebar_position: 6 +--- +# Flow + +The Flow of your game is how the game runs from beginning to end. This describes +the phases, rounds and turns of the game, and what actions are avaiable to +players at which point in the Flow. You describe the Flow using the API and +Boardzilla keeps track of where your players are in the game, even if the game +sits idle for periods of time. + +Your Flow definition will contain at minimum some player actions, and usually +some loops around them with logic to decide when the game is over. + +## Typical flow structure + +Flow is defined inside the [createGame](../api/modules#creategame) when you call +[`game.defineFlow`](../api/classes/game#defineflow). The arguments to this +function are the steps for your game. There are two basic types of steps: +- a function +- a flow command + +Functions alter the game state in some way, and flow commands change the flow of +the game. You can keep adding as many functions and flow commands as needed, in +any order. Let's look at a simple example from the Boardzilla starter game: + +``` ts Sample flow + game.defineFlow( + () => $.pool.shuffle(), + loop( + eachPlayer({ + name: 'player', + do: playerActions({ + actions: ['take'] + }), + }) + ) + ); +``` + +This flow contains exactly two items: a function call that shuffles the pool, +and the main play loop. The first function makes a single change to the board: + +```ts + () => $.pool.shuffle(), +``` + +Generally the first function of a flow will set up the board, shuffling decks, +dealing out opening hands and the like. Later in the flow you can use functions +as much as you like to make other changes to the board state, including moving +pieces around that are not part of a player action (e.g. dealing out a new hand) +or just changing state on the board or players (e.g. updating the score). + +:::warning Flow may not create or destroy game elements + +One thing you cannot do in the flow is create new elements. All Spaces and +Pieces in your game must be [created](board#creation) before calling +`defineFlow`. If pieces are only needed later in the game, they can be created +on the [`pile`](../api/classes/Board#pile) using `board.pile.create()` and moved +from the `pile` when needed. Similarly when elements are +[`removed`](../api/classes/GameElement#remove) they actually are put into the +`pile`. + +::: + +The next argument in this example calls `loop`. This is a basic flow command +that causes a portion of the flow to be repeated until something interupts +it. In this case, it sets up the basic game loop. Flow commands can set up other +types of loops, have players take turns, create branching logic, and most +importantly, prompt players for the actions they can perform. + +In the example above the main loop itself includes other flow commands, namely +`eachPlayer` and `playerActions`. This is an important distinction between the +two types of flow steps, functions and flow commands: + +:::tip + +***Flow commands can only be added directly by other flow commands.*** + +::: + +For example, imagine you have a flow function that does some things, setting up +the deck, dealing some cards, and then cleaning up after the hand: + +``` ts Sample flow + game.defineFlow( + () => { + // shuffle the deck + // deal cards + + // put the cards back in the deck + }) + ); +``` + +If you now want to insert a flow command in the middle to add a player action, +you must break the function into two pieces and insert the flow function between +them, e.g.: + +``` ts Sample flow with playerAction added + game.defineFlow( + () => { + // shuffle the deck + // deal cards + }, + + // highlight-next-line + playerAction({ actions: ['playCard'] }), + + () => { + // put the cards back in the deck + }) + ); +``` + +## Flow commands + +All flow commands are available on +[`game.flowCommands`](../api/classes/game#flowcommands). It is common to +deconstruct all needed commands before defining flow, e.g.: + +```ts + const { + playerActions, + eachPlayer, + forEach, + forLoop, + } = game.flowCommands; +``` + +Let's look at the +various flow commands. There are 3 main types of flow commands, looping, +branching and actions. + +### Looping flow commands + +#### [`loop`](../api/modules#loop) + +The most basic loop, this creates a loop that continues indefinitely until +explicitly interupted. This would be like a C/Javascript `while(true)`. + +#### [`whileLoop`](../api/modules#whileloop) + +Like the basic `loop`, except that it accepts a condition and will only start a +new iteration of the loop if the condition is true. This is exaclty like the +C/Javascript `while(condition)`. In particular, note that this loop might never +execute even the first iteration if the supplied condition is false to begin +with. + +#### [`forLoop`](../api/modules#forloop) + +This loop sets a value, iterates that value at each loop iteration and continues +looping until that value meets some condition. In other words, a standard `for` +loop from C/Javascript. + +#### [`forEach`](../api/modules#foreach) + +This loop accepts a collection, and iterates over the members of that +collection. This is like `for ... of` or `Array#forEach` in Javascript. + +#### [`eachPlayer`](../api/modules#eachplayer) + +This is a loop that iterates over each player. This is the same as `forEach` +with the additional behaviour that it sets the the "current" player on each +iteration of the loop. + +#### [`everyPlayer`](../api/modules#everyplayer) + +Strictly speaking, this does not create a loop at all. It looks identical to +`eachPlayer` above except that instead of taking each iteration for each player +in turn, it let's all players take they turn simultaneously in parallel. This +"loop" completes when all players have completed the body of the loop, or when +the loop is otherwise interrupted. + +### Branching flow commands + +#### [`ifElse`](../api/modules#ifelse) + +Simply checks a condition and either takes one branch named `do` or an optional +`else` branch, just as an standard `if...else` + +#### [`switchCase`](../api/modules#switchcase) + +Like `ifElse` except the test expression can be compared with several possible +values and execute different branches depending on the outcome. It may also +execute a `default` branch if no other matches apply. This is similar to the +`switch...case` in C/Javascript but without [fall +through](https://en.wikipedia.org/wiki/Switch_statement#Fallthrough) behaviour. + + +### Player Actions + +#### [`playerActions`](../api/modules#playeractions) + +The sole flow command for prompting player actions. This command accept a list +of allowed [actions](actions) that were defined in `defineActions` and prompts +the current player (or a particular player or players if specified). + +Note that like all other selections in Boardzilla, this list of actions has +[tree-shaking and skipping](actions#tree-shaking-and-skipping) behaviour. If one +of the included actions is determined to have possible valid moves, it will not +be included in player prompts. If only one of the supplied actions is determined +to be playable, it will be prompted. If such an action requires no further +prompts it will be auto-played. Just like action selections this behaviour can +be configured for each `playerActions` with a `skipIf` parameter. + +For this reason, it is common to include a wide variety of possible actions in +the list of `playerActions` but let each action definition take responsibility +for determining whether it is actually playable at the time based on its +selections and/or `condition` parameter. + +:::danger flow commands are created once + +Unlike [`Actions`](actions) that are created for each player **at the time** of +being played, flow commands are created **at the beginning** of the game. Be +careful with passing expressions directly to Flow commands that rely on game +state. + +For example if you want to loop through some cards laid out in a board Space +called "field", something like the following is probably **not** what you want: + +```ts + forEach({ + name: 'card', + // highlight-next-line + collection: deck.all(Card), // only evaluated at the start of the game + do: playerAction({ actions: ['chooseCard', 'pass'] }) + }) +``` + +Instead use the functional form, so that the expression will be evaluated each +time this loop is entered: + +```ts + forEach({ + name: 'card', + // highlight-next-line + collection: () => deck.all(Card), + do: playerAction({ actions: ['chooseCard', 'pass'] }) + }) +``` + +::: + +### Current Flow Position + +For many flow commands, it is necessary to know what the current position +is. For example in a simple `for i` loop, we need to access `i` and have logic +that depends on its current value. + +Basically all function parameters in flow commands accept a single argument of +type [`FlowArguments`](../api/modules#flowarguments) for this purpose. The +argument is a single object that contains all values "in scope" at this point in +the flow. There are two types of values included here: +* loop variables +* player action selections + +#### Loop variables + +The loop variables included here are from any loops that the flow is currently +inside of, namely the current iterator value in any [`forLoop`](forloop)'s, the +current collection member of any [`forEach`](foreach) loops, the evaluated test +expression in any [`switchCase`](switchcase)'s. + +The values are included as key value pairs where the key is the `name` parameter +supplied for the flow command. + +```ts Example of reading loop variables + forLoop({ + // highlight-next-line + name: 'x', // x is declared here + initial: 0, + next: x => x + 1, + while: x => x < 3, + do: forLoop({ + // highlight-next-line + name: 'y', // y is declared here + initial: 0, + next: y => y + 1, + while: y => y < 2, + // highlight-start + do: ({ x, y }) => { + // x is available here as the value of the outer loop + // and y will be the value of the inner loop + } + // highlight-end + }) + }) +``` + +#### Player action selections + +For player action selections, the arguments to the player action are included as +a single object. Again this only applies if the flow command is inside the `do` +branch belonging to this player action. The name in this case is the name of the +actions. For example, here we have defined an action called "takeResource" and +later we want to know what choices the player made in the flow. + +```ts example Player action selections + game.defineActions({ + ... + takeResources: player => action<{amount: number}>({ + prompt: 'Take resources' + }).chooseFrom( + 'resource', ['Lumber', 'Steel', 'Wheat'] + ).do( + ({ resource, amount }) => player.addResources(resource, amount) + ) + ... + }); + + game.defineFlow( + ... + playerActions({ + actions: [ + { + name: 'takeResources', + do: ({ takeResources }) => { + // highlight-start + // takeResoures.resource will be the name of the resource, e.g. 'Steel' + // takeResoures.amount will be the selection number "amount" + // highlight-end + } + } + ] + }) + ); +``` + +:::tip Action vs playerActions + +We can react to a player's action both in the action +[`do`](actions#other-behaviour) and in the `do` of the playerActions. It can be +confusing which we should use for what. + +In general the action `do` is the proper place to react to what a player just did. This +includes mutating the board, recording state, or triggering follow-up actions. + +The playerActions `do` should be used only if the player action changes the flow +of the game, e.g. ending a phase or somehow interrupting a loop, or triggering +other rounds of player actions, since flow commands can only be issued inside +other flow commands. + +::: + +## Loop interuption + +It is important in a game to able to interrupt loops. In fact if we use the +basic `loop` flow command, the loop will continue indefinitely **unless** we +interrupt it. There are 3 basic [loop interruption +functions](../api/modules#do): + +**`Do.break()`** + +This causes the flow to exit loop and resume after the loop, like the +`break` keyword in C/Javascript. + +**`Do.continue()`** + +This causes the flow to skip the rest of the current loop iteration and restart +the loop at the next iteration, like the `continue` keyword in C/Javascript. + +**`Do.repeat()`** + +Similar to `Do.continue` except this restarts the loop on **the same iteration** +it's currently on. + +These functions can be called in any loop function or action. Often it is the +only thing you want to call after a particular action, in which case you can +pass it as the action `do`, e.g.: + +```ts + loop(playerActions({ + actions: [ + 'takeOneFromBag', + { + name: 'done', + // break out of the loop when a player selects 'Done' + // highlight-next-line + do: Do.break + } + ] + })); +``` + +:::danger These are not javascript keywords + +Remember that the flow interuption functions are merely humble Javascript +functions, **not keywords**, despite being named similarly. They do not break control +flow all by themselves. + +```ts + loop({ + name: 'round', + do: () => { + if (game.isRoundFinished()) Do.break(); + // otherwise do other stuff + // highlight-next-line + game.doOtherStuff(); <-- will execute even if Do.break is called + } + }); +``` + +Use e.g. `return` or `else` to control what executes, e.g.: + +```ts + loop({ + name: 'round', + do: () => { + // highlight-next-line + if (game.isRoundFinished()) return Do.break(); + // otherwise do other stuff + game.doOtherStuff(); + } + }); +``` diff --git a/docs/game/markdown-features.mdx b/docs/game/markdown-features.mdx deleted file mode 100644 index e7b362a..0000000 --- a/docs/game/markdown-features.mdx +++ /dev/null @@ -1,123 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Markdown Features - -Docusaurus supports **[Markdown](https://daringfireball.net/projects/markdown/syntax)** and a few **additional features**. - -## Front Matter - -Markdown documents have metadata at the top called [Front Matter](https://jekyllrb.com/docs/front-matter/): - -```text title="my-doc.md" -// highlight-start ---- -id: my-doc-id -title: My document title -description: My document description -slug: /my-custom-url ---- -// highlight-end - -## Markdown heading - -Markdown text with [links](./hello.md) -``` - -## Images - -Regular Markdown images are supported. - -## Code Blocks - -Markdown code blocks are supported with Syntax highlighting. - - ```jsx title="src/components/HelloDocusaurus.js" - function HelloDocusaurus() { - return ( -

Hello, Docusaurus!

- ) - } - ``` - -```jsx title="src/components/HelloDocusaurus.js" -function HelloDocusaurus() { - return

Hello, Docusaurus!

; -} -``` - -## Admonitions - -Docusaurus has a special syntax to create admonitions and callouts: - - :::tip My tip - - Use this awesome feature option - - ::: - - :::danger Take care - - This action is dangerous - - ::: - -:::tip My tip - -Use this awesome feature option - -::: - -:::danger Take care - -This action is dangerous - -::: - -## MDX and React Components - -[MDX](https://mdxjs.com/) can make your documentation more **interactive** and allows using any **React components inside Markdown**: - -```jsx -export const Highlight = ({children, color}) => ( - { - alert(`You clicked the color ${color} with label ${children}`) - }}> - {children} - -); - -This is Docusaurus green ! - -This is Facebook blue ! -``` - -export const Highlight = ({ children, color }) => ( - { - alert(`You clicked the color ${color} with label ${children}`); - }} - > - {children} - -); - -This is Docusaurus green ! - -This is Facebook blue ! diff --git a/docs/game/players.md b/docs/game/players.md new file mode 100644 index 0000000..973fcd8 --- /dev/null +++ b/docs/game/players.md @@ -0,0 +1,91 @@ +--- +sidebar_position: 4 +--- +# Players + +The [`Player`](../api/classes/Player) is a core class that represents a user +playing the game. Each game will have its own player class that contains any +special properties and methods particular to the game, such as `player.score()` +or `player.isDealer`. Boardzilla will manage seating the players to start the +game, and show each player what actions they can perform. The player object will +be passed back to you in your actions when the players perform them. + +## Player List + +The current list of players is always available as +[`game.players`](../api/classes/Game#players) which returns an Array-like of +players with other special methods added. The array is in the order the players +will normally act, but can be re-ordered with +[`sortBy`](../api/classes/PlayerCollection#sortby). + +:::warning player order vs table position + +Player order is not always the same as the seating order around the +table. Boardzilla will begin the game with players in order based on seating, +but if the order is changed, then `game.players` will be in turn order, but +looking at [`player.position`](../api/classes/Player#position) or +[`game.players.inPositionOrder()`](../api/classes/Game#inpositionorder) will tell +you what the seating order is. + +::: + +See [the full API](../api/classes/PlayerCollection) for `PlayerCollection`. + +## Current player + +Boardzilla has a concept of a current player, that is currently allowed to +act. If not otherwise specified, when presenting possible player actions, they +are presented for the current player, and no other player can act until their +turn. + +The current player is available by calling +[`game.players.current()`](../api/classes/PlayerCollection#current). You can set +the current player, with +[`player.setCurrent()`](../api/classes/Player#setcurrent). Typically however, +when letting each player take turns, you will simply use +[`eachPlayer`](flow#eachplayer) which automatically sets the current player. + +It is possible for **multiple** players to be considered current, in which case +these player can act simultaneously. You can set multiple players by calling +[`game.players.setCurrent()`](../api/classes/PlayerCollection#setcurrent) with +an array. In these cases, you must use +[`game.players.allCurrent()`](../api/classes/PlayerCollection#allcurrent) to +retrieve the list of current players rather than +[`game.players.current()`](../api/classes/PlayerCollection#current). + +See [the full API](../api/classes/Player) for `Player`. + +## Customize player + +It is common to subclass the [`Player`](../api/classes/Player) class with a +player class suited to a particular game. For this reason, installing Boardzilla +automatically creates this subclass, to which you can add properties and methods +to it as you progress. Typically this is where you keep per-player state, like +any per-player scoring. + +The player object is used in many places in Boardzilla. Most importantly, it is +the argument sent to every [Action](actions). For this reason, the Player +subclass for your game is passed as an argument to +[createGame](../api/modules.md#creategame) so that every method and object that +uses player has the Typescript generic applied to it so it understands the +properties and methods of *your game's* Player. + +## Player Board elements + +As described in [Board Structure](board#ownership), player's can own elements of the board +by setting its `player` property to the player you choose. This marks the +element as being assigned to this player, e.g. the player mat, the player's +hand, the player's unique tokens. All elements that enter a space assigned to a +player are considered to be "owned" by that player, and are accessible using the +[player.my](../api/classes/Player#my) and +[player.allMy](../api/classes/Player#allmy) methods for finding respectively one +or many owned elements. + +## Profile badge + +It is generally good practice to place the +[](../api/modules#profilebadge) component into the UI to mark the +player's area of the board and show information about the player, such as +score. This automatically displays if it's the player's turn, whether they're +online, and links to their profile, if any. It can be further customized with +CSS. diff --git a/docs/game/ui.mdx b/docs/game/ui.mdx new file mode 100644 index 0000000..0822b8c --- /dev/null +++ b/docs/game/ui.mdx @@ -0,0 +1,26 @@ +# UI + +import Layout from '@site/src/components/Layout'; + + + + +## Layout +within the board and within each other. If pieces enter a space, +e.g like cards in a player's hand, the layout you give Boardzilla will tell it +whether these should splay out and stack together, whether they should shrink or +overlap if more are placed into the space than comfortably fit. All this can be +heavily customized depending on the nature of your game. + +The layout is essentially an invisible grid where other spaces and pieces are +placed. The grid can grow or shrink depending on how many elements are in it and +where they're placed. + +### DOM +The game is displayed in the players browser using HTML and the data tree of the +Board described above is mapped to an actual tree in HTML. If you define a Space +that is a player's hand, with Pieces in them that are cards, then the DOM will +literally have a DOM element for each card as children of the DOM element +representing the hand. The class names of these will match the classes you +provide. So they're easy to target for CSS. + diff --git a/docs/introduction/intro.md b/docs/introduction/intro.md index 0b34533..a6042d7 100644 --- a/docs/introduction/intro.md +++ b/docs/introduction/intro.md @@ -6,9 +6,12 @@ id: intro # Welcome! -Framework for creating web-based boardgames. - -* Creating a new game -* Implement game logic -* Add an interface -* Testing and debugging \ No newline at end of file +To create a game, you create and supply the logic for the game, using +Boardzilla's API to define the board and the the rules. Boardzilla translates +this into a working browser-based client that show each player what the possible +moves are they have at any given time. It also creates a server that responds to +these moves and updates everyone's game as the players take moves and progress +the game. It displays the board in the way you describe, and uses your CSS to +customize the styling. Boardzilla automatically animates the changes that happen +on the board, but also provides you with ways to add and customize these +animations. diff --git a/docusaurus.config.js b/docusaurus.config.js index 66ba484..a8ebe9a 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -23,7 +23,7 @@ const config = { trailingSlash: false, onBrokenLinks: "warn", - onBrokenMarkdownLinks: "throw", + onBrokenMarkdownLinks: "warn", // Even if you don't use internalization, you can use this field to set useful // metadata like html lang. For example, if your site is Chinese, you may want @@ -34,6 +34,7 @@ const config = { }, markdown: { format: "detect", + mermaid: true, }, presets: [ [ @@ -55,7 +56,10 @@ const config = { ], ], - themes: ["@docusaurus/theme-live-codeblock"], + themes: [ + "@docusaurus/theme-live-codeblock", + "@docusaurus/theme-mermaid", + ], themeConfig: { /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ // Replace with your project's social card @@ -105,10 +109,15 @@ const config = { "../boardzilla-core/src/player", "../boardzilla-core/src/ui", ], + sort: "source-order", + categorizeByGroup: false, excludeInternal: true, excludeNotDocumented: true, tsconfig: path.join(__dirname, "../boardzilla-core/tsconfig.json"), - plugin: ["typedoc-plugin-merge-modules"], + plugin: [ + "typedoc-plugin-merge-modules", + "typedoc-plugin-no-inherit" + ], frontmatter: { sidebar_position: 5, }, diff --git a/package.json b/package.json index 78c7662..30fd706 100644 --- a/package.json +++ b/package.json @@ -14,9 +14,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { + "@boardzilla/core": "^0.0.64", "@docusaurus/core": "3.1.0", "@docusaurus/preset-classic": "3.1.0", - "@docusaurus/theme-live-codeblock": "3.1.0", + "@docusaurus/theme-live-codeblock": "^3.1.0", + "@docusaurus/theme-mermaid": "^3.1.0", "@mdx-js/react": "^3.0.0", "clsx": "^1.2.1", "docusaurus-lunr-search": "^3.2.0", @@ -31,7 +33,8 @@ }, "devDependencies": { "@docusaurus/module-type-aliases": "3.1.0", - "@docusaurus/types": "3.1.0" + "@docusaurus/types": "3.1.0", + "typedoc-plugin-no-inherit": "^1.4.0" }, "browserslist": { "production": [ diff --git a/src/components/Layout.jsx b/src/components/Layout.jsx new file mode 100644 index 0000000..1175eb0 --- /dev/null +++ b/src/components/Layout.jsx @@ -0,0 +1,99 @@ +import React from 'react'; +import { Board, createBoardClasses } from '@boardzilla/core'; + +import styles from './layout.module.css'; + +const Layout = () => { + const [pieces, setPieces] = React.useState(4); + const [gapX, setGapX] = React.useState(10); + const [gapY, setGapY] = React.useState(0); + const [aspectRatio, setAspectRatio] = React.useState(7); + const [scaling, setScaling] = React.useState('fit'); + const [alignment, setAlignment] = React.useState('center'); + + const board = React.useMemo(() => { + const {Space, Piece, GameElement} = createBoardClasses(); + const board = new Board({ classRegistry: [Space, Piece, GameElement] }); + return board; + }, [Board]); + + const aspectRatioStr = ['1 / 4', '1 / 3', '1 / 2', '3 / 5', '2 / 3', '3 / 4', '4 / 5', '1', '5 / 4', '4 / 3', '3 / 2', '5 / 3', '2 / 1', '3 / 1', '4 / 1']; + + React.useMemo(() => { + const {Piece} = createBoardClasses(); + + board.resetUI(); + Piece.aspectRatio = aspectRatio; + board.layout(Piece, { + margin: 0, + gap: {x: gapX, y: gapY}, + aspectRatio: eval(aspectRatioStr[aspectRatio]), + scaling, + alignment, + }); + + if (pieces > board._t.children.length) { + board.createMany(pieces - board._t.children.length, Piece, 'a'); + } + if (pieces < board._t.children.length) { + board.lastN(board._t.children.length - pieces, Piece).remove(); + } + board.applyLayouts(); + + }, [board, gapX, gapY, pieces, aspectRatio, scaling, alignment]); + + return ( +
+
+
+ # of pieces: setPieces(parseInt(e.target.value))}/> +
+
+ gap: +
+ X: setGapX(parseFloat(e.target.value))}/> {gapX}% + Y: setGapY(parseFloat(e.target.value))}/> {gapY}% +
+
+
+ aspect ratio: setAspectRatio(parseFloat(e.target.value))}/> {aspectRatioStr[aspectRatio]} +
+
+ scaling: + setScaling('fit')} value="fit" /> + setScaling('fill')} value="fill" /> +
+
+ alignment: + +
+
+
+ {board._t.children.map(c => ( +
{c._t.id - 1}
+ ))} +
+
+ ); +}; + +export default Layout; diff --git a/src/components/layout.module.css b/src/components/layout.module.css new file mode 100644 index 0000000..3a196ee --- /dev/null +++ b/src/components/layout.module.css @@ -0,0 +1,19 @@ +.main { + width: 500px; + height: 500px; + position: relative; + outline: 1px solid black; +} + +.piece { + position: absolute; + background: #099; + outline: 1px solid blue; + transition: transform .6s, top .6s, left .6s, width .6s, height .6s; + color: white; + padding: 2%; +} + +.selected { + background: #99f; +} diff --git a/static/img/move.png b/static/img/move.png new file mode 100644 index 0000000000000000000000000000000000000000..afaad26a100d96ce838816551943d99cd3de93f6 GIT binary patch literal 8323 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 literal 0 HcmV?d00001 diff --git a/yarn.lock b/yarn.lock index d0579c9..43a5e0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1185,6 +1185,30 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@boardzilla/core@^0.0.64": + version "0.0.64" + resolved "https://registry.yarnpkg.com/@boardzilla/core/-/core-0.0.64.tgz#9c120085ffd095deb4618f0af9c2cc24e193f0be" + integrity sha512-n/i3Kz3WHyHEAcuPcrII1xmxcTMFjI2NuOTULwtilh4KnyaYF9+AOc5lii/N3A6v4q++/mfzw5HJrBKuK9rgaA== + dependencies: + classnames "^2.3.1" + graphology "^0.25.4" + graphology-shortest-path "^2.0.2" + graphology-traversal "^0.3.1" + graphology-types "^0.24.7" + random-seed "^0.3.0" + react "^18.2" + react-color "^2.19.3" + react-dom "^18.2" + react-draggable "^4.4.5" + react-tooltip "^5.25.0" + uuid-random "^1.3.2" + zustand "^4.4.0" + +"@braintree/sanitize-url@^6.0.1": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" + integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -1544,7 +1568,7 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-live-codeblock@3.1.0": +"@docusaurus/theme-live-codeblock@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/theme-live-codeblock/-/theme-live-codeblock-3.1.0.tgz#f25ae96f06b4a669a54b59a842c59148ccd137f8" integrity sha512-wJMa5iIA9LwJxBoPu/bCOiffdOggeU2VfGmu9l83gzLQ2l3CL2zUrdOcZzeU3FqFCns5mUSZfDZXmZp2tbWPiw== @@ -1559,6 +1583,19 @@ react-live "^4.1.5" tslib "^2.6.0" +"@docusaurus/theme-mermaid@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-3.1.0.tgz#1e7f8e96e21b5d180043f8f7793f1b38045c5806" + integrity sha512-63y08fvRWIe9satRV1e/Dps9he+sPjQ+kwl4ccQQEzkM2nxeAgWwk8WzpbVhm1Pf02N/11y0C6FcvFqn4dERHA== + dependencies: + "@docusaurus/core" "3.1.0" + "@docusaurus/module-type-aliases" "3.1.0" + "@docusaurus/theme-common" "3.1.0" + "@docusaurus/types" "3.1.0" + "@docusaurus/utils-validation" "3.1.0" + mermaid "^10.4.0" + tslib "^2.6.0" + "@docusaurus/theme-search-algolia@3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.1.0.tgz#3cdb1f0e8d15698a60110856ca5a06f10d3b049d" @@ -1645,6 +1682,26 @@ url-loader "^4.1.1" webpack "^5.88.1" +"@floating-ui/core@^1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.3.tgz#b6aa0827708d70971c8679a16cf680a515b8a52a" + integrity sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q== + dependencies: + "@floating-ui/utils" "^0.2.0" + +"@floating-ui/dom@^1.0.0": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.4.tgz#28df1e1cb373884224a463235c218dcbd81a16bb" + integrity sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ== + dependencies: + "@floating-ui/core" "^1.5.3" + "@floating-ui/utils" "^0.2.0" + +"@floating-ui/utils@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" + integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== + "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -1657,6 +1714,11 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@icons/material@^0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8" + integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -2041,6 +2103,23 @@ dependencies: "@types/node" "*" +"@types/d3-scale-chromatic@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz#fc0db9c10e789c351f4c42d96f31f2e4df8f5644" + integrity sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw== + +"@types/d3-scale@^4.0.3": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb" + integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ== + dependencies: + "@types/d3-time" "*" + +"@types/d3-time@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.3.tgz#3c186bbd9d12b9d84253b6be6487ca56b54f88be" + integrity sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw== + "@types/debug@^4.0.0": version "4.1.12" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" @@ -2166,6 +2245,13 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== +"@types/mdast@^3.0.0": + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== + dependencies: + "@types/unist" "^2" + "@types/mdast@^4.0.0", "@types/mdast@^4.0.2": version "4.0.3" resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.3.tgz#1e011ff013566e919a4232d1701ad30d70cab333" @@ -2490,6 +2576,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@yomguithereal/helpers@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@yomguithereal/helpers/-/helpers-1.1.1.tgz#185dfb0f88ca2beec53d0adf6eed15c33b1c549d" + integrity sha512-UYvAq/XCA7xoh1juWDYsq3W0WywOB+pz8cgVnE1b45ZfdMhBvHDrgmSFG3jXeZSr2tMTYLGHFHON+ekG05Jebg== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -3084,6 +3175,11 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== +classnames@^2.3.0, classnames@^2.3.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + clean-css@^5.2.2, clean-css@^5.3.2, clean-css@~5.3.2: version "5.3.3" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" @@ -3119,7 +3215,7 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -clsx@^1.2.1: +clsx@^1.1.1, clsx@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== @@ -3188,6 +3284,11 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== +commander@7, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^10.0.0: version "10.0.1" resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" @@ -3208,11 +3309,6 @@ commander@^5.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" @@ -3353,6 +3449,20 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cose-base@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" + integrity sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg== + dependencies: + layout-base "^1.0.0" + +cose-base@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01" + integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g== + dependencies: + layout-base "^2.0.0" + cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -3550,6 +3660,312 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +cytoscape-cose-bilkent@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" + integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ== + dependencies: + cose-base "^1.0.0" + +cytoscape-fcose@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471" + integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ== + dependencies: + cose-base "^2.2.0" + +cytoscape@^3.23.0: + version "3.28.1" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.28.1.tgz#f32c3e009bdf32d47845a16a4cd2be2bbc01baf7" + integrity sha512-xyItz4O/4zp9/239wCcH8ZcFuuZooEeF8KHRmzjDfGdXsj3OG9MFSMA0pJE0uX3uCN/ygof6hHf4L7lst+JaDg== + dependencies: + heap "^0.2.6" + lodash "^4.17.21" + +"d3-array@1 - 2": + version "2.12.1" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== + dependencies: + internmap "^1.0.0" + +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +d3-axis@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" + integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== + +d3-brush@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" + integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "3" + d3-transition "3" + +d3-chord@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" + integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== + dependencies: + d3-path "1 - 3" + +"d3-color@1 - 3", d3-color@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-contour@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" + integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== + dependencies: + d3-array "^3.2.0" + +d3-delaunay@6: + version "6.0.4" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" + integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== + dependencies: + delaunator "5" + +"d3-dispatch@1 - 3", d3-dispatch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +"d3-drag@2 - 3", d3-drag@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +"d3-dsv@1 - 3", d3-dsv@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== + dependencies: + commander "7" + iconv-lite "0.6" + rw "1" + +"d3-ease@1 - 3", d3-ease@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +d3-fetch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" + integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== + dependencies: + d3-dsv "1 - 3" + +d3-force@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== + dependencies: + d3-dispatch "1 - 3" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + +"d3-format@1 - 3", d3-format@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +d3-geo@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.0.tgz#74fd54e1f4cebd5185ac2039217a98d39b0a4c0e" + integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== + dependencies: + d3-array "2.5.0 - 3" + +d3-hierarchy@3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" + integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-polygon@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" + integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== + +"d3-quadtree@1 - 3", d3-quadtree@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +d3-random@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" + integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== + +d3-sankey@^0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/d3-sankey/-/d3-sankey-0.12.3.tgz#b3c268627bd72e5d80336e8de6acbfec9d15d01d" + integrity sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ== + dependencies: + d3-array "1 - 2" + d3-shape "^1.2.0" + +d3-scale-chromatic@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a" + integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +d3-scale@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +"d3-selection@2 - 3", d3-selection@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +d3-shape@3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +"d3-time-format@2 - 4", d3-time-format@4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +"d3-timer@1 - 3", d3-timer@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +"d3-transition@2 - 3", d3-transition@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +d3-zoom@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + +d3@^7.4.0, d3@^7.8.2: + version "7.8.5" + resolved "https://registry.yarnpkg.com/d3/-/d3-7.8.5.tgz#fde4b760d4486cdb6f0cc8e2cbff318af844635c" + integrity sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA== + dependencies: + d3-array "3" + d3-axis "3" + d3-brush "3" + d3-chord "3" + d3-color "3" + d3-contour "4" + d3-delaunay "6" + d3-dispatch "3" + d3-drag "3" + d3-dsv "3" + d3-ease "3" + d3-fetch "3" + d3-force "3" + d3-format "3" + d3-geo "3" + d3-hierarchy "3" + d3-interpolate "3" + d3-path "3" + d3-polygon "3" + d3-quadtree "3" + d3-random "3" + d3-scale "4" + d3-scale-chromatic "3" + d3-selection "3" + d3-shape "3" + d3-time "3" + d3-time-format "4" + d3-timer "3" + d3-transition "3" + d3-zoom "3" + +dagre-d3-es@7.0.10: + version "7.0.10" + resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz#19800d4be674379a3cd8c86a8216a2ac6827cadc" + integrity sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A== + dependencies: + d3 "^7.8.2" + lodash-es "^4.17.21" + +dayjs@^1.11.7: + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== + debounce@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" @@ -3642,6 +4058,13 @@ del@^6.1.1: rimraf "^3.0.2" slash "^3.0.0" +delaunator@5: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" + integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== + dependencies: + robust-predicates "^3.0.0" + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -3690,6 +4113,11 @@ devlop@^1.0.0, devlop@^1.1.0: dependencies: dequal "^2.0.0" +diff@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -3778,6 +4206,11 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" +dompurify@^3.0.5: + version "3.0.8" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.8.tgz#e0021ab1b09184bc8af7e35c7dd9063f43a8a437" + integrity sha512-b7uwreMYL2eZhrSCRC4ahLTeZcPZxSmYfmcQGXGkXiZSNW1X85v+SDM5KsWcpivIiUBH47Ji7NtyUdpLeF5JZQ== + domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -3831,6 +4264,11 @@ electron-to-chromium@^1.4.601: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.633.tgz#df8831d2fef994fe9c013e61db6cfb98eeebf52d" integrity sha512-7BvxzXrHFliyQ1oZc6NRMjyEaKOO1Ma1NY98sFZofogWlm+klLWSgrDw7EhatiMgi4R4NV+iWxDdxuIKXtPbOw== +elkjs@^0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.9.1.tgz#fd1524b3f0bed72dc65ba107ae91bcf04b5582bd" + integrity sha512-JWKDyqAdltuUcyxaECtYG6H4sqysXSLeoXuGUBfRNESMTkj+w+qdb0jya8Z/WI0jVd03WQtCGhS6FOFtlhD5FQ== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -4033,7 +4471,7 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.2.0: +events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -4495,6 +4933,50 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +graphology-indices@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/graphology-indices/-/graphology-indices-0.17.0.tgz#b93ad32162ff8b09814547aedb101248f0fcbd2e" + integrity sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ== + dependencies: + graphology-utils "^2.4.2" + mnemonist "^0.39.0" + +graphology-shortest-path@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/graphology-shortest-path/-/graphology-shortest-path-2.0.2.tgz#01385d2c0452ead890da2203b30d00177397678e" + integrity sha512-hlGvh4Yb1Vmd2J7wT8Q8+t4RQ6Tx+9wRYm0/fZB9PZJ4uW3nml5kJ7yXZ2+JYWT+7wLLmY5mg3o9bLSAWmv/jQ== + dependencies: + "@yomguithereal/helpers" "^1.1.1" + graphology-indices "^0.17.0" + graphology-utils "^2.4.3" + mnemonist "^0.39.0" + +graphology-traversal@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/graphology-traversal/-/graphology-traversal-0.3.1.tgz#d4342a7093b4d4dab0f9130949166d1a85467bcc" + integrity sha512-lGLrLKEDKtNgAKgHVhVftKf3cb/nuWwuVPQZHXRnN90JWn0RSjco/s+NB2ARSlMapEMlbnPgv6j++427yTnU3Q== + dependencies: + graphology-indices "^0.17.0" + graphology-utils "^2.0.0" + +graphology-types@^0.24.7: + version "0.24.7" + resolved "https://registry.yarnpkg.com/graphology-types/-/graphology-types-0.24.7.tgz#7d630a800061666bfa70066310f56612e08b7bee" + integrity sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA== + +graphology-utils@^2.0.0, graphology-utils@^2.4.2, graphology-utils@^2.4.3: + version "2.5.2" + resolved "https://registry.yarnpkg.com/graphology-utils/-/graphology-utils-2.5.2.tgz#4d30d6e567d27c01f105e1494af816742e8d2440" + integrity sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ== + +graphology@^0.25.4: + version "0.25.4" + resolved "https://registry.yarnpkg.com/graphology/-/graphology-0.25.4.tgz#e528a64555ac1f392a9d965321ada5b2b843efe1" + integrity sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ== + dependencies: + events "^3.3.0" + obliterator "^2.0.2" + gray-matter@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" @@ -4769,6 +5251,11 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +heap@^0.2.6: + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + history@^4.9.0: version "4.10.1" resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" @@ -4959,6 +5446,13 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@0.6: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" @@ -5052,6 +5546,16 @@ inline-style-parser@0.2.2: resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.2.tgz#d498b4e6de0373458fc610ff793f6b14ebf45633" integrity sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ== +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -5385,6 +5889,11 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + json5@^2.1.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" @@ -5411,6 +5920,11 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" +khroma@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" + integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw== + kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -5421,6 +5935,11 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +kleur@^4.0.3: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + latest-version@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" @@ -5436,6 +5955,16 @@ launch-editor@^2.6.0: picocolors "^1.0.0" shell-quote "^1.8.1" +layout-base@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" + integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== + +layout-base@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" + integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -5492,6 +6021,11 @@ locate-path@^7.1.0: dependencies: p-locate "^6.0.0" +lodash-es@^4.17.15, lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -5507,7 +6041,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.20, lodash@^4.17.21: +lodash@^4.0.1, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5592,6 +6126,11 @@ marked@^4.3.0: resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== +material-colors@^1.2.1: + version "1.2.6" + resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.6.tgz#6d1958871126992ceecc72f4bcc4d8f010865f46" + integrity sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg== + mdast-util-directive@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz#3fb1764e705bbdf0afb0d3f889e4404c3e82561f" @@ -5616,6 +6155,24 @@ mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: unist-util-is "^6.0.0" unist-util-visit-parents "^6.0.0" +mdast-util-from-markdown@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + decode-named-character-reference "^1.0.0" + mdast-util-to-string "^3.1.0" + micromark "^3.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-decode-string "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-stringify-position "^3.0.0" + uvu "^0.5.0" + mdast-util-from-markdown@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz#52f14815ec291ed061f2922fd14d6689c810cb88" @@ -5802,6 +6359,13 @@ mdast-util-to-markdown@^2.0.0: unist-util-visit "^5.0.0" zwitch "^2.0.0" +mdast-util-to-string@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" + integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" @@ -5841,11 +6405,59 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +mermaid@^10.4.0: + version "10.7.0" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.7.0.tgz#4fd5bfd60c0c5e5c42016a82905f06c4684ec53b" + integrity sha512-PsvGupPCkN1vemAAjScyw4pw34p4/0dZkSrqvAB26hUvJulOWGIwt35FZWmT9wPIi4r0QLa5X0PB4YLIGn0/YQ== + dependencies: + "@braintree/sanitize-url" "^6.0.1" + "@types/d3-scale" "^4.0.3" + "@types/d3-scale-chromatic" "^3.0.0" + cytoscape "^3.23.0" + cytoscape-cose-bilkent "^4.1.0" + cytoscape-fcose "^2.1.0" + d3 "^7.4.0" + d3-sankey "^0.12.3" + dagre-d3-es "7.0.10" + dayjs "^1.11.7" + dompurify "^3.0.5" + elkjs "^0.9.0" + khroma "^2.0.0" + lodash-es "^4.17.21" + mdast-util-from-markdown "^1.3.0" + non-layered-tidy-tree-layout "^2.0.2" + stylis "^4.1.3" + ts-dedent "^2.2.0" + uuid "^9.0.0" + web-worker "^1.2.0" + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +micromark-core-commonmark@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-factory-destination "^1.0.0" + micromark-factory-label "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-factory-title "^1.0.0" + micromark-factory-whitespace "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-html-tag-name "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + micromark-core-commonmark@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz#50740201f0ee78c12a675bf3e68ffebc0bf931a3" @@ -6036,6 +6648,15 @@ micromark-extension-mdxjs@^3.0.0: micromark-util-combine-extensions "^2.0.0" micromark-util-types "^2.0.0" +micromark-factory-destination@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + micromark-factory-destination@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" @@ -6045,6 +6666,16 @@ micromark-factory-destination@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark-factory-label@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + micromark-factory-label@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" @@ -6085,6 +6716,16 @@ micromark-factory-space@^2.0.0: micromark-util-character "^2.0.0" micromark-util-types "^2.0.0" +micromark-factory-title@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + micromark-factory-title@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" @@ -6095,6 +6736,16 @@ micromark-factory-title@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark-factory-whitespace@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + micromark-factory-whitespace@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" @@ -6121,6 +6772,13 @@ micromark-util-character@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark-util-chunked@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-chunked@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" @@ -6128,6 +6786,15 @@ micromark-util-chunked@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" +micromark-util-classify-character@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + micromark-util-classify-character@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" @@ -6137,6 +6804,14 @@ micromark-util-classify-character@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark-util-combine-extensions@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-types "^1.0.0" + micromark-util-combine-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" @@ -6145,6 +6820,13 @@ micromark-util-combine-extensions@^2.0.0: micromark-util-chunked "^2.0.0" micromark-util-types "^2.0.0" +micromark-util-decode-numeric-character-reference@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" + integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-decode-numeric-character-reference@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" @@ -6152,6 +6834,16 @@ micromark-util-decode-numeric-character-reference@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" +micromark-util-decode-string@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" + integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-decode-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" @@ -6162,6 +6854,11 @@ micromark-util-decode-string@^2.0.0: micromark-util-decode-numeric-character-reference "^2.0.0" micromark-util-symbol "^2.0.0" +micromark-util-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" + integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== + micromark-util-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" @@ -6181,11 +6878,23 @@ micromark-util-events-to-acorn@^2.0.0: micromark-util-types "^2.0.0" vfile-message "^4.0.0" +micromark-util-html-tag-name@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== + micromark-util-html-tag-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== +micromark-util-normalize-identifier@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-normalize-identifier@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" @@ -6193,6 +6902,13 @@ micromark-util-normalize-identifier@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" +micromark-util-resolve-all@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== + dependencies: + micromark-util-types "^1.0.0" + micromark-util-resolve-all@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" @@ -6200,6 +6916,15 @@ micromark-util-resolve-all@^2.0.0: dependencies: micromark-util-types "^2.0.0" +micromark-util-sanitize-uri@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-sanitize-uri@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" @@ -6209,6 +6934,16 @@ micromark-util-sanitize-uri@^2.0.0: micromark-util-encode "^2.0.0" micromark-util-symbol "^2.0.0" +micromark-util-subtokenize@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + micromark-util-subtokenize@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz#9f412442d77e0c5789ffdf42377fa8a2bcbdf581" @@ -6229,7 +6964,7 @@ micromark-util-symbol@^2.0.0: resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== -micromark-util-types@^1.0.0: +micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== @@ -6239,6 +6974,29 @@ micromark-util-types@^2.0.0: resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== +micromark@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + micromark-core-commonmark "^1.0.1" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + micromark@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" @@ -6355,6 +7113,18 @@ mkdirp@0.3.0: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" integrity sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew== +mnemonist@^0.39.0: + version "0.39.7" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.39.7.tgz#712eebb827a31c83c9711f17d6256d2670c87a30" + integrity sha512-ix3FwHWZgdXUt0dHM8bCrI4r1KMeYx8bCunPCYmvKXq4tn6gbNsqrsb4q0kDbDqbpIOvEaW5Sn+dmDwGydfrwA== + dependencies: + obliterator "^2.0.1" + +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + mrmime@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" @@ -6435,6 +7205,11 @@ node-releases@^2.0.14: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +non-layered-tidy-tree-layout@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" + integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== + nopt@1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" @@ -6511,6 +7286,11 @@ object.assign@^4.1.0: has-symbols "^1.0.3" object-keys "^1.1.1" +obliterator@^2.0.1, obliterator@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -7147,7 +7927,7 @@ prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -7222,6 +8002,13 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +random-seed@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/random-seed/-/random-seed-0.3.0.tgz#d945f2e1f38f49e8d58913431b8bf6bb937556cd" + integrity sha512-y13xtn3kcTlLub3HKWXxJNeC2qK4mB59evwZ5EkeRlolx+Bp2ztF7LbcZmyCnOqlHQrLnfuNbi1sVmm9lPDlDA== + dependencies: + json-stringify-safe "^5.0.1" + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -7259,6 +8046,19 @@ rc@1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-color@^2.19.3: + version "2.19.3" + resolved "https://registry.yarnpkg.com/react-color/-/react-color-2.19.3.tgz#ec6c6b4568312a3c6a18420ab0472e146aa5683d" + integrity sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA== + dependencies: + "@icons/material" "^0.2.4" + lodash "^4.17.15" + lodash-es "^4.17.15" + material-colors "^1.2.1" + prop-types "^15.5.10" + reactcss "^1.2.0" + tinycolor2 "^1.4.1" + react-dev-utils@^12.0.1: version "12.0.1" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" @@ -7289,7 +8089,7 @@ react-dev-utils@^12.0.1: strip-ansi "^6.0.1" text-table "^0.2.0" -react-dom@^18.2.0: +react-dom@^18.2, react-dom@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== @@ -7297,6 +8097,14 @@ react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-draggable@^4.4.5: + version "4.4.6" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.6.tgz#63343ee945770881ca1256a5b6fa5c9f5983fe1e" + integrity sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw== + dependencies: + clsx "^1.1.1" + prop-types "^15.8.1" + react-error-overlay@^6.0.11: version "6.0.11" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" @@ -7388,13 +8196,28 @@ react-router@5.3.4, react-router@^5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react@^18.2.0: +react-tooltip@^5.25.0: + version "5.25.2" + resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-5.25.2.tgz#efb51845ec2e863045812ad1dc1927573922d629" + integrity sha512-MwZ3S9xcHpojZaKqjr5mTs0yp/YBPpKFcayY7MaaIIBr2QskkeeyelpY2YdGLxIMyEj4sxl0rGoK6dQIKvNLlw== + dependencies: + "@floating-ui/dom" "^1.0.0" + classnames "^2.3.0" + +react@^18.2, react@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" +reactcss@^1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/reactcss/-/reactcss-1.2.3.tgz#c00013875e557b1cf0dfd9a368a1c3dab3b548dd" + integrity sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A== + dependencies: + lodash "^4.0.1" + readable-stream@^2.0.1: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" @@ -7713,6 +8536,11 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +robust-predicates@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" + integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== + rtl-detect@^1.0.4: version "1.1.2" resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.1.2.tgz#ca7f0330af5c6bb626c15675c642ba85ad6273c6" @@ -7735,6 +8563,18 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rw@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + +sade@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -7745,7 +8585,7 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -8232,6 +9072,11 @@ stylehacks@^5.1.1: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" +stylis@^4.1.3: + version "4.3.1" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb" + integrity sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ== + sucrase@^3.31.0: version "3.35.0" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" @@ -8354,6 +9199,11 @@ tiny-warning@^1.0.0: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tinycolor2@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" + integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -8399,6 +9249,11 @@ trough@^2.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== +ts-dedent@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" + integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== + ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" @@ -8446,6 +9301,11 @@ typedoc-plugin-merge-modules@^5.1.0: resolved "https://registry.yarnpkg.com/typedoc-plugin-merge-modules/-/typedoc-plugin-merge-modules-5.1.0.tgz#53ac37f4ab40caac8ee23da1e26042d3a103c4a8" integrity sha512-jXH27L/wlxFjErgBXleh3opVgjVTXFEuBo68Yfl18S9Oh/IqxK6NV94jlEJ9hl4TXc9Zm2l7Rfk41CEkcCyvFQ== +typedoc-plugin-no-inherit@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/typedoc-plugin-no-inherit/-/typedoc-plugin-no-inherit-1.4.0.tgz#8eafc790588f63f0a24621b646219cd6e8d6e4d6" + integrity sha512-cAvqQ8X9xh1xztVoDKtF4nYRSBx9XwttN3OBbNNpA0YaJSRM8XvpVVhugq8FoO1HdWjF3aizS0JzdUOMDt0y9g== + typedoc@^0.25.2: version "0.25.7" resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.25.7.tgz#11e3f527ca80ca3c029cb8e15f362e6d9f715e25" @@ -8579,6 +9439,13 @@ unist-util-stringify-position@^2.0.0: dependencies: "@types/unist" "^2.0.2" +unist-util-stringify-position@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" @@ -8679,6 +9546,11 @@ use-editable@^2.3.3: resolved "https://registry.yarnpkg.com/use-editable/-/use-editable-2.3.3.tgz#a292fe9ba4c291cd28d1cc2728c75a5fc8d9a33f" integrity sha512-7wVD2JbfAFJ3DK0vITvXBdpd9JAz5BcKAAolsnLBuBn6UDDwBGuCIAGvR3yA2BNKm578vAMVHFCWaOcA+BhhiA== +use-sync-external-store@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -8699,11 +9571,31 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid-random@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/uuid-random/-/uuid-random-1.3.2.tgz#96715edbaef4e84b1dcf5024b00d16f30220e2d0" + integrity sha512-UOzej0Le/UgkbWEO8flm+0y+G+ljUon1QWTEZOq1rnMAsxo2+SckbiZdKzAHHlVh6gJqI1TjC/xwgR50MuCrBQ== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +uvu@^0.5.0: + version "0.5.6" + resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== + dependencies: + dequal "^2.0.0" + diff "^5.0.0" + kleur "^4.0.3" + sade "^1.7.3" + value-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" @@ -8797,6 +9689,11 @@ web-namespaces@^2.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== +web-worker@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.3.0.tgz#e5f2df5c7fe356755a5fb8f8410d4312627e6776" + integrity sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA== + webpack-bundle-analyzer@^4.9.0: version "4.10.1" resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz#84b7473b630a7b8c21c741f81d8fe4593208b454" @@ -9054,6 +9951,13 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== +zustand@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.0.tgz#141354af56f91de378aa6c4b930032ab338f3ef0" + integrity sha512-zlVFqS5TQ21nwijjhJlx4f9iGrXSL0o/+Dpy4txAP22miJ8Ti6c1Ol1RLNN98BMib83lmDH/2KmLwaNXpjrO1A== + dependencies: + use-sync-external-store "1.2.0" + zwitch@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"