Skip to content

Chart Layouts

Layouts save and restore chart configuration. Manage them from the layout dropdown in the bottom bar (create, rename, delete, switch).

Not the same as multichart grid presets.

Saved: indicators, drawings, chart styles (including chart type), pane options.
Not saved: symbol, interval, UI theme, multichart grid.

Custom layouts auto-save on change. The default layout cannot be renamed, deleted, or persisted.

Configuration

typescript
new ChartSpire({
  layoutsEnabled: true,
  layoutLimit: 20,
  layoutUseExternalStorage: false,
  // ...
})
OptionTypeDefaultDescription
layoutsEnabledbooleantrueShow layout selector in bottom bar
layoutLimitnumber20Max custom layouts (default is always available)
layoutUseExternalStoragebooleanfalseUse callbacks instead of localStorage

localStorage quota is ~5MB per domain when not using external storage.

External Storage

Persist layouts to your backend instead of localStorage. Set callbacks before creating the chart:

typescript
import { ChartSpire, setGetStoreCallback, setUpdateStoreCallback, setDeleteStoreCallback } from '@chartspire/ui'

setGetStoreCallback(async () => {
  const res = await fetch('/api/layouts')
  return res.ok ? await res.json() : null
})

setUpdateStoreCallback(async (layoutName, layoutData) => {
  await fetch('/api/layouts', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ [layoutName]: layoutData })
  })
})

setDeleteStoreCallback(async (layoutName) => {
  await fetch('/api/layouts/delete', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ layoutName })
  })
})

new ChartSpire({
  layoutUseExternalStorage: true,
  // ...
})
  • Get: Returns all layouts (Layouts | null), or null if none
  • Update: Upsert one layout by name
  • Delete: Remove one layout by name

Treat LayoutData as an opaque JSON blob — store and return it unchanged. Type callbacks with Layouts and LayoutData from @chartspire/ui.

typescript
import type { Layouts, LayoutData } from '@chartspire/ui'

// Get returns a map: layout name → LayoutData
{
  "Layout1": { /* LayoutData */ },
  "Layout2": { /* LayoutData */ }
}

Each LayoutData holds indicators, styles (including chart type), drawings, and pane options. Drawings are keyed by symbol and restored for the chart’s current symbol.