← BACK

HEARTLINE SONGSMITH

ANVIL COMPONENTS

Live examples of all Anvil Design System components

ComicDetailCardComponent

Custom Love Song

A personalized song crafted from your story

  • check_circle Personalized lyrics based on your story
  • check_circle Professional recording and production
  • check_circle Delivered in 7 days or less

$299.00

<%= render ComicDetailCardComponent.new(
  title: "Custom Love Song",
  show_price: true,
  price: 29900
) do |c| %>
  <% c.with_sidebar do %>
    <!-- Price display -->
  <% end %>
  <!-- Content -->
<% end %>

AddonCardComponent

star

Rush Processing

Get your song in 3 days instead of 7

$99.00

star

Extra Verse

Add another verse to tell more of your story

$49.00

star

Professional Mix

Studio-quality mixing and mastering

$79.00

star

Instrumental Track

Get the instrumental version too

$29.00

<%= render AddonCardComponent.new(
  addon: addon,
  selectable: true
) %>

ComicFooterComponent

<%= render ComicFooterComponent.new(
  message: "100% Satisfaction Guaranteed",
  current_user: current_user
) %>

ComicButtonComponent

Signature comic-styled button with rounded shape, bold colors, and press animation

Primary (Red with Yellow Text)

Secondary (Yellow with Black Text)

Outline (White with Black Text)

Full Width

Checkout Button (Submit Type)

<%= render ComicButtonComponent.new(
  text: "SECURE CHECKOUT!",
  type: "submit",
  variant: :primary,
  size: :large
) %>

<!-- Variants: :primary, :secondary, :outline -->
<!-- Sizes: :small, :medium, :large -->
<!-- Types: "button", "submit", "reset" -->
<!-- full_width: true/false -->

Badges

Popular New Limited Success Sale
<span class="inline-block border-3 border-comic-black 
  bg-comic-red px-4 py-2 font-headline text-sm 
  font-bold uppercase text-comic-white shadow-comic">
  Popular
</span>

ComicAudioPlayerComponent

Audio player with download and share options, supports locked state

YOUR SONG

<%= render ComicAudioPlayerComponent.new(
  title: "YOUR SONG",
  audio_url: "https://example.com/song.mp3",
  mp3_url: "/downloads/song.mp3",
  wav_url: "/downloads/song.wav",
  share_url: "https://example.com/share/song",
  locked: false
) %>

ComicVideoPlayerComponent

Video player with purchase and download options, supports unavailable state

YOUR PREMIER VIDEO

videocam_off

VIDEO UNAVAILABLE

<%= render ComicVideoPlayerComponent.new(
  title: "YOUR PREMIER VIDEO",
  video_url: "https://example.com/video.mp4",  # nil for unavailable
  mp4_url: "/downloads/video.mp4",              # nil to disable
  purchase_url: "/purchase/video",              # nil to hide
  locked: false
) %>

ComicProgressBarComponent

Progress bar with configurable steps and icons, shows completion status

In Progress (Step 3 of 5)

SONG STATUS

star

INTAKE

star

DRAFT

thumb_up

APPROVED

mic

RECORDING

celebration

DELIVERED

Completed (Final Step)

SONG STATUS

star

INTAKE

star

DRAFT

star

APPROVED

star

RECORDING

celebration

DELIVERED

<%= render ComicProgressBarComponent.new(
  title: "SONG STATUS",
  steps: [
    { label: "INTAKE", icon: "edit_note" },
    { label: "DRAFT", icon: "auto_awesome" },
    { label: "APPROVED", icon: "thumb_up" },
    { label: "RECORDING", icon: "mic" },
    { label: "DELIVERED", icon: "celebration" }
  ],
  current_step: 2  # Zero-based index
) %>

YouTubeShortsComponent

Embeds YouTube Shorts videos with proper 9:16 aspect ratio and Anvil styling.

Props:

  • url (required) - YouTube Shorts URL
  • title (optional) - Video title for accessibility (defaults to "YouTube Short")

Default Example

Without Custom Title

<%= render YouTubeShortsComponent.new(
  url: "https://youtube.com/shorts/jruhldNzJPc?feature=share",
  title: "Don't Give Bad Gifts"
) %>

📝 Features:

  • Automatically extracts video ID from various YouTube Shorts URL formats
  • Maintains 9:16 portrait aspect ratio (same as mobile screens)
  • Anvil design styling with border-5, shadow-comic-hard, and rounded-none
  • Fully responsive and supports fullscreen playback
  • Accessible with proper iframe title attributes