primer_view_components 0.0.53 → 0.0.57

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +87 -0
  3. data/app/components/primer/alpha/tab_nav.html.erb +11 -0
  4. data/app/components/primer/alpha/tab_nav.rb +130 -0
  5. data/app/components/primer/{tab_nav_component.html.erb → alpha/tab_panels.html.erb} +3 -8
  6. data/app/components/primer/alpha/tab_panels.rb +82 -0
  7. data/app/components/primer/alpha/underline_nav.html.erb +15 -0
  8. data/app/components/primer/alpha/underline_nav.rb +137 -0
  9. data/app/components/primer/{underline_nav_component.html.erb → alpha/underline_panels.html.erb} +3 -8
  10. data/app/components/primer/alpha/underline_panels.rb +86 -0
  11. data/app/components/primer/base_component.rb +1 -1
  12. data/app/components/primer/{breadcrumb_component.html.erb → beta/breadcrumbs.html.erb} +2 -1
  13. data/app/components/primer/beta/breadcrumbs.rb +61 -0
  14. data/app/components/primer/navigation/tab_component.rb +7 -5
  15. data/app/components/primer/octicon_component.rb +6 -1
  16. data/app/components/primer/tab_container_component.rb +1 -1
  17. data/app/lib/primer/class_name_helper.rb +14 -13
  18. data/app/lib/primer/octicon/cache.rb +10 -2
  19. data/app/lib/primer/tab_nav_helper.rb +35 -0
  20. data/app/lib/primer/tabbed_component_helper.rb +4 -4
  21. data/app/lib/primer/underline_nav_helper.rb +44 -0
  22. data/lib/primer/classify/cache.rb +0 -6
  23. data/lib/primer/classify/utilities.rb +6 -2
  24. data/lib/primer/classify/utilities.yml +35 -0
  25. data/lib/primer/classify/validation.rb +1 -1
  26. data/lib/primer/classify.rb +0 -5
  27. data/lib/primer/view_components/engine.rb +1 -1
  28. data/lib/primer/view_components/linters/argument_mappers/button.rb +4 -1
  29. data/lib/primer/view_components/linters/flash_component_migration_counter.rb +5 -0
  30. data/lib/primer/view_components/version.rb +1 -1
  31. data/lib/rubocop/cop/primer/base_cop.rb +28 -0
  32. data/lib/rubocop/cop/primer/deprecated_arguments.rb +105 -15
  33. data/lib/rubocop/cop/primer/primer_octicon.rb +18 -1
  34. data/lib/rubocop/cop/primer/system_argument_instead_of_class.rb +1 -15
  35. data/lib/tasks/docs.rake +7 -6
  36. data/lib/tasks/utilities.rake +2 -0
  37. data/static/arguments.yml +75 -64
  38. data/static/classes.yml +2 -0
  39. data/static/constants.json +31 -29
  40. data/static/statuses.json +7 -5
  41. metadata +29 -9
  42. data/app/components/primer/breadcrumb_component.rb +0 -57
  43. data/app/components/primer/tab_nav_component.rb +0 -151
  44. data/app/components/primer/underline_nav_component.rb +0 -187
  45. data/lib/primer/classify/functional_text_colors.rb +0 -64
@@ -115,7 +115,11 @@ module Primer
115
115
  end
116
116
 
117
117
  def classes_to_args(classes)
118
- classes_to_hash(classes).map do |key, value|
118
+ hash_to_args(classes_to_hash(classes))
119
+ end
120
+
121
+ def hash_to_args(hash)
122
+ hash.map do |key, value|
119
123
  val = case value
120
124
  when Symbol
121
125
  ":#{value}"
@@ -175,7 +179,7 @@ module Primer
175
179
  unless supported_value?(key, val)
176
180
  raise ArgumentError, "#{val} is not a valid value for :#{key}. Use one of #{mappings(key)}" unless ENV["RAILS_ENV"] == "production"
177
181
 
178
- return ""
182
+ return "#{key.to_s.dasherize}-#{val.to_s.dasherize}"
179
183
  end
180
184
 
181
185
  nil
@@ -22,6 +22,39 @@
22
22
  - anim-hover-grow
23
23
  :rotate:
24
24
  - anim-rotate
