panel-reactflow 0.2.0rc0__tar.gz → 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/.github/workflows/test.yml +1 -0
  2. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/PKG-INFO +1 -1
  3. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/releases.md +27 -0
  4. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/pixi.lock +58 -42
  5. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/src/panel_reactflow/base.py +10 -14
  6. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/tests/test_api.py +0 -56
  7. panel_reactflow-0.2.1/tests/test_core.py +81 -0
  8. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/tests/ui/test_ui.py +4 -7
  9. panel_reactflow-0.2.0rc0/tests/test_core.py +0 -8
  10. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/.copier-answers.yml +0 -0
  11. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/.gitattributes +0 -0
  12. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/.github/CODEOWNERS +0 -0
  13. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/.github/dependabot.yml +0 -0
  14. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/.github/workflows/build.yml +0 -0
  15. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/.github/workflows/docs.yml +0 -0
  16. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/.gitignore +0 -0
  17. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/.pre-commit-config.yaml +0 -0
  18. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/.prettierrc +0 -0
  19. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/LICENSE.txt +0 -0
  20. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/MANIFEST.in +0 -0
  21. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/README.md +0 -0
  22. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/assets/logo.svg +0 -0
  23. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/assets/screenshots/declare-types.png +0 -0
  24. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/assets/screenshots/define-editors-edge.png +0 -0
  25. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/assets/screenshots/define-editors-node.png +0 -0
  26. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/assets/screenshots/define-nodes-edges.png +0 -0
  27. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/assets/screenshots/embed-views-in-nodes.png +0 -0
  28. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/assets/screenshots/quickstart.png +0 -0
  29. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/assets/screenshots/react-to-events.png +0 -0
  30. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/assets/screenshots/style-nodes-edges.png +0 -0
  31. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/examples.md +0 -0
  32. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/how-to/declare-types.md +0 -0
  33. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/how-to/define-editors.md +0 -0
  34. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/how-to/define-nodes-edges.md +0 -0
  35. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/how-to/embed-views-in-nodes.md +0 -0
  36. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/how-to/react-to-events.md +0 -0
  37. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/how-to/style-nodes-edges.md +0 -0
  38. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/index.md +0 -0
  39. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/quickstart.md +0 -0
  40. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/docs/reference/panel_reactflow.md +0 -0
  41. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/examples/advanced.py +0 -0
  42. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/examples/custom_editor.py +0 -0
  43. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/examples/edge_editors.py +0 -0
  44. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/examples/schema_types.py +0 -0
  45. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/examples/simple.py +0 -0
  46. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/examples/threejs_viewer.py +0 -0
  47. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/hatch_build.py +0 -0
  48. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/pixi.toml +0 -0
  49. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/pyproject.toml +0 -0
  50. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/src/panel_reactflow/__init__.py +0 -0
  51. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/src/panel_reactflow/__version.py +0 -0
  52. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/src/panel_reactflow/dist/css/reactflow.css +0 -0
  53. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/src/panel_reactflow/dist/icons/gear.svg +0 -0
  54. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/src/panel_reactflow/dist/panel-reactflow.bundle.css +0 -0
  55. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/src/panel_reactflow/dist/panel-reactflow.bundle.js +0 -0
  56. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/src/panel_reactflow/models/reactflow.jsx +0 -0
  57. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/src/panel_reactflow/py.typed +0 -0
  58. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/src/panel_reactflow/schema.py +0 -0
  59. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/tests/__init__.py +0 -0
  60. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/tests/conftest.py +0 -0
  61. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/tests/ui/__init__.py +0 -0
  62. {panel_reactflow-0.2.0rc0 → panel_reactflow-0.2.1}/zensical.toml +0 -0
@@ -135,6 +135,7 @@ jobs:
135
135
  environment: ["test-ui"]
136
136
  timeout-minutes: 60
137
137
  env:
138
+ PYTHONIOENCODING: utf8
138
139
  PANEL_LOG_LEVEL: info
139
140
  FAIL: "--screenshot only-on-failure --full-page-screenshot --output ui_screenshots --tracing retain-on-failure"
