primer_view_components 0.0.18 → 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +38 -0
  3. data/app/components/primer/avatar_component.rb +24 -6
  4. data/app/components/primer/avatar_stack_component.html.erb +10 -0
  5. data/app/components/primer/avatar_stack_component.rb +81 -0
  6. data/app/components/primer/base_component.rb +3 -3
  7. data/app/components/primer/blankslate_component.rb +8 -8
  8. data/app/components/primer/border_box_component.rb +29 -17
  9. data/app/components/primer/box_component.rb +2 -2
  10. data/app/components/primer/breadcrumb_component.rb +1 -1
  11. data/app/components/primer/button_component.rb +2 -2
  12. data/app/components/primer/button_group_component.rb +4 -1
  13. data/app/components/primer/button_marketing_component.rb +2 -2
  14. data/app/components/primer/component.rb +5 -6
  15. data/app/components/primer/counter_component.rb +5 -1
  16. data/app/components/primer/dropdown/menu_component.html.erb +12 -0
  17. data/app/components/primer/dropdown/menu_component.rb +48 -0
  18. data/app/components/primer/dropdown_component.html.erb +9 -0
  19. data/app/components/primer/dropdown_component.rb +77 -0
  20. data/app/components/primer/dropdown_menu_component.rb +4 -0
  21. data/app/components/primer/flash_component.rb +10 -6
  22. data/app/components/primer/flex_component.rb +38 -1
  23. data/app/components/primer/flex_item_component.rb +15 -1
  24. data/app/components/primer/heading_component.rb +1 -1
  25. data/app/components/primer/label_component.rb +2 -2
  26. data/app/components/primer/layout_component.rb +2 -2
  27. data/app/components/primer/link_component.rb +6 -2
  28. data/app/components/primer/markdown_component.rb +293 -0
  29. data/app/components/primer/menu_component.html.erb +6 -0
  30. data/app/components/primer/menu_component.rb +71 -0
  31. data/app/components/primer/octicon_component.rb +7 -3
  32. data/app/components/primer/popover_component.rb +5 -5
  33. data/app/components/primer/progress_bar_component.rb +5 -5
  34. data/app/components/primer/spinner_component.rb +7 -3
  35. data/app/components/primer/state_component.rb +3 -3
  36. data/app/components/primer/subhead_component.rb +6 -6
  37. data/app/components/primer/text_component.rb +1 -1
  38. data/app/components/primer/timeline_item_component.rb +4 -4
  39. data/app/components/primer/tooltip_component.rb +5 -5
  40. data/app/components/primer/truncate_component.rb +4 -4
  41. data/app/components/primer/underline_nav_component.rb +2 -2
  42. data/app/components/primer/view_components.rb +4 -0
  43. data/lib/primer/classify.rb +22 -9
  44. data/lib/primer/classify/cache.rb +125 -0
  45. data/lib/primer/fetch_or_fallback_helper.rb +1 -1
  46. data/lib/primer/join_style_arguments_helper.rb +1 -1
  47. data/lib/primer/view_components.rb +32 -1
  48. data/lib/primer/view_components/engine.rb +1 -1
  49. data/lib/primer/view_components/version.rb +1 -1
  50. data/lib/yard/renders_many_handler.rb +19 -0
  51. data/lib/yard/renders_one_handler.rb +19 -0
  52. data/static/statuses.json +1 -0
  53. metadata +46 -5