25
+ :color:
26
+ :text_primary:
27
+ - color-text-primary
28
+ :text_secondary:
29
+ - color-text-secondary
30
+ :text_tertiary:
31
+ - color-text-tertiary
32
+ :text_link:
33
+ - color-text-link
34
+ :text_success:
35
+ - color-text-success
36
+ :text_warning:
37
+ - color-text-warning
38
+ :text_danger:
39
+ - color-text-danger
40
+ :text_inverse:
41
+ - color-text-inverse
42
+ :text_white:
43
+ - color-text-white
44
+ :icon_primary:
45
+ - color-icon-primary
46
+ :icon_secondary:
47
+ - color-icon-secondary
48
+ :icon_tertiary:
49
+ - color-icon-tertiary
50
+ :icon_info:
51
+ - color-icon-info
52
+ :icon_danger:
53
+ - color-icon-danger
54
+ :icon_success:
55
+ - color-icon-success
56
+ :icon_warning:
57
+ - color-icon-warning
25
58
  :position:
26
59
  :static:
27
60
  - position-static
@@ -1220,6 +1253,8 @@
1220
1253
  - py-lg-12
1221
1254
  - py-xl-12
1222
1255
  :word_break:
1256
+ :break_word:
1257
+ - wb-break-word
1223
1258
  :break_all:
1224
1259
  - wb-break-all
1225
1260
  :display:
@@ -6,7 +6,7 @@ module Primer
6
6
  class Classify
7
7
  # :nodoc:
8
8
  class Validation
9
- INVALID_CLASS_NAME_PREFIXES = /bg-|color-|text-|box-shadow-|text-|box_shadow-/.freeze
9
+ INVALID_CLASS_NAME_PREFIXES = /bg-|color-bg-|text-|box-shadow-|box_shadow-/.freeze
10
10
 
11
11
  class << self
12
12
  def invalid?(class_name)
@@ -4,7 +4,6 @@ require_relative "classify/cache"
4
4
  require_relative "classify/flex"
5
5
  require_relative "classify/functional_background_colors"
6
6
  require_relative "classify/functional_border_colors"
7
- require_relative "classify/functional_text_colors"
8
7
  require_relative "classify/grid"
9
8
  require_relative "classify/utilities"
10
9
  require_relative "classify/validation"
@@ -15,7 +14,6 @@ module Primer
15
14
  # Keys where we can simply translate { key: value } into ".key-value"
16
15
  CONCAT_KEYS = %i[text box_shadow].freeze
17
16
 
18
- COLOR_KEY = :color
19
17
  BG_KEY = :bg
20
18
  TEXT_KEYS = %i[font_family font_style font_weight text_align text_transform].freeze
21
19
  BOX_SHADOW_KEY = :box_shadow
@@ -88,7 +86,6 @@ module Primer
88
86
  BORDER_KEY,
89
87
  BORDER_COLOR_KEY,
90
88
  BORDER_RADIUS_KEY,
91
- COLOR_KEY,
92
89
  BG_KEY,
93
90
  BOX_SHADOW_KEY,
94
91
  CONTAINER_KEY
@@ -176,8 +173,6 @@ module Primer
176
173
  else
177
174
  memo[:classes] << Primer::Classify::FunctionalBackgroundColors.color(val)
178
175
  end
179
- elsif key == COLOR_KEY
180
- memo[:classes] << Primer::Classify::FunctionalTextColors.color(val)
181
176
  elsif key == BORDER_KEY
182
177
  border_value = if val == true
183
178
  "border"
@@ -7,7 +7,7 @@ module Primer
7
7
  # :nodoc:
8
8
  class Engine < ::Rails::Engine
9
9
  isolate_namespace Primer::ViewComponents
10
- config.autoload_once_paths = %W[
10
+ config.eager_load_paths = %W[
11
11
  #{root}/app/components
12
12
  #{root}/app/lib
13
13
  ]
@@ -23,12 +23,13 @@ module ERBLint
23
23
  component: "Primer::BaseButton",
24
24
  constant: "TYPE_OPTIONS"
25
25
  ).freeze
26
+
26
27
  DEFAULT_TAG = Primer::ViewComponents::Constants.get(
27
28
  component: "Primer::BaseButton",
28
29
  constant: "DEFAULT_TAG"
29
30
  ).freeze
