Repository: mckinsey/vizro
Pull request #1063: [Fix] Kedro integration bugs
Author: login: antonymilne
Created: 2025-03-13T15:26:03Z | Merged: 2025-03-17T10:42:23Z

## Description

The recent improvements to kedro integration had one big bug due to [late binding](https://jellis18.github.io/post/2022-11-23-late-binding-python/) and one small bug for versioned datasets. Thanks to @maxschulz-COL for spotting these!

@maxschulz-COL I haven't tested this on a real kedro project myself since you were sort of doing that as we went along. Please could you double check this branch fixes everything on your real app? 🙏 

## Screenshot

## Notice

- [x] I acknowledge and agree that, by checking this box and clicking "Submit Pull Request":

    - I submit this contribution under the [Apache 2.0 license](https://www.apache.org/licenses/LICENSE-2.0.txt) and represent that I am entitled to do so on behalf of myself, my employer, or relevant third parties, as applicable.
    - I certify that (a) this contribution is my original creation and / or (b) to the extent it is not my original creation, I am authorized to submit this contribution on behalf of the original creator(s) or their licensees.
    - I certify that the use of this contribution as authorized by the Apache 2.0 license does not violate the intellectual property rights of anyone else.
    - I have not referenced individuals, products or companies in any commits, directly or indirectly.
    - I have not added data or restricted code in any commits, directly or indirectly.



Diff:
diff --git a/vizro-core/changelog.d/20250313_145511_antony.milne_kedro_integratio.md b/vizro-core/changelog.d/20250313_145511_antony.milne_kedro_integratio.md
new file mode 100644
index 0000000000..5630f48fb5
--- /dev/null
+++ b/vizro-core/changelog.d/20250313_145511_antony.milne_kedro_integratio.md
@@ -0,0 +1,48 @@
+<!--
+A new scriv changelog fragment.
+
+Uncomment the section that is right (remove the HTML comment wrapper).
+-->
+
+<!--
+### Highlights ✨
+
+- A bullet item for the Highlights ✨ category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Removed
+
+- A bullet item for the Removed category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Added
+
+- A bullet item for the Added category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Changed
+
+- A bullet item for the Changed category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Deprecated
+
+- A bullet item for the Deprecated category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+
+### Fixed
+
+- Fix `datasets_from_catalog` for `kedro>=0.19.9`. ([#1063](https://github.com/mckinsey/vizro/pull/1063))
+- `datasets_from_catalog` now loads the latest version of versioned datasets. ([#1063](https://github.com/mckinsey/vizro/pull/1063))
+
+<!--
+### Security
+
+- A bullet item for the Security category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
diff --git a/vizro-core/src/vizro/integrations/kedro/_data_manager.py b/vizro-core/src/vizro/integrations/kedro/_data_manager.py
index af117d0c8c..f8a0a83394 100644
--- a/vizro-core/src/vizro/integrations/kedro/_data_manager.py
+++ b/vizro-core/src/vizro/integrations/kedro/_data_manager.py
@@ -102,11 +102,19 @@ def datasets_from_catalog(catalog: CatalogProtocol, *, pipeline: Pipeline = None
             if dataset_config := config_resolver.resolve_pattern(dataset_name):
                 kedro_datasets[dataset_name] = dataset_config
 
+    def _catalog_release_load(dataset_name: str):
+        # release is needed to clear the Kedro load version cache so that the dashboard always fetches the most recent
+        # version rather than being stuck on the same version as when the app started.
+        catalog.release(dataset_name)
+        return catalog.load(dataset_name)
+
     vizro_data_sources = {}
 
     for dataset_name, dataset_config in kedro_datasets.items():
         # "type" key always exists because we filtered out patterns that resolve to empty dictionary above.
         if "pandas" in dataset_config["type"]:
-            vizro_data_sources[dataset_name] = lambda: catalog.load(dataset_name)
+            # We need to bind dataset_name=dataset_name early to avoid dataset_name late-binding to the last value in
+            # the for loop.
+            vizro_data_sources[dataset_name] = lambda dataset_name=dataset_name: _catalog_release_load(dataset_name)
 
     return vizro_data_sources
diff --git a/vizro-core/tests/unit/vizro/integrations/kedro/test_kedro_data_manager.py b/vizro-core/tests/unit/vizro/integrations/kedro/test_kedro_data_manager.py
index 38c23b7eaa..19ed38ed08 100644
--- a/vizro-core/tests/unit/vizro/integrations/kedro/test_kedro_data_manager.py
+++ b/vizro-core/tests/unit/vizro/integrations/kedro/test_kedro_data_manager.py
@@ -11,7 +11,9 @@
 
 from vizro.integrations.kedro import datasets_from_catalog
 
-if parse(version("kedro")) >= parse("0.19.9"):
+LEGACY_KEDRO = parse(version("kedro")) < parse("0.19.9")
+
+if not LEGACY_KEDRO:
     # KedroDataCatalog only exists and hence can only be tested against in kedro>=0.19.9.
     from kedro.io import KedroDataCatalog
 
@@ -31,6 +33,15 @@ def test_datasets_from_catalog(catalog, mocker):
     datasets = datasets_from_catalog(catalog)
     assert datasets == {"pandas_excel": mocker.ANY, "pandas_parquet": mocker.ANY}
 
+    if not LEGACY_KEDRO:
+        # Make sure that dataset_name is bound early to the data loading function.
+        # Mocking for legacy kedro (tested by lower-bounds environment) would work differently but is not subject
+        # to the same potential late-binding bug since it uses catalog._get_dataset so doesn't need to be tested.
+        mocker.patch.object(catalog, "load")
+        for dataset_name, dataset_loader in datasets.items():
+            dataset_loader()
+            catalog.load.assert_called_with(dataset_name)
+
 
 def test_datasets_from_catalog_with_pipeline(catalog, mocker):
     pipeline = kp.pipeline(
@@ -55,8 +66,17 @@ def test_datasets_from_catalog_with_pipeline(catalog, mocker):
     # Dataset factories only work for kedro>=0.19.9.
     expected_dataset_names = (
         {"pandas_excel", "pandas_parquet", "something#csv", "something_else#csv"}
-        if parse(version("kedro")) >= parse("0.19.9")
+        if not LEGACY_KEDRO
         else {"pandas_excel", "pandas_parquet"}
     )
 
     assert datasets == {dataset_name: mocker.ANY for dataset_name in expected_dataset_names}
+
+    if not LEGACY_KEDRO:
+        # Make sure that dataset_name is bound early to the data loading function.
+        # Mocking for legacy kedro (tested by lower-bounds environment) would work differently but is not subject
+        # to the same potential late-binding bug since it uses catalog._get_dataset so doesn't need to be tested.
+        mocker.patch.object(catalog, "load")
+        for dataset_name, dataset_loader in datasets.items():
+            dataset_loader()
+            catalog.load.assert_called_with(dataset_name)


Reviews:
user: login: antonymilne
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-13T15:29:38Z
user: login: maxschulz-COL
body: ⭐  Thanks for fixing!

Approved since this is pretty much how I fixed it, although I define the function in the for loop.

I can only test this on Monday, so if you want to wait for that test, don't merge. But looks good to me in case you wanna merge earlier 
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-13T20:55:20Z
user: login: petar-qb
body: What an interesting problem! Thanks for solving the it quickly.


state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-17T08:29:22Z
user: login: antonymilne
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-17T09:56:05Z
user: login: antonymilne
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-17T09:57:15Z
user: login: maxschulz-COL
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-17T10:28:24Z

Review comments:
diff_hunk: @@ -0,0 +1,47 @@
+<!--
+A new scriv changelog fragment.
+
+Uncomment the section that is right (remove the HTML comment wrapper).
+-->
+
+<!--
+### Highlights ✨
+
+- A bullet item for the Highlights ✨ category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Removed
+
+- A bullet item for the Removed category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Added
+
+- A bullet item for the Added category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Changed
+
+- A bullet item for the Changed category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Deprecated
+
+- A bullet item for the Deprecated category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+
+### Fixed
+
+- A bullet item for the Fixed category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
path: vizro-core/changelog.d/20250313_145511_antony.milne_kedro_integratio.md
user: login: antonymilne
body: ```suggestion
- Fix `datasets_from_catalog` for `kedro>=0.19.9`. ([#1063](https://github.com/mckinsey/vizro/pull/1063))
- `datasets_from_catalog` now loads the latest version of versioned datasets. ([#1063](https://github.com/mckinsey/vizro/pull/1063))
```
created_at: 2025-03-13T15:29:38Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,48 @@
+<!--
+A new scriv changelog fragment.
+
+Uncomment the section that is right (remove the HTML comment wrapper).
+-->
+
+<!--
+### Highlights ✨
+
+- A bullet item for the Highlights ✨ category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Removed
+
+- A bullet item for the Removed category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Added
+
+- A bullet item for the Added category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Changed
+
+- A bullet item for the Changed category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Deprecated
+
+- A bullet item for the Deprecated category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+
+### Fixed
+
+- Fix `datasets_from_catalog` for `kedro>=0.19.9`. ([#1063](https://github.com/mckinsey/vizro/pull/1063))
path: vizro-core/changelog.d/20250313_145511_antony.milne_kedro_integratio.md
user: login: maxschulz-COL
body: Is that necessary given we haven't released the other change?
created_at: 2025-03-13T20:50:01Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,48 @@
+<!--
+A new scriv changelog fragment.
+
+Uncomment the section that is right (remove the HTML comment wrapper).
+-->
+
+<!--
+### Highlights ✨
+
+- A bullet item for the Highlights ✨ category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Removed
+
+- A bullet item for the Removed category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Added
+
+- A bullet item for the Added category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Changed
+
+- A bullet item for the Changed category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Deprecated
+
+- A bullet item for the Deprecated category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+
+### Fixed
+
+- Fix `datasets_from_catalog` for `kedro>=0.19.9`. ([#1063](https://github.com/mckinsey/vizro/pull/1063))
path: vizro-core/changelog.d/20250313_145511_antony.milne_kedro_integratio.md
user: login: antonymilne
body: No, it wouldn't be if we hadn't released the other change. But it seems like with vizro 0.1.34 we had released something to do with `datasets_from_catalog`: https://github.com/mckinsey/vizro/releases/tag/0.1.34.

I'm a bit confused by the sequence of things here since you say the bug didn't exist in vizro 0.1.34 and the docs weren't there either... But whatever's happened, it's in the changelog for a previous version so it makes sense to mention as a fix for this version. 
created_at: 2025-03-17T09:56:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,48 @@
+<!--
+A new scriv changelog fragment.
+
+Uncomment the section that is right (remove the HTML comment wrapper).
+-->
+
+<!--
+### Highlights ✨
+
+- A bullet item for the Highlights ✨ category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Removed
+
+- A bullet item for the Removed category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Added
+
+- A bullet item for the Added category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Changed
+
+- A bullet item for the Changed category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Deprecated
+
+- A bullet item for the Deprecated category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+
+### Fixed
+
+- Fix `datasets_from_catalog` for `kedro>=0.19.9`. ([#1063](https://github.com/mckinsey/vizro/pull/1063))
path: vizro-core/changelog.d/20250313_145511_antony.milne_kedro_integratio.md
user: login: antonymilne
body: And yes please to testing it still, I'm happy to wait until that 🙏  I'm like 99% sure this is all good as a fix but would be good to double check just in case the definition of the function inside vs. outside the for loop makes a difference and I've missed something subtle.
created_at: 2025-03-17T09:57:15Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,48 @@
+<!--
+A new scriv changelog fragment.
+
+Uncomment the section that is right (remove the HTML comment wrapper).
+-->
+
+<!--
+### Highlights ✨
+
+- A bullet item for the Highlights ✨ category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Removed
+
+- A bullet item for the Removed category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Added
+
+- A bullet item for the Added category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Changed
+
+- A bullet item for the Changed category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+<!--
+### Deprecated
+
+- A bullet item for the Deprecated category with a link to the relevant PR at the end of your entry, e.g. Enable feature XXX. ([#1](https://github.com/mckinsey/vizro/pull/1))
+
+-->
+
+### Fixed
+
+- Fix `datasets_from_catalog` for `kedro>=0.19.9`. ([#1063](https://github.com/mckinsey/vizro/pull/1063))
path: vizro-core/changelog.d/20250313_145511_antony.milne_kedro_integratio.md
user: login: maxschulz-COL
body: Yes, works like a charm, so happy to merge
created_at: 2025-03-17T10:28:24Z
author_association: CONTRIBUTOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-03-13T15:28:40Z
body: ## View the example dashboards of the current commit live on PyCafe :coffee: :rocket:

Updated on: 2025-03-17 10:41:53 UTC
Commit: e411fcbb110702e63b3933180bac382f9b2312b5

Compare the examples using the commit's wheel file vs the latest released version:
### vizro-core/examples/scratch_dev
[View with commit's wheel](https://py.cafe/snippet/vizro/v1?c=H4sIAGj812cC%2F81XbW%2FbNhD%2BK4T6RS4cyi%2FJWgfwhyxuuwHdUiTBvkSGQEmUTUQiOZJy7AX57ztKsizJSroNK2DbCUze23N3j8nTsxOJmDqXyPGL94JuEJESGYGM2iGzZnylkcgNLuU%2B9znLpFAGGZbRerEjWdqQxUSv64UkHNYIPjL2eaJEhpKU6McgIpH1jyq9a1jShpMN%2B0sJnAG%2BtLDeZB2RTIVJd5hupaK6DLCtAhQKe8d%2F2EVTgDPCyYoqjWq8hgTV5h5iziMjRFrrSKIMI0WWPr%2F79un61093wfXN15vbOzRHz76jqRGa%2BFBM33k3GoXnSeI7Q1hsIBKLRCpUJUyS2WQyqYRMrRhn0d5wOjufkdB3Xnz%2B89VtcP3L1e09hPn9MwSJWWTc7RxCSRoxqq2Hwm%2FPVhAzHSlqKOQl5228A0jg%2Bur%2B%2FtOr%2FqkkaZBSvjJr63EHe5Ka1t5%2FDGzfMU1QsKIm0IYYFgVMMe0OLn2O4NXYA0hyi21zcKlypPHgOyCmAUTOM%2B47S2sS42JPEb6iLigrM4c9IwK7bWnr%2Bs5kNDk%2FG43h4zuDIZJUMRHrOaTnNtyDJFH0T8hyAWpldEgtV7wJ4pBUKkgcxDtOskpkQ5I6NRsb65RS6Y7wRVEMux0ngPq4HnvxEzNrJCQgK5IluPixFeQBQg0s7xOW0ipG4RC0Ck7WO%2FbVZOho2JW1Sdojb%2FL0WJwx%2FoqAbK1gfCwpmlTZtRvyimrpaa96cTaZtVRf2gXAubRmrq0W1iShge2Oa0s1QEKh55dDAyokJXmaRLGOHppQl4OmCdl%2Bx8RCrk1sm%2BPkAT5d1uKQmicKHd4HGtYBhojxKM0121CgYSjsj2%2Bw3COvyBgnFQcb5xgEaXK0%2BGn0kaxj02RvadRP6jKgBKtgDEqbDH%2BD7%2B6e6Ca1cBelFdpodFdEtUw1cMbu%2BxYJOFw55UbPHw7tA2dfFJFrt80DFs8P%2BFZW4Ygq3cBferUStsoVncPZEhJVNCxIFMnovJv%2BEL1%2F3z6FBw1Xze9vQa4K%2Fjbiqj7fA6wjYqCAbdCtPlvMx6d7H%2B5l3QRuFNx0zRa8Q%2FsS3sEVndJWpp%2BLJnZSLck871C7my1RQEEbqdvIZUdT05TCBazmEG8BHr%2Bx6BFidhtcoYOsi%2BN%2B%2Fpmkmr7WpENSv%2BWpYaeaUwnOeT2Liis%2FqjNtvv7LJNrY%2FmlfKqsf1Jb%2FI6HvNmVBEwI6CI4z5FbBqykBwQSMKm6gAoUeXPal2Z9YO86NWVNVnaPI7CTVl01xj7N6Qms76tNszX3Nc2JQXi96HQqi4vLAX%2ByXrr0GoNLlbbCsprxi7HYHOMxZGru17QCrnNuLB7jhwHCVM0UzewPYp5C1MVJfep7c4QiubG%2B19uzYnZDIeFn0yLimO6%2BY4T3YYoJrD7xpbzz9OPswvRjPPlx4kslS5WyEx3h6gWO6GZ3J3fSMQ2%2FOCN%2Fhp3Vqo9tZwIZ9eHagN8VjkEc0TEnaizT85dqIDMNXq5yrtIlQkSe8gsksD3NNlT1CIQcM91kXJz0fj5MoDMfj0YfRhP40Daez6XT8cRSSaPpxkszCyXQ8CS8qzJFQ1KNbkknA5sEkTUy0DiCFV5C9DNEx%2BoRsYJbjGP6dEvQmrF7cLLNE8uAJFOvN6pSgd5D1ok%2FFSpwa7hpTG3H9HHESWA9o2ijtVlA8mAhelF7uTgJvH643kNdH3%2BlU%2FC18L8uXvwFFHJiHFxIAAA%3D%3D) vs [View with latest release](https://py.cafe/snippet/vizro/v1?c=H4sIAGj812cC%2F81XbW%2BrNhT%2BKxb3C1yl5K3dbirxoWt67yZta9VW%2B1IiZMAkVsFmtkmTVfnvOzaEAiHtNu1KSdIq9nl7zjlPjs2rFfGYWJfI8s17TtYI5zlSHCmxRWpF2VIiXii3lPvMZzTLuVBI0YzUiy3O0oYsxnJVL3LMYI3gk8c%2BSwTPUJJi%2BRxEONL%2BUaV3DUvScLKmfwnuZoAvNdbrrCPKU67SrUs2uSCyDLCpAhiFveM%2F9KIpcDPM8JIIiWq8CgfV5h5iwSLFeVrr5Fgoik2WPnu4u7n%2B5eYhuL799fb%2BAXno1bckUVxiH4rpW59Go%2FA8SXxrAIs1RKIRT7mohEkym0wmlZCKJWU02htOZ%2BczHPrWzmc%2FXd0H1z9f3T9CmN%2B%2FQpCYRsreeBAqJxElUnswfnu2gpjKSBBFIK%2Fca%2BN1IIHrq8fHm6P%2BSY7TICVsqVba4xb2cqJae%2F8xsH7HJEHBkqhAKqxoFFBBpe1c%2BgzBq7EHkPKNq5vjlioHGk%2B%2BBWISQOQiY7610Caxa%2FYEZktig7JQHuwpHuhtTVvbtyajyfnZaAwf33IGKCeC8lh6kJ7dcA%2BSRJA%2FIcs5qJXRIbVCsCaIt6RSjuMg3jKcVSIdEtep6diuTAnJ7ZF7YYqht%2BMEUB%2FWYy9%2BoWqFeA7ITLLYNT82Qx4glKN5n9CUVDGMQ9AynKx39KvJ0NGgK2uTtEfe5OmhOKPsiABvtGB8KDFNquzaDTmiWnraq16cTWYt1V27AG6RazNbV8uVOCGB7o6tS%2BUgLtDr7q0BFZKSPE2iaEdPTagLp2mCNx%2BYaMi1iW5znDzBp8taNyTqhUCH94EGdYABoixKC0nXBGgYcv3jcxZ75BUZ46TiYGOOQZAmR81Po49kHZsme0ujflKXAXOwCsagtM7cO%2Fhu74muUg13XlqhtUQPJqpmqoIZu%2B9bxGG4MsKU9J7e2gfOvgmcr%2Bw2D2jsveFbaoUDqnQDf%2BvVSuiyEMSD2RJiYRoWJAJnxOumP0CfP7ensNNw1fz%2BHuSq4O8jrurzEWAZYQUFbINu9VljPpzufbgXdROYEnDSNVvwCe1L%2BABHdEpamX41TeykWpLZ61C7my0WQEEdqdvIRUdTkpTAASw8iDcHj3c0eoaY3QZX6CBrM%2B69rziV5FiT3pL6rUgVPdWcSnDW8SwqrnyvzrT5%2Bi%2BTaGP7p32prL5TW%2F6PhD5sypwkGHQQjDNkV8GrWwKCGzCquIEMCulc9qXZn1g7zq1aEVHNUaS2OZGXTXGPs%2FqG1nbUp9m69zXnhFMeL3IVcizicuDP90tbHwNQ6fI0WFS3PHPtth03LGga27Wt44qC6YMHuGHB5aqggmT6BNBPIeZ6rgX6mNY7T68WlM08oQyxhAuMHEYS%2FgqpeObCV61ciFQrrJTK5eVwKPCLu4RLUxEWkgg93cC9C0fNMIueKZNkOzRxhuR8PE6iMByPRz%2BOJuSHaTidTafjL6MQR9Mvk2QWTqbjSXhRqp9FXJAh2eAsB2xDuORiFa2CmKyPINsN0CH6BK%2FhmsVc%2BHdK0JuwenHTTPd4CA%2BHrlwvTwl6B1kv%2BpQv%2BanhrjG1EddX%2FJPA%2BoamjVJvBeaZgTNT%2Bnx7Enj7cL2DvJ5Kp1Px9%2FDtFru%2FAamDsAayEQAA)

### vizro-core/examples/dev/
[View with commit's wheel](https://py.cafe/snippet/vizro/v1?c=H4sIAGj812cC%2F%2B09a3PbOJJ%2FBePsB0kj0ZacTBLXaeoc57mXxLnYM1tXtkoDkZCEMUUyfNjWpPzfrxsvgk%2FJjpPx1V52RxbBBtBoNPoFoPV1xw09tnNAds7F%2F15d01XkM0KjiKQhSZbhFaG%2BT%2BaMplnMEhLOye%2F8rzh0JPx5cB7M43BFUr5ihK%2BiME5J4jMW6fJ1xIOFfvOepyymfp8cRykPA%2BpjffXOo8lyOgvDNEljGk3dEIoDFqQJoQnxZq4BjGgAsFgaeXmhH6b%2B2llA1eU0nP3JXFlxERqQS4H3Csbri1eXq9Ir1Qa7jmCksoNrNQxEjtiIpnTmsz7xXLdPFiyd0iSBzyyGsS3Tla%2BqiXZ1PUE3%2B4VDXaRCogGgY%2Fgz9WhK%2B2TOfaDVlAdIMQFXqDrnCzEfqupFxKcujb2%2B%2BTaN2ZzFLHBZoZ4cvgPTkld2aYSTW4AT40sKQ6aL6SLm0IV4QiwlFcQcxjwhY6CXg%2BUOPna650HKI7sYH7E4SUP3wn4hCzrwnSEjJePTOGMAuKDRigce0GG0t%2FfUqmBedLrOl4zF6875zprRmIzHBEHPd6D2FTQXz4F9p94c63rOS6j7OqYr1jkPCPz7Kv%2Fgv%2FOdFaMJkgFWw9n5Tsx8mvJLeOyT8lMapsC6NS9qwSZ9u5dr1f4JBfpKuCPggcxPYZ3I548sJTG7ZEGmGvqUxe6SJhr%2BOF2yGLmFBabsUxzOeUpmbB7GjKT0utxvyq5T1fXPv%2BzJSj8%2FU1%2Fk5%2BCxehyM1JfTuhGsRTO%2F7PXJM%2FgP%2Fg%2F14GOEDxry5jyACXAzmNjVFHh1uxnIcTSF8sV7GNSKAPdksBRDP4xJAoOFVtI%2BcYF6DPgmg0LqAYyLAicA4cUoYT5PoZx5xON0BaVBtlqD7OqXezgpghDGY1gqJGW4AAgPLrmXBSnJUuLTGZIY5khgwsiKLgIKUpJ%2FydbQACzXtLWHy9DPYMFRhxyC5GEgIFiYYHvUBYJhCyn5EymHg%2FCyUPUjQGBIMZtlq9oOgAjEhQFTckETjyyyGYsXIAL6mhopveArmAAgVOCmGbSYgExupG1dJ3efCehKzsbmTr7nZEzyrz0ysrn1PPDmUxCfZUb9er5zCNTChQCsOdwDPh%2Fhx9M9YHfA9rMRtOb9Pn48Ue%2BPQAwtwnitVt%2BhXFov1NqH1XUjOmdS9QrhjbJRLQItzztC4M4Ro7HEs08uqZ9BBeCnVTDOseyDNk59BiX%2F9ekdueLpUkKCUOzfZ6N0Ady1oEI3wXt4nM6zwB2jKIXpC2r6y4lf7Tl%2F14RCDlHBBcQecLaSoeWW5EsA%2F8dXUXDgjOY3Bu7HIcldQakcAgsAAMysCM0k7D4t4DWxOcNo9CYeySHubQxWnxrK4veGwZpKpBOFSbeR0n8nvjXcunk0AVs8zNHU43uLlWEtjH80oJDDggmZUglLLhMHpDAId2F%2Bdb4aePn%2B%2Fxy57rhGz4NH5O3xh1dkcE%2F%2FzoNlCC7VGNwU5xNdaCJpzN%2FCywiKDSY%2BXYdZOgbo9%2BJbB2318dkZKKIhqKGzEWilCXyJw6spWM%2FQxPAXcG92UG37qmT0GEv0ROUe2NgyyKCDo6KQFGiB5TbWLiEp%2FfvpbNIR%2FlGyC%2BbHgsEfNBV2fR6wARi2ceokl4tHWDhIw0how3Ibjx49IkcGoTqID5QHFs7GUwV7wfUzj5FeT%2FSV9Hp9%2BC4dHPldiFP5VflVqjwMUmiVxfhc7bHXm2VpCiPp9Qj4pLJReHCqoJI0pTaWwHpAtF3htCaF193%2Bd6G4dCqTbckdpHHo1xJbUhZ8EpJegYHK52INpWgCYh0i%2Fcte77Xo0NDnE8WlLUqcumb%2FJ8zAGw1IljCosSbgiA%2FYNU9QeoEV6YNXLwzAhMN8ghdk9wAvCh0c1HXQIy%2FjMPLCq9p3R0vmXvjQXd3Lz2DShu%2FABk3q3wYLduIDXnHd6%2BY3YGeyT9y9qHvbyjVqLn8E2yC9%2FJB62%2FHNoYxq1L0%2BSTF2E3s4sR6bw9LyiA6CUGG9w7zSS8p9XJ1q5eLc93oyOCIUhGEnSQJixUjusPpkwwNs%2BEfQElh74IIvvx0tX12n4OQ3kVOuQhbIWI30tvlfwiBH8dfryYgWUREtQzchcIiMkhEtFDHedcV8H%2F5We3JjRsUilJ3YcnZG0b2GHl%2FSZOmUXbkWwsumpAKoZ2OMJnSlbj06%2FvDp%2BOOrj6cn5D50qxS5jdr1TVEiN2pCAVfiCqlBxtG1k7hgd7G4g9GwPrlGIwJ0tj%2B94l66RM27NkU%2BCxayzEU%2FFssj5nKM7nRL5NM4fhaxJuCMJQbZZiy9YiwgJ9gc%2BRf2ICZbPr%2FXzZdmgsF6ixtZ%2BBV1lyQKYXnBEhPiVo1IRFvBcEKukro2YMhwCDJ8skdENHDuh1cgn%2FrSrBLDSqAdj7uSkwCY18g8oTkccgpNnbA0TKgoIdAgowkHZgZBGqR8zoWEmMEz9A%2FGGcgGHO8VagZB06RWw7wFpC5Z3MfuY9EsKBdg%2BhAKfRoZOuJQfgf0uUBcNP07jxc8APSVdrtaskDEPFC044jCANATfVf7vTIzIqd6Wyk1D8PUTNHJ8W%2Bfj14doJ6TC1sQ2hMRHQzAjPZGj3u9SjuV5aQiuY3sf%2FiGvIH3m%2Fn%2FcIFw9QvAjhnbcYZiTFdGk7EVuSWQjL%2Be74BhywMVVzggGAu%2BaVoFb3RrqEgpeQezsViWxEmF1R8JNRUAtFIclwwkLTB1bGTnGz%2BcwcJ5y6ifLvvkX%2BovTuCnMMp8hd2tZ8yMfotpK82asFgb5%2BxUhOI3zpgAa5mwPKzfPGf%2FPxeBDsDUzwXaCltoj9uaFI%2BQBIiuDyLMJ0PyH8vhr%2FWWQxFyBJCjX5tsjALoPoDuN4GWYB8D7ONf6zT%2BvVlRAkE06pWPVAUAp3AVehy1UYZhHI8yGYj%2BkmUBhqJluJ2m2UpGi%2BFvkK2%2BZHRFZj7A85SDEAUjBF58yXgi3jCeJWLbAJpOaxUJeZ0tOAXNKCL182xBwailQh9yaCkU0qwPSutLxgA5aP0n8ikOL4X6IglfcYxRMxX0l5UCtgoJzcDHqO%2FyeOZShuoTiBaIODvPMPqNyDIxgCwlqxCMwZTjDmnsLnmKPpMhApOhcQyt8yX3Ab9LFnDce8Bi7tX3e5T5EYWVOOcup4jgT%2BTdKmJAGhHGTzAYD41isL0vKNY3CLI4DkHbSvIGLHE5Aqv9AzYD4idYNXG%2BKxshF73wQ%2FeC%2FHcGEqHWmP61pogcAo9gtS9YDa0FSvwQVD0%2BUznDKEFAdnm4Xy7MZKCxsAJi%2FCqro20E%2BDkbe%2F0O434P%2FmxS7wujN0sOayZc%2BqzZTEIMN0KMGlt%2F8d3H92oVLcEyrB3i6RKm7CqM0S4EI2%2FGSI%2BnwOpub0vo3iz0vd6W0FMJLhST6qY33W78RrFIXdyoWV6L11sF%2FUCXYcivT84e98mTPvmlT57i0wDe5P%2FVlEzqAoDQhey7o6wF%2BaeL4WVlQKCTUNzE%2Bpk0bF1MTA8yxKTaR2%2B%2BY0K3%2Bb5Z15DnPJAht0YCvRCvNxMIx136aBj5HRy%2BKrMIF7BaXPUJqzA1TmKNf172GmtgEv4XUihiaXNb3eYAiKRsR63HV3k4Ruz9yeiLmEcZ%2F%2Bng5gp%2BGVvHWjrd7sRm%2BY08kI%2FHhP9wMnUQr6On%2FcR4yzmv5NHbZkPNgGxhrWnYTr31a96TdxWytgbnJ2V7uh6FDVx4G27cwJVV7mzhPJtNJWs1s%2FJtuLWFvGRATuTYGmt2q8Xd%2FjfQckZ%2FJB03iYT7o%2BML%2Bk00nLTES7dfLtX18vBWwObJWN9mlm8zcyuKcSdoF3u45KHPg%2B3gEftZeH1btrjr%2BtrMGnYoYzqUUrnMJ1Y8wxKkd1TI9cu2FIGqiUHaYWAwf3caVDdqGI5YNSpun88ZqMpWnd3cSos23jDu8Prbxz16UOMu8M5oC955d1%2Fh%2B28m5H4jIRde9InFLo3uREht0IXfi8624WTRNpH7FAXnAIs7WGV8JhZ3n4h5moA51m7hWdiBbag3ez6efj5%2Bf0Lu5yCF2iltcaqKO6k%2F3vpv0Rjb2FWbtEn3VmIELFNoSg5mKnbnqpLgG0fd6oNsawVtHHUDdxedjgI5Gt2PEtkUXNloUbVaR5eCdmaCsyo0npRAbY%2FHOl%2FQaV22kT4B0czv5pDEHVm%2ByiDTaHXfLPKg3GLT1tTjiRsD7aYrGuFWVSL2KHGb6nzn0d7e7PF8Lg%2F2XprNQ%2FVyPn8%2BGsEs33ybkhfEB7tmG8LXmz8Pgeg%2Fkpgb1rxZDZ3tFiqQ3Kmi71zq3WGJsT1DG8Dblr0JdIRqd%2FRMDP7J6Jensp9H%2B88fP6czbIWs8BLJ%2BDX1E6aOcY8tgG7LdpbusllmnGiI7UJrw%2BLHqPixb32oI4lgT02XDPcL8WTi0z15NDE%2FrHjPRxMP89NkeN5sxvDImSeOKqijDoWzZPJwmTlqZrrHmD%2F1%2FfBKVIEmYnFrTjRNqJyDwpYKHmuYh1jDPtEmDz%2BZc08H9hUFzQGkg%2BcURUQUuMYHLMR0i2BzAo35TO05mVa7djPmaFtTO6XK4jBDoYX8%2FFu1iXoE6towWgwbCbIVuyUW9ZW37T8%2FbAcNyOsk25LSvqfUuodRt8MuhLbYVR8Y36FJbm%2B9Dd8neAB4KvTXcG%2B7Tfm2E24ScQtVvK6Hq3AzYghZRif3xvB8kux8W%2F0mdnsH8lZgi37DA8QdCSXPV%2BEFQn2w6s3x8Rv72sqJvHRYReR2tmGjkqhM76TfYB82%2BXRN9p458YVlZgXkEzsgqsWuiJOnLBqD%2F7Wi8UUy%2FghyqsXCuL9BNXuZ9rCMGDKDsgSTPSLTXLd%2Bsr4D%2FhlM%2B7oV%2B8q2Qy6ci7iLpu4Dc7kEG5H26J0RFqtyQKAFwTW1tsMJTb%2F%2FGBJ2vWElaL1jLQQoIkoXqYFAMz%2BA4CjdWrEtLVm9WDWSUL2wSCWlR5vRthAtCkcRXzHsIMVfgQVylWeYAA8myDLSUWIROSFF3Lo1h28Pj07fHX%2B8n3DMAO%2BzmQ3Bqdw4bDQ7i9uMW%2FmqbedvS07elgdwa7VW3s0ShFcIk7Jq6Whjo3%2Fv7qq9wS69FutMffPuKULap%2B%2B%2FOVx%2Ft7D1jwhJCyh5nR1JjevQAp60uKHismHLBFYTPXRqXM9YnfaeyuwGE7nPfdeoXqm1%2FncIgT%2F08LaIM%2F92cnr8gRy9Pfx8T%2FcK%2FlPl0ugoMS3yUHhsrk%2FOT9HDnAq7NTefQWSAKOqTJZYLi01brcJ6U%2B6gdDuO5P0LfRBfLNb8CgZMme2dwETKnBl6Hu3rlXb3Y0RgvNbdis%2BuacOhnjcVyHXWY%2FG3T%2FBzqqcAvKgAryKqKjGe%2FAuwpiR0I1FMgo4CMVQeDk0VFIkb6WFaKlNkEdZQBArVYabSIFNYgSyx2B0g%2F2WQLHKXQtMi5JkqKkuDaxvmuvx2bb9dl98KhWAB4HMZxmN47hA9Vwyiod3PRJzsKy4OO2Ymw0Y35aAZD7aqv%2Fds5s1oTX2R5yRpr6uCeYW6ivjWHGQRWiFTGVrqVJmxzFlKIssrRM16SvLIUfGi0e1D3qq3pGFvXInN6kr%2Fhp2fTQFZKTL2nSc176zF3hDyLREoupar51v3oW1imYXZRK6rhuVVGoGdy6dmJHoxWll8GnTSdSOt17VvlEUmU9NspuEivAUNb7kbVdwGtH2XMmdObrVfdd22SVWdx8ltHM7XPKCByykIZhUxlKf5pL8p0jxtqaVPD1%2B8f3XfSlomsNL6aLWequFWIlxSK7vLMGGByi6QHJg0ZmcYwDhL0ngyASnUqKXkDR6ZO8XzQEH54YK7GDJWN1lBYcku1OQkBeWlyjDvB4jXANBC6cpxGwAva8HXG3Ecl%2BNJ3CKqKusNDJIC4bGJQuKlJF37bEqTKY5jesnZlb541a%2BCSa9EiPhZGKMJOAvBeVlJUT8EKZKE4PaCbxt3BgMJMkiyGTDEoR8t6d6wK%2FcuZLxfVnssIv43Nd3J20Kyw9JZ6i26T%2FDSw7G43LdOBpJVmfcWr%2Ft1azIPqRZTtDmxOZzKGjAb8%2F1RVFxAN3kOLEtn5VnjRGqhU8NglnZ30nDqcTftYCYxNxSXiLrav0%2FG6i9mJtAT2S3oQZW0bYMeFF0nd7sqZov2tHDjrEEe4qVgYgbcpATKC69VFWx0PYqsL101HdwjRYeB2C4I0c4GKbgubc5d9762GO3hO8UBbClxW1TTMoT2iGmuhmR6e7FIW0dLIeBLEbStO0ObS%2FLt6FTxvu7pZjc2OXTkjXmPmKwRrpU0xPVpkpDTMASMI1jaR3GYJHakvRh4r5XhattJDntgtpr%2BaG71DytXpr7hfKBTYcLUh3gVeSpcqGki80TsoBqpf6NbQX01y7jvdQCHefegvD%2FVSAe8M%2B2CIld3sEmSRaB5RFNiB0za4CQCvmJxCuraKW942QhNRUXMuAkYi6Y6XUfi1d1U4wwxd7g3ccQeqqAbtCKC0NvXTSXhhUrbof4VyHnQYAkX4kYpMVzZPrh2K7HqD4Sglzrjxs4eJAR1fX%2BSaY0pJb1FmMgO2uiSB1BwNHOBYfuRQ47kNbGAXVXyKWgm%2FWe2AhTjMECeFHkeXoBL%2BwGzdxbZ8mNNI%2BQPU30T8%2F2pATXPWQWW9jggYNzIZ9TkpSI0jtXjdsz5QnAbcp%2BgQc6adi4Ja%2BlWWVDOFaZadV7yy86Z%2BPZ2JPpzpMsoM7E6b%2FdlocZbl39SsIC7Ongo5hf1pj27lvyA%2BTV07druZ54MY5MLajfWpn7z6W%2FVrjWUEwQV2TrC6jFxTQPclcXra%2BJCoy4URxeyFfjw%2FC8QC5h9CvUZtF7N0ai8It0IzuQK8y%2FNQm%2BtbzvqjBBmLE7b7nOjIwkW7dT28%2B%2FzoJkmxjvMo4BWSsLSRs%2Fxfo9qtjj297U5bW2xRVsdSKySutHyaFGim3mU6aw27aeSLCPhnnagCr6f3rOoOH86Cn%2BAexu1RoCEKEglkfS6kxYNcp3baINY0BmT%2Fg0PIKt9r1rpUrf5V9lRqb0e1L5J1t%2BqTpUfxqNt69r9gWtv5U689pPr0u5f222Z73pB0lpfr9%2B9%2Be3zt0dXCutrru4qdzFzRWfY%2FUmtMzSczR1hK8ZyUEi72yfBNA6v7CALrEa0UYZdMvjVqP7i8hSGlbiljydKZKQFIwEyWxDY7jOMsszJH%2Bqs4B92JiuZsH4pbF%2FM0%2BBZXqc5xXcYL5KDuoSVBzLrifhO1N1TbWOLnOV5JT2yjwYffEb9i4nvDBpW7%2BSljtwA0NAg81mYQTY%2Bmix67IIO0IE3c8WAic6Nv2AB5muAQRb6M03bsg3XIwoxCyGMynTkOLpnOjw6KUQ8jHGWY3em0eh4rut8oPGFYNK5SANDBH6PvvKb8%2FPgK7Z4g%2BwqQ1pyH0hcMRceGGAuNsuTPvCDvXqE%2BfwR4wTnO5rVBoLVBuZCcJ6%2BsyCtdU79DdJabh3VS%2Bv8mrywXVbrgV4F5hhdI%2F%2BPC%2BnS8w3euwcVTPeOnKn2SIJS3%2BD%2Fj0d4fOx6PBypkyojfVLlWX6eLmdeedk%2FxTyQCbhZ6%2BbjdYLemABW5QFrO3GMuVnfGbB%2F55QHj8jLw5O3L44PP78k93IAp%2BCwnMnUOpi%2FW%2F2%2Bg%2FptC4G2Zts%2BkYkX%2BiS%2FVi8gMbSsx4StqctWeBpU3zLJVRMC5zbRWfUgUJ9Ujp9M8MCQzoKItQqbfn1SiH2aR9WLeVZr2zznJBDpezE6OwtR%2Fgh2fKkfSzwpEy6%2BVj%2BGYngSD77ChGLC3j7p5U2LB0ka%2BGpQ6uXj0VwR0EsuM6kjZ380T9baBpCpvVwB6EXlfgfHM3ENRhFUeM%2BDi45PZ8wvphDWI7ALYZmo1MdYVs1DWGq1%2Fp6w7qtCsvI%2FicDX5ovKeEU5d54rvxFRBX9TzapbD1jOdtcMWR%2FDrsG0kP%2BrGa6UzaUZsJTVpI1GlYQWrcNpB5v02%2BdD5QeWv2uQ36IkpStmpHB9pL1R4wqJNkvn4GqPnLW3ZyVQ3YZp6o8KbIQvbalsbr8aB9pYp%2BwkbqxQtlNuM8M3DeVKIrzns5jGa3Lo1S%2BbintTPfSRqzdQCRGGb4VwNdFjI5EF1IwGmJtgLOzYosgBNvmAaYOFwYtcIuzOd6tFJ4ndceG3mcAp8cNFiKl3xcaauksXSJOQUD81Mh7hBAymXMDfbTJ8ptLXLtM0Sg52dxfQbTZzQOjvrtwLHiRsvatqqArSIIMqU8w3d5HbjWipTgNpqtLAXYZxyUTtCtI4SApH2j2OuwTigFnhwAsWeB2JvQKMswCj7jCUnZh9yXgsAt4J%2FryXRjdaOy6ds93FchdYnM9hFZXw3lV6ahdaS3aH%2B8%2BeP91%2FMnz%2B9MluxCMJMthzhs7%2BE8djl3uDaL0%2FCICZBzRYO1dL%2FzwIAbNofe0jHuj9IgJnX8WGNaKCmEZrfAlTYuMW0ytHkhNvUunYY5Wyu%2BzxcDh3Z7PhcO%2Fp3oj9sj%2Fbf76%2FP3y2N6Pu%2FrPR%2FPlstD8czZ4obN0wZrvKLEt2AeldhcJNn1hoyWTN%2BAr44%2B9Fr4hKHZpukqgEyg58fQjYljCqQ3oOdg1g4sDHQ8DYRqcO3cYc6A8B%2BWbkNg7F%2BhWABzcSG7eNAyn%2BgMSDG0sJvY3DsVPDP7jBFJCrG4rWrA8Bc4NLAVFbJzo8%2BFsRLePSjGh6nT4cTBGZAqpruvKn4np%2BGOw%2BAM1eh08zwsbIdLD44SBewutmcvO%2FnJNps6l1AAA%3D) vs [View with latest release](https://py.cafe/snippet/vizro/v1?c=H4sIAGj812cC%2F%2B09aXPbuJJ%2FBeO8D5JGom0517hWU%2Bs459skzsaeebVlqzQQCUkcUyTDw5Ym5f%2B%2B3Q0QBE%2FJjpPx1lvPRBbBBtBoNPoC0P66YweO2DlkOxf036sVX4aeYDwMWRKweBFcM%2B55bCZ4kkYiZsGM%2Fe7%2BFQWWhL%2FwL%2FxZFCxZ4i4Fc5dhECUs9oQIs%2FJ16Prz7M17NxER9%2FrsJEzcwOce1lfvHB4vJtMgSOIk4uHEDqDYF34SMx4zZ2prwJD7AIuloZMXekHira05VF1MgumfwpYV54EGuSK8lzBej15dLUuvVBtiFcJIZQcrNQxEjpmIJnzqiT5zbLvP5iKZ8DiGzzSCsS2SpaeqUbtZPaKb%2BcLiNlIhzgCgY%2Fg1cXjC%2B2zmekCriesjxQiuUHXmzmk%2BVNXL0J3YPHL6%2BtskEjMRCd8WhXpy%2BBZMS17Z5iFObgGOxhcXhsznk3nkQhf0hFhKKtAcRm7MRkAvC8stfOx0L%2FzEDc1ifMTiOAnsS%2FOFLOjAd4GMFI%2FOolQA4JyHS9d3gA7Dvb1nRgX9otO1vqQiWncudtaCR2w0Ygh6sQO1r6G5aAbsO3FmWNexXkLd1xFfis6Fz%2BDnq%2FyFPxc7S8FjJAOshvOLnUh4PHGv4LHPyk9JkADr1ryoBRv3zV5Wqv1TDvSVcMfAA6mXwDqRzx9FwiJxJfxUNfQpjewFjzP4k2QhIuQW4euyT1EwcxM2FbMgEizhq3K%2FiVglquufn%2B7JSj8%2FV1%2Fk5%2BCxehwM1ZezuhGsqZmne332HP7B%2F1APPob4kEHeXPgwAXYKE7ucAK9uNwM5jrpQvngPg1oy4J4UlmLgBRGLYbDQStJnNlBPAN%2BkUMgdgLFR4PggvARnwnMTKBcOc1y%2BhFI%2FXa5BdvXLPZwWQZhwI1gqLBG4AJjrX7lO6icsTZjHp0himCPCRLAln%2FscpKT7JV1DA7Bck9YergIvhQXHLXYEkkeAgBBBjO1xGwiGLSTsT6QcDsJJA9UPgcCQIjFNl7UdABGYDQPm7JLHDpunUxHNQQT0M2ok%2FNJdwgQAoXw7SaHFGGRyI23rOrn7TEBXcjY2d%2FI9J2Ocf%2B2xocmtF74zm4D4LDPq14udI6AWLgRgzf094PMhfjzbA3YHbD9rQavfH%2BDHE%2FX%2BGMTQPIjWavUdyaX1Qq19WF031LmQqpeEN8pGtQgyed4hgTtDjEYSzz674l4KFYCflv4ox7IP2jjxBJT816d37NpNFhIShGL%2FPhvlc%2BCuOSfdBO%2FhcTJLfXuEohSmz6%2FpLyd%2Btef8XRMKOUQFFxB7wNlKhpZbki8B%2FB9fqeDQGs5uNNyPQ9K1iVI5BBYAAJhZIZpJ2H1SwGtscobW6E08kkPc2xiMPjMog98bBqsrsU4YxN1GSv%2Bd%2BNZw6%2BbR%2BGL%2BMEdTj%2B8tVoaxMP7RgEIOCyZkwiUsu4otkMIg3Mn86nzV8PL9%2Fzly3XGNXviP2NuTD6%2FY4J5%2BLvxFAC7VCNwU6xOfZ0TKMH8LL0Mo1ph4fB2kyQig39O3Dtrqo%2FNzUET7oIbOh6CVxvAlCq4nYD1DE%2FtPwb3ZQbXtqZLhYyzJJir3wEaGQQYdHBeFJKEFltsocwlZ6een83GH%2FKN4F8yPuYBfaCrseq4vBmDYRokVX80fYeEgCULShuU2Hj16xI41QnUQH7jrGzhrTxXsBdtLHcF6Peor7vX68F06OPI7iVP5VflVqjzwE2hVRPhc7bHXm6ZJAiPp9Rj4pLJReLCqoJI0pTYWwHpAtF1yWuPC627%2Fu1BcOpXxtuT2kyjwaoktKQs%2BCUuuwUB1Z7SGEjQBsQ6T%2FmWv95o61PT5xHFpU4lV1%2Bz%2FBCl4oz5LYwE11gwc8YFYuTFKL7AiPfDqyQCMXZhP8ILMHuBFoYPDug567GUUhE5wXfvueCHsSw%2B6q3v5GUza4B3YoHH9W38uTj3AK6p73fwG7EzxybUv6962co2ayx%2FBNkgvL%2BDOdnxzJKMada9PE4zdRA5OrCNmsLQclgVBOFnvMK%2F8irserk61cnHuez0ZHCEFodlJkoAZMZI7rD7Z8AAb%2FhG0BNYe2ODLb0fLV6sEnPwmcspVKHwZq5HetvsXGeQo%2Fno9GdFiKqKl6UYCh8koGcuEIsa7roXnwe9qT3YkOC1C2YkpZ6cc3Wvo8SWPF1bZlWshvGxKKoB6NsZoQlfq1uOTD59OPr76eHbK7kO3SpHbqF3fFCVyoyYkuBJXSA0yCldWbIPdJaIORsP6bIVGBOhsb3LtOskCNe9aF3nCn8syG%2F1YLA%2BF7WJ0p1siX4bjZ4o1AWcsMMg2Fcm1ED47xebYv7AHmmz5%2FD5rvjQTAtZb1MjCr7i9YGEAywuWGIlbNSKKtoLhhFwlda0vkOEQZP%2FJHqNo4MwLrkE%2B9aVZRcOKoR3HtSUnAbBbI%2FNIc1jsDJo6FUkQcyph0KDgsQvMDILUT9yZSxJiCs%2FQPxhnIBtwvNeoGYimca2GeQtIXYmoj91H1CwoF2D6AAo9Hmo64lB%2BB%2FRdQpya%2Ft2N5q4P6Cvtdr0QPsU8ULTjiAIf0KO%2Bq%2F1e6xmRU72tlJoFQaKn6PTkt8%2FHrw5Rz8mFTYR2KKKDAZjh3vBxr1dpp7KcVCS3kf2P3rA38H4z%2Fx%2FNEa5%2BAZgxYzPOUIzpymgytiK3BOLR14sdMGxdX8UVDhnGgm%2BaVsGbrDVUpJy9g9mYL0ripMLqj0hN%2BQCtFMeVAEkLTB1p2fnGC6awcN4K7iWLPvuX%2Bo0T%2BCkIU09hd%2BsZ06PfYtpKs0YWa%2BOcnVEofuOMEVjLhOVh%2FeY5%2B%2F%2B58LMATP1coK2whfa4rUnxCEmA6Hogwjy2z%2F5jsf9rveVQhBwC5PDXJhujAHoAoAdNoCXYxwD7%2BNc6jX9vVhQhiEa98pGqAOAULgPHRW2UYhjH4UIGor%2BkqY%2BhaBlu50m6lNFi%2BO2nyy8pX7KpB%2FBu4oIQBSMEXnxJ3ZjeCDeNadsAmk5qFQl7nc5dDpqRIvWzdM7BqOWkD11oKSBp1gel9SUVgBy0%2FhP7FAVXpL5Y7C5djFELFfSXlXyxDBhPwceo7%2FJkanOB6hOI5lOc3U0x%2Bo3IChpAmrBlAMZg4uIOaWQv3AR9Jk0EIUPjGFp3F64H%2BF0J38W9Byx2nfp%2Bj1Mv5LASZ67tckTwJ%2FZuGQogDYXxYwzGQ6MYbO8TxfoaQRFFAWhbSV5fxLaLwGr%2FQEyB%2BDFWja3vykbIRS%2B8wL5k%2F52CRKg1pn%2BtKWJHwCNY7QtWQ2uBMy8AVY%2FPXM4wShCQXQ7ul5OZDDQmKyDCr7I62kaAn7Wx1%2B8w7vfgz8b1vjB6s%2ByoZsKlz5pOJcT%2BRohhY%2Bsvvvv4Xi3DBViGtUM8W8CUXQcR2oVg5E0F67kJsLrd2xK6Nw08p7cl9ESCk2JS3fQm241fKxapixs1y2t6vVXQD3QZhvz67Pxxnz3ps6d99gyfBvAm%2F1dTMq4LAEIXsu%2BOshbkry6Gl5UBgU5CcRPrZ9awdTHWPcgQk2ofvfmODt3m%2B2ZdTZ4LX4bcGgn0gl5vJhCOu%2FTRMPI7OHxVZiEXsFpc9QmrMDVOYo1%2FXvYaa2Bi9y%2BkUCiS5ra6zQEQSdmOWo%2Bv8nAM7f3J6AvNo4z%2FdHBzBb%2BMjGMtnW53bLL8Rh7Ix6PDfziZWRCvk037qfaWc17Jo7fNhpoG2cJay2A79davfs%2FeVcjaGpwfl%2B3pehQ2cOFtuHEDV1a5s4XzTDaVrNXMyrfh1hbysgE7lWNrrNmtFnf730DLKf%2BRdNwkEu6Pji%2F4N9Fw3BIv3X65VNfLw1sBmydjfZtZvs3MLTnGnaBd7OHKDTzX3w4esZ8Gq9uyxV3X12bWMEMZk30plct8YsQzDEF6R4Vcv2xLEaiaGKQZBgbzd6dBdaOGcRGrRsXtuTMBqrJVZze30qKNN4w7WH37uIcPatwF3hluwTvv7it8%2F82EPGgk5NwJP4nI5uGdCJkZdMH3orNpOBm0jeU%2BRcE5wOIOVhmd0%2BLuM5qnMZhj7RaegR3Yhtlmz8ezzyfvT9n9HKRQO6UtTlVxJ%2FXHW%2F8tGmMbu2qTNuneSoyAZQpNycFMaHeuKgm%2BcdStPsi2VtDGUTdwd9HpKJCj0f0okU3BlY0WVat1dAloZ0GcVaHxuARqejzG%2BYJO67INsxMQzfyuD0nckeWrDDIJl%2FfNIg%2FKLdZtTRw3tiOg3WTJQ9yqimmPErepLnYe7e1NH89m8mDvld48VC9ns1%2BGQ5jlm29T8kR8sGu2IXy9%2BfMQiP4jiblhzevV0NluoQLJrSr61lW2OywxNmdoA3jbsteBjkDtjp7T4J8Mnz6T%2FTw6%2BOXxL3yKrbAlXiIZveZeLNQx7pEB0G3Zzsq6bJYZpxnEdqG1%2FeLHsPhxYHyoI4lgT00WAvcL8WTisz15NDE%2FrHjPRxOP8tNkeN5sKvDImUNHFdRRh8JZMnm4TB81091jzJ97XnBNVaCJiG7NUdOMyzkobKngsYZZgDXME23y8JM%2B93RoXlHIOIB18JwiRUSBazzAgqabgs0xNOYJteekW%2B2azeijbU3tlCrTYYZCC%2Fn5t2oT9QjUtaG1GDbip0txSyzqK2%2Fbf37YDhqQ10m2JaV5T6l1D6Nuh52ENu2qD7Tv0CS3t96G7zM8ADwh%2FbW%2Ft92mfNsJN4m4gSpe18NVuBkxhCyjk3tjeD5Jdr6tfqPd3oG8Fdii3%2FAAcUdCyfNVeIEwO1j15uTkjXlt5VReOqwicjvbsFFJVKZ33G%2BwD5t8uiZ7T5%2F4wjK9AvKJHTDVYpfi5IkIR%2BB%2FLXl0GY8%2BgpxqsTDub1DNXqY5LC2G9KAMwWSOSDfXrZ%2Bs74B%2FCtO%2BbsW%2Bsu2QC%2Bci7tTUfWAul2Aj0g6%2FM8K0KgcMWiCuqbUdTnny%2FccQi9WGlZDpHWMhQBFTukgNBJr5AQRH6daKbWnJZos1QxKqFxappPRwM9oGokXhSPEVzQ5S%2FBVYIFd5mgnwYIIsYx0lFpETEsStW3P49uj47N3Jx%2FsJxwzwPpveEJzIjcNGs7O4zbiVr9p2%2Frbk5G15ALdWa%2BXdLEB4BTApy5aONjb69%2B6umhvs0msxztQ3754ipHn6%2FpvD9XcLW%2F%2BIkDRByevsSGpchwbwuMUNpcuGLRNYTfTQqXE9I3XaeyKzG4zlPvddo3ql1vrfIQT%2B0MPbFGf%2B7fTs5AM7fnv0%2BZ7uFfynyqXRUWKa8lA4YpadnJ%2BghzkhuzU3n0FkgCjqswWWk8WWWa1kvSl3ULodx%2FL%2BRXYQnxZrfgUDpsz0TmAiZc6MbB7N65Vm9yNEYLTOuqXPrm7D4o4zIeQ66xH97jP8nGRTAF6Uj1cRVZUIT%2F75WFMSupEoOkFHgRgqD0dGFRSJG%2BmhWypTZB7UUAQK1WGm0iATWIEiNtgdIP%2BlkSxyl0LTIOS5KipLg5UJsyq%2FXZtv1%2BW3pBAMAHwuwzgCzx2i54pBNLT7BcXJvuLiMGNmMmx0Uw6auf5W9feeT50pr6lPeU7i9roqmFeoq4hvzEEaohUykaGlTpUZy5ylJLK8QtSspySPHBcvGt0%2B5K16ixv2xpXYrK70b9j52RSQlSLjwHpS885Y7A0h3xKBwpVcPd%2B6D20SSy%2FMJnJdNyyv0gjMXD41I8kWo5HFp0EnrRppva59oywymZpmMw3nwS1oeMvdqOI2oOm7lDlzfKv9qlXbJlV1Hse3cThfuz73bZeDYFYRQ3maT%2FqblOZpSy19dvTi%2Fav7VtIygVWmj5briRpuJcIltbK9CGLhq%2BwC8aFOY3aOAYzzOInGY5BCjVpK3uCRuVMcBxSUF8xdG0PG6iYrKCzZhZqcuKC8VBnm%2FQDx6gNaKF1d3AbAy1rw9YaO47p4EreIqsp6A4PkQHhsopB4KU7WnpjweILjmFy54jq7eNWvgkmvhET8NIjQBJwG4LwspajfBykSB%2BD2gm8bdQYDCTKI0ykwxJEXLvjeflfuXch4v6z2mCL%2BNzXdydtCssPSWeotuo%2Fx0sMJXe5bxwPJqsJ5i9f9ujWZh1SLCdqc2BxOZQ2YifnBMCwuoJs8B5ahs%2FKscZRa6EwzmKHdrSSYOK6ddDCTmB3QJaJu5t%2FHI%2FUbMxNkE9kt6EGVtG2DHqSu47tdFTNFe1K4cdYgD%2FFSMNMDblIC5YXXqgo2uh5F1peuWhbcY0WHgZkuCMucDVZwXdqcu%2B59bTGaw7eKA9hS4raopkUA7THdXA3Jsu3FIm2tTAoBX1LQtu4MbS7Jt6NTxfu6p5vd2OS%2BJW%2FMO0xnjbCNpCG2x%2BOYnQUBYBzC0j6Ogjg2I%2B3FwHutDFfbTnLYA73V9Edzq38YuTKzG86HWSpMmPoAryJPyIWaxDJPxA6qkfo3WSuor6ap6zkdwGHWPSzvTzXSAe9M26DI1R1sFqchaB5qinbApA3OQuArESWgrq3yhpeJ0IQqYsZNwJia6nQtiVd3U41zxNxynbFFe6hEN2iFgtDb100k4Uml7XDvGuQ8aLDYJXGjlBiubA9cuyWt%2BkMS9FJn3JjZg0hQ1%2FcnmVabUtJbhInsoI0ueQAFRzMXaLYfWuxYXhPzxXUln0LGpP9Ml4BiFPjIk5Tn4QW4tB8we2eRLT%2FWNML%2B0NU3Md%2BfGWDGc0aBoT0OGRg38hk1eakIjWP1uB1zviBuQ%2B4jGuSsaeaSMJZulQXlXGGqVeule9U5p29vh9SfJV1GmYnVensgCzO8s%2FJPChZwVwcPaX5Rb5qza8gPmF9N167pfubJMDa5oGZjbeo3n%2F5W7VpDOSIoZesIqsfEMxrgrixeX6MLjVkhHV1Il%2BDDu3%2BBWMDsU6jPoPVqjkblFWWN4EwuMf%2FSNHDW2W3HLCOEHovVtvvc6EiCRTsx%2Ffz7PGiWEeMd5lFAKyUWSaPneL9HNVsc%2B%2FvanDa22MKtDiRWSd1oebQo0c08KrKsNu2nkgwj4Z52oAq%2BX7ZnUXH%2Bsij8Ie5t1BoBEqIglSjpdScpGuRZbqMNYiHLmPRveABZ7XvVSpe6zb%2FKjkrt9aD2TbL%2BVnWq%2FDAablvX7A9ceyN34sqLV6Xdv7bbMt%2F1gqSxvl6%2Fe%2FPb52%2BPrhTW10zdVe5i5orOfvcntc7QcNZ3hI0Yy2Eh7W6f%2BZMouDaDLLAa0UbZ77LBr1r1F5cnGVZ0Sx9PlMhIC0YCZLYgsN2nGGWZsT%2FUWcE%2FzExWMmH9gmxfzNPgGF6nPsV3FM3jw7qElYcy6wl9Z%2BruaWZjU87yvFI2so8aH3xG%2FYuJ7zQaRu%2FsZRa5AaB9jcxnMoNMfDKyZGMnOkAHztSmAbMsN%2F5c%2BJivAQZZ6E83bco2XI8oxAyEMCrTkePonmfh0XEh4qGNsxy78wyNjmPb1gceXRKTzigNDCP8Hn11by4u%2FK%2FY4g2yqwxpyX0gumJOHhhgTpvlcR%2F4wVw9ZD5%2FxDjBxU7GagNitYG%2BEJyn7yxI6yyn%2FgZpLbeO6qV1fk2ebJflepCtAn2MrpH%2FR4V06fkG792DCrp7S85UeyRBqW%2Fw%2F0dDPD62Gu0P1UmVYXZS5Xl%2Bni5nXnnZP8E8kDG4Wevm43VEb0wAq%2FKAtZ04xtys7zTYv3PKg0fs5dHp2xcnR59fsns5gFNwWM5lah3M363%2BvoP62xaEdsa2fSYTL%2FRZfq2eIDG0nI0JW1OXrfA0aHbLJFdNCJzbROfVg0B9Vjl%2BMsYDQ1kWRKxV2PTrs0LsUz%2BqXvSzWtv6OScBpe%2FF6Ow0QPlD7PgyeyzxpEy4%2BFr9MRTNk3jwFSYUE%2Fb2WS9vmh4kaeCrRqmXjyfjCp9fuTKTOnL2R%2F1krG0AmZjLFYBeVO53uHgmrsEoggrvXf%2By4%2FGp8IophLMRmIWwTFTqYyyr5iEstVp%2FTzjrq0Ky8o9E4GvzRWW8opw7z5W%2FEVEFf1PNqlsPWM521wxZH8OuwbSQ%2F6sZrpTNpRmwlNWkjUaVhBatw2kHG%2Ffb50PlB5Z%2F1yC%2FRclKV8xY4fpIe6PaFaI2S%2Bfgao%2BctbdnJFDdhmnqjwpshC9tqWxuvxoH2lin7CRurFC2U24zwzcN5UoivHenEY%2FW7MipXzYV96Z66CNXb6ASQgzfknDV0WMtkQlqyn3MTTAiO7YocoBNPmDaYDJ4kUvI7ny3nHfiyB4V%2FjYTOCVeMA8w9S5trKm7dL40CRn3Ei3jEY5gMOUC%2Ft0mzWcqfe0iScL4cHd3Dt2mUwuE%2Fu7SvnT9WKx3VQ1VQRpkUGWC%2BeYuc7sRLdWJL01V7tuLICqZqF0ijYWksKTdY9kLIA6YFRa8EL7TkdgrwCj1MeoOQ9mJxJfUjSjgHeOf95Io%2BQFUCtcrD0HQMcV3519pLxmhsJFwjS%2BBWliQjTLi15YcKV5yysKC1UHvisf7%2BzN7Ot3f33u2NxRPD6YHvxwc7D%2Ffm3L74Plw9st0eLA%2FnD6R4DDeSOwqiynedcTVrkLhps8MtGQeZXwFU%2Ff3oldEpQ5NO45VbmMLvj4EbEsY1SE9A5MDMLHg4yFgbKJTh25jevKHgHwzchuHYiTof3AjMXHbOJDi33Z4cGMpobdxOGbW9gc3mAJydUPJlN5DwFzjUkDUVFeW6%2F%2BtiJZxaUY0WSUPB1NEpoDqmi%2B9Cd2cD%2FzdB6DZ6%2FBpRljbfxYWPxzES3jdjG%2F%2BFzBRDQdEdQAA)

### vizro-core/examples/visual-vocabulary/
[View with commit's wheel](https://py.cafe/snippet/vizro/v1?c=H4sIAGn812cC%2F9WdW3PbNhbHvwpWfajcWpQVJ9vEM9qZNEkvM2mTSdq%2BWB4OSEISVuBlQVCyN%2BPvvueAN1BiKLqzD4DaxCaJy%2B8PnHMAkKDyZRKmEZvckMlK%2F%2Fc6y0iYJmu%2BKSRVPE3IOpUkovk2SKmMvDLVKlkla5nGRD1kPNkQHmepVOTPBDLgteoYs%2FlBmqpcSZr5YQqnE5aonNCcREHYJNzz%2F8rUi4FE6Gv7uCo%2F3FKp%2FI1Miyyva3n9%2Fr3%2F5pfXn%2F7wf%2F704c%2BPl8Q4%2BAxHmOVnzHFJfk2wTsEU%2B0g3rC6zyFUamzRVwT8Jdv8mTRTlCZOX5Dcqd1F6qKWimDrlhimf5jn8XUhxSbYqFlUqraRO9hcerHSLRGxNYrpjfqkohLacZsB0Uzba7T72EPEY%2Be6CzP4FzeG9gQw3q4TAp%2ByC36AwaCuCJZEDV1uS76EjoO8uieDJjkVEpURtGZF8s1UEKyN8Xf3MSV2Lh3RY7Gu5yasa8FPC6dRQDqKXVYE51Dk%2BMVXIJL%2F5%2FzHU1oW%2Ff0P%2B2DLJvs0J9BL5%2FNfPJGOyNAiiuBLQVjkWThVh3sbThYJVcbA1HhRoujP4oZhciwdCk4hEbM9p9%2FwlOWx5uCVBqrZ1rVu6Z2UFgPNjnXI1uQRcKVkORqNlNYV4INqrc7fdVwHp4vBXL6PQQEutEckPafKtIgEzWgr1ViVBmX5CYwYZdGYN5In0wOT0wpMsEzRkUygJwVaT2WpyUWaUulNqk5m2HarYvVquzRauPv%2B4vZtqY87nPEbmuW7kfP6lhnhEid%2FoszPs3Yu6v6rPN%2FAhX1rOx87VssrL9txWsvWyaZLqwsWRn2zTmGEa8NPKI6dGMLgx3LxxkTphv5%2FUV0tDRZPNdWxjFAyg7rRIWwpvO7G0N56YkehrLtPh0z9Iui7P5q0TNRxQuXfqSsOYQzRd5%2FmorY9KBrYmURjk0p0DDkVFtqUBUzykgqQygtpKB4mKTMBJTP4k36orPeNio32LkhyGFVGGHO%2FEsBuLMKwbC12azYKGaxidoA9poZaQ%2Fb3%2BbbqRPFre3l5dkgX8f3eHDMLf0Gy5mjy%2Fyu7Bo4zs7WixvO1YdzNMTLWDmQQ8UTL18TSULcDFEAlK1%2BdneL5bB346Y9C0e22Yo%2F70jTIX%2FUnRrspYnFRWMu1PiB9fsjjdM7%2Bxkdx0SK80ke9JtwFqP%2FL15WOx5mfHHpaCxkFEjaGnDCdfydUj6u4oqVnh3Wmg6ZGkOW8gJufqdnhkLofmMQlvavd42zpY5VLaxUqvgFEyx4BfRnryJ3oAGP2eyRzcMWY0qZJjynJcxiMYRncs0z%2FxwprLXOGIWdeJbg%2Fn2xkcDKuQ9sCFwMEHr%2BH42pSsx%2FK0zFTHYD1EYQjruiJqnxphv5oumFZV85ftevHo7akooJkvjsN9QvdYybkY%2Fzvdv4dkvRG%2BKqIMnDhM6aBWoxMkeSCd0Vkn%2FRux3Tho4npbf29cNy7%2BzeDdE7QrfGNoqAvtBsyq1aZmNAyYGAqXur%2BWX45T3JBb3d886gseJ%2FHgcsitL%2B4ejQqxw7rRE6eRHZdtzHFJKl%2BrFJXBfzX5AF285%2BzQzDb6oyVk%2FoMG%2BVTBX8vbEbONi%2BNuQ823J%2BuQ78yFCMSHCgIDj1YAM9oPbz%2FoMT7nuv%2B2DNxMnnQgybdpIaIyMHCYPMDwAlVGfM%2BjAnq%2Fpr3EMvUAjVFEqexmPhcp2Mc2zdXNy6sXV%2FNmRJ5Xjh%2Fqkv8NayAwkIzVXg%2ByoZlwvoKH0DKkXN%2BZUQDd6YDZsdpDKnck4SGDGYD2OJ2UM0lluNU2CibPN7puMMgm%2FpSd97Y%2BnNYmf9SaXj17hmlHOympjEpL1hOKp033va65%2FMVzbM09tFhQCCofGrsprf%2B2aWfyXS9ePaS0Spelt1VHhsNBEj9ngoUqlVWiH%2BnxAM8Vi3vHdcOHS8%2Ft2PoxLngnzGa0Q60mv8DJ02nGXffwe3L7tSjca%2FsdQ2%2BLqkbki9rgaZZBd%2BtVMCxagoKLaNoYwoW%2B7uGxV07OPDAcEUmWeHCBJbVtREHYE8FuMfBHZQjXiyBchHu%2FxptpLsNlZ4EOyySRblJcxGBLEJj3rSYBTcDLMSMVShsDLtwxnU6zmuiV%2FGpyd7xwWU3Q03JwtQ1UXQQeBJl5HO54krOHeZXLyKSoBBrI5geCJrvONT0r9KtpIU3CbSpnTQRqUl5UzVk2mCySKd5dWIJ%2FL%2BA8KJhI9p%2BCw2QGIx3ey6kJswcvpGs232zn0H98TUN1hDqHU2Cp%2BRyKzeeL65evfrh%2BsXj1w4t5xrMyyezKW3jXLzxwqKtZ9nA9SyCkzmjy4B22ApgKla4FWM9y%2Bcy79harBHSGOzh67j33nq0SjqPDcvnCW1zjYSZSJR7wGBIskH7NBUPs2y8TbAoU8P7XN%2B9%2B%2F%2FzOU%2FcKU0AnmrIkPXhl4xc5k1Xs6umHOXu%2BWKzDIFgsrn64esb%2BeR1cv7q%2BXry8Cmh4%2FfLZ%2BlXw7HrxLHhRCYVFCJuze4pThBzOYXiYteFhblI9XpIW99O7129%2Fe%2BfFkUWwLVMHFU0oe7CIswLqQpa3I%2FASOK1NsF2wPugwhz%2F6FqMHv9rHfsTXJ2ENIxhw4RTMPn4Trg%2B%2Bew8LZiN2mlA%2F5hhBjLqhqOI8Lymg0gVFNeYoQfhUxRFRDeoIYYzlBypjJ5SZrCOkpfc4M3FCmYE6QlgRBILNYpo5oa1LO1qe4jGDpQtzSGMHeaxQd%2FSNliUEc8PtWtIxsmJH%2FC0e72nGA0%2F7dZmw58Xh0jtyQVgLOk5Uire7t64oM2hHyEtFESczmkQzV0J%2FH%2FJYoe7oGy0rSVioWDTLQ4ru6obCPugxYqVkorwhHVMl%2Bb0banupR8gt4gLz7dksLOTeDefsYz4vNYIMcsOTzcyRhewp8FNE5oqGOzB%2F58Qeg48QnSaFE1PTFnSMKOXKYtBEHSGsiIOACeGEMpP1vLQ1dWL0rzFHCBLpwRUr7LCOkFbABMEJIzRIz8va0EQ5EQtb0BGiJI9cuevXYT0vbcuocsTBTNQRwniu0o2kTtyE7sKeF%2BfKOvYJi1eRCsGz1AlL7LCelxZTyWO226UuaOvCnheXMIV7vFyQZqKeF6b3TrqzgDnGfYJAZ54Y9BCPl%2BnO3bEe4vMyM8odstYj2tHy3OnEU%2BAxIiUVggnIBTbAE3zVwA2tX%2BEeIZmH7kzTurBjxDE3ZI2NpZJGbsSXFnSUKE6FI6pq0vOycprsmBMPYQ3SEbLKxykOPRzpIR4t0yF9Y4WJNHMiKragI0TBCLhzZVHehR0hzq0nOU9%2FflPncGdy2UM8RibLMubOJogT3hESC5mJIp9FbM1DrmZrDtNShxSfwT%2FfAEoy5sjtXBP1vLA9S5zwzIZzhCSeQs86IaolPS%2FrQHFHHXXjAWsXtk9c%2FUqgfUoasg62%2BVVIdr3BdUzWxa6%2BbUl3i2Xcx2i94M0r5HbCd%2FA6AvRbwXPf5wlXvm8X%2FSlbHzq%2Br5pKznIr4Tt0ffj6h18oLuwUcMTXI8HY%2FmejgiO8HgHNlwDYiN%2BB64M3vtzASv4jvh4JTRk2h6FeyCEx%2Bt1Gm4XUgEMicBlts4aKb1BC9SKc1TJaxkEp5ZNPq5U0iOeF%2BLgAtF9MjTksqH6TyG49BuWQHOMtG5v1dDEHBelbZT5NIl%2FfT7Fa1SnrsLTqXRO%2FvhVvt7ge2iF5zdZ83%2Fax6IR0nKzqbq5D8o6IB2Xqdw6sllUTDstQ1g9WBuOglPqlAqu1GJBDYqrN6TZLaRGHhJT70W3W0RAOyag3adssxGAclNJsyrZajEk5JMf6Wc%2BYqU6z89pqIQbkkJiYbhKuigi%2FTlQ%2Fx7VZVB%2FskLhqE6v1k5ojzjGSHOitU9QhYeVeVeu7qos5QpADHXVCOiyr3Gfrm%2Fts7VbXDzwokts9TFV8QxLK3ac2i2gIh2RU%2BzJt1tEiDgpx4LbIyJshVTK%2F2kzqgCIDdVBYsyvRak0m5aAcR%2B7pPOFOTp3UgVH1FHVYmN5oaP994WPQIVH4tYEudNUR56Ckaseg1XJaxiEp1Y46m5W0iENC2g10NmvpUPbIwe%2FusFFAzdWD3KzHbeTuwPXAZ7gTUKX%2BYZva%2BTT7BLBHhIS5J082NuIbaD3gMIlR%2BB6ZheAGWg84jhU2UtdcHWTzH9vweGIR9DHZ17Ht%2Bnc1TtAe7x7%2FB2Li5oqZdgAA) vs [View with latest release](https://py.cafe/snippet/vizro/v1?c=H4sIAGn812cC%2F9WdW3PbNhbHvwpWfajUWpQdJ7utZ7QzaZJtO5M2mfTyInk4IAlJWIGXBUHJ3oy%2F%2B54D3kCJoejOPgBqE5skLr8%2FcM4BQILK50mYRmxyRyZr%2Fd%2FrLCNhmmz4tpBU8TQhm1SSiOa7IKUy8spU62SdbGQaE%2FWY8WRLeJylUpE%2FEsiA16pjzOYHaapyJWnmhymcTliickJzEgVhk%2FDA%2FytTLwYSoa8d4qr8cEel8rcyLbK8ruX1%2B%2Ff%2Bm59ef%2Frd%2F%2FHThz8%2BXhHj4Dc4wiw%2FYo4r8nOCdQqm2Ee6ZXWZRa7S2KSpCv6XYA9v0kRRnjB5RX6hch%2Blx1oqiqlTbpnyaZ7D34UUV2SnYlGl0krqZH%2FiwVq3SMQ2JKZ75peKQmjLaQZMd2WjrQ6xh4inyPczMv8nNIf3BjLcrRMCn7ILfoHCoK0IlkSOXO1IfoCOgL67IoInexYRlRK1Y0Ty7U4RrIzwTfUzJ3UtHtJhsa%2FlNq9qwE8Jp1NDOYheVgXmUOf4xFQhk%2Fzu%2F8dQWxf%2B%2FhX5fcck%2Bzon0Evktz9%2FJBmTpUEQxZWAtsqxcKoI87aeLhSsioOt8aBA053DD8XkRjwSmkQkYgdOu%2BevyHHHwx0JUrWra93RAysrAJwf6pTryRXgSslyMBotqynEA9FenbvtvgpIF4e%2FehmFBlpqjUh%2BTJOvFQmY0VKotyoJyvQTGjPIoDNrIE%2BkRyanM0%2ByTNCQTaEkBFtP5uvJrMwodafUJjNtO1SxB7XcmC1cff62up9qY84XPEbmhW7kfPG5hnhCiV%2Fps3Ps3VndX9XnK%2FiQzy3nU%2BdqWeVVe24n2WbZNEl1YXbiJ7s0ZpgG%2FLTyyKkRDO4MN29cpE7Y7yf11dJQ0WRzHdsYBQOoOy3SlsLbTiztjSdmJPqSy3T49A%2BSbsqzeetEDQdU7p270jDmEE3XeT5q66OSga1JFAa5dOeAQ1GR7WjAFA%2BpIKmMoLbSQaIiE3ASkz%2FLt%2BpKL7jYaN%2BiJIdhRZQhxzsz7MYiDOvGQpdms6DhGkYn6GNaqCVkf69%2Fm24lj5ar1fUVuYH%2F7%2B%2BRQfhbmi3Xk5fX2QN4lJG9HS2Wq451N8PEVDuYScATJVMfT0PZAlwMkaB0fX6O57t14KczBk2714Y56k%2FfKDPrT4p2VcbipLKSaX9C%2FPiSxemB%2BY2N5KZDeqWJfEu6DVD7ka8vn4o1P3v2uBQ0DiJqDD1lOPlCrh5R9ydJzQrvzwNNjyTNeQcxOVer4ZG5HJrHJLyr3eNt62CVS2kXK70CRskcA34Z6ckf6AFg9Acmc3DHmNGkSo4py3EZj2AY3bNM%2F8QLGy5zhSNmXSe6PZxvZ3AwrELaIxcCBx%2B8huNrU7Iey9MyUx2D9RCFIazriqh9aoT9arpgWlXNX7br7Mk7UFFAM89Ow31CD1jJpRj%2FKz28h2S9Eb4qogycOEzpoFajEyR5JJ3RWSf9C7HdOGjielt%2Fb1w3Lv7F4N0TtCt8Y2ioC%2B0GzKrVpmY0DJgYCpe6v5afT1PckZXubx71BY%2BzeHA15Naz%2ByejQuywbvTEaWTHZRtzXJLK1ypFZfBfTz5AFx84Ozazjf5oCZl%2Fp0E%2BVfDXcjVitjE77TbUvDpbh3xjLkQgPlQQGHi0ApjRfnj7QY%2FxOdf9t2PgZvKsA0m%2BSwsRlYGBw%2BQBhheoMuIHHhXQ%2BzXtFZapB2iMIkpld4uFSME%2Bdmmu7r67fnW9aEbkReX4oS7537AGAgPJWO31IBuaCecreAgtQ8r1nRkF0J2OmB2rPaZyTxIeMpgBaI%2FTSTmTVIY7baNg8nyr6waDbOJP2Xlv68NpbfInrenVs2eYdrSTksqotGQ9oXjedN%2FrmsufPMfWPECLBYWg8rGxm9L6V007k2968eohpVW6LL2tOjIcDpL4ORMsVKmsEv1ATwd4rljcO64bPlx6bsfWT3HBO2E2ox1qPfkJTp5PM%2B67h9%2BS1ZeicK%2Ftdwy9LaoakWe1wdMsg%2B7Wq2BYtAQFF9G0MYSZvu7hsVdOzjwwHBFJlnhwgSW1bURB2BPBVhj4ozKE60UQLsK9n%2BPtNJfhsrNAh2WSSLcpLmKwJQjM%2B9aTgCbg5ZiRCqWNARfumE6nWU%2F0Sn49uT9duKwn6Gk5uNoWqi4CD4LMIg73PMnZ46LKZWRSVAINZPMDQZN955qeFfrVtJAm4S6V8yYCNSlnVXOWDSaLZIp3F5bg3zdwHhRMJPtPwWEyg5EO7%2BWUFAktVLoR0LHL5Qvv1rtZJ4AQ7uHopffSe7FOOAbu5fKVd3OLh5lIlXjEY0hwgwVvuGBY4urzBCmx7Pc%2Fv3n362%2FvPPWgMAW0L56t20TSo1e2S5EzWYWVniZasJc3N5swCG5urv9x%2FYL9%2FTa4%2Ff729ua764CGt9%2B92HwfvLi9eRG8KpNDq0i2YA8UR%2B8czqHnzlvPXZhUT1ekxf307vXbX955cWQRbMvUQcXezR4t4qyAupDlnQK8BP5kE2wXrA86zOGPvvvnwa%2F2sZ%2Fw9UnYwOACXDg7so%2FfhOuD795egomCnSbUjzlGEKNuKKo4L0sKqHRBUY05ShA%2B8HBEVIM6Qhhj%2BZHK2AllJusIaekDzkycUGagjhBWBIFg85hmTmjr0o6Wp3jMYFXBHNLYQR4r1B19o2UJwdxwu5Z0jKzYEX%2BLx3ua8SzSfl0m7GVxuCqOXBDWgo4TleKd6J0rygzaEfJSUcTJnCbR3JXQ34c8Vqg7%2BkbLShIWKhbN85Ciu7qhsA96jFgpmSjvFcdUSf7ghtpe6hFyi7jAfAc2Dwt5cMM5%2B5gvS40gg9zyZDt3ZCF7Dvwckbmi4R7M3zmxp%2BAjRKdJ4cTUtAUdI0q5shg0UUcIK%2BIgYEI4ocxkvSxtQ50Y%2FWvMEYJEenTFCjusI6QVMEFwwggN0suytjRRTsTCFnSEKMkjV%2B76dVgvS9sxqhxxMBN1hDCeq3QrqRM3obuwl8W5so59xuJVpELwLHXCEjusl6XFVPKY7fepC9q6sJfFJUzh9isXpJmol4XpbY3uLGBOcZ8h0JknBj3E42W6c3esh%2FiyzIxyh6z1hHa0PHc68Rx4jEhJhWACcoEN8ATfAnBD6xe4R0jmoTvTtC7sGHHMDVljY6mkkRvxpQUdJYpT4YiqmvSyrJwme%2BbEQ1iDdISs8nGKQw9HeohHy3RI31hhIs2ciIot6AhRMALuXVmUd2FHiHPrSc7zn9%2FUOdyZXPYQj5HJsoy5swnijHeExEJmosjnEdvwkKv5hsO01CHFF%2FAvN4CSjDlyO9dEvSzswBInPLPhHCGJp9CzTohqSS%2FLOlLcUUfdeMDahe0TV7%2BtZ5%2BShqyDbX5LkV1vcJ2SdbGrL0LS3WIZ9ylaL3jzdred8B28jgD9wu7C93nCle%2FbRX%2FO1oe%2BofgmM2e5lfAduj58%2FcMvFBd2Cjjh65FgbP%2BzUcEJXo%2BA5v18G%2FE7cH3wxvcOWMl%2FwtcjoSnD5jDUCzkkRr%2FbaLOQGnBIBC6jbdZQ8Q1KqF6Es1pGyzgopXzyabWSBvGyEB8XgPaLqTGHBdVvEtmtx6AckmO8ZWOzni7moCB9q8ynSeTr%2BylWqzpnHZZWvWvi17fi7RbXQzskr9ma79s%2BFp2RjpNV3c11SN4J8aBM%2Fc6B1bJqwmEZyvrBymAclFK%2FVGC1FgNySEy1Od1mKS3ikJByP7rNOhrCIRn1Jm2bhRiMg1KaTdlWizEph%2BRYP%2BsZM9Vpdl5bLcSAHBIT023CVRHhN33q57g2i%2BqDHRJXbWK1flJzwjlGkgO9dY46JKzcq2p9V3UxRwhyoKPOSIdllftsfXOfrd3q%2BoEHRXK7h6mKb0hCufvUZhEN4ZCMal%2BmzTpaxEEhDtwWGXkzpErmV5tJHVBkoA4Ka3YlWq3JpByU48g9nWfcyamTOjCqnqMOC9MbDe2%2FL3wKOiQKvzbQha464RyUVO0YtFpOyzgkpdpRZ7OSFnFISLuBzmYtHcoeOfjdHTYKqLl6kJv1uI3cHbge%2BAx3AqrUP%2B5SO59mnwH2iJAw9%2BTJ1kZ8A60HHCYxCt8jsxDcQOsBx7HCRuqaq4Ns%2FjsYHk8sgj4l%2BzK2Xf%2Buxhna0%2F3T%2FwB7u44%2BNHYAAA%3D%3D)

### vizro-core/examples/tutorial/
[View with commit's wheel](https://py.cafe/snippet/vizro/v1?c=H4sIAGn812cC%2F81YbW%2FbNhD%2BKwejH6RAkeJ4aRsDwtakWxegG4Im2D7EhkFJlEREIjWSsq0G%2Be876tWvSfeCYXaCSNTxXp67e3TM0ygUER1NYTSrvz%2BuSV5kFEhRQCxFDjqlIOKYhYxksGRfpYBSUQm61ELimjvjM35H6RRSrQs19bxayJWURLg3EqFymfAo95QmQUa9giRUed125dF1kQlJT0ORF4JTrpWHKht3UDXDVakby26OvmYKiIJlvvMIleisclGbpKoWKdYzXofQeN1K%2F2ZuNh%2B4MUtK3NMJPBZsERIZbck0hl1dFYNgSAqNG7fk6hB7iYiodEGSRSJZZGLRrFDgo2NuRDRxza1lmwcz%2FkOrzZqNEkmKdDbCBxGNISBykVPCLbNlEUuSUwfWDlT2dMYBPw1U14i3RssEwlJp9Af3QZgS9GLFdAokSSRNUCQCowgso9N2O5yNoihGXxP0b7DkJlKURVBZa9vFZ9ZTNUV7Zuts9GxjjhXVC4Z%2Brk0cRgmC2USI9q1GI7rrG4f9yoGMBIij%2FzQbYfCzkdH2YUkllgTcswKsN7ZR3KtyywKdoQstSUiVtWJYUv6Z%2B7aVkBQh40awATFmUumFKTD0YZm7t3hlNaKa6Yz6s9FHjG02cprFoeT8h2bFfHDjh%2BQTpswa1lp%2FMEH%2BZlItk0Lb2ZETQlPpN9CenBiLcCdKGdLpyQlcyYpw7cCtC59cIDyCuxwT5MAvYI0vLy%2FsbWW3GLlmIfZerecDJ1mlmJrCNVEU7nQZMVNvHK5Kxbip%2FDtNNFO4R7nbqn4WOV0JETlw83kKX5ipjgg%2BunAjV6jgtgwyplLGk7YqNsLqQpzj37pgFQ0Fj16G%2Bq7McyKrXlFGKlFqH4U%2F11eWQdB%2FeDhzYOzAaf07d%2BDh3IH258W7uf1aFn%2BqE3Y4i12X7zyt%2B6Avf9%2Bk19mXWJKspItQZGXOMVAtNMkWAcuyLdC6D7bAIi556Hedc1RjLGRONMq9eaoXpu55%2FHxQvsO4a56rQ8bt%2FQT%2Bu8jsAWF62jkQ8Cvx7YWDXKA6Wno9mnsSqB1vkYe3qmFD%2BlpwTbBV5IEAN6G9N1mtgW1oyTksfrj6Dtj9ZGjdakFGgkyxSQVyfW41WK53Ksm2j1icH1g%2FJPuXYzWo%2F4exmmL5R0HOjzBU4yrXUuCr5qEu9wwZ2errNCLISrYDBx5pllNTkYpmNMQRxdDVdUrDR%2BRGbdmHNyn2FTfZPTvqlMlXyLEj8m9ix475voHzGuS3cUI9sxG%2Bj%2Ffy2jnze0olhUjAikJCNeQ4j4HJ1Pd7W9qc9lNJk89qaP71gO%2FRhj3q5JKJjPGjft6oehwlLUtEki0ph6DCqSemK0DUMkblca%2BxEhsLL7jtILY4jw63gVj797KkfyeeFIeynBQvAI9vYaiHLDBFBEw14BdSxKweJl8KJqJcMV0tWjMbzdX6XvXF6cDXIVjTji1Bk2VSEzBd6wXBmdyQM7Ly4fTtN9cWDLfEvBr0HttoIrGqjHSbYHdtbPZ3NeDNShtJJ4BlZi53yWCzOb%2BQiIkbTXN1gONEoZngteUWkaHDERnamlG5eKStBw1c8%2FaVNUDZpew6JRxrb31K1swMXopFtBm01XTvlfXSCGXmyECYEazmiI%2FdbRtGfUzyH4aR1nBSP3ShPz3HdOj0ZG5ovOMX6PX2dcTJkuFJAIEx%2BP3a323ghyKLTZBR6IrsppUZ0I%2B8ZHHDZ8YfrXreH8buLqpuAWFmGFONMlY7jrTbhfeCxusa8i2dw8AJmwQ7GDGsVadq38p8I1PNpd0lynzrU6Nlu0HJssjqU4dHoJKbow%2BaHEn6R8kkzQ0rmwN1dx4uKjckMfWS1EPTLMaB3svDRywdWjWHZc%2FM%2BFinHmpT3njy%2FvLd5GJ8%2Be7CK1jRiJyeuWN3coEtvzw7LarJKUf6PyW8cldpZqzHDA%2BeaPbhacSxC40DeIZ3i8o8LGW26ZEkKzfBQ0cZmKO86Wb0Gdsw3%2FWLfjcex2EQjMdn787O6dtJMLmcTMbvzwISTt6fx5fB%2BWR8Hly0PoZIXXier%2F%2BDMBzxvdaPZwc2fFN4dFReJhLhqmXyP3Byx6Hn%2BfOfj0FeDRwRAAA%3D) vs [View with latest release](https://py.cafe/snippet/vizro/v1?c=H4sIAGn812cC%2F81XbW%2FbNhD%2BKwejH6RAleNk7RoDwtakWxugG4Im2D7YhkFJlExEIjWSsq0G%2Be87Um9%2BT%2FeCYU6CWOTxePfc3aO7p0EkYjoYw2Bqf35ak7zIKJCigESKHPSCgkgSFjGSwZJ9lQJKRSXoUguJa%2F6UT%2Fk9pWNYaF2o8XBohXxJSYxnYxEpn4kh5UOlSZjRYUFSqobtcTWk6yITkr6ORF4ITrlWQ1RZm4OqGa5KXd%2Fs52hrpoAoWOY7W6hEZ5WP2iRVVqRYT7l1oba6kf7NPGxu%2BAlLSzzTCjwWbB4RGW%2FJ1Bf7uip6wYgUGg9uyVkXO4mYqMWcpPNUstj4olmhIEDD%2FJho4ptHxzUbU%2F5jo82ZDlJJisV0gBsxTSAkcp5Twh1zZJ5IklMP1h5U7njKAT81VDeIt8abCUSl0mgPnoNoQdCKFdMLIGkqaYoiMRhF4Bidrt%2FibBTFCdqaon39TX4qRVmElbN2fdxznqox3meOTgfPLsZYUT1naOfa%2BGGUIJi1h3i%2FU2tEcwNjcFB5kJEQcQyepgN0fjow2t4vqcSUgAdWgPPKNYo7VX5ZoDF0riWJqHJWDFMqOPffNhKSImTcCNYgJkwqPTcJhjYsc%2F8Ovzm1qGY6o8F08AF9mw68erFPuWBSr5gPHnyffsSQOf1aYw8GKNgMqmNC6Ho7ckJoKoMa2rMzcyPci1JGdHx2BteyIlx7cOfDRx8Ij%2BE%2BxwB58As4o6urN%2B62sjv0XLMIa8%2Fqec9JVimmxnBDFIV7XcbM5BuH61IxbjL%2FXhPNFJ5R%2FraqTyKnKyFiD24%2Fj%2BELM9kRwwcfbuUKFdyVYcbUgvG0yYoNt1oXZ%2FjfJqyikeDxaajvyzwnsuoUZaQSpQ5Q%2BLP95hgEg8nk3IORB6%2Ft38yDyYUHze%2FJp5n7UhR%2FtgE7HMW2ynd2bR106R%2BY8Hr7EkuSlXQeiazMOTqqhSbZPGRZtgVa%2B8ESmCclj4K2co5qTITMiUa5V092YexfJM8H5VuM2%2BK5PnS5ux%2FAfxeZPSBMTXsHHH7Bvz13kAtUS0sve%2FNAQrVjLfLwVjZsSN8IrgmWijzg4Ca0DyaqFtialrzD4oez78C9Hw2tOw3ISJALLFKBXJ87NZbrnUxy3SM3zg6sH5L9y74a1P9DX02y%2FCMnZ0cYqjaVaynwVTOx6Z4hIztdnsYEWcn14MCWZjk1GaloRiNsUQxd3Sxo9IjcqB338CHFvuIht2NHvWDyBXJsifyb2LFlvm%2FgvBr5bZxQz3SA7%2BO9uLbG%2FL6gkkIsYEUhpRpy7MfAROqHvSNNTLuupI5n1Rf%2Fusf3aMEeNXLJRMb4UTtvlW1HScMSsWRLyiGssOtJ6AoQtYxRedxqzMT6hhNme4gt9qP9YyjWwYMs6d%2FxZ4FNWU6KE8DjWxhskwUmiYCpGvxCioTZZvKUMzHliulq3lyzUVyN7VWXnB587Z015dgQNFmmloDpWs8J9uSGnJGVD4dvv7i2YLgj5tWg99hGE4lZZaSbAPtrc2f3ZAGvVxpPWgFMM%2FN1lww2i%2FMLiZm41TRXBzhOFJoJbm9uEOkrHJGhzTUqF4%2B0saCGa9a8snoo25DdLAjH3Fu%2FJmtmGi%2FFYlo32mq898o61UKZPjIUpgWzHPGhfWzcsGNSMOlbWsNJXdOF9nQc06LTkbmh8ZZfoNPb5REnS4aTAAJj8Pu1e9rAD0XmmyCj0DXZDSszoB95yeKBz4w%2FOrbf79vu1qt2AWFm6JNFGbMdW9rtxDuh8cZCvqWzbzhhk2D7Swxr2VDt3zLbiFT91W0DZX7s1Oi4fliyLHa60OEIVHIz%2BuCVA0n%2FKJmkuWFlM1DbidBsJAxnQlyZPA04FojZw%2FHaLyqzWcrMLLTDsyQrP8V5oAzNlG0KDdVhheTDPHrEbKNVPV8P6XejURKF4Wh0%2Fv35BX17GV5eXV6O3p2HJLp8d5FchReXo4vwTS2O07WkOGrb4b6fvoeNHc8ebNimcKpTw0ykwlfL9H9g5I5Bz7PnPwHKWw4CtxAAAA%3D%3D)

### vizro-ai/examples/dashboard_ui/
[View with commit's wheel](https://py.cafe/snippet/vizro/v1?c=H4sIAGr812cC%2F80aa2%2FbOPKvEN4v0sKSX%2B12W8DA9pL2LkDTFtv2vsSGlpZom40saSkqibfof78ZPvTyS8l2cXbS1CLnPcOZIalvvTCNWO8V6c3Uz3%2F5XyJ9fUW%2BXJGI5utFSkVEwjRZ8lUhqORp4mvAWTJL%2BCZLhSRf8zSpPS5iGt6WT0il8RAs0lTmUtAsCFMYTlgic0JzEi3CEjCjCcDiaBZVg3Eq462%2FAtR1kC6%2BslAjrtI2CE8VKq8m7lAvfwO6xgrnbtOaMpjsIRMs15wfZslSpBtCQ9Q7J6USkgYFwNMo0FN9EvE8i%2Bk2WPKYJXTD%2BkQUSaAoB5T3SZEBFgskXcTMUK0pbwg7s4TA5wKEvIh5pmzfN2NFLtPNpfWIGb0UaRal98k1Swoz9DZmDxdpIilPmDBj%2F2E0YuLC8jOjV%2BBV8%2FU6jWhsv28tVTPwYbm8oMkdzc3z53S1itmney7DtRn6kjPxEXTK5Gf2IF8LRmsTX5SlzECo9NB2gCHX2ALjwlrhKskK2ScfCqn%2B%2FyTBcH0S0jheQFzBN%2FkA9g7DPlkxGdA8h7%2BFiPtkLTexoacMbwmqkMb4lGL7SouhgGKarMI1GCqgiVyD0jy0KBdrKl%2FbwVnCHkKWgWRq8o0QqTB0GnBkSt6DgY9y2nCM%2FJjyOqdrPfj66gSnEq7G6W7jl%2B72aRQFcpsxZ9aromvW69f84HZFqeKgM0oZKZ0xGqHeGQsjt7seGNudoevB7T7Gus3w74xaX8Ea6SNdscPwraXcBaWREVyMmcZIZ9nw59OXjx8%2F%2FP75zWVw%2FeHyzbtPEIjfdHzOeh8ylkAIQym50UN6eJVJ71nqbXjCgejuzL5BTxZiUc3M%2B5ZHtSbbbMKYFhHzJl6aFbkXQ87IZYt0CfLcg4KVMHkCzACNh%2BNnw%2FH45SEwWNe3hYaaDF%2FsEdosWy1yz2QA4C1WrJIA4FIwoGenE7ZJ9TDWZ4uigSvSD9bgvZVIb70Fk1RPf9f%2BwqIWZBAe4CgTKKbI8Gg669n6FJRwpfiSy5hNTT%2FgQcrxSAiBLRnhiWQC694dI5DUBNQvWC5r8lEVUAKF22RcSwrqYlrIKfB%2Fp745lRlXAuSo%2BRE%2FP9%2FcDPvE%2FM7n5Gcy6u9AjPowSsbwqyHqIHP91bUlpwzqOqfWQnLcGoHG%2BnCavPdTs5%2F6ond2p0vD6%2B7Bw07CCy1CI8DqH%2BuLz4VICFhQqBYEHZFCpcsLCi3NrBgPR8%2FIV6ivRFOHIsnyUPAFVE90Ss6YRlZOA2zT1xxke8Rv7Y%2F2481w3ic3o%2Fm8fxhSpPfBimagzRD6q0Os3QPjx61f88JbbFeZo4ydr9N7a2qDjitLdbRsWu9IHNXaLQU0cNMs8i%2Fh6S0%2BOK7rHtGpqq5HTFT6XkliAqAu0HFU04MeU7um%2FmsF7ZyGVS1KkSjw6W5j67j9bjQ4Nm0o3X71fAxyW1cOwdjeuUpwpz6p6hErtuBJwXz8qvlssPZ7yrUeBxH8XG5jtjsn0zSWPLPTXdh3MczTHdHaTTzVDXV7PMGmxkMb2A9hhxGueRwJlpyBgerbqf%2BTcWrxU7NMLbIwaf9gmx2jcQh3H84%2B2A6ly9ahH1cxjqvb6ARav6rsT07Y62bSJ96o%2Ba%2FWORzB7lbCRuMjNUzXq9iAPvvHqt3u7kOXPQlPHoXHWe9YXFX7vBOLMM10BWrvAW6q1h%2FK%2Fx2NC4yRZttPNgUk2Olb6FSgG1HiqaMYLzK88TzpKasCQu1fhZQnM4i2iOCrFRPeQmGcLLloQMD6vUiI7YLPokzXT5Yen%2Fw6QevdRRlBvvLqSeVb2A1r%2B0kQxjy8zR9JZbeuPwa7GWRPUiNnUvJklXs0494t2%2F59Iguas79H5YkKPaHK4cbQwx2ot6HiVvFsFjt1GOvrXrrar3qaxKNr7D9RABtnmF3ShDXzSbvajFjLgP3mIUW%2Fvv3v2w37KUvYHFoSPe%2BqXy9TjQM9XYcwhLAENc7WHHf%2Bo3oI7BJUN%2FDiEZvPR1Tuo6BuBzvPq8cfdsrwb1x22r5qBdY2tNmDn4dUSiDaYQ9bP%2BTT9Gxygb4%2FKXZ7h7p93dpZlzkhrC6Npu1LCwcPmECh8rBpbnB%2BIhkIri8B7Dl%2Frqd%2Bs8%2FGQPpWwGksUlhWPA%2Fw9KySVl0iOOZMrQlbFSILfKPuGI4QNfpFbElwJLBwjqUFPY0Gdl%2FZozn8uTDCk2UqFCYgqbOYME5z%2FJ4ul6HKS8SSrFxf3rOpyGUSD3%2BSVFpOhC%2BJZU8Y9FV2oqPhbD3TuuIB8K712rCwUcYlrFFM7XEr2%2BBBSwCgAYA6avqAOWSqYAnAEiypezTV3cesh2oqUlpHSCc0z%2B9TEekbyK6KYs3trCkCd1UVYTvrqir%2FP6Lsbp02xbgs1m2NtX5ertLxjpqNZbFT0atTnObi0DQDhNc26auTyiOLQrPHpbBg8p5BWOurO1wk%2BkaWILWG0TDwU30N%2B6rKRcaUmET8JA30CQHaTLXlXAkFOQmxoF7DgOlyoBzfmJNw%2FRUB4VvLFwfwtIwNRMsT1NtgGo4sa3Uv7uvhAHoCx0gFuyP4O9XT12i7GEpCELNkJdfT0XDouqUWguWQHXIkB%2BYAVj3%2Fa8oTB9j%2F8ccf2Vau1camxRy9BdMgnNuIuxrBE%2FGl2nB1sHEi4baP3A7lXBtbJwk3AHejr5WZFaXdtHwyDm1yVvgHcvCj4s4iGEl2EWqpvOGTblkcV7g6nMMjwrZB1OK1DmmUc0%2Fdke%2B4hOwHVu91tIHnLb8cTw4GOBPsDswZ8IRLTuMA1Zp%2BFgWr3Gc1CqCNKR0YoLz90ooBSnTSl5YS%2BlNnEyD59z0JCE25CPBqSOZ2TUd6S6xRGXZKoXzwzX4ZliyPLCDwbcPiwt%2Fn0xpvfTiAEgFp%2FM9Hc%2BTO6dwHhqqShEpifAU0Vqm9UKlIu%2FVbPOhAjU2m%2BNaNL1P15AC6u2uTMPRzlkSYA8FHTg0dm1h95F3eTqLvtIbuo6yig7dmFZ2qrVk65HNtjJPi1%2Bhi4JtHFFuL4LaX8k25ittnYPoWWG0q1bI8Cmir9by%2F28XshzQrzRyeK5qBhTzaw%2BCqUliqf72jPMb8TvTbVI2VVU4G5lWrKdk5L1ScjF1BHlrEUkMDcBsftnbNitWa7zcpzEzepFkGxNSpneP6iwKaIKfcmbhq3ldLU%2B82yzMNHybAtSbbRovQf0%2Fv3vHktrY%2Fg8i4plDQ1aU3Ghij07%2FarJxchNPGO0ngkjiFxZPfrZQ%2F1f5qQRN92UtoLO0NO0E4BVOtx9pGay3YEkDXUmb5q8FgBayLhQ9larAJbzmU7%2B3grnHnrjbu%2BIYBcgigtUhuG3NhDEK%2B1%2BuMJuE6FXvuoV2VnNFWokgc%2BAoy9wT7s%2BCCbXBziq8NWpmyrR%2FSJRus1gMqJF%2FSULaEG5jD0QFQywejya8vX0yej16%2BeD7IeDYe2CNNb%2BhP%2FBd%2BxO6GXradeAlUYo8mW%2F9%2BDf79Qew0CLAa%2BZPnh3iZFxmxHGfbBxjY88ZYfbB8uWuWrAT0sjGT5CdYJUhE8luZ3kJ%2F%2Bxtpq4ApLx9sKOjBkgUUAAzsgUXwIrZJq6chmGbohdlkNDZ%2Fs20a8YgF%2BAZKMAzuab6ZjPcbaz%2Bnr1wyodnor0P%2FF3%2F0Y3ko4flfTORGn%2Bp56I%2FhV%2FugE0%2BMQsUF33z51sNqgYHoR2BoBkU0gSYEYWAB1gNU0HtfL5wiZ8JcSO9ZQwP2bDRahovFaDR8MRyzXyaLycvJZPTrEHLh5Nfx8uViDPItnpsYonzAHugmQ7XLHBMUfNAU6HufVLJeqhlU4hwErUnTkPL3N68vr9%2F4m%2BgchKyEacgYFJJDDcq25yBjJUxDRpOIzkTImjRNKSHPn4mEWpKmdFhT84F%2BW8cP8%2FwsBN0Rap%2FMtgU4I4lLkRryVqfOZxIITYEastbbEJ8n5yBtW6TD8soHeXYCo0zf59%2F%2FBw%2FCAE0QMgAA) vs [View with latest release](https://py.cafe/snippet/vizro/v1?c=H4sIAGr812cC%2F80aa3PbNvKvYHRfyI5IS3LatJnRTHN2cpeZusk0yX2xNCxEQhJiiuCBoG21k%2F9%2Bu3jwpRftpnOSHUcE9r2L3QXAPwexSNjgFRnM9M9%2F%2BB9SvH5HPr8jCS3WC0FlQmKRLfmqlFRxkYUGcJbNMr7JhVTkSyGyxuMipfFd9YRUWg%2FRQghVKEnzKBYwnLFMFYQWJFnEFWBOM4DF0TypB1Oh0m24AtR1JBZfWGwQV6ILwoVG5fXEPeoVbkDXVOPcbzpTFpM95pIVhvPjLFtKsSE0Rr0LUimhaFQCPE0iMzUkCS%2FylG6jJU9ZRjdsSGSZRZpyRPmQlDlgsUjRRcos1YbylrA3ywh8rkDIq5Tn2vZDO1YWSmyunUfs6LUUeSIeshuWlXbobcoer0SmKM%2BYtGP%2FZjRh8srxs6PvwKv2641IaOq%2Bbx1VO%2FB%2Bubyi2T0t7PMnsVql7OMDV%2FHaDn0umPwAOuXqE3tUryWjjYnP2lJ2INZ6GDvAkG9tgXHhrPAuy0s1JO9Lpf%2F%2FqMBwQxLTNF1AXME39Qj2juMhWTEV0aKAv6VMh2StNqmlpw3vCOqQxvhUcvvKiKGBUpqt4jUYKqKZWoPSPHYoV2uqXrvBWcYeY5aDZHryjZRCWjotODIlv4KBj3LacIz8lPImpxsz%2BPrdCU4VXIPT%2FSas3B3SJInUNmfebFBH12wwbPjB74tSx0FvlCpSemO0Qr03FkZufz0wtntDN4Pbf4p12%2BHfG7W5gg3SB7pih%2BE7S7kPSisj%2BBgzrZHesuHPx88fPrz%2F7dOb6%2Bjm%2FfWbXz5CIP5p4nM2eJ%2BzDEIYSsmtGTLDq1wFL0Sw4RkHorsz%2BwYDVcpFPTMfOh71muyyiVNaJiy4DEReFkEKOaNQHdIVyPcBFKyMqRNgFmgymrwYTSY%2FHQKDdX1XGqjL0cs9Qttla0Qe2AwAvOWK1RIAnAADBm46YxthhrE%2BOxQDXJN%2BdAYfrKS4CxZMUTP91fgLi1qUQ3iAo2yg2CLDk%2Bls4OpTVMFV4iuuUja1%2FUAAKScgMQS2YoRnikmse%2FeMQFKTUL9guazJB11ACRRum3EdKaiLolRT4P%2BL%2FubVZlxJkKPhR%2Fx8d3s7GhL7O5%2BT78h4uAMxHsIomcCvgWiCzM1X35WcKqibnDoLyfMbBFrrw2vz3k%2FNfZqL3tudrgxvuocAO4kgdgitAGt%2BnC8%2BlTIjYEGpWxB0hIBKV5QUWppZORmNX5AvUF%2BJoQ5FkhWx5AuonuiUgjGDrJ0G2LavOcj2iN%2B6H%2BPH29F8SG7H8%2FnwMKQUD9GK5qDNCPqrQ6z9A%2BPHrd%2FwwltsV5mnjV2sxYMztUXHlaU7WjZtdiSebu2WEhq4aZ6E1%2FD0Fh883%2FeP6FRX1yMmqnyvJbEB0BToOKrtQY%2Bp3VD%2FtYb2TsPqFqXMNPh0t7H1%2FGE%2FGhybNpRuv3ohBrmrK4dgXO9cJ7hTH6F7xJoteFKyEL8aPhus%2FYF2bcBBhLBQ25TtzikhUsVzN92HfR%2FDPN8Rnd3Ec93QtMczbGo9tIH9EHYY8ZqniWTZGRiouZ36PxmnET8NyzQiC5P2N7bZMRqHcPfh7IPtUbpcHfp2FeO4uq1OoPOry%2F7lCXvdXg5JMG7%2Fa3QOR7D7lbDx5EgNM%2FUqtaAv%2FrZqt7v7MGVPwVNA4XE2OBZX9T7vxCIUualA3T3Abd36Q%2Fm%2Fp2mJMdJu%2B8mmhAQ7fQudCnQjWjx9FBMkljeeJz1nVUCo%2FbNU6mQGMRaRfLViMlhojJMlFw0IWL%2BVGXFd8FmU6ebJ0tOTXy9os7uoIijUXj2pfAe7Ze0wi%2BKUx3fFE6ns1vWnYLeD7FlqFEwpnq2KgOY8uGPbv05kQQv216g8U6FnVDncGAa4Aw02VN5pnu1ipw9jQ9NL1%2FvVwJB4co39Owpg6wyzT5pwZj5pV5cRGxlw2D6kGDa3%2F0O3YT9lCZdDK6LnXfWbZap1oGfqEIYQlqDW2Zrnz79VD4Fdgu4GXj5h8%2FmEyn0U1O9h53n9%2BM1OGf6Fy87YV6%2FAxoY2fwyLmCoFRHvsYZuHfIaeSy7Q92flbu%2FQtK%2FfOOuyJ4T1pdG0e2nh4QETKFQdNs0tzj9IDoKbSwB3zl%2BYqZ%2FdszWQuRXwWosUlhUvIjw9q6XVlwiePVNrw9aFyAHf6juGI0StfglbEhyJHJznaEFPY4D9V%2B5oDn%2BurPBkKaTGBCR9FhOnosDvYrmMdV4ijmTt%2BuqeTUcuU3j4kwnlOBG%2BJI49YdBXuYmehnP1zOiKB8C71uvCwkYZl7BBsbXHr22DBy0RgEYA6unpA%2BZQQsMSgCVYUvdoarqP2QDV1KSMjpBOaFE8CJmYG8i%2BimLN7a0pAvdVFWF766or%2F9%2Bi7G6dtsW4KtZdjY1%2BQaHT8Y6arWWxU9HrU5z24jA0I4Q3Nhnqk8oji8Kwx6WwYOqBQVibqztcJOZGliC1ltEw8IW5hn1V5yJrSkwiYSYic0KANtNtOddCQU5CLKjXMGC7HCjHt%2FYk3HxFQPjW8cUBPCNjC9HxBPU2mIYTx1rfi4dmOIKewLNSwe4I%2Fk7N9A3aLoWSEKUsW6n1dDwa%2BX6lhWQFZIcCyYE5gNUg%2FCJ45gH733%2F%2FPd%2Bqtd7YdJijt2AahPNbcdcgeCK%2BdBuuDzZOJNzukduhnOti6yThFuBu9HUys6a0m5ZPxqFLzhr%2FQA5%2BUtw5BCvJLkIjlbd80i%2BL4wrXh3N4RNg1iF68ziGtch7oO%2FIdl5D9wPq9ji7wvOOX48nBAueS3YM5I55xxWkaoVrTT7JktfucRhG0MZUDI5R3WFkxQolO%2BtJRQn%2BabAIk%2F7onAaEtFwFeLcn8vunIbIkNKsNOKVaPod0vw5LliQMEvl1YXPj7fNrgbQ4HUCIgjf%2BFaI7CO537wFB1ktBJjK%2BAxkq4C5WatN%2B8xYMO1Npkim%2FdhEroJw%2FQ%2FV2bxHFYsCzBHAg%2B8hro2MSaI%2B%2FqdhJ9ZzT0n2QVE7wNq5hU7czSI58bY5wUv0EXA98%2BothGBL%2B7lG%2BrVdw9AzO3wHpTqZflUUBXrefD3S5mP6RdafbwXNOMHOTRHgZXlcbS%2Fes95Snmd2LepmqtrGoysq9aTcnOeaHmZO0K8tAyVQYagLv4sLVrV6zO%2FLBNYWbzJs1zIKZP7Tw%2FXJTQBHnVzsTX86Femma3WZ1phDABrrXZNlnE4a%2F0%2Fhee3TX2ZxAZNxQKur70RgNjdIbvNiuvkPG09U4SuCQVsHiK%2B5X2p95fLWhmLnsJTZW7YScIp2Hq9djYaK0lWwLoWqm8eHVxsQLW5SKEMnWxie84lO%2FtxX3rzl1v3PENA%2BQQQWuR3bXm4hSE%2FNWsM5rFayH33EP7OjmjrWSZefAVZB5I9t%2BSS7bBzSm%2BNqj5BpTPMiNBZl%2F%2FwyKWbx%2FBJXves2oOVq9EzbKVhA4wZYr8A2ILiSh%2Bp8QddIU%2FE6d7vg1jumQXmCiKiw2lUrFsAWkTw%2BHCIQQJ24j6aRS%2BDEdBnF%2BOJ%2FZvvhUJT1iE721Eo%2BiBFpvLSfiwBnn7cfrCYYdt2Jivo%2FCHcPxteWjh%2BR9MFlaf%2BnkUTuA3TNh9T73Qd5oLvi%2Fy5wBzLLovTMDQDEpPBqUbYSBscdwJKOlDaMKtLJi017h7Iu%2BCvRiPl%2FFiMR6PXo4m7IfLxeVPl5fjH0eQQS5%2FnCx%2FWkxAvsX3Fy5gLtgj3eSodrUyo5JftAX6OiS1rNd6BpU4B0Eb0rSk%2FO3N6%2BubN%2BEmOQcha2FaMkal4pC58%2B05yFgL05LRXqWciZANadpSQnY8EwmNJG3psBIVF%2BYdlzAuirMQdEeofTK7wnlGElciteStz2rPJBDaArVkbRbvkGfnIG1XpMPyqkd1dgKjTF%2FnX%2F8H2bwKpkYxAAA%3D)

author_association: CONTRIBUTOR
user: login: maxschulz-COL
created_at: 2025-03-17T10:21:22Z
body: Merged main into branch to make testing easier (as I am using `extra` already) - sorry for that :)

Works like a charm, so we are good to go!
author_association: CONTRIBUTOR