@@ -0,0 +1,6 @@
1
+ <%= render(Primer::BaseComponent.new(**@system_arguments)) do %>
2
+ <%= heading %>
3
+ <% items.each do |item| %>
4
+ <%= item %>
5
+ <% end %>
6
+ <% end %>
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ # Use menus to create vertical lists of navigational links.
5
+ class MenuComponent < Primer::Component
6
+ include ViewComponent::SlotableV2
7
+
8
+ # Optional menu heading
9
+ #
10
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
11
+ renders_one :heading, lambda { |**system_arguments|
12
+ system_arguments[:tag] ||= :span
13
+ system_arguments[:classes] = class_names(
14
+ "menu-heading",
15
+ system_arguments[:classes]
16
+ )
17
+
18
+ Primer::BaseComponent.new(**system_arguments)
19
+ }
20
+
21
+ # Required list of navigational links
22
+ #
23
+ # @param href [String] URL to be used for the Link
24
+ # @param selected [Boolean] Whether the item is the current selection
25
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
26
+ renders_many :items, lambda { |href:, selected: false, **system_arguments|
27
+ system_arguments[:tag] = :a
28
+ system_arguments[:href] = href
29
+ system_arguments[:"aria-current"] = :page if selected
30
+ system_arguments[:classes] = class_names(
31
+ "menu-item",
32
+ system_arguments[:classes]
33
+ )
34
+
35
+ Primer::BaseComponent.new(**system_arguments)
36
+ }
37
+
38
+ # @example auto|Default
39
+ # <%= render(Primer::MenuComponent.new) do |c| %>
40
+ # <% c.heading do %>
41
+ # Heading
42
+ # <% end %>
43
+ # <% c.item(selected: true, href: "#url") do %>
44
+ # Item 1
45
+ # <% end %>
46
+ # <% c.item(href: "#url") do %>
47
+ # <%= render(Primer::OcticonComponent.new(icon: "check")) %>
48
+ # With Icon
49
+ # <% end %>
50
+ # <% c.item(href: "#url") do %>
51
+ # <%= render(Primer::OcticonComponent.new(icon: "check")) %>
52
+ # With Icon and Counter
53
+ # <%= render(Primer::CounterComponent.new(count: 25)) %>
54
+ # <% end %>
55
+ # <% end %>
56
+ #
57
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
58
+ def initialize(**system_arguments)
59
+ @system_arguments = system_arguments
60
+ @system_arguments[:tag] = :nav
61
+ @system_arguments[:classes] = class_names(
62
+ "menu",
63
+ @system_arguments[:classes]
64
+ )
65
+ end
66
+
67
+ def render?
68
+ items.any?
69
+ end
70
+ end
71
+ end
@@ -14,13 +14,13 @@ module Primer
14
14
  }.freeze
15
15
  SIZE_OPTIONS = SIZE_MAPPINGS.keys
16
16
 
17
- # @example 25|Default
17
+ # @example auto|Default
18
18
  # <%= render(Primer::OcticonComponent.new(icon: "check")) %>
19
19
  #
20
- # @example 40|Medium
20
+ # @example auto|Medium
21
21
  # <%= render(Primer::OcticonComponent.new(icon: "people", size: :medium)) %>
22
22
  #
23
- # @example 80|Large
23
+ # @example auto|Large
24
24
  # <%= render(Primer::OcticonComponent.new(icon: "x", size: :large)) %>
25
25
  #
26
26
  # @param icon [String] Name of [Octicon](https://primer.style/octicons/) to use.
@@ -42,5 +42,9 @@ module Primer
42
42
  def call
43
43
  octicon(@icon, { **@system_arguments })
44
44
  end
45
+
46
+ def self.status
47
+ Primer::Component::STATUSES[:beta]
48
+ end
45
49
  end
46
50
  end
@@ -10,7 +10,7 @@ module Primer
10
10
  with_slot :heading, class_name: "Heading"
11
11
  with_slot :body, class_name: "Body"
12
12
 
13
- # @example 150|Default
13
+ # @example auto|Default
14
14
  # <%= render Primer::PopoverComponent.new do |component| %>
15
15
  # <% component.slot(:heading) do %>
16
16
  # Activity feed
@@ -20,7 +20,7 @@ module Primer
20
20
  # <% end %>
21
21
  # <% end %>
22
22
  #
23
- # @example 150|Large
23
+ # @example auto|Large
24
24
  # <%= render Primer::PopoverComponent.new do |component| %>
25
25
  # <% component.slot(:heading) do %>
26
26
  # Activity feed
@@ -30,7 +30,7 @@ module Primer
30
30
  # <% end %>
31
31
  # <% end %>
32
32
  #
33
- # @example 150|Caret position
33
+ # @example auto|Caret position
34
34
  # <%= render Primer::PopoverComponent.new do |component| %>
35
35
  # <% component.slot(:heading) do %>
36
36
  # Activity feed
@@ -57,7 +57,7 @@ module Primer
57
57
  body.present?
58
58
  end
59
59
 
60
- # :nodoc
60
+ # :nodoc:
61
61
  class Heading < Primer::Slot