30
31
 
31
- ATTRIBUTES = %w[disabled type].freeze
32
+ ATTRIBUTES = %w[disabled type href name value tabindex].freeze
32
33
 
33
34
  def attribute_to_args(attribute)
34
35
  attr_name = attribute.name
@@ -43,6 +44,8 @@ module ERBLint
43
44
  raise ConversionError, "Button component does not support type \"#{attribute.value}\"" unless TYPE_OPTIONS.include?(attribute.value)
44
45
 
45
46
  { type: ":#{attribute.value}" }
47
+ else
48
+ { attr_name.to_sym => erb_helper.convert(attribute) }
46
49
  end
47
50
  end
48
51
 
@@ -22,6 +22,11 @@ module ERBLint
22
22
  # Hash children indicates that there are tags in the content.
23
23
  return nil if tag_tree[:children].first.is_a?(Hash)
24
24
 
25
+ content = tag_tree[:children].first
26
+
27
+ # Don't accept content with ERB blocks
28
+ return nil if content.type != :text || content.children&.any? { |n| n.try(:type) == :erb }
29
+
25
30
  ARGUMENT_MAPPER.new(tag).to_s
26
31
  rescue ArgumentMappers::ConversionError
27
32
  nil
@@ -5,7 +5,7 @@ module Primer
5
5
  module VERSION
6
6
  MAJOR = 0
7
7
  MINOR = 0
8
- PATCH = 53
8
+ PATCH = 57
9
9
 
10
10
  STRING = [MAJOR, MINOR, PATCH].join(".")
11
11
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rubocop"
4
+ require "primer/view_components/statuses"
5
+ require_relative "../../../../app/lib/primer/view_helper"
6
+
7
+ module RuboCop
8
+ module Cop
9
+ module Primer
10
+ # :nodoc:
11
+ class BaseCop < RuboCop::Cop::Cop
12
+ # We only verify SystemArguments if it's a `.new` call on a component or
13
+ # a ViewHeleper call.
14
+ def valid_node?(node)
15
+ return if node.nil?
16
+
17
+ view_helpers.include?(node.method_name) || (node.method_name == :new && !node.receiver.nil? && ::Primer::ViewComponents::STATUSES.key?(node.receiver.const_name))
18
+ end
19
+
20
+ private
21
+
22
+ def view_helpers
23
+ ::Primer::ViewHelper::HELPERS.keys.map { |key| "primer_#{key}".to_sym }
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rubocop"
4
- require "primer/view_components/statuses"
5
- require_relative "../../../../app/lib/primer/view_helper"
6
4
 
7
5
  # :nocov:
8
6
  module RuboCop
@@ -15,7 +13,7 @@ module RuboCop
15
13
  #
16
14
  # good
17
15
  # Component.new(foo: :bar)
18
- class DeprecatedArguments < RuboCop::Cop::Cop
16
+ class DeprecatedArguments < BaseCop
19
17
  INVALID_MESSAGE = <<~STR
20
18
  Avoid using deprecated arguments: https://primer.style/view-components/deprecated.
21
19
  STR
@@ -35,6 +33,110 @@ module RuboCop
35
33
  # }
36
34
  #
