cimplify
CLI

Component registry

67 ejectable components ship in the registry. `cimplify list` shows every component; `cimplify add <name>` copies one's source into your project. After ejection it's yours; you stop receiving SDK updates for that component, in exchange for full control over JSX, state, and behavior.

This is the shadcn pattern: registry-as-source-code, not registry-as-package. You own ejected components; bumping @cimplify/sdk no longer updates them.

List

# All ejectable components
cimplify list

# Filter (pipe to grep)
cimplify list | grep selector
cimplify list | grep card

Add

# Eject a single component into ./components/
cimplify add cart-summary
# → writes ./components/cart-summary.tsx

cimplify add variant-selector
cimplify add product-customizer

The CLI resolves the registry entry, copies its source (renaming imports as needed), and writes it under components/. Replace the SDK import in the page or layout that used the original component with the local copy.

When to eject

Eject when…Don't eject when…
classNames / render* overrides can't reach the part you need to change.A class override or a per-element render* slot would do the job.
You need merchant-specific logic that isn't generic enough to upstream.You're tempted to monkey-patch; fork the SDK upstream instead.
You're deeply restructuring (e.g. custom cart layout that breaks the SDK's contract).You want SDK bug-fixes for free.

Example flow: restyle the cart drawer

Eject
cimplify add cart-drawer
# → ./components/cart-drawer.tsx
components/providers.tsx (swap the import)
"use client";
import { CimplifyProvider } from "@cimplify/sdk/react";
import { CartDrawerProvider } from "@cimplify/sdk/react";
// import { CartDrawer } from "@cimplify/sdk/react";          // ← was
import { CartDrawer } from "@/components/cart-drawer";        // ← now

// ...
components/cart-drawer.tsx (restyle freely)
// Edit the JSX, swap the close button, change the empty-state copy,
// add a per-merchant "free shipping" banner, etc. The state machine, cart
// hooks, and onCheckout contract still flow through the SDK; you only own
// the rendering.
"use client";
import { useCart, useCartDrawer } from "@cimplify/sdk/react";
// ... (the ejected source)

What's in the registry

The registry mirrors the React SDK exports. Pages, customizers, cards, primitives: every non-trivial component has an entry. cimplify list is the source of truth; the table below groups the most-used ones.

GroupRegistry entries
Pagescatalogue-page, product-page, cart-page, checkout-page, search-page, collection-page, order-detail-page, order-history-page, deals-page, bookings-page, booking-page, account
Cartcart-drawer, cart-summary
Cardsproduct-card, food-product-card, retail-product-card, wholesale-product-card, digital-product-card, standard-service-card, compact-service-card, schedule-service-card, rental-service-card, accommodation-card, lease-service-card, subscription-card, booking-card, booking-list
Layoutsdefault-product-layout, food-product-layout, wholesale-product-layout, service-product-layout, digital-product-layout
Customizersproduct-customizer, variant-selector, add-on-selector, bundle-selector, composite-selector, billing-plan-selector, customer-input-fields
Filters & gridsproduct-grid, category-grid, category-filter, search-input, store-nav, recently-viewed, recommendation-carousel, collection-page
Schedulingslot-picker, date-slot-picker, staff-picker, resource-picker, availability-badge
Primitivesprice, price-range, quantity-selector, deal-banner, sale-badge, discount-input, delivery-estimate, volume-pricing, location-picker, currency-selector, session-message-banner, product-image-gallery, product-sheet, order-summary, order-history, chat-widget

Ejection golden rules

  1. Read the ejected file end-to-end before editing.
  2. Don't change the state shape or the cart payload contract; the customizer / cart pricing math has been iterated on heavily, and the mock will reject mismatched payloads.
  3. Restyle via Tailwind classes / wrap nodes / add per-merchant copy.
  4. Run bun run check:cart and bun run check:contract after.

Where next

On this page