Avatar
AKA Blue Man Group
bin/rails g quicksilver_ui:component Avatar
Initials
NW
render UI::Avatar.new(initials: "NW")
Image with initials fallback
render UI::Avatar.new(initials: "NW", image_url: "https://images.unsplash.com/photo-1580489944761-15a19d654956?q=80&w=100&auto=format")
Sizes
div class: "space-x-2" do
render UI::Avatar.new(initials: "NW", image_url: "https://images.unsplash.com/photo-1580489944761-15a19d654956?q=80&w=100&auto=format", size: :xs)
render UI::Avatar.new(initials: "NW", image_url: "https://images.unsplash.com/photo-1580489944761-15a19d654956?q=80&w=100&auto=format", size: :sm)
render UI::Avatar.new(initials: "NW", image_url: "https://images.unsplash.com/photo-1580489944761-15a19d654956?q=80&w=100&auto=format", size: :md)
render UI::Avatar.new(initials: "NW", image_url: "https://images.unsplash.com/photo-1580489944761-15a19d654956?q=80&w=100&auto=format", size: :lg)
render UI::Avatar.new(initials: "NW", image_url: "https://images.unsplash.com/photo-1580489944761-15a19d654956?q=80&w=100&auto=format", size: :xl)
render UI::Avatar.new(initials: "NW", image_url: "https://images.unsplash.com/photo-1580489944761-15a19d654956?q=80&w=100&auto=format", size: :xxl)
end
Implementation
# frozen_string_literal: true
class UI::Avatar < UI::Base
include Phlex::Rails::Helpers::ImageTag
prop :initials, String, reader: :private
prop :image_url, _Nilable(String), reader: :private
prop :size, _Union("xs", "sm", "md", "lg", "xl", "xxl"), default: :md, reader: :private do |value|
value.to_s.inquiry
end
def view_template
span(class: classes) do
if image_url.present?
image_tag(image_url, class: "size-full rounded-full object-cover")
else
span(class: text_classes) { initials }
end
end
end
private
def classes
class_names(
super,
size_classes
)
end
def default_classes
"inline-flex size-6 items-center justify-center rounded-full bg-primary-100 border border-primary-700"
end
def size_classes
class_names(
"size-6": size.xs?,
"size-8": size.sm?,
"size-10": size.md?,
"size-12": size.lg?,
"size-14": size.xl?,
"size-16": size.xxl?
)
end
def text_classes
class_names(
"font-medium text-primary-900 uppercase",
"text-xs": size.xs?,
"text-sm": size.sm?,
"text-base": size.md?,
"text-xl": size.lg? || size.xl?,
"text-2xl": size.xxl?,
hidden: image_url.present?
)
end
end