class Shared::AvatarComponent < ApplicationComponent attr_reader :record, :given_options def initialize(record, **given_options) @record = record @given_options = given_options end private def default_options { background_color: colors[seed % colors.size], size: 100, color: "white" } end def options default_options.merge(given_options) end def colors ["#16836d", "#12826c", "#896f06", "#a06608", "#1e8549", "#1e8549", "#b35e14", "#c75000", "#207ab6", "#2779b0", "#de2f1b", "#c0392b", "#9b59b6", "#8e44ad", "#6c767f", "#34495e", "#2c3e50", "#66797a", "#697677", "#d82286", "#c93b8e", "#db310f", "#727755", "#8a6f3d", "#8a6f3d", "#a94136"] end def seed record.id end def size options[:size] end def font_size (size * 0.6).round end def background_color options[:background_color] end def color options[:color] end def svg_options { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, role: "img", "aria-hidden": true, style: "background-color: #{background_color}", class: "initialjs-avatar #{options[:class]}".strip } end def text_options { x: "50%", y: "50%", dy: "0.35em", "text-anchor": "middle", fill: color, style: "font-size: #{font_size}px" } end def initial record.name.first.upcase end def avatar_image tag.svg(**svg_options) do tag.text(initial, **text_options) end end end