Skip to main content

dash-loading-components (dlc)

Loading indicators for Plotly Dash, wrapping ten React spinner libraries as one install. 168 components under stable namespaces, with a common factory over the top so you can switch families without relearning each one's props.

Browse them all in the live gallery: https://dash-loading-components.phylatech.com

pip install dash-loading-components

One contract, every component

import dash_loading_components as dlc

dlc.loading_dev.Dual(size=48, color="#f97316", rate=1.5)
dlc.premium.OrbitRings(size=48, color="#f97316", ring_count=4, playing=False)
dlc.ldrs.Ring(size=48, color="#f97316", stroke=5)

Every component takes the same four props with the same meaning:

prop meaning
size pixels (react-loading-indicators takes its own "small" / "medium" / "large" tokens)
color any CSS color
rate relative tempo: 1.0 is this spinner's own tempo, 2.0 twice as fast. Unset keeps the upstream tempo
playing False pauses the animation

Each library's own props are there too, in snake_case, in the library's own units: dlc.loading_dev.Arc(duration=1600, easing="stacked"), dlc.spinners.ClipLoader(speed_multiplier=2). A native tempo or pause prop passed alongside rate or playing wins.

Need a loading overlay? Use Dash's own:

dcc.Loading(children, custom_spinner=dlc.ldrs.Ring(size=48))

Discover what is available at runtime:

dlc.list_libraries()          # ['loading_dev', 'ldrs', 'spinners', ...]
dlc.list_spinners("ldrs")     # ['Ring', 'Helix', 'DotPulse', ...]

Requirements

React ≥19 and Dash ≥4.5, both hard requirements. The loading_dev family needs React 19, and this package will not claim Dash 4.4 / React 18 compatibility.

Dash 4.5 is not on PyPI as a stable release yet, so the dependency is pinned as dash>=4.5.0rc0. That specifier names the pre-release, which is what lets pip resolve it; it will accept the final 4.5 release once published.

Families

Namespace Upstream Components
loading_dev loading-dev 29
premium premium-react-loaders 15
ldrs ldrs 12
spinners react-spinners 12
indicators react-loading-indicators 11
loader_spinner react-loader-spinner 10
spinners_react spinners-react 9
epic react-epic-spinners 8
m3 @alerix/m3-loading-indicator 1
flicker flicker-dot 61

Flip-dot presets

flicker-dot is a player: it animates whatever 7x7 frames it is given. dlc.flicker ships 61 original presets for it, drawn by PhylaTech and MIT licensed with this package, in six sets: Field (the naturalist set: Mycelium, Diatom, Cladogram, Chromatogram, MassSpec, TestTube, Jellyfish, ...), Data (Scatter, Histogram, LineChart, PieChart, Heatmap, Database), Everyday (Cart, Upload, Download, Mail, Wifi, Heart, Lock, ...), Board (flip-dot panel classics), Geometry, and Solids (the five Platonic solids). Each is the player with its frames filled in:

dlc.flicker.Mycelium(size=48, color="#f97316")
dlc.flicker.Helix(size=48, variant="5x5", off_color="#e5e5e5", off_opacity=1)

To play frames of your own, give dlc.flicker.Spinner a list of frames. A frame is 7 strings of 7 characters, # lit and . dark (or upstream's 49 booleans, or 7 lists of 7):

blink = ["...#...", "..###..", ".#####.", "#######", ".#####.", "..###..", "...#..."]
dlc.flicker.Spinner(grids=[blink, [row.replace("#", ".") for row in blink]])

dlc.flicker.PRESETS holds every preset's frames, a starting point for your own. rotate (0, 90, 180 or 270, clockwise) and mirror orient any preset, so dlc.flicker.Cladogram(rotate=90) grows left to right. variant picks the grid: "7x7", its inner "5x5" (bigger dots) or "9x9", the 7x7 padded with a ring of unlit dots (smaller dots at the same size). Lit dots are color at on_opacity (default 1). Unlit dots are off_color (default: color) at off_opacity (default 0.16) rather than upstream's fixed light grey, so one color reads on light and dark pages; off_opacity=0 shows only the lit dots.

Every component is also exported prefixed at the top level (dlc.LoadingDevArc, dlc.LdrsRing) for Dash callbacks that want a flat name.

Version pins, SPDX licenses, upstream URLs and React peers: docs/UPSTREAM-INVENTORY.md. Attribution: NOTICE.

Relative tempo

rate is a rate, not a duration. 1.0 reproduces the tempo the upstream component runs at on its own, and the value is translated per family in the wrappers: a duration in milliseconds for loading-dev, epic and premium, seconds per loop for ldrs, a multiplier for react-spinners, m3 and flicker, a percentage for spinners-react, an offset for react-loading-indicators.

That baseline is per spinner, not per family. loading_dev.Compass is normally 500ms and loading_dev.Slide is 2400ms, so rate=1.0 gives each of them its own tempo and rate=2.0 halves both. react-loader-spinner has no tempo prop, so rate does nothing there.

Compared with dash-loading-spinners

dash-loading-spinners is a focused package built largely around react-spinners-era indicators. dlc is not a rename or a silent re-export of it. The goals differ:

  • A multi-upstream umbrella with stable namespaces, dlc.<family>.<Component>
  • An explicit React 19 / Dash ≥4.5 floor, driven by loading-dev
  • A license inventory and NOTICE covering every wrapped family
  • Room to add families without flattening name collisions

Where the APIs overlap, credit upstream; this is honest coexistence, not a drop-in replacement.

Contributing

Pull requests only, against main. Family wrappers land as focused follow-up PRs, one family or a small batch per PR. Releases are cut by release-please from Conventional Commits merged to main, so commit subjects need a feat: / fix: / chore: prefix.

Local setup:

pixi install           # Python, Node, Dash, the gallery's deps, test tooling
npm install
pixi run build         # JS bundle + generated Python wrappers
pixi run python usage.py   # minimal demo app
pixi run gallery       # the full gallery, http://127.0.0.1:8050/
pixi run test

The deployed gallery runs under gunicorn (gallery:server); pixi run serve does the same locally.

pixi run build-js alone is enough when you have only changed React or CSS under src/.

License

MIT, Copyright (c) 2026 Phyla Technologies. See LICENSE. Wrapped third-party libraries remain under their own licenses, listed in the inventory.

Release files for dash-loading-components 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dash-loading-components 0.1.1
File Size Uploaded
dash_loading_components-0.1.1.tar.gz 381.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dash-loading-components 0.1.1
File Interpreter ABI Platform
dash_loading_components-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 884.9 kB

Release files / dash_loading_components-0.1.1.tar.gz

Download URL dash_loading_components-0.1.1.tar.gz
Size 381.2 kB
Tags Source
SHA-256 checksum
How to use checksums
4afeb17f7b95c1e243145a4446f1025a9d37c0dc496319fe8d9282c15c0db89b
BLAKE2b-256 checksum
How to use checksums
29f93cdeff262bef0c96b99dc548531275fb6b14285a17403c7056ff6470f604
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.

Transparency log

Release files / dash_loading_components-0.1.1-py3-none-any.whl

Download URL dash_loading_components-0.1.1-py3-none-any.whl
Size 503.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7029dc02c2224b7d7c03eb442269f668ce999506c4a073ef7ad7d8f780adaaa4
BLAKE2b-256 checksum
How to use checksums
e0fbe5c8e2af70cddd9c8306047bf04cf48df9634c2f834051a26b05a4ce3ff0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page