Examples

Landing page demos

Two complete landing pages built entirely with Luster UI components — no extra libraries.

Articles Editorial Live

The Curator

Editorial publishing platform with article cards, profiles and activity feed

Uses: Navbar · Hero · Article Card · Profile Card · Feature Quote · Activity Item · Badge · Button

View demo ↗
Analytics SaaS Demo

DataFlow

SaaS analytics platform with stat cards, tables, pricing and FAQ accordion

Uses: Navbar · Hero · Stat Card · Resource Table · Tabs · Accordion · Alert · Activity Item · Button

View demo ↗

Luster UI

Editorial-first Web Components design system. 20 components, dark/light mode, any brand color — works in React, Vue, Angular and plain HTML.

npm install @luster-ui/ui

Quick start

JS / TS
import { defineCustomElements } from '@yvstudio/luster-ui/loader';
defineCustomElements();
CDN — no build step
<script type="module"
  src="https://unpkg.com/@yvstudio/luster-ui/dist/luster/luster.esm.js">
</script>

Foundations

Button

Primary interactive element. 4 variants, 3 sizes, loading state and full-width mode.

Primary Secondary Tertiary Destructive Loading Disabled
Variants
<luster-button variant="primary">Primary</luster-button>
<luster-button variant="secondary">Secondary</luster-button>
<luster-button variant="tertiary">Tertiary</luster-button>
<luster-button variant="destructive">Destructive</luster-button>
<luster-button variant="primary" loading>Loading</luster-button>
<luster-button variant="primary" disabled>Disabled</luster-button>
Small Medium Large
Sizes
<luster-button size="sm">Small</luster-button>
<luster-button size="md">Medium</luster-button>
<luster-button size="lg">Large</luster-button>
PropTypeDescriptionDefault
variant'primary' | 'secondary' | 'tertiary' | 'destructive'Visual style'primary'
size'sm' | 'md' | 'lg'Button size'md'
loadingbooleanShows spinner, disables interactionfalse
disabledbooleanDisabled statefalse
full-widthbooleanStretches to container widthfalse
type'button' | 'submit' | 'reset'Native button type'button'

Badge

Inline status indicator. Supports dot prefix for minimal presence.

Default Primary Success Warning Error Beta Live
Variants
<luster-badge variant="default">Default</luster-badge>
<luster-badge variant="success">Success</luster-badge>
<luster-badge variant="warning">Warning</luster-badge>
<luster-badge variant="error">Error</luster-badge>
<luster-badge variant="beta">Beta</luster-badge>
<luster-badge variant="live">Live</luster-badge>
Active Pending Offline
With dot
<luster-badge variant="success" dot>Active</luster-badge>
<luster-badge variant="warning" dot>Pending</luster-badge>
<luster-badge variant="error"   dot>Offline</luster-badge>
PropTypeDescriptionDefault
variant'default' | 'primary' | 'success' | 'warning' | 'error' | 'beta' | 'live'Color scheme'default'
dotbooleanShows colored dot prefixfalse
size'sm' | 'md'Badge size'md'

Input

Text field with label, helper text and error state. Fully accessible.

HTML
<luster-input
  label="Email"
  placeholder="you@example.com"
  type="email"
></luster-input>

<luster-input
  label="Password"
  type="password"
  helper-text="At least 8 characters"
></luster-input>

<luster-input
  label="Username"
  error
  error-message="Username is already taken"
></luster-input>
PropTypeDescriptionDefault
labelstringField label''
placeholderstringPlaceholder text''
typestringNative input type'text'
valuestringField value''
errorbooleanError statefalse
error-messagestringError text below field''
helper-textstringHelper text below field''
disabledbooleanDisabled statefalse

Checkbox

Controlled checkbox with indeterminate state support.

HTML
<luster-checkbox label="Accept terms"></luster-checkbox>
<luster-checkbox label="Pre-selected" checked></luster-checkbox>
<luster-checkbox label="Partial" indeterminate></luster-checkbox>
<luster-checkbox label="Disabled" disabled></luster-checkbox>
PropTypeDescriptionDefault
labelstringCheckbox label''
checkedbooleanChecked statefalse
indeterminatebooleanPartial/indeterminate statefalse
disabledbooleanDisabled statefalse
valuestringForm value''

Toggle

On/off switch for settings and preference controls.

HTML
<luster-toggle label="Notifications"></luster-toggle>
<luster-toggle label="Dark mode" checked></luster-toggle>
<luster-toggle label="Disabled" disabled></luster-toggle>
PropTypeDescriptionDefault
labelstringToggle label''
checkedbooleanOn statefalse
disabledbooleanDisabled statefalse

Feedback

