cat / 012
clone

a spreadsheet for the terminal: lotus 1-2-3 looks, google sheets keys and formulas, one go binary

Docs: Mermaid diagrams on the site and in place of ASCII art

Dami committed 1f8d902
The site draws mermaid code blocks with @docusaurus/theme-mermaid 3.10.2,
through a swizzled Mermaid component that reads 012's palette from
custom.css for the color mode shown (base theme, IBM Plex Mono, square
flat boxes), keyed on the page's data-theme so a light page doesn't
render each diagram twice while it hydrates.

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