140
141
  steps:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: panel-reactflow
3
- Version: 0.2.0rc0
3
+ Version: 0.2.1
4
4
  Summary: A Panel wrapper for the Reactflow JS library.
5
5
  Project-URL: Homepage, https://github.com/panel-extensions/panel-reactflow
6
6
  Project-URL: Source, https://github.com/panel-extensions/panel-reactflow
@@ -1,5 +1,32 @@
1
1
  # Release Notes
2
2
 
3
+ ## Version 0.2.0
4
+
5
+ This release focuses on stronger typed graph specs, better node-view handling,
6
+ and improved docs and packaging.
7
+
8
+ ### Highlights
9
+
10
+ - **`NodeSpec` view support** — added a `view` parameter to `NodeSpec` and
11
+ fixed `add_node` behavior so embedded views are preserved when adding nodes
12
+ programmatically.
13
+ - **Safer embedded view handling** — fixed an `AttributeError` when node views
14
+ are Panel `Viewer` objects or other arbitrary view-like objects.
15
+ - **`EdgeSpec` handle targeting** — added `sourceHandle` and `targetHandle`
16
+ fields to support explicit edge-to-port connections.
17
+ - **Spec auto-serialization** — added automatic serialization for `NodeSpec`
18
+ and `EdgeSpec` objects to reduce boilerplate when using dataclass-based graph
19
+ definitions.
20
+ - **Handle rendering fix** — corrected empty handle list behavior so `[]` is
21
+ treated distinctly from missing/undefined handles.
22
+ - **Styling hook for labels** — added the `rf-node-label` CSS class on node
23
+ labels for easier targeted styling.
24
+ - **Docs and onboarding updates** — quickstart and index docs now explicitly
25
+ document the required `pn.extension("jsoneditor")` setup; additional how-to
26
+ docs were updated for new handle and serialization behavior.
27
+ - **Packaging reliability** — ensured the frontend `dist` assets are included
28
+ in distributions.
29
+
3
30
  ## Version 0.1.0
4
31
 
5
32
  *Initial release*
@@ -53,7 +53,7 @@ environments:
53
53
  - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
54
54
  - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
55
55
  - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda
56
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.0-cxx17_h7b12aa8_0.conda
56
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
57
57
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
58
58
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
59
59
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
@@ -195,7 +195,7 @@ environments:
195
195
  - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda
196
196
  - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.18-h90db99b_0.conda
197
197
  - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda
198
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.0-cxx17_h7ed6875_0.conda
198
+ - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
199
199
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda
200
200
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda
201
201
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda
@@ -331,7 +331,7 @@ environments:
331
331
  - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda
332
332
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
333
333
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda
334
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.0-cxx17_h2062a1b_0.conda
334
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
335
335
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
336
336
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
337
337
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
@@ -604,7 +604,7 @@ environments:
604
604
  - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
605
605
  - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
606
606
  - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda
607
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.0-cxx17_h7b12aa8_0.conda
607
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
608
608
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
609
609
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
610
610
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
@@ -731,7 +731,7 @@ environments:
731
731
  - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
732
732
  - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.18-h90db99b_0.conda
733
733
  - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda
734
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.0-cxx17_h7ed6875_0.conda
734
+ - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
735
735
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda
736
736
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda
737
737
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda
@@ -856,7 +856,7 @@ environments:
856
856
  - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
857
857
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
858
858
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda
859
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.0-cxx17_h2062a1b_0.conda
859
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
860
860
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
861
861
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
862
862
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
@@ -1117,7 +1117,7 @@ environments:
1117
1117
  - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
1118
1118
  - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
1119
1119
  - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda
1120
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.0-cxx17_h7b12aa8_0.conda
1120
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
1121
1121
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
1122
1122
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
1123
1123
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
@@ -1250,7 +1250,7 @@ environments:
1250
1250
  - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
1251
1251
  - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.18-h90db99b_0.conda
1252
1252
  - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda
1253
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.0-cxx17_h7ed6875_0.conda
1253
+ - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
1254
1254
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda
1255
1255
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda
1256
1256
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda
@@ -1381,7 +1381,7 @@ environments:
1381
1381
  - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
1382
1382
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
1383
1383
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda
1384
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.0-cxx17_h2062a1b_0.conda
1384
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
1385
1385
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
1386
1386
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
1387
1387
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
@@ -1918,7 +1918,7 @@ environments:
1918
1918
  - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
1919
1919
  - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
1920
1920
  - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda
1921
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.0-cxx17_h7b12aa8_0.conda
1921
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
1922
1922
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
1923
1923
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
1924
1924
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
@@ -2049,7 +2049,7 @@ environments:
2049
2049
  - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
2050
2050
  - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.18-h90db99b_0.conda
2051
2051
  - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda
2052
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.0-cxx17_h7ed6875_0.conda
2052
+ - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
2053
2053
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda
2054
2054
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda
2055
2055
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda
@@ -2176,7 +2176,7 @@ environments:
2176
2176
  - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
2177
2177
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
2178
2178
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda
2179
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.0-cxx17_h2062a1b_0.conda
2179
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
2180
2180
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
2181
2181
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
2182
2182
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
@@ -2438,7 +2438,7 @@ environments:
2438
2438
  - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
2439
2439
  - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
2440
2440
  - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda
2441
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.0-cxx17_h7b12aa8_0.conda
2441
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
2442
2442
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
2443
2443
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
2444
2444
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
@@ -2567,7 +2567,7 @@ environments:
2567
2567
  - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
2568
2568
  - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.18-h90db99b_0.conda
2569
2569
  - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda
2570
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.0-cxx17_h7ed6875_0.conda
2570
+ - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
2571
2571
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda
2572
2572
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda
2573
2573
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda
@@ -2692,7 +2692,7 @@ environments:
2692
2692
  - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
2693
2693
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
2694
2694
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda
2695
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.0-cxx17_h2062a1b_0.conda
2695
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
2696
2696
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
2697
2697
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
2698
2698
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
@@ -2951,7 +2951,7 @@ environments:
2951
2951
  - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
2952
2952
  - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
2953
2953
  - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda
2954
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.0-cxx17_h7b12aa8_0.conda
2954
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
2955
2955
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
2956
2956
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
2957
2957
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
@@ -3080,7 +3080,7 @@ environments:
3080
3080
  - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
3081
3081
  - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.18-h90db99b_0.conda
3082
3082
  - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda
3083
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.0-cxx17_h7ed6875_0.conda
3083
+ - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
3084
3084
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda
3085
3085
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda
3086
3086
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda
@@ -3205,7 +3205,7 @@ environments:
3205
3205
  - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
3206
3206
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
3207
3207
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda
3208
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.0-cxx17_h2062a1b_0.conda
3208
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
3209
3209
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
3210
3210
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
3211
3211
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
@@ -3466,7 +3466,7 @@ environments:
3466
3466
  - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
3467
3467
  - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
3468
3468
  - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda
3469
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.0-cxx17_h7b12aa8_0.conda
3469
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
3470
3470
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
3471
3471
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
3472
3472
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
@@ -3603,7 +3603,7 @@ environments:
3603
3603
  - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
3604
3604
  - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.18-h90db99b_0.conda
3605
3605
  - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda
3606
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.0-cxx17_h7ed6875_0.conda
3606
+ - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
3607
3607
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda
3608
3608
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda
3609
3609
  - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda
@@ -3735,7 +3735,7 @@ environments:
3735
3735
  - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda
3736
3736
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.18-hdfa7624_0.conda
3737
3737
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda
3738
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.0-cxx17_h2062a1b_0.conda
3738
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
3739
3739
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda
3740
3740
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda
3741
3741
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda
@@ -4988,6 +4988,7 @@ packages:
4988
4988
  - python_abi 3.10.* *_cp310
4989
4989
  - tomli
4990
4990
  license: Apache-2.0
4991
+ license_family: APACHE
4991
4992
  size: 312841
4992
4993
  timestamp: 1770720520727
