cat / 012
clone

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

Merge branch 'main'

Dami committed 41fea2f
commit
41fea2f93a7252a37478e2e8b68056be7693c40d
parent
f053732168141bfc55d0a9fc1932f6157fa4a729
parent
5dd6d4c1d92c4f46a6852792283869b745bcade3
author
Dami <dami.etoile@gmail.com>
13 files changed, +1783 -180
MCLAUDE.md4+
Mdocs/contributing/architecture.md210+++-
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.tsx190++++
M CLAUDE.md +4 -0
M docs/contributing/architecture.md +152 -58
@@ -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
M docs/contributing/releasing.md +15 -0
M docs/contributing/site.md +24 -0
@@ -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.
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
@@ -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",
M website/package.json +1 -0
M website/src/css/custom.css +15 -0
A website/src/theme/Mermaid/index.tsx +190 -0
@@ -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+}