OptionalautoAutofocus on load. If loading multiple workbooks or using an a secondary component this should be set to false.
OptionalcssAlso apply the MUI CssBaseline when theming.
OptionaleditableThe shared cell editor. Supply a stable SheetEditable to drive the grid and formula bar through one instance (free two-way sync); omit to let the studio auto-create one.
OptionalformulaWhere the formula bar sits: above the grid, or below it directly above the status bar, the way a phone spreadsheet lays it out.
OptionallicenseSet the license key via a property
OptionallogoCustom logo.
OptionalmanageWhether the studio sizes itself to the visual viewport while the formula bar is at the bottom, so the bar stays above the virtual keyboard.
iOS Safari does not shrink the page for the keyboard; it scrolls the focused field into view instead. The studio undoes that: it takes the visual viewport's height, pins itself to the visual viewport's offset and scrolls the page back to the top after each keyboard change. A host page that already manages the keyboard turns this off. Ignored while the bar is at the top.
OptionalmuiMUI theme customization (ThemeOptions) merged into Studio's built-in light and dark themes — shared
config (e.g. typography) plus per-mode overrides via MUI's native colorSchemes: { light, dark }
(the modern replacement for the former lightTheme/darkTheme props):
muiTheme={{
typography: { fontFamily: '…' }, // both modes
colorSchemes: {
light: { palette: { primary: { main: '#6d28d9' } } }, // light only
dark: { palette: { primary: { main: '#a78bfa' } } }, // dark only
},
}}
This is config, not state. Light/dark mode and the dark-grid/dark-image toggles are self-managed by
Studio as persisted preferences (see @sheetxl/react!ThemeStateKey), driven by the surrounding
PersistentStateProvider — not by props. A wrapping TokenThemeProvider layers token overrides on top.
OptionalonCalled when the workbook's unsaved-changes (dirty) state changes.
true when there are unsaved changes since the last save (or the workbook was
created), false when saved or undone back to the saved state.
OptionalonCalled if the document (a promise / read options) fails to resolve.
The error
OptionalonCalled when the studio's live workbook changes — e.g. when a workbook is opened (replacing the
current one) via the Studio's own file commands or drag-and-drop, or on unmount (null).
The current workbook (carrying its origin + display name), or null.
The Studio owns Open/replace internally, so a host that manages window-level chrome (tab title,
beforeunload, see @sheetxl/studio-mui!useStudioApp) must observe this workbook rather
than the one it resolved initially — otherwise the title/dirty guard stay bound to the first
workbook after an in-app open. Pair with StudioProps.onDirtyChange for the unsaved flag.
OptionalonCallback for when the workbook grid first renders. Useful for hiding/showing loading panels.
OptionalprefetchWhich features to load ahead of use, once the studio is showing.
none - load each feature when it is first used.common - features used in most sessions.all - every feature.OptionalpropsCustomizations for the default error panel shown when the StudioProps.document fails to resolve. Use StudioProps.renderDocumentError to replace the panel entirely.
OptionalpropsCustomizations for the default loading panel shown while the StudioProps.document resolves (and the grid first paints). Use StudioProps.renderDocumentLoading to replace it entirely.
OptionalpropsAdditional document-title (title bar) properties.
OptionalpropsCustomizations for the formula bar.
OptionalpropsCustomizations for the status bar.
OptionalpropsAllow for customizations on TaskPaneArea.
OptionalpropsCustomizations for the toolbar.
OptionalpropsCustomizations forwarded to the underlying (chromeless) workbook grid.
The studio composes its chrome (toolbar / formula bar / status bar / menus) around the grid
and forwards these to it. Grid-level concerns (sheet, tabs, context menus, scrollbars, etc.)
live here rather than flat on StudioProps — the same containment pattern
WorkbookElementProps uses for propsSheet.
OptionalrenderReplace the error panel shown when the StudioProps.document fails to resolve (or cannot be rendered).
The failure is also reported programmatically via StudioProps.onDocumentError.
OptionalrenderReplace the loading panel shown while the StudioProps.document resolves / the grid paints.
OptionalrenderRender a custom formula bar (replaces the default).
OptionalrenderRender a custom status bar (replaces the default).
OptionalrenderRender TaskPaneArea.
The properties for the TaskPaneArea.
A React Element representing the TaskPaneArea.
OptionalrenderRender a custom toolbar (replaces the default studio toolbar).
OptionalshowIndicate if the formula bar should be showing.
OptionalshowShows the status bar.
OptionalsxMUI SX props https://mui.com/system/getting-started/the-sx-prop/
OptionaltaskAllow for a side of the taskpane.
OptionaltokensExplicit --sxl-* token values — the host's own colors, stated rather than derived. Addressed by
cell: a (surface × mode) pair, so a host can name the header paper without a new token existing:
tokens={{
dark: {
app: {
'color-base-200': '#1f1f1f', // the chrome/desktop surface
'color-input': '#313131', // the formula bar / name box field
'color-input-border': '#3c3c3c',
},
header: { 'color-base-100': '#181818' }, // the row/column header paper
},
}}
Use this — not muiTheme — for anything the MUI palette has no slot for. Studio derives what you leave unset (gridlines, the header hover step) from the five palette slots by elevation math, which assumes "raised" means "lighter". A flat design language (VS Code, Fluent) names those surfaces outright and does not follow that curve, so stating them here makes the derivation stand down for exactly those cells and keeps deriving only the rest.
The surfaces are app (the default cell everything inherits), header (row/column headers) and grid
(the cell body). These are emitted with Studio's own sxl-app layer, so they stay surface-aware. A
wrapping TokenThemeProvider remains the right doorway for a client brand override, but it emits into
sxl-overrides, which — being a higher layer — applies across every surface at once.
OptionaltopSlot rendered at the top-left of the toolbar (after the logo, before the title).
Application-level toolbar chrome the studio no longer hardcodes — e.g. a file menu. Inject a
@sheetxl/studio-mui!StandaloneFileCommandButton for the standalone file menu (open / save
/ import / export); command availability is still governed by the active WorkbookIO
backing store's canRead / canWrite.
OptionaltopSlot rendered at the top-right of the toolbar — e.g. an appearance (light/dark) menu. Inject an @sheetxl/studio-mui!AppearanceCommandButton for the default appearance menu.
OptionalworkbookThe workbook for the studio — a live IWorkbook, a Promise for one, or
IWorkbookIO.ReadOptions the studio reads.
Properties for the Studio component.