Dojo NG Cycle theme theme: light Demos: Interop matrix Records manager

Form controls

Button

Shows the three button kinds, the disabled state, and the busy state that action-button adds on top of button.

Contained Outlined Text Disabled Action

Form controls + native form participation

A full form built from every text-like and choice control, wired to native submit and reset.

Subscribe to the newsletter Free Pro Enterprise Enable beta features
Submit Reset

Select / typeahead family

The same fruit list drives four pick-one-or-many patterns: select, typeahead, and two chip-typeahead modes.

Sliders

A single-value slider next to a two-handle range slider with a live output readout.

Color picker

A swatch-driven color picker with alpha, reporting the picked value as hex.

value: (none)

File input

Accepts a paste from the clipboard in addition to the normal file picker, and reports every accepted file.

Tab to the drop zone (it shows a focus ring), then paste an image from the clipboard. A paste anywhere in this pane is forwarded to the control via addFiles. files: (none)

Date & time

Four small, independent controls grouped by size rather than by any shared behavior: date input, time picker, checkbox group, and rating.

Validation-state styling hook

One field shows how validity state reaches page CSS through plain data attributes, with no shadow DOM piercing.

Form controls mirror their validity onto the host as data-dj-* attributes. This field starts unstyled; blur it while empty to turn it invalid-styled, then type to fix it — no shadow piercing, just page CSS on [data-dj-user-invalid]/[data-dj-user-valid].

Copy button

Copies from an element and from a plain value, and shows the icon's copy, check, and error states.

Copies to the clipboard (needs a secure context — https or localhost). The icon flashes copy → check → error and the accessible name changes with it. On plain http it shows the error state.

npm install @dojo-ng/button copy from a value: (no copy yet)

Overlays

Trigger popup & context popup

Click opens a trigger-popup menu; right-click opens a context-popup at the cursor.

Open menu
Popup content anchored to the trigger.
Right-click me
Context menu at the cursor.
+

Context menu, confirm popup, speed dial, snackbar

Four short interactions grouped for space, not for any shared behavior: context menu, delete confirmation, snackbar, and speed dial.

Right-click for menu Delete… Are you sure? Show snackbar A B
Saved successfully.

Overlays: dialog, slide pane, tooltip

A modal dialog, a slide-in panel, and a hover tooltip: the three ways this library covers content over the page.

Open dialog Open slide pane Hover for tooltip A tooltip on hover or focus.
Confirm

This is a modal dialog. Escape, the close button, or a button below dismisses it.

Cancel OK
Details

A panel that slides in from the right. Escape, the close button, or the underlay closes it.

Layout

Title pane

A single collapsible panel toggled by its own title bar.

Collapsible content. Click the title to toggle.

Split panel

A nested split panel, horizontal outer and vertical inner, driven by drag or by the keyboard.

Drag the divider, or focus it and use the arrow keys (Shift for a larger step, Home/End for the extremes). Min pane sizes are the --dj-split-panel-min-* tokens. Switch the Locale to ar-EG to check RTL (drag and ArrowLeft/Right mirror). The right pane nests a vertical split.

position 30%
Sidebar
Editor
Terminal

Navigation

Wizard

A three-step wizard opened on its middle step, to check step navigation from a non-zero start.

Tabs

Three tabs with plain panel content, driven by the array-typed tabs property.

First panel content.
Second panel content.
Third panel content.

Tree (folders + MIME structure)

Two trees, one of folders and one of MIME types, both driven by the roving-tabindex keyboard pattern and checked against RTL mirroring.

Icons + unread counts, controlled expanded, and the APG roving-tabindex keyboard: click a row to focus it, then arrows move focus (Right/Left expand/collapse or step in/out), Home/End jump, Enter selects. Switch the Locale to ar-EG to check RTL (indentation and chevrons flip).

selected: inbox expanded: archive

Toolbar

A toolbar with overflowed actions, reporting which overflow action was chosen.

Back Records Filter New overflow action: (none)

Data display

Icon

Compares a registered glyph against an inline slotted SVG at three sizes, plus one glyph registered without a viewBox to show the failure mode.

With icon

A registered glyph (type=) and an inline slotted <svg> must render identically at every size — in each group the left star is from the registry, the right one is slotted. The last group registers a glyph with NO viewBox: it gets a correctly-sized box but its artwork does not scale, and registering it logged one console warning (open the console to see it).

small
medium
large
no viewBox (clipped)

Display: avatar, card, header card, chip, result

Card and header card compose avatar, chip, and result rather than each one standing alone.

BS NG Default Checked Removable

Card body content.

Action
HC

Body content.

List

A selectable list with a divider and a disabled item, reporting the current selection below it.

selected: (none)

Calendar

A calendar with a preset date, reporting the selected date on change.

selected: 2026-06-15

Badge

Every badge variant next to a real use: a count badge riding inside a button's accessible name.

Presentational status/count labels. The count on the button carries its meaning via the button's aria-label, not the badge. Check light/dark and forced-colors (high-contrast) rendering.

Neutral Info Success Warning Danger 3 Inbox 4

Charts

Charts

Nine chart configurations share one dataset, from a plain line chart to a dual-axis combo with brushing.

hover a category…

Three chart-level toggles at once, on one small series with two deliberate holes (Wed, Sat) so missing's three modes are directly comparable on the same data.

