This is an automated email from the ASF dual-hosted git repository.
pierrejeambrun pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 154bfd5b9bf UI: Improve doc_md rendering in Dag Documentation (#66809)
154bfd5b9bf is described below
commit 154bfd5b9bf12702cb9e7164d146069fa4e06d0a
Author: Minyeob Kim <[email protected]>
AuthorDate: Tue Jun 30 01:41:23 2026 +0900
UI: Improve doc_md rendering in Dag Documentation (#66809)
* UI: Improve markdown rendering with code highlighting, math, and diagrams
- Fix inline code rendering to properly handle single backtick snippets
- Add syntax highlighting, line numbers, and copy buttons to code blocks
- Core support for LaTeX math expressions using KaTeX (inline and display)
- Integrate Mermaid.js to render diagrams directly from markdown blocks
* UI: Add horizontal scroll for code blocks and fix container overflow
* Fix markdown code block language parsing for hyphenated identifiers
Co-authored-by: Copilot Autofix powered by AI
<[email protected]>
* UI: Apply markdown review feedback and fix FAB compat CI
Copilot follow-ups
- Lazy-load Mermaid so markdown rendering only pulls it in when Mermaid
blocks are rendered
- Reuse existing i18n clipboard labels in markdown block actions instead of
hard-coded JSX strings
- Replace the Mermaid loading text with a spinner-only state and remove the
redundant jest-dom test import
Compat 3.0.6 fix
- Pin pyjwt>=2.11.0 in providers/fab so compat installs paired with Airflow
3.0.6 do not fall back to PyJWT 2.10.1
- Fix flask_jwt_extended imports that expect jwt.types.Options during FAB
and Google provider test setup
- Keep the FAB wheel metadata aligned with the dependency floor already
required by current airflow-core
Validation
- Pass targeted eslint, vitest, and UI build checks for the markdown
rendering changes
- Reproduce the FAB compat install sequence locally and confirm the failing
import path is restored
* UI: Fix markdown test typing and sync FAB provider docs
- add jest-dom type support for ReactMarkdown tests so UI static checks use
the current matcher types
- keep the markdown UI files in the formatter output expected by the UI
lint/type hook
- sync FAB provider docs with the existing pyjwt>=2.11.0 dependency used
for compat coverage
- use origin/main as the correct baseline for branch-only pre-commit checks
* Remove direct PyJWT dependency from FAB provider
* UI: Restore PrismLight and fix markdown code block framing
- revert the markdown syntax highlighter back to PrismLight with selective
language registration
- simplify language resolution to only allow explicitly registered languages
- apply the Prism pre styling to the outer code block container
- remove inherited margin and border radius that caused background bleed in
the documentation modal
* UI: Reduce markdown rendering tests to smoke coverage
- trim ReactMarkdown tests down to a minimal smoke-test set
- keep basic math integration coverage
- keep mermaid render failure fallback coverage
- drop broader layout and highlighting assertions that were not essential
to preserve
* UI: Drop inline markdown math and lazy-load KaTeX
- disable single-dollar inline math parsing to avoid breaking plain dollar
text
- keep display math support for `$$...$$` blocks
- remove the global KaTeX stylesheet import from the app entrypoint
- load KaTeX styles only when markdown content needs math rendering
* docs: Add third-party license notices for markdown deps
- update `airflow-core/LICENSE` for the newly bundled markdown-rendering UI
dependencies
- add MIT license texts for `katex`, `mermaid`, `rehype-katex`, and
`remark-math`
- follow the existing `airflow-core/3rd-party-licenses` convention used for
bundled UI packages
* fix: restore Link component props and align with library contract
- restore Link components required props (href/children) to match main
branch
- isolate optional handling to the react-markdown adapter boundary
- handle invalid links by rendering children directly without a Link wrapper
* Update airflow-core/src/airflow/ui/src/components/ReactMarkdownBlocks.tsx
Co-authored-by: Brent Bovenzi <[email protected]>
* Update airflow-core/src/airflow/ui/src/components/ReactMarkdown.tsx
Co-authored-by: Brent Bovenzi <[email protected]>
* UI: Simplify ReactMarkdown code rendering helpers
Rename the inline code renderer for clarity, simplify markdown text
extraction,
and remove the one-off mermaid label variable.
* UI: Move markdown Mermaid rendering into provider
* fix: Rename KatexStyleLoader to PascalCase and update imports
* UI: Remove redundant syntax language resolution logic
- Delete unnecessary `resolveSyntaxLanguage` helper from
`syntaxHighlighter.ts`
- Simplify code block rendering by passing raw language strings to Prism
* chore: remove pnpm.minimumReleaseAge
* remove extractText & extractTextContent in ReactMarkdown
Co-authored-by: Brent Bovenzi <[email protected]>
* UI: Simplify MermaidProvider by removing redundant hooks and state
tracking
- Remove `useCallback`/`useMemo` — `babel-plugin-react-compiler` handles
memoization automatically via `reactCompilerPreset()`
- Remove `useState`/`useRef`/`useEffect` theme-tracking chain and the
separate `initializeMermaid` function; `mermaid.initialize()` is called
directly in `renderDiagram` on every invocation instead
* fix typeof guards in `ReactMarkdown` to resolve no-base-to-string lint
error
* restore pnpm minimumReleaseAge setting
* UI: Fix markdown override behavior and Mermaid initialization
* remove 3rd party licenses for markdown rendering
* UI: Move Mermaid markdown rendering from context provider to util
* Docs: Add documentation hints for Markdown rendering support in the
tutorial Task docs example
* remove example_markdown_doc Dag
* Update airflow-core/src/airflow/ui/src/components/ReactMarkdownBlocks.tsx
Co-authored-by: Pierre Jeambrun <[email protected]>
* UI: Render markdown math from fenced code blocks
Use ```math fenced blocks for KaTeX rendering in the markdown UI instead of
detecting $$ delimiters in raw markdown text.
This keeps fenced block handling in the dedicated block renderer, avoids
ambiguous $$ detection, preserves the existing Mermaid block flow, and
updates
the tutorial and docs to describe the supported Markdown syntax accurately.
* docs: Update task_doc_md images
---------
Co-authored-by: Copilot Autofix powered by AI
<[email protected]>
Co-authored-by: Brent Bovenzi <[email protected]>
Co-authored-by: Pierre Jeambrun <[email protected]>
---
airflow-core/docs/core-concepts/dags.rst | 1 +
airflow-core/docs/img/ui-dark/dag_doc_md.png | Bin 0 -> 390734 bytes
airflow-core/docs/img/ui-dark/task_doc_md.png | Bin 0 -> 646679 bytes
airflow-core/docs/img/ui-light/dag_doc_md.png | Bin 0 -> 384286 bytes
airflow-core/docs/img/ui-light/task_doc_md.png | Bin 0 -> 715701 bytes
airflow-core/docs/tutorial/fundamentals.rst | 17 +-
airflow-core/src/airflow/example_dags/tutorial.py | 33 +-
airflow-core/src/airflow/ui/package.json | 4 +
airflow-core/src/airflow/ui/pnpm-lock.yaml | 837 +++++++++++++++++++++
.../airflow/ui/src/components/KatexStyleLoader.ts | 31 +
.../ui/src/components/ReactMarkdown.test.tsx | 98 +++
.../airflow/ui/src/components/ReactMarkdown.tsx | 176 +++--
.../ui/src/components/ReactMarkdownBlocks.tsx | 281 +++++++
.../src/airflow/ui/src/utils/renderMermaid.ts | 47 ++
.../src/airflow/ui/src/utils/syntaxHighlighter.ts | 4 +-
15 files changed, 1439 insertions(+), 90 deletions(-)
diff --git a/airflow-core/docs/core-concepts/dags.rst
b/airflow-core/docs/core-concepts/dags.rst
index cf7d6ee4716..91796b1bbca 100644
--- a/airflow-core/docs/core-concepts/dags.rst
+++ b/airflow-core/docs/core-concepts/dags.rst
@@ -674,6 +674,7 @@ doc_rst reStructuredText
========== ================
Please note that for Dags and TaskGroups, ``doc_md`` is the only attribute
interpreted. It can contain a string or the reference to a markdown file.
Markdown files are recognized by str ending in ``.md``.
+Dag documentation is rendered as Markdown, so fenced code blocks, tables, and
other common Markdown constructs are supported. Fenced code blocks whose
language is ``math`` are rendered with KaTeX, and Mermaid diagrams are rendered
from fenced code blocks whose language is ``mermaid``.
If a relative path is supplied it will be loaded from the path relative to
which the Airflow Scheduler or Dag parser was started. If the markdown file
does not exist, the passed filename will be used as text, no exception will be
displayed. Note that the markdown file is loaded during Dag parsing, changes to
the markdown content take one Dag parsing cycle to have changes be displayed.
This is especially useful if your tasks are built dynamically from
configuration files, as it allows you to expose the configuration that led to
the related tasks in Airflow:
diff --git a/airflow-core/docs/img/ui-dark/dag_doc_md.png
b/airflow-core/docs/img/ui-dark/dag_doc_md.png
new file mode 100644
index 00000000000..4234af9d936
Binary files /dev/null and b/airflow-core/docs/img/ui-dark/dag_doc_md.png differ
diff --git a/airflow-core/docs/img/ui-dark/task_doc_md.png
b/airflow-core/docs/img/ui-dark/task_doc_md.png
new file mode 100644
index 00000000000..33473e8d6e0
Binary files /dev/null and b/airflow-core/docs/img/ui-dark/task_doc_md.png
differ
diff --git a/airflow-core/docs/img/ui-light/dag_doc_md.png
b/airflow-core/docs/img/ui-light/dag_doc_md.png
new file mode 100644
index 00000000000..dd12c6a0d73
Binary files /dev/null and b/airflow-core/docs/img/ui-light/dag_doc_md.png
differ
diff --git a/airflow-core/docs/img/ui-light/task_doc_md.png
b/airflow-core/docs/img/ui-light/task_doc_md.png
new file mode 100644
index 00000000000..f5da020aa56
Binary files /dev/null and b/airflow-core/docs/img/ui-light/task_doc_md.png
differ
diff --git a/airflow-core/docs/tutorial/fundamentals.rst
b/airflow-core/docs/tutorial/fundamentals.rst
index 7ff7d773a76..749008e36be 100644
--- a/airflow-core/docs/tutorial/fundamentals.rst
+++ b/airflow-core/docs/tutorial/fundamentals.rst
@@ -153,9 +153,14 @@ For more information on the variables and macros that can
be referenced in templ
Adding Dag and Tasks documentation
----------------------------------
-You can add documentation to your Dag or individual tasks. While Dag
documentation currently supports markdown, task
-documentation can be in plain text, markdown reStructuredText, JSON, or YAML.
It's a good practice to include
-documentation at the start of your Dag file.
+You can add documentation to your Dag or individual tasks. Dag documentation
is rendered as Markdown in the UI.
+Task documentation can be in plain text, markdown, reStructuredText, JSON, or
YAML. When you use ``doc_md`` for
+task documentation, Airflow renders common Markdown features such as inline
code, fenced code blocks, fenced code blocks
+in ``math`` that render with KaTeX, and Mermaid diagrams in ``mermaid`` fences.
+
+In the tutorial Dag, the ``print_date`` task uses ``doc_md`` to explain the
bash command it runs, describe the
+downstream ``sleep`` and ``templated`` tasks, and show the Markdown features
available in the Task Instance Details
+page. It's a good practice to keep this documentation close to the task it
describes.
.. exampleinclude:: /../src/airflow/example_dags/tutorial.py
:language: python
@@ -165,11 +170,7 @@ documentation at the start of your Dag file.
|
-.. image:: ../img/ui-light/task_doc.png
-
-|
-
-.. image:: ../img/ui-light/dag_doc.png
+.. image:: ../img/ui-light/task_doc_md.png
Setting up Dependencies
-----------------------
diff --git a/airflow-core/src/airflow/example_dags/tutorial.py
b/airflow-core/src/airflow/example_dags/tutorial.py
index 7e12eb45469..11b4a81271c 100644
--- a/airflow-core/src/airflow/example_dags/tutorial.py
+++ b/airflow-core/src/airflow/example_dags/tutorial.py
@@ -87,16 +87,35 @@ with DAG(
# [START documentation]
t1.doc_md = textwrap.dedent(
"""\
- #### Task Documentation
- You can document your task using the attributes `doc_md` (markdown),
- `doc` (plain text), `doc_rst`, `doc_json`, `doc_yaml` which gets
- rendered in the UI's Task Instance Details page.
- 
- **Image Credit:** Randall Munroe, [XKCD](https://xkcd.com/license.html)
+ #### Print the current date
+
+ This task runs `date` by using the `bash_command` argument on
`BashOperator`.
+ In the Task Instance Details page, Airflow renders this documentation from
+ the task's `doc_md` field. After this task succeeds, Airflow can run both
+ downstream tasks: `sleep` and `templated`.
+
+ ```bash
+ date
+ ```
+
+ Math fences are rendered with KaTeX. This tutorial starts one task and then
+ branches into two downstream tasks:
+
+ ```math
+ 1\\ \\text{upstream task} + 2\\ \\text{downstream tasks} = 3\\
\\text{tasks}
+ ```
+
+ The same dependency is shown as a Mermaid diagram:
+
+ ```mermaid
+ graph LR
+ print_date[print_date] --> sleep[sleep]
+ print_date --> templated[templated]
+ ```
"""
)
- dag.doc_md = __doc__ # providing that you have a docstring at the
beginning of the DAG; OR
+ dag.doc_md = __doc__ # providing that you have a docstring at the
beginning of the Dag; OR
dag.doc_md = """
This is a documentation placed anywhere
""" # otherwise, type it like this
diff --git a/airflow-core/src/airflow/ui/package.json
b/airflow-core/src/airflow/ui/package.json
index 611013f07fb..677206b2e90 100644
--- a/airflow-core/src/airflow/ui/package.json
+++ b/airflow-core/src/airflow/ui/package.json
@@ -50,6 +50,8 @@
"i18next": "^25.8.16",
"i18next-browser-languagedetector": "^8.2.1",
"i18next-http-backend": "^3.0.5",
+ "katex": "^0.16.45",
+ "mermaid": "^11.14.0",
"monaco-editor": "^0.52.2",
"next-themes": "^0.4.6",
"react": "^19.2.6",
@@ -64,7 +66,9 @@
"react-resizable-panels": "^3.0.6",
"react-router-dom": "^7.13.1",
"react-syntax-highlighter": "^15.6.1",
+ "rehype-katex": "^7.0.1",
"remark-gfm": "^4.0.1",
+ "remark-math": "^6.0.0",
"use-debounce": "^10.1.0",
"usehooks-ts": "^3.1.1",
"yaml": "^2.8.2",
diff --git a/airflow-core/src/airflow/ui/pnpm-lock.yaml
b/airflow-core/src/airflow/ui/pnpm-lock.yaml
index 256fa44174f..baf2fa9c01e 100644
--- a/airflow-core/src/airflow/ui/pnpm-lock.yaml
+++ b/airflow-core/src/airflow/ui/pnpm-lock.yaml
@@ -113,6 +113,12 @@ importers:
i18next-http-backend:
specifier: ^3.0.5
version: 3.0.5
+ katex:
+ specifier: ^0.16.45
+ version: 0.16.45
+ mermaid:
+ specifier: ^11.14.0
+ version: 11.14.0
monaco-editor:
specifier: ^0.52.2
version: 0.52.2
@@ -155,9 +161,15 @@ importers:
react-syntax-highlighter:
specifier: ^15.6.1
version: 15.6.1([email protected])
+ rehype-katex:
+ specifier: ^7.0.1
+ version: 7.0.1
remark-gfm:
specifier: ^4.0.1
version: 4.0.1
+ remark-math:
+ specifier: ^6.0.0
+ version: 6.0.0
use-debounce:
specifier: ^10.1.0
version: 10.1.0([email protected])
@@ -325,6 +337,9 @@ packages:
'@adobe/[email protected]':
resolution: {integrity:
sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==}
+ '@antfu/[email protected]':
+ resolution: {integrity:
sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==}
+
'@apidevtools/[email protected]':
resolution: {integrity:
sha512-9K6xOqeevacvweLGik6LnZCb1fBtCOSIWQs8d096XGeqoLKC33UVMGz9+77Gw44KvbH4pKcQPWo4ZpxkXYj05w==}
engines: {node: '>= 16'}
@@ -496,6 +511,9 @@ packages:
resolution: {integrity:
sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==}
engines: {node: '>=18'}
+ '@braintree/[email protected]':
+ resolution: {integrity:
sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==}
+
'@chakra-ui/[email protected]':
resolution: {integrity:
sha512-fFIYN7L276gw0Q7/ikMMlZxP7mvnjRaWJ7f3Jsf9VtDOi6eAYIBRrhQe6+SZ0PGmoOkRaBc7gSE5oeIbgFFyrw==}
@@ -506,6 +524,21 @@ packages:
react: '>=18'
react-dom: '>=18'
+ '@chevrotain/[email protected]':
+ resolution: {integrity:
sha512-fSL4KXjTl7cDgf0B5Rip9Q05BOrYvkJV/RrBTE/bKDN096E4hN/ySpcBK5B24T76dlQ2i32Zc3PAE27jFnFrKg==}
+
+ '@chevrotain/[email protected]':
+ resolution: {integrity:
sha512-1ne/m3XsIT8aEdrvT33so0GUC+wkctpUPK6zU9IlOyJLUbR0rg4G7ZiApiJbggpgPir9ERy3FRjT6T7lpgetnQ==}
+
+ '@chevrotain/[email protected]':
+ resolution: {integrity:
sha512-p+EW9MaJwgaHguhoqwOtx/FwuGr+DnNn857sXWOi/mClXIkPGl3rn7hGNWvo31HA3vyeQxjqe+H36yZJwYU8cA==}
+
+ '@chevrotain/[email protected]':
+ resolution: {integrity:
sha512-S+04vjFQKeuYw0/eW3U52LkAHQsB1ASxsPGsLPUyQgrZ2iNNibQrsidruDzjEX2JYfespXMG0eZmXlhA6z7nWA==}
+
+ '@chevrotain/[email protected]':
+ resolution: {integrity:
sha512-lB59uJoaGIfOOL9knQqQRfhl9g7x8/wqFkp13zTdkRu1huG9kg6IJs1O8hqj9rs6h7orGxHJUKb+mX3rPbWGhA==}
+
'@emnapi/[email protected]':
resolution: {integrity:
sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==}
@@ -660,6 +693,12 @@ packages:
resolution: {integrity:
sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
engines: {node: '>=18.18'}
+ '@iconify/[email protected]':
+ resolution: {integrity:
sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+ '@iconify/[email protected]':
+ resolution: {integrity:
sha512-jVf75icVVgSVGf9+QWBeCHdFL35yZ06HMHl9sCa059pITTP781lOacvRazfwAmXDKiBiUdQQMWVnuiw/RaQNhQ==}
+
'@inquirer/[email protected]':
resolution: {integrity:
sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==}
engines: {node: '>=18'}
@@ -751,6 +790,9 @@ packages:
'@lezer/[email protected]':
resolution: {integrity:
sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==}
+ '@mermaid-js/[email protected]':
+ resolution: {integrity:
sha512-gxK9ZX2+Fex5zu8LhRQoMeMPEHbc73UKZ0FQ54YrQtUxE1VVhMwzeNtKRPAu5aXks4FasbMe4xB4bWrmq6Jlxw==}
+
'@monaco-editor/[email protected]':
resolution: {integrity:
sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==}
@@ -1098,24 +1140,54 @@ packages:
'@types/[email protected]':
resolution: {integrity:
sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==}
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==}
+
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==}
+
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==}
+
'@types/[email protected]':
resolution: {integrity:
sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==}
'@types/[email protected]':
resolution: {integrity:
sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==}
+
'@types/[email protected]':
resolution: {integrity:
sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==}
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==}
+
'@types/[email protected]':
resolution: {integrity:
sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==}
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==}
+
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
+
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==}
+
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==}
+
'@types/[email protected]':
resolution: {integrity:
sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==}
'@types/[email protected]':
resolution: {integrity:
sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==}
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==}
+
'@types/[email protected]':
resolution: {integrity:
sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==}
@@ -1125,6 +1197,18 @@ packages:
'@types/[email protected]':
resolution: {integrity:
sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==}
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==}
+
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==}
+
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==}
+
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==}
+
'@types/[email protected]':
resolution: {integrity:
sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==}
@@ -1140,12 +1224,18 @@ packages:
'@types/[email protected]':
resolution: {integrity:
sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==}
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
+
'@types/[email protected]':
resolution: {integrity:
sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==}
'@types/[email protected]':
resolution: {integrity:
sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==}
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==}
+
'@types/[email protected]':
resolution: {integrity:
sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
@@ -1173,6 +1263,9 @@ packages:
'@types/[email protected]':
resolution: {integrity:
sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==}
+
'@types/[email protected]':
resolution: {integrity:
sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==}
@@ -1207,6 +1300,9 @@ packages:
'@types/[email protected]':
resolution: {integrity:
sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==}
+ '@types/[email protected]':
+ resolution: {integrity:
sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
+
'@types/[email protected]':
resolution: {integrity:
sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
@@ -1282,6 +1378,9 @@ packages:
resolution: {integrity:
sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
deprecated: Potential CWE-502 - Update to 1.3.1 or higher
+ '@upsetjs/[email protected]':
+ resolution: {integrity:
sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==}
+
'@visx/[email protected]':
resolution: {integrity:
sha512-Ng1mefXIzoIoAivw7dJ+ZZYYUbfuwXgZCgQynShr6ZIVw7P4q4HeQfJP3W24ON+1uCSrzoycHSXRelhR9SBPcw==}
@@ -1853,6 +1952,15 @@ packages:
peerDependencies:
chart.js: '>=4.0.0'
+ [email protected]:
+ resolution: {integrity:
sha512-2X4mkroolSMKqW+H22pyPMUVDqYZzPhephTmg/NODKb1IGYPHfxfhcW0EjS7wcPJNbze2i4vBWT7zT5FKF2lrQ==}
+ peerDependencies:
+ chevrotain: ^12.0.0
+
+ [email protected]:
+ resolution: {integrity:
sha512-csJvb+6kEiQaqo1woTdSAuOWdN0WTLIydkKrBnS+V5gZz0oqBrp4kQ35519QgK6TpBThiG3V1vNSHlIkv4AglQ==}
+ engines: {node: '>=22.0.0'}
+
[email protected]:
resolution: {integrity:
sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
@@ -1914,6 +2022,14 @@ packages:
resolution: {integrity:
sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==}
engines: {node: '>= 6'}
+ [email protected]:
+ resolution: {integrity:
sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+
+ [email protected]:
+ resolution: {integrity:
sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
+ engines: {node: '>= 12'}
+
[email protected]:
resolution: {integrity:
sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
@@ -1937,6 +2053,12 @@ packages:
[email protected]:
resolution: {integrity:
sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==}
+ [email protected]:
+ resolution: {integrity:
sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==}
+
+ [email protected]:
+ resolution: {integrity:
sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==}
+
[email protected]:
resolution: {integrity:
sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
engines: {node: '>=10'}
@@ -1958,14 +2080,47 @@ packages:
resolution: {integrity:
sha512-1+BhOB8ahCn4O0cep0Sh2l9KCOfOdY+BXJnKMHFFzDEouSr/el18QwXEMRlOj9UY5nCeA8UN3a/82rUWRBeyBw==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ [email protected]:
+ resolution: {integrity:
sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==}
+ peerDependencies:
+ cytoscape: ^3.2.0
+
+ [email protected]:
+ resolution: {integrity:
sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==}
+ peerDependencies:
+ cytoscape: ^3.2.0
+
+ [email protected]:
+ resolution: {integrity:
sha512-Gej7U+OKR+LZ8kvX7rb2HhCYJ0IhvEFsnkud4SB1PR+BUY/TsSO0dmOW59WEVLu51b1Rm+gQRKoz4bLYxGSZ2g==}
+ engines: {node: '>=0.10'}
+
+ [email protected]:
+ resolution: {integrity:
sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==}
+
[email protected]:
resolution: {integrity:
sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ==}
engines: {node: '>=12'}
+ [email protected]:
+ resolution: {integrity:
sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==}
+ engines: {node: '>=12'}
+
+ [email protected]:
+ resolution: {integrity:
sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==}
+ engines: {node: '>=12'}
+
+ [email protected]:
+ resolution: {integrity:
sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==}
+ engines: {node: '>=12'}
+
[email protected]:
resolution: {integrity:
sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
engines: {node: '>=12'}
+ [email protected]:
+ resolution: {integrity:
sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==}
+ engines: {node: '>=12'}
+
[email protected]:
resolution: {integrity:
sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==}
engines: {node: '>=12'}
@@ -1978,10 +2133,23 @@ packages:
resolution: {integrity:
sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==}
engines: {node: '>=12'}
+ [email protected]:
+ resolution: {integrity:
sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==}
+ engines: {node: '>=12'}
+ hasBin: true
+
[email protected]:
resolution: {integrity:
sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
engines: {node: '>=12'}
+ [email protected]:
+ resolution: {integrity:
sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==}
+ engines: {node: '>=12'}
+
+ [email protected]:
+ resolution: {integrity:
sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==}
+ engines: {node: '>=12'}
+
[email protected]:
resolution: {integrity:
sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
engines: {node: '>=12'}
@@ -1990,6 +2158,10 @@ packages:
resolution: {integrity:
sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==}
engines: {node: '>=12'}
+ [email protected]:
+ resolution: {integrity:
sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
+ engines: {node: '>=12'}
+
[email protected]:
resolution: {integrity:
sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
engines: {node: '>=12'}
@@ -1997,6 +2169,29 @@ packages:
[email protected]:
resolution: {integrity:
sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==}
+ [email protected]:
+ resolution: {integrity:
sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
+ engines: {node: '>=12'}
+
+ [email protected]:
+ resolution: {integrity:
sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==}
+ engines: {node: '>=12'}
+
+ [email protected]:
+ resolution: {integrity:
sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==}
+ engines: {node: '>=12'}
+
+ [email protected]:
+ resolution: {integrity:
sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==}
+ engines: {node: '>=12'}
+
+ [email protected]:
+ resolution: {integrity:
sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==}
+
+ [email protected]:
+ resolution: {integrity:
sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==}
+ engines: {node: '>=12'}
+
[email protected]:
resolution: {integrity:
sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
engines: {node: '>=12'}
@@ -2008,6 +2203,10 @@ packages:
[email protected]:
resolution: {integrity:
sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==}
+ [email protected]:
+ resolution: {integrity:
sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
+ engines: {node: '>=12'}
+
[email protected]:
resolution: {integrity:
sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
engines: {node: '>=12'}
@@ -2030,6 +2229,13 @@ packages:
resolution: {integrity:
sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
engines: {node: '>=12'}
+ [email protected]:
+ resolution: {integrity:
sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==}
+ engines: {node: '>=12'}
+
+ [email protected]:
+ resolution: {integrity:
sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==}
+
[email protected]:
resolution: {integrity:
sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
@@ -2112,6 +2318,9 @@ packages:
[email protected]:
resolution: {integrity:
sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
+ [email protected]:
+ resolution: {integrity:
sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==}
+
[email protected]:
resolution: {integrity:
sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
engines: {node: '>=12'}
@@ -2132,6 +2341,10 @@ packages:
[email protected]:
resolution: {integrity:
sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ [email protected]:
+ resolution: {integrity:
sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
+ engines: {node: '>=0.12'}
+
[email protected]:
resolution: {integrity:
sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
engines: {node: '>=0.12'}
@@ -2498,6 +2711,9 @@ packages:
resolution: {integrity:
sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ==}
engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0}
+ [email protected]:
+ resolution: {integrity:
sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==}
+
[email protected]:
resolution: {integrity:
sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==}
engines: {node: '>=0.4.7'}
@@ -2538,18 +2754,42 @@ packages:
resolution: {integrity:
sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==}
engines: {node: '>= 0.4'}
+ [email protected]:
+ resolution: {integrity:
sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==}
+
+ [email protected]:
+ resolution: {integrity:
sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==}
+
+ [email protected]:
+ resolution: {integrity:
sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==}
+
+ [email protected]:
+ resolution: {integrity:
sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==}
+
+ [email protected]:
+ resolution: {integrity:
sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
+
[email protected]:
resolution: {integrity:
sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==}
+ [email protected]:
+ resolution: {integrity:
sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
+
[email protected]:
resolution: {integrity:
sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==}
+ [email protected]:
+ resolution: {integrity:
sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==}
+
[email protected]:
resolution: {integrity:
sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
[email protected]:
resolution: {integrity:
sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==}
+ [email protected]:
+ resolution: {integrity:
sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==}
+
[email protected]:
resolution: {integrity:
sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==}
@@ -2598,6 +2838,10 @@ packages:
typescript:
optional: true
+ [email protected]:
+ resolution: {integrity:
sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
[email protected]:
resolution: {integrity:
sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
@@ -2610,6 +2854,9 @@ packages:
resolution: {integrity:
sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
engines: {node: '>=6'}
+ [email protected]:
+ resolution: {integrity:
sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==}
+
[email protected]:
resolution: {integrity:
sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'}
@@ -2629,6 +2876,9 @@ packages:
resolution: {integrity:
sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
engines: {node: '>= 0.4'}
+ [email protected]:
+ resolution: {integrity:
sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==}
+
[email protected]:
resolution: {integrity:
sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
engines: {node: '>=12'}
@@ -2868,9 +3118,20 @@ packages:
resolution: {integrity:
sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
engines: {node: '>=4.0'}
+ [email protected]:
+ resolution: {integrity:
sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==}
+ hasBin: true
+
[email protected]:
resolution: {integrity:
sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+ [email protected]:
+ resolution: {integrity:
sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==}
+
+ [email protected]:
+ resolution: {integrity:
sha512-sOPIi4hISFnY7twwV97ca1TsxpBtXq0URu/LL1AvxwccPG/RIBBlKS7a/f/EL6w8lTNaS0EFs/F+IdSOaqYpng==}
+ engines: {node: '>=20.10.0', npm: '>=10.2.3'}
+
[email protected]:
resolution: {integrity:
sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
@@ -2878,6 +3139,12 @@ packages:
resolution: {integrity:
sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
engines: {node: '>=0.10'}
+ [email protected]:
+ resolution: {integrity:
sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==}
+
+ [email protected]:
+ resolution: {integrity:
sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==}
+
[email protected]:
resolution: {integrity:
sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'}
@@ -2963,6 +3230,9 @@ packages:
resolution: {integrity:
sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
+ [email protected]:
+ resolution: {integrity:
sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==}
+
[email protected]:
resolution: {integrity:
sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
@@ -3006,6 +3276,11 @@ packages:
[email protected]:
resolution: {integrity:
sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+ [email protected]:
+ resolution: {integrity:
sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==}
+ engines: {node: '>= 20'}
+ hasBin: true
+
[email protected]:
resolution: {integrity:
sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
engines: {node: '>= 0.4'}
@@ -3034,6 +3309,9 @@ packages:
[email protected]:
resolution: {integrity:
sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==}
+ [email protected]:
+ resolution: {integrity:
sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==}
+
[email protected]:
resolution: {integrity:
sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
@@ -3058,6 +3336,9 @@ packages:
[email protected]:
resolution: {integrity:
sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
+ [email protected]:
+ resolution: {integrity:
sha512-GSGloRsBs+JINmmhl0JDwjpuezCsHB4WGI4NASHxL3fHo3o/BRXTxhDLKnln8/Q0lRFRyDdEjmk1/d5Sn1Xz8g==}
+
[email protected]:
resolution: {integrity:
sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
@@ -3082,6 +3363,9 @@ packages:
[email protected]:
resolution: {integrity:
sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+ [email protected]:
+ resolution: {integrity:
sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==}
+
[email protected]:
resolution: {integrity:
sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
@@ -3303,6 +3587,9 @@ packages:
[email protected]:
resolution: {integrity:
sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+ [email protected]:
+ resolution: {integrity:
sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==}
+
[email protected]:
resolution: {integrity:
sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
@@ -3317,9 +3604,15 @@ packages:
resolution: {integrity:
sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
engines: {node: '>=8'}
+ [email protected]:
+ resolution: {integrity:
sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
+
[email protected]:
resolution: {integrity:
sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+ [email protected]:
+ resolution: {integrity:
sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==}
+
[email protected]:
resolution: {integrity:
sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
@@ -3378,6 +3671,12 @@ packages:
resolution: {integrity:
sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
engines: {node: '>=4'}
+ [email protected]:
+ resolution: {integrity:
sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==}
+
+ [email protected]:
+ resolution: {integrity:
sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==}
+
[email protected]:
resolution: {integrity:
sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
engines: {node: '>= 0.4'}
@@ -3569,9 +3868,15 @@ packages:
resolution: {integrity:
sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==}
hasBin: true
+ [email protected]:
+ resolution: {integrity:
sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==}
+
[email protected]:
resolution: {integrity:
sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==}
+ [email protected]:
+ resolution: {integrity:
sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==}
+
[email protected]:
resolution: {integrity:
sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
@@ -3613,6 +3918,12 @@ packages:
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
+ [email protected]:
+ resolution: {integrity:
sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==}
+
+ [email protected]:
+ resolution: {integrity:
sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==}
+
[email protected]:
resolution: {integrity:
sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
engines: {node: '>=0.4'}
@@ -3625,6 +3936,9 @@ packages:
resolution: {integrity:
sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
engines: {node: '>= 0.4'}
+ [email protected]:
+ resolution: {integrity:
sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
[email protected]:
resolution: {integrity:
sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
@@ -3786,6 +4100,9 @@ packages:
[email protected]:
resolution: {integrity:
sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==}
+ [email protected]:
+ resolution: {integrity:
sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==}
+
[email protected]:
resolution: {integrity:
sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -3862,6 +4179,10 @@ packages:
peerDependencies:
typescript: '>=4.8.4'
+ [email protected]:
+ resolution: {integrity:
sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==}
+ engines: {node: '>=6.10'}
+
[email protected]:
resolution: {integrity:
sha512-cA5MPLWGWYXvnlJb4TamUUx858HVHBsxxdy8l7jxODOLDyGYnQOllob2A2jyDghGa5iJHs2gzFNHvwGJ0ZfR8g==}
@@ -3925,12 +4246,18 @@ packages:
[email protected]:
resolution: {integrity:
sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+ [email protected]:
+ resolution: {integrity:
sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
+
[email protected]:
resolution: {integrity:
sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
[email protected]:
resolution: {integrity:
sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+ [email protected]:
+ resolution: {integrity:
sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
+
[email protected]:
resolution: {integrity:
sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
@@ -3984,6 +4311,13 @@ packages:
peerDependencies:
react: ^16.8.0 || ^17 || ^18 || ^19 || ^19.0.0-rc
+ [email protected]:
+ resolution: {integrity:
sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==}
+ hasBin: true
+
+ [email protected]:
+ resolution: {integrity:
sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
+
[email protected]:
resolution: {integrity:
sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
@@ -4083,6 +4417,29 @@ packages:
resolution: {integrity:
sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==}
engines: {node: '>=0.10.0'}
+ [email protected]:
+ resolution: {integrity:
sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==}
+ engines: {node: '>=14.0.0'}
+
+ [email protected]:
+ resolution: {integrity:
sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==}
+
+ [email protected]:
+ resolution: {integrity:
sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==}
+
+ [email protected]:
+ resolution: {integrity:
sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==}
+
+ [email protected]:
+ resolution: {integrity:
sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==}
+ hasBin: true
+
+ [email protected]:
+ resolution: {integrity:
sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
+
+ [email protected]:
+ resolution: {integrity:
sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+
[email protected]:
resolution: {integrity:
sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==}
@@ -4247,6 +4604,11 @@ snapshots:
'@adobe/[email protected]': {}
+ '@antfu/[email protected]':
+ dependencies:
+ package-manager-detector: 1.6.0
+ tinyexec: 1.1.1
+
'@apidevtools/[email protected]':
dependencies:
'@jsdevtools/ono': 7.1.3
@@ -4532,6 +4894,8 @@ snapshots:
'@bcoe/[email protected]': {}
+ '@braintree/[email protected]': {}
+
'@chakra-ui/[email protected]': {}
'@chakra-ui/[email protected](@emotion/[email protected](@types/[email protected])([email protected]))([email protected]([email protected]))([email protected])':
@@ -4547,7 +4911,23 @@ snapshots:
react: 19.2.6
react-dom: 19.2.6([email protected])
+ '@chevrotain/[email protected]':
+ dependencies:
+ '@chevrotain/gast': 12.0.0
+ '@chevrotain/types': 12.0.0
+
+ '@chevrotain/[email protected]':
+ dependencies:
+ '@chevrotain/types': 12.0.0
+
+ '@chevrotain/[email protected]': {}
+
+ '@chevrotain/[email protected]': {}
+
+ '@chevrotain/[email protected]': {}
+
'@emnapi/[email protected]':
+
dependencies:
'@emnapi/wasi-threads': 1.2.1
tslib: 2.8.1
@@ -4727,6 +5107,14 @@ snapshots:
'@humanwhocodes/[email protected]': {}
+ '@iconify/[email protected]': {}
+
+ '@iconify/[email protected]':
+ dependencies:
+ '@antfu/install-pkg': 1.1.0
+ '@iconify/types': 2.0.0
+ import-meta-resolve: 4.2.0
+
'@inquirer/[email protected]': {}
'@inquirer/[email protected](@types/[email protected])':
@@ -4813,6 +5201,10 @@ snapshots:
dependencies:
'@lezer/common': 1.5.1
+ '@mermaid-js/[email protected]':
+ dependencies:
+ langium: 4.2.3
+
'@monaco-editor/[email protected]':
dependencies:
state-local: 1.0.7
@@ -5091,22 +5483,51 @@ snapshots:
'@types/[email protected]': {}
+ '@types/[email protected]':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/[email protected]':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/[email protected]': {}
+
'@types/[email protected]': {}
'@types/[email protected]': {}
+ '@types/[email protected]':
+ dependencies:
+ '@types/d3-array': 3.0.3
+ '@types/geojson': 7946.0.16
+
'@types/[email protected]': {}
+ '@types/[email protected]': {}
+
'@types/[email protected]':
dependencies:
'@types/d3-selection': 3.0.11
+ '@types/[email protected]': {}
+
+ '@types/[email protected]': {}
+
+ '@types/[email protected]':
+ dependencies:
+ '@types/d3-dsv': 3.0.7
+
+ '@types/[email protected]': {}
+
'@types/[email protected]': {}
'@types/[email protected]':
dependencies:
'@types/geojson': 7946.0.16
+ '@types/[email protected]': {}
+
'@types/[email protected]':
dependencies:
'@types/d3-color': 3.1.0
@@ -5117,6 +5538,14 @@ snapshots:
'@types/[email protected]': {}
+ '@types/[email protected]': {}
+
+ '@types/[email protected]': {}
+
+ '@types/[email protected]': {}
+
+ '@types/[email protected]': {}
+
'@types/[email protected]':
dependencies:
'@types/d3-time': 3.0.0
@@ -5131,6 +5560,8 @@ snapshots:
'@types/[email protected]': {}
+ '@types/[email protected]': {}
+
'@types/[email protected]':
dependencies:
'@types/d3-selection': 3.0.11
@@ -5140,6 +5571,39 @@ snapshots:
'@types/d3-interpolate': 3.0.4
'@types/d3-selection': 3.0.11
+ '@types/[email protected]':
+ dependencies:
+ '@types/d3-array': 3.0.3
+ '@types/d3-axis': 3.0.6
+ '@types/d3-brush': 3.0.6
+ '@types/d3-chord': 3.0.6
+ '@types/d3-color': 3.1.3
+ '@types/d3-contour': 3.0.6
+ '@types/d3-delaunay': 6.0.1
+ '@types/d3-dispatch': 3.0.7
+ '@types/d3-drag': 3.0.7
+ '@types/d3-dsv': 3.0.7
+ '@types/d3-ease': 3.0.2
+ '@types/d3-fetch': 3.0.7
+ '@types/d3-force': 3.0.10
+ '@types/d3-format': 3.0.1
+ '@types/d3-geo': 3.1.0
+ '@types/d3-hierarchy': 3.1.7
+ '@types/d3-interpolate': 3.0.4
+ '@types/d3-path': 1.0.11
+ '@types/d3-polygon': 3.0.2
+ '@types/d3-quadtree': 3.0.6
+ '@types/d3-random': 3.0.3
+ '@types/d3-scale': 4.0.2
+ '@types/d3-scale-chromatic': 3.1.0
+ '@types/d3-selection': 3.0.11
+ '@types/d3-shape': 1.3.12
+ '@types/d3-time': 3.0.0
+ '@types/d3-time-format': 2.1.0
+ '@types/d3-timer': 3.0.2
+ '@types/d3-transition': 3.0.9
+ '@types/d3-zoom': 3.0.8
+
'@types/[email protected]':
dependencies:
'@types/ms': 2.1.0
@@ -5166,6 +5630,8 @@ snapshots:
'@types/[email protected]': {}
+ '@types/[email protected]': {}
+
'@types/[email protected]': {}
'@types/[email protected]':
@@ -5198,6 +5664,9 @@ snapshots:
'@types/[email protected]': {}
+ '@types/[email protected]':
+ optional: true
+
'@types/[email protected]': {}
'@types/[email protected]': {}
@@ -5301,6 +5770,11 @@ snapshots:
'@ungap/[email protected]': {}
+ '@upsetjs/[email protected]':
+ optionalDependencies:
+ d3-selection: 3.0.0
+ d3-transition: 3.0.1([email protected])
+
'@visx/[email protected]':
dependencies:
'@types/d3-shape': 1.3.12
@@ -6293,6 +6767,19 @@ snapshots:
dependencies:
chart.js: 4.5.1
+ [email protected]([email protected]):
+ dependencies:
+ chevrotain: 12.0.0
+ lodash-es: 4.18.1
+
+ [email protected]:
+ dependencies:
+ '@chevrotain/cst-dts-gen': 12.0.0
+ '@chevrotain/gast': 12.0.0
+ '@chevrotain/regexp-to-ast': 12.0.0
+ '@chevrotain/types': 12.0.0
+ '@chevrotain/utils': 12.0.0
+
[email protected]:
dependencies:
anymatch: 3.1.3
@@ -6349,6 +6836,10 @@ snapshots:
[email protected]: {}
+ [email protected]: {}
+
+ [email protected]: {}
+
[email protected]: {}
[email protected]: {}
@@ -6365,6 +6856,14 @@ snapshots:
dependencies:
browserslist: 4.28.2
+ [email protected]:
+ dependencies:
+ layout-base: 1.0.2
+
+ [email protected]:
+ dependencies:
+ layout-base: 2.0.1
+
[email protected]:
dependencies:
'@types/parse-json': 4.0.2
@@ -6391,12 +6890,46 @@ snapshots:
[email protected]: {}
+ [email protected]([email protected]):
+ dependencies:
+ cose-base: 1.0.3
+ cytoscape: 3.33.3
+
+ [email protected]([email protected]):
+ dependencies:
+ cose-base: 2.2.0
+ cytoscape: 3.33.3
+
+ [email protected]: {}
+
+ [email protected]:
+ dependencies:
+ internmap: 1.0.1
+
[email protected]:
dependencies:
internmap: 2.0.3
+ [email protected]: {}
+
+ [email protected]:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-transition: 3.0.1([email protected])
+
+ [email protected]:
+ dependencies:
+ d3-path: 3.1.0
+
[email protected]: {}
+ [email protected]:
+ dependencies:
+ d3-array: 3.2.1
+
[email protected]:
dependencies:
delaunator: 5.0.1
@@ -6408,20 +6941,56 @@ snapshots:
d3-dispatch: 3.0.1
d3-selection: 3.0.0
+ [email protected]:
+ dependencies:
+ commander: 7.2.0
+ iconv-lite: 0.6.3
+ rw: 1.3.3
+
[email protected]: {}
+ [email protected]:
+ dependencies:
+ d3-dsv: 3.0.1
+
+ [email protected]:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-quadtree: 3.0.1
+ d3-timer: 3.0.1
+
[email protected]: {}
[email protected]:
dependencies:
d3-array: 3.2.1
+ [email protected]: {}
+
[email protected]:
dependencies:
d3-color: 3.1.0
[email protected]: {}
+ [email protected]: {}
+
+ [email protected]: {}
+
+ [email protected]: {}
+
+ [email protected]: {}
+
+ [email protected]:
+ dependencies:
+ d3-array: 2.12.1
+ d3-shape: 1.3.7
+
+ [email protected]:
+ dependencies:
+ d3-color: 3.1.0
+ d3-interpolate: 3.0.1
+
[email protected]:
dependencies:
d3-array: 3.2.1
@@ -6436,6 +7005,10 @@ snapshots:
dependencies:
d3-path: 1.0.9
+ [email protected]:
+ dependencies:
+ d3-path: 3.1.0
+
[email protected]:
dependencies:
d3-time: 3.1.0
@@ -6463,6 +7036,44 @@ snapshots:
d3-selection: 3.0.0
d3-transition: 3.0.1([email protected])
+ [email protected]:
+ dependencies:
+ d3-array: 3.2.1
+ d3-axis: 3.0.0
+ d3-brush: 3.0.0
+ d3-chord: 3.0.1
+ d3-color: 3.1.0
+ d3-contour: 4.0.2
+ d3-delaunay: 6.0.2
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-dsv: 3.0.1
+ d3-ease: 3.0.1
+ d3-fetch: 3.0.1
+ d3-force: 3.0.0
+ d3-format: 3.1.0
+ d3-geo: 3.1.0
+ d3-hierarchy: 3.1.2
+ d3-interpolate: 3.0.1
+ d3-path: 3.1.0
+ d3-polygon: 3.0.1
+ d3-quadtree: 3.0.1
+ d3-random: 3.0.1
+ d3-scale: 4.0.2
+ d3-scale-chromatic: 3.1.0
+ d3-selection: 3.0.0
+ d3-shape: 3.2.0
+ d3-time: 3.1.0
+ d3-time-format: 4.1.0
+ d3-timer: 3.0.1
+ d3-transition: 3.0.1([email protected])
+ d3-zoom: 3.0.0
+
+ [email protected]:
+ dependencies:
+ d3: 7.9.0
+ lodash-es: 4.18.1
+
[email protected]: {}
[email protected]:
@@ -6540,6 +7151,10 @@ snapshots:
'@babel/runtime': 7.29.2
csstype: 3.2.3
+ [email protected]:
+ optionalDependencies:
+ '@types/trusted-types': 2.0.7
+
[email protected]: {}
[email protected]:
@@ -6556,6 +7171,8 @@ snapshots:
[email protected]: {}
+ [email protected]: {}
+
[email protected]: {}
[email protected]:
@@ -7038,6 +7655,8 @@ snapshots:
[email protected]: {}
+ [email protected]: {}
+
[email protected]:
dependencies:
minimist: 1.2.8
@@ -7085,8 +7704,49 @@ snapshots:
dependencies:
function-bind: 1.1.2
+ [email protected]:
+ dependencies:
+ '@types/hast': 3.0.4
+ hastscript: 9.0.1
+ web-namespaces: 2.0.1
+
+ [email protected]:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-from-dom: 5.0.1
+ hast-util-from-html: 2.0.3
+ unist-util-remove-position: 5.0.0
+
+ [email protected]:
+ dependencies:
+ '@types/hast': 3.0.4
+ devlop: 1.1.0
+ hast-util-from-parse5: 8.0.3
+ parse5: 7.3.0
+ vfile: 6.0.3
+ vfile-message: 4.0.2
+
+ [email protected]:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ hastscript: 9.0.1
+ property-information: 7.0.0
+ vfile: 6.0.3
+ vfile-location: 5.0.3
+ web-namespaces: 2.0.1
+
+ [email protected]:
+ dependencies:
+ '@types/hast': 3.0.4
+
[email protected]: {}
+ [email protected]:
+ dependencies:
+ '@types/hast': 3.0.4
+
[email protected]:
dependencies:
'@types/estree': 1.0.9
@@ -7107,6 +7767,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ [email protected]:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ hast-util-is-element: 3.0.0
+ unist-util-find-after: 5.0.0
+
[email protected]:
dependencies:
'@types/hast': 3.0.4
@@ -7119,6 +7786,14 @@ snapshots:
property-information: 5.6.0
space-separated-tokens: 1.1.5
+ [email protected]:
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 4.0.0
+ property-information: 7.0.0
+ space-separated-tokens: 2.0.2
+
[email protected]: {}
[email protected]: {}
@@ -7168,6 +7843,10 @@ snapshots:
optionalDependencies:
typescript: 6.0.3
+ [email protected]:
+ dependencies:
+ safer-buffer: 2.1.2
+
[email protected]: {}
[email protected]: {}
@@ -7177,6 +7856,8 @@ snapshots:
parent-module: 1.0.1
resolve-from: 4.0.0
+ [email protected]: {}
+
[email protected]: {}
[email protected]: {}
@@ -7191,6 +7872,8 @@ snapshots:
hasown: 2.0.3
side-channel: 1.1.0
+ [email protected]: {}
+
[email protected]: {}
[email protected]: {}
@@ -7426,16 +8109,35 @@ snapshots:
object.assign: 4.1.7
object.values: 1.2.1
+ [email protected]:
+ dependencies:
+ commander: 8.3.0
+
[email protected]:
dependencies:
json-buffer: 3.0.1
+ [email protected]: {}
+
+ [email protected]:
+ dependencies:
+ '@chevrotain/regexp-to-ast': 12.0.0
+ chevrotain: 12.0.0
+ chevrotain-allstar: 0.4.3([email protected])
+ vscode-languageserver: 9.0.1
+ vscode-languageserver-textdocument: 1.0.12
+ vscode-uri: 3.1.0
+
[email protected]: {}
[email protected]:
dependencies:
language-subtag-registry: 0.3.23
+ [email protected]: {}
+
+ [email protected]: {}
+
[email protected]:
dependencies:
prelude-ls: 1.2.1
@@ -7496,6 +8198,8 @@ snapshots:
dependencies:
p-locate: 5.0.0
+ [email protected]: {}
+
[email protected]: {}
[email protected]: {}
@@ -7542,6 +8246,8 @@ snapshots:
[email protected]: {}
+ [email protected]: {}
+
[email protected]: {}
[email protected]:
@@ -7625,6 +8331,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ [email protected]:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ longest-streak: 3.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ unist-util-remove-position: 5.0.0
+ transitivePeerDependencies:
+ - supports-color
+
[email protected]:
dependencies:
'@types/estree-jsx': 1.0.5
@@ -7699,6 +8417,30 @@ snapshots:
[email protected]: {}
+ [email protected]:
+ dependencies:
+ '@braintree/sanitize-url': 7.1.2
+ '@iconify/utils': 3.1.2
+ '@mermaid-js/parser': 1.1.0
+ '@types/d3': 7.4.3
+ '@upsetjs/venn.js': 2.0.0
+ cytoscape: 3.33.3
+ cytoscape-cose-bilkent: 4.1.0([email protected])
+ cytoscape-fcose: 2.2.0([email protected])
+ d3: 7.9.0
+ d3-sankey: 0.12.3
+ dagre-d3-es: 7.0.14
+ dayjs: 1.11.19
+ dompurify: 3.4.2
+ katex: 0.16.45
+ khroma: 2.1.0
+ lodash-es: 4.18.1
+ marked: 16.4.2
+ roughjs: 4.6.6
+ stylis: 4.4.0
+ ts-dedent: 2.2.0
+ uuid: 11.1.1
+
[email protected]:
dependencies:
decode-named-character-reference: 1.1.0
@@ -7776,6 +8518,16 @@ snapshots:
micromark-util-combine-extensions: 2.0.1
micromark-util-types: 2.0.2
+ [email protected]:
+ dependencies:
+ '@types/katex': 0.16.8
+ devlop: 1.1.0
+ katex: 0.16.45
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
[email protected]:
dependencies:
micromark-util-character: 2.1.1
@@ -8068,6 +8820,8 @@ snapshots:
[email protected]: {}
+ [email protected]: {}
+
[email protected]:
dependencies:
callsites: 3.1.0
@@ -8098,8 +8852,14 @@ snapshots:
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
+ [email protected]:
+ dependencies:
+ entities: 6.0.1
+
[email protected]: {}
+ [email protected]: {}
+
[email protected]: {}
[email protected]: {}
@@ -8143,6 +8903,13 @@ snapshots:
[email protected]: {}
+ [email protected]: {}
+
+ [email protected]:
+ dependencies:
+ path-data-parser: 0.1.0
+ points-on-curve: 0.2.0
+
[email protected]: {}
[email protected]:
@@ -8355,6 +9122,16 @@ snapshots:
dependencies:
jsesc: 3.1.0
+ [email protected]:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/katex': 0.16.8
+ hast-util-from-html-isomorphic: 2.0.0
+ hast-util-to-text: 4.0.2
+ katex: 0.16.45
+ unist-util-visit-parents: 6.0.1
+ vfile: 6.0.3
+
[email protected]:
dependencies:
'@types/mdast': 4.0.4
@@ -8366,6 +9143,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ [email protected]:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-math: 3.0.0
+ micromark-extension-math: 3.1.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
[email protected]:
dependencies:
'@types/mdast': 4.0.4
@@ -8432,6 +9218,15 @@ snapshots:
'@rolldown/binding-win32-arm64-msvc': 1.0.3
'@rolldown/binding-win32-x64-msvc': 1.0.3
+ [email protected]:
+ dependencies:
+ hachure-fill: 0.5.2
+ path-data-parser: 0.1.0
+ points-on-curve: 0.2.0
+ points-on-path: 0.2.1
+
+ [email protected]: {}
+
[email protected]:
dependencies:
call-bind: 1.0.8
@@ -8451,6 +9246,8 @@ snapshots:
es-errors: 1.3.0
is-regex: 1.2.1
+ [email protected]: {}
+
[email protected]: {}
[email protected]: {}
@@ -8628,6 +9425,8 @@ snapshots:
[email protected]: {}
+ [email protected]: {}
+
[email protected]:
dependencies:
has-flag: 4.0.0
@@ -8692,6 +9491,8 @@ snapshots:
dependencies:
typescript: 6.0.3
+ [email protected]: {}
+
[email protected]: {}
[email protected]:
@@ -8779,6 +9580,11 @@ snapshots:
trough: 2.2.0
vfile: 6.0.3
+ [email protected]:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+
[email protected]:
dependencies:
'@types/unist': 3.0.3
@@ -8787,6 +9593,11 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
+ [email protected]:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-visit: 5.0.0
+
[email protected]:
dependencies:
'@types/unist': 3.0.3
@@ -8837,6 +9648,13 @@ snapshots:
lodash.debounce: 4.0.8
react: 19.2.6
+ [email protected]: {}
+
+ [email protected]:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile: 6.0.3
+
[email protected]:
dependencies:
'@types/unist': 3.0.3
@@ -8895,6 +9713,25 @@ snapshots:
[email protected]: {}
+ [email protected]: {}
+
+ [email protected]:
+ dependencies:
+ vscode-jsonrpc: 8.2.0
+ vscode-languageserver-types: 3.17.5
+
+ [email protected]: {}
+
+ [email protected]: {}
+
+ [email protected]:
+ dependencies:
+ vscode-languageserver-protocol: 3.17.5
+
+ [email protected]: {}
+
+ [email protected]: {}
+
[email protected]: {}
[email protected]: {}
diff --git a/airflow-core/src/airflow/ui/src/components/KatexStyleLoader.ts
b/airflow-core/src/airflow/ui/src/components/KatexStyleLoader.ts
new file mode 100644
index 00000000000..c533ca7adaa
--- /dev/null
+++ b/airflow-core/src/airflow/ui/src/components/KatexStyleLoader.ts
@@ -0,0 +1,31 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+const createKatexStyleLoader = () => {
+ let katexStylesPromise: Promise<void> | undefined;
+
+ return () => {
+ katexStylesPromise ??= import("katex/dist/katex.min.css").then(() =>
undefined);
+
+ return katexStylesPromise;
+ };
+};
+
+export const katexStyleLoader = {
+ load: createKatexStyleLoader(),
+};
diff --git a/airflow-core/src/airflow/ui/src/components/ReactMarkdown.test.tsx
b/airflow-core/src/airflow/ui/src/components/ReactMarkdown.test.tsx
new file mode 100644
index 00000000000..9598c7f361c
--- /dev/null
+++ b/airflow-core/src/airflow/ui/src/components/ReactMarkdown.test.tsx
@@ -0,0 +1,98 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/// <reference types="@testing-library/jest-dom" />
+import "@testing-library/jest-dom/vitest";
+import { render, screen, waitFor } from "@testing-library/react";
+import { describe, expect, it, vi } from "vitest";
+
+import { BaseWrapper } from "src/utils/Wrapper";
+
+import { katexStyleLoader } from "./KatexStyleLoader";
+import ReactMarkdown from "./ReactMarkdown";
+
+const { renderMermaidDiagramMock } = vi.hoisted(() => ({
+ renderMermaidDiagramMock: vi.fn().mockResolvedValue('<svg
data-testid="mermaid-svg"></svg>'),
+}));
+
+vi.mock("src/context/colorMode", () => ({
+ useColorMode: () => ({ colorMode: "light" }),
+}));
+
+vi.mock("src/utils/renderMermaid", () => ({
+ renderMermaidDiagram: renderMermaidDiagramMock,
+}));
+
+describe("ReactMarkdown", () => {
+ it("loads KaTeX styles on demand for math fences and preserves plain dollar
amounts", async () => {
+ const loadKatexStyles = vi.spyOn(katexStyleLoader,
"load").mockResolvedValue(undefined);
+ const markdown = [
+ "Costs $5 and $10 today.",
+ "",
+ "```math",
+ String.raw`S = \sum_{i=1}^{n} w_i x_i`,
+ "```",
+ ].join("\n");
+ const { container } = render(
+ <BaseWrapper>
+ <ReactMarkdown>{markdown}</ReactMarkdown>
+ </BaseWrapper>,
+ );
+
+ await waitFor(() => expect(loadKatexStyles).toHaveBeenCalled());
+
+ expect(screen.getByText("Costs $5 and $10 today.")).toBeInTheDocument();
+ expect(container.querySelectorAll(".katex")).toHaveLength(1);
+ expect(container.querySelectorAll(".katex-display")).toHaveLength(1);
+
+ loadKatexStyles.mockRestore();
+ });
+
+ it("does not load KaTeX styles for markdown without math fences", () => {
+ const loadKatexStyles = vi.spyOn(katexStyleLoader,
"load").mockResolvedValue(undefined);
+
+ render(
+ <BaseWrapper>
+ <ReactMarkdown>Plain markdown with $5 but no math
block.</ReactMarkdown>
+ </BaseWrapper>,
+ );
+
+ expect(loadKatexStyles).not.toHaveBeenCalled();
+
+ loadKatexStyles.mockRestore();
+ });
+
+ it("falls back to a code block when mermaid rendering fails", async () => {
+ renderMermaidDiagramMock.mockRejectedValueOnce(new Error("mermaid render
failed"));
+
+ const markdown = ["```mermaid", "graph TD", " A-->B", "```"].join("\n");
+
+ render(
+ <BaseWrapper>
+ <ReactMarkdown>{markdown}</ReactMarkdown>
+ </BaseWrapper>,
+ );
+
+ await waitFor(() =>
expect(screen.getByTestId("markdown-copy-button")).toBeInTheDocument());
+
+ expect(renderMermaidDiagramMock).toHaveBeenCalled();
+
expect(screen.queryByTestId("markdown-mermaid-copy-button")).not.toBeInTheDocument();
+
expect(screen.queryByTestId("markdown-mermaid-diagram")).not.toBeInTheDocument();
+
expect(screen.getByTestId("markdown-code-scroll-area")).toHaveTextContent("A-->B");
+ });
+});
diff --git a/airflow-core/src/airflow/ui/src/components/ReactMarkdown.tsx
b/airflow-core/src/airflow/ui/src/components/ReactMarkdown.tsx
index 9a89c105fef..5fe5cc9dca6 100644
--- a/airflow-core/src/airflow/ui/src/components/ReactMarkdown.tsx
+++ b/airflow-core/src/airflow/ui/src/components/ReactMarkdown.tsx
@@ -28,13 +28,16 @@ import {
Table,
Text,
} from "@chakra-ui/react";
-import type { PropsWithChildren, ReactNode } from "react";
+import { Children, isValidElement } from "react";
+import type { ComponentProps, PropsWithChildren, ReactNode } from "react";
import ReactMD from "react-markdown";
import type { Components, Options } from "react-markdown";
import remarkGfm from "remark-gfm";
import { useColorMode } from "src/context/colorMode";
-import { oneDark, oneLight, SyntaxHighlighter } from
"src/utils/syntaxHighlighter";
+import { oneDark, oneLight, type SyntaxTheme } from
"src/utils/syntaxHighlighter";
+
+import { MarkdownCodeBlock } from "./ReactMarkdownBlocks";
const fontSizeMapping = {
h1: "1.5em",
@@ -55,20 +58,30 @@ const makeHeading =
// Static components that don't depend on props
-const LinkComponent = ({
- children,
- href,
- title,
-}: {
+type MarkdownLinkProps = {
readonly children: ReactNode;
readonly href: string;
readonly title?: string;
-}) => (
+};
+
+const MarkdownLink = ({ children, href, title }: MarkdownLinkProps) => (
<Link color="fg.info" fontWeight="bold" href={href} rel="noopener
noreferrer" target="_blank" title={title}>
{children}
</Link>
);
+const LinkComponent = ({ children, href, title }: ComponentProps<"a">) => {
+ if (href === undefined || children === undefined) {
+ return children;
+ }
+
+ return (
+ <MarkdownLink href={href} title={title}>
+ {children}
+ </MarkdownLink>
+ );
+};
+
const BlockquoteComponent = ({ children }: PropsWithChildren) => (
<Box
as="blockquote"
@@ -92,12 +105,24 @@ const OlComponent = ({ children }: PropsWithChildren) => (
{children}
</List.Root>
);
+
+const markdownContentStyles = {
+ "& .katex-display": {
+ marginBlock: "0.75rem",
+ overflowX: "auto",
+ overflowY: "hidden",
+ },
+ "& .katex-display > .katex": {
+ marginInline: "auto",
+ width: "max-content",
+ },
+};
+
const PComponent = ({ children }: PropsWithChildren) => (
<Text overflowWrap="break-word" wordBreak="break-word">
{children}
</Text>
);
-const PreComponent = ({ children }: PropsWithChildren) => <Box
my={3}>{children}</Box>;
const TableComponent = ({ children }: PropsWithChildren) => <Table.Root
mb={3}>{children}</Table.Root>;
const TextComponent = ({ children }: PropsWithChildren) => <Text
as="span">{children}</Text>;
const UlComponent = ({ children }: PropsWithChildren) => (
@@ -106,82 +131,85 @@ const UlComponent = ({ children }: PropsWithChildren) => (
</List.Root>
);
-// Factory function for the code component that needs style
-const createCodeComponent =
- (style: typeof oneDark | typeof oneLight) =>
- ({ children, className }: { readonly children: ReactNode; readonly
className?: string }) => {
- // react-markdown v9 no longer passes an `inline` prop. Only fenced code
- // blocks carry a `language-*` class; everything else is inline code and
- // must render as a <span> (a block <div> inside a <p> breaks hydration).
- const match = /language-(?<lang>\w+)/u.exec(className ?? "");
-
- if (!match) {
- return (
- <Code display="inline" p={2}>
- {children}
- </Code>
- );
- }
+type MarkdownCodeElementProps = {
+ readonly children?: ReactNode;
+ readonly className?: string;
+};
- const language = match.groups?.lang;
+const InlineCodeComponent = ({ children }: PropsWithChildren) => <Code
display="inline">{children}</Code>;
- // Safely extract string content from children
- let childString = "";
+// Factory function for the pre component that needs style
+const createPreComponent =
+ (style: SyntaxTheme) =>
+ ({ children }: { readonly children?: ReactNode }) => {
+ const [codeElement] = Children.toArray(children);
- if (typeof children === "string") {
- childString = children;
- } else if (Array.isArray(children)) {
- childString = children.filter((child) => typeof child ===
"string").join("");
+ if (!isValidElement<MarkdownCodeElementProps>(codeElement)) {
+ return <Box my={3}>{children}</Box>;
}
- return (
- <SyntaxHighlighter language={language ?? "text"} PreTag="div"
style={style} wrapLongLines>
- {childString.replace(/\n$/u, "")}
- </SyntaxHighlighter>
- );
+ // Extract language from className (format: "language-python")
+ const { children: codeChildren, className } = codeElement.props;
+ const match = /language-(?<lang>[-\w]+)/u.exec(className ?? "");
+ const language = match?.groups?.lang;
+
+ const codeText = Array.isArray(codeChildren)
+ ? codeChildren.map((child) => (typeof child === "string" ? child :
"")).join("")
+ : typeof codeChildren === "string"
+ ? codeChildren
+ : "";
+
+ const childString = codeText.replace(/\n$/u, "");
+
+ return <MarkdownCodeBlock language={language} style={style}
value={childString} />;
};
-const ReactMarkdown = ({ components: componentOverrides, ...restProps }:
Options) => {
+const createMarkdownComponents = (style: SyntaxTheme): Components => ({
+ // eslint-disable-next-line id-length
+ a: LinkComponent,
+ blockquote: BlockquoteComponent,
+ code: InlineCodeComponent,
+ del: DelComponent,
+ em: EmComponent,
+ h1: makeHeading("h1"),
+ h2: makeHeading("h2"),
+ h3: makeHeading("h3"),
+ h4: makeHeading("h4"),
+ h5: makeHeading("h5"),
+ h6: makeHeading("h6"),
+ hr: HrComponent,
+ img: ImgComponent,
+ li: LiComponent,
+ ol: OlComponent,
+ // eslint-disable-next-line id-length
+ p: PComponent,
+ pre: createPreComponent(style),
+ table: TableComponent,
+ tbody: Table.Body,
+ td: Table.Cell,
+ text: TextComponent,
+ th: Table.ColumnHeader,
+ thead: Table.Header,
+ tr: Table.Row,
+ ul: UlComponent,
+});
+
+const ReactMarkdown = ({ children, components: componentOverrides,
...restProps }: Options) => {
const { colorMode } = useColorMode();
const style = colorMode === "dark" ? oneDark : oneLight;
-
- const components = {
- // eslint-disable-next-line id-length
- a: LinkComponent,
- blockquote: BlockquoteComponent,
- code: createCodeComponent(style),
- del: DelComponent,
- em: EmComponent,
- h1: makeHeading("h1"),
- h2: makeHeading("h2"),
- h3: makeHeading("h3"),
- h4: makeHeading("h4"),
- h5: makeHeading("h5"),
- h6: makeHeading("h6"),
- hr: HrComponent,
- img: ImgComponent,
- li: LiComponent,
- ol: OlComponent,
- // eslint-disable-next-line id-length
- p: PComponent,
- pre: PreComponent,
- table: TableComponent,
- tbody: Table.Body,
- td: Table.Cell,
- text: TextComponent,
- th: Table.ColumnHeader,
- thead: Table.Header,
- tr: Table.Row,
- ul: UlComponent,
- };
+ const components = createMarkdownComponents(style);
return (
- <ReactMD
- components={{ ...components, ...componentOverrides } as Components}
- {...restProps}
- remarkPlugins={[remarkGfm]}
- skipHtml
- />
+ <Box alignSelf="stretch" css={markdownContentStyles} maxWidth="100%"
minWidth={0} width="100%">
+ <ReactMD
+ components={{ ...components, ...componentOverrides }}
+ {...restProps}
+ remarkPlugins={[remarkGfm]}
+ skipHtml
+ >
+ {children}
+ </ReactMD>
+ </Box>
);
};
diff --git a/airflow-core/src/airflow/ui/src/components/ReactMarkdownBlocks.tsx
b/airflow-core/src/airflow/ui/src/components/ReactMarkdownBlocks.tsx
new file mode 100644
index 00000000000..d51b2bebb01
--- /dev/null
+++ b/airflow-core/src/airflow/ui/src/components/ReactMarkdownBlocks.tsx
@@ -0,0 +1,281 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Box, Flex, Spinner, Text } from "@chakra-ui/react";
+import { renderToString as renderKatexToString } from "katex";
+import { useEffect, useId, useState, type ReactNode } from "react";
+import { useTranslation } from "react-i18next";
+
+import { LazyClipboard } from "src/components/ui";
+import { useColorMode } from "src/context/colorMode";
+import { renderMermaidDiagram } from "src/utils/renderMermaid";
+import { SyntaxHighlighter, type SyntaxTheme } from
"src/utils/syntaxHighlighter";
+
+import { katexStyleLoader } from "./KatexStyleLoader";
+
+const MarkdownBlockFrame = ({
+ action,
+ children,
+ label,
+}: {
+ readonly action: ReactNode;
+ readonly children: ReactNode;
+ readonly label: string;
+}) => (
+ <Box maxWidth="100%" minWidth={0} my={3} width="100%">
+ <Flex
+ alignItems="center"
+ bg="bg.muted"
+ borderColor="border.emphasized"
+ borderTopRadius="md"
+ borderWidth="1px"
+ justifyContent="space-between"
+ minH={8}
+ px={3}
+ py={1}
+ >
+ <Text color="fg.muted" fontFamily="mono" fontSize="xs"
lineHeight="short">
+ {label}
+ </Text>
+ {action}
+ </Flex>
+ <Box
+ borderBottomRadius="md"
+ borderColor="border.emphasized"
+ borderTopWidth={0}
+ borderWidth="1px"
+ maxWidth="100%"
+ minWidth={0}
+ overflow="hidden"
+ >
+ {children}
+ </Box>
+ </Box>
+);
+
+const MarkdownPlainCodeBlock = ({
+ language,
+ style,
+ value,
+}: {
+ readonly language?: string;
+ readonly style: SyntaxTheme;
+ readonly value: string;
+}) => {
+ const { t: translate } = useTranslation("components");
+
+ const codeBlockStyle = style['pre[class*="language-"]'];
+
+ return (
+ <MarkdownBlockFrame
+ action={
+ <LazyClipboard
+ aria-label={translate("clipboard.copy")}
+ data-testid="markdown-copy-button"
+ getValue={() => value}
+ title={translate("clipboard.copy")}
+ />
+ }
+ label={language ?? "text"}
+ >
+ <Box
+ css={{ ...codeBlockStyle, borderRadius: 0, margin: 0 }}
+ data-testid="markdown-code-scroll-area"
+ maxWidth="100%"
+ minWidth={0}
+ overflowX="auto"
+ overflowY="hidden"
+ width="100%"
+ >
+ <Box data-testid="markdown-code-content" display="inline-block"
minWidth="100%">
+ <SyntaxHighlighter
+ codeTagProps={{
+ style: {
+ background: "transparent",
+ overflowWrap: "normal",
+ whiteSpace: "pre",
+ wordBreak: "normal",
+ },
+ }}
+ customStyle={{
+ background: "transparent",
+ borderRadius: 0,
+ margin: 0,
+ padding: 0,
+ width: "max-content",
+ }}
+ language={language}
+ lineNumberStyle={{ minWidth: "2.5em", opacity: 0.6, paddingRight:
"1em" }}
+ PreTag="div"
+ showLineNumbers
+ style={style}
+ >
+ {value}
+ </SyntaxHighlighter>
+ </Box>
+ </Box>
+ </MarkdownBlockFrame>
+ );
+};
+
+const MarkdownMathBlock = ({ style, value }: { readonly style: SyntaxTheme;
readonly value: string }) => {
+ const { t: translate } = useTranslation("components");
+
+ useEffect(() => {
+ void katexStyleLoader.load();
+ }, []);
+
+ try {
+ const markup = renderKatexToString(value, { displayMode: true,
throwOnError: true });
+
+ return (
+ <MarkdownBlockFrame
+ action={
+ <LazyClipboard
+ aria-label={translate("clipboard.copy")}
+ data-testid="markdown-copy-button"
+ getValue={() => value}
+ title={translate("clipboard.copy")}
+ />
+ }
+ label="math"
+ >
+ <Box data-testid="markdown-math-content" maxWidth="100%" minWidth={0}
overflowX="auto" p={3}>
+ <Box
+ /* Trusting KaTeX to escape user content in the generated HTML */
+ dangerouslySetInnerHTML={{ __html: markup }}
+ />
+ </Box>
+ </MarkdownBlockFrame>
+ );
+ } catch {
+ return <MarkdownPlainCodeBlock language="math" style={style} value={value}
/>;
+ }
+};
+
+export const MarkdownMermaid = ({
+ chart,
+ fallbackStyle,
+}: {
+ readonly chart: string;
+ readonly fallbackStyle: SyntaxTheme;
+}) => {
+ const { t: translate } = useTranslation("components");
+ const { colorMode } = useColorMode();
+ const diagramId = useId().replaceAll(":", "");
+ const [error, setError] = useState(false);
+ const [svg, setSvg] = useState<string>();
+ const theme = colorMode === "dark" ? "dark" : "default";
+
+ useEffect(() => {
+ let cancelled = false;
+
+ const renderMermaid = async () => {
+ try {
+ const renderedSvg = await renderMermaidDiagram({
+ chart,
+ diagramId: `markdown-mermaid-${diagramId}`,
+ theme,
+ });
+
+ if (!cancelled) {
+ setSvg(renderedSvg);
+ setError(false);
+ }
+ } catch {
+ if (!cancelled) {
+ setError(true);
+ setSvg(undefined);
+ }
+ }
+ };
+
+ void renderMermaid();
+
+ return () => {
+ cancelled = true;
+ };
+ }, [chart, diagramId, theme]);
+
+ if (error) {
+ return <MarkdownPlainCodeBlock language="mermaid" style={fallbackStyle}
value={chart} />;
+ }
+
+ return (
+ <MarkdownBlockFrame
+ action={
+ <LazyClipboard
+ aria-label={translate("clipboard.copy")}
+ data-testid="markdown-mermaid-copy-button"
+ getValue={() => chart}
+ title={translate("clipboard.copy")}
+ />
+ }
+ label="mermaid"
+ >
+ <Box maxWidth="100%" minHeight="8rem" minWidth={0} overflow="hidden"
p={3} width="100%">
+ {svg === undefined ? (
+ <Box
+ alignItems="center"
+ color="fg.muted"
+ data-testid="markdown-mermaid-loading"
+ display="inline-flex"
+ minHeight="2rem"
+ >
+ <Spinner size="sm" />
+ </Box>
+ ) : (
+ <Box
+ css={{
+ "& svg": {
+ display: "block",
+ height: "auto",
+ marginInline: "auto",
+ maxWidth: "100%",
+ width: "100%",
+ },
+ }}
+ /* Trusting mermaid's strict-mode sanitizer */
+ dangerouslySetInnerHTML={{ __html: svg }}
+ data-testid="markdown-mermaid-diagram"
+ />
+ )}
+ </Box>
+ </MarkdownBlockFrame>
+ );
+};
+
+export const MarkdownCodeBlock = ({
+ language,
+ style,
+ value,
+}: {
+ readonly language?: string;
+ readonly style: SyntaxTheme;
+ readonly value: string;
+}) => {
+ if (language === "math") {
+ return <MarkdownMathBlock style={style} value={value} />;
+ }
+
+ if (language === "mermaid") {
+ return <MarkdownMermaid chart={value} fallbackStyle={style} />;
+ }
+
+ return <MarkdownPlainCodeBlock language={language} style={style}
value={value} />;
+};
diff --git a/airflow-core/src/airflow/ui/src/utils/renderMermaid.ts
b/airflow-core/src/airflow/ui/src/utils/renderMermaid.ts
new file mode 100644
index 00000000000..c9050b86b74
--- /dev/null
+++ b/airflow-core/src/airflow/ui/src/utils/renderMermaid.ts
@@ -0,0 +1,47 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import type { Mermaid } from "mermaid";
+
+type MermaidTheme = "dark" | "default";
+
+let initializedTheme: MermaidTheme | undefined;
+let mermaidModulePromise: Promise<Mermaid> | undefined;
+
+export const renderMermaidDiagram = async ({
+ chart,
+ diagramId,
+ theme,
+}: {
+ readonly chart: string;
+ readonly diagramId: string;
+ readonly theme: MermaidTheme;
+}): Promise<string> => {
+ mermaidModulePromise ??= import("mermaid").then((module) => module.default);
+
+ const mermaid = await mermaidModulePromise;
+
+ if (initializedTheme !== theme) {
+ mermaid.initialize({ securityLevel: "strict", startOnLoad: false, theme });
+ initializedTheme = theme;
+ }
+
+ const { svg } = await mermaid.render(diagramId, chart);
+
+ return svg;
+};
diff --git a/airflow-core/src/airflow/ui/src/utils/syntaxHighlighter.ts
b/airflow-core/src/airflow/ui/src/utils/syntaxHighlighter.ts
index ff6938be721..9b4891d58c3 100644
--- a/airflow-core/src/airflow/ui/src/utils/syntaxHighlighter.ts
+++ b/airflow-core/src/airflow/ui/src/utils/syntaxHighlighter.ts
@@ -16,6 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
+import type { CSSProperties } from "react";
import { PrismLight as SyntaxHighlighter } from "react-syntax-highlighter";
import bash from "react-syntax-highlighter/dist/esm/languages/prism/bash";
import json from "react-syntax-highlighter/dist/esm/languages/prism/json";
@@ -30,6 +31,7 @@ SyntaxHighlighter.registerLanguage("yaml", yaml);
SyntaxHighlighter.registerLanguage("sql", sql);
SyntaxHighlighter.registerLanguage("bash", bash);
-export { oneDark, oneLight } from
"react-syntax-highlighter/dist/esm/styles/prism";
+export type SyntaxTheme = Record<string, CSSProperties>;
+export { oneDark, oneLight } from
"react-syntax-highlighter/dist/esm/styles/prism";
export { PrismLight as SyntaxHighlighter } from "react-syntax-highlighter";