4993
4994
  - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py311h3778330_0.conda
@@ -5000,6 +5001,7 @@ packages:
5000
5001
  - python_abi 3.11.* *_cp311
5001
5002
  - tomli
5002
5003
  license: Apache-2.0
5004
+ license_family: APACHE
5003
5005
  size: 398024
5004
5006
  timestamp: 1770720590264
5005
5007
  - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py312h8a5da7c_0.conda
@@ -5012,6 +5014,7 @@ packages:
5012
5014
  - python_abi 3.12.* *_cp312
5013
5015
  - tomli
5014
5016
  license: Apache-2.0
5017
+ license_family: APACHE
5015
5018
  size: 388190
5016
5019
  timestamp: 1770720373428
5017
5020
  - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py314h67df5f8_0.conda
@@ -5024,6 +5027,7 @@ packages:
5024
5027
  - python_abi 3.14.* *_cp314
5025
5028
  - tomli
5026
5029
  license: Apache-2.0
5030
+ license_family: APACHE
5027
5031
  size: 412776
5028
5032
  timestamp: 1770720660175
5029
5033
  - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.13.4-py310hec06124_0.conda
@@ -5035,6 +5039,7 @@ packages:
5035
5039
  - python_abi 3.10.* *_cp310
5036
5040
  - tomli
5037
5041
  license: Apache-2.0
5042
+ license_family: APACHE
5038
5043
  size: 312040
5039
5044
  timestamp: 1770720572542
5040
5045
  - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.13.4-py311h53ebfaf_0.conda
@@ -5046,6 +5051,7 @@ packages:
5046
5051
  - python_abi 3.11.* *_cp311
5047
5052
  - tomli
5048
5053
  license: Apache-2.0
5054
+ license_family: APACHE
5049
5055
  size: 396141
5050
5056
  timestamp: 1770720638049
5051
5057
  - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.13.4-py312h51361c1_0.conda
@@ -5057,6 +5063,7 @@ packages:
5057
5063
  - python_abi 3.12.* *_cp312
5058
5064
  - tomli
5059
5065
  license: Apache-2.0
5066
+ license_family: APACHE
5060
5067
  size: 386403
5061
5068
  timestamp: 1770720768345
5062
5069
  - conda: https://conda.anaconda.org/conda-forge/osx-64/coverage-7.13.4-py314h10d0514_0.conda
@@ -5068,6 +5075,7 @@ packages:
5068
5075
  - python_abi 3.14.* *_cp314
5069
5076
  - tomli
5070
5077
  license: Apache-2.0
5078
+ license_family: APACHE
5071
5079
  size: 409993
5072
5080
  timestamp: 1770720688859
5073
5081
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.4-py310hb46c203_0.conda
@@ -5080,6 +5088,7 @@ packages:
5080
5088
  - python_abi 3.10.* *_cp310
5081
5089
  - tomli
5082
5090
  license: Apache-2.0
5091
+ license_family: APACHE
5083
5092
  size: 313175
5084
5093
  timestamp: 1770720930051
5085
5094
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.4-py311hc290fe0_0.conda
@@ -5092,6 +5101,7 @@ packages:
5092
5101
  - python_abi 3.11.* *_cp311
5093
5102
  - tomli
5094
5103
  license: Apache-2.0
5104
+ license_family: APACHE
5095
5105
  size: 396883
5096
5106
  timestamp: 1770720925825
5097
5107
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.4-py312h04c11ed_0.conda
@@ -5104,6 +5114,7 @@ packages:
5104
5114
  - python_abi 3.12.* *_cp312
5105
5115
  - tomli
5106
5116
  license: Apache-2.0
5117
+ license_family: APACHE
5107
5118
  size: 386007
5108
5119
  timestamp: 1770720691274
5109
5120
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.13.4-py314h6e9b3f0_0.conda
@@ -5116,6 +5127,7 @@ packages:
5116
5127
  - python_abi 3.14.* *_cp314
5117
5128
  - tomli
5118
5129
  license: Apache-2.0
5130
+ license_family: APACHE
5119
5131
  size: 412030