Alert

Contextual messages for feedback, errors and status updates.

HTML
<luster-alert
  variant="info"
  heading="Information"
  message="Your account is currently under review."
  dismissible
></luster-alert>

<luster-alert
  variant="success"
  heading="Published!"
  message="Your article is now live."
  dismissible
></luster-alert>

<luster-alert
  variant="error"
  heading="Failed to save"
  message="Something went wrong. Please try again."
  dismissible
></luster-alert>
PropTypeDescriptionDefault
variant'info' | 'success' | 'warning' | 'error'Alert type'info'
headingstringBold title''
messagestringBody text''
dismissiblebooleanShows close buttontrue
timestampstringOptional time label''

Accordion

Collapsible panel. Accepts any slot content and an optional badge.

Luster UI works in React, Vue, Angular, Svelte and plain HTML — no wrappers required.

Override --dc-primary, --dc-primary-dim and --dc-on-primary. All derived tokens update via color-mix().

HTML
<luster-accordion
  heading="What frameworks are supported?"
  subtitle="Compatibility"
>
  <p>Works in React, Vue, Angular, Svelte and plain HTML.</p>
</luster-accordion>

<luster-accordion
  heading="How does theming work?"
  badge="3 tokens"
  badge-variant="primary"
  expanded
>
  <p>Override 3 CSS custom properties.</p>
</luster-accordion>
PropTypeDescriptionDefault
headingstringPanel title''
subtitlestringSecondary label''
badgestringBadge text''
badge-variant'primary' | 'default' | 'success' | 'beta'Badge color'default'
expandedbooleanOpen by defaultfalse

Cards

Card

General-purpose container with 4 surface styles. Accepts any slot content.

Default

Elevated

Glass

Feature

HTML
<luster-card variant="default">
  <p>Default card</p>
</luster-card>

<luster-card variant="elevated">
  <p>Elevated — shadow lift</p>
</luster-card>

<luster-card variant="glass">
  <p>Glass — blur backdrop</p>
</luster-card>
PropTypeDescriptionDefault
variant'default' | 'elevated' | 'glass' | 'feature'Surface style'default'
padding'sm' | 'md' | 'lg' | 'none'Inner padding'md'
hoverablebooleanHover lift effectfalse

Article Card

Editorial content card with category, author, date and featured layout.

HTML
<luster-article-card
  category="Design Systems"
  heading="Building accessible color palettes"
  excerpt="A practical guide to creating color tokens."
  date="Apr 2026"
  author="Yasmim Vieira"
  author-role="Design Engineer"
></luster-article-card>

<!-- Featured variant -->
<luster-article-card
  category="Web Components"
  heading="Why Web Components for design systems"
  excerpt="Framework-agnostic and future-proof."
  featured
></luster-article-card>
PropTypeDescriptionDefault
categorystringTopic label''
headingstringArticle title''
excerptstringShort description''
datestringPublication date''
authorstringAuthor name''
author-rolestringAuthor role/title''
image-urlstringCover image URL''
featuredbooleanHero / featured layoutfalse

Profile Card

Author / user card with stats and a call-to-action button.

HTML
<luster-profile-card
  name="Yasmim Vieira"
  role="Design Engineer"
  stat1-value="48"
  stat1-label="Articles"
  stat2-value="12.4k"
  stat2-label="Readers"
  cta-label="View Portfolio"
></luster-profile-card>
PropTypeDescriptionDefault
namestringDisplay name''
rolestringJob title / role''
avatarstringAvatar image URL''
stat1-valuestringFirst stat number''
stat1-labelstringFirst stat label''
stat2-valuestringSecond stat number''
stat2-labelstringSecond stat label''
cta-labelstringCTA button text'View Portfolio'

Stat Card

Dashboard metric card with status, user count and optional toggle.

HTML
<luster-stat-card
  heading="Analytics Engine"
  description="Real-time event processing"
  version="v3.1"
  status="active"
  users="8.2k"
  has-toggle
  toggle-on
></luster-stat-card>

<luster-stat-card
  heading="Search Index"
  status="beta"
  users="430"
  has-toggle
></luster-stat-card>
PropTypeDescriptionDefault
headingstringCard title''
descriptionstringShort description''
versionstringVersion string''
status'active' | 'beta' | 'deprecated'Status badge'active'
usersstringUser count label''
has-togglebooleanShows toggle controlfalse
toggle-onbooleanToggle initial statefalse

Feature Quote

Pull quote for testimonials and editorial highlights.

HTML
<luster-feature-quote
  quote="Design systems are about the relationships between components."
  author="Yasmim Vieira"
  role="Design Engineer"
></luster-feature-quote>