37
35
  DEPRECATED = {
36
+ bg: {
37
+ white: "bg: :primary",
38
+ gray_light: "bg: :secondary",
39
+ gray: "bg: :tertiary",
40
+ gray_dark: "bg: :canvas_inverse",
41
+ blue_light: "bg: :info",
42
+ blue: "bg: :info_inverse",
43
+ green_light: "bg: :success",
44
+ green: "bg: :success_inverse",
45
+ yellow_light: "bg: :warning",
46
+ yellow: "bg: :warning_inverse",
47
+ red_light: "bg: :danger",
48
+ red: "bg: :danger_inverse",
49
+ gray_0: nil,
50
+ gray_1: nil,
51
+ gray_2: nil,
52
+ gray_3: nil,
53
+ gray_4: nil,
54
+ gray_5: nil,
55
+ gray_6: nil,
56
+ gray_7: nil,
57
+ gray_8: nil,
58
+ gray_9: nil,
59
+ blue_0: nil,
60
+ blue_1: nil,
61
+ blue_2: nil,
62
+ blue_3: nil,
63
+ blue_4: nil,
64
+ blue_5: nil,
65
+ blue_6: nil,
66
+ blue_7: nil,
67
+ blue_8: nil,
68
+ blue_9: nil,
69
+ green_0: nil,
70
+ green_1: nil,
71
+ green_2: nil,
72
+ green_3: nil,
73
+ green_4: nil,
74
+ green_5: nil,
75
+ green_6: nil,
76
+ green_7: nil,
77
+ green_8: nil,
78
+ green_9: nil,
79
+ yellow_0: nil,
80
+ yellow_1: nil,
81
+ yellow_2: nil,
82
+ yellow_3: nil,
83
+ yellow_4: nil,
84
+ yellow_5: nil,
85
+ yellow_6: nil,
86
+ yellow_7: nil,
87
+ yellow_8: nil,
88
+ yellow_9: nil,
89
+ red_0: nil,
90
+ red_1: nil,
91
+ red_2: nil,
92
+ red_3: nil,
93
+ red_4: nil,
94
+ red_5: nil,
95
+ red_6: nil,
96
+ red_7: nil,
97
+ red_8: nil,
98
+ red_9: nil,
99
+ purple_0: nil,
100
+ purple_1: nil,
101
+ purple_2: nil,
102
+ purple_3: nil,
103
+ purple_4: nil,
104
+ purple_5: nil,
105
+ purple_6: nil,
106
+ purple_7: nil,
107
+ purple_8: nil,
108
+ purple_9: nil,
109
+ pink_0: nil,
110
+ pink_1: nil,
111
+ pink_2: nil,
112
+ pink_3: nil,
113
+ pink_4: nil,
114
+ pink_5: nil,
115
+ pink_6: nil,
116
+ pink_7: nil,
117
+ pink_8: nil,
118
+ pink_9: nil,
119
+ orange_0: nil,
120
+ orange_1: nil,
121
+ orange_2: nil,
122
+ orange_3: nil,
123
+ orange_4: nil,
124
+ orange_5: nil,
125
+ orange_6: nil,
126
+ orange_7: nil,
127
+ orange_8: nil,
128
+ orange_9: nil
129
+ },
130
+ border_color: {
131
+ gray: "border_color: :primary",
132
+ gray_light: "border_color: :secondary",
133
+ gray_dark: "border_color: :tertiary",
134
+ blue: "border_color: :info",
135
+ green: "border_color: :success",
136
+ yellow: "border_color: :warning",
137
+ red: "border_color: :danger",
138
+ white: "border_color: :inverse"
139
+ },
38
140
  color: {
39
141
  blue: "color: :text_link",
40
142
  gray_dark: "color: :text_primary",
@@ -155,18 +257,6 @@ module RuboCop
155
257
  corrector.replace(node, replacement) if replacement.present?
156
258
  end
157
259
  end
158
-
159
- private
160
-
161
- # We only verify SystemArguments if it's a `.new` call on a component or
162
- # a ViewHleper call.
163
- def valid_node?(node)
164
- view_helpers.include?(node.method_name) || (node.method_name == :new && ::Primer::ViewComponents::STATUSES.key?(node.receiver.const_name))
165
- end
166
-
167
- def view_helpers
168
- ::Primer::ViewHelper::HELPERS.keys.map { |key| "primer_#{key}".to_sym }
169
- end
170
260
  end
171
261
  end
172
262
  end
@@ -128,12 +128,29 @@ module RuboCop
128
128
  string_args = string_args_to_string(node)
129
129
 
130
130
  args = "#{args}, #{size_attributes_to_string(size_attributes)}" if size_args.present?
131
- args = "#{args}, #{::Primer::Classify::Utilities.classes_to_args(classes)}" if classes.present?
131
+ args = "#{args}, #{utilities_args(classes)}" if classes.present?
132
132
  args = "#{args}, #{string_args}" if string_args.present?
133
133
 
134
134
  args
135
135
  end
136
136
 
137
+ def utilities_args(classes)
138
+ args = ::Primer::Classify::Utilities.classes_to_hash(classes)
139
+
140
+ color = case args[:color]
141
+ when :text_white
142
+ :text_white
143
+ when :text_link
144
+ :icon_info
145
+ when Symbol
146
+ args[:color].to_s.gsub("text_", "icon_").to_sym
147
+ end
148
+
149
+ args[:color] = color if color
150
+
151
+ ::Primer::Classify::Utilities.hash_to_args(args)
152
+ end
153
+
137
154
  def size_attributes_to_string(size_attributes)
138
155
  # No arguments if they map to the default size
139
156
  return if size_attributes.blank? || size_attributes.values.all?(&:blank?)
@@ -2,8 +2,6 @@
2
2
 
3
3
  require "rubocop"
4
4
  require "primer/classify/utilities"
5
- require "primer/view_components/statuses"
6
- require_relative "../../../../app/lib/primer/view_helper"
7
5
 
8
6
  # :nocov:
9
7
  module RuboCop
@@ -16,7 +14,7 @@ module RuboCop
16
14
  #
17
15
  # good
18
16
  # Component.new(mr: 1)
19
- class SystemArgumentInsteadOfClass < RuboCop::Cop::Cop
17
+ class SystemArgumentInsteadOfClass < BaseCop
20
18
  INVALID_MESSAGE = <<~STR
21
19
  Avoid using CSS classes when you can use System Arguments: https://primer.style/view-components/system-arguments.
22
20
  STR
@@ -53,18 +51,6 @@ module RuboCop
53
51
  corrector.replace(node.loc.expression, args)
54
52
  end
55
53
  end
56
-
57
- private
58
-
59
- # We only verify SystemArguments if it's a `.new` call on a component or
60
- # a ViewHleper call.
61
- def valid_node?(node)
62
- view_helpers.include?(node.method_name) || (node.method_name == :new && ::Primer::ViewComponents::STATUSES.key?(node.receiver.const_name))
63
- end
64
-
65
- def view_helpers
66
- ::Primer::ViewHelper::HELPERS.keys.map { |key| "primer_#{key}".to_sym }
67
- end
68
54
  end
69
55
  end
70
56
  end
data/lib/tasks/docs.rake CHANGED
@@ -40,7 +40,7 @@ namespace :docs do
40
40
  Primer::BlankslateComponent,
41
41
  Primer::BorderBoxComponent,
42
42
  Primer::BoxComponent,
43
- Primer::BreadcrumbComponent,
43
+ Primer::Beta::Breadcrumbs,
44
44
  Primer::ButtonComponent,
45
45
  Primer::ButtonGroup,
46
46
  Primer::Alpha::ButtonMarketing,
@@ -68,14 +68,15 @@ namespace :docs do
68
68
  Primer::SpinnerComponent,
69
69
  Primer::SubheadComponent,
70
70
  Primer::TabContainerComponent,
71
- Primer::TabNavComponent,
72
71
  Primer::Beta::Text,
73
72
  Primer::TimeAgoComponent,
74
73
  Primer::TimelineItemComponent,
75
74
  Primer::Tooltip,
76
75
  Primer::Truncate,
77
76
  Primer::Beta::Truncate,
78
- Primer::UnderlineNavComponent
77
+ Primer::Alpha::UnderlineNav,
78
+ Primer::Alpha::TabNav,
79
+ Primer::Alpha::TabPanels
79
80
  ]
80
81
 
81
82
  js_components = [
@@ -85,9 +86,9 @@ namespace :docs do
85
86
  Primer::Beta::AutoComplete,
86
87
  Primer::ClipboardCopy,
87
88
  Primer::TabContainerComponent,
88
- Primer::TabNavComponent,
89
89
  Primer::TimeAgoComponent,
90
- Primer::UnderlineNavComponent
90
+ Primer::Alpha::UnderlinePanels,
91
+ Primer::Alpha::TabPanels
91
92
  ]
92
93
 
93
94
  all_components = Primer::Component.descendants - [Primer::BaseComponent]
@@ -205,7 +206,7 @@ namespace :docs do
205
206
  f.puts
206
207
  f.puts("### `#{slot_documentation.name.to_s.capitalize}`")
207
208
 
208
- if slot_documentation.base_docstring.present?
209
+ if slot_documentation.base_docstring.to_s.present?
209
210
  f.puts
210
211
  f.puts(view_context.render(inline: slot_documentation.base_docstring))
211
212
  end