Class: Avo::Configuration::Appearance

Inherits:
Object
  • Object
show all
Defined in:
lib/avo/configuration/appearance.rb

Constant Summary collapse

PICKER_LAYOUTS =
[:inline, :dropdown].freeze
DEFAULT_NEUTRALS =
%w[brand slate stone gray zinc neutral taupe mauve mist olive].freeze
DEFAULT_ACCENTS =
%w[brand red orange amber yellow lime green emerald teal cyan sky blue indigo violet purple fuchsia pink rose].freeze
LOCKABLE =
%i[scheme neutral accent].freeze
NEUTRAL_SHADES =
[25, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950].freeze
ACCENT_TOKENS =
[:color, :content, :foreground].freeze
ACCENT_TOKEN_VAR_NAMES =
{
  color: "--color-accent",
  content: "--color-accent-content",
  foreground: "--color-accent-foreground"
}.freeze
DEFAULTS =
{
  scheme: :auto,
  persistence: :cookie,
  logo: "avo/logo.png",
  logomark: "avo/logomark.png",
  favicon: "avo/favicon.ico",
  favicon_dark: "avo/favicon-dark.ico",
  chart_colors: %w[#0B8AE2 #34C683 #FFBE4F #FF7676 #2AB1EE #34C6A8 #EC8CFF #80FF91 #FFFC38 #1BDBE8],
  placeholder: "avo/placeholder.svg",
  neutrals: DEFAULT_NEUTRALS,
  accents: DEFAULT_ACCENTS,
  lock: [],
  picker_layout: :inline
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Appearance

Returns a new instance of Appearance.



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/avo/configuration/appearance.rb', line 57

def initialize(options = {})
  config = DEFAULTS.merge(options)

  @scheme = config[:scheme]
  @neutral = config[:neutral]
  @accent = config[:accent]
  @neutral_colors = config[:neutral_colors]
  @accent_colors = config[:accent_colors]
  @neutrals = Array(config[:neutrals]).map(&:to_s).freeze
  @accents = Array(config[:accents]).map(&:to_s).freeze
  @lock = Array(config[:lock]).map(&:to_sym).freeze
  @persistence = config[:persistence]
  @logo = config[:logo]
  @logo_dark = config[:logo_dark]
  @logomark = config[:logomark]
  @logomark_dark = config[:logomark_dark]
  @favicon = config[:favicon]
  @favicon_dark = config[:favicon_dark]
  @chart_colors = config[:chart_colors]
  @placeholder = config[:placeholder]
  @picker_layout = config[:picker_layout]
  @load_settings_block = config[:load_settings]
  @save_settings_block = config[:save_settings]

  validate_picker_layout!(@picker_layout)
  validate_selection!("neutral", @neutral)
  validate_selection!("accent", @accent)
  validate_color_palette!("neutral_colors", @neutral_colors, NEUTRAL_SHADES, "shades") if @neutral_colors
  validate_color_palette!("accent_colors", @accent_colors, ACCENT_TOKENS, "tokens") if @accent_colors
end

Instance Attribute Details

#accentObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def accent
  @accent
end

#accent_colorsObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def accent_colors
  @accent_colors
end

#accentsObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def accents
  @accents
end

#chart_colorsObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def chart_colors
  @chart_colors
end

#faviconObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def favicon
  @favicon
end

#favicon_darkObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def favicon_dark
  @favicon_dark
end

#load_settings_blockObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def load_settings_block
  @load_settings_block
end

#lockObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def lock
  @lock
end

#logoObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def 
  @logo
end

#logo_darkObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def logo_dark
  @logo_dark
end

#logomarkObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def logomark
  @logomark
end

#logomark_darkObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def logomark_dark
  @logomark_dark
end

#neutralObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def neutral
  @neutral
end

#neutral_colorsObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def neutral_colors
  @neutral_colors
end

#neutralsObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def neutrals
  @neutrals
end

#persistenceObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def persistence
  @persistence
end

#picker_layoutObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def picker_layout
  @picker_layout
end

#placeholderObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def placeholder
  @placeholder
end

#save_settings_blockObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def save_settings_block
  @save_settings_block
end

#schemeObject (readonly)

:auto | :light | :dark



2
3
4
# File 'lib/avo/configuration/appearance.rb', line 2

def scheme
  @scheme
end

Instance Method Details

#accent_css_classObject

Returns the accent name for the data attribute (nil when accent is unset)



100
# File 'lib/avo/configuration/appearance.rb', line 100

def accent_css_class = accent&.to_s

#accent_locked?Boolean

Returns:

  • (Boolean)


94
# File 'lib/avo/configuration/appearance.rb', line 94

def accent_locked? = @lock.include?(:accent)

#brand_css_overridesObject

Returns the inline CSS string that overrides brand vars at :root when neutral_colors / accent_colors are configured. Returns nil when neither is set so the layout can skip emitting the <style> tag entirely.

Brand palettes are single-toned — one set of values applied in both light and dark mode (matching how the built-in ‘.neutral-theme-*` / `.accent-theme-*` classes work). The override is emitted only in `:root`; layer ordering does the rest.

The output is wrapped in ‘@layer base` so it sits between Avo’s defaults (‘@layer theme`, where the built-in `:root` colors and the `.dark` overrides live) and the theme classes (`@layer components`, where `.neutral-theme-*` / `.accent-theme-*` are defined). Layer ordering — `theme < base < components` — guarantees:

* Our :root override beats Avo's default `:root` palette and `.dark`
  overrides (we're in a later layer), so the brand color applies in
  both light and dark mode.
* A user-selected `.accent-theme-orange` still wins over our `:root`
  (it's in a later layer), so the picker keeps working.

Without an ‘@layer` wrapper, the unlayered inline style would beat every layered rule regardless of specificity, silently breaking theme selection.



123
124
125
126
127
128
129
130
131
132
133
# File 'lib/avo/configuration/appearance.rb', line 123

def brand_css_overrides
  return nil if neutral_colors.nil? && accent_colors.nil?

  [
    "@layer base {",
    "  :root {",
    *brand_declarations.map { |line| "  #{line}" },
    "  }",
    "}"
  ].join("\n")
end

#database_persistence?Boolean

Returns:

  • (Boolean)


88
# File 'lib/avo/configuration/appearance.rb', line 88

def database_persistence? = persistence == :database

#neutral_css_classObject

Returns the neutral name for the data attribute (nil when neutral is unset)



97
# File 'lib/avo/configuration/appearance.rb', line 97

def neutral_css_class = neutral&.to_s

#neutral_locked?Boolean

Returns:

  • (Boolean)


92
# File 'lib/avo/configuration/appearance.rb', line 92

def neutral_locked? = @lock.include?(:neutral)

#scheme_locked?Boolean

Returns:

  • (Boolean)


90
# File 'lib/avo/configuration/appearance.rb', line 90

def scheme_locked? = @lock.include?(:scheme)