{"id":51311408,"url":"https://github.com/plotly/dash-deck","last_synced_at":"2026-07-01T04:03:43.934Z","repository":{"id":41529403,"uuid":"288569889","full_name":"plotly/dash-deck","owner":"plotly","description":"Bringing deck.gl and pydeck into Dash","archived":false,"fork":false,"pushed_at":"2025-03-24T12:51:27.000Z","size":43107,"stargazers_count":96,"open_issues_count":9,"forks_count":22,"subscribers_count":16,"default_branch":"master","last_synced_at":"2025-03-24T13:40:54.646Z","etag":null,"topics":["dash","deck","plotly","pydeck"],"latest_commit_sha":null,"homepage":"https://dash-gallery.plotly.host/dash-deck-explorer/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/plotly.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"plotly","custom":"https://plotly.com/products/consulting-and-oem/"}},"created_at":"2020-08-18T21:38:09.000Z","updated_at":"2025-03-24T12:51:32.000Z","dependencies_parsed_at":"2024-06-07T18:42:21.211Z","dependency_job_id":"57df9e2b-262d-48b3-9b3c-f83b32be1748","html_url":"https://github.com/plotly/dash-deck","commit_stats":{"total_commits":98,"total_committers":7,"mean_commits":14.0,"dds":"0.22448979591836737","last_synced_commit":"23f26aa6d6214e7eef062bef823981138fbd47a0"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/plotly/dash-deck","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plotly%2Fdash-deck","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plotly%2Fdash-deck/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plotly%2Fdash-deck/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plotly%2Fdash-deck/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/plotly","download_url":"https://codeload.github.com/plotly/dash-deck/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plotly%2Fdash-deck/sbom","scorecard":{"id":738049,"data":{"date":"2025-08-11","repo":{"name":"github.com/plotly/dash-deck","commit":"a4821cb46f7b2cef718f3655ae8b2ef1e9064938"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.1,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":3,"reason":"Found 2/6 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 28 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":0,"reason":"61 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2024-35 / GHSA-547x-748v-vp6p","Warn: Project is vulnerable to: PYSEC-2020-73","Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-4vvj-4cpr-p986","Warn: Project is vulnerable to: PYSEC-2024-48 / GHSA-fj7x-q9j7-g6q6","Warn: Project is vulnerable to: GHSA-3c5c-7235-994j","Warn: Project is vulnerable to: GHSA-3f63-hfp8-52jq","Warn: Project is vulnerable to: PYSEC-2021-41 / GHSA-3wvg-mj6g-m9cv","Warn: Project is vulnerable to: PYSEC-2020-77 / GHSA-3xv8-3j54-hgrp","Warn: Project is vulnerable to: PYSEC-2020-80 / GHSA-43fq-w8qq-v88h","Warn: Project is vulnerable to: GHSA-44wm-f244-xhp3","Warn: Project is vulnerable to: GHSA-4fx9-vc88-q2xc","Warn: Project is vulnerable to: PYSEC-2021-35 / GHSA-57h3-9rgr-c24m","Warn: Project is vulnerable to: PYSEC-2020-172 / GHSA-5gm3-px64-rw72","Warn: Project is vulnerable to: PYSEC-2021-331 / GHSA-7534-mm45-c74v","Warn: Project is vulnerable to: PYSEC-2021-92 / GHSA-7r7m-5h27-29hp","Warn: Project is vulnerable to: PYSEC-2020-78 / GHSA-8843-m7mw-mxqm","Warn: Project is vulnerable to: PYSEC-2023-227 / GHSA-8ghj-p4vj-mr35","Warn: Project is vulnerable to: PYSEC-2014-87 / GHSA-8m9x-pxwq-j236","Warn: Project is vulnerable to: PYSEC-2022-10 / GHSA-8vj2-vxx3-667w","Warn: Project is vulnerable to: PYSEC-2021-36 / GHSA-8xjq-8fcg-g5hw","Warn: Project is vulnerable to: PYSEC-2016-6 / GHSA-8xjv-v9xq-m5h9","Warn: Project is vulnerable to: PYSEC-2021-42 / GHSA-95q3-8gr9-gm8w","Warn: Project is vulnerable to: PYSEC-2022-168 / GHSA-9j59-75qj-795w","Warn: Project is vulnerable to: PYSEC-2014-10 / GHSA-cfmr-38g9-f2h7","Warn: Project is vulnerable to: PYSEC-2020-76 / GHSA-cqhg-xjhh-p8hf","Warn: Project is vulnerable to: PYSEC-2021-40 / GHSA-f4w8-cv6p-x6r5","Warn: Project is vulnerable to: PYSEC-2021-69 / GHSA-f5g8-5qq7-938w","Warn: Project is vulnerable to: PYSEC-2021-139 / GHSA-g6rj-rv7j-xwp4","Warn: Project is vulnerable to: PYSEC-2015-16 / GHSA-h5rf-vgqx-wjv2","Warn: Project is vulnerable to: PYSEC-2016-5 / GHSA-hggx-3h72-49ww","Warn: Project is vulnerable to: PYSEC-2020-84 / GHSA-hj69-c76v-86wr","Warn: Project is vulnerable to: PYSEC-2016-7 / GHSA-hvr8-466p-75rh","Warn: Project is vulnerable to: PYSEC-2015-15 / GHSA-j6f7-g425-4gmx","Warn: Project is vulnerable to: GHSA-j7hp-h8jx-5ppr","Warn: Project is vulnerable to: PYSEC-2019-110 / GHSA-j7mj-748x-7p78","Warn: Project is vulnerable to: GHSA-jgpv-4h4c-xhw3","Warn: Project is vulnerable to: PYSEC-2022-42979 / GHSA-m2vv-5vj5-2hm7","Warn: Project is vulnerable to: PYSEC-2021-37 / GHSA-mvg9-xffr-p774","Warn: Project is vulnerable to: PYSEC-2020-83 / GHSA-p49h-hjvm-jg3h","Warn: Project is vulnerable to: PYSEC-2022-8 / GHSA-pw3c-h7wp-cvhx","Warn: Project is vulnerable to: PYSEC-2021-93 / GHSA-q5hq-fp76-qmrc","Warn: Project is vulnerable to: PYSEC-2020-82 / GHSA-r7rm-8j6h-r933","Warn: Project is vulnerable to: PYSEC-2014-23 / GHSA-r854-96gq-rfg3","Warn: Project is vulnerable to: PYSEC-2016-8 / GHSA-rwr3-c2q8-gm56","Warn: Project is vulnerable to: PYSEC-2020-81 / GHSA-vcqg-3p29-xw73","Warn: Project is vulnerable to: PYSEC-2020-79 / GHSA-vj42-xq3r-hr3r","Warn: Project is vulnerable to: PYSEC-2021-70 / GHSA-vqcj-wrf2-7v73","Warn: Project is vulnerable to: PYSEC-2016-9 / GHSA-w4vg-rf63-f3j3","Warn: Project is vulnerable to: PYSEC-2014-22 / GHSA-x895-2wrm-hvp7","Warn: Project is vulnerable to: PYSEC-2022-9 / GHSA-xrcv-f9gm-v42c","Warn: Project is vulnerable to: PYSEC-2021-137","Warn: Project is vulnerable to: PYSEC-2021-138","Warn: Project is vulnerable to: PYSEC-2021-317","Warn: Project is vulnerable to: PYSEC-2021-38","Warn: Project is vulnerable to: PYSEC-2021-39","Warn: Project is vulnerable to: PYSEC-2021-94","Warn: Project is vulnerable to: PYSEC-2023-175"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T16:29:36.118Z","repository_id":41529403,"created_at":"2025-08-22T16:29:36.118Z","updated_at":"2025-08-22T16:29:36.118Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34992074,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dash","deck","plotly","pydeck"],"created_at":"2026-07-01T04:03:42.108Z","updated_at":"2026-07-01T04:03:43.923Z","avatar_url":"https://github.com/plotly.png","language":"JavaScript","funding_links":["https://github.com/sponsors/plotly","https://plotly.com/products/consulting-and-oem/"],"categories":[],"sub_categories":[],"readme":"# Dash Deck\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://dash.plotly.com/project-maintenance\"\u003e\n    \u003cimg src=\"https://dash.plotly.com/assets/images/maintained-by-plotly.png\" width=\"400px\" alt=\"Maintained by Plotly\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n\nDash Deck is a proof of concept library for building 3D interactive maps and graphical visualizations directly in Dash. Built on top of [deck.gl](https://deck.gl/), it supports maps built using [pydeck](https://pydeck.gl/) and deck.gl’s [JSON API](https://deck.gl/playground/).\n\n![demo](https://raw.githubusercontent.com/plotly/dash-deck/master/images/demo.gif)\n\n* Try it in the [Dash Deck Explorer][explorer-demo]\n* Read [the announcement](https://community.plotly.com/t/initial-release-of-dash-deck-a-library-for-rendering-pydeck-and-deck-gl-in-dash/44528)\n* Get it on [PyPi](https://pypi.org/project/dash-deck/), which has the latest version published by Plotly.\n* Get it on [conda-forge](https://anaconda.org/conda-forge/dash-deck), a community maintained package index. To ensure that this version is up to date, please verify on the PyPi page.\n\n## Getting started\n\n### Quickstart (Python)\n\nFirst install this library:\n```\npip install dash-deck\n```\n\nthen, define your map using the deck.gl JSON API:\n\n```python\ndata = {\n    \"description\": \"A minimal deck.gl example rendering a circle with text\",\n    \"initialViewState\": {\"longitude\": -122.45, \"latitude\": 37.8, \"zoom\": 12},\n    \"layers\": [\n        {\n            \"@@type\": \"TextLayer\",\n            \"data\": [{\"position\": [-122.45, 37.8], \"text\": \"Hello World\"}],\n        },\n    ],\n}\n```\n\nfinally, create your component and add it to your layout:\n\n```python\nimport dash\nimport dash_deck\nimport dash_html_components as html\n\ndeck_component = dash_deck.DeckGL(data=data, id=\"deck-gl\")\n\napp = dash.Dash(__name__)\napp.layout = html.Div(deck_component)\n```\n\nFor a full example, see `usage.py`. To find examples of the JSON API, see [the deck.gl playground](https://deck.gl/playground/).\n\n\n### Quickstart (R)\n\nFirst, install the package from GitHub (the package is not yet available via CRAN):\n\n```\nremotes::install_github(\"plotly/dash-deck\")\n```\n\nthen, define your map using the deck.gl JSON API:\n\n```r\ndeck_data \u003c- list(\n    \"description\" = \"A minimal deck.gl example rendering a circle with text\",\n    \"initialViewState\" = list(\"longitude\" = -122.45, \"latitude\" = 37.8, \"zoom\" = 12),\n    \"layers\" = list(\n        list(\n            \"@@type\" = \"TextLayer\",\n            \"data\" = list(list(\"position\" = list(-122.45, 37.8), \"text\" = \"Hello World\"))\n        )\n    )\n)\n```\n\nfinally, create your component and add it to your layout:\n\n```r\nlibrary(dash)\nlibrary(dashDeck)\nlibrary(dashHtmlComponents)\n\ndeck_component \u003c- deckGL(data=deck_data, id=\"deck-gl\")\n\napp \u003c- Dash$new()\n\napp$layout(htmlDiv(deck_component))\n```\n\n### `pydeck` integrations\n\nMake sure you have `pydeck` installed:\n```\npip install pydeck\n```\n\nthen, define a layer using `pdk` and run it:\n```python\nimport pydeck as pdk\n\nlayer = pdk.Layer(\n    \"TextLayer\",\n    [{\"position\": [-122.45, 37.8], \"text\": \"Hello World\"}]\n)\n\n# Render\nr = pdk.Deck(layers=[layer])\n```\n\nthen, convert it to JSON and add it to your layout:\n\n```python\nimport dash\nimport dash_deck\nimport dash_html_components as html\n\ndeck_component = dash_deck.DeckGL(r.to_json(), id=\"deck-gl\")\n\napp = dash.Dash(__name__)\napp.layout = html.Div(deck_component)\n```\n\nTo learn how to use `pydeck`, read more in [the official documentations](https://pydeck.gl/). You can find a complete example in `usage-pdk.py`.\n\n### Mapbox tokens\n\nMake sure that you have created a [Mapbox access token](https://docs.mapbox.com/help/how-mapbox-works/access-tokens/), and export it as an environment variable. For example, you can add the following line to your `.bashrc`:\n```\nexport MAPBOX_ACCESS_TOKEN=\"pk.ey...\"\n```\n\nThen, inside your app, define retrieve and define it as `mapbox_api_token`:\n```python\nimport os\nmapbox_api_token = os.getenv(\"MAPBOX_ACCESS_TOKEN\")\n```\n\nWhen you define your component, simply pass it to `DeckGL` as an argument:\n```python\n...\n\nr = pdk.Deck(...)\n\ndeck_component = dash_deck.DeckGL(r.to_json(), id=\"deck-gl\", mapboxKey=mapbox_api_token)\n\n...\n```\n\n\n## Running the demos\n\nThe Pydeck team has already created many amazing demos, which are shown in [their doc gallery](https://pydeck.gl/index.html#gallery). We ported them for Dash Deck with minor modifications. You can read the docstring of each `usage-\u003cname\u003e.py` file, you will be able to find the source code of the original demo. You can also try them directly in the [Dash Deck Explorer][explorer-demo].\n\nFirst, make sure you clone the project:\n```\ngit clone https://github.com/plotly/dash-deck.git\ncd dash-deck/\n```\n\nCreate and activate a conda env:\n```\nconda create -n deck-demos python=3.7\nconda activate deck-demos\n```\n\nOr a venv (make sure your `python3` is 3.6+):\n```\npython3 -m venv venv\nsource venv/bin/activate  # for Windows, use venv\\Scripts\\activate.bat\n```\n\nInstall all the dev and demo requirements:\n\n```\npip install -r requirements.txt\npip install -r demos/requirements.txt\n```\n\nYou can now run the demo you want to try (replace `\u003cname\u003e` with the layer type you want to try):\n```\npython demos/usage-\u003cname\u003e.py\n```\n\n## Tips and Tricks\n\n### Side-by-side or overlapping maps with `Views`\n\nIf you want to show multiple maps side-by-side, you need to specify a `\"view\"` dict (when constructing your map dictionary) or `pdk.View` (which is given to `pdk.Deck`). For example, you would add the following parameter to your `pdk.Deck`:\n```python\nmap_view = pdk.View(\"MapView\", width=\"75%\", height=\"600px\", controller=True)\nr = pdk.Deck(..., views=[map_view])\n```\nor add the following dictionary to your `data` dictionary:\n```python\ndata = {\n    \"layer\": ...,\n    ...,\n    \"views\": [{\"@@type\": \"MapView\", \"width\": \"75%\", \"height\": \"600px\"}],\n}\ndeck_component = dash_deck.DeckGL(data, id=\"deck-gl\")\n```\nSee `demos/usage-views.py` for manually creating a `view` dictionary, and `demos/usage-pdk-views.py` for manually creating a `pdk.View`.\n\n### Use DeckGL `style` for custom styling (width, height, color)\n\nYou can also directly modify `dash_deck.DeckGL`'s style:\n\n```python\ndeck_component = dash_deck.DeckGL(..., style={\"width\": \"50vw\", \"height\": \"50vh\"})\n```\n\nThe `style` prop is useful for directly changing the CSS of Dash Deck. For example, you can also change the `background-color`. See `demos/usage-style-prop.py` for an example.\n\n### Callbacks and events\n\nVarious events are exposed as read-only props, and you can use them as `Input` or `State` to your callbacks. They are disabled by default in order to maximize performance for cases where a lot of data are passed through `setProps`.\n\nTo use them, either set `enableEvents` to `True`, or give a list with the gestures that you want to enable. For example, the two following lines are equivalent:\n```python\ndash_deck.DeckGL(r.to_json(), enableEvents=True)\ndash_deck.DeckGL(r.to_json(), enableEvents=['click', 'hover', 'dragStart', 'dragEnd'])\n```\n\nTwo types of events are available. `Info` is the picking info describing the object being clicked and `Event` is the original gesture event (in JSON). You can read more about [`Info` in the deck.gl developer guide](https://deck.gl/docs/developer-guide/interactivity#the-picking-info-object).\n\nThe following props are available:\n* clickEvent, clickInfo\n* dragStartEvent, dragStartInfo\n* dragEndEvent, dragEndInfo\n* hoverEvent, hoverInfo\n\nFor an example of using events, please see `demos/usage-events.py`.\n\n### Using the tooltip\n\nThe `pydeck` tooltip can be used in Dash Deck. Moreover, rather than passing it to `pdk.Deck`, you will need to pass it to `dash_deck.DeckGL`:\n```python\ndeck_component = dash_deck.DeckGL(\n    r.to_json(), id=\"deck-gl\", tooltip=True\n)\n```\n\nYou can also customize your tooltip:\n```python\ndeck_component = dash_deck.DeckGL(\n    r.to_json(),\n    id=\"deck-gl\",\n    tooltip={\n        \"html\": ...,\n        \"style\": ...\n    }\n)\n```\nTo learn more about tooltips, please check out the [section in the Pydeck docs](https://pydeck.gl/tooltip.html). You will also be able to find some `demos` with custom tooltips.\n\n### Custom Layers\nTo build custom layers, you will need to create a custom version of Dash Deck. To do this you will need:\n1. Clone this project, create a venv, `npm` `install` and `build` (see CONTRIBUTING.md).\n2. Add necessary packages to your `package.json`. E.g. `npm install turf`, if you need a library called turn.\n3. Create a Javascript file inside `dash-deck/src/lib/` that will contain your layer. See [this as an example](https://github.com/ajduberstein/pydeck_custom_layer/blob/master/labeled-geojson-layer.js).\n4. Import the Javascript file in `dash-deck/src/lib/components/DeckGL.react.js`, e.g.:\n```JavaScript\n...\nimport LabeledGeoJsonLayer from \"../labeled-geojson-layer.js\";\n...\n```\n\n5. Add it to the `JSONConfiguration` in the same file:\n```JavaScript\nconst configuration = {\n  classes: Object.assign(\n    {},\n    ...,\n    LabeledGeoJsonLayer\n  ),\n  enumerations: ...\n}\n```\n\n6. `npm build`\n7. Start creating an app that uses `pydeck` or JSON. See `dash-deck/demos/other/usage-custom-layer.py`.\n8. Run the tests (see contributing.md).\n9. When you are ready, create the installable distribution files by running `python setup.py sdist` inside `dash-deck/`.\n\n## Contributing\n\nSee [CONTRIBUTING.md](https://github.com/plotly/dash-deck/blob/master/CONTRIBUTING.md)\n\n## License\n\nDash and Dash Deck are licensed under MIT. Please view [LICENSE](https://github.com/plotly/dash-deck/blob/master/LICENSE) for more details.\n\n## Contact and Support\n\nIf you are interested in supporting the development of this library, check out our [consulting \u0026 training page](https://plotly.com/consulting-and-oem/). For enterprise support and deployment, [contact us](https://plotly.com/contact-us).\n\n## References\n\nThis component lets you visualizes PyDeck and deck/json files\ndirectly in Dash. It also exposes various events (such as click,\nhover and drag) inside callbacks.\n\nKeyword arguments:\n- data (dict | string; optional): Your map using the Deck.gl JSON format. This can be generated by calling\n`pdk.Deck(...).to_json()`. Both a Python dictionary and a JSON-string your map is accepted.\n- id (string; optional): The ID used to identify this component in Dash callbacks.\n- style (dict; optional): Custom CSS for your map. This is useful for changing the height, width, and sometimes the background color.\n- enableEvents (list of strings | boolean; default False): Either a boolean indicating if all event callbacks should be enabled, or a list of strings\nindicating which ones should be used. If it's a list, you will need to specify one of the\nfollowing gestures: `click`, `dragStart`, `dragEnd`, `hover`.\n- tooltip (dict | boolean; default False): This can be a boolean value (e.g. `True`, `False`) to display the default tooltip.\nYou can also give a dictionary specifying an `html` template and custom style using `css`. For more\ninformation about templating, see: https://pydeck.gl/tooltip.html\n- mapboxKey (string; optional): You will need a mapbox token to use deck.gl. Please create a mapbox\nand follow the instructions here: https://docs.mapbox.com/help/how-mapbox-works/access-tokens/\n- disableContext (boolean; default False): This is a boolean value (e.g. `True`, `False`)  indicating whether or not to disable the default context menu\nthat shows up when right clicking on the map. If set to `True`, right clicking to rotate\na map or adjust its pitch will not trigger the default context menu.\n- clickEvent (dict; optional): Read-only prop. To use this, make sure that `enableEvents` is set to `True`, or that `enableEvents` is a list that contains this event type.\nThis prop is updated when an element in the map is clicked. This contains\nthe original gesture event (in JSON).\n- clickInfo (dict; optional): Read-only prop. To use this, make sure that `enableEvents` is set to `True`, or that `enableEvents` is a list that contains this event type.\nThis prop is updated when an element in the map is clicked. This contains\nthe picking info describing the object being clicked.\nComplete description here:\nhttps://deck.gl/docs/developer-guide/interactivity#the-picking-info-object\n- hoverEvent (dict; optional): Read-only prop. To use this, make sure that `enableEvents` is set to `True`, or that `enableEvents` is a list that contains this event type.\nThis prop is updated when an element in the map is hovered. This contains\nthe original gesture event (in JSON).\n- hoverInfo (dict; optional): Read-only prop. To use this, make sure that `enableEvents` is set to `True`, or that `enableEvents` is a list that contains this event type.\nThis prop is updated when an element in the map is hovered. This contains\nthe picking info describing the object being hovered.\nComplete description here:\nhttps://deck.gl/docs/developer-guide/interactivity#the-picking-info-object\n- dragStartEvent (dict; optional): Read-only prop. To use this, make sure that `enableEvents` is set to `True`, or that `enableEvents` is a list that contains this event type.\nTo use this, make sure that `enableEvents` is set to `True`, or that `enableEvents` is a list that contains this event type.\nThis prop is updated when the user starts dragging on the canvas. This contains\nthe original gesture event (in JSON).\n- dragStartInfo (dict; optional): Read-only prop. To use this, make sure that `enableEvents` is set to `True`, or that `enableEvents` is a list that contains this event type.\nThis prop is updated when the user starts dragging on the canvas. This contains\nthe picking info describing the object being dragged.\nComplete description here:\nhttps://deck.gl/docs/developer-guide/interactivity#the-picking-info-object\n- dragEndEvent (dict; optional): Read-only prop. To use this, make sure that `enableEvents` is set to `True`, or that `enableEvents` is a list that contains this event type.\nThis prop is updated when the user releases from dragging the canvas. This contains\nthe original gesture event (in JSON).\n- dragEndInfo (dict; optional): Read-only prop. To use this, make sure that `enableEvents` is set to `True`, or that `enableEvents` is a list that contains this event type.\nThis prop is updated when the user releases from dragging the canvas. This contains\nthe picking info describing the object being dragged.\nComplete description here:\nhttps://deck.gl/docs/developer-guide/interactivity#the-picking-info-object\n\n\n[explorer-demo]: https://dash-gallery.plotly.host/dash-deck-explorer\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplotly%2Fdash-deck","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fplotly%2Fdash-deck","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplotly%2Fdash-deck/lists"}