Design system

Components & variants

Build masters in Component Studio, add variants and props, and place instances.

Components are reusable pieces of UI. In Shippp a component has a main component on the canvas — a grid that shows every variant — and instances you place in screens. Each component exports as a typed React component whose properties become props.

Create a component

  1. Design it with smart layout

    Build the element on the canvas first. Use smart layout and tokens — a component is only as flexible as its layout.
  2. Create the component

    Right-click it and choose Create Component. The main component stays on the canvas, on the page where you made it, and appears in the component library.
  3. Name it

    Rename it (⌘ R) with a clear, code-friendly name such as Button or Pricing card.

Tip

Layer names inside a component become slot names in code. "Label", "Icon" and "Price" read far better to a developer than "Frame 12" or "Text 3".

Main components can live on any page. Keep them together on a page of their own if you like — cut and paste (⌘ X, ⌘ V) moves a main component to another page.

The variant grid

A main component is shown on the canvas as a grid of every combination of its properties, with a dashed purple frame. Select it to see Properties in the inspector, and select a single cell to design that variant.

A main component selected on the canvas, showing three breakpoint variants side by side, and its Breakpoint and Variant properties in the inspector.
A main component on the canvas. Properties become the rows and columns of its grid; every cell is one variant.

Properties

Click + (Add property) in the Properties section and choose a type:

TypeUse it for
VariantAlternative designs, such as Variant: Primary / Secondary / Ghost or Size: Default / Compact. Each value adds a row or column to the grid.
BooleanShowing or hiding layers, such as Has icon. One boolean can control several layers at once.
TextText that changes per instance, such as a button label. It has a default value.
Instance swapA nested instance that can be swapped, such as the icon of a button, with an optional list of preferred components.
SlotAn area that takes any content, such as the body of a card.
  • Every property can have a default value and a description.
  • Text, instance swap and slot properties can be created first and bound to a layer later: select the layer and apply the property there.
  • Use Edit property or Delete property on a row to reshape it.
  • With nested instances inside, Expose properties from → Nested instances shows their properties on the parent component, so designers set them in one place.
  • Turn on Icon property on an icon layer to swap the icon per instance, from the icon catalog or your components.

Slots

Select the slot layer to set it up:

SettingWhat it does
Min layers / Max layersHow many layers the slot accepts.
Only allow preferred instancesRestricts the slot to the components you choose with Choose preferred instances.
By default, display empty slotTurn it off to hide the slot when it has no content.
DescriptionShown to designers and to AI agents that fill the slot.

A slot keeps its default content, and every instance can be reset to it.

Responsive components

Use Turn responsive on to add a Breakpoint property. You can then adjust the component per breakpoint — a navigation bar that collapses on Mobile, a card that stacks on Tablet.

Interaction states

Hover, focus and disabled are special properties: Shippp keeps their names so they export as real interaction states (for example _hover) rather than ordinary variants.

The component library

With nothing selected, open the Assets tab in the right panel and choose Components. The library lists every component by page, with previews and Search components…. The settings button filters by page.

The Assets tab with the Components folder open: a search field and a grid of component previews.
Assets → Components: drag a component onto the canvas.
  • Drag a component onto the canvas to place an instance of its default variant — into a frame, into a smart layout or onto the empty canvas.
  • Click a component, then click on the canvas to place it.
  • Right-click a component for Insert instance, Go to main component, Remove from canvas and Delete permanently…

Note

A main component removed from the canvas stays in the library, under Not on canvas. Its instances keep working. Restore main component puts it back.

Use instances

  • Pick variant and property values for an instance in the Instance section of the inspector.
  • Changes you make on an instance are overrides, marked with an orange dot on the section. Click the dot to reset that section, or use Reset to main component.
  • Go to main component jumps to the definition. Detach instance (Eject Instance in the right-click menu) turns it back into ordinary layers.
  • Actions work on several selected instances at once.

Copying components

You copyYou get
A whole main component (the grid)A new, independent component.
One cell of the gridAn instance of that variant. Alt-drag a cell out of the grid for the same result.
An instanceAnother instance.

What developers get

Every component exports as a React component built on a recipe. Properties become props, layer names become slots, and tokens stay tokens. Here is the button used in this site's header, as exported from Shippp:

components/container-8/container-8.tsx (exported)

export interface Container8RootProps extends HTMLChakraProps<"div"> {
  variant?: "default" | "value-2";
  property2?: "default" | "value-2";
}

export const Container8Root = withProvider<HTMLDivElement, Container8RootProps>("div", "root");
export const Container8Text = withContext<HTMLParagraphElement, Container8TextProps>("p", "text");

Every exported project also includes a generated Storybook with a story for each variant, state, breakpoint and swap of your components — so developers and QA review exactly what you designed.

Note

Notice the names: Container 8, variant, value-2. They come straight from the design file. Naming components, properties and values well in Shippp — Button, tone, primary / secondary — is the single biggest improvement you can make to the generated code.

Checklist for a production-ready component

CheckWhy it matters
Built with smart layoutIt resizes with its content and its parent.
Uses tokens and text stylesThe code references your theme, not hard-coded values.
Meaningful layer namesSlots and props are readable.
Properties named by intentvariant="primary" beats property2="value-2".
Descriptions on properties and slotsDesigners and AI agents know what each one is for.
States as hover / focus / disabledThey export as real interaction states.