62
62
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
63
63
  def initialize(**system_arguments)
@@ -71,7 +71,7 @@ module Primer
71
71
  end
72
72
  end
73
73
 
74
- # :nodoc
74
+ # :nodoc:
75
75
  class Body < Slot
76
76
  CARET_DEFAULT = :top
77
77
  CARET_MAPPINGS = {
@@ -16,22 +16,22 @@ module Primer
16
16
  }.freeze
17
17
 
18
18
  SIZE_OPTIONS = SIZE_MAPPINGS.keys
19
- # @example 20|Default
19
+ # @example auto|Default
20
20
  # <%= render(Primer::ProgressBarComponent.new) do |component| %>
21
21
  # <% component.slot(:item, percentage: 25) %>
22
22
  # <% end %>
23
23
  #
24
- # @example 20|Small
24
+ # @example auto|Small
25
25
  # <%= render(Primer::ProgressBarComponent.new(size: :small)) do |component| %>
26
26
  # <% component.slot(:item, bg: :blue_4, percentage: 50) %>
27
27
  # <% end %>
28
28
  #
29
- # @example 30|Large
29
+ # @example auto|Large
30
30
  # <%= render(Primer::ProgressBarComponent.new(size: :large)) do |component| %>
31
31
  # <% component.slot(:item, bg: :red_4, percentage: 75) %>
32
32
  # <% end %>
33
33
  #
34
- # @example 20|Multiple items
34
+ # @example auto|Multiple items
35
35
  # <%= render(Primer::ProgressBarComponent.new) do |component| %>
36
36
  # <% component.slot(:item, percentage: 10) %>
37
37
  # <% component.slot(:item, bg: :blue_4, percentage: 20) %>
@@ -54,7 +54,7 @@ module Primer
54
54
  items.any?
55
55
  end
56
56
 
57
- # :nodoc
57
+ # :nodoc:
58
58
  class Item < Primer::Slot
59
59
  attr_reader :system_arguments
60
60
 
@@ -15,13 +15,13 @@ module Primer
15
15
  DEFAULT_STYLE = "box-sizing: content-box; color: var(--color-icon-primary);"
16
16
 
17
17
  #
18
- # @example 48|Default
18
+ # @example auto|Default
19
19
  # <%= render(Primer::SpinnerComponent.new) %>
20
20
  #
21
- # @example 32|Small
21
+ # @example auto|Small
22
22
  # <%= render(Primer::SpinnerComponent.new(size: :small)) %>
23
23
  #
24
- # @example 80|Large
24
+ # @example auto|Large
25
25
  # <%= render(Primer::SpinnerComponent.new(size: :large)) %>
26
26
  #
27
27
  # @param size [Symbol] <%= one_of(Primer::SpinnerComponent::SIZE_MAPPINGS) %>
@@ -34,5 +34,9 @@ module Primer
34
34
  @system_arguments[:viewBox] = "0 0 16 16"
35
35
  @system_arguments[:fill] = :none
36
36
  end
37
+
38
+ def self.status
39
+ Primer::Component::STATUSES[:beta]
40
+ end
37
41
  end
38
42
  end
@@ -22,16 +22,16 @@ module Primer
22
22
  TAG_DEFAULT = :span
23
23
  TAG_OPTIONS = [TAG_DEFAULT, :div, :a].freeze
24
24
 
25
- # @example 40|Default
25
+ # @example auto|Default
26
26
  # <%= render(Primer::StateComponent.new(title: "title")) { "State" } %>
27
27
  #
28
- # @example 40|Colors
28
+ # @example auto|Colors
29
29
  # <%= render(Primer::StateComponent.new(title: "title")) { "Default" } %>
30
30
  # <%= render(Primer::StateComponent.new(title: "title", color: :green)) { "Green" } %>
31
31
  # <%= render(Primer::StateComponent.new(title: "title", color: :red)) { "Red" } %>
32
32
  # <%= render(Primer::StateComponent.new(title: "title", color: :purple)) { "Purple" } %>
33
33
  #
34
- # @example 40|Sizes
34
+ # @example auto|Sizes
35
35
  # <%= render(Primer::StateComponent.new(title: "title")) { "Default" } %>