5120
5132
  timestamp: 1770720628409
5121
5133
  - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.13.4-py310hdb0e946_0.conda
@@ -5129,6 +5141,7 @@ packages:
5129
5141
  - vc >=14.3,<15
5130
5142
  - vc14_runtime >=14.44.35208
5131
5143
  license: Apache-2.0
5144
+ license_family: APACHE
5132
5145
  size: 338989
5133
5146
  timestamp: 1770720465029
5134
5147
  - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.13.4-py311h3f79411_0.conda
@@ -5142,6 +5155,7 @@ packages:
5142
5155
  - vc >=14.3,<15
5143
5156
  - vc14_runtime >=14.44.35208
5144
5157
  license: Apache-2.0
5158
+ license_family: APACHE
5145
5159
  size: 422950
5146
5160
  timestamp: 1770720459873
5147
5161
  - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.13.4-py312h05f76fc_0.conda
@@ -5155,6 +5169,7 @@ packages:
5155
5169
  - vc >=14.3,<15
5156
5170
  - vc14_runtime >=14.44.35208
5157
5171
  license: Apache-2.0
5172
+ license_family: APACHE
5158
5173
  size: 414159
5159
5174
  timestamp: 1770720457033
5160
5175
  - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.13.4-py314h2359020_0.conda
@@ -5168,6 +5183,7 @@ packages:
5168
5183
  - vc >=14.3,<15
5169
5184
  - vc14_runtime >=14.44.35208
5170
5185
  license: Apache-2.0
5186
+ license_family: APACHE
5171
5187
  size: 438221
5172
5188
  timestamp: 1770720521756
5173
5189
  - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda
@@ -5779,46 +5795,46 @@ packages:
5779
5795
  license_family: Apache
5780
5796
  size: 164701
5781
5797
  timestamp: 1745264384716
5782
- - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.0-cxx17_h7b12aa8_0.conda
5783
- sha256: 4fede984871c04a51b128db194d9cb934973eb38f45a1409921a656163d200cc
5784
- md5: 84b8463a0baf635729d08be74957800a
5798
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda
5799
+ sha256: a7a4481a4d217a3eadea0ec489826a69070fcc3153f00443aa491ed21527d239
5800
+ md5: 6f7b4302263347698fd24565fbf11310
5785
5801
  depends:
5786
5802
  - __glibc >=2.17,<3.0.a0
5787
5803
  - libgcc >=14
5788
5804
  - libstdcxx >=14
5789
5805
  constrains:
5790
- - abseil-cpp =20260107.0
5791
- - libabseil-static =20260107.0=cxx17*
5806
+ - libabseil-static =20260107.1=cxx17*
5807
+ - abseil-cpp =20260107.1
5792
5808
  license: Apache-2.0
5793
5809
  license_family: Apache
5794
- size: 1382316
5795
- timestamp: 1768184695773
5796
- - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.0-cxx17_h7ed6875_0.conda
5797
- sha256: cce448f0c4de6e35dfc9d106ccd8248b947a1a129815b22299fef9ded267c476
5798
- md5: 56c6f732ff7d467b0fbb3800fe31a768
5810
+ size: 1384817
5811
+ timestamp: 1770863194876
5812
+ - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda
5813
+ sha256: 2b4ff36082ddfbacc47ac6e11d4dd9f3403cd109ce8d7f0fbee0cdd47cdef013
5814
+ md5: 317f40d7bd7bf6d54b56d4a5b5f5085d
5799
5815
  depends:
5800
5816
  - __osx >=10.13
5801
5817
  - libcxx >=19
5802
5818
  constrains:
5803
- - abseil-cpp =20260107.0
5804
- - libabseil-static =20260107.0=cxx17*
5819
+ - libabseil-static =20260107.1=cxx17*
5820
+ - abseil-cpp =20260107.1
5805
5821
  license: Apache-2.0
5806
5822
  license_family: Apache
