Skip to main content

Customization levels

Choose the smallest public customization surface that fits the design.

Start with ready-made components. Move to lower-level components only when a specific design cannot be expressed with props, CSS, or slots.

Choose the shallowest customization layer

More control also means more markup and accessibility ownership.

Desert landscape at golden hour
Ocean waves reflecting light
Canyon at dusk
Misty forest
Mountain peak framed by trees
Soft coastal sunset

Ready-madeLayout, triggers, lightbox, gestures

<PhotoAlbum :photos="photos" layout="rows" />

Choose a level

LevelPublic surfaceUse it for
1Component options and CSS variablesLayout, spacing, colors, and common behavior.
2SlotsCustom thumbnail, caption, action, or slide UI.
3PhotoTrigger and LightboxProviderA custom thumbnail layout with the lightbox.
4provideLightbox and primitivesA fully custom lightbox interface.
5Image and lightbox injection keysApplication-wide service or component changes.

Use only the level that owns the needed behavior. A custom thumbnail does not require a custom lightbox. A custom action button does not require a new provider.

Application-wide overrides

Nuxt applications import these public symbols from @lupinum/nuxt-photo/app:

  • PhotoDefaultsKey sets shared labels and lightbox defaults.
  • ImageAdapterKey provides a default image adapter.
  • LightboxComponentKey replaces the ready-made lightbox used by components.

An override lightbox consumes the existing provider. Do not call provideLightbox() inside it unless you intend to create a separate state owner.

Use Customize the built-in lightbox before building from primitives.