Class: ActiveMail::Tokens

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/activemail/tokens.rb,
lib/activemail/tokens/button_style.rb,
lib/activemail/tokens/scss_serializer.rb

Defined Under Namespace

Modules: ScssSerializer Classes: ButtonStyle

Constant Summary collapse

TokenMap =
T.type_alias { T::Hash[Symbol, String] }
DEFAULT_COLORS =
T.let(
  {
    primary: '#2a9d8f',
    secondary: '#264653',
    text: '#1a1a1a',
    background: '#ffffff',
    muted: '#6b7280',
    border: '#e5e7eb',
    button_text: '#ffffff'
  }.freeze,
  TokenMap
)
SYSTEM_FONT_STACK =
'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif'
DEFAULT_FONTS =
T.let(
  {
    body: SYSTEM_FONT_STACK,
    heading: SYSTEM_FONT_STACK
  }.freeze,
  TokenMap
)
DEFAULT_SPACINGS =
T.let(
  {
    xs: '4px',
    sm: '8px',
    md: '16px',
    lg: '24px',
    xl: '40px'
  }.freeze,
  TokenMap
)
DEFAULT_RADII =
T.let(
  {
    button: '4px',
    box: '4px'
  }.freeze,
  TokenMap
)
GROUPS =

Open/Closed: adding a group here is the only change needed to wire it everywhere.

T.let(
  {
    color: DEFAULT_COLORS,
    font: DEFAULT_FONTS,
    spacing: DEFAULT_SPACINGS,
    radius: DEFAULT_RADII
  }.freeze,
  T::Hash[Symbol, TokenMap]
)

Instance Method Summary collapse

Constructor Details

#initializeTokens

Returns a new instance of Tokens.



68
69
70
# File 'lib/activemail/tokens.rb', line 68

def initialize
  @stores = T.let(GROUPS.transform_values(&:dup), T::Hash[Symbol, TokenMap])
end

Instance Method Details

#button_style(variant) ⇒ Object



127
128
129
# File 'lib/activemail/tokens.rb', line 127

def button_style(variant)
  ButtonStyle.from(self, variant)
end

#color(name, value = nil) ⇒ Object



73
74
75
# File 'lib/activemail/tokens.rb', line 73

def color(name, value = nil)
  access(:color, name, value)
end

#color!(name) ⇒ Object



94
95
96
# File 'lib/activemail/tokens.rb', line 94

def color!(name)
  fetch!(:color, name)
end

#font(name, value = nil) ⇒ Object



78
79
80
# File 'lib/activemail/tokens.rb', line 78

def font(name, value = nil)
  access(:font, name, value)
end

#font!(name) ⇒ Object



99
100
101
# File 'lib/activemail/tokens.rb', line 99

def font!(name)
  fetch!(:font, name)
end

#load(**groups) ⇒ Object



120
121
122
123
124
# File 'lib/activemail/tokens.rb', line 120

def load(**groups)
  groups.each do |group, values|
    values.each { |name, value| access(group, name, value) }
  end
end

#radius(name, value = nil) ⇒ Object



88
89
90
# File 'lib/activemail/tokens.rb', line 88

def radius(name, value = nil)
  access(:radius, name, value)
end

#radius!(name) ⇒ Object



109
110
111
# File 'lib/activemail/tokens.rb', line 109

def radius!(name)
  fetch!(:radius, name)
end

#spacing(name, value = nil) ⇒ Object



83
84
85
# File 'lib/activemail/tokens.rb', line 83

def spacing(name, value = nil)
  access(:spacing, name, value)
end

#spacing!(name) ⇒ Object



104
105
106
# File 'lib/activemail/tokens.rb', line 104

def spacing!(name)
  fetch!(:spacing, name)
end

#to_hObject



115
116
117
# File 'lib/activemail/tokens.rb', line 115

def to_h
  @stores.transform_values { |store| store.dup.freeze }.freeze
end

#to_scssObject



132
133
134
# File 'lib/activemail/tokens.rb', line 132

def to_scss
  ScssSerializer.call(@stores)
end