5807
- size: 1219501
5808
- timestamp: 1768185033011
5809
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.0-cxx17_h2062a1b_0.conda
5810
- sha256: 7882ed261cae510f2fce7d61f6892de3482946a935d5f124b34a06af5220d82c
5811
- md5: 160a2437f91ee5e1bc0178b2837a193c
5823
+ size: 1217836
5824
+ timestamp: 1770863510112
5825
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda
5826
+ sha256: 756611fbb8d2957a5b4635d9772bd8432cb6ddac05580a6284cca6fdc9b07fca
5827
+ md5: bb65152e0d7c7178c0f1ee25692c9fd1
5812
5828
  depends:
5813
5829
  - __osx >=11.0
5814
5830
  - libcxx >=19
5815
5831
  constrains:
5816
- - libabseil-static =20260107.0=cxx17*
5817
- - abseil-cpp =20260107.0
5832
+ - abseil-cpp =20260107.1
5833
+ - libabseil-static =20260107.1=cxx17*
5818
5834
  license: Apache-2.0
5819
5835
  license_family: Apache
5820
- size: 1231315
5821
- timestamp: 1768185015693
5836
+ size: 1229639
5837
+ timestamp: 1770863511331
5822
5838
  - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
5823
5839
  build_number: 5
5824
5840
  sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c
@@ -21,7 +21,6 @@ from panel.io.state import state
21
21
  from panel.util import base_version, classproperty
22
22
  from panel.viewable import Viewer
23
23
  from panel.widgets import JSONEditor
24
- from panel_material_ui import Paper
25
24
 
26
25
  from .__version import __version__ # noqa
27
26
 
@@ -925,7 +924,7 @@ class SchemaEditor(Editor):
925
924
  lambda event, _n=name: self._on_widget_change(_n, event),
926
925
  "value",
927
926
  )
928
- self._panel = Paper(self._form, margin=0)
927
+ self._panel = self._form.layout
929
928
  except Exception:
930
929
  # Graceful fallback if JSONSchema rendering fails
931
930
  # (e.g. missing pandas dependency).
@@ -1367,18 +1366,15 @@ class ReactFlow(ReactComponent):
1367
1366
 
1368
1367
  children: dict[str, list[UIElement] | UIElement | None] = {}
1369
1368
  old_models: list[UIElement] = []
1370
- if views:
1371
- views, view_models = self._get_child_model(views, doc, root, parent, comm)
1372
- children["_views"] = views
1373
- old_models += view_models
1374
- if node_editors:
1375
- editor_models, editor_old = self._get_child_model(node_editors, doc, root, parent, comm)
1376
- children["_node_editor_views"] = editor_models
1377
- old_models += editor_old
1378
- if edge_editors:
1379
- edge_models, edge_old = self._get_child_model(edge_editors, doc, root, parent, comm)
1380
- children["_edge_editor_views"] = edge_models
1381
- old_models += edge_old
1369
+ views, view_models = self._get_child_model(views, doc, root, parent, comm)
1370
+ children["_views"] = views
1371
+ old_models += view_models
1372
+ editor_models, editor_old = self._get_child_model(node_editors, doc, root, parent, comm)
1373
+ children["_node_editor_views"] = editor_models
1374
+ old_models += editor_old
1375
+ edge_models, edge_old = self._get_child_model(edge_editors, doc, root, parent, comm)
1376
+ children["_edge_editor_views"] = edge_models
1377
+ old_models += edge_old
1382
1378
  for name in ("top_panel", "bottom_panel", "left_panel", "right_panel"):
1383
1379
  panels = list(getattr(self, name, []) or [])
1384
1380
  if panels:
@@ -147,62 +147,6 @@ def test_reactflow_add_node_with_view() -> None:
147
147
  assert events[-1]["type"] == "node_added"
148
148
 
149
149
 
