Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
417 commits
Select commit Hold shift + click to select a range
d97f9bc
Merge branch 'dev' into patch-1
camdecoster Mar 25, 2026
80b1213
Merge branch 'dev' into bugfix/loading-all-wildcard-3619
T4rk1n Mar 26, 2026
ea1af01
Add changelog entry (and fix some markdown)
camdecoster Mar 26, 2026
c1a9cd9
Merge pull request #3523 from corebit-nl/patch-1
camdecoster Mar 26, 2026
8da44c1
fix: use attribute selector for dict id in loading test
i-murray Mar 28, 2026
3fcd2c9
Merge branch 'dev' into bugfix/loading-all-wildcard-3619
i-murray Mar 28, 2026
b18fdfd
put 14 days minimum release age for dependabot
T4rk1n Apr 1, 2026
ee1fb3f
group up dependabot security updates
T4rk1n Apr 1, 2026
7fa111f
only allow safe to update dcc dependabot
T4rk1n Apr 1, 2026
2ee42bb
narrow other dependencies
T4rk1n Apr 1, 2026
7c8c47d
exclude plotly directory
T4rk1n Apr 1, 2026
26c6752
minimum-release-age -> cooldown
T4rk1n Apr 1, 2026
cb12671
fix dcc build
T4rk1n Apr 2, 2026
b97a99f
bump browserlist dash-table
T4rk1n Apr 2, 2026
e97d6d6
npm audit fix
T4rk1n Apr 2, 2026
608aa7b
fix linting
T4rk1n Apr 2, 2026
f0fabb9
fix black
T4rk1n Apr 2, 2026
b494ad3
wait for table after sort
T4rk1n Apr 2, 2026
38ae498
Merge pull request #3709 from plotly/fix/dependabot-too-much
T4rk1n Apr 2, 2026
78f760e
Bump the npm-dependencies-security group across 1 directory with 5 up…
dependabot[bot] Apr 2, 2026
3dc4abb
fix: align slider marks with empty labels
terminalchai Apr 2, 2026
fa21fcb
Merge pull request #3718 from plotly/dependabot/npm_and_yarn/npm-depe…
T4rk1n Apr 2, 2026
fc7fe59
Bump the npm-dependencies-security group across 1 directory with 1 up…
dependabot[bot] Apr 2, 2026
54cd282
Fix #2989: Preserve option order during dcc.Dropdown search
ines-om Mar 22, 2026
57f4125
Fix #2989, #2667: Add search_order prop to control dropdown result or…
ines-om Apr 3, 2026
3a7744f
Merge pull request #3724 from plotly/dependabot/npm_and_yarn/npm-depe…
T4rk1n Apr 6, 2026
286c212
Fix #3030: Selection for DataTable cleared with custom action settings
Francisc0C Mar 17, 2026
b6fcc4a
Add changelog entry
ines-om Apr 6, 2026
519526c
Fix plotly#3030: Apply suggestion from @AnnMarieW
Francisc0C Apr 6, 2026
7a23cf8
Fix plotly#3030: Add changelog entry
Francisc0C Apr 7, 2026
f29d9c5
Merge branch 'dev' into fix-dccDropdown-order
T4rk1n Apr 7, 2026
3d6602f
Merge pull request #3680 from ines-om/fix-dccDropdown-order
T4rk1n Apr 7, 2026
fc48427
Merge branch 'dev' into fix-slider-mark-height
T4rk1n Apr 7, 2026
98ba64e
fix lint
T4rk1n Apr 7, 2026
6931953
Merge branch 'dev' into v4.1-fix-FastAPI-paths
T4rk1n Apr 7, 2026
229539e
set test typing to not run on master
T4rk1n Apr 8, 2026
3c4af8e
Merge pull request #3730 from plotly/disable-typing-test-master
T4rk1n Apr 8, 2026
830271c
Merge branch 'dev' into bugfix/loading-all-wildcard-3619
camdecoster Apr 8, 2026
4fe351e
Merge pull request #3641 from i-murray/bugfix/loading-all-wildcard-3619
T4rk1n Apr 8, 2026
9cdebb0
Merge branch 'dev' into dev
T4rk1n Apr 8, 2026
f5b0aec
docs: add slider mark changelog entry
terminalchai Apr 8, 2026
874afd4
Initialize ai agents documentation
T4rk1n Apr 9, 2026
cd0d46a
Merge branch 'dev' into v4.1-fix-FastAPI-paths
T4rk1n Apr 9, 2026
3427cdb
Merge pull request #3668 from BSd3v/v4.1-fix-FastAPI-paths
T4rk1n Apr 9, 2026
c9e23cc
fix fastapi websocket
T4rk1n Apr 10, 2026
0af47f1
remove leftover prints
T4rk1n Apr 10, 2026
1b0bef9
Update .ai/TESTING.md
T4rk1n Apr 10, 2026
ddaf2f6
trim down AGENTS.md
T4rk1n Apr 10, 2026
cf19476
fix: Add `displayNotifier` to Graph config
camdecoster Apr 10, 2026
982e238
Remove schema/config comparison test
camdecoster Apr 10, 2026
2b1b814
Merge pull request #3737 from plotly/cam/3736/add-displayNotifier-Gra…
camdecoster Apr 10, 2026
3fce1a2
Merge branch 'dev' into fix-slider-mark-height
KoolADE85 Apr 10, 2026
1fbfbac
Merge pull request #3723 from terminalchai/fix-slider-mark-height
KoolADE85 Apr 10, 2026
254a697
Add missing stacklevel=2 to 9 warnings.warn() calls
stef41 Apr 11, 2026
ee6fd6f
Bump axios in the npm-dependencies-security group across 1 directory
dependabot[bot] Apr 11, 2026
21ae4d5
Merge pull request #3739 from plotly/dependabot/npm_and_yarn/npm-depe…
T4rk1n Apr 13, 2026
a3f233a
remove quick reference from claude.md
T4rk1n Apr 13, 2026
a20bf1b
Merge branch 'dev' into claude-init
T4rk1n Apr 13, 2026
62cdcaf
Merge pull request #3734 from plotly/fix/fastapi-websocket
T4rk1n Apr 13, 2026
4f46829
Merge branch 'dev' into dev
T4rk1n Apr 13, 2026
cac28e4
version 4.2.0rc0
T4rk1n Apr 13, 2026
4ff49b5
update changelog
T4rk1n Apr 13, 2026
20834e2
Fix tab key not working in dropdowns in Safari
KoolADE85 Apr 13, 2026
1c586c6
changelog
KoolADE85 Apr 13, 2026
b1e9efe
Merge branch 'dev' into bugfix/dropdown-tabbing-safari
KoolADE85 Apr 13, 2026
9667f61
relocate hidden input to facilitate integration tests
KoolADE85 Apr 13, 2026
bf5a329
Merge pull request #3732 from plotly/claude-init
T4rk1n Apr 14, 2026
9b38d60
Merge branch 'dev' into v4.2
T4rk1n Apr 14, 2026
312c6e3
update ai docs to include backends
T4rk1n Apr 14, 2026
2148fbb
Add websocket callbacks
T4rk1n Apr 14, 2026
ad3693e
websocket flag for individual callbacks
T4rk1n Apr 14, 2026
1a20893
ensure connected for ws callbacks
T4rk1n Apr 14, 2026
aff6dee
websocket origin validation
T4rk1n Apr 14, 2026
a4f10fd
add close method to DashWebsocket
T4rk1n Apr 14, 2026
206c9d8
add websocket hooks
T4rk1n Apr 14, 2026
1c02511
Merge branch 'dev' into dev
AnnMarieW Apr 15, 2026
5746c1e
Update: Merged callback and callback_typed. callback now behaves as c…
Apr 15, 2026
73a62dd
Merge remote-tracking branch 'upstream/dev' into baker/typed-callback
Apr 15, 2026
8ac7fba
Fix callback typing test import path
Apr 15, 2026
73a19e2
Update: Modified tests to work correctly in build environment (includ…
Apr 15, 2026
41f9896
Updated: Added changes to CHANGELOG.md
Apr 15, 2026
03dc9ca
delete circleci config
T4rk1n Apr 15, 2026
725230b
Add all testing jobs to gha testing workflow
T4rk1n Apr 15, 2026
9824b39
add pytest split to ci requirements
T4rk1n Apr 15, 2026
dd2b0ab
upgrade percy requirement
T4rk1n Apr 15, 2026
f135177
add .test_durations
T4rk1n Apr 15, 2026
966073a
nvmrc to version 24
T4rk1n Apr 15, 2026
61a4327
browser change for percy upgrade
T4rk1n Apr 15, 2026
462350f
add percy cli
T4rk1n Apr 15, 2026
4f9d87d
test duration for dcc and table
T4rk1n Apr 15, 2026
c80ac2b
dash table tests fix
T4rk1n Apr 15, 2026
694de4b
trim fix for generate components html
T4rk1n Apr 15, 2026
0fcd2cb
improved grrs001 parameters
T4rk1n Apr 15, 2026
61fec93
format
T4rk1n Apr 15, 2026
f0fc95a
fix test iframe
T4rk1n Apr 15, 2026
b624364
increased benchmarking threshold
T4rk1n Apr 15, 2026
4268c7c
lint fix
T4rk1n Apr 15, 2026
08dc5c0
audit fix
T4rk1n Apr 15, 2026
d85c689
retry get webdriver
T4rk1n Apr 15, 2026
f7ed41c
format
T4rk1n Apr 15, 2026
7bb735b
more stable test
T4rk1n Apr 15, 2026
42ff83a
build
T4rk1n Apr 15, 2026
9bf7971
feat: make CSRF cookie and header names configurable
yosofbadr Apr 15, 2026
0d67d8c
fix: revert formatting changes incompatible with black 22.3.0
yosofbadr Apr 15, 2026
02f834b
chore: retrigger CI
yosofbadr Apr 16, 2026
38ca82e
Merge branch 'dev' into bugfix/dropdown-tabbing-safari
T4rk1n Apr 16, 2026
fed2311
Add websocket inactivity disconnect
T4rk1n Apr 16, 2026
7d01f53
no storing of rendererId in session storage
T4rk1n Apr 16, 2026
b91c5d5
rename allowed_websocket_origins -> websocket_allowed_origins
T4rk1n Apr 16, 2026
bbb91c7
Fix: `test_callback_typing.py` not running on ci
Apr 17, 2026
081281d
Run black formatter and add changelog entry
stef41 Apr 17, 2026
96824a9
update architecture docs with websocket details
T4rk1n Apr 17, 2026
dc9b6e9
Apply suggestions from code review
T4rk1n Apr 17, 2026
029fb8f
Merge pull request #3745 from yosofbadr/feature/configurable-csrf-token
T4rk1n Apr 17, 2026
97f15a9
Merge branch 'dev' into migrate-gha
T4rk1n Apr 17, 2026
6b8eeac
Fix: Formatting issue in `test_callback_typing.py`
Apr 20, 2026
b40611a
Merge branch 'dev' into baker/typed-callback
odorikakeru Apr 20, 2026
32b15b0
Merge pull request #3743 from plotly/migrate-gha
T4rk1n Apr 20, 2026
35f91ca
Merge branch 'dev' into baker/typed-callback
T4rk1n Apr 20, 2026
031290c
Merge branch 'dev' into bugfix/dropdown-tabbing-safari
KoolADE85 Apr 20, 2026
3f5f2cd
Merge pull request #3740 from plotly/bugfix/dropdown-tabbing-safari
KoolADE85 Apr 21, 2026
8168cb3
Make the required percy/dash-table-test "succeed" when dash table tes…
KoolADE85 Apr 21, 2026
1c5b518
Merge pull request #3755 from plotly/ci/skip-percy-table-tests
KoolADE85 Apr 21, 2026
1fc9b24
renderer: relax MATCH wildcard validation when Outputs lack MATCH
bpostlethwaite Apr 21, 2026
931078d
renderer: uniquify callback resolvedId per MATCH trigger
bpostlethwaite Apr 21, 2026
224a4c1
tests(renderer): cover relaxed MATCH semantics and trigger resolvedId
bpostlethwaite Apr 21, 2026
5ed8ded
tests(integration): exercise MATCH Input with fixed/no Output
bpostlethwaite Apr 21, 2026
cef944b
tests(devtools): assert MATCH relaxation and ALLSMALLER strictness
bpostlethwaite Apr 21, 2026
90540e5
docs: changelog entry for #2462 MATCH relaxation
bpostlethwaite Apr 21, 2026
2937293
tests: scope to the two #2462 cases per reviewer feedback
bpostlethwaite Apr 21, 2026
0e0774f
style: run black and prettier on the new #2462 tests
bpostlethwaite Apr 21, 2026
c0346fe
Merge branch 'dev' into fix/add-missing-stacklevel-to-warnings
T4rk1n Apr 21, 2026
adad025
Merge pull request #3756 from plotly/fix-2462-match-semantics
T4rk1n Apr 22, 2026
fe52f2c
Merge branch 'dev' into dev
T4rk1n Apr 23, 2026
d17c0f2
skip percy on forks
T4rk1n Apr 23, 2026
0caed70
Merge pull request #3757 from plotly/fix/percy-forks
T4rk1n Apr 23, 2026
744d86d
Merge branch 'dev' into dev
T4rk1n Apr 23, 2026
96969d1
Merge pull request #3669 from Francisc0C/dev
T4rk1n Apr 23, 2026
c5c0b9b
T4rk1n Apr 23, 2026
290ba68
Merge branch 'v4.2' into websocket-callbacks
T4rk1n Apr 23, 2026
3a14ef3
add websocket callback validation and tests
T4rk1n Apr 23, 2026
2ba5557
fixes
T4rk1n Apr 23, 2026
104a71d
add quart websocket callback implementation
T4rk1n Apr 24, 2026
2070708
fix tests
T4rk1n Apr 24, 2026
750a585
remove dev bundle reference
T4rk1n Apr 24, 2026
deda670
version 4.2.0rc1
T4rk1n Apr 24, 2026
e4849eb
Fix websocket callback set_props() with Patch object problems
CNFeffery Apr 26, 2026
70cbf48
Add websocket callback set_props patch tests
CNFeffery Apr 26, 2026
68a696a
Update CHANGELOG
CNFeffery Apr 26, 2026
65f3dc2
Format code
CNFeffery Apr 26, 2026
6460335
Fix websocket callback update component prop via set_props()
CNFeffery Apr 26, 2026
4b19d9a
Add websocket callback update component prop tests
CNFeffery Apr 26, 2026
411b467
Add websocket callback update component prop tests
CNFeffery Apr 26, 2026
1abd7bf
Update CHANGELOG
CNFeffery Apr 27, 2026
96af07d
Enhance websocket set_props with plotly JSON for full prop type compa…
CNFeffery Apr 28, 2026
649eadb
Fix format
CNFeffery Apr 28, 2026
c7b3f74
Optimize websocket set_props by centralizing serialization with _send…
CNFeffery Apr 28, 2026
8f525be
fix percy action working directory
T4rk1n Apr 28, 2026
e9f175a
build
T4rk1n Apr 28, 2026
0d85cad
Merge pull request #3761 from plotly/fix/html-percy-cmd
T4rk1n Apr 28, 2026
a8fbd57
Merge pull request #3759 from CNFeffery/websocket-callbacks
T4rk1n Apr 30, 2026
d2616a5
Merge branch 'dev' into v4.2
T4rk1n Apr 30, 2026
fe5489d
Merge branch 'v4.2' into websocket-callbacks
T4rk1n Apr 30, 2026
8b86163
threadpool for ws callback execution
T4rk1n May 1, 2026
727626d
move websocket code out of base_server
T4rk1n May 1, 2026
86e3263
add future annotations
T4rk1n May 1, 2026
e4703ea
rejects all pending callbacks when a DISCONNECTED message is received
T4rk1n May 1, 2026
379e847
reset retryCount on connection
T4rk1n May 1, 2026
bf7e97f
Version 4.2.0rc2
T4rk1n May 1, 2026
c35e6ad
better handling of disconnect for persistent callbacks
T4rk1n May 4, 2026
ceaea5b
silence websocket disconnected
T4rk1n May 4, 2026
6a72fe9
reset retry count onn connection
T4rk1n May 5, 2026
5825c2d
fastapi requirement uvicorn[standard]
T4rk1n May 5, 2026
af730a8
Merge pull request #3742 from plotly/websocket-callbacks
T4rk1n May 6, 2026
d2b77b0
format
T4rk1n May 6, 2026
f62492e
Merge branch 'dev' into fix/add-missing-stacklevel-to-warnings
T4rk1n May 6, 2026
ea152fe
post-test-status in workflow dispatch
T4rk1n May 6, 2026
334ce0a
fix test report for forks
T4rk1n May 6, 2026
a81f4e8
Merge pull request #3738 from stef41/fix/add-missing-stacklevel-to-wa…
T4rk1n May 7, 2026
6ae9c1d
Merge branch 'dev' into baker/typed-callback
T4rk1n May 7, 2026
7cf8939
optimize dropdown search
AnnMarieW May 7, 2026
99a1a2a
added changelog
AnnMarieW May 7, 2026
2d24fb8
Merge branch 'dev' into improve-dropdown-performance
AnnMarieW May 7, 2026
7ba747a
fix infinite loading with persitent keyword on callbacks
T4rk1n May 8, 2026
2bdb5da
fix initial no output callbacks
T4rk1n May 8, 2026
9c76a17
support no output/no inputs callbacks
T4rk1n May 8, 2026
b1a6f0f
adapt test for new behavior
T4rk1n May 11, 2026
512e119
rename ctx.get_websocket to ctx.websocket
T4rk1n May 11, 2026
995cb1d
reduce initial special callbacks
T4rk1n May 12, 2026
4b2b1a8
merge dev
T4rk1n May 12, 2026
ff8c91c
Merge branch 'v4.2' into persistent-callbacks
T4rk1n May 12, 2026
78cf94a
improved callback id logic for no input/output
T4rk1n May 12, 2026
f1b6306
Merge pull request #3771 from plotly/persistent-callbacks
T4rk1n May 12, 2026
64056cf
Version 4.2.0rc3
T4rk1n May 12, 2026
5b2088c
remove test apps
T4rk1n May 12, 2026
2117781
Merge pull request #3780 from plotly/v4.2
T4rk1n May 12, 2026
2453ce5
Bump ip-address
dependabot[bot] May 12, 2026
41a1346
Merge branch 'dev' into baker/typed-callback
T4rk1n May 13, 2026
9291c79
fix lint
T4rk1n May 13, 2026
8ade05e
Merge pull request #3746 from odorikakeru/baker/typed-callback
T4rk1n May 13, 2026
d7161b7
batch/debounce websocket set_props
T4rk1n May 13, 2026
3ecc049
fix batched heartbeat ack disconnecting
T4rk1n May 13, 2026
5b03787
fix graph patch & duplicate clicks
T4rk1n May 15, 2026
f51dc63
set arb008 flaky
T4rk1n May 15, 2026
fe8f781
sync relayout shapes
T4rk1n May 15, 2026
7bfdc35
fix styling issues caused by ResizeDetector wrapper
AnnMarieW May 19, 2026
773b60a
changelog
AnnMarieW May 19, 2026
4538d66
address review comments
T4rk1n May 19, 2026
ea71862
Update components/dash-core-components/src/fragments/Graph.react.js
T4rk1n May 19, 2026
c357990
update changelog
T4rk1n May 19, 2026
fe470f1
Merge branch 'dev' into improve-dropdown-performance
AnnMarieW May 20, 2026
bb2d0f0
Merge pull request #3783 from plotly/batch-ws-set-props
T4rk1n May 21, 2026
7afaac8
Bump serialize-javascript and terser-webpack-plugin
dependabot[bot] May 22, 2026
24f846a
Merge branch 'dev' into fix-datepickers-resize-detector
T4rk1n May 25, 2026
8223dab
Merge pull request #3789 from AnnMarieW/fix-datepickers-resize-detector
T4rk1n May 25, 2026
42f131d
Merge branch 'dev' into dependabot/npm_and_yarn/plotly/dash-component…
T4rk1n May 25, 2026
ce6d0f0
Merge pull request #3794 from plotly/dependabot/npm_and_yarn/plotly/d…
T4rk1n May 26, 2026
c265424
improved websocket connection management
T4rk1n May 26, 2026
21278e0
update changelog
T4rk1n May 26, 2026
6f6442f
lint fix
T4rk1n May 26, 2026
2f42201
fix lint
T4rk1n May 27, 2026
f02a947
fix blueprint registering and double init
T4rk1n May 27, 2026
bb900e3
Merge branch 'dev' into improve-dropdown-performance
camdecoster May 27, 2026
c0da665
update after review
AnnMarieW May 28, 2026
8ea40cb
Merge branch 'dev' into fix/graph-patch-clicks
T4rk1n May 28, 2026
cfac954
update changelog
T4rk1n May 28, 2026
7ecedb9
deep clone dcc graph figure layout
T4rk1n May 28, 2026
b5ce179
Merge pull request #3768 from AnnMarieW/improve-dropdown-performance
camdecoster May 28, 2026
776c6e1
Merge branch 'dev' into fix/graph-patch-clicks
T4rk1n May 28, 2026
051b423
Merge pull request #3785 from plotly/fix/graph-patch-clicks
T4rk1n May 28, 2026
16c369f
Merge branch 'dev' into dependabot/npm_and_yarn/npm-dependencies-secu…
camdecoster May 28, 2026
2b0a7d1
fix: use stable keys for virtualized dropdown rows
AnnMarieW May 28, 2026
3892cd4
remove ActiveCallbackRegistry & callback adoption
T4rk1n May 28, 2026
c07643c
Merge branch 'dev' into fix/ws-connection-management
T4rk1n May 28, 2026
be60884
add test
AnnMarieW May 28, 2026
01b57fb
add changelog
AnnMarieW May 29, 2026
3988d1c
lint
AnnMarieW May 29, 2026
ffe259c
Merge pull request #3763 from plotly/dependabot/npm_and_yarn/npm-depe…
camdecoster May 29, 2026
d32715c
Merge branch 'dev' into fix-dropdown-search-crash
AnnMarieW May 29, 2026
3ef77c5
Merge pull request #3799 from AnnMarieW/fix-dropdown-search-crash
camdecoster May 29, 2026
81f148f
init app check instead of backend blueprint check
T4rk1n May 29, 2026
8cdf6fc
Merge branch 'dev' into fix/init-flask-run-command
T4rk1n May 29, 2026
715dae8
Merge pull request #3798 from plotly/fix/init-flask-run-command
T4rk1n May 29, 2026
e15ef05
Merge branch 'dev' into fix/ws-connection-management
T4rk1n May 29, 2026
8c2329f
add configuration for heartbeat and proper te\sts for reconnect
T4rk1n Jun 1, 2026
c41939b
Merge pull request #3797 from plotly/fix/ws-connection-management
T4rk1n Jun 1, 2026
6c3fdab
Version 4.2.0
T4rk1n Jun 1, 2026
d0f78b6
Merge pull request #3803 from plotly/version-4.2.0
T4rk1n Jun 1, 2026
ed2363d
Merge branch 'dev' into master-4.2.0
T4rk1n Jun 1, 2026
3b483d1
build artifacts for 4.2.0
T4rk1n Jun 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,102 changes: 1,102 additions & 0 deletions .ai/ARCHITECTURE.md

Large diffs are not rendered by default.

94 changes: 94 additions & 0 deletions .ai/COMMANDS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# Commands

## Initial Setup

```bash
# Create and activate virtual environment
python3 -m venv venv
source venv/bin/activate # Windows: source venv/scripts/activate

# Install Python dependencies
pip install -e .[ci,dev,testing,celery,diskcache]

# Install Node dependencies
npm ci
```

### Optional Backend Dependencies

```bash
# For Quart backend (ASGI async)
pip install dash[quart]

# For FastAPI backend (ASGI async)
pip install dash[fastapi]

# For async callbacks with Flask
pip install dash[async]
```

## Building

```bash
# Full build (Linux/Mac)
npm run build

# Full build (Windows - use Bash terminal, not PowerShell/CMD)
npm run first-build

# Build single component after changes
dash-update-components "dash-core-components" # or dash-html-components, dash-table

# Build renderer only
cd dash/dash-renderer && renderer build
```

## Testing

Tests use pytest with Selenium/ChromeDriver. ChromeDriver must match your Chrome version. See [TESTING.md](TESTING.md) for fixtures, patterns, and detailed documentation.

```bash
# Run all tests
npm run test

# Unit tests only
pytest tests/unit

# Integration tests (requires ChromeDriver)
pytest tests/integration

# Run specific test by name
pytest -k test_name

# Run tests matching pattern
pytest -k cbcx # runs all tests with "cbcx" in name

# Renderer unit tests (Jest)
cd dash/dash-renderer && npm run test

# Setup test components before running integration tests
npm run setup-tests.py
```

## Linting

Linting runs automatically on commit via husky pre-commit hook and lint-staged (`.lintstagedrc.js`). You typically don't need to run these manually.

**Pre-commit runs on staged files:**
- Python (`dash/`, `tests/`): pylint, flake8, black --check
- JavaScript/TypeScript: eslint, prettier --check (per component package)

**Manual commands** (if needed):

```bash
# Run all linters
npm run lint

# Individual linters
npm run private::lint.black # Check Black formatting
npm run private::lint.flake8 # Flake8
npm run private::lint.pylint-dash # Pylint on dash/

# Auto-format Python with Black
npm run private::format.black
```
182 changes: 182 additions & 0 deletions .ai/COMPONENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
# Component System

The component system bridges React components to Python with auto-generated wrappers.

## Generation Pipeline

```
React/TypeScript Source
extract-meta.js (Node.js)
├── react-docgen (for .js/.jsx - parses PropTypes)
└── TypeScript Compiler API (for .tsx - parses type definitions)
metadata.json
dash-generate-components (Python CLI)
Python component classes (+ R/Julia if requested)
```

### Key Files

- **`dash/extract-meta.js`** - Node.js script that extracts component metadata. For JavaScript components, uses `react-docgen` to parse PropTypes. For TypeScript components, uses the TypeScript Compiler API to parse type definitions and convert them to metadata format.

- **`dash/development/component_generator.py`** - CLI entry point (`dash-generate-components`). Orchestrates metadata extraction and code generation.

- **`dash/development/_py_components_generation.py`** - Generates Python class files from metadata. Creates typed `__init__` methods, docstrings, and prop validation.

- **`dash/development/_py_prop_typing.py`** - Maps JavaScript/TypeScript types to Python types (e.g., `arrayOf` → `typing.Sequence`, `shape` → `TypedDict`).

- **`dash/development/_generate_prop_types.py`** - For TypeScript components, generates a `proptypes.js` file since TSX doesn't have runtime PropTypes.

## Component JSON Structure

Components serialize to `{type, namespace, props}` via `to_plotly_json()` in `base_component.py`:

```python
# Python component
html.Div(id='my-div', children='Hello')

# Serializes to JSON
{
"type": "Div",
"namespace": "dash_html_components",
"props": {
"id": "my-div",
"children": "Hello"
}
}
```

This JSON is sent to the frontend via `/_dash-layout` (initial load) and `/_dash-update-component` (callback responses).

## Frontend Component Resolution

Components must be available on the frontend at `window[namespace][type]`:

```javascript
// Component packages register themselves
window.dash_html_components = {
Div: DivComponent,
Span: SpanComponent,
// ...
};

window.dash_core_components = {
Dropdown: DropdownComponent,
Graph: GraphComponent,
// ...
};
```

The renderer resolves components via `registry.js`:

```javascript
resolve: (component) => {
const {type, namespace} = component;
return window[namespace][type]; // Returns React component class
}
```

## Package Structure

### `_imports_.py`

Auto-generated by `generate_imports()` in `_py_components_generation.py`:

```python
from .Dropdown import Dropdown
from .Graph import Graph
from .Input import Input
# ... one import per component

__all__ = [
"Dropdown",
"Graph",
"Input",
# ...
]
```

### `__init__.py`

Manually maintained, imports from `_imports_.py`:

```python
from ._imports_ import * # Re-exports all components
from ._imports_ import __all__ as _components

# Read version from package-info.json
with open(os.path.join(_basepath, "package-info.json")) as f:
package = json.load(f)
__version__ = package["version"]

# Define JavaScript assets to serve
_js_dist = [
{
"relative_package_path": "dash_core_components.js",
"namespace": "dash",
},
# async chunks, source maps, proptypes.js for dev, etc.
]

# Attach _js_dist to each component class
for _component in _components:
setattr(locals()[_component], "_js_dist", _js_dist)
```

## Resource System (`_js_dist` / `_css_dist`)

**`dash/resources.py`** manages JavaScript and CSS asset loading for components.

### Resource Entry Structure

```python
{
"relative_package_path": "dcc/dash_core_components.js", # Path within package
"external_url": "https://unpkg.com/...", # CDN fallback
"namespace": "dash", # JS namespace
"async": True | "eager" | "lazy", # Async loading mode
"dynamic": True, # Loaded on demand (source maps)
"dev_package_path": "dcc/proptypes.js", # Dev-only path
"dev_only": True, # Only in dev mode
}
```

### Resource Loading Flow

1. Each component class has `_js_dist` (and optionally `_css_dist`) attribute set in `__init__.py`
2. When component is imported, `ComponentMeta` registers module in `ComponentRegistry.registry`
3. `ComponentRegistry.get_resources("_js_dist")` iterates registered modules, collects all `_js_dist` lists
4. `Scripts` / `Css` classes in `resources.py` filter resources based on config:
- `serve_locally=True`: Use `relative_package_path`, serve via `/_dash-component-suites/`
- `serve_locally=False`: Use `external_url` (CDN)
- `eager_loading=True`: Load async resources immediately
- `dev_bundles=True`: Include `dev_package_path` resources

### Async Loading Modes

- `async: True` - Dynamic unless `eager_loading` is enabled
- `async: "lazy"` - Always loaded dynamically (on-demand)
- `async: "eager"` - Loaded dynamically only if server isn't in eager mode

## Creating New Components

1. Write React component with PropTypes (JS) or TypeScript props interface (TSX)
2. Run `dash-generate-components src/lib/components -p package_name`
3. Generated Python wrapper goes to `package_name/ComponentName.py`
4. `_imports_.py` is auto-generated with imports for all components
5. For TSX, `proptypes.js` is also generated for runtime prop validation
6. Bundle with webpack, register on `window[namespace]`
7. Update `__init__.py` to set `_js_dist` on components

## Built-in Component Packages

Managed as a Lerna monorepo in `components/`:

- **`components/dash-core-components/`** - Interactive components (Dropdown, Slider, Graph, Input, etc.)
- **`components/dash-html-components/`** - HTML element wrappers (Div, Span, H1, etc.)
- **`components/dash-table/`** - DataTable component (deprecated in favor of dash-ag-grid)

Use `dash-update-components "component-name"` to rebuild after changes.
48 changes: 48 additions & 0 deletions .ai/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Dash AI Agent Guide

This directory contains documentation for AI coding assistants working with the Dash codebase.

## Quick Links

- [Commands](./COMMANDS.md) - Build, test, and lint commands
- [Architecture](./ARCHITECTURE.md) - Backend, callbacks, pages, assets, errors, background callbacks, Jupyter, config, stores, async, security
- [Renderer](./RENDERER.md) - Frontend, crawlLayout, Redux store, clientside API, component API
- [Components](./COMPONENTS.md) - Component generation, package structure, resource system
- [Testing](./TESTING.md) - Testing framework, fixtures, patterns, type compliance
- [Troubleshooting](./TROUBLESHOOTING.md) - Common errors and solutions

## Project Overview

Dash is a Python framework for building reactive web-based data visualization applications. Built on Plotly.js, React, and Flask, it ties UI elements (dropdowns, sliders, graphs) directly to analytical Python code.

## Key Directories

```
dash/
├── dash/ # Main Python package
│ ├── dash.py # Core Dash app class
│ ├── _callback.py # Callback registration/execution
│ ├── dependencies.py # Input/Output/State classes
│ ├── _pages.py # Multi-page app support
│ ├── development/ # Component generation tools
│ ├── dash-renderer/ # TypeScript/React frontend
│ └── dcc/, html/, dash_table/ # Built-in components
├── components/ # Component source packages (Lerna monorepo)
│ ├── dash-core-components/
│ ├── dash-html-components/
│ └── dash-table/
├── tests/
│ ├── unit/ # pytest unit tests
│ ├── integration/ # Selenium browser tests
│ ├── compliance/ # Type checking (pyright/mypy)
│ └── background_callback/ # Background callback tests
└── requirements/ # Modular dependency files
```

## Code Review Conventions

Emoji used in reviews:
- `:dancer:` - Can merge
- `:tiger2:` - Needs more tests
- `:snake:` - Security concern
- `:pill:` - Performance issue
Loading
Loading