Stacksheetv1.1.4

createStacksheet()

Factory function that creates an isolated sheet stack instance.

Overview

createStacksheet() creates an isolated sheet stack instance with its own Zustand store, React context, and typed hooks. Each call is independent — you can have multiple sheet stacks with different configs in the same app.

import { createStacksheet } from "@howells/stacksheet";

const { StacksheetProvider, useSheet, useStacksheetState, store } =
  createStacksheet({
    side: "right",
    width: 420,
    spring: "stiff",
  });

Parameters

ParameterTypeRequiredDescription
configStacksheetConfigNoConfiguration options (see Config)

Return type

Returns a StacksheetInstance with four properties:

PropertyTypeDescription
StacksheetProviderComponentTypeProvider component — wrap your app
useSheet() => SheetActionsHook returning all sheet actions
useStacksheetState() => StacksheetSnapshotHook returning reactive state (stack, isOpen)
storeStoreApi<...>Raw Zustand store for use outside React

Multiple instances

Each call creates a fully isolated instance. Use this for distinct UI concerns:

const {
  StacksheetProvider: MainProvider,
  useSheet: useMainSheet,
} = createStacksheet({ side: "right" });

const {
  StacksheetProvider: SettingsProvider,
  useSheet: useSettingsSheet,
} = createStacksheet({ side: "left", width: 360 });

function App() {
  return (
    <MainProvider>
      <SettingsProvider>
        <YourApp />
      </SettingsProvider>
    </MainProvider>
  );
}

They render and animate independently.

Using the store outside React

The store property is a standard Zustand store. Use it in event handlers, API callbacks, or keyboard shortcuts:

const { store } = createStacksheet();

// Read current state
const state = store.getState();
console.log(state.stack.length, state.isOpen);

// Call actions from anywhere
store.getState().open(ErrorSheet, { message: "Something broke" });

// Subscribe to changes
const unsub = store.subscribe((state) => {
  console.log("Stack changed:", state.stack.length);
});

On this page