150
- def test_view_idx_updates_on_remove_node(document, comm) -> None:
151
- flow = ReactFlow()
152
- flow.add_node({"id": "n1", "position": {"x": 0, "y": 0}, "data": {}, "view": pn.pane.Markdown("A")})
153
- flow.add_node({"id": "n2", "position": {"x": 1, "y": 1}, "data": {}, "view": pn.pane.Markdown("B")})
154
- flow.add_node({"id": "n3", "position": {"x": 2, "y": 2}, "data": {}})
155
-
156
- model = flow.get_root(document, comm=comm)
157
-
158
- flow.remove_node("n1")
159
-
160
- remaining = {node["id"]: node for node in model.data.nodes}
161
- assert remaining["n2"]["data"]["view_idx"] == 0
162
- assert remaining["n3"]["data"].get("view_idx") is None
163
-
164
-
165
- def test_reactflow_add_node_with_viewer(document, comm) -> None:
166
- """Test that Viewer objects with __panel__() method work as node views."""
167
-
168
- class MyViewer(pn.viewable.Viewer):
169
- def __panel__(self):
170
- return pn.pane.Markdown("Hello from Viewer!")
171
-
172
- flow = ReactFlow()
173
- my_viewer = MyViewer()
174
- flow.add_node({"id": "n1", "position": {"x": 0, "y": 0}, "label": "Viewer Node", "data": {}, "view": my_viewer})
175
-
176
- # This should not raise AttributeError about '_models'
177
- _ = flow.get_root(document, comm=comm)
178
- assert len(flow.nodes) == 1
179
- assert flow.nodes[0]["id"] == "n1"
180
-
181
-
182
- def test_reactflow_add_node_with_arbitrary_object(document, comm) -> None:
183
- """Test that arbitrary objects (e.g., HoloViews) work as node views via pn.panel().
184
-
185
- This addresses issue #13 where objects without __panel__() method
186
- (like HoloViews Curve objects) would raise AttributeError.
187
- """
188
-
189
- class MockPlot:
190
- """Mock object simulating HoloViews/hvplot objects (no __panel__ method)."""
191
-
192
- def __repr__(self):
193
- return "MockPlot(data)"
194
-
195
- flow = ReactFlow()
196
- mock_plot = MockPlot()
197
- flow.add_node({"id": "n1", "position": {"x": 0, "y": 0}, "label": "Plot Node", "data": {}, "view": mock_plot})
198
-
199
- # This should not raise AttributeError about '_models'
200
- # The object should be converted via pn.panel()
201
- _ = flow.get_root(document, comm=comm)
202
- assert len(flow.nodes) == 1
203
- assert flow.nodes[0]["id"] == "n1"
204
-
205
-
206
150
  def test_reactflow_events_and_selection() -> None:
207
151
  flow = ReactFlow()
208
152
  events = []
