Skip to content

Showcases

Showcases are pre-configured variations of a section. When merchants add a section to a page through the Instant Site Editor, they see showcases as selectable presets — each with different default content, design values, and optionally a specific layout. Showcases let you demonstrate multiple visual styles for the same section.

Folder Structure

Showcase files live in the showcases/ directory alongside your section files:

sections/<section-name>/showcases/
├── 1.ts               # First showcase
├── 2.ts               # Second showcase
├── 3.ts               # Third showcase
└── translations.ts    # Showcase-specific translations

💡 Naming Convention

Both the filename and showcaseId are user-defined strings. The showcaseId is the identifier used throughout the product to reference a specific showcase.

Showcase Properties

Each showcase is created using the showcase.init() factory:

typescript
import { showcase } from '@lightspeed/crane-api';
PropertyTypeRequiredDescription
showcaseIdstringYesUnique identifier for this showcase
blockNamestringYesDisplay name in the editor (translation key)
previewImageobjectYesPreview thumbnail shown in the editor
contentRecord<string, ContentEditorDefaults>YesContent default overrides
designRecord<string, DesignEditorDefaults>YesDesign default overrides
layoutIdstringNoSelects a specific layout

Preview Image

The previewImage object has the same structure as the IMAGE editor's imageData — a set with at least one image resolution key, and an optional borderInfo:

typescript
previewImage: {
  set: {
    ORIGINAL: { url: 'custom_section_showcase_1_preview.jpg' },
  },
},

Image URLs reference files in the section's assets/ directory.

Content and Design Defaults

The content and design records provide default values for the section's fields. Keys must match those defined in your content.ts and design.ts files.

Use the content.default.*() and design.default.*() factories to create these defaults:

typescript
import { content, design, showcase } from '@lightspeed/crane-api';

export default showcase.init({
  showcaseId: '1',
  blockName: '$label.showcase_1.blockName',
  previewImage: {
    set: { ORIGINAL: { url: 'showcase_1_preview.jpg' } },
  },
  content: {
    title: content.default.inputbox({
      text: '$label.showcase_1.title',
    }),
    description: content.default.textarea({
      text: '$label.showcase_1.description',
    }),
    cta_button: content.default.button({
      title: '$label.showcase_1.cta',
      buttonType: 'HYPER_LINK',
      link: 'https://example.com',
    }),
  },
  design: {
    title_style: design.default.text({
      font: 'global.fontFamily.heading',
      size: 44,
      bold: true,
      italic: false,
      color: '#333333',
    }),
    section_background: design.default.background({
      style: 'COLOR',
      color: 'global.color.background',
    }),
  },
});

DECK in Showcases

For DECK editors, showcase defaults provide a cards array where each card has a settings record matching the deck's defaultCardContent.settings keys:

typescript
content: {
  images: content.default.deck({
    cards: [
      {
        settings: {
          image_text: content.default.textarea({
            text: '$label.showcase_1.image_text_1',
          }),
          image_content: content.default.image({
            imageData: {
              set: {
                WEBP_LOW_RES: { url: 'slide_1_low.jpeg' },
                WEBP_HI_2X_RES: { url: 'slide_1_high.jpeg' },
              },
              borderInfo: {},
            },
          }),
        },
      },
      {
        settings: {
          image_text: content.default.textarea({
            text: '$label.showcase_1.image_text_2',
          }),
          image_content: content.default.image({
            imageData: {
              set: {
                WEBP_LOW_RES: { url: 'slide_2_low.jpeg' },
                WEBP_HI_2X_RES: { url: 'slide_2_high.jpeg' },
              },
              borderInfo: {},
            },
          }),
        },
      },
    ],
  }),
},

Showcase Translations

Showcase-specific translations live in a separate translations.ts file inside the showcases/ directory. This file follows the same format as settings translations — a record keyed by language code:

typescript
// showcases/translations.ts
import { translation } from '@lightspeed/crane-api';

export default translation.init({
  en: {
    '$label.showcase_1.blockName': 'Hero — Retail',
    '$label.showcase_1.title': 'Trending collections',
    '$label.showcase_1.description': 'Discover our favorite pieces this season.',
    '$label.showcase_1.cta': 'Shop Now',
    '$label.showcase_2.blockName': 'Hero — Minimal',
    '$label.showcase_2.title': 'New arrivals',
  },
  fr: {
    '$label.showcase_1.blockName': 'Héros — Vente au détail',
    '$label.showcase_1.title': 'Collections tendance',
    '$label.showcase_1.description': 'Découvrez nos pièces préférées de cette saison.',
    '$label.showcase_1.cta': 'Acheter maintenant',
    '$label.showcase_2.blockName': 'Héros — Minimal',
    '$label.showcase_2.title': 'Nouveautés',
  },
});

Showcase Overrides

Showcases can also be overridden at the template page level using showcase_overrides on custom sections. This allows a template to reuse a section but adjust its showcase defaults without creating a new showcase file. See Templates — Pages for details.

Validation

Crane validates showcases at build time. The following rules are enforced:

⚠️ Content Validation

  • Every key in content must exist in the section's content.ts. Unknown keys produce: "Element is not defined in content.ts."
  • Editor types must match between showcase and content.ts. Mismatches produce: "Element type mismatch: showcase has type X but content.ts has type Y."
  • Selectbox default values must match one of the options defined in content.ts. Invalid values produce: "Option value is not defined in content.ts options."
  • DECK card settings keys must exist in content.ts defaultCardContent.settings. Invalid keys produce: "Setting is not defined in content.ts defaultCardContent.settings."

⚠️ Design Validation

  • Every key in design must exist in the section's design.ts. Unknown keys produce: "Element is not defined in design.ts."
  • Editor types must match between showcase and design.ts. Mismatches produce: "Element type mismatch: showcase has type X but design.ts has type Y."

⚠️ Layout Validation

  • If layoutId is specified, it must match a layout defined in the section's layout.ts. Invalid IDs produce: "LayoutId must exist in section's layout configuration file."

⚠️ Asset Validation

  • Image URLs in showcase content must reference files that exist in the section's assets/ directory. Missing images produce: "Image is missing from assets folder."