<!-- Large variant -->
<luster-feature-quote
  variant="large"
  quote="Good design is obvious. Great design is transparent."
  author="Joe Sparano"
  role="Designer"
></luster-feature-quote>
PropTypeDescriptionDefault
quotestringQuote text''
authorstringAuthor name''
rolestringAuthor role / title''
variant'default' | 'large' | 'inline'Layout variant'default'

Tabs

Tabbed navigation with named slot panels. Tab definitions are passed as JSON.

Overview content goes here.
API reference content.
Code examples here.
HTML
<luster-tabs
  tabs='[{"id":"overview","label":"Overview"},{"id":"api","label":"API Reference"}]'
  active="overview"
>
  <div slot="tab-overview">Overview content</div>
  <div slot="tab-api">API Reference content</div>
</luster-tabs>
PropTypeDescriptionDefault
tabsJSON string: [{id, label}]Tab definitions''
activestringActive tab id''

Data

Resource Table

Data table for resources with score bars, status badges and row actions.

HTML
<luster-resource-table
  section-label="System Components"
  rows='[
    {"name":"Design Tokens","category":"Foundations","score":98,"status":"active"},
    {"name":"Button System","category":"Components","score":87,"status":"active"},
    {"name":"Legacy Forms","category":"Deprecated","score":34,"status":"deprecated"}
  ]'
></luster-resource-table>

Activity Item

Feed row for activity logs and file change notifications. Two layout variants.

HTML
<!-- Activity variant -->
<luster-activity-item
  label="Updated design tokens"
  description="Changed primary color"
  time="2 min ago"
  variant="activity"
  icon="edit"
></luster-activity-item>

<!-- File variant -->
<luster-activity-item
  label="design-tokens.json"
  description="Updated 14 tokens"
  time="5 min ago"
  variant="file"
  file-size="4.2 KB"
  downloadable
></luster-activity-item>
PropTypeDescriptionDefault
labelstringPrimary text''
descriptionstringSecondary text''
timestringRelative timestamp''
variant'activity' | 'file'Item type'activity'
iconstringIcon name (activity variant)'edit'
file-sizestringFile size label (file variant)''
downloadablebooleanShows download buttonfalse

Layout

Hero

Full-width section header with animated glows and optional parallax image.

HTML
<luster-hero
  heading="Editorial stories, beautifully organized"
  subtitle="Discover and explore content from the world's best writers."
  section="EXPLORE"
></luster-hero>

<!-- With image + parallax -->
<luster-hero
  heading="Your headline here"
  subtitle="Supporting text."
  section="HOME"
  image-url="https://example.com/cover.jpg"
  parallax
></luster-hero>
PropTypeDescriptionDefault
headingstringMain headline''
subtitlestringSupporting text''
sectionstringEyebrow label (uppercase)''
image-urlstringBackground image''
parallaxbooleanParallax scroll effectfalse

Color Swatch

Visual token reference for design system documentation and palette display.

HTML
<luster-color-swatch
  color="#a3a6ff"
  name="Primary"
  hex="#a3a6ff"
></luster-color-swatch>
PropTypeDescriptionDefault
colorstringCSS color (hex, rgb, var)'#a3a6ff'
namestringToken display name''
hexstringHex value shown below swatch''
size'sm' | 'md' | 'lg'Swatch size'md'

Theming

Any-color theming

Override three CSS custom properties to fully rebrand all components. All derived tokens — hover tints, shadows, focus rings, gradients — cascade automatically via color-mix().

Minimal brand override
:root {
  --dc-primary:     #f97316;  /* your brand color      */
  --dc-primary-dim: #ea580c;  /* darker shade           */
  --dc-on-primary:  #ffffff;  /* text/icon on primary   */
}
Brand examples
/* Emerald */
:root { --dc-primary: #10b981; --dc-primary-dim: #059669; --dc-on-primary: #ffffff; }

/* Rose */
:root { --dc-primary: #f43f5e; --dc-primary-dim: #e11d48; --dc-on-primary: #ffffff; }

/* Gold (dark text — amber is light) */
:root { --dc-primary: #f59e0b; --dc-primary-dim: #d97706; --dc-on-primary: #1c1200; }

/* Sky blue */
:root { --dc-primary: #0ea5e9; --dc-primary-dim: #0284c7; --dc-on-primary: #ffffff; }
Dark / light mode toggle
// Switch to light
document.documentElement.setAttribute('data-theme', 'light');

// Switch to dark
document.documentElement.setAttribute('data-theme', 'dark');

// Persist preference
localStorage.setItem('theme', 'light');

// Auto — let OS handle it (no JS needed)
// @media (prefers-color-scheme: light) is already active