@@ -0,0 +1,81 @@
1
+ """Tests for ReactFlow model creation."""
2
+
3
+ from panel.pane import Markdown
4
+ from panel.viewable import Viewer
5
+
6
+ from panel_reactflow import ReactFlow
7
+
8
+
9
+ def test_reactflow_add_node_with_arbitrary_object(document, comm) -> None:
10
+ """Test that arbitrary objects (e.g., HoloViews) work as node views via pn.panel().
11
+
12
+ This addresses issue #13 where objects without __panel__() method
13
+ (like HoloViews Curve objects) would raise AttributeError.
14
+ """
15
+
16
+ class MockPlot:
17
+ """Mock object simulating HoloViews/hvplot objects (no __panel__ method)."""
18
+
19
+ def __repr__(self):
20
+ return "MockPlot(data)"
21
+
22
+ flow = ReactFlow()
23
+ mock_plot = MockPlot()
24
+ flow.add_node({"id": "n1", "position": {"x": 0, "y": 0}, "label": "Plot Node", "data": {}, "view": mock_plot})
25
+
26
+ # This should not raise AttributeError about '_models'
27
+ # The object should be converted via pn.panel()
28
+ _ = flow.get_root(document, comm=comm)
29
+ assert len(flow.nodes) == 1
30
+ assert flow.nodes[0]["id"] == "n1"
31
+
32
+
33
+ def test_view_idx_updates_on_remove_node(document, comm) -> None:
34
+ flow = ReactFlow()
35
+ flow.add_node({"id": "n1", "position": {"x": 0, "y": 0}, "data": {}, "view": Markdown("A")})
36
+ flow.add_node({"id": "n2", "position": {"x": 1, "y": 1}, "data": {}, "view": Markdown("B")})
37
+ flow.add_node({"id": "n3", "position": {"x": 2, "y": 2}, "data": {}})
38
+
39
+ model = flow.get_root(document, comm=comm)
40
+
41
+ flow.remove_node("n1")
42
+
43
+ remaining = {node["id"]: node for node in model.data.nodes}
44
+ assert remaining["n2"]["data"]["view_idx"] == 0
45
+ assert remaining["n3"]["data"].get("view_idx") is None
46
+
47
+
48
+ def test_reactflow_add_node_with_viewer(document, comm) -> None:
49
+ """Test that Viewer objects with __panel__() method work as node views."""
50
+
51
+ class MyViewer(Viewer):
52
+ def __panel__(self):
53
+ return Markdown("Hello from Viewer!")
54
+
55
+ flow = ReactFlow()
56
+ my_viewer = MyViewer()
57
+ flow.add_node({"id": "n1", "position": {"x": 0, "y": 0}, "label": "Viewer Node", "data": {}, "view": my_viewer})
58
+
59
+ # This should not raise AttributeError about '_models'
60
+ _ = flow.get_root(document, comm=comm)
61
+ assert len(flow.nodes) == 1
62
+ assert flow.nodes[0]["id"] == "n1"
63
+
64
+
65
+ def test_reactflow_add_node_dynamically_creates_views(document, comm):
66
+ flow = ReactFlow()
67
+ model = flow.get_root(document, comm=comm)
68
+ assert model.children == [
69
+ "_views",
70
+ "_node_editor_views",
71
+ "_edge_editor_views",
72
+ "top_panel",
73
+ "bottom_panel",
74
+ "left_panel",
75
+ "right_panel",
76
+ ]
77
+
78
+ flow.add_node({"id": "n1", "position": {"x": 0, "y": 0}, "label": "Viewer Node", "data": {}, "view": Markdown("foo")})
79
+
80
+ assert len(model.data._views) == 1
81
+ assert len(model.data._node_editor_views) == 1
@@ -5,7 +5,7 @@ import panel.models.jsoneditor # noqa
5
5
  import pytest
6
6
  from panel.tests.util import serve_component, wait_until
7
7
 
8
- from panel_reactflow import EdgeSpec, NodeSpec, NodeType, ReactFlow
8
+ from panel_reactflow import EdgeSpec, JsonEditor, NodeSpec, NodeType, ReactFlow
9
9
 
10
10
  pytest.importorskip("playwright")
11
11
 
@@ -30,12 +30,8 @@ _TASK_SCHEMA = {
30
30
  def _make_flow(*, editor_mode="toolbar", include_edge=True):
31
31
  nodes = [
32
32
  NodeSpec(
33
- id="n1",
34
- position={"x": 0, "y": 0},
35
- label="Start",
36
- data={"status": "idle", "notes": "Alpha"},
37
- ).to_dict()
38
- | {"view": pn.pane.Markdown("Node view for start")},
33
+ id="n1", position={"x": 0, "y": 0}, label="Start", data={"status": "idle", "notes": "Alpha"}, view=pn.pane.Markdown("Node view for start")
34
+ ).to_dict(),
39
35
  NodeSpec(
40
36
  id="n2",
41
37
  position={"x": 260, "y": 60},
@@ -56,6 +52,7 @@ def _make_flow(*, editor_mode="toolbar", include_edge=True):
56
52
  flow = ReactFlow(
57
53
  nodes=nodes,
58
54
  edges=edges,
55
+ node_editors={"panel": JsonEditor},
59
56
  node_types={
60
57
  "panel": NodeType(type="panel", label="Panel", schema=_TASK_SCHEMA),
61
58
  },
@@ -1,8 +0,0 @@
1
- """Core tests module."""
2
-
3
- import panel_reactflow # noqa
4
-
5
-
6
- def test_example():
7
- """Test example."""
8
- assert panel_reactflow