The site draws mermaid code blocks with @docusaurus/theme-mermaid 3.10.2, through a swizzled Mermaid component that reads 012's palette from custom.css for the color mode shown (base theme, IBM Plex Mono, square flat boxes), keyed on the page's data-theme so a light page doesn't render each diagram twice while it hydrates. Diagrams: the engine's package graph (replacing the ASCII one), the change stream, a keystroke's way to the screen, a file's ways into a sheet, a notebook command's run and an SSH session in architecture.md; the typing modes on The screen; vim's modes in Keys; a linked file's states in Following files; JEV's answer flow; the release checklist. site.md says when to draw one, and CLAUDE.md points there.
- commit
- 1f8d902155c43f7bc86b68ee7ba3c3dacdc17038
- parent
- 81fef46361aef060c578c9b6265539b6d40b964a
- author
- Dami <dami.etoile@gmail.com>
- kind
- docs risk score 0.7 of 3, Jev's estimate
| M | CLAUDE.md | 4 | + |
| M | docs/ | 212 | +++- |
| M | docs/ | 15 | + |
| M | docs/ | 24 | + |
| M | docs/ | 22 | + |
| M | docs/ | 29 | +- |
| M | docs/ | 21 | +- |
| M | docs/ | 22 | +- |
| M | website/ | 7 | + |
| M | website/ | 1403 | ++++++++++++++++++++++++++++-- |
| M | website/ | 1 | + |
| M | website/ | 15 | + |
| A | website/ | 169 | ++++ |
@@ -24,5 +24,9 @@ Noise that stays becomes invisible, and then real problems hide in it.
2424 reader would look in, link to it from elsewhere, and restructure when2525 appending would make a wall of text. Shipped roadmap items move to its2626 Shipped list as one line.27+- Diagrams are Mermaid code blocks, never ASCII art; screens and terminal28+ output stay code blocks. Draw one where a flow, a state machine or a29+ sequence would otherwise take paragraphs30+ ([the docs site](docs/contributing/site.md#diagrams)).2731 - No scratch files, debug tests, temporary samples or build outputs (`*.test`, binaries) in commits; `make lint` refuses compiled files and anything over 2 MB.2832 - Visual changes are reviewed in the golden gallery (`make screens`).@@ -56,22 +56,32 @@ oracle/ differential tests against excelize's calculation (separate mod
5656 5757 `internal/sheet` knows nothing about terminals. It builds on the function5858 library, which knows nothing about sheets or storage, and on packages59-that know nothing about cells; dependencies point one way:60-61-```62-internal/ui, internal/fileio, internal/chart, oracle63- |64-internal/sheet ------------------------------+65- | |66-internal/functions ---> internal/formula |67- | |68-internal/value ---> internal/numfmt <------+59+that know nothing about cells. Dependencies point one way, down the60+graph of imports below the engine; `internal/locale`, at the bottom,61+holds the table of locales and depends on nothing:62+63+```mermaid64+flowchart TD65+ subgraph callers [the engine's callers]66+ direction LR67+ ui[internal/ui] ~~~ fileio[internal/fileio] ~~~ live[internal/live] ~~~ nushell[internal/nushell]68+ chart[internal/chart] ~~~ jev[internal/jev] ~~~ stress[internal/stress] ~~~ oracle[oracle]69+ end70+ callers --> sheet[internal/sheet]71+ sheet --> functions[internal/functions]72+ sheet --> formula[internal/formula]73+ sheet --> value[internal/value]74+ sheet --> numfmt[internal/numfmt]75+ sheet --> locale[internal/locale]76+ functions --> formula77+ functions --> value78+ functions --> numfmt79+ value --> numfmt80+ value --> locale81+ formula --> locale82+ numfmt --> locale6983 ```7084 71-(`sheet` also uses `formula`, `value` and `numfmt` directly. Below72-them all, `internal/locale` holds the table of locales and depends on73-nothing.)74-7585 - `internal/locale` is the conventions of each locale: decimal and7686 thousands separators, date order and patterns, currency symbol and7787 place, and the formula separators that follow from the decimal one.@@ -265,10 +275,22 @@ style.
265275 266276 ### The change stream267277 268-Rows reach a region as `sheet.LiveOp`s, each applied at once by269-`Workbook.ApplyLive` through the regions' one write path: what follows270-a linked file sends them, and a command region's table is written the271-same way from its `RegionData`.278+Rows reach a region through the regions' one write path, `writeTable`.279+A linked file's arrive as `sheet.LiveOp`s, each applied at once by280+`Workbook.ApplyLive`; a command region's table is written the same way281+from its `RegionData`, which a run puts in the undo state:282+283+```mermaid284+flowchart TD285+ file[a linked file] -->|polled| source[live.Source]286+ source -->|live.Update| op[sheet.LiveOp]287+ op --> apply[Workbook.ApplyLive]288+ run[a notebook command's run] -->|ShowRegion, an undo step| data[RegionData]289+ apply --> write[writeTable: the cells that differ, outside the undo history]290+ data --> write291+ write --> recalc[recalculation: what reads them, pivots and spills included]292+ recalc --> frame[the next frame draws the cells on screen]293+```272294 273295 | Field | Holds |274296 |---|---|@@ -279,11 +301,10 @@ same way from its `RegionData`.
279301 | `Rows` | data rows: values with the formats they arrived in (`LiveCell`) |280302 | `Err`, `Note` | why the source can't be read, what it left out |281303 282-An op is applied outside the undo history, as a spill is written: the304+An op is applied outside the undo history, as a spill is written. A283305 window drops the oldest rows (read back from the region's cells and284-written again one row up), only the cells that changed are written, and285-what reads them recalculates, pivots and spills included; inside an open286-step (a macro run) they recalculate when it ends. An op carries whole306+written again one row up); inside an open step (a macro run) what reads307+the cells recalculates when the step ends. An op carries whole287308 values and names nothing but its region, so applying the same ops in the288309 same order to the same workbook makes the same cells: it is what a289310 session following another's over `012 serve` would be sent, beside the@@ -420,6 +441,26 @@ range it writes (`edits`), and `runCommand` refuses it over a pivot
420441 table's results, so a new editing command is guarded by saying what it421442 edits.422443 444+A keystroke's way from the terminal to the screen, as a command or as445+an entry typed into a cell:446+447+```mermaid448+flowchart TD449+ key[a key] --> update[Model.Update]450+ update --> mode{the mode}451+ mode -->|READY| keymap[the keymap, Sheets or vim]452+ mode -->|MENU| overlay[the open overlay]453+ mode -->|ENTER, EDIT, POINT| entry[the cell entry]454+ keymap -->|a command id| run[runCommand: its telemetry span, the pivot guard, the macro recorder]455+ overlay -->|a command id| run456+ run --> cmd[the command's run]457+ entry -->|Enter, Tab: validation, the recorder| commit[the entry stored]458+ cmd --> step[an undo step: Sheet.Batch, Set]459+ commit --> step460+ step --> recalc[the step ends: recalculate what it changed, push it on the undo stack]461+ recalc --> view[View: the control panel, the visible rows, the overlays on top]462+```463+423464 **Model and components.** `Model` (`model.go`) is the root: it holds the424465 file, the mode and the note on the context line, owns one component for425466 each thing that takes input or draws part of the screen, routes each@@ -526,36 +567,54 @@ is one row of the table in `formats.go` (its name, extensions, the words
526567 the UI shows for it, whether it holds several sheets or tables, and its527568 importer and exporter) plus a file of its own; `Import`, `Export`,528569 recognizing a file by its extension, the import picker and the Download529-menu all come from the table. Importers build a new workbook through the530-engine's public API with a shared `builder`, which keeps text as text,531-falls back to a formula's cached value when it can't be translated, and532-counts what didn't fit. They stream: CSV and TSV are read record by533-record, NUON and JSON a row at a time (`nuon.Reader`, which yields rows534-from a pipe as they arrive), Parquet a batch of rows at a time, SQLite a row at a time, and570+menu all come from the table. A file takes one of these ways into a571+sheet, imported or followed:572+573+```mermaid574+flowchart TD575+ file[a file, or standard input] --> row[its format's row in formats.go]576+ row --> importer[the format's importer, streaming]577+ importer --> builder[the builder]578+ builder -->|the engine's public API| wb[a new workbook]579+ followed[a followed file] --> livefile[live.File, watching os.Stat]580+ livefile -->|grown: the bytes it gained| tail[Tail: the importers' readers over a pipe]581+ livefile -->|rewritten, once it holds still| importer582+ tail -->|typed rows| op[sheet.LiveOp, the change stream]583+ wb -->|a followed file's table, as rows| op584+```585+586+The shared `builder` keeps text as text, falls back to a formula's587+cached value when it can't be translated, and counts what didn't fit.588+Importers stream: CSV and TSV are read record by record, NUON and JSON589+a row at a time (`nuon.Reader`, which yields rows from a pipe as they590+arrive), Parquet a batch of rows at a time, SQLite a row at a time, and535591 Parquet files and SQLite tables stop at the sheet's last row, taking the536-number of rows left out from the file. A `Tail` reads CSV, TSV, JSON and537-NUON as they arrive in pieces, for a file followed as it grows: the538-importers' readers run on a goroutine of its own over a pipe that waits539-for the next piece, so a record cut off at the end of one waits for the540-rest, and rows come out typed as an import types them (`tail.go`).541-`internal/live` follows files with `os.Stat` alone, reading what a542-growing file gained through a `Tail`, and any other format again whole,543-through its importer, once it holds still (`live.File`); a `live.Source`544-is anything that yields a table's rows over time, which a nushell region545-following a pipeline would be too. XLSX is read by 012's own546-SpreadsheetML reader on `archive/zip` and `encoding/xml`: the workbook,547-shared strings (kept end to end in one buffer) and styles first, then548-each worksheet a token at a time, a row at a time, expanding shared549-formulas only for the cells kept. The file is untrusted, so the reader550-caps what it can be made to do (`xlsxLimits`: uncompressed bytes per551-part and in all, compression ratio, zip entries, XML nesting and token552-size, shared strings, styles, sheets, and the text shared formulas553-expand to) and refuses unsafe part names and references past Excel's554-edges; `FuzzReadXLSX` and `FuzzReadXLSXParts` fuzz it. XLSX is written555-with the same packages, a worksheet part streamed per sheet. Exporters556-write a `Snapshot` taken on the UI goroutine, in the background, through557-one atomic write-then-rename; CSV and TSV are written a row at a time. One package suits formats that share558-this much (the builder, number formats, serial dates and Excel formula592+number of rows left out from the file.593+594+A `Tail` reads CSV, TSV, JSON and NUON as they arrive in pieces, for a595+file followed as it grows: the importers' readers run on a goroutine of596+its own over a pipe that waits for the next piece, so a record cut off597+at the end of one waits for the rest, and rows come out typed as an598+import types them (`tail.go`). A `live.Source` is anything that yields a599+table's rows over time, which a nushell region following a pipeline600+would be too.601+602+XLSX is read by 012's own SpreadsheetML reader on `archive/zip` and603+`encoding/xml`: the workbook, shared strings (kept end to end in one604+buffer) and styles first, then each worksheet a token at a time, a row605+at a time, expanding shared formulas only for the cells kept. The file606+is untrusted, so the reader caps what it can be made to do607+(`xlsxLimits`: uncompressed bytes per part and in all, compression608+ratio, zip entries, XML nesting and token size, shared strings, styles,609+sheets, and the text shared formulas expand to) and refuses unsafe part610+names and references past Excel's edges; `FuzzReadXLSX` and611+`FuzzReadXLSXParts` fuzz it. XLSX is written with the same packages, a612+worksheet part streamed per sheet.613+614+Exporters write a `Snapshot` taken on the UI goroutine, in the615+background, through one atomic write-then-rename; CSV and TSV are616+written a row at a time. One package suits formats that share this much617+(the builder, number formats, serial dates and Excel formula559618 translation); a format that grew its own dependencies would move to a560619 subpackage behind the same table row.561620 @@ -605,7 +664,22 @@ each table from a file named by an environment variable
605664 (`let r1 = (open --raw $env.NU012_TABLE_0 | from nuon)`), feeds the606665 selection as `$in` on standard input, and ends in `to nuon`, so no data607666 is ever spliced into the command. What nu prints is read as it's608-written by the NUON importer, capped at max-cells. `Runner` is the667+written by the NUON importer, capped at max-cells:668+669+```mermaid670+sequenceDiagram671+ participant UI as internal/ui672+ participant R as nushell.Runner673+ participant Nu as nu -c674+ UI->>R: a Job: the command, the NUON of the tables it reads675+ R->>R: each table to a file, named in NU012_TABLE_0, 1, ...676+ R->>Nu: the script, with the selection on standard input677+ Nu->>Nu: let r1 = (open --raw $env.NU012_TABLE_0 | from nuon)678+ Nu-->>R: the command's table, to nuon679+ R-->>UI: rows read as they're written, up to max-cells680+ UI->>UI: ShowRegion: the table, one undo step681+```682+ `Runner` is the609683 seam: tests hand the UI a fake, the e2e screens a stand-in `nu`610684 script. The UI runs one command at a time as a `tea.Cmd` with a611685 context Esc cancels and a timeout, and shows each table as an undo@@ -641,13 +715,33 @@ slice edge or the rim.
641715 `internal/serve` wraps `charm.land/ssh` (wish's server) with only a642716 session channel, public-key auth against authorized_keys, and a shell643717 request or, with a PTY, a one-word exec request allowed. The exec644-request is never run: its word is a file name, resolved through the645-served directory's `confine.Root` before the session starts and handed646-to `Model.OpenOnStart`. Each session builds a `ui.Model` of its own and runs it647-in its own `tea.Program` over the session (wish's emulated PTY), with648-the client's environment and window size; `Model.Serve` gives it the649-client's environment for terminal detection and a `confine.Root` for650-file names. Everything a model knows lives in the model, so sessions718+request is never run: its word is a file name. A session from login to719+its end:720+721+```mermaid722+sequenceDiagram723+ participant C as ssh client724+ participant S as internal/serve725+ participant M as the session's ui.Model726+ C->>S: public key727+ S->>S: authorize: authorized_keys read again728+ C->>S: session channel, pty-req729+ C->>S: shell, or exec with one word730+ S->>S: allowSession, fileArg: the word resolved through confine.Root731+ S->>S: a slot under --max-sessions732+ S->>M: ui.New, Model.Serve (client's environment, confine.Root), OpenOnStart733+ S->>M: its own tea.Program over the session734+ loop until it quits, the client goes, it idles or the server stops735+ C->>M: keys, window size changes736+ M-->>C: frames737+ end738+ S->>M: Unsaved, Recover (idle or stopping)739+ S-->>C: why it ended, where unsaved work was kept740+```741+742+Each session runs its `tea.Program` over wish's emulated PTY; the743+client's environment is what the model detects the terminal from, and744+its `confine.Root` resolves every file name. Everything a model knows lives in the model, so sessions651745 share nothing but read-only tables (the command and function652746 registries), the process-wide telemetry and, with JEV on, the HTTP653747 client; each gets its own `jev.Cache`, whose queue belongs to that@@ -12,6 +12,21 @@ publishes there, and `make dist` uploads nothing.
1212 1313 ## Checklist1414 15+The steps in order, and what each leaves behind; a small release may16+skip the stress run:17+18+```mermaid19+flowchart TD20+ check[make check, the gallery reviewed] --> small{a small release?}21+ small -->|no| stress[make stress, make stress-report]22+ small -->|yes| xlsx23+ stress -->|the run recorded on the commit| xlsx[XLSX opened in Excel, LibreOffice, Sheets]24+ xlsx --> tag[git tag -a, git push]25+ tag -->|the module proxy| install[go install ...@v1.2.3]26+ tag --> dist[make dist]27+ dist --> archives[dist/: archives, SHA256SUMS]28+```29+1530 1. **`make check`** passes on the commit to be tagged (see1631 [Testing](testing.md)), with the golden screens reviewed in the1732 gallery.@@ -61,6 +61,9 @@ page that passes `make lint` but breaks on the site shows up here.
6161 (`website/src/remark/repo-links.ts`).6262 - The generated pages, [Functions](../reference/functions.md) and6363 [Configuration](../reference/config.md), are pages like any other.64+- `mermaid` code blocks are drawn as diagrams65+ (`@docusaurus/theme-mermaid`), as GitHub draws them; see66+ [Diagrams](#diagrams).6467 - Search is local: `@easyops-cn/docusaurus-search-local` builds an index6568 at build time, and nothing is sent to a service.6669 @@ -74,3 +77,24 @@ colors in `website/src/css/custom.css` are the reference palettes of the
7477 golden screens, given the roles the app gives them: cyan where you are,7578 bright black header bands, blue links and selection. Headings and chrome7679 are IBM Plex Mono, body text IBM Plex Sans, both bundled with the site.80+81+## Diagrams82+83+Diagrams are Mermaid, in a `mermaid` code block, never ASCII art: the84+same source is drawn on the site and on GitHub. A code block of text85+stays for what is text on a terminal: screens, mockups of them and86+command output.87+88+- Draw one where a flow, a state machine or a sequence would otherwise89+ take paragraphs: a flowchart for data moving through the code, a state90+ diagram for modes, a sequence diagram for two programs talking. Not91+ for its own sake: a list or a table that reads well stays one.92+- A short sentence before it says what it shows, and the prose around93+ it keeps the facts the diagram can't (why, limits, names to search94+ for) without walking through it again.95+- Labels are the words the docs use: the key, the command's title, the96+ function or type name; menu paths in them are checked as in prose.97+- Colors and fonts come from the site: `website/src/theme/Mermaid`98+ (Docusaurus's component, swizzled) draws with Mermaid's `base` theme99+ and variables read from the palette in `custom.css` for the color100+ mode shown, so diagrams don't set their own styles.@@ -89,6 +89,28 @@ the spreadsheet modified.
8989 9090 ## Pause, read again, unlink9191 92+A linked region follows its file, is paused, or shows why it can't read93+it, and is read again whole whenever its cells may no longer be the94+file's:95+96+```mermaid97+stateDiagram-v298+ state "Read whole" as whole99+ state "● Following" as following100+ state "‖ Paused" as paused101+ state "! Failing" as failing102+ [*] --> whole: linked, or the spreadsheet opened103+ whole --> following104+ following --> following: rows appended105+ following --> whole: the file truncated, rotated or rewritten106+ following --> whole: Read again, Rows to keep, the region moved107+ following --> paused: Follow off108+ paused --> following: Follow on, catching up109+ following --> failing: the file gone or unreadable110+ failing --> whole: the file readable again111+ following --> [*]: Unlink, the rows kept as cells112+```113+92114 Data > Linked file acts on the region under the pointer, or the sheet's93115 only one:94116 @@ -83,11 +83,30 @@ it.
8383 8484 ## How requests behave8585 86-- Requests run in the background, eight at a time; the status line counts87- them and terminals that support it (OSC 9;4) show progress in the tab.88-- Answers are cached by the exact question (value, question and criteria),89- so recalculating, undo and redo never ask twice, and `JEV.TEST` and90- `JEV.PROB` on the same question share one request.86+A JEV cell's question goes to the answer cache first, and to the service87+only when it's new:88+89+```mermaid90+sequenceDiagram91+ participant Cell as a JEV cell92+ participant Cache as the answer cache93+ participant JEV as the JEV service94+ Cell->>Cache: the question: value, question and criteria95+ alt asked before96+ Cache-->>Cell: the answer97+ else new98+ Cache-->>Cell: Loading…99+ Cache->>JEV: in the background, eight at a time100+ JEV-->>Cache: the answer, or why it failed101+ Cache-->>Cell: recalculated with it, or #35;ERROR!102+ end103+```104+105+- The status line counts requests in flight, and terminals that support106+ it (OSC 9;4) show progress in the tab.107+- Answers are cached by the exact question, so recalculating, undo and108+ redo never ask twice, and `JEV.TEST` and `JEV.PROB` on the same109+ question share one request.91110 - Errors in the inputs (`#DIV/0!` in the value, an empty question, fewer92111 than two labels, more than the service's 255 labels or 10 score levels)93112 show as errors at once and are never sent.@@ -33,4 +33,23 @@ say what's going on.
3333 | NORMAL, VISUAL, COMMAND | In the [vim keymap](../reference/keys.md#vim-keys), in place of READY, while selecting, and on the `:` line |3434 3535 Whatever the mode, the context line shows the keys that apply, and Esc36-backs out one level.36+backs out one level. Typing into a cell moves between READY, ENTER, EDIT37+and POINT; menus and the other tools open over READY and close back to38+it:39+40+```mermaid41+stateDiagram-v242+ state "MENU, HELP, FIND, SORT and the other tools" as tools43+ [*] --> READY44+ READY --> ENTER: type45+ READY --> EDIT: Enter, F2, double-click46+ ENTER --> EDIT: F2, or a formula that can't be stored47+ ENTER --> POINT: an arrow after an operator48+ EDIT --> POINT: Shift+arrow after an operator49+ POINT --> ENTER: type, Esc50+ ENTER --> READY: Enter, Tab, Esc51+ EDIT --> READY: Enter, Tab, Esc52+ POINT --> READY: Enter, Tab53+ READY --> tools: F10, Ctrl+K, Ctrl+F, right-click54+ tools --> READY: Esc, or a command run55+```@@ -156,10 +156,24 @@ File > Settings > Vim keys (also `:settings.vim` or the palette) turns
156156 on a vim keymap in the spirit of sc-im and VisiData. It is off by157157 default and belongs to you, not the sheet: it's kept in the config file158158 as `keymap = vim` ([Configuration](config.md#keymap)), never in `.012` files.159-The mode indicator says **NORMAL** where it would say READY, **VISUAL**160-while selecting with `v` or `V`, and **COMMAND** on the `:` line; typing161-into a cell is ENTER or EDIT, as always, and Enter, Tab or Esc there162-return to NORMAL. Keys vim doesn't take keep their Sheets meaning159+The mode indicator says **NORMAL** where it would say READY, and160+typing into a cell is ENTER or EDIT, as always:161+162+```mermaid163+stateDiagram-v2164+ [*] --> NORMAL165+ NORMAL --> VISUAL: v, V166+ VISUAL --> NORMAL: v, V, Esc167+ NORMAL --> COMMAND: #58;168+ VISUAL --> COMMAND: #58;, on the selection169+ COMMAND --> NORMAL: Enter, Esc170+ NORMAL --> EDIT: i, a, Enter171+ NORMAL --> ENTER: =, o, O, s, cc, S172+ EDIT --> NORMAL: Enter, Tab, Esc173+ ENTER --> NORMAL: Enter, Tab, Esc174+```175+176+Keys vim doesn't take keep their Sheets meaning163177 (arrows, Del, Ctrl+S, Ctrl+C and Ctrl+V, Alt+letter menus, F-keys);164178 Ctrl+D, Ctrl+U and Ctrl+R are vim's, so fill down and fill right are in165179 the Edit menu. F1 lists the vim keys first, and the menus and palette@@ -31,6 +31,9 @@ const config: Config = {
3131 // .md files are CommonMark, as GitHub reads them: <, { and HTML3232 // comments are text and markup, not JSX. .mdx files would be MDX.3333 format: 'detect',34+ // ```mermaid blocks are drawn as diagrams, as GitHub draws them; the35+ // swizzled src/theme/Mermaid gives them the site's palette.36+ mermaid: true,3437 hooks: {3538 onBrokenMarkdownLinks: 'throw',3639 onBrokenMarkdownImages: 'throw',@@ -58,6 +61,7 @@ const config: Config = {
5861 ],5962 6063 themes: [64+ '@docusaurus/theme-mermaid',6165 [6266 '@easyops-cn/docusaurus-search-local',6367 {@@ -109,6 +113,9 @@ const config: Config = {
109113 ],110114 copyright: `<span class="mode-chip">READY</span> 012 is free software under the <a href="${repo}/blob/main/LICENSE">MIT license</a>.`,111115 },116+ // The base theme is the one Mermaid lets every color of be set;117+ // src/theme/Mermaid sets them from custom.css for each color mode.118+ mermaid: {theme: {light: 'base', dark: 'base'}},112119 prism: {113120 theme: prismThemes.oneLight,114121 darkTheme: prismThemes.oneDark,@@ -8,6 +8,7 @@
88 "dependencies": {99 "@docusaurus/core": "3.10.2",1010 "@docusaurus/preset-classic": "3.10.2",11+ "@docusaurus/theme-mermaid": "3.10.2",1112 "@easyops-cn/docusaurus-search-local": "0.55.3",1213 "@fontsource/ibm-plex-mono": "5.3.0",1314 "@fontsource/ibm-plex-sans": "5.3.0",@@ -275,6 +276,19 @@
275276 "node": ">= 14.0.0"276277 }277278 },279+ "node_modules/@antfu/install-pkg": {280+ "version": "2.1.0",281+ "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-2.1.0.tgz",282+ "integrity": "sha512-sdg9NxU3zR4Mnawfbc/x6GB5Wf17WYud5qOuEuxXjaKpYpMkISSJEjItGebXJ2bQ4DIcly4NYH23mtkGJjvKUw==",283+ "license": "MIT",284+ "dependencies": {285+ "package-manager-detector": "^1.8.0",286+ "tinyexec": "^1.3.1"287+ },288+ "funding": {289+ "url": "https://github.com/sponsors/antfu"290+ }291+ },278292 "node_modules/@babel/code-frame": {279293 "version": "7.29.7",280294 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",@@ -1993,6 +2007,51 @@
19932007 "node": ">=6.9.0"19942008 }19952009 },2010+ "node_modules/@braintree/sanitize-url": {2011+ "version": "7.1.2",2012+ "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz",2013+ "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==",2014+ "license": "MIT"2015+ },2016+ "node_modules/@chevrotain/cst-dts-gen": {2017+ "version": "11.1.2",2018+ "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.1.2.tgz",2019+ "integrity": "sha512-XTsjvDVB5nDZBQB8o0o/0ozNelQtn2KrUVteIHSlPd2VAV2utEb6JzyCJaJ8tGxACR4RiBNWy5uYUHX2eji88Q==",2020+ "license": "Apache-2.0",2021+ "dependencies": {2022+ "@chevrotain/gast": "11.1.2",2023+ "@chevrotain/types": "11.1.2",2024+ "lodash-es": "4.17.23"2025+ }2026+ },2027+ "node_modules/@chevrotain/gast": {2028+ "version": "11.1.2",2029+ "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.1.2.tgz",2030+ "integrity": "sha512-Z9zfXR5jNZb1Hlsd/p+4XWeUFugrHirq36bKzPWDSIacV+GPSVXdk+ahVWZTwjhNwofAWg/sZg58fyucKSQx5g==",2031+ "license": "Apache-2.0",2032+ "dependencies": {2033+ "@chevrotain/types": "11.1.2",2034+ "lodash-es": "4.17.23"2035+ }2036+ },2037+ "node_modules/@chevrotain/regexp-to-ast": {2038+ "version": "11.1.2",2039+ "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.1.2.tgz",2040+ "integrity": "sha512-nMU3Uj8naWer7xpZTYJdxbAs6RIv/dxYzkYU8GSwgUtcAAlzjcPfX1w+RKRcYG8POlzMeayOQ/znfwxEGo5ulw==",2041+ "license": "Apache-2.0"2042+ },2043+ "node_modules/@chevrotain/types": {2044+ "version": "11.1.2",2045+ "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz",2046+ "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==",2047+ "license": "Apache-2.0"2048+ },2049+ "node_modules/@chevrotain/utils": {2050+ "version": "11.1.2",2051+ "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.1.2.tgz",2052+ "integrity": "sha512-4mudFAQ6H+MqBTfqLmU7G1ZwRzCLfJEooL/fsF6rCX5eePMbGhoy5n4g+G4vlh2muDcsCTJtL+uKbOzWxs5LHA==",2053+ "license": "Apache-2.0"2054+ },19962055 "node_modules/@colors/colors": {19972056 "version": "1.5.0",19982057 "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",@@ -3971,6 +4030,34 @@
39714030 "react-dom": "^18.0.0 || ^19.0.0"39724031 }39734032 },4033+ "node_modules/@docusaurus/theme-mermaid": {4034+ "version": "3.10.2",4035+ "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.10.2.tgz",4036+ "integrity": "sha512-Stssh5MYQJ+EdYugUXf+ZcpeJFQPKXf0KCd/SWp10o3CmXNaOoh5IEgVjVqY1e1XhQf3on4+Y4BnrMiD95E2SQ==",4037+ "license": "MIT",4038+ "dependencies": {4039+ "@docusaurus/core": "3.10.2",4040+ "@docusaurus/module-type-aliases": "3.10.2",4041+ "@docusaurus/theme-common": "3.10.2",4042+ "@docusaurus/types": "3.10.2",4043+ "@docusaurus/utils-validation": "3.10.2",4044+ "mermaid": ">=11.6.0",4045+ "tslib": "^2.6.0"4046+ },4047+ "engines": {4048+ "node": ">=20.0"4049+ },4050+ "peerDependencies": {4051+ "@mermaid-js/layout-elk": "^0.1.9",4052+ "react": "^18.0.0 || ^19.0.0",4053+ "react-dom": "^18.0.0 || ^19.0.0"4054+ },4055+ "peerDependenciesMeta": {4056+ "@mermaid-js/layout-elk": {4057+ "optional": true4058+ }4059+ }4060+ },39744061 "node_modules/@docusaurus/theme-search-algolia": {39754062 "version": "3.10.2",39764063 "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.2.tgz",@@ -4306,6 +4393,23 @@
43064393 "@hapi/hoek": "^9.0.0"43074394 }43084395 },4396+ "node_modules/@iconify/types": {4397+ "version": "2.0.0",4398+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",4399+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",4400+ "license": "MIT"4401+ },4402+ "node_modules/@iconify/utils": {4403+ "version": "3.1.7",4404+ "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.7.tgz",4405+ "integrity": "sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w==",4406+ "license": "MIT",4407+ "dependencies": {4408+ "@antfu/install-pkg": "^2.0.1",4409+ "@iconify/types": "^2.0.0",4410+ "import-meta-resolve": "^4.2.0"4411+ }4412+ },43094413 "node_modules/@jest/schemas": {43104414 "version": "29.6.3",43114415 "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",@@ -4860,6 +4964,18 @@
48604964 "react": ">=16"48614965 }48624966 },4967+ "node_modules/@mermaid-js/parser": {4968+ "version": "2.0.0",4969+ "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-2.0.0.tgz",4970+ "integrity": "sha512-K8BeapFUfrfxbRAUQAG5oBOCwo1+bNWzaVnPxTCutkfrTBn6T/j91FIhqxWJ32SUeQ9T3iy1zcmPZ5ROZEvDrg==",4971+ "license": "MIT",4972+ "dependencies": {4973+ "@chevrotain/types": "~11.1.2"4974+ },4975+ "engines": {4976+ "node": ">=22.12.0"4977+ }4978+ },48634979 "node_modules/@napi-rs/wasm-runtime": {48644980 "version": "0.2.12",48654981 "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",@@ -5785,6 +5901,259 @@
57855901 "@types/node": "*"57865902 }57875903 },5904+ "node_modules/@types/d3": {5905+ "version": "7.4.3",5906+ "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz",5907+ "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",5908+ "license": "MIT",5909+ "dependencies": {5910+ "@types/d3-array": "*",5911+ "@types/d3-axis": "*",5912+ "@types/d3-brush": "*",5913+ "@types/d3-chord": "*",5914+ "@types/d3-color": "*",5915+ "@types/d3-contour": "*",5916+ "@types/d3-delaunay": "*",5917+ "@types/d3-dispatch": "*",5918+ "@types/d3-drag": "*",5919+ "@types/d3-dsv": "*",5920+ "@types/d3-ease": "*",5921+ "@types/d3-fetch": "*",5922+ "@types/d3-force": "*",5923+ "@types/d3-format": "*",5924+ "@types/d3-geo": "*",5925+ "@types/d3-hierarchy": "*",5926+ "@types/d3-interpolate": "*",5927+ "@types/d3-path": "*",5928+ "@types/d3-polygon": "*",5929+ "@types/d3-quadtree": "*",5930+ "@types/d3-random": "*",5931+ "@types/d3-scale": "*",5932+ "@types/d3-scale-chromatic": "*",5933+ "@types/d3-selection": "*",5934+ "@types/d3-shape": "*",5935+ "@types/d3-time": "*",5936+ "@types/d3-time-format": "*",5937+ "@types/d3-timer": "*",5938+ "@types/d3-transition": "*",5939+ "@types/d3-zoom": "*"5940+ }5941+ },5942+ "node_modules/@types/d3-array": {5943+ "version": "3.2.2",5944+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",5945+ "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==",5946+ "license": "MIT"5947+ },5948+ "node_modules/@types/d3-axis": {5949+ "version": "3.0.6",5950+ "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz",5951+ "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",5952+ "license": "MIT",5953+ "dependencies": {5954+ "@types/d3-selection": "*"5955+ }5956+ },5957+ "node_modules/@types/d3-brush": {5958+ "version": "3.0.6",5959+ "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz",5960+ "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",5961+ "license": "MIT",5962+ "dependencies": {5963+ "@types/d3-selection": "*"5964+ }5965+ },5966+ "node_modules/@types/d3-chord": {5967+ "version": "3.0.6",5968+ "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz",5969+ "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==",5970+ "license": "MIT"5971+ },5972+ "node_modules/@types/d3-color": {5973+ "version": "3.1.3",5974+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",5975+ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",5976+ "license": "MIT"5977+ },5978+ "node_modules/@types/d3-contour": {5979+ "version": "3.0.6",5980+ "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz",5981+ "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",5982+ "license": "MIT",5983+ "dependencies": {5984+ "@types/d3-array": "*",5985+ "@types/geojson": "*"5986+ }5987+ },5988+ "node_modules/@types/d3-delaunay": {5989+ "version": "6.0.4",5990+ "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz",5991+ "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==",5992+ "license": "MIT"5993+ },5994+ "node_modules/@types/d3-dispatch": {5995+ "version": "3.0.7",5996+ "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz",5997+ "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==",5998+ "license": "MIT"5999+ },6000+ "node_modules/@types/d3-drag": {6001+ "version": "3.0.7",6002+ "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz",6003+ "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==",6004+ "license": "MIT",6005+ "dependencies": {6006+ "@types/d3-selection": "*"6007+ }6008+ },6009+ "node_modules/@types/d3-dsv": {6010+ "version": "3.0.7",6011+ "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",6012+ "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==",6013+ "license": "MIT"6014+ },6015+ "node_modules/@types/d3-ease": {6016+ "version": "3.0.2",6017+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",6018+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",6019+ "license": "MIT"6020+ },6021+ "node_modules/@types/d3-fetch": {6022+ "version": "3.0.7",6023+ "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",6024+ "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",6025+ "license": "MIT",6026+ "dependencies": {6027+ "@types/d3-dsv": "*"6028+ }6029+ },6030+ "node_modules/@types/d3-force": {6031+ "version": "3.0.10",6032+ "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz",6033+ "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==",6034+ "license": "MIT"6035+ },6036+ "node_modules/@types/d3-format": {6037+ "version": "3.0.4",6038+ "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz",6039+ "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==",6040+ "license": "MIT"6041+ },6042+ "node_modules/@types/d3-geo": {6043+ "version": "3.1.1",6044+ "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.1.tgz",6045+ "integrity": "sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==",6046+ "license": "MIT",6047+ "dependencies": {6048+ "@types/geojson": "*"6049+ }6050+ },6051+ "node_modules/@types/d3-hierarchy": {6052+ "version": "3.1.7",6053+ "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz",6054+ "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==",6055+ "license": "MIT"6056+ },6057+ "node_modules/@types/d3-interpolate": {6058+ "version": "3.0.4",6059+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",6060+ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",6061+ "license": "MIT",6062+ "dependencies": {6063+ "@types/d3-color": "*"6064+ }6065+ },6066+ "node_modules/@types/d3-path": {6067+ "version": "3.1.1",6068+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",6069+ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",6070+ "license": "MIT"6071+ },6072+ "node_modules/@types/d3-polygon": {6073+ "version": "3.0.2",6074+ "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz",6075+ "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==",6076+ "license": "MIT"6077+ },6078+ "node_modules/@types/d3-quadtree": {6079+ "version": "3.0.6",6080+ "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",6081+ "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==",6082+ "license": "MIT"6083+ },6084+ "node_modules/@types/d3-random": {6085+ "version": "3.0.4",6086+ "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.4.tgz",6087+ "integrity": "sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==",6088+ "license": "MIT"6089+ },6090+ "node_modules/@types/d3-scale": {6091+ "version": "4.0.9",6092+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",6093+ "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",6094+ "license": "MIT",6095+ "dependencies": {6096+ "@types/d3-time": "*"6097+ }6098+ },6099+ "node_modules/@types/d3-scale-chromatic": {6100+ "version": "3.1.0",6101+ "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",6102+ "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==",6103+ "license": "MIT"6104+ },6105+ "node_modules/@types/d3-selection": {6106+ "version": "3.0.12",6107+ "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.12.tgz",6108+ "integrity": "sha512-Qe/KWYhEiIIxGs7HrAAjMfShxKldx19SJtr5zu53f3afPsdZNz7HHtdTLXo/kqeiWNXVycI24kSnfzBYkTzpgw==",6109+ "license": "MIT"6110+ },6111+ "node_modules/@types/d3-shape": {6112+ "version": "3.2.0",6113+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.2.0.tgz",6114+ "integrity": "sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==",6115+ "license": "MIT",6116+ "dependencies": {6117+ "@types/d3-path": "*"6118+ }6119+ },6120+ "node_modules/@types/d3-time": {6121+ "version": "3.0.4",6122+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",6123+ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",6124+ "license": "MIT"6125+ },6126+ "node_modules/@types/d3-time-format": {6127+ "version": "4.0.3",6128+ "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz",6129+ "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==",6130+ "license": "MIT"6131+ },6132+ "node_modules/@types/d3-timer": {6133+ "version": "3.0.2",6134+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",6135+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",6136+ "license": "MIT"6137+ },6138+ "node_modules/@types/d3-transition": {6139+ "version": "3.0.9",6140+ "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz",6141+ "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==",6142+ "license": "MIT",6143+ "dependencies": {6144+ "@types/d3-selection": "*"6145+ }6146+ },6147+ "node_modules/@types/d3-zoom": {6148+ "version": "3.0.9",6149+ "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.9.tgz",6150+ "integrity": "sha512-0sE1406XBYJGiqD3AusTl9ZqC//2mIXix51tbom25gDCA8ri4xnSZg28CaSE8Srl6FClqABUKfsn0qghgdepMA==",6151+ "license": "MIT",6152+ "dependencies": {6153+ "@types/d3-interpolate": "*",6154+ "@types/d3-selection": "*"6155+ }6156+ },57886157 "node_modules/@types/debug": {57896158 "version": "4.1.13",57906159 "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",@@ -5833,6 +6202,12 @@
58336202 "@types/send": "*"58346203 }58356204 },6205+ "node_modules/@types/geojson": {6206+ "version": "7946.0.16",6207+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz",6208+ "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",6209+ "license": "MIT"6210+ },58366211 "node_modules/@types/hast": {58376212 "version": "3.0.5",58386213 "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz",@@ -6063,6 +6438,13 @@
60636438 "@types/node": "*"60646439 }60656440 },6441+ "node_modules/@types/trusted-types": {6442+ "version": "2.0.7",6443+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",6444+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",6445+ "license": "MIT",6446+ "optional": true6447+ },60666448 "node_modules/@types/unist": {60676449 "version": "3.0.3",60686450 "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",@@ -6099,6 +6481,16 @@
60996481 "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==",61006482 "license": "ISC"61016483 },6484+ "node_modules/@upsetjs/venn.js": {6485+ "version": "2.0.0",6486+ "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz",6487+ "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==",6488+ "license": "MIT",6489+ "optionalDependencies": {6490+ "d3-selection": "^3.0.0",6491+ "d3-transition": "^3.0.1"6492+ }6493+ },61026494 "node_modules/@webassemblyjs/ast": {61036495 "version": "1.14.1",61046496 "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",@@ -7169,6 +7561,20 @@
71697561 "url": "https://github.com/sponsors/fb55"71707562 }71717563 },7564+ "node_modules/chevrotain": {7565+ "version": "11.1.2",7566+ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.1.2.tgz",7567+ "integrity": "sha512-opLQzEVriiH1uUQ4Kctsd49bRoFDXGGSC4GUqj7pGyxM3RehRhvTlZJc1FL/Flew2p5uwxa1tUDWKzI4wNM8pg==",7568+ "license": "Apache-2.0",7569+ "dependencies": {7570+ "@chevrotain/cst-dts-gen": "11.1.2",7571+ "@chevrotain/gast": "11.1.2",7572+ "@chevrotain/regexp-to-ast": "11.1.2",7573+ "@chevrotain/types": "11.1.2",7574+ "@chevrotain/utils": "11.1.2",7575+ "lodash-es": "4.17.23"7576+ }7577+ },71727578 "node_modules/chokidar": {71737579 "version": "3.6.0",71747580 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",@@ -7678,6 +8084,15 @@
76788084 "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",76798085 "license": "MIT"76808086 },8087+ "node_modules/cose-base": {8088+ "version": "1.0.3",8089+ "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz",8090+ "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==",8091+ "license": "MIT",8092+ "dependencies": {8093+ "layout-base": "^1.0.0"8094+ }8095+ },76818096 "node_modules/cosmiconfig": {76828097 "version": "8.3.6",76838098 "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",@@ -8015,152 +8430,678 @@
80158430 ],80168431 "license": "MIT-0"80178432 },8018- "node_modules/cssesc": {8019- "version": "3.0.0",8020- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",8021- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",8022- "license": "MIT",8023- "bin": {8024- "cssesc": "bin/cssesc"8433+ "node_modules/cssesc": {8434+ "version": "3.0.0",8435+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",8436+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",8437+ "license": "MIT",8438+ "bin": {8439+ "cssesc": "bin/cssesc"8440+ },8441+ "engines": {8442+ "node": ">=4"8443+ }8444+ },8445+ "node_modules/cssnano": {8446+ "version": "6.1.2",8447+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz",8448+ "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==",8449+ "license": "MIT",8450+ "dependencies": {8451+ "cssnano-preset-default": "^6.1.2",8452+ "lilconfig": "^3.1.1"8453+ },8454+ "engines": {8455+ "node": "^14 || ^16 || >=18.0"8456+ },8457+ "funding": {8458+ "type": "opencollective",8459+ "url": "https://opencollective.com/cssnano"8460+ },8461+ "peerDependencies": {8462+ "postcss": "^8.4.31"8463+ }8464+ },8465+ "node_modules/cssnano-preset-advanced": {8466+ "version": "6.1.2",8467+ "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz",8468+ "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==",8469+ "license": "MIT",8470+ "dependencies": {8471+ "autoprefixer": "^10.4.19",8472+ "browserslist": "^4.23.0",8473+ "cssnano-preset-default": "^6.1.2",8474+ "postcss-discard-unused": "^6.0.5",8475+ "postcss-merge-idents": "^6.0.3",8476+ "postcss-reduce-idents": "^6.0.3",8477+ "postcss-zindex": "^6.0.2"8478+ },8479+ "engines": {8480+ "node": "^14 || ^16 || >=18.0"8481+ },8482+ "peerDependencies": {8483+ "postcss": "^8.4.31"8484+ }8485+ },8486+ "node_modules/cssnano-preset-default": {8487+ "version": "6.1.2",8488+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz",8489+ "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==",8490+ "license": "MIT",8491+ "dependencies": {8492+ "browserslist": "^4.23.0",8493+ "css-declaration-sorter": "^7.2.0",8494+ "cssnano-utils": "^4.0.2",8495+ "postcss-calc": "^9.0.1",8496+ "postcss-colormin": "^6.1.0",8497+ "postcss-convert-values": "^6.1.0",8498+ "postcss-discard-comments": "^6.0.2",8499+ "postcss-discard-duplicates": "^6.0.3",8500+ "postcss-discard-empty": "^6.0.3",8501+ "postcss-discard-overridden": "^6.0.2",8502+ "postcss-merge-longhand": "^6.0.5",8503+ "postcss-merge-rules": "^6.1.1",8504+ "postcss-minify-font-values": "^6.1.0",8505+ "postcss-minify-gradients": "^6.0.3",8506+ "postcss-minify-params": "^6.1.0",8507+ "postcss-minify-selectors": "^6.0.4",8508+ "postcss-normalize-charset": "^6.0.2",8509+ "postcss-normalize-display-values": "^6.0.2",8510+ "postcss-normalize-positions": "^6.0.2",8511+ "postcss-normalize-repeat-style": "^6.0.2",8512+ "postcss-normalize-string": "^6.0.2",8513+ "postcss-normalize-timing-functions": "^6.0.2",8514+ "postcss-normalize-unicode": "^6.1.0",8515+ "postcss-normalize-url": "^6.0.2",8516+ "postcss-normalize-whitespace": "^6.0.2",8517+ "postcss-ordered-values": "^6.0.2",8518+ "postcss-reduce-initial": "^6.1.0",8519+ "postcss-reduce-transforms": "^6.0.2",8520+ "postcss-svgo": "^6.0.3",8521+ "postcss-unique-selectors": "^6.0.4"8522+ },8523+ "engines": {8524+ "node": "^14 || ^16 || >=18.0"8525+ },8526+ "peerDependencies": {8527+ "postcss": "^8.4.31"8528+ }8529+ },8530+ "node_modules/cssnano-utils": {8531+ "version": "4.0.2",8532+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz",8533+ "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==",8534+ "license": "MIT",8535+ "engines": {8536+ "node": "^14 || ^16 || >=18.0"8537+ },8538+ "peerDependencies": {8539+ "postcss": "^8.4.31"8540+ }8541+ },8542+ "node_modules/csso": {8543+ "version": "5.0.5",8544+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",8545+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",8546+ "license": "MIT",8547+ "dependencies": {8548+ "css-tree": "~2.2.0"8549+ },8550+ "engines": {8551+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",8552+ "npm": ">=7.0.0"8553+ }8554+ },8555+ "node_modules/csso/node_modules/css-tree": {8556+ "version": "2.2.1",8557+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",8558+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",8559+ "license": "MIT",8560+ "dependencies": {8561+ "mdn-data": "2.0.28",8562+ "source-map-js": "^1.0.1"8563+ },8564+ "engines": {8565+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",8566+ "npm": ">=7.0.0"8567+ }8568+ },8569+ "node_modules/csso/node_modules/mdn-data": {8570+ "version": "2.0.28",8571+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",8572+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",8573+ "license": "CC0-1.0"8574+ },8575+ "node_modules/csstype": {8576+ "version": "3.2.3",8577+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",8578+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",8579+ "license": "MIT"8580+ },8581+ "node_modules/cytoscape": {8582+ "version": "3.34.3",8583+ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.3.tgz",8584+ "integrity": "sha512-yfYGhRcGAntq6YBD583j4n0Eg3jIxvWmZtz/5uz9UYkeIStSlMxuUja+ec5j3iBD8nv1rwaOAYMW09tBdkSeaQ==",8585+ "license": "MIT",8586+ "engines": {8587+ "node": ">=0.10"8588+ }8589+ },8590+ "node_modules/cytoscape-cose-bilkent": {8591+ "version": "4.1.0",8592+ "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz",8593+ "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==",8594+ "license": "MIT",8595+ "dependencies": {8596+ "cose-base": "^1.0.0"8597+ },8598+ "peerDependencies": {8599+ "cytoscape": "^3.2.0"8600+ }8601+ },8602+ "node_modules/cytoscape-fcose": {8603+ "version": "2.2.0",8604+ "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz",8605+ "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==",8606+ "license": "MIT",8607+ "dependencies": {8608+ "cose-base": "^2.2.0"8609+ },8610+ "peerDependencies": {8611+ "cytoscape": "^3.2.0"8612+ }8613+ },8614+ "node_modules/cytoscape-fcose/node_modules/cose-base": {8615+ "version": "2.2.0",8616+ "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz",8617+ "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==",8618+ "license": "MIT",8619+ "dependencies": {8620+ "layout-base": "^2.0.0"8621+ }8622+ },8623+ "node_modules/cytoscape-fcose/node_modules/layout-base": {8624+ "version": "2.0.1",8625+ "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz",8626+ "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==",8627+ "license": "MIT"8628+ },8629+ "node_modules/d3": {8630+ "version": "7.9.0",8631+ "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz",8632+ "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",8633+ "license": "ISC",8634+ "dependencies": {8635+ "d3-array": "3",8636+ "d3-axis": "3",8637+ "d3-brush": "3",8638+ "d3-chord": "3",8639+ "d3-color": "3",8640+ "d3-contour": "4",8641+ "d3-delaunay": "6",8642+ "d3-dispatch": "3",8643+ "d3-drag": "3",8644+ "d3-dsv": "3",8645+ "d3-ease": "3",8646+ "d3-fetch": "3",8647+ "d3-force": "3",8648+ "d3-format": "3",8649+ "d3-geo": "3",8650+ "d3-hierarchy": "3",8651+ "d3-interpolate": "3",8652+ "d3-path": "3",8653+ "d3-polygon": "3",8654+ "d3-quadtree": "3",8655+ "d3-random": "3",8656+ "d3-scale": "4",8657+ "d3-scale-chromatic": "3",8658+ "d3-selection": "3",8659+ "d3-shape": "3",8660+ "d3-time": "3",8661+ "d3-time-format": "4",8662+ "d3-timer": "3",8663+ "d3-transition": "3",8664+ "d3-zoom": "3"8665+ },8666+ "engines": {8667+ "node": ">=12"8668+ }8669+ },8670+ "node_modules/d3-array": {8671+ "version": "3.2.4",8672+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",8673+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",8674+ "license": "ISC",8675+ "dependencies": {8676+ "internmap": "1 - 2"8677+ },8678+ "engines": {8679+ "node": ">=12"8680+ }8681+ },8682+ "node_modules/d3-axis": {8683+ "version": "3.0.0",8684+ "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",8685+ "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==",8686+ "license": "ISC",8687+ "engines": {8688+ "node": ">=12"8689+ }8690+ },8691+ "node_modules/d3-brush": {8692+ "version": "3.0.0",8693+ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",8694+ "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",8695+ "license": "ISC",8696+ "dependencies": {8697+ "d3-dispatch": "1 - 3",8698+ "d3-drag": "2 - 3",8699+ "d3-interpolate": "1 - 3",8700+ "d3-selection": "3",8701+ "d3-transition": "3"8702+ },8703+ "engines": {8704+ "node": ">=12"8705+ }8706+ },8707+ "node_modules/d3-chord": {8708+ "version": "3.0.1",8709+ "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",8710+ "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",8711+ "license": "ISC",8712+ "dependencies": {8713+ "d3-path": "1 - 3"8714+ },8715+ "engines": {8716+ "node": ">=12"8717+ }8718+ },8719+ "node_modules/d3-color": {8720+ "version": "3.1.0",8721+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",8722+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",8723+ "license": "ISC",8724+ "engines": {8725+ "node": ">=12"8726+ }8727+ },8728+ "node_modules/d3-contour": {8729+ "version": "4.0.2",8730+ "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz",8731+ "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",8732+ "license": "ISC",8733+ "dependencies": {8734+ "d3-array": "^3.2.0"8735+ },8736+ "engines": {8737+ "node": ">=12"8738+ }8739+ },8740+ "node_modules/d3-delaunay": {8741+ "version": "6.0.4",8742+ "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz",8743+ "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",8744+ "license": "ISC",8745+ "dependencies": {8746+ "delaunator": "5"8747+ },8748+ "engines": {8749+ "node": ">=12"8750+ }8751+ },8752+ "node_modules/d3-dispatch": {8753+ "version": "3.0.1",8754+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",8755+ "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",8756+ "license": "ISC",8757+ "engines": {8758+ "node": ">=12"8759+ }8760+ },8761+ "node_modules/d3-drag": {8762+ "version": "3.0.0",8763+ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",8764+ "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",8765+ "license": "ISC",8766+ "dependencies": {8767+ "d3-dispatch": "1 - 3",8768+ "d3-selection": "3"8769+ },8770+ "engines": {8771+ "node": ">=12"8772+ }8773+ },8774+ "node_modules/d3-dsv": {8775+ "version": "3.0.1",8776+ "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",8777+ "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",8778+ "license": "ISC",8779+ "dependencies": {8780+ "commander": "7",8781+ "iconv-lite": "0.6",8782+ "rw": "1"8783+ },8784+ "bin": {8785+ "csv2json": "bin/dsv2json.js",8786+ "csv2tsv": "bin/dsv2dsv.js",8787+ "dsv2dsv": "bin/dsv2dsv.js",8788+ "dsv2json": "bin/dsv2json.js",8789+ "json2csv": "bin/json2dsv.js",8790+ "json2dsv": "bin/json2dsv.js",8791+ "json2tsv": "bin/json2dsv.js",8792+ "tsv2csv": "bin/dsv2dsv.js",8793+ "tsv2json": "bin/dsv2json.js"8794+ },8795+ "engines": {8796+ "node": ">=12"8797+ }8798+ },8799+ "node_modules/d3-dsv/node_modules/commander": {8800+ "version": "7.2.0",8801+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",8802+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",8803+ "license": "MIT",8804+ "engines": {8805+ "node": ">= 10"8806+ }8807+ },8808+ "node_modules/d3-dsv/node_modules/iconv-lite": {8809+ "version": "0.6.3",8810+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",8811+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",8812+ "license": "MIT",8813+ "dependencies": {8814+ "safer-buffer": ">= 2.1.2 < 3.0.0"8815+ },8816+ "engines": {8817+ "node": ">=0.10.0"8818+ }8819+ },8820+ "node_modules/d3-ease": {8821+ "version": "3.0.1",8822+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",8823+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",8824+ "license": "BSD-3-Clause",8825+ "engines": {8826+ "node": ">=12"8827+ }8828+ },8829+ "node_modules/d3-fetch": {8830+ "version": "3.0.1",8831+ "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",8832+ "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",8833+ "license": "ISC",8834+ "dependencies": {8835+ "d3-dsv": "1 - 3"8836+ },8837+ "engines": {8838+ "node": ">=12"8839+ }8840+ },8841+ "node_modules/d3-force": {8842+ "version": "3.0.0",8843+ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",8844+ "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",8845+ "license": "ISC",8846+ "dependencies": {8847+ "d3-dispatch": "1 - 3",8848+ "d3-quadtree": "1 - 3",8849+ "d3-timer": "1 - 3"8850+ },8851+ "engines": {8852+ "node": ">=12"8853+ }8854+ },8855+ "node_modules/d3-format": {8856+ "version": "3.1.2",8857+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz",8858+ "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==",8859+ "license": "ISC",8860+ "engines": {8861+ "node": ">=12"8862+ }8863+ },8864+ "node_modules/d3-geo": {8865+ "version": "3.1.1",8866+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz",8867+ "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==",8868+ "license": "ISC",8869+ "dependencies": {8870+ "d3-array": "2.5.0 - 3"8871+ },8872+ "engines": {8873+ "node": ">=12"8874+ }8875+ },8876+ "node_modules/d3-hierarchy": {8877+ "version": "3.1.2",8878+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",8879+ "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",8880+ "license": "ISC",8881+ "engines": {8882+ "node": ">=12"8883+ }8884+ },8885+ "node_modules/d3-interpolate": {8886+ "version": "3.0.1",8887+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",8888+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",8889+ "license": "ISC",8890+ "dependencies": {8891+ "d3-color": "1 - 3"8892+ },8893+ "engines": {8894+ "node": ">=12"8895+ }8896+ },8897+ "node_modules/d3-path": {8898+ "version": "3.1.0",8899+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",8900+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",8901+ "license": "ISC",8902+ "engines": {8903+ "node": ">=12"8904+ }8905+ },8906+ "node_modules/d3-polygon": {8907+ "version": "3.0.1",8908+ "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",8909+ "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",8910+ "license": "ISC",8911+ "engines": {8912+ "node": ">=12"8913+ }8914+ },8915+ "node_modules/d3-quadtree": {8916+ "version": "3.0.1",8917+ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",8918+ "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",8919+ "license": "ISC",8920+ "engines": {8921+ "node": ">=12"8922+ }8923+ },8924+ "node_modules/d3-random": {8925+ "version": "3.0.1",8926+ "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",8927+ "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",8928+ "license": "ISC",8929+ "engines": {8930+ "node": ">=12"8931+ }8932+ },8933+ "node_modules/d3-sankey": {8934+ "version": "0.12.3",8935+ "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz",8936+ "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==",8937+ "license": "BSD-3-Clause",8938+ "dependencies": {8939+ "d3-array": "1 - 2",8940+ "d3-shape": "^1.2.0"8941+ }8942+ },8943+ "node_modules/d3-sankey/node_modules/d3-array": {8944+ "version": "2.12.1",8945+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz",8946+ "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==",8947+ "license": "BSD-3-Clause",8948+ "dependencies": {8949+ "internmap": "^1.0.0"8950+ }8951+ },8952+ "node_modules/d3-sankey/node_modules/d3-path": {8953+ "version": "1.0.9",8954+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",8955+ "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==",8956+ "license": "BSD-3-Clause"8957+ },8958+ "node_modules/d3-sankey/node_modules/d3-shape": {8959+ "version": "1.3.7",8960+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",8961+ "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",8962+ "license": "BSD-3-Clause",8963+ "dependencies": {8964+ "d3-path": "1"8965+ }8966+ },8967+ "node_modules/d3-sankey/node_modules/internmap": {8968+ "version": "1.0.1",8969+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz",8970+ "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==",8971+ "license": "ISC"8972+ },8973+ "node_modules/d3-scale": {8974+ "version": "4.0.2",8975+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",8976+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",8977+ "license": "ISC",8978+ "dependencies": {8979+ "d3-array": "2.10.0 - 3",8980+ "d3-format": "1 - 3",8981+ "d3-interpolate": "1.2.0 - 3",8982+ "d3-time": "2.1.1 - 3",8983+ "d3-time-format": "2 - 4"80258984 },80268985 "engines": {8027- "node": ">=4"8986+ "node": ">=12"80288987 }80298988 },8030- "node_modules/cssnano": {8031- "version": "6.1.2",8032- "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz",8033- "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==",8034- "license": "MIT",8989+ "node_modules/d3-scale-chromatic": {8990+ "version": "3.1.0",8991+ "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",8992+ "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",8993+ "license": "ISC",80358994 "dependencies": {8036- "cssnano-preset-default": "^6.1.2",8037- "lilconfig": "^3.1.1"8995+ "d3-color": "1 - 3",8996+ "d3-interpolate": "1 - 3"80388997 },80398998 "engines": {8040- "node": "^14 || ^16 || >=18.0"8041- },8042- "funding": {8043- "type": "opencollective",8044- "url": "https://opencollective.com/cssnano"8045- },8046- "peerDependencies": {8047- "postcss": "^8.4.31"8999+ "node": ">=12"80489000 }80499001 },8050- "node_modules/cssnano-preset-advanced": {8051- "version": "6.1.2",8052- "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz",8053- "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==",8054- "license": "MIT",9002+ "node_modules/d3-selection": {9003+ "version": "3.0.0",9004+ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",9005+ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",9006+ "license": "ISC",9007+ "engines": {9008+ "node": ">=12"9009+ }9010+ },9011+ "node_modules/d3-shape": {9012+ "version": "3.2.0",9013+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",9014+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",9015+ "license": "ISC",80559016 "dependencies": {8056- "autoprefixer": "^10.4.19",8057- "browserslist": "^4.23.0",8058- "cssnano-preset-default": "^6.1.2",8059- "postcss-discard-unused": "^6.0.5",8060- "postcss-merge-idents": "^6.0.3",8061- "postcss-reduce-idents": "^6.0.3",8062- "postcss-zindex": "^6.0.2"9017+ "d3-path": "^3.1.0"80639018 },80649019 "engines": {8065- "node": "^14 || ^16 || >=18.0"8066- },8067- "peerDependencies": {8068- "postcss": "^8.4.31"9020+ "node": ">=12"80699021 }80709022 },8071- "node_modules/cssnano-preset-default": {8072- "version": "6.1.2",8073- "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz",8074- "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==",8075- "license": "MIT",9023+ "node_modules/d3-time": {9024+ "version": "3.1.0",9025+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",9026+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",9027+ "license": "ISC",80769028 "dependencies": {8077- "browserslist": "^4.23.0",8078- "css-declaration-sorter": "^7.2.0",8079- "cssnano-utils": "^4.0.2",8080- "postcss-calc": "^9.0.1",8081- "postcss-colormin": "^6.1.0",8082- "postcss-convert-values": "^6.1.0",8083- "postcss-discard-comments": "^6.0.2",8084- "postcss-discard-duplicates": "^6.0.3",8085- "postcss-discard-empty": "^6.0.3",8086- "postcss-discard-overridden": "^6.0.2",8087- "postcss-merge-longhand": "^6.0.5",8088- "postcss-merge-rules": "^6.1.1",8089- "postcss-minify-font-values": "^6.1.0",8090- "postcss-minify-gradients": "^6.0.3",8091- "postcss-minify-params": "^6.1.0",8092- "postcss-minify-selectors": "^6.0.4",8093- "postcss-normalize-charset": "^6.0.2",8094- "postcss-normalize-display-values": "^6.0.2",8095- "postcss-normalize-positions": "^6.0.2",8096- "postcss-normalize-repeat-style": "^6.0.2",8097- "postcss-normalize-string": "^6.0.2",8098- "postcss-normalize-timing-functions": "^6.0.2",8099- "postcss-normalize-unicode": "^6.1.0",8100- "postcss-normalize-url": "^6.0.2",8101- "postcss-normalize-whitespace": "^6.0.2",8102- "postcss-ordered-values": "^6.0.2",8103- "postcss-reduce-initial": "^6.1.0",8104- "postcss-reduce-transforms": "^6.0.2",8105- "postcss-svgo": "^6.0.3",8106- "postcss-unique-selectors": "^6.0.4"9029+ "d3-array": "2 - 3"81079030 },81089031 "engines": {8109- "node": "^14 || ^16 || >=18.0"9032+ "node": ">=12"9033+ }9034+ },9035+ "node_modules/d3-time-format": {9036+ "version": "4.1.0",9037+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",9038+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",9039+ "license": "ISC",9040+ "dependencies": {9041+ "d3-time": "1 - 3"81109042 },8111- "peerDependencies": {8112- "postcss": "^8.4.31"9043+ "engines": {9044+ "node": ">=12"81139045 }81149046 },8115- "node_modules/cssnano-utils": {8116- "version": "4.0.2",8117- "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz",8118- "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==",8119- "license": "MIT",9047+ "node_modules/d3-timer": {9048+ "version": "3.0.1",9049+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",9050+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",9051+ "license": "ISC",81209052 "engines": {8121- "node": "^14 || ^16 || >=18.0"8122- },8123- "peerDependencies": {8124- "postcss": "^8.4.31"9053+ "node": ">=12"81259054 }81269055 },8127- "node_modules/csso": {8128- "version": "5.0.5",8129- "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",8130- "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",8131- "license": "MIT",9056+ "node_modules/d3-transition": {9057+ "version": "3.0.1",9058+ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",9059+ "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",9060+ "license": "ISC",81329061 "dependencies": {8133- "css-tree": "~2.2.0"9062+ "d3-color": "1 - 3",9063+ "d3-dispatch": "1 - 3",9064+ "d3-ease": "1 - 3",9065+ "d3-interpolate": "1 - 3",9066+ "d3-timer": "1 - 3"81349067 },81359068 "engines": {8136- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",8137- "npm": ">=7.0.0"9069+ "node": ">=12"9070+ },9071+ "peerDependencies": {9072+ "d3-selection": "2 - 3"81389073 }81399074 },8140- "node_modules/csso/node_modules/css-tree": {8141- "version": "2.2.1",8142- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",8143- "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",8144- "license": "MIT",9075+ "node_modules/d3-zoom": {9076+ "version": "3.0.0",9077+ "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",9078+ "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",9079+ "license": "ISC",81459080 "dependencies": {8146- "mdn-data": "2.0.28",8147- "source-map-js": "^1.0.1"9081+ "d3-dispatch": "1 - 3",9082+ "d3-drag": "2 - 3",9083+ "d3-interpolate": "1 - 3",9084+ "d3-selection": "2 - 3",9085+ "d3-transition": "2 - 3"81489086 },81499087 "engines": {8150- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",8151- "npm": ">=7.0.0"9088+ "node": ">=12"81529089 }81539090 },8154- "node_modules/csso/node_modules/mdn-data": {8155- "version": "2.0.28",8156- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",8157- "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",8158- "license": "CC0-1.0"9091+ "node_modules/dagre-d3-es": {9092+ "version": "7.0.14",9093+ "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz",9094+ "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==",9095+ "license": "MIT",9096+ "dependencies": {9097+ "d3": "^7.9.0",9098+ "lodash-es": "^4.17.21"9099+ }81599100 },8160- "node_modules/csstype": {8161- "version": "3.2.3",8162- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",8163- "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",9101+ "node_modules/dayjs": {9102+ "version": "1.11.23",9103+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz",9104+ "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==",81649105 "license": "MIT"81659106 },81669107 "node_modules/debounce": {@@ -8324,6 +9265,15 @@
83249265 "url": "https://github.com/sponsors/ljharb"83259266 }83269267 },9268+ "node_modules/delaunator": {9269+ "version": "5.1.0",9270+ "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz",9271+ "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==",9272+ "license": "ISC",9273+ "dependencies": {9274+ "robust-predicates": "^3.0.2"9275+ }9276+ },83279277 "node_modules/depd": {83289278 "version": "2.0.0",83299279 "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",@@ -8461,6 +9411,15 @@
84619411 "url": "https://github.com/fb55/domhandler?sponsor=1"84629412 }84639413 },9414+ "node_modules/dompurify": {9415+ "version": "3.4.16",9416+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.16.tgz",9417+ "integrity": "sha512-sqo+pNp3qRhCIpbgRi1y8Tgk27Bo2Ry7w0dC1NBeNTdZChWjz9Xb/KOoZbRP/R6pQZ80Qw8YhXw13hWWBbMRnQ==",9418+ "license": "(MPL-2.0 OR Apache-2.0)",9419+ "optionalDependencies": {9420+ "@types/trusted-types": "^2.0.7"9421+ }9422+ },84649423 "node_modules/domutils": {84659424 "version": "3.2.2",84669425 "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",@@ -8547,6 +9506,12 @@
85479506 "integrity": "sha512-SghDzqdJokdz8zP8YNlvS74+CwLRoUPDGvP/gFA+HrKVw+pOshUAgx8pXR37xl/u16zGae746rFNWvZ/22kU2Q==",85489507 "license": "ISC"85499508 },9509+ "node_modules/elkjs": {9510+ "version": "0.9.3",9511+ "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz",9512+ "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==",9513+ "license": "EPL-2.0"9514+ },85509515 "node_modules/emoji-regex": {85519516 "version": "9.2.2",85529517 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",@@ -8682,6 +9647,18 @@
86829647 "node": ">= 0.4"86839648 }86849649 },9650+ "node_modules/es-toolkit": {9651+ "version": "1.52.0",9652+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.52.0.tgz",9653+ "integrity": "sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==",9654+ "license": "MIT",9655+ "workspaces": [9656+ "docs",9657+ "benchmarks",9658+ "tests/types",9659+ "tests/browser-compat"9660+ ]9661+ },86859662 "node_modules/esast-util-from-estree": {86869663 "version": "2.0.0",86879664 "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz",@@ -9595,6 +10572,12 @@
959510572 "url": "https://github.com/sponsors/sindresorhus"959610573 }959710574 },10575+ "node_modules/hachure-fill": {10576+ "version": "0.5.2",10577+ "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz",10578+ "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==",10579+ "license": "MIT"10580+ },959810581 "node_modules/handle-thing": {959910582 "version": "2.0.1",960010583 "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",@@ -10234,6 +11217,16 @@
1023411217 "node": ">=8"1023511218 }1023611219 },11220+ "node_modules/import-meta-resolve": {11221+ "version": "4.2.0",11222+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz",11223+ "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==",11224+ "license": "MIT",11225+ "funding": {11226+ "type": "github",11227+ "url": "https://github.com/sponsors/wooorm"11228+ }11229+ },1023711230 "node_modules/imurmurhash": {1023811231 "version": "0.1.4",1023911232 "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",@@ -10282,6 +11275,15 @@
1028211275 "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",1028311276 "license": "MIT"1028411277 },11278+ "node_modules/internmap": {11279+ "version": "2.0.3",11280+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",11281+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",11282+ "license": "ISC",11283+ "engines": {11284+ "node": ">=12"11285+ }11286+ },1028511287 "node_modules/invariant": {1028611288 "version": "2.2.4",1028711289 "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",@@ -10787,6 +11789,31 @@
1078711789 "graceful-fs": "^4.1.6"1078811790 }1078911791 },11792+ "node_modules/katex": {11793+ "version": "0.16.47",11794+ "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz",11795+ "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==",11796+ "funding": [11797+ "https://opencollective.com/katex",11798+ "https://github.com/sponsors/katex"11799+ ],11800+ "license": "MIT",11801+ "dependencies": {11802+ "commander": "^8.3.0"11803+ },11804+ "bin": {11805+ "katex": "cli.js"11806+ }11807+ },11808+ "node_modules/katex/node_modules/commander": {11809+ "version": "8.3.0",11810+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",11811+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",11812+ "license": "MIT",11813+ "engines": {11814+ "node": ">= 12"11815+ }11816+ },1079011817 "node_modules/keyv": {1079111818 "version": "4.5.4",1079211819 "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",@@ -10796,6 +11823,11 @@
1079611823 "json-buffer": "3.0.1"1079711824 }1079811825 },11826+ "node_modules/khroma": {11827+ "version": "2.1.0",11828+ "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz",11829+ "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="11830+ },1079911831 "node_modules/kind-of": {1080011832 "version": "6.0.3",1080111833 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",@@ -10848,6 +11880,12 @@
1084811880 "shell-quote": "^1.8.4"1084911881 }1085011882 },11883+ "node_modules/layout-base": {11884+ "version": "1.0.2",11885+ "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz",11886+ "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==",11887+ "license": "MIT"11888+ },1085111889 "node_modules/leven": {1085211890 "version": "3.1.0",1085311891 "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",@@ -10910,6 +11948,12 @@
1091011948 "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",1091111949 "license": "MIT"1091211950 },11951+ "node_modules/lodash-es": {11952+ "version": "4.17.23",11953+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz",11954+ "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==",11955+ "license": "MIT"11956+ },1091311957 "node_modules/lodash.debounce": {1091411958 "version": "4.0.8",1091511959 "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",@@ -11020,6 +12064,18 @@
1102012064 "url": "https://github.com/sponsors/wooorm"1102112065 }1102212066 },12067+ "node_modules/marked": {12068+ "version": "16.4.2",12069+ "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz",12070+ "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==",12071+ "license": "MIT",12072+ "bin": {12073+ "marked": "bin/marked.js"12074+ },12075+ "engines": {12076+ "node": ">= 20"12077+ }12078+ },1102312079 "node_modules/math-intrinsics": {1102412080 "version": "1.1.0",1102512081 "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",@@ -11534,6 +12590,53 @@
1153412590 "node": ">= 8"1153512591 }1153612592 },12593+ "node_modules/mermaid": {12594+ "version": "12.0.0",12595+ "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-12.0.0.tgz",12596+ "integrity": "sha512-/wQXC9iBxoGV8p3erbvaXs9h77VyLDBH6GdayVjj3hEcSQhFU4N1WUhUppotCEqlIxI2pRMwjwBSwTB1MfZBgQ==",12597+ "license": "MIT",12598+ "dependencies": {12599+ "@braintree/sanitize-url": "^7.1.2",12600+ "@iconify/utils": "^3.0.2",12601+ "@mermaid-js/parser": "^2.0.0",12602+ "@types/d3": "^7.4.3",12603+ "@upsetjs/venn.js": "^2.0.0",12604+ "chevrotain": "~11.1.2",12605+ "cytoscape": "^3.34.0",12606+ "cytoscape-cose-bilkent": "^4.1.0",12607+ "cytoscape-fcose": "^2.2.0",12608+ "d3": "^7.9.0",12609+ "d3-sankey": "^0.12.3",12610+ "dagre-d3-es": "7.0.14",12611+ "dayjs": "^1.11.21",12612+ "dompurify": "^3.4.12",12613+ "elkjs": "^0.9.3",12614+ "es-toolkit": "^1.45.1",12615+ "katex": "^0.16.47",12616+ "khroma": "^2.1.0",12617+ "marked": "^16.3.0",12618+ "roughjs": "^4.6.6",12619+ "stylis": "^4.3.6",12620+ "ts-dedent": "^2.2.0",12621+ "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0"12622+ },12623+ "engines": {12624+ "node": ">=22.12.0"12625+ }12626+ },12627+ "node_modules/mermaid/node_modules/uuid": {12628+ "version": "14.0.2",12629+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz",12630+ "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==",12631+ "funding": [12632+ "https://github.com/sponsors/broofa",12633+ "https://github.com/sponsors/ctavan"12634+ ],12635+ "license": "MIT",12636+ "bin": {12637+ "uuid": "dist-node/bin/uuid"12638+ }12639+ },1153712640 "node_modules/methods": {1153812641 "version": "1.1.2",1153912642 "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",@@ -14016,6 +15119,12 @@
1401615119 "url": "https://github.com/sponsors/sindresorhus"1401715120 }1401815121 },15122+ "node_modules/package-manager-detector": {15123+ "version": "1.8.0",15124+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz",15125+ "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==",15126+ "license": "MIT"15127+ },1401915128 "node_modules/param-case": {1402015129 "version": "3.0.4",1402115130 "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",@@ -14155,6 +15264,12 @@
1415515264 "tslib": "^2.0.3"1415615265 }1415715266 },15267+ "node_modules/path-data-parser": {15268+ "version": "0.1.0",15269+ "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz",15270+ "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==",15271+ "license": "MIT"15272+ },1415815273 "node_modules/path-exists": {1415915274 "version": "5.0.0",1416015275 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",@@ -14256,6 +15371,22 @@
1425615371 "node": ">=16.0.0"1425715372 }1425815373 },15374+ "node_modules/points-on-curve": {15375+ "version": "0.2.0",15376+ "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz",15377+ "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==",15378+ "license": "MIT"15379+ },15380+ "node_modules/points-on-path": {15381+ "version": "0.2.1",15382+ "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz",15383+ "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==",15384+ "license": "MIT",15385+ "dependencies": {15386+ "path-data-parser": "0.1.0",15387+ "points-on-curve": "0.2.0"15388+ }15389+ },1425915390 "node_modules/postcss": {1426015391 "version": "8.5.28",1426115392 "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz",@@ -16682,6 +17813,24 @@
1668217813 "node": ">=0.10.0"1668317814 }1668417815 },17816+ "node_modules/robust-predicates": {17817+ "version": "3.0.3",17818+ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz",17819+ "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==",17820+ "license": "Unlicense"17821+ },17822+ "node_modules/roughjs": {17823+ "version": "4.6.6",17824+ "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz",17825+ "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==",17826+ "license": "MIT",17827+ "dependencies": {17828+ "hachure-fill": "^0.5.2",17829+ "path-data-parser": "^0.1.0",17830+ "points-on-curve": "^0.2.0",17831+ "points-on-path": "^0.2.1"17832+ }17833+ },1668517834 "node_modules/rtlcss": {1668617835 "version": "4.3.0",1668717836 "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz",@@ -16735,6 +17884,12 @@
1673517884 "queue-microtask": "^1.2.2"1673617885 }1673717886 },17887+ "node_modules/rw": {17888+ "version": "1.3.3",17889+ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",17890+ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",17891+ "license": "BSD-3-Clause"17892+ },1673817893 "node_modules/safe-buffer": {1673917894 "version": "5.2.1",1674017895 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",@@ -17561,6 +18716,12 @@
1756118716 "postcss": "^8.4.31"1756218717 }1756318718 },18719+ "node_modules/stylis": {18720+ "version": "4.4.0",18721+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz",18722+ "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==",18723+ "license": "MIT"18724+ },1756418725 "node_modules/supports-color": {1756518726 "version": "7.2.0",1756618727 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",@@ -17788,6 +18949,15 @@
1778818949 "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==",1778918950 "license": "MIT"1779018951 },18952+ "node_modules/tinyexec": {18953+ "version": "1.3.1",18954+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz",18955+ "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==",18956+ "license": "MIT",18957+ "engines": {18958+ "node": ">=18"18959+ }18960+ },1779118961 "node_modules/tinypool": {1779218962 "version": "1.1.1",1779318963 "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",@@ -17863,6 +19033,15 @@
1786319033 "url": "https://github.com/sponsors/wooorm"1786419034 }1786519035 },19036+ "node_modules/ts-dedent": {19037+ "version": "2.3.0",19038+ "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz",19039+ "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==",19040+ "license": "MIT",19041+ "engines": {19042+ "node": ">=6.10"19043+ }19044+ },1786619045 "node_modules/tslib": {1786719046 "version": "2.8.1",1786819047 "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",@@ -376,3 +376,18 @@ html:has([data-control-panel]) .navbar .mode-chip {
376376 background: var(--role-selection-bg);377377 color: var(--role-selection-fg);378378 }379+380+/* ---------- Diagrams: Mermaid, framed as a code block is ---------- */381+382+.mermaid-012 {383+ margin: 0 0 var(--ifm-leading);384+ padding: 1rem 0.75rem;385+ border-left: 3px solid var(--role-frame);386+ overflow-x: auto;387+ text-align: center;388+}389+390+.mermaid-012 > svg {391+ max-width: 100%;392+ height: auto;393+}@@ -0,0 +1,169 @@
1+// Docusaurus's Mermaid component, swizzled so diagrams are drawn in 012's2+// palette: Mermaid's base theme, its variables read from the colors3+// custom.css defines for the color mode shown, so the palette has one4+// home. Mermaid needs literal colors, not CSS variables, which is why5+// they are read from the page rather than passed through.6+7+import React, {useEffect, useMemo, useRef, type ReactNode} from 'react';8+import ErrorBoundary from '@docusaurus/ErrorBoundary';9+import {ErrorBoundaryErrorMessageFallback, useColorMode} from '@docusaurus/theme-common';10+import {11+ MermaidContainerClassName,12+ useMermaidRenderResult,13+} from '@docusaurus/theme-mermaid/client';14+import type {MermaidConfig, RenderResult} from 'mermaid';15+16+type Props = {value: string};17+18+// The custom properties the diagrams are drawn with, as custom.css19+// names them without the leading dashes.20+const vars = [21+ 'ansi-black',22+ 'ansi-red',23+ 'ansi-green',24+ 'ansi-yellow',25+ 'ansi-blue',26+ 'ansi-magenta',27+ 'ansi-cyan',28+ 'ansi-bright-black',29+ 'term-bg',30+ 'term-fg',31+ 'role-accent-bg',32+ 'role-accent-fg',33+ 'role-header-bg',34+ 'role-header-fg',35+ 'role-muted',36+ 'role-frame',37+ 'role-grid',38+ 'role-panel-bg',39+ 'font-mono',40+] as const;41+42+type Palette = Record<(typeof vars)[number], string>;43+44+function readPalette(): Palette {45+ const style = getComputedStyle(document.documentElement);46+ const p = {} as Palette;47+ for (const v of vars) {48+ p[v] = style.getPropertyValue(`--${v}`).trim();49+ }50+ return p;51+}52+53+// Nodes are cells: the panel's background framed in the grid's frame54+// color. Actors and composite states are header bands, notes the cyan55+// of where you are, and lines the muted text color.56+function themeVariables(p: Palette, dark: boolean): Record<string, unknown> {57+ return {58+ darkMode: dark,59+ background: p['term-bg'],60+ fontFamily: p['font-mono'],61+ fontSize: '14px',62+ // Square, flat boxes, as 012's frames are: no rounding, shadow or63+ // gradient.64+ radius: 0,65+ dropShadow: 'none',66+ useGradient: false,67+ primaryColor: p['role-panel-bg'],68+ primaryTextColor: p['term-fg'],69+ primaryBorderColor: p['role-frame'],70+ secondaryColor: p['role-header-bg'],71+ secondaryTextColor: p['role-header-fg'],72+ secondaryBorderColor: p['role-frame'],73+ tertiaryColor: p['term-bg'],74+ tertiaryTextColor: p['term-fg'],75+ tertiaryBorderColor: p['role-grid'],76+ textColor: p['term-fg'],77+ lineColor: p['role-muted'],78+ arrowheadColor: p['role-muted'],79+ edgeLabelBackground: p['term-bg'],80+ clusterBkg: p['term-bg'],81+ clusterBorder: p['role-frame'],82+ titleColor: p['term-fg'],83+ noteBkgColor: p['role-accent-bg'],84+ noteTextColor: p['role-accent-fg'],85+ noteBorderColor: p['role-accent-bg'],86+ actorBkg: p['role-header-bg'],87+ actorTextColor: p['role-header-fg'],88+ actorBorder: p['role-header-bg'],89+ actorLineColor: p['role-frame'],90+ signalColor: p['term-fg'],91+ signalTextColor: p['term-fg'],92+ labelBoxBkgColor: p['role-header-bg'],93+ labelBoxBorderColor: p['role-header-bg'],94+ labelTextColor: p['role-header-fg'],95+ loopTextColor: p['term-fg'],96+ activationBkgColor: p['role-panel-bg'],97+ activationBorderColor: p['role-frame'],98+ sequenceNumberColor: p['role-accent-fg'],99+ stateBkg: p['role-panel-bg'],100+ stateLabelColor: p['term-fg'],101+ compositeBackground: p['term-bg'],102+ compositeTitleBackground: p['role-header-bg'],103+ compositeBorder: p['role-frame'],104+ altBackground: p['role-panel-bg'],105+ transitionColor: p['role-muted'],106+ transitionLabelColor: p['term-fg'],107+ labelBackgroundColor: p['term-bg'],108+ specialStateColor: p['term-fg'],109+ innerEndBackground: p['role-accent-bg'],110+ errorBkgColor: p['ansi-red'],111+ errorTextColor: p['term-bg'],112+ };113+}114+115+function useMermaidConfig(): MermaidConfig | undefined {116+ // The mode is read from the page's data-theme attribute, which is set117+ // before colorMode changes. colorMode only makes this render again: while118+ // the page hydrates it reports the default mode first, and a config119+ // made from it would draw every diagram twice at once, the two drawings120+ // clobbering each other. On the server there is no page, and Mermaid121+ // draws only in the browser.122+ useColorMode();123+ const mode = typeof document === 'undefined' ? undefined : document.documentElement.dataset.theme;124+ return useMemo(() => {125+ if (mode === undefined) {126+ return undefined;127+ }128+ return {129+ startOnLoad: false,130+ theme: 'base',131+ themeVariables: themeVariables(readPalette(), mode === 'dark'),132+ flowchart: {curve: 'linear', htmlLabels: true},133+ } as MermaidConfig;134+ }, [mode]);135+}136+137+function MermaidRenderResult({renderResult}: {renderResult: RenderResult}): ReactNode {138+ const ref = useRef<HTMLDivElement>(null);139+ useEffect(() => {140+ if (ref.current) {141+ renderResult.bindFunctions?.(ref.current);142+ }143+ }, [renderResult]);144+ return (145+ <div146+ ref={ref}147+ className={`${MermaidContainerClassName} mermaid-012`}148+ // eslint-disable-next-line react/no-danger149+ dangerouslySetInnerHTML={{__html: renderResult.svg}}150+ />151+ );152+}153+154+function MermaidRenderer({value}: Props): ReactNode {155+ const config = useMermaidConfig();156+ const renderResult = useMermaidRenderResult({text: value, config});157+ if (renderResult === null) {158+ return null;159+ }160+ return <MermaidRenderResult renderResult={renderResult} />;161+}162+163+export default function Mermaid(props: Props): ReactNode {164+ return (165+ <ErrorBoundary fallback={(params) => <ErrorBoundaryErrorMessageFallback {...params} />}>166+ <MermaidRenderer {...props} />167+ </ErrorBoundary>168+ );169+}