y-scale: linear missing: gap point-labels: off

Sparklines

The same five metrics as tiny inline charts with no axes or legend, the minimal end of the chart range.

A tiny inline chart with no axes/legend/tooltip — a KPI row, since that's the point. The last row's aria-label is locale-aware; switch the Locale above to check it (and RTL layout in ar-EG).

Metric Trend Value
Revenue (line + marker)
Traffic (area)
Signups (bar)
Churn (custom color)
Latency (labeled, localized)

Streaming

Pushes a new point to a chart and a sparkline twice a second; both batch multiple pushes into one update per animation frame.

appendData() on the chart and push() on the sparkline batch multiple calls within one animation frame into a single update. max-points="20" slides the window as new points arrive, and the chart's bar/enter transitions are skipped for streamed updates.

Start stopped

Canvas escape hatch

The same 2,000-point line chart rendered as SVG and as canvas, to show when the canvas escape hatch is worth reaching for.

renderer="canvas" draws series marks on a <canvas> instead of SVG nodes — reach for it once a series runs into the thousands of points, not as a default. Each line here has 2,000 points. Toggle to feel the difference; axes, grid, tooltip, and the legend stay SVG/DOM either way — click a legend item below to hide/show a series and watch the canvas redraw. The real ceiling today is the x-axis, not the marks: dj-chart renders one tick label and one hit-band per UNIQUE category with no thinning, so canvas doesn't rescue a chart with tens of thousands of unique x categories even though the marks themselves would be fine at that size.

renderer: svg

Feedback

Loading indicator + a working action

Runs a real 1.5-second async action so the loading indicator's busy state is not just a static screenshot.

Simulate load

Progress & pagination

A determinate progress bar next to pagination, unrelated except that both report a number back to the page.

Skeleton (loading placeholder)

A loading skeleton that swaps for real content on demand and respects reduced motion.

Sheen sweeps while loading; OS reduce-motion stills it. Toggle to swap in real content. Sizes/shape come from host CSS.

Swap in content

Alert

Four alert severities plus a dynamically inserted one, to check that a late-added alert is still announced.

Inline status banners. Info/success use role="status", warning/danger role="alert". The last one is closable; the success one uses a custom icon. Click "Insert danger alert" to test that a dynamically-added alert is announced.

Heads up — a new version is available. Your changes were saved. Your trial ends in 3 days. Payment failed. Update your card.
Insert danger alert

Animation

Animation: transition & transition-group

A single panel fades in and out, and a list reveals its items one at a time with a stagger.

Toggle panel
A panel that fades on toggle, and stays mounted through its leave.
Reveal list (stagger 80ms)
  • First
  • Second
  • Third
  • Framework seams

    Submitted form data

    Reads the form above back from a plain FormData submit, not from a change listener on each control.

    (submit the form to see its FormData)

    Shared state (external store + context)

    Two counter views share one Zustand store provided through context, so clicking either updates both.

    two views, one store — click either

    Scoped theme island (always dark)

    A <dj-theme> island forced to dark, to check that theming scopes to a subtree rather than only the document root.

    Inside dark island

    More demos

    Runnable pages that don't fit the section-per-component shape above: feature-specific demos and full demo apps closer to something real.

    • Kanban board: controlled drag moves, full keyboard operation, and live-region announcements for each move.
    • Data grid: 1,000 rows virtualized with TanStack Table and TanStack Virtual.
    • Data grid plugins: formats, filtering, pagination, and export in one grid; a second grid demonstrates controlled inline editing.
    • Data grid, print layout: a 200-row grid formatted for printing.
    • Financial chart: 500 trading days of OHLC and volume, candlestick + volume + a 20-period SMA drawn entirely by @dojo-ng/chart-financial plugins, with style/log-scale toggles and the brush wired through to all three.
    • Media components: dj-audio wraps the native audio element, and dj-video wraps video.js in light DOM.
    • Rich-text plugins: the default plugin set, plus headings, lists, and a custom strikethrough plugin built against the same plugin API.
    • Rich text, print layout: a long document formatted for printing.
    • Framework interop matrix: the same member-signup card running unchanged across four hosts: plain HTML, the Dojo NG framework renderer, React, and Vue.
    • Records manager: a full CRUD app over 500 members, with sort, filtering, pagination, validated add/edit, and delete confirmation.
    69 of 112 shipped packages have a demo on this page (43 do not)
    • audio
    • board
    • chart-financial
    • data-grid
    • data-grid-cell-components
    • data-grid-detail
    • data-grid-edit
    • data-grid-export
    • data-grid-filter
    • data-grid-formats
    • data-grid-groups
    • data-grid-pagination
    • data-grid-rowstate
    • data-grid-select
    • data-grid-tree
    • dnd
    • dojo-element
    • form
    • global-event
    • header
    • helper-text
    • i18n
    • label
    • rich-text
    • rich-text-autolink
    • rich-text-color
    • rich-text-criticmarkup
    • rich-text-embed
    • rich-text-emoji
    • rich-text-headings
    • rich-text-image
    • rich-text-links
    • rich-text-lists
    • rich-text-markdown
    • rich-text-mentions
    • rich-text-menu
    • rich-text-slash
    • rich-text-table
    • stack
    • text
    • three-column-layout
    • two-column-layout
    • video