36
36
  # <%= render(Primer::StateComponent.new(title: "title", size: :small)) { "Small" } %>
37
37
  #
@@ -9,7 +9,7 @@ module Primer
9
9
  with_slot :actions, class_name: "Actions"
10
10
  with_slot :description, class_name: "Description"
11
11
 
12
- # @example 95|Default
12
+ # @example auto|Default
13
13
  # <%= render(Primer::SubheadComponent.new) do |component| %>
14
14
  # <% component.slot(:heading) do %>
15
15
  # My Heading
@@ -19,7 +19,7 @@ module Primer
19
19
  # <% end %>
20
20
  # <% end %>
21
21
  #
22
- # @example 95|Without border
22
+ # @example auto|Without border
23
23
  # <%= render(Primer::SubheadComponent.new(hide_border: true)) do |component| %>
24
24
  # <% component.slot(:heading) do %>
25
25
  # My Heading
@@ -29,7 +29,7 @@ module Primer
29
29
  # <% end %>
30
30
  # <% end %>
31
31
  #
32
- # @example 95|With actions
32
+ # @example auto|With actions
33
33
  # <%= render(Primer::SubheadComponent.new) do |component| %>
34
34
  # <% component.slot(:heading) do %>
35
35
  # My Heading
@@ -67,7 +67,7 @@ module Primer
67
67
  heading.present?
68
68
  end
69
69
 
70
- # :nodoc
70
+ # :nodoc:
71
71
  class Heading < ViewComponent::Slot
72
72
  include ClassNameHelper
73
73
 
@@ -86,7 +86,7 @@ module Primer
86
86
  end
87
87
  end
88
88
 
89
- # :nodoc
89
+ # :nodoc:
90
90
  class Actions < ViewComponent::Slot
91
91
  include ClassNameHelper
92
92
 
@@ -100,7 +100,7 @@ module Primer
100
100
  end
101
101
  end
102
102
 
103
- # :nodoc
103
+ # :nodoc:
104
104
  class Description < ViewComponent::Slot
105
105
  include ClassNameHelper
106
106
 
@@ -3,7 +3,7 @@
3
3
  module Primer
4
4
  # The Text component is a wrapper component that will apply typography styles to the text inside.
5
5
  class TextComponent < Primer::Component
6
- # @example 70|Default
6
+ # @example auto|Default
7
7
  # <%= render(Primer::TextComponent.new(tag: :p, font_weight: :bold)) { "Bold Text" } %>
8
8
  # <%= render(Primer::TextComponent.new(tag: :p, color: :red_5)) { "Red Text" } %>
9
9
  #
@@ -11,7 +11,7 @@ module Primer
11
11
 
12
12
  attr_reader :system_arguments
13
13
 
14
- # @example 75|Default
14
+ # @example auto|Default
15
15
  # <div style="padding-left: 60px">
16
16
  # <%= render(Primer::TimelineItemComponent.new) do |component| %>
17
17
  # <% component.slot(:avatar, src: "https://github.com/github.png", alt: "github") %>
@@ -36,7 +36,7 @@ module Primer
36
36
  avatar.present? || badge.present? || body.present?
37
37
  end
38
38
 
39
- # :nodoc
39
+ # :nodoc:
40
40
  class Avatar < Primer::Slot
41
41
  attr_reader :system_arguments, :alt, :src, :size, :square
42
42
 
@@ -60,7 +60,7 @@ module Primer
60
60
  end
61
61
  end
62
62
 
63
- # :nodoc
63
+ # :nodoc:
64
64
  class Badge < Primer::Slot
65
65
  attr_reader :system_arguments, :icon
66
66
 
@@ -78,7 +78,7 @@ module Primer
78
78
  end
79
79
  end
80
80
 
81
- # :nodoc
81
+ # :nodoc:
82
82
  class Body < Primer::Slot
83
83
  attr_reader :system_arguments
84
84
 
@@ -26,29 +26,29 @@ module Primer
26
26
  se
27
27
  ]
28
28
 
29
- # @example 100|Default
29
+ # @example 55|Default
30
30
  # <div class="pt-5">
31
31
  # <%= render(Primer::TooltipComponent.new(label: "Even bolder")) { "Default Bold Text" } %>
32
32
  # </div>
33
33
  #
34
- # @example 100|Wrapping another component
34
+ # @example 65|Wrapping another component
35
35
  # <div class="pt-5">
36
36
  # <%= render(Primer::TooltipComponent.new(label: "Even bolder")) do %>
37
37
  # <%= render(Primer::ButtonComponent.new) { "Bold Button" } %>
38
38
  # <% end %>
39
39
  # </div>
40
40
  #
41
- # @example 100|With a direction
41
+ # @example 65|With a direction
42
42
  # <div class="pt-5">
43
43
  # <%= render(Primer::TooltipComponent.new(label: "Even bolder", direction: :s)) { "Bold Text With a Direction" } %>
44
44
  # </div>
45
45
  #
46
- # @example 100|With an alignment
46
+ # @example 65|With an alignment
47
47
  # <div class="pt-5">
48
48
  # <%= render(Primer::TooltipComponent.new(label: "Even bolder", direction: :s, alignment: :right_1)) { "Bold Text With an Alignment" } %>
49
49
  # </div>
50
50
  #
51
- # @example 100|Without a delay
51
+ # @example 65|Without a delay
52
52
  # <div class="pt-5">
53
53
  # <%= render(Primer::TooltipComponent.new(label: "Even bolder", direction: :s, no_delay: true)) { "Bold Text without a delay" } %>
54
54
  # </div>
@@ -3,18 +3,18 @@
3
3
  module Primer
4
4
  # Use TruncateComponent to shorten overflowing text with an ellipsis.
5
5
  class TruncateComponent < Primer::Component
6
- # @example 25|Default
6
+ # @example auto|Default
7
7
  # <div class="col-2">
8
8
  # <%= render(Primer::TruncateComponent.new(tag: :p)) { "branch-name-that-is-really-long" } %>
9
9
  # </div>
10
10
  #
11
- # @example 25|Inline
11
+ # @example auto|Inline
12
12
  # <%= render(Primer::TruncateComponent.new(tag: :span, inline: true)) { "branch-name-that-is-really-long" } %>
13
13
  #
14
- # @example 25|Expandable
14
+ # @example auto|Expandable
15
15
  # <%= render(Primer::TruncateComponent.new(tag: :span, inline: true, expandable: true)) { "branch-name-that-is-really-long" } %>
16
16
  #
17
- # @example 25|Custom size
17
+ # @example auto|Custom size
18
18
  # <%= render(Primer::TruncateComponent.new(tag: :span, inline: true, expandable: true, max_width: 100)) { "branch-name-that-is-really-long" } %>
19
19
  #
20
20
  # @param inline [Boolean] Whether the element is inline (or inline-block).
@@ -10,7 +10,7 @@ module Primer
10
10
 
11
11
  with_content_areas :body, :actions
12
12
 
13
- # @example 70|Default
13
+ # @example auto|Default
14
14
  # <%= render(Primer::UnderlineNavComponent.new) do |component| %>
15
15
  # <% component.with(:body) do %>
16
16
  # <%= render(Primer::LinkComponent.new(href: "#url")) { "Item 1" } %>
@@ -20,7 +20,7 @@ module Primer
20
20
  # <% end %>
21
21
  # <% end %>
22
22
  #
23
- # @example 70|Align right
23
+ # @example auto|Align right
24
24
  # <%= render(Primer::UnderlineNavComponent.new(align: :right)) do |component| %>
25
25
  # <% component.with(:body) do %>
26
26
  # <%= render(Primer::LinkComponent.new(href: "#url")) { "Item 1" } %>
@@ -26,6 +26,7 @@ require_relative "slot"
26
26
  # Components
27
27
 
28
28
  require_relative "avatar_component"
29
+ require_relative "avatar_stack_component"
29
30
  require_relative "blankslate_component"
30
31
  require_relative "border_box_component"
31
32
  require_relative "box_component"
@@ -35,6 +36,7 @@ require_relative "button_group_component"
35
36
  require_relative "button_marketing_component"
36
37
  require_relative "counter_component"
37
38
  require_relative "details_component"
39
+ require_relative "dropdown_component"
38
40
  require_relative "dropdown_menu_component"
39
41
  require_relative "flash_component"
40
42
  require_relative "flex_component"
@@ -43,6 +45,8 @@ require_relative "heading_component"
43
45
  require_relative "label_component"
44
46
  require_relative "layout_component"
45
47
  require_relative "link_component"
48
+ require_relative "markdown_component"
49
+ require_relative "menu_component"
46
50
  require_relative "octicon_component"
47
51
  require_relative "popover_component"
48
52
  require_relative "progress_bar_component"
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "classify/cache"
4
+
3
5
  module Primer
4
6
  # :nodoc:
5
7
  class Classify
@@ -17,6 +19,7 @@ module Primer
17
19
 
18
20
  INVALID_CLASS_NAME_PREFIXES =
19
21
  (["bg-", "color-", "text-", "d-", "v-align-", "wb-", "text-", "box-shadow-"] + CONCAT_KEYS.map { |k| "#{k}-" }).freeze
22
+ FUNCTIONAL_COLOR_REGEX = /(primary|secondary|tertiary|link|success|warning|danger|info)/.freeze
20
23
 
21
24
  COLOR_KEY = :color
22
25
  BG_KEY = :bg
@@ -166,10 +169,10 @@ module Primer
166
169
  raise ArgumentError, "#{key} does not support responsive values" unless RESPONSIVE_KEYS.include?(key)
167
170
 
168
171
  value.each_with_index do |val, index|
169
- extract_value(memo, key, val, BREAKPOINTS[index])
172
+ Primer::Classify::Cache.read(memo, key, val, BREAKPOINTS[index]) || extract_value(memo, key, val, BREAKPOINTS[index])
170
173
  end
171
174
  else
172
- extract_value(memo, key, value, BREAKPOINTS[0])
175
+ Primer::Classify::Cache.read(memo, key, value, BREAKPOINTS[0]) || extract_value(memo, key, value, BREAKPOINTS[0])
173
176
  end
174
177
  end
175
178
 
@@ -194,7 +197,7 @@ module Primer
194
197
  memo[:classes] << css_class
195
198
  end
196
199
  elsif key == BG_KEY
197
- if val.to_s.starts_with?("#")
200
+ if val.to_s.start_with?("#")
198
201
  memo[:styles] << "background-color: #{val};"
199
202
  else
200
203
  memo[:classes] << "bg-#{val.to_s.dasherize}"
@@ -202,11 +205,13 @@ module Primer
202
205
  elsif key == COLOR_KEY
203
206
  char_code = val[-1].ord
204
207
  # Does this string end in a character that is NOT a number?
205
- memo[:classes] << if char_code >= 48 && char_code <= 57 # 48 is the charcode for 0; 57 is the charcode for 9
206
- "color-#{val.to_s.dasherize}"
207
- else
208
- "text-#{val.to_s.dasherize}"
209
- end
208
+ memo[:classes] <<
209
+ if (char_code >= 48 && char_code <= 57) || # 48 is the charcode for 0; 57 is the charcode for 9
210
+ FUNCTIONAL_COLOR_REGEX.match?(val)
211
+ "color-#{val.to_s.dasherize}"
212
+ else
213
+ "text-#{val.to_s.dasherize}"
214
+ end
210
215
  elsif key == DISPLAY_KEY
211
216
  memo[:classes] << "d#{breakpoint}-#{val.to_s.dasherize}"
212
217
  elsif key == VERTICAL_ALIGN_KEY
@@ -214,7 +219,13 @@ module Primer
214
219
  elsif key == WORD_BREAK_KEY
215
220
  memo[:classes] << "wb-#{val.to_s.dasherize}"
216
221
  elsif BORDER_KEYS.include?(key)
217
- memo[:classes] << "border-#{val.to_s.dasherize}"
222
+ border_value = if val == true
223
+ "border"
224
+ else
225
+ "border-#{val.to_s.dasherize}"
226
+ end
227
+
228
+ memo[:classes] << border_value
218
229
  elsif BORDER_MARGIN_KEYS.include?(key)
219
230
  memo[:classes] << "#{key.to_s.dasherize}-#{val}"
220
231
  elsif key == BORDER_RADIUS_KEY
@@ -265,5 +276,7 @@ module Primer
265
276
  end
266
277
  end
267
278
  end
279
+
280
+ Cache.preload!
268
281
  end
269
282
  end