UI Composables
The Crane API provides Vue 3 composables for accessing content and design data inside your section components. These composables return reactive objects that update automatically when merchants edit values in the Instant Site Editor.
import { useInputboxElementContent, useTextElementDesign } from '@lightspeed/crane-api';Content Composables
Content composables provide access to user-editable content defined in Content Editors.
Available Composables
useInputboxElementContent
INPUTBOX
Reactive<InputBoxContent>
Single-line text input
useTextareaElementContent
TEXTAREA
Reactive<TextAreaContent>
Multi-line text input
useButtonElementContent
BUTTON
Reactive<ButtonContentData>
Button with text and link
useImageElementContent
IMAGE
Reactive<ImageContent>
Image upload and settings
useToggleElementContent
TOGGLE
Reactive<ToggleContent>
Boolean toggle switch
useSelectboxElementContent
SELECTBOX
Reactive<SelectBoxContent>
Dropdown selection
useDeckElementContent
DECK
Reactive<DeckContent>
Collection of cards
useCategorySelectorElementContent
CATEGORY_SELECTOR
Reactive<CategorySelector>
Category picker
useProductSelectorElementContent
PRODUCT_SELECTOR
Reactive<ProductSelector>
Product picker
useLogoElementContent
LOGO
Reactive<LogoContent>
Logo image
useAccordionElementDesign
ACCORDION
Reactive<AccordionDesignData>
Accordion nested editors
useMenuElementContent
MENU
Reactive<MenuContent>
Menu items
useNavigationMenuElementContent
NAVIGATION_MENU
Reactive<MenuContent>
Navigation menu
useTranslation
—
Translation helper
Multi-language support
Return Properties
Text Composables (useInputboxElementContent, useTextareaElementContent):
hasContent—trueif field has non-empty textvalue— the text string
Button Composable (useButtonElementContent):
title— button text labelhasTitle—trueif button has texthasLink—trueif button has a link configuredperformAction()— triggers the button action (navigation, scroll, etc.)type— action type (HYPER_LINK,MAIL_LINK,TEL_LINK, etc.)link,email,phone— target values based on type
Image Composable (useImageElementContent):
hasContent—trueif an image is uploadedlowResolutionMobileImage— URL for mobile placeholder (100x200)highResolutionMobileImage— URL for mobile full quality (1000x2000)lowResolutionDesktopImage— URL for desktop placeholder (200x200)highResolutionDesktopImage— URL for desktop full quality (2000x2000)
Example
Key Mapping
The string passed to each composable (e.g., 'title', 'hero_image') must match a key in your content.ts settings file.
Design Composables
Design composables provide access to styling settings defined in Design Editors
Available Composables
useTextElementDesign
TEXT
Reactive<TextDesignData>
Text styling (font, size, color)
useTextareaElementDesign
TEXTAREA
Reactive<TextareaDesignData>
Textarea styling
useButtonElementDesign
BUTTON
Reactive<ButtonDesignData>
Button styling
useBackgroundElementDesign
BACKGROUND
Reactive<BackgroundDesignData>
Background color/image
useImageElementDesign
IMAGE
Reactive<ImageDesignData>
Image styling
useToggleElementDesign
TOGGLE
Reactive<ToggleDesignData>
Toggle styling
useSelectboxElementDesign
SELECTBOX
Reactive<SelectboxDesignData>
Selectbox styling
useLayoutElementDesign
—
Reactive<LayoutDesignData>
Layout settings
useLogoElementDesign
LOGO
ComputedRef<LogoDesignData>
Logo styling
Return Properties
Text Composables (useTextElementDesign, useTextareaElementDesign):
visible—trueif element should be displayedsize— font size as number (append'px'for CSS)font— font family stringcolor— Color object with.hex,.rgba,.hslpropertiesbold—trueif text should be bolditalic—trueif text should be italicwhiteSpace— (textarea only) white-space CSS value
Background Composable (useBackgroundElementDesign):
background.type—'solid'or'gradient'background.solid.color— Color object for solid backgroundsbackground.gradient.fromColor/toColor— Color objects for gradients
Button Composable (useButtonElementDesign):
visible—trueif button should be displayedappearance—'solid-button','outline-button', or'text-link'size—'small','medium', or'large'style—'pill','rectangle', or'round-corner'color— Color objectfont— font family string
Example
Accordion Composable
The useAccordionElementDesign composable provides access to design editors nested inside an ACCORDION design editor. It returns a reactive object containing items, where each item holds a label and an editors map of nested design editor values.
Usage
Key Mapping
The first argument to useAccordionElementDesign (e.g., 'styling') must match the key in your design.ts settings file. Access nested editors via items?.['itemKey']?.editors?.editorKey.
Responsive Images
The image composable provides multiple resolution variants for responsive designs:
For programmatic control, use a reactive width check:
Working with DECK
The DECK composable returns a collection of cards. Use getReactiveRef to access individual card fields:
Type Casting
Use the as unknown as Type casting pattern for getReactiveRef results, as shown above.
Translation
Use useTranslation for static multi-language text defined in your translations file:
Static Text Only
Use useTranslation for static text only — text that is the same across all instances of the section. For merchant-editable text, use content composables like useInputboxElementContent.
TypeScript Types
Use InferContentType and InferDesignType to derive types from your settings files:
These utility types ensure type safety — the generic parameter on composables (e.g., useInputboxElementContent<Content>('title')) validates that the key exists in your settings.
Global Types
InferContentType and InferDesignType are globally available — no import needed.
Best Practices
Conditional Rendering
Always check hasContent or visible before rendering elements:
Computed Styles
Use computed properties for style objects to ensure reactivity:
SSR vs Client-Only Rendering
Sections use server-side rendering (SSR) — the Vue component renders to HTML on the server first, then hydrates in the browser. Browser APIs like window, document, and addEventListener are not available during SSR.
Guard browser values with typeof window:
Use onMounted for client-only logic:
Code inside onMounted only runs in the browser after hydration. Use it for event listeners, DOM measurements, animations, and any browser-API-dependent setup:
General rule: Keep <script setup> top-level code SSR-safe — composables, computed properties, and reactive refs with safe defaults. Move all browser-specific logic into onMounted. If a piece of UI should only render on the client, guard it with a ref that flips in onMounted:
Last updated
Was this helpful?
