- commit
- 41fea2f93a7252a37478e2e8b68056be7693c40d
- parent
- f053732168141bfc55d0a9fc1932f6157fa4a729
- parent
- 5dd6d4c1d92c4f46a6852792283869b745bcade3
- author
- Dami <dami.etoile@gmail.com>
| M | CLAUDE.md | 4 | + |
| M | docs/ | 210 | +++- |
| 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/ | 190 | ++++ |
@@ -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`).@@ -58,22 +58,32 @@ oracle/ differential tests against excelize's calculation (separate mod
5858 5959 `internal/sheet` knows nothing about terminals. It builds on the function6060 library, which knows nothing about sheets or storage, and on packages61-that know nothing about cells; dependencies point one way:62-63-```64-internal/ui, internal/fileio, internal/chart, oracle65- |66-internal/sheet ------------------------------+67- | |68-internal/functions ---> internal/formula |69- | |70-internal/value ---> internal/numfmt <------+61+that know nothing about cells. Dependencies point one way, down the62+graph of imports below the engine; `internal/locale`, at the bottom,63+holds the table of locales and depends on nothing:64+65+```mermaid66+flowchart TD67+ subgraph callers [the engine's callers]68+ direction LR69+ ui[internal/ui] ~~~ fileio[internal/fileio] ~~~ live[internal/live] ~~~ nushell[internal/nushell]70+ chart[internal/chart] ~~~ jev[internal/jev] ~~~ stress[internal/stress] ~~~ oracle[oracle]71+ end72+ callers --> sheet[internal/sheet]73+ sheet --> functions[internal/functions]74+ sheet --> formula[internal/formula]75+ sheet --> value[internal/value]76+ sheet --> numfmt[internal/numfmt]77+ sheet --> locale[internal/locale]78+ functions --> formula79+ functions --> value80+ functions --> numfmt81+ value --> numfmt82+ value --> locale83+ formula --> locale84+ numfmt --> locale7185 ```7286 73-(`sheet` also uses `formula`, `value` and `numfmt` directly. Below74-them all, `internal/locale` holds the table of locales and depends on75-nothing.)76-7787 - `internal/locale` is the conventions of each locale: decimal and7888 thousands separators, date order and patterns, currency symbol and7989 place, and the formula separators that follow from the decimal one.@@ -268,9 +278,20 @@ style.
268278 ### The change stream269279 270280 Rows reach a region as `sheet.LiveOp`s, each applied at once by271-`Workbook.ApplyLive` through the regions' one write path: what follows272-a linked file sends them, and the UI sends a notebook cell's output to273-the region it was sent to whenever the cell runs.281+`Workbook.ApplyLive` through the regions' one write path, `writeTable`:282+what follows a linked file sends them, and the UI sends a notebook283+cell's output to the region it was sent to whenever the cell runs.284+285+```mermaid286+flowchart TD287+ file[a linked file] -->|polled| source[live.Source]288+ source -->|live.Update| op[sheet.LiveOp]289+ cell[a notebook cell's run] -->|its output, fileio.NUONRows| op290+ op --> apply[Workbook.ApplyLive]291+ apply --> write[writeTable: the cells that differ, outside the undo history]292+ write --> recalc[recalculation: what reads them, pivots and spills included]293+ recalc --> frame[the next frame draws the cells on screen]294+```274295 275296 | Field | Holds |276297 |---|---|@@ -281,11 +302,10 @@ the region it was sent to whenever the cell runs.
281302 | `Rows` | data rows: values with the formats they arrived in (`LiveCell`) |282303 | `Err`, `Note` | why the source can't be read, what it left out |283304 284-An op is applied outside the undo history, as a spill is written: the305+An op is applied outside the undo history, as a spill is written. A285306 window drops the oldest rows (read back from the region's cells and286-written again one row up), only the cells that changed are written, and287-what reads them recalculates, pivots and spills included; inside an open288-step (a macro run) they recalculate when it ends. An op carries whole307+written again one row up); inside an open step (a macro run) what reads308+the cells recalculates when the step ends. An op carries whole289309 values and names nothing but its region, so applying the same ops in the290310 same order to the same workbook makes the same cells: it is what a291311 session following another's over `012 serve` would be sent, beside the@@ -421,6 +441,26 @@ range it writes (`edits`), and `runCommand` refuses it over a pivot
421441 table's results, so a new editing command is guarded by saying what it422442 edits.423443 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+424464 **Model and components.** `Model` (`model.go`) is the root: it holds the425465 file, the mode and the note on the context line, owns one component for426466 each thing that takes input or draws part of the screen, routes each@@ -527,36 +567,54 @@ is one row of the table in `formats.go` (its name, extensions, the words
527567 the UI shows for it, whether it holds several sheets or tables, and its528568 importer and exporter) plus a file of its own; `Import`, `Export`,529569 recognizing a file by its extension, the import picker and the Download530-menu all come from the table. Importers build a new workbook through the531-engine's public API with a shared `builder`, which keeps text as text,532-falls back to a formula's cached value when it can't be translated, and533-counts what didn't fit. They stream: CSV and TSV are read record by534-record, NUON and JSON a row at a time (`nuon.Reader`, which yields rows535-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, and536591 Parquet files and SQLite tables stop at the sheet's last row, taking the537-number of rows left out from the file. A `Tail` reads CSV, TSV, JSON and538-NUON as they arrive in pieces, for a file followed as it grows: the539-importers' readers run on a goroutine of its own over a pipe that waits540-for the next piece, so a record cut off at the end of one waits for the541-rest, and rows come out typed as an import types them (`tail.go`).542-`internal/live` follows files with `os.Stat` alone, reading what a543-growing file gained through a `Tail`, and any other format again whole,544-through its importer, once it holds still (`live.File`); a `live.Source`545-is anything that yields a table's rows over time, which a nushell region546-following a pipeline would be too. XLSX is read by 012's own547-SpreadsheetML reader on `archive/zip` and `encoding/xml`: the workbook,548-shared strings (kept end to end in one buffer) and styles first, then549-each worksheet a token at a time, a row at a time, expanding shared550-formulas only for the cells kept. The file is untrusted, so the reader551-caps what it can be made to do (`xlsxLimits`: uncompressed bytes per552-part and in all, compression ratio, zip entries, XML nesting and token553-size, shared strings, styles, sheets, and the text shared formulas554-expand to) and refuses unsafe part names and references past Excel's555-edges; `FuzzReadXLSX` and `FuzzReadXLSXParts` fuzz it. XLSX is written556-with the same packages, a worksheet part streamed per sheet. Exporters557-write a `Snapshot` taken on the UI goroutine, in the background, through558-one atomic write-then-rename; CSV and TSV are written a row at a time. One package suits formats that share559-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 formula560618 translation); a format that grew its own dependencies would move to a561619 subpackage behind the same table row.562620 @@ -609,7 +667,23 @@ sheet (`$sheet.A1:C9`) is renamed to a variable of its own first
609667 (`notebook.Bind`). What nu prints is kept as it is, NUON, the cell's610668 output: a later cell reads it byte for byte as `$name`, `nbview` parses611669 it once to draw it, and `fileio.NUONRows` reads it as a region's rows to612-send to a sheet. `Runner` is the seam: tests hand the UI a fake, the e2e670+send to a sheet:671+672+```mermaid673+sequenceDiagram674+ participant UI as internal/ui675+ participant R as nushell.Runner676+ participant Nu as nu -c677+ UI->>R: a Job: the pipeline, the NUON of what it reads678+ R->>R: each to a file, named in NU012_TABLE_0, 1, ...679+ R->>Nu: the script680+ Nu->>Nu: let files = (open --raw $env.NU012_TABLE_0 | from nuon)681+ Nu-->>R: the pipeline's value, to nuon682+ R-->>UI: the NUON, up to 512 MB683+ UI->>UI: the cell's output, not an undo step; sent on to its region684+```685+686+`Runner` is the seam: tests hand the UI a fake, the e2e613687 screens a stand-in `nu` script. The UI runs one cell at a time as a614688 `tea.Cmd` with a context Stop cancels and a timeout; the queue a run615689 makes comes from `notebook.Order` (each cell after those it reads) and@@ -657,13 +731,33 @@ slice edge or the rim.
657731 `internal/serve` wraps `charm.land/ssh` (wish's server) with only a658732 session channel, public-key auth against authorized_keys, and a shell659733 request or, with a PTY, a one-word exec request allowed. The exec660-request is never run: its word is a file name, resolved through the661-served directory's `confine.Root` before the session starts and handed662-to `Model.OpenOnStart`. Each session builds a `ui.Model` of its own and runs it663-in its own `tea.Program` over the session (wish's emulated PTY), with664-the client's environment and window size; `Model.Serve` gives it the665-client's environment for terminal detection and a `confine.Root` for666-file names. Everything a model knows lives in the model, so sessions734+request is never run: its word is a file name. A session from login to735+its end:736+737+```mermaid738+sequenceDiagram739+ participant C as ssh client740+ participant S as internal/serve741+ participant M as the session's ui.Model742+ C->>S: public key743+ S->>S: authorize: authorized_keys read again744+ C->>S: session channel, pty-req745+ C->>S: shell, or exec with one word746+ S->>S: allowSession, fileArg: the word resolved through confine.Root747+ S->>S: a slot under --max-sessions748+ S->>M: ui.New, Model.Serve (client's environment, confine.Root), OpenOnStart749+ S->>M: its own tea.Program over the session750+ loop until it quits, the client goes, it idles or the server stops751+ C->>M: keys, window size changes752+ M-->>C: frames753+ end754+ S->>M: Unsaved, Recover (idle or stopping)755+ S-->>C: why it ended, where unsaved work was kept756+```757+758+Each session runs its `tea.Program` over wish's emulated PTY; the759+client's environment is what the model detects the terminal from, and760+its `confine.Root` resolves every file name. Everything a model knows lives in the model, so sessions667761 share nothing but read-only tables (the command and function668762 registries), the process-wide telemetry and, with JEV on, the HTTP669763 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.@@ -79,6 +79,9 @@ the site's first commit for every page there has been.
7979 (`website/src/remark/repo-links.ts`).8080 - The generated pages, [Functions](../reference/functions.md) and8181 [Configuration](../reference/config.md), are pages like any other.82+- `mermaid` code blocks are drawn as diagrams83+ (`@docusaurus/theme-mermaid`), as GitHub draws them; see84+ [Diagrams](#diagrams).8285 - Search is local: `@easyops-cn/docusaurus-search-local` builds an index8386 at build time, and nothing is sent to a service.8487 @@ -92,3 +95,24 @@ colors in `website/src/css/custom.css` are the reference palettes of the
9295 golden screens, given the roles the app gives them: cyan where you are,9396 bright black header bands, blue links and selection. Headings and chrome9497 are IBM Plex Mono, body text IBM Plex Sans, both bundled with the site.98+99+## Diagrams100+101+Diagrams are Mermaid, in a `mermaid` code block, never ASCII art: the102+same source is drawn on the site and on GitHub. A code block of text103+stays for what is text on a terminal: screens, mockups of them and104+command output.105+106+- Draw one where a flow, a state machine or a sequence would otherwise107+ take paragraphs: a flowchart for data moving through the code, a state108+ diagram for modes, a sequence diagram for two programs talking. Not109+ for its own sake: a list or a table that reads well stays one.110+- A short sentence before it says what it shows, and the prose around111+ it keeps the facts the diagram can't (why, limits, names to search112+ for) without walking through it again.113+- Labels are the words the docs use: the key, the command's title, the114+ function or type name; menu paths in them are checked as in prose.115+- Colors and fonts come from the site: `website/src/theme/Mermaid`116+ (Docusaurus's component, swizzled) draws with Mermaid's `base` theme117+ and variables read from the palette in `custom.css` for the color118+ mode shown, so diagrams don't set their own styles.@@ -90,6 +90,28 @@ the spreadsheet modified.
9090 9191 ## Pause, read again, unlink9292 93+A linked region follows its file, is paused, or shows why it can't read94+it, and is read again whole whenever its cells may no longer be the95+file's:96+97+```mermaid98+stateDiagram-v299+ state "Read whole" as whole100+ state "● Following" as following101+ state "‖ Paused" as paused102+ state "! Failing" as failing103+ [*] --> whole: linked, or the spreadsheet opened104+ whole --> following105+ following --> following: rows appended106+ following --> whole: the file truncated, rotated or rewritten107+ following --> whole: Read again, Rows to keep, the region moved108+ following --> paused: Follow off109+ paused --> following: Follow on, catching up110+ following --> failing: the file gone or unreadable111+ failing --> whole: the file readable again112+ following --> [*]: Unlink, the rows kept as cells113+```114+93115 Data > Linked file acts on the region under the pointer, or the sheet's94116 only one:95117 @@ -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+```@@ -180,10 +180,24 @@ File > Settings > Vim keys (also `:settings.vim` or the palette) turns
180180 on a vim keymap in the spirit of sc-im and VisiData. It is off by181181 default and belongs to you, not the sheet: it's kept in the config file182182 as `keymap = vim` ([Configuration](config.md#keymap)), never in `.012` files.183-The mode indicator says **NORMAL** where it would say READY, **VISUAL**184-while selecting with `v` or `V`, and **COMMAND** on the `:` line; typing185-into a cell is ENTER or EDIT, as always, and Enter, Tab or Esc there186-return to NORMAL. Keys vim doesn't take keep their Sheets meaning183+The mode indicator says **NORMAL** where it would say READY, and184+typing into a cell is ENTER or EDIT, as always:185+186+```mermaid187+stateDiagram-v2188+ [*] --> NORMAL189+ NORMAL --> VISUAL: v, V190+ VISUAL --> NORMAL: v, V, Esc191+ NORMAL --> COMMAND: #58;192+ VISUAL --> COMMAND: #58;, on the selection193+ COMMAND --> NORMAL: Enter, Esc194+ NORMAL --> EDIT: i, a, Enter195+ NORMAL --> ENTER: =, o, O, s, cc, S196+ EDIT --> NORMAL: Enter, Tab, Esc197+ ENTER --> NORMAL: Enter, Tab, Esc198+```199+200+Keys vim doesn't take keep their Sheets meaning187201 (arrows, Del, Ctrl+S, Ctrl+C and Ctrl+V, Alt+letter menus, F-keys);188202 Ctrl+D, Ctrl+U and Ctrl+R are vim's, so fill down and fill right are in189203 the Edit menu. F1 lists the vim keys first, and the menus and palette@@ -35,6 +35,9 @@ const config: Config = {
3535 // .md files are CommonMark, as GitHub reads them: <, { and HTML3636 // comments are text and markup, not JSX. .mdx files would be MDX.3737 format: 'detect',38+ // ```mermaid blocks are drawn as diagrams, as GitHub draws them; the39+ // swizzled src/theme/Mermaid gives them the site's palette.40+ mermaid: true,3841 hooks: {3942 onBrokenMarkdownLinks: 'throw',4043 onBrokenMarkdownImages: 'throw',@@ -66,6 +69,7 @@ const config: Config = {
6669 plugins: [['@docusaurus/plugin-client-redirects', {redirects}]],6770 6871 themes: [72+ '@docusaurus/theme-mermaid',6973 [7074 '@easyops-cn/docusaurus-search-local',7175 {@@ -117,6 +121,9 @@ const config: Config = {
117121 ],118122 copyright: `<span class="mode-chip">READY</span> 012 is free software under the <a href="${repo}/blob/main/LICENSE">MIT license</a>.`,119123 },124+ // The base theme is the one Mermaid lets every color of be set;125+ // src/theme/Mermaid sets them from custom.css for each color mode.126+ mermaid: {theme: {light: 'base', dark: 'base'}},120127 prism: {121128 theme: prismThemes.oneLight,122129 darkTheme: prismThemes.oneDark,@@ -9,6 +9,7 @@
99 "@docusaurus/core": "3.10.2",1010 "@docusaurus/plugin-client-redirects": "3.10.2",1111 "@docusaurus/preset-classic": "3.10.2",12+ "@docusaurus/theme-mermaid": "3.10.2",1213 "@easyops-cn/docusaurus-search-local": "0.55.3",1314 "@fontsource/ibm-plex-mono": "5.3.0",1415 "@fontsource/ibm-plex-sans": "5.3.0",@@ -276,6 +277,19 @@
276277 "node": ">= 14.0.0"277278 }278279 },280+ "node_modules/@antfu/install-pkg": {281+ "version": "2.1.0",282+ "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-2.1.0.tgz",283+ "integrity": "sha512-sdg9NxU3zR4Mnawfbc/x6GB5Wf17WYud5qOuEuxXjaKpYpMkISSJEjItGebXJ2bQ4DIcly4NYH23mtkGJjvKUw==",284+ "license": "MIT",285+ "dependencies": {286+ "package-manager-detector": "^1.8.0",287+ "tinyexec": "^1.3.1"288+ },289+ "funding": {290+ "url": "https://github.com/sponsors/antfu"291+ }292+ },279293 "node_modules/@babel/code-frame": {280294 "version": "7.29.7",281295 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",@@ -1994,6 +2008,51 @@
19942008 "node": ">=6.9.0"19952009 }19962010 },2011+ "node_modules/@braintree/sanitize-url": {2012+ "version": "7.1.2",2013+ "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz",2014+ "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==",2015+ "license": "MIT"2016+ },2017+ "node_modules/@chevrotain/cst-dts-gen": {2018+ "version": "11.1.2",2019+ "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.1.2.tgz",2020+ "integrity": "sha512-XTsjvDVB5nDZBQB8o0o/0ozNelQtn2KrUVteIHSlPd2VAV2utEb6JzyCJaJ8tGxACR4RiBNWy5uYUHX2eji88Q==",2021+ "license": "Apache-2.0",2022+ "dependencies": {2023+ "@chevrotain/gast": "11.1.2",2024+ "@chevrotain/types": "11.1.2",2025+ "lodash-es": "4.17.23"2026+ }2027+ },2028+ "node_modules/@chevrotain/gast": {2029+ "version": "11.1.2",2030+ "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.1.2.tgz",2031+ "integrity": "sha512-Z9zfXR5jNZb1Hlsd/p+4XWeUFugrHirq36bKzPWDSIacV+GPSVXdk+ahVWZTwjhNwofAWg/sZg58fyucKSQx5g==",2032+ "license": "Apache-2.0",2033+ "dependencies": {2034+ "@chevrotain/types": "11.1.2",2035+ "lodash-es": "4.17.23"2036+ }2037+ },2038+ "node_modules/@chevrotain/regexp-to-ast": {2039+ "version": "11.1.2",2040+ "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.1.2.tgz",2041+ "integrity": "sha512-nMU3Uj8naWer7xpZTYJdxbAs6RIv/dxYzkYU8GSwgUtcAAlzjcPfX1w+RKRcYG8POlzMeayOQ/znfwxEGo5ulw==",2042+ "license": "Apache-2.0"2043+ },2044+ "node_modules/@chevrotain/types": {2045+ "version": "11.1.2",2046+ "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz",2047+ "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==",2048+ "license": "Apache-2.0"2049+ },2050+ "node_modules/@chevrotain/utils": {2051+ "version": "11.1.2",2052+ "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.1.2.tgz",2053+ "integrity": "sha512-4mudFAQ6H+MqBTfqLmU7G1ZwRzCLfJEooL/fsF6rCX5eePMbGhoy5n4g+G4vlh2muDcsCTJtL+uKbOzWxs5LHA==",2054+ "license": "Apache-2.0"2055+ },19972056 "node_modules/@colors/colors": {19982057 "version": "1.5.0",19992058 "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",@@ -3996,6 +4055,34 @@
39964055 "react-dom": "^18.0.0 || ^19.0.0"39974056 }39984057 },4058+ "node_modules/@docusaurus/theme-mermaid": {4059+ "version": "3.10.2",4060+ "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.10.2.tgz",4061+ "integrity": "sha512-Stssh5MYQJ+EdYugUXf+ZcpeJFQPKXf0KCd/SWp10o3CmXNaOoh5IEgVjVqY1e1XhQf3on4+Y4BnrMiD95E2SQ==",4062+ "license": "MIT",4063+ "dependencies": {4064+ "@docusaurus/core": "3.10.2",4065+ "@docusaurus/module-type-aliases": "3.10.2",4066+ "@docusaurus/theme-common": "3.10.2",4067+ "@docusaurus/types": "3.10.2",4068+ "@docusaurus/utils-validation": "3.10.2",4069+ "mermaid": ">=11.6.0",4070+ "tslib": "^2.6.0"4071+ },4072+ "engines": {4073+ "node": ">=20.0"4074+ },4075+ "peerDependencies": {4076+ "@mermaid-js/layout-elk": "^0.1.9",4077+ "react": "^18.0.0 || ^19.0.0",4078+ "react-dom": "^18.0.0 || ^19.0.0"4079+ },4080+ "peerDependenciesMeta": {4081+ "@mermaid-js/layout-elk": {4082+ "optional": true4083+ }4084+ }4085+ },39994086 "node_modules/@docusaurus/theme-search-algolia": {40004087 "version": "3.10.2",40014088 "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.2.tgz",@@ -4331,6 +4418,23 @@
43314418 "@hapi/hoek": "^9.0.0"43324419 }43334420 },4421+ "node_modules/@iconify/types": {4422+ "version": "2.0.0",4423+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",4424+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",4425+ "license": "MIT"4426+ },4427+ "node_modules/@iconify/utils": {4428+ "version": "3.1.7",4429+ "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.7.tgz",4430+ "integrity": "sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w==",4431+ "license": "MIT",4432+ "dependencies": {4433+ "@antfu/install-pkg": "^2.0.1",4434+ "@iconify/types": "^2.0.0",4435+ "import-meta-resolve": "^4.2.0"4436+ }4437+ },43344438 "node_modules/@jest/schemas": {43354439 "version": "29.6.3",43364440 "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",@@ -4885,6 +4989,18 @@
48854989 "react": ">=16"48864990 }48874991 },4992+ "node_modules/@mermaid-js/parser": {4993+ "version": "2.0.0",4994+ "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-2.0.0.tgz",4995+ "integrity": "sha512-K8BeapFUfrfxbRAUQAG5oBOCwo1+bNWzaVnPxTCutkfrTBn6T/j91FIhqxWJ32SUeQ9T3iy1zcmPZ5ROZEvDrg==",4996+ "license": "MIT",4997+ "dependencies": {4998+ "@chevrotain/types": "~11.1.2"4999+ },5000+ "engines": {5001+ "node": ">=22.12.0"5002+ }5003+ },48885004 "node_modules/@napi-rs/wasm-runtime": {48895005 "version": "0.2.12",48905006 "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",@@ -5810,6 +5926,259 @@
58105926 "@types/node": "*"58115927 }58125928 },5929+ "node_modules/@types/d3": {5930+ "version": "7.4.3",5931+ "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz",5932+ "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",5933+ "license": "MIT",5934+ "dependencies": {5935+ "@types/d3-array": "*",5936+ "@types/d3-axis": "*",5937+ "@types/d3-brush": "*",5938+ "@types/d3-chord": "*",5939+ "@types/d3-color": "*",5940+ "@types/d3-contour": "*",5941+ "@types/d3-delaunay": "*",5942+ "@types/d3-dispatch": "*",5943+ "@types/d3-drag": "*",5944+ "@types/d3-dsv": "*",5945+ "@types/d3-ease": "*",5946+ "@types/d3-fetch": "*",5947+ "@types/d3-force": "*",5948+ "@types/d3-format": "*",5949+ "@types/d3-geo": "*",5950+ "@types/d3-hierarchy": "*",5951+ "@types/d3-interpolate": "*",5952+ "@types/d3-path": "*",5953+ "@types/d3-polygon": "*",5954+ "@types/d3-quadtree": "*",5955+ "@types/d3-random": "*",5956+ "@types/d3-scale": "*",5957+ "@types/d3-scale-chromatic": "*",5958+ "@types/d3-selection": "*",5959+ "@types/d3-shape": "*",5960+ "@types/d3-time": "*",5961+ "@types/d3-time-format": "*",5962+ "@types/d3-timer": "*",5963+ "@types/d3-transition": "*",5964+ "@types/d3-zoom": "*"5965+ }5966+ },5967+ "node_modules/@types/d3-array": {5968+ "version": "3.2.2",5969+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",5970+ "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==",5971+ "license": "MIT"5972+ },5973+ "node_modules/@types/d3-axis": {5974+ "version": "3.0.6",5975+ "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz",5976+ "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",5977+ "license": "MIT",5978+ "dependencies": {5979+ "@types/d3-selection": "*"5980+ }5981+ },5982+ "node_modules/@types/d3-brush": {5983+ "version": "3.0.6",5984+ "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz",5985+ "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",5986+ "license": "MIT",5987+ "dependencies": {5988+ "@types/d3-selection": "*"5989+ }5990+ },5991+ "node_modules/@types/d3-chord": {5992+ "version": "3.0.6",5993+ "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz",5994+ "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==",5995+ "license": "MIT"5996+ },5997+ "node_modules/@types/d3-color": {5998+ "version": "3.1.3",5999+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",6000+ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",6001+ "license": "MIT"6002+ },6003+ "node_modules/@types/d3-contour": {6004+ "version": "3.0.6",6005+ "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz",6006+ "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",6007+ "license": "MIT",6008+ "dependencies": {6009+ "@types/d3-array": "*",6010+ "@types/geojson": "*"6011+ }6012+ },6013+ "node_modules/@types/d3-delaunay": {6014+ "version": "6.0.4",6015+ "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz",6016+ "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==",6017+ "license": "MIT"6018+ },6019+ "node_modules/@types/d3-dispatch": {6020+ "version": "3.0.7",6021+ "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz",6022+ "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==",6023+ "license": "MIT"6024+ },6025+ "node_modules/@types/d3-drag": {6026+ "version": "3.0.7",6027+ "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz",6028+ "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==",6029+ "license": "MIT",6030+ "dependencies": {6031+ "@types/d3-selection": "*"6032+ }6033+ },6034+ "node_modules/@types/d3-dsv": {6035+ "version": "3.0.7",6036+ "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",6037+ "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==",6038+ "license": "MIT"6039+ },6040+ "node_modules/@types/d3-ease": {6041+ "version": "3.0.2",6042+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",6043+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",6044+ "license": "MIT"6045+ },6046+ "node_modules/@types/d3-fetch": {6047+ "version": "3.0.7",6048+ "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",6049+ "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",6050+ "license": "MIT",6051+ "dependencies": {6052+ "@types/d3-dsv": "*"6053+ }6054+ },6055+ "node_modules/@types/d3-force": {6056+ "version": "3.0.10",6057+ "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz",6058+ "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==",6059+ "license": "MIT"6060+ },6061+ "node_modules/@types/d3-format": {6062+ "version": "3.0.4",6063+ "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz",6064+ "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==",6065+ "license": "MIT"6066+ },6067+ "node_modules/@types/d3-geo": {6068+ "version": "3.1.1",6069+ "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.1.tgz",6070+ "integrity": "sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==",6071+ "license": "MIT",6072+ "dependencies": {6073+ "@types/geojson": "*"6074+ }6075+ },6076+ "node_modules/@types/d3-hierarchy": {6077+ "version": "3.1.7",6078+ "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz",6079+ "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==",6080+ "license": "MIT"6081+ },6082+ "node_modules/@types/d3-interpolate": {6083+ "version": "3.0.4",6084+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",6085+ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",6086+ "license": "MIT",6087+ "dependencies": {6088+ "@types/d3-color": "*"6089+ }6090+ },6091+ "node_modules/@types/d3-path": {6092+ "version": "3.1.1",6093+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",6094+ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",6095+ "license": "MIT"6096+ },6097+ "node_modules/@types/d3-polygon": {6098+ "version": "3.0.2",6099+ "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz",6100+ "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==",6101+ "license": "MIT"6102+ },6103+ "node_modules/@types/d3-quadtree": {6104+ "version": "3.0.6",6105+ "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",6106+ "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==",6107+ "license": "MIT"6108+ },6109+ "node_modules/@types/d3-random": {6110+ "version": "3.0.4",6111+ "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.4.tgz",6112+ "integrity": "sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==",6113+ "license": "MIT"6114+ },6115+ "node_modules/@types/d3-scale": {6116+ "version": "4.0.9",6117+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",6118+ "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",6119+ "license": "MIT",6120+ "dependencies": {6121+ "@types/d3-time": "*"6122+ }6123+ },6124+ "node_modules/@types/d3-scale-chromatic": {6125+ "version": "3.1.0",6126+ "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",6127+ "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==",6128+ "license": "MIT"6129+ },6130+ "node_modules/@types/d3-selection": {6131+ "version": "3.0.12",6132+ "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.12.tgz",6133+ "integrity": "sha512-Qe/KWYhEiIIxGs7HrAAjMfShxKldx19SJtr5zu53f3afPsdZNz7HHtdTLXo/kqeiWNXVycI24kSnfzBYkTzpgw==",6134+ "license": "MIT"6135+ },6136+ "node_modules/@types/d3-shape": {6137+ "version": "3.2.0",6138+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.2.0.tgz",6139+ "integrity": "sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==",6140+ "license": "MIT",6141+ "dependencies": {6142+ "@types/d3-path": "*"6143+ }6144+ },6145+ "node_modules/@types/d3-time": {6146+ "version": "3.0.4",6147+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",6148+ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",6149+ "license": "MIT"6150+ },6151+ "node_modules/@types/d3-time-format": {6152+ "version": "4.0.3",6153+ "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz",6154+ "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==",6155+ "license": "MIT"6156+ },6157+ "node_modules/@types/d3-timer": {6158+ "version": "3.0.2",6159+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",6160+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",6161+ "license": "MIT"6162+ },6163+ "node_modules/@types/d3-transition": {6164+ "version": "3.0.9",6165+ "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz",6166+ "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==",6167+ "license": "MIT",6168+ "dependencies": {6169+ "@types/d3-selection": "*"6170+ }6171+ },6172+ "node_modules/@types/d3-zoom": {6173+ "version": "3.0.9",6174+ "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.9.tgz",6175+ "integrity": "sha512-0sE1406XBYJGiqD3AusTl9ZqC//2mIXix51tbom25gDCA8ri4xnSZg28CaSE8Srl6FClqABUKfsn0qghgdepMA==",6176+ "license": "MIT",6177+ "dependencies": {6178+ "@types/d3-interpolate": "*",6179+ "@types/d3-selection": "*"6180+ }6181+ },58136182 "node_modules/@types/debug": {58146183 "version": "4.1.13",58156184 "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",@@ -5858,6 +6227,12 @@
58586227 "@types/send": "*"58596228 }58606229 },6230+ "node_modules/@types/geojson": {6231+ "version": "7946.0.16",6232+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz",6233+ "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",6234+ "license": "MIT"6235+ },58616236 "node_modules/@types/hast": {58626237 "version": "3.0.5",58636238 "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz",@@ -6088,6 +6463,13 @@
60886463 "@types/node": "*"60896464 }60906465 },6466+ "node_modules/@types/trusted-types": {6467+ "version": "2.0.7",6468+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",6469+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",6470+ "license": "MIT",6471+ "optional": true6472+ },60916473 "node_modules/@types/unist": {60926474 "version": "3.0.3",60936475 "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",@@ -6124,6 +6506,16 @@
61246506 "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==",61256507 "license": "ISC"61266508 },6509+ "node_modules/@upsetjs/venn.js": {6510+ "version": "2.0.0",6511+ "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz",6512+ "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==",6513+ "license": "MIT",6514+ "optionalDependencies": {6515+ "d3-selection": "^3.0.0",6516+ "d3-transition": "^3.0.1"6517+ }6518+ },61276519 "node_modules/@webassemblyjs/ast": {61286520 "version": "1.14.1",61296521 "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",@@ -7194,6 +7586,20 @@
71947586 "url": "https://github.com/sponsors/fb55"71957587 }71967588 },7589+ "node_modules/chevrotain": {7590+ "version": "11.1.2",7591+ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.1.2.tgz",7592+ "integrity": "sha512-opLQzEVriiH1uUQ4Kctsd49bRoFDXGGSC4GUqj7pGyxM3RehRhvTlZJc1FL/Flew2p5uwxa1tUDWKzI4wNM8pg==",7593+ "license": "Apache-2.0",7594+ "dependencies": {7595+ "@chevrotain/cst-dts-gen": "11.1.2",7596+ "@chevrotain/gast": "11.1.2",7597+ "@chevrotain/regexp-to-ast": "11.1.2",7598+ "@chevrotain/types": "11.1.2",7599+ "@chevrotain/utils": "11.1.2",7600+ "lodash-es": "4.17.23"7601+ }7602+ },71977603 "node_modules/chokidar": {71987604 "version": "3.6.0",71997605 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",@@ -7703,6 +8109,15 @@
77038109 "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",77048110 "license": "MIT"77058111 },8112+ "node_modules/cose-base": {8113+ "version": "1.0.3",8114+ "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz",8115+ "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==",8116+ "license": "MIT",8117+ "dependencies": {8118+ "layout-base": "^1.0.0"8119+ }8120+ },77068121 "node_modules/cosmiconfig": {77078122 "version": "8.3.6",77088123 "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",@@ -8040,152 +8455,678 @@
80408455 ],80418456 "license": "MIT-0"80428457 },8043- "node_modules/cssesc": {8044- "version": "3.0.0",8045- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",8046- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",8047- "license": "MIT",8048- "bin": {8049- "cssesc": "bin/cssesc"8458+ "node_modules/cssesc": {8459+ "version": "3.0.0",8460+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",8461+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",8462+ "license": "MIT",8463+ "bin": {8464+ "cssesc": "bin/cssesc"8465+ },8466+ "engines": {8467+ "node": ">=4"8468+ }8469+ },8470+ "node_modules/cssnano": {8471+ "version": "6.1.2",8472+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz",8473+ "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==",8474+ "license": "MIT",8475+ "dependencies": {8476+ "cssnano-preset-default": "^6.1.2",8477+ "lilconfig": "^3.1.1"8478+ },8479+ "engines": {8480+ "node": "^14 || ^16 || >=18.0"8481+ },8482+ "funding": {8483+ "type": "opencollective",8484+ "url": "https://opencollective.com/cssnano"8485+ },8486+ "peerDependencies": {8487+ "postcss": "^8.4.31"8488+ }8489+ },8490+ "node_modules/cssnano-preset-advanced": {8491+ "version": "6.1.2",8492+ "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz",8493+ "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==",8494+ "license": "MIT",8495+ "dependencies": {8496+ "autoprefixer": "^10.4.19",8497+ "browserslist": "^4.23.0",8498+ "cssnano-preset-default": "^6.1.2",8499+ "postcss-discard-unused": "^6.0.5",8500+ "postcss-merge-idents": "^6.0.3",8501+ "postcss-reduce-idents": "^6.0.3",8502+ "postcss-zindex": "^6.0.2"8503+ },8504+ "engines": {8505+ "node": "^14 || ^16 || >=18.0"8506+ },8507+ "peerDependencies": {8508+ "postcss": "^8.4.31"8509+ }8510+ },8511+ "node_modules/cssnano-preset-default": {8512+ "version": "6.1.2",8513+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz",8514+ "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==",8515+ "license": "MIT",8516+ "dependencies": {8517+ "browserslist": "^4.23.0",8518+ "css-declaration-sorter": "^7.2.0",8519+ "cssnano-utils": "^4.0.2",8520+ "postcss-calc": "^9.0.1",8521+ "postcss-colormin": "^6.1.0",8522+ "postcss-convert-values": "^6.1.0",8523+ "postcss-discard-comments": "^6.0.2",8524+ "postcss-discard-duplicates": "^6.0.3",8525+ "postcss-discard-empty": "^6.0.3",8526+ "postcss-discard-overridden": "^6.0.2",8527+ "postcss-merge-longhand": "^6.0.5",8528+ "postcss-merge-rules": "^6.1.1",8529+ "postcss-minify-font-values": "^6.1.0",8530+ "postcss-minify-gradients": "^6.0.3",8531+ "postcss-minify-params": "^6.1.0",8532+ "postcss-minify-selectors": "^6.0.4",8533+ "postcss-normalize-charset": "^6.0.2",8534+ "postcss-normalize-display-values": "^6.0.2",8535+ "postcss-normalize-positions": "^6.0.2",8536+ "postcss-normalize-repeat-style": "^6.0.2",8537+ "postcss-normalize-string": "^6.0.2",8538+ "postcss-normalize-timing-functions": "^6.0.2",8539+ "postcss-normalize-unicode": "^6.1.0",8540+ "postcss-normalize-url": "^6.0.2",8541+ "postcss-normalize-whitespace": "^6.0.2",8542+ "postcss-ordered-values": "^6.0.2",8543+ "postcss-reduce-initial": "^6.1.0",8544+ "postcss-reduce-transforms": "^6.0.2",8545+ "postcss-svgo": "^6.0.3",8546+ "postcss-unique-selectors": "^6.0.4"8547+ },8548+ "engines": {8549+ "node": "^14 || ^16 || >=18.0"8550+ },8551+ "peerDependencies": {8552+ "postcss": "^8.4.31"8553+ }8554+ },8555+ "node_modules/cssnano-utils": {8556+ "version": "4.0.2",8557+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz",8558+ "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==",8559+ "license": "MIT",8560+ "engines": {8561+ "node": "^14 || ^16 || >=18.0"8562+ },8563+ "peerDependencies": {8564+ "postcss": "^8.4.31"8565+ }8566+ },8567+ "node_modules/csso": {8568+ "version": "5.0.5",8569+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",8570+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",8571+ "license": "MIT",8572+ "dependencies": {8573+ "css-tree": "~2.2.0"8574+ },8575+ "engines": {8576+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",8577+ "npm": ">=7.0.0"8578+ }8579+ },8580+ "node_modules/csso/node_modules/css-tree": {8581+ "version": "2.2.1",8582+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",8583+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",8584+ "license": "MIT",8585+ "dependencies": {8586+ "mdn-data": "2.0.28",8587+ "source-map-js": "^1.0.1"8588+ },8589+ "engines": {8590+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",8591+ "npm": ">=7.0.0"8592+ }8593+ },8594+ "node_modules/csso/node_modules/mdn-data": {8595+ "version": "2.0.28",8596+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",8597+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",8598+ "license": "CC0-1.0"8599+ },8600+ "node_modules/csstype": {8601+ "version": "3.2.3",8602+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",8603+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",8604+ "license": "MIT"8605+ },8606+ "node_modules/cytoscape": {8607+ "version": "3.34.3",8608+ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.3.tgz",8609+ "integrity": "sha512-yfYGhRcGAntq6YBD583j4n0Eg3jIxvWmZtz/5uz9UYkeIStSlMxuUja+ec5j3iBD8nv1rwaOAYMW09tBdkSeaQ==",8610+ "license": "MIT",8611+ "engines": {8612+ "node": ">=0.10"8613+ }8614+ },8615+ "node_modules/cytoscape-cose-bilkent": {8616+ "version": "4.1.0",8617+ "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz",8618+ "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==",8619+ "license": "MIT",8620+ "dependencies": {8621+ "cose-base": "^1.0.0"8622+ },8623+ "peerDependencies": {8624+ "cytoscape": "^3.2.0"8625+ }8626+ },8627+ "node_modules/cytoscape-fcose": {8628+ "version": "2.2.0",8629+ "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz",8630+ "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==",8631+ "license": "MIT",8632+ "dependencies": {8633+ "cose-base": "^2.2.0"8634+ },8635+ "peerDependencies": {8636+ "cytoscape": "^3.2.0"8637+ }8638+ },8639+ "node_modules/cytoscape-fcose/node_modules/cose-base": {8640+ "version": "2.2.0",8641+ "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz",8642+ "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==",8643+ "license": "MIT",8644+ "dependencies": {8645+ "layout-base": "^2.0.0"8646+ }8647+ },8648+ "node_modules/cytoscape-fcose/node_modules/layout-base": {8649+ "version": "2.0.1",8650+ "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz",8651+ "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==",8652+ "license": "MIT"8653+ },8654+ "node_modules/d3": {8655+ "version": "7.9.0",8656+ "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz",8657+ "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",8658+ "license": "ISC",8659+ "dependencies": {8660+ "d3-array": "3",8661+ "d3-axis": "3",8662+ "d3-brush": "3",8663+ "d3-chord": "3",8664+ "d3-color": "3",8665+ "d3-contour": "4",8666+ "d3-delaunay": "6",8667+ "d3-dispatch": "3",8668+ "d3-drag": "3",8669+ "d3-dsv": "3",8670+ "d3-ease": "3",8671+ "d3-fetch": "3",8672+ "d3-force": "3",8673+ "d3-format": "3",8674+ "d3-geo": "3",8675+ "d3-hierarchy": "3",8676+ "d3-interpolate": "3",8677+ "d3-path": "3",8678+ "d3-polygon": "3",8679+ "d3-quadtree": "3",8680+ "d3-random": "3",8681+ "d3-scale": "4",8682+ "d3-scale-chromatic": "3",8683+ "d3-selection": "3",8684+ "d3-shape": "3",8685+ "d3-time": "3",8686+ "d3-time-format": "4",8687+ "d3-timer": "3",8688+ "d3-transition": "3",8689+ "d3-zoom": "3"8690+ },8691+ "engines": {8692+ "node": ">=12"8693+ }8694+ },8695+ "node_modules/d3-array": {8696+ "version": "3.2.4",8697+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",8698+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",8699+ "license": "ISC",8700+ "dependencies": {8701+ "internmap": "1 - 2"8702+ },8703+ "engines": {8704+ "node": ">=12"8705+ }8706+ },8707+ "node_modules/d3-axis": {8708+ "version": "3.0.0",8709+ "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",8710+ "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==",8711+ "license": "ISC",8712+ "engines": {8713+ "node": ">=12"8714+ }8715+ },8716+ "node_modules/d3-brush": {8717+ "version": "3.0.0",8718+ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",8719+ "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",8720+ "license": "ISC",8721+ "dependencies": {8722+ "d3-dispatch": "1 - 3",8723+ "d3-drag": "2 - 3",8724+ "d3-interpolate": "1 - 3",8725+ "d3-selection": "3",8726+ "d3-transition": "3"8727+ },8728+ "engines": {8729+ "node": ">=12"8730+ }8731+ },8732+ "node_modules/d3-chord": {8733+ "version": "3.0.1",8734+ "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",8735+ "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",8736+ "license": "ISC",8737+ "dependencies": {8738+ "d3-path": "1 - 3"8739+ },8740+ "engines": {8741+ "node": ">=12"8742+ }8743+ },8744+ "node_modules/d3-color": {8745+ "version": "3.1.0",8746+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",8747+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",8748+ "license": "ISC",8749+ "engines": {8750+ "node": ">=12"8751+ }8752+ },8753+ "node_modules/d3-contour": {8754+ "version": "4.0.2",8755+ "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz",8756+ "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",8757+ "license": "ISC",8758+ "dependencies": {8759+ "d3-array": "^3.2.0"8760+ },8761+ "engines": {8762+ "node": ">=12"8763+ }8764+ },8765+ "node_modules/d3-delaunay": {8766+ "version": "6.0.4",8767+ "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz",8768+ "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",8769+ "license": "ISC",8770+ "dependencies": {8771+ "delaunator": "5"8772+ },8773+ "engines": {8774+ "node": ">=12"8775+ }8776+ },8777+ "node_modules/d3-dispatch": {8778+ "version": "3.0.1",8779+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",8780+ "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",8781+ "license": "ISC",8782+ "engines": {8783+ "node": ">=12"8784+ }8785+ },8786+ "node_modules/d3-drag": {8787+ "version": "3.0.0",8788+ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",8789+ "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",8790+ "license": "ISC",8791+ "dependencies": {8792+ "d3-dispatch": "1 - 3",8793+ "d3-selection": "3"8794+ },8795+ "engines": {8796+ "node": ">=12"8797+ }8798+ },8799+ "node_modules/d3-dsv": {8800+ "version": "3.0.1",8801+ "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",8802+ "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",8803+ "license": "ISC",8804+ "dependencies": {8805+ "commander": "7",8806+ "iconv-lite": "0.6",8807+ "rw": "1"8808+ },8809+ "bin": {8810+ "csv2json": "bin/dsv2json.js",8811+ "csv2tsv": "bin/dsv2dsv.js",8812+ "dsv2dsv": "bin/dsv2dsv.js",8813+ "dsv2json": "bin/dsv2json.js",8814+ "json2csv": "bin/json2dsv.js",8815+ "json2dsv": "bin/json2dsv.js",8816+ "json2tsv": "bin/json2dsv.js",8817+ "tsv2csv": "bin/dsv2dsv.js",8818+ "tsv2json": "bin/dsv2json.js"8819+ },8820+ "engines": {8821+ "node": ">=12"8822+ }8823+ },8824+ "node_modules/d3-dsv/node_modules/commander": {8825+ "version": "7.2.0",8826+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",8827+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",8828+ "license": "MIT",8829+ "engines": {8830+ "node": ">= 10"8831+ }8832+ },8833+ "node_modules/d3-dsv/node_modules/iconv-lite": {8834+ "version": "0.6.3",8835+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",8836+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",8837+ "license": "MIT",8838+ "dependencies": {8839+ "safer-buffer": ">= 2.1.2 < 3.0.0"8840+ },8841+ "engines": {8842+ "node": ">=0.10.0"8843+ }8844+ },8845+ "node_modules/d3-ease": {8846+ "version": "3.0.1",8847+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",8848+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",8849+ "license": "BSD-3-Clause",8850+ "engines": {8851+ "node": ">=12"8852+ }8853+ },8854+ "node_modules/d3-fetch": {8855+ "version": "3.0.1",8856+ "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",8857+ "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",8858+ "license": "ISC",8859+ "dependencies": {8860+ "d3-dsv": "1 - 3"8861+ },8862+ "engines": {8863+ "node": ">=12"8864+ }8865+ },8866+ "node_modules/d3-force": {8867+ "version": "3.0.0",8868+ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",8869+ "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",8870+ "license": "ISC",8871+ "dependencies": {8872+ "d3-dispatch": "1 - 3",8873+ "d3-quadtree": "1 - 3",8874+ "d3-timer": "1 - 3"8875+ },8876+ "engines": {8877+ "node": ">=12"8878+ }8879+ },8880+ "node_modules/d3-format": {8881+ "version": "3.1.2",8882+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz",8883+ "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==",8884+ "license": "ISC",8885+ "engines": {8886+ "node": ">=12"8887+ }8888+ },8889+ "node_modules/d3-geo": {8890+ "version": "3.1.1",8891+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz",8892+ "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==",8893+ "license": "ISC",8894+ "dependencies": {8895+ "d3-array": "2.5.0 - 3"8896+ },8897+ "engines": {8898+ "node": ">=12"8899+ }8900+ },8901+ "node_modules/d3-hierarchy": {8902+ "version": "3.1.2",8903+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",8904+ "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",8905+ "license": "ISC",8906+ "engines": {8907+ "node": ">=12"8908+ }8909+ },8910+ "node_modules/d3-interpolate": {8911+ "version": "3.0.1",8912+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",8913+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",8914+ "license": "ISC",8915+ "dependencies": {8916+ "d3-color": "1 - 3"8917+ },8918+ "engines": {8919+ "node": ">=12"8920+ }8921+ },8922+ "node_modules/d3-path": {8923+ "version": "3.1.0",8924+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",8925+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",8926+ "license": "ISC",8927+ "engines": {8928+ "node": ">=12"8929+ }8930+ },8931+ "node_modules/d3-polygon": {8932+ "version": "3.0.1",8933+ "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",8934+ "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",8935+ "license": "ISC",8936+ "engines": {8937+ "node": ">=12"8938+ }8939+ },8940+ "node_modules/d3-quadtree": {8941+ "version": "3.0.1",8942+ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",8943+ "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",8944+ "license": "ISC",8945+ "engines": {8946+ "node": ">=12"8947+ }8948+ },8949+ "node_modules/d3-random": {8950+ "version": "3.0.1",8951+ "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",8952+ "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",8953+ "license": "ISC",8954+ "engines": {8955+ "node": ">=12"8956+ }8957+ },8958+ "node_modules/d3-sankey": {8959+ "version": "0.12.3",8960+ "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz",8961+ "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==",8962+ "license": "BSD-3-Clause",8963+ "dependencies": {8964+ "d3-array": "1 - 2",8965+ "d3-shape": "^1.2.0"8966+ }8967+ },8968+ "node_modules/d3-sankey/node_modules/d3-array": {8969+ "version": "2.12.1",8970+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz",8971+ "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==",8972+ "license": "BSD-3-Clause",8973+ "dependencies": {8974+ "internmap": "^1.0.0"8975+ }8976+ },8977+ "node_modules/d3-sankey/node_modules/d3-path": {8978+ "version": "1.0.9",8979+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",8980+ "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==",8981+ "license": "BSD-3-Clause"8982+ },8983+ "node_modules/d3-sankey/node_modules/d3-shape": {8984+ "version": "1.3.7",8985+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",8986+ "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",8987+ "license": "BSD-3-Clause",8988+ "dependencies": {8989+ "d3-path": "1"8990+ }8991+ },8992+ "node_modules/d3-sankey/node_modules/internmap": {8993+ "version": "1.0.1",8994+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz",8995+ "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==",8996+ "license": "ISC"8997+ },8998+ "node_modules/d3-scale": {8999+ "version": "4.0.2",9000+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",9001+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",9002+ "license": "ISC",9003+ "dependencies": {9004+ "d3-array": "2.10.0 - 3",9005+ "d3-format": "1 - 3",9006+ "d3-interpolate": "1.2.0 - 3",9007+ "d3-time": "2.1.1 - 3",9008+ "d3-time-format": "2 - 4"80509009 },80519010 "engines": {8052- "node": ">=4"9011+ "node": ">=12"80539012 }80549013 },8055- "node_modules/cssnano": {8056- "version": "6.1.2",8057- "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz",8058- "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==",8059- "license": "MIT",9014+ "node_modules/d3-scale-chromatic": {9015+ "version": "3.1.0",9016+ "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",9017+ "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",9018+ "license": "ISC",80609019 "dependencies": {8061- "cssnano-preset-default": "^6.1.2",8062- "lilconfig": "^3.1.1"9020+ "d3-color": "1 - 3",9021+ "d3-interpolate": "1 - 3"80639022 },80649023 "engines": {8065- "node": "^14 || ^16 || >=18.0"8066- },8067- "funding": {8068- "type": "opencollective",8069- "url": "https://opencollective.com/cssnano"8070- },8071- "peerDependencies": {8072- "postcss": "^8.4.31"9024+ "node": ">=12"80739025 }80749026 },8075- "node_modules/cssnano-preset-advanced": {8076- "version": "6.1.2",8077- "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz",8078- "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==",8079- "license": "MIT",9027+ "node_modules/d3-selection": {9028+ "version": "3.0.0",9029+ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",9030+ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",9031+ "license": "ISC",9032+ "engines": {9033+ "node": ">=12"9034+ }9035+ },9036+ "node_modules/d3-shape": {9037+ "version": "3.2.0",9038+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",9039+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",9040+ "license": "ISC",80809041 "dependencies": {8081- "autoprefixer": "^10.4.19",8082- "browserslist": "^4.23.0",8083- "cssnano-preset-default": "^6.1.2",8084- "postcss-discard-unused": "^6.0.5",8085- "postcss-merge-idents": "^6.0.3",8086- "postcss-reduce-idents": "^6.0.3",8087- "postcss-zindex": "^6.0.2"9042+ "d3-path": "^3.1.0"80889043 },80899044 "engines": {8090- "node": "^14 || ^16 || >=18.0"8091- },8092- "peerDependencies": {8093- "postcss": "^8.4.31"9045+ "node": ">=12"80949046 }80959047 },8096- "node_modules/cssnano-preset-default": {8097- "version": "6.1.2",8098- "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz",8099- "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==",8100- "license": "MIT",9048+ "node_modules/d3-time": {9049+ "version": "3.1.0",9050+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",9051+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",9052+ "license": "ISC",81019053 "dependencies": {8102- "browserslist": "^4.23.0",8103- "css-declaration-sorter": "^7.2.0",8104- "cssnano-utils": "^4.0.2",8105- "postcss-calc": "^9.0.1",8106- "postcss-colormin": "^6.1.0",8107- "postcss-convert-values": "^6.1.0",8108- "postcss-discard-comments": "^6.0.2",8109- "postcss-discard-duplicates": "^6.0.3",8110- "postcss-discard-empty": "^6.0.3",8111- "postcss-discard-overridden": "^6.0.2",8112- "postcss-merge-longhand": "^6.0.5",8113- "postcss-merge-rules": "^6.1.1",8114- "postcss-minify-font-values": "^6.1.0",8115- "postcss-minify-gradients": "^6.0.3",8116- "postcss-minify-params": "^6.1.0",8117- "postcss-minify-selectors": "^6.0.4",8118- "postcss-normalize-charset": "^6.0.2",8119- "postcss-normalize-display-values": "^6.0.2",8120- "postcss-normalize-positions": "^6.0.2",8121- "postcss-normalize-repeat-style": "^6.0.2",8122- "postcss-normalize-string": "^6.0.2",8123- "postcss-normalize-timing-functions": "^6.0.2",8124- "postcss-normalize-unicode": "^6.1.0",8125- "postcss-normalize-url": "^6.0.2",8126- "postcss-normalize-whitespace": "^6.0.2",8127- "postcss-ordered-values": "^6.0.2",8128- "postcss-reduce-initial": "^6.1.0",8129- "postcss-reduce-transforms": "^6.0.2",8130- "postcss-svgo": "^6.0.3",8131- "postcss-unique-selectors": "^6.0.4"9054+ "d3-array": "2 - 3"81329055 },81339056 "engines": {8134- "node": "^14 || ^16 || >=18.0"9057+ "node": ">=12"9058+ }9059+ },9060+ "node_modules/d3-time-format": {9061+ "version": "4.1.0",9062+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",9063+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",9064+ "license": "ISC",9065+ "dependencies": {9066+ "d3-time": "1 - 3"81359067 },8136- "peerDependencies": {8137- "postcss": "^8.4.31"9068+ "engines": {9069+ "node": ">=12"81389070 }81399071 },8140- "node_modules/cssnano-utils": {8141- "version": "4.0.2",8142- "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz",8143- "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==",8144- "license": "MIT",9072+ "node_modules/d3-timer": {9073+ "version": "3.0.1",9074+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",9075+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",9076+ "license": "ISC",81459077 "engines": {8146- "node": "^14 || ^16 || >=18.0"8147- },8148- "peerDependencies": {8149- "postcss": "^8.4.31"9078+ "node": ">=12"81509079 }81519080 },8152- "node_modules/csso": {8153- "version": "5.0.5",8154- "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",8155- "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",8156- "license": "MIT",9081+ "node_modules/d3-transition": {9082+ "version": "3.0.1",9083+ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",9084+ "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",9085+ "license": "ISC",81579086 "dependencies": {8158- "css-tree": "~2.2.0"9087+ "d3-color": "1 - 3",9088+ "d3-dispatch": "1 - 3",9089+ "d3-ease": "1 - 3",9090+ "d3-interpolate": "1 - 3",9091+ "d3-timer": "1 - 3"81599092 },81609093 "engines": {8161- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",8162- "npm": ">=7.0.0"9094+ "node": ">=12"9095+ },9096+ "peerDependencies": {9097+ "d3-selection": "2 - 3"81639098 }81649099 },8165- "node_modules/csso/node_modules/css-tree": {8166- "version": "2.2.1",8167- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",8168- "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",8169- "license": "MIT",9100+ "node_modules/d3-zoom": {9101+ "version": "3.0.0",9102+ "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",9103+ "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",9104+ "license": "ISC",81709105 "dependencies": {8171- "mdn-data": "2.0.28",8172- "source-map-js": "^1.0.1"9106+ "d3-dispatch": "1 - 3",9107+ "d3-drag": "2 - 3",9108+ "d3-interpolate": "1 - 3",9109+ "d3-selection": "2 - 3",9110+ "d3-transition": "2 - 3"81739111 },81749112 "engines": {8175- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",8176- "npm": ">=7.0.0"9113+ "node": ">=12"81779114 }81789115 },8179- "node_modules/csso/node_modules/mdn-data": {8180- "version": "2.0.28",8181- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",8182- "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",8183- "license": "CC0-1.0"9116+ "node_modules/dagre-d3-es": {9117+ "version": "7.0.14",9118+ "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz",9119+ "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==",9120+ "license": "MIT",9121+ "dependencies": {9122+ "d3": "^7.9.0",9123+ "lodash-es": "^4.17.21"9124+ }81849125 },8185- "node_modules/csstype": {8186- "version": "3.2.3",8187- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",8188- "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",9126+ "node_modules/dayjs": {9127+ "version": "1.11.23",9128+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz",9129+ "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==",81899130 "license": "MIT"81909131 },81919132 "node_modules/debounce": {@@ -8349,6 +9290,15 @@
83499290 "url": "https://github.com/sponsors/ljharb"83509291 }83519292 },9293+ "node_modules/delaunator": {9294+ "version": "5.1.0",9295+ "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz",9296+ "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==",9297+ "license": "ISC",9298+ "dependencies": {9299+ "robust-predicates": "^3.0.2"9300+ }9301+ },83529302 "node_modules/depd": {83539303 "version": "2.0.0",83549304 "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",@@ -8486,6 +9436,15 @@
84869436 "url": "https://github.com/fb55/domhandler?sponsor=1"84879437 }84889438 },9439+ "node_modules/dompurify": {9440+ "version": "3.4.16",9441+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.16.tgz",9442+ "integrity": "sha512-sqo+pNp3qRhCIpbgRi1y8Tgk27Bo2Ry7w0dC1NBeNTdZChWjz9Xb/KOoZbRP/R6pQZ80Qw8YhXw13hWWBbMRnQ==",9443+ "license": "(MPL-2.0 OR Apache-2.0)",9444+ "optionalDependencies": {9445+ "@types/trusted-types": "^2.0.7"9446+ }9447+ },84899448 "node_modules/domutils": {84909449 "version": "3.2.2",84919450 "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",@@ -8572,6 +9531,12 @@
85729531 "integrity": "sha512-SghDzqdJokdz8zP8YNlvS74+CwLRoUPDGvP/gFA+HrKVw+pOshUAgx8pXR37xl/u16zGae746rFNWvZ/22kU2Q==",85739532 "license": "ISC"85749533 },9534+ "node_modules/elkjs": {9535+ "version": "0.9.3",9536+ "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz",9537+ "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==",9538+ "license": "EPL-2.0"9539+ },85759540 "node_modules/emoji-regex": {85769541 "version": "9.2.2",85779542 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",@@ -8707,6 +9672,18 @@
87079672 "node": ">= 0.4"87089673 }87099674 },9675+ "node_modules/es-toolkit": {9676+ "version": "1.52.0",9677+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.52.0.tgz",9678+ "integrity": "sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==",9679+ "license": "MIT",9680+ "workspaces": [9681+ "docs",9682+ "benchmarks",9683+ "tests/types",9684+ "tests/browser-compat"9685+ ]9686+ },87109687 "node_modules/esast-util-from-estree": {87119688 "version": "2.0.0",87129689 "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz",@@ -9620,6 +10597,12 @@
962010597 "url": "https://github.com/sponsors/sindresorhus"962110598 }962210599 },10600+ "node_modules/hachure-fill": {10601+ "version": "0.5.2",10602+ "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz",10603+ "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==",10604+ "license": "MIT"10605+ },962310606 "node_modules/handle-thing": {962410607 "version": "2.0.1",962510608 "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",@@ -10259,6 +11242,16 @@
1025911242 "node": ">=8"1026011243 }1026111244 },11245+ "node_modules/import-meta-resolve": {11246+ "version": "4.2.0",11247+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz",11248+ "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==",11249+ "license": "MIT",11250+ "funding": {11251+ "type": "github",11252+ "url": "https://github.com/sponsors/wooorm"11253+ }11254+ },1026211255 "node_modules/imurmurhash": {1026311256 "version": "0.1.4",1026411257 "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",@@ -10307,6 +11300,15 @@
1030711300 "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",1030811301 "license": "MIT"1030911302 },11303+ "node_modules/internmap": {11304+ "version": "2.0.3",11305+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",11306+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",11307+ "license": "ISC",11308+ "engines": {11309+ "node": ">=12"11310+ }11311+ },1031011312 "node_modules/invariant": {1031111313 "version": "2.2.4",1031211314 "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",@@ -10812,6 +11814,31 @@
1081211814 "graceful-fs": "^4.1.6"1081311815 }1081411816 },11817+ "node_modules/katex": {11818+ "version": "0.16.47",11819+ "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz",11820+ "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==",11821+ "funding": [11822+ "https://opencollective.com/katex",11823+ "https://github.com/sponsors/katex"11824+ ],11825+ "license": "MIT",11826+ "dependencies": {11827+ "commander": "^8.3.0"11828+ },11829+ "bin": {11830+ "katex": "cli.js"11831+ }11832+ },11833+ "node_modules/katex/node_modules/commander": {11834+ "version": "8.3.0",11835+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",11836+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",11837+ "license": "MIT",11838+ "engines": {11839+ "node": ">= 12"11840+ }11841+ },1081511842 "node_modules/keyv": {1081611843 "version": "4.5.4",1081711844 "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",@@ -10821,6 +11848,11 @@
1082111848 "json-buffer": "3.0.1"1082211849 }1082311850 },11851+ "node_modules/khroma": {11852+ "version": "2.1.0",11853+ "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz",11854+ "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="11855+ },1082411856 "node_modules/kind-of": {1082511857 "version": "6.0.3",1082611858 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",@@ -10873,6 +11905,12 @@
1087311905 "shell-quote": "^1.8.4"1087411906 }1087511907 },11908+ "node_modules/layout-base": {11909+ "version": "1.0.2",11910+ "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz",11911+ "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==",11912+ "license": "MIT"11913+ },1087611914 "node_modules/leven": {1087711915 "version": "3.1.0",1087811916 "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",@@ -10935,6 +11973,12 @@
1093511973 "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",1093611974 "license": "MIT"1093711975 },11976+ "node_modules/lodash-es": {11977+ "version": "4.17.23",11978+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz",11979+ "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==",11980+ "license": "MIT"11981+ },1093811982 "node_modules/lodash.debounce": {1093911983 "version": "4.0.8",1094011984 "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",@@ -11045,6 +12089,18 @@
1104512089 "url": "https://github.com/sponsors/wooorm"1104612090 }1104712091 },12092+ "node_modules/marked": {12093+ "version": "16.4.2",12094+ "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz",12095+ "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==",12096+ "license": "MIT",12097+ "bin": {12098+ "marked": "bin/marked.js"12099+ },12100+ "engines": {12101+ "node": ">= 20"12102+ }12103+ },1104812104 "node_modules/math-intrinsics": {1104912105 "version": "1.1.0",1105012106 "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",@@ -11559,6 +12615,53 @@
1155912615 "node": ">= 8"1156012616 }1156112617 },12618+ "node_modules/mermaid": {12619+ "version": "12.0.0",12620+ "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-12.0.0.tgz",12621+ "integrity": "sha512-/wQXC9iBxoGV8p3erbvaXs9h77VyLDBH6GdayVjj3hEcSQhFU4N1WUhUppotCEqlIxI2pRMwjwBSwTB1MfZBgQ==",12622+ "license": "MIT",12623+ "dependencies": {12624+ "@braintree/sanitize-url": "^7.1.2",12625+ "@iconify/utils": "^3.0.2",12626+ "@mermaid-js/parser": "^2.0.0",12627+ "@types/d3": "^7.4.3",12628+ "@upsetjs/venn.js": "^2.0.0",12629+ "chevrotain": "~11.1.2",12630+ "cytoscape": "^3.34.0",12631+ "cytoscape-cose-bilkent": "^4.1.0",12632+ "cytoscape-fcose": "^2.2.0",12633+ "d3": "^7.9.0",12634+ "d3-sankey": "^0.12.3",12635+ "dagre-d3-es": "7.0.14",12636+ "dayjs": "^1.11.21",12637+ "dompurify": "^3.4.12",12638+ "elkjs": "^0.9.3",12639+ "es-toolkit": "^1.45.1",12640+ "katex": "^0.16.47",12641+ "khroma": "^2.1.0",12642+ "marked": "^16.3.0",12643+ "roughjs": "^4.6.6",12644+ "stylis": "^4.3.6",12645+ "ts-dedent": "^2.2.0",12646+ "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0"12647+ },12648+ "engines": {12649+ "node": ">=22.12.0"12650+ }12651+ },12652+ "node_modules/mermaid/node_modules/uuid": {12653+ "version": "14.0.2",12654+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz",12655+ "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==",12656+ "funding": [12657+ "https://github.com/sponsors/broofa",12658+ "https://github.com/sponsors/ctavan"12659+ ],12660+ "license": "MIT",12661+ "bin": {12662+ "uuid": "dist-node/bin/uuid"12663+ }12664+ },1156212665 "node_modules/methods": {1156312666 "version": "1.1.2",1156412667 "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",@@ -14041,6 +15144,12 @@
1404115144 "url": "https://github.com/sponsors/sindresorhus"1404215145 }1404315146 },15147+ "node_modules/package-manager-detector": {15148+ "version": "1.8.0",15149+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz",15150+ "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==",15151+ "license": "MIT"15152+ },1404415153 "node_modules/param-case": {1404515154 "version": "3.0.4",1404615155 "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",@@ -14180,6 +15289,12 @@
1418015289 "tslib": "^2.0.3"1418115290 }1418215291 },15292+ "node_modules/path-data-parser": {15293+ "version": "0.1.0",15294+ "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz",15295+ "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==",15296+ "license": "MIT"15297+ },1418315298 "node_modules/path-exists": {1418415299 "version": "5.0.0",1418515300 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",@@ -14281,6 +15396,22 @@
1428115396 "node": ">=16.0.0"1428215397 }1428315398 },15399+ "node_modules/points-on-curve": {15400+ "version": "0.2.0",15401+ "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz",15402+ "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==",15403+ "license": "MIT"15404+ },15405+ "node_modules/points-on-path": {15406+ "version": "0.2.1",15407+ "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz",15408+ "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==",15409+ "license": "MIT",15410+ "dependencies": {15411+ "path-data-parser": "0.1.0",15412+ "points-on-curve": "0.2.0"15413+ }15414+ },1428415415 "node_modules/postcss": {1428515416 "version": "8.5.28",1428615417 "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz",@@ -16707,6 +17838,24 @@
1670717838 "node": ">=0.10.0"1670817839 }1670917840 },17841+ "node_modules/robust-predicates": {17842+ "version": "3.0.3",17843+ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz",17844+ "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==",17845+ "license": "Unlicense"17846+ },17847+ "node_modules/roughjs": {17848+ "version": "4.6.6",17849+ "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz",17850+ "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==",17851+ "license": "MIT",17852+ "dependencies": {17853+ "hachure-fill": "^0.5.2",17854+ "path-data-parser": "^0.1.0",17855+ "points-on-curve": "^0.2.0",17856+ "points-on-path": "^0.2.1"17857+ }17858+ },1671017859 "node_modules/rtlcss": {1671117860 "version": "4.3.0",1671217861 "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz",@@ -16760,6 +17909,12 @@
1676017909 "queue-microtask": "^1.2.2"1676117910 }1676217911 },17912+ "node_modules/rw": {17913+ "version": "1.3.3",17914+ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",17915+ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",17916+ "license": "BSD-3-Clause"17917+ },1676317918 "node_modules/safe-buffer": {1676417919 "version": "5.2.1",1676517920 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",@@ -17586,6 +18741,12 @@
1758618741 "postcss": "^8.4.31"1758718742 }1758818743 },18744+ "node_modules/stylis": {18745+ "version": "4.4.0",18746+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz",18747+ "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==",18748+ "license": "MIT"18749+ },1758918750 "node_modules/supports-color": {1759018751 "version": "7.2.0",1759118752 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",@@ -17813,6 +18974,15 @@
1781318974 "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==",1781418975 "license": "MIT"1781518976 },18977+ "node_modules/tinyexec": {18978+ "version": "1.3.1",18979+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz",18980+ "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==",18981+ "license": "MIT",18982+ "engines": {18983+ "node": ">=18"18984+ }18985+ },1781618986 "node_modules/tinypool": {1781718987 "version": "1.1.1",1781818988 "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",@@ -17888,6 +19058,15 @@
1788819058 "url": "https://github.com/sponsors/wooorm"1788919059 }1789019060 },19061+ "node_modules/ts-dedent": {19062+ "version": "2.3.0",19063+ "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz",19064+ "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==",19065+ "license": "MIT",19066+ "engines": {19067+ "node": ">=6.10"19068+ }19069+ },1789119070 "node_modules/tslib": {1789219071 "version": "2.8.1",1789319072 "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",@@ -13,6 +13,7 @@
1313 "@docusaurus/core": "3.10.2",1414 "@docusaurus/plugin-client-redirects": "3.10.2",1515 "@docusaurus/preset-classic": "3.10.2",16+ "@docusaurus/theme-mermaid": "3.10.2",1617 "@easyops-cn/docusaurus-search-local": "0.55.3",1718 "@fontsource/ibm-plex-mono": "5.3.0",1819 "@fontsource/ibm-plex-sans": "5.3.0",@@ -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,190 @@
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, useState, 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+ const palette = readPalette();129+ // The font is also set outside the theme: diagrams that size boxes130+ // by measuring their text (sequence diagrams) measure it in these,131+ // and text measured in another font overflows its box.132+ return {133+ startOnLoad: false,134+ theme: 'base',135+ fontFamily: palette['font-mono'],136+ fontSize: 14,137+ themeVariables: themeVariables(palette, mode === 'dark'),138+ flowchart: {curve: 'linear', htmlLabels: true},139+ } as MermaidConfig;140+ }, [mode]);141+}142+143+function MermaidRenderResult({renderResult}: {renderResult: RenderResult}): ReactNode {144+ const ref = useRef<HTMLDivElement>(null);145+ useEffect(() => {146+ if (ref.current) {147+ renderResult.bindFunctions?.(ref.current);148+ }149+ }, [renderResult]);150+ return (151+ <div152+ ref={ref}153+ className={`${MermaidContainerClassName} mermaid-012`}154+ // eslint-disable-next-line react/no-danger155+ dangerouslySetInnerHTML={{__html: renderResult.svg}}156+ />157+ );158+}159+160+function MermaidRenderer({value}: Props): ReactNode {161+ const config = useMermaidConfig();162+ const renderResult = useMermaidRenderResult({text: value, config});163+ if (renderResult === null) {164+ return null;165+ }166+ return <MermaidRenderResult renderResult={renderResult} />;167+}168+169+// Mermaid sizes boxes by measuring their text, so it draws once the170+// site's fonts have loaded; measured in a fallback font, text overflows.171+function useFontsReady(): boolean {172+ const [ready, setReady] = useState(false);173+ useEffect(() => {174+ let live = true;175+ document.fonts.ready.then(() => live && setReady(true));176+ return () => {177+ live = false;178+ };179+ }, []);180+ return ready;181+}182+183+export default function Mermaid(props: Props): ReactNode {184+ const ready = useFontsReady();185+ return (186+ <ErrorBoundary fallback={(params) => <ErrorBoundaryErrorMessageFallback {...params} />}>187+ {ready && <MermaidRenderer {...props} />}188+ </ErrorBoundary>189+ );190+}