primer_view_components 0.0.64 → 0.0.65
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +694 -645
- data/app/components/primer/beta/blankslate.rb +1 -1
- data/app/components/primer/button_component.html.erb +1 -1
- data/app/components/primer/button_component.rb +12 -10
- data/app/components/primer/button_group.rb +8 -7
- data/app/components/primer/dropdown.rb +1 -1
- data/app/components/primer/flash_component.rb +1 -1
- data/app/components/primer/image.rb +2 -2
- data/app/components/primer/label_component.rb +23 -13
- data/app/components/primer/spinner_component.html.erb +2 -13
- data/app/components/primer/spinner_component.rb +6 -5
- data/lib/primer/classify/utilities.rb +8 -38
- data/lib/primer/view_components/linters/argument_mappers/button.rb +4 -4
- data/lib/primer/view_components/version.rb +1 -1
- data/lib/rubocop/cop/primer/deprecated_arguments.rb +1 -1
- data/lib/rubocop/cop/primer/deprecated_button_arguments.rb +51 -0
- data/lib/rubocop/cop/primer/deprecated_label_schemes.rb +68 -0
- data/lib/tasks/utilities.rake +15 -2
- data/static/arguments.yml +12 -3
- data/static/classes.yml +5 -4
- data/static/constants.json +20 -8
- metadata +5 -3
@@ -81,7 +81,7 @@ module Primer
|
|
81
81
|
system_arguments[:tag] = :a
|
82
82
|
system_arguments[:href] = href
|
83
83
|
system_arguments[:mt] = 5
|
84
|
-
system_arguments[:
|
84
|
+
system_arguments[:size] = :medium
|
85
85
|
system_arguments[:scheme] ||= :primary
|
86
86
|
|
87
87
|
Primer::ButtonComponent.new(**system_arguments)
|
@@ -1,3 +1,3 @@
|
|
1
1
|
<%= render Primer::BaseButton.new(**@system_arguments) do -%>
|
2
|
-
<%= leading_visual %><%= trimmed_content %><%= trailing_visual %><%= primer_octicon("triangle-down", mr: -1) if @dropdown %>
|
2
|
+
<%= leading_visual %><%= trimmed_content %><%= trailing_visual %><%= primer_octicon("triangle-down", ml: 2, mr: -1) if @dropdown %>
|
3
3
|
<% end -%>
|
@@ -17,12 +17,12 @@ module Primer
|
|
17
17
|
}.freeze
|
18
18
|
SCHEME_OPTIONS = SCHEME_MAPPINGS.keys
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
DEFAULT_SIZE = :medium
|
21
|
+
SIZE_MAPPINGS = {
|
22
22
|
:small => "btn-sm",
|
23
|
-
|
23
|
+
DEFAULT_SIZE => ""
|
24
24
|
}.freeze
|
25
|
-
|
25
|
+
SIZE_OPTIONS = SIZE_MAPPINGS.keys
|
26
26
|
|
27
27
|
# Leading visuals appear to the left of the button text.
|
28
28
|
#
|
@@ -64,9 +64,9 @@ module Primer
|
|
64
64
|
# <%= render(Primer::ButtonComponent.new(scheme: :invisible)) { "Invisible" } %>
|
65
65
|
# <%= render(Primer::ButtonComponent.new(scheme: :link)) { "Link" } %>
|
66
66
|
#
|
67
|
-
# @example
|
68
|
-
# <%= render(Primer::ButtonComponent.new(
|
69
|
-
# <%= render(Primer::ButtonComponent.new(
|
67
|
+
# @example Sizes
|
68
|
+
# <%= render(Primer::ButtonComponent.new(size: :small)) { "Small" } %>
|
69
|
+
# <%= render(Primer::ButtonComponent.new(size: :medium)) { "Medium" } %>
|
70
70
|
#
|
71
71
|
# @example Block
|
72
72
|
# <%= render(Primer::ButtonComponent.new(block: :true)) { "Block" } %>
|
@@ -97,7 +97,8 @@ module Primer
|
|
97
97
|
# <% end %>
|
98
98
|
#
|
99
99
|
# @param scheme [Symbol] <%= one_of(Primer::ButtonComponent::SCHEME_OPTIONS) %>
|
100
|
-
# @param variant [Symbol] <%= one_of(Primer::ButtonComponent::
|
100
|
+
# @param variant [Symbol] DEPRECATED. <%= one_of(Primer::ButtonComponent::SIZE_OPTIONS) %>
|
101
|
+
# @param size [Symbol] <%= one_of(Primer::ButtonComponent::SIZE_OPTIONS) %>
|
101
102
|
# @param tag [Symbol] (Primer::BaseButton::DEFAULT_TAG) <%= one_of(Primer::BaseButton::TAG_OPTIONS) %>
|
102
103
|
# @param type [Symbol] (Primer::BaseButton::DEFAULT_TYPE) <%= one_of(Primer::BaseButton::TYPE_OPTIONS) %>
|
103
104
|
# @param group_item [Boolean] Whether button is part of a ButtonGroup.
|
@@ -106,7 +107,8 @@ module Primer
|
|
106
107
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
107
108
|
def initialize(
|
108
109
|
scheme: DEFAULT_SCHEME,
|
109
|
-
variant:
|
110
|
+
variant: nil,
|
111
|
+
size: DEFAULT_SIZE,
|
110
112
|
group_item: false,
|
111
113
|
block: false,
|
112
114
|
dropdown: false,
|
@@ -119,7 +121,7 @@ module Primer
|
|
119
121
|
@system_arguments[:classes] = class_names(
|
120
122
|
system_arguments[:classes],
|
121
123
|
SCHEME_MAPPINGS[fetch_or_fallback(SCHEME_OPTIONS, scheme, DEFAULT_SCHEME)],
|
122
|
-
|
124
|
+
SIZE_MAPPINGS[fetch_or_fallback(SIZE_OPTIONS, variant || size, DEFAULT_SIZE)],
|
123
125
|
"btn" => !link?,
|
124
126
|
"btn-block" => block,
|
125
127
|
"BtnGroup-item" => group_item
|
@@ -7,10 +7,10 @@ module Primer
|
|
7
7
|
|
8
8
|
# Required list of buttons to be rendered.
|
9
9
|
#
|
10
|
-
# @param kwargs [Hash] The same arguments as <%= link_to_component(Primer::ButtonComponent) %> except for `
|
10
|
+
# @param kwargs [Hash] The same arguments as <%= link_to_component(Primer::ButtonComponent) %> except for `size` and `group_item`.
|
11
11
|
renders_many :buttons, lambda { |**kwargs|
|
12
12
|
kwargs[:group_item] = true
|
13
|
-
kwargs[:
|
13
|
+
kwargs[:size] = @size
|
14
14
|
|
15
15
|
Primer::ButtonComponent.new(**kwargs)
|
16
16
|
}
|
@@ -25,19 +25,20 @@ module Primer
|
|
25
25
|
# <% component.button(classes: "custom-class") { "Custom class" } %>
|
26
26
|
# <% end %>
|
27
27
|
#
|
28
|
-
# @example
|
28
|
+
# @example Sizes
|
29
29
|
#
|
30
|
-
# <%= render(Primer::ButtonGroup.new(
|
30
|
+
# <%= render(Primer::ButtonGroup.new(size: :small)) do |component| %>
|
31
31
|
# <% component.button { "Default" } %>
|
32
32
|
# <% component.button(scheme: :primary) { "Primary" } %>
|
33
33
|
# <% component.button(scheme: :danger) { "Danger" } %>
|
34
34
|
# <% component.button(scheme: :outline) { "Outline" } %>
|
35
35
|
# <% end %>
|
36
36
|
#
|
37
|
-
# @param variant [Symbol] <%= one_of(Primer::ButtonComponent::
|
37
|
+
# @param variant [Symbol] DEPRECATED. <%= one_of(Primer::ButtonComponent::SIZE_OPTIONS) %>
|
38
|
+
# @param size [Symbol] <%= one_of(Primer::ButtonComponent::SIZE_OPTIONS) %>
|
38
39
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
39
|
-
def initialize(variant: Primer::ButtonComponent::
|
40
|
-
@
|
40
|
+
def initialize(variant: nil, size: Primer::ButtonComponent::DEFAULT_SIZE, **system_arguments)
|
41
|
+
@size = variant || size
|
41
42
|
@system_arguments = deny_tag_argument(**system_arguments)
|
42
43
|
@system_arguments[:tag] = :div
|
43
44
|
|
@@ -42,7 +42,7 @@ module Primer
|
|
42
42
|
# <%= render(Primer::FlashComponent.new) do |component| %>
|
43
43
|
# This is a flash message with actions!
|
44
44
|
# <% component.action do %>
|
45
|
-
# <%= render(Primer::ButtonComponent.new(
|
45
|
+
# <%= render(Primer::ButtonComponent.new(size: :small)) { "Take action" } %>
|
46
46
|
# <% end %>
|
47
47
|
# <% end %>
|
48
48
|
#
|
@@ -29,8 +29,8 @@ module Primer
|
|
29
29
|
def initialize(src:, alt:, lazy: false, **system_arguments)
|
30
30
|
@system_arguments = deny_tag_argument(**system_arguments)
|
31
31
|
|
32
|
+
@src = src
|
32
33
|
@system_arguments[:tag] = :img
|
33
|
-
@system_arguments[:src] = src
|
34
34
|
@system_arguments[:alt] = alt
|
35
35
|
|
36
36
|
return unless lazy
|
@@ -40,7 +40,7 @@ module Primer
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def call
|
43
|
-
render(Primer::BaseComponent.new(**@system_arguments))
|
43
|
+
render(Primer::BaseComponent.new(src: image_path(@src), **@system_arguments))
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
@@ -11,19 +11,26 @@ module Primer
|
|
11
11
|
DEFAULT_TAG = :span
|
12
12
|
TAG_OPTIONS = [DEFAULT_TAG, :summary, :a, :div].freeze
|
13
13
|
|
14
|
+
DEFAULT_SCHEME = :default
|
14
15
|
SCHEME_MAPPINGS = {
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
DEFAULT_SCHEME => "",
|
17
|
+
:primary => "Label--primary",
|
18
|
+
:secondary => "Label--secondary",
|
19
|
+
:accent => "Label--accent",
|
20
|
+
:success => "Label--success",
|
21
|
+
:attention => "Label--attention",
|
22
|
+
:danger => "Label--danger",
|
23
|
+
:severe => "Label--severe",
|
24
|
+
:done => "Label--done",
|
25
|
+
:sponsors => "Label--sponsors",
|
21
26
|
# deprecated
|
22
|
-
|
23
|
-
|
27
|
+
:info => "Label--info",
|
28
|
+
:warning => "Label--warning",
|
29
|
+
:orange => "Label--orange",
|
30
|
+
:purple => "Label--purple"
|
24
31
|
}.freeze
|
25
|
-
DEPRECATED_SCHEME_OPTIONS = [:orange, :purple].freeze
|
26
|
-
SCHEME_OPTIONS = (
|
32
|
+
DEPRECATED_SCHEME_OPTIONS = [:info, :warning, :orange, :purple].freeze
|
33
|
+
SCHEME_OPTIONS = (SCHEME_MAPPINGS.keys - DEPRECATED_SCHEME_OPTIONS).freeze
|
27
34
|
|
28
35
|
VARIANT_MAPPINGS = {
|
29
36
|
large: "Label--large",
|
@@ -35,10 +42,13 @@ module Primer
|
|
35
42
|
# <%= render(Primer::LabelComponent.new) { "Default" } %>
|
36
43
|
# <%= render(Primer::LabelComponent.new(scheme: :primary)) { "Primary" } %>
|
37
44
|
# <%= render(Primer::LabelComponent.new(scheme: :secondary)) { "Secondary" } %>
|
38
|
-
# <%= render(Primer::LabelComponent.new(scheme: :
|
45
|
+
# <%= render(Primer::LabelComponent.new(scheme: :accent)) { "Accent" } %>
|
39
46
|
# <%= render(Primer::LabelComponent.new(scheme: :success)) { "Success" } %>
|
40
|
-
# <%= render(Primer::LabelComponent.new(scheme: :
|
47
|
+
# <%= render(Primer::LabelComponent.new(scheme: :attention)) { "Attention" } %>
|
41
48
|
# <%= render(Primer::LabelComponent.new(scheme: :danger)) { "Danger" } %>
|
49
|
+
# <%= render(Primer::LabelComponent.new(scheme: :severe)) { "Severe" } %>
|
50
|
+
# <%= render(Primer::LabelComponent.new(scheme: :done)) { "Done" } %>
|
51
|
+
# <%= render(Primer::LabelComponent.new(scheme: :sponsors)) { "Sponsors" } %>
|
42
52
|
#
|
43
53
|
# @example Variants
|
44
54
|
# <%= render(Primer::LabelComponent.new) { "Default" } %>
|
@@ -48,7 +58,7 @@ module Primer
|
|
48
58
|
# @param scheme [Symbol] <%= one_of(Primer::LabelComponent::SCHEME_MAPPINGS.keys) %>
|
49
59
|
# @param variant [Symbol] <%= one_of(Primer::LabelComponent::VARIANT_OPTIONS) %>
|
50
60
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
51
|
-
def initialize(tag: DEFAULT_TAG, scheme:
|
61
|
+
def initialize(tag: DEFAULT_TAG, scheme: DEFAULT_SCHEME, variant: nil, **system_arguments)
|
52
62
|
@system_arguments = system_arguments
|
53
63
|
@system_arguments[:tag] = fetch_or_fallback(TAG_OPTIONS, tag, DEFAULT_TAG)
|
54
64
|
@system_arguments[:classes] = class_names(
|
@@ -1,15 +1,4 @@
|
|
1
1
|
<%= render Primer::BaseComponent.new(**@system_arguments) do %>
|
2
|
-
<
|
3
|
-
|
4
|
-
tag: :svg,
|
5
|
-
viewBox: '0 0 16 16',
|
6
|
-
fill: :none,
|
7
|
-
animation: :rotate,
|
8
|
-
width: @size,
|
9
|
-
height: @size,
|
10
|
-
vertical_align: :bottom
|
11
|
-
) do %>
|
12
|
-
<circle cx="8" cy="8" r="7" stroke="currentColor" stroke-opacity="0.25" stroke-width="2" vector-effect="non-scaling-stroke" />
|
13
|
-
<path d="M15 8a7.002 7.002 0 00-7-7" stroke="currentColor" stroke-width="2" stroke-linecap="round" vector-effect="non-scaling-stroke" />
|
14
|
-
<% end %>
|
2
|
+
<circle cx="8" cy="8" r="7" stroke="currentColor" stroke-opacity="0.25" stroke-width="2" vector-effect="non-scaling-stroke" />
|
3
|
+
<path d="M15 8a7.002 7.002 0 00-7-7" stroke="currentColor" stroke-width="2" stroke-linecap="round" vector-effect="non-scaling-stroke" />
|
15
4
|
<% end %>
|
@@ -31,12 +31,13 @@ module Primer
|
|
31
31
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
32
32
|
def initialize(size: DEFAULT_SIZE, style: DEFAULT_STYLE, **system_arguments)
|
33
33
|
@system_arguments = deny_tag_argument(**system_arguments)
|
34
|
-
@system_arguments[:tag] = :
|
35
|
-
@system_arguments[:role] = :status
|
36
|
-
@system_arguments[:display] = :inline_block
|
34
|
+
@system_arguments[:tag] = :svg
|
37
35
|
@system_arguments[:style] ||= style
|
38
|
-
|
39
|
-
@
|
36
|
+
@system_arguments[:animation] = :rotate
|
37
|
+
@system_arguments[:width] = SIZE_MAPPINGS[fetch_or_fallback(SIZE_OPTIONS, size, DEFAULT_SIZE)]
|
38
|
+
@system_arguments[:height] = SIZE_MAPPINGS[fetch_or_fallback(SIZE_OPTIONS, size, DEFAULT_SIZE)]
|
39
|
+
@system_arguments[:viewBox] = "0 0 16 16"
|
40
|
+
@system_arguments[:fill] = :none
|
40
41
|
end
|
41
42
|
end
|
42
43
|
end
|
@@ -19,20 +19,6 @@ module Primer
|
|
19
19
|
|
20
20
|
BREAKPOINTS = ["", "-sm", "-md", "-lg", "-xl"].freeze
|
21
21
|
|
22
|
-
# Replacements for some classnames that end up being a different argument key
|
23
|
-
REPLACEMENT_KEYS = {
|
24
|
-
"^anim" => "animation",
|
25
|
-
"^v-align" => "vertical_align",
|
26
|
-
"^d" => "display",
|
27
|
-
"^wb" => "word_break",
|
28
|
-
"^v" => "visibility",
|
29
|
-
"^width" => "w",
|
30
|
-
"^height" => "h",
|
31
|
-
"^color-bg" => "bg",
|
32
|
-
"^color-border" => "border_color",
|
33
|
-
"^color-fg" => "color"
|
34
|
-
}.freeze
|
35
|
-
|
36
22
|
SUPPORTED_KEY_CACHE = Hash.new { |h, k| h[k] = !UTILITIES[k].nil? }
|
37
23
|
BREAKPOINT_INDEX_CACHE = Hash.new { |h, k| h[k] = BREAKPOINTS.index(k) }
|
38
24
|
|
@@ -173,31 +159,15 @@ module Primer
|
|
173
159
|
private
|
174
160
|
|
175
161
|
def find_selector(selector)
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
value_hash.each do |key_argument, classnames|
|
184
|
-
# Skip each value hash until we get one with the selector
|
185
|
-
next unless classnames.include?(selector)
|
186
|
-
|
187
|
-
# Return [:mr, 0, 1]
|
188
|
-
# has index of classname, so we can match it up with responsive array `mr: [nil, 0]`
|
189
|
-
return [key, key_argument, classnames.index(selector)]
|
190
|
-
end
|
191
|
-
|
192
|
-
nil
|
193
|
-
end
|
194
|
-
|
195
|
-
def infer_selector_key(selector)
|
196
|
-
REPLACEMENT_KEYS.each do |k, v|
|
197
|
-
return v.to_sym if selector.match?(Regexp.new(k))
|
162
|
+
# Build hash indexed on the selector for fast lookup.
|
163
|
+
@selector_cache ||= UTILITIES.each_with_object({}) do |(keyword, argument_w_selectors), dict|
|
164
|
+
argument_w_selectors.each do |argument, selectors|
|
165
|
+
selectors.each_with_index do |css_selector, index|
|
166
|
+
dict[css_selector] = [keyword, argument, index]
|
167
|
+
end
|
168
|
+
end
|
198
169
|
end
|
199
|
-
|
200
|
-
selector.split("-").first.to_sym
|
170
|
+
@selector_cache[selector]
|
201
171
|
end
|
202
172
|
end
|
203
173
|
end
|
@@ -13,9 +13,9 @@ module ERBLint
|
|
13
13
|
symbolize: true
|
14
14
|
).freeze
|
15
15
|
|
16
|
-
|
16
|
+
SIZE_MAPPINGS = Primer::ViewComponents::Constants.get(
|
17
17
|
component: "Primer::ButtonComponent",
|
18
|
-
constant: "
|
18
|
+
constant: "SIZE_MAPPINGS",
|
19
19
|
symbolize: true
|
20
20
|
).freeze
|
21
21
|
|
@@ -55,8 +55,8 @@ module ERBLint
|
|
55
55
|
|
56
56
|
if SCHEME_MAPPINGS[class_name] && acc[:scheme].nil?
|
57
57
|
acc[:scheme] = SCHEME_MAPPINGS[class_name]
|
58
|
-
elsif
|
59
|
-
acc[:
|
58
|
+
elsif SIZE_MAPPINGS[class_name] && acc[:size].nil?
|
59
|
+
acc[:size] = SIZE_MAPPINGS[class_name]
|
60
60
|
elsif class_name == "btn-block"
|
61
61
|
acc[:block] = true
|
62
62
|
elsif class_name == "BtnGroup-item"
|
@@ -22,7 +22,7 @@ module RuboCop
|
|
22
22
|
#
|
23
23
|
# * The top level key is the argument.
|
24
24
|
# * The second level key is the value.
|
25
|
-
# * The
|
25
|
+
# * The second level value is a string of the full replacement. e.g. "new_argument: :new_value"
|
26
26
|
# If the value is nil, then there is no replacement.
|
27
27
|
#
|
28
28
|
# e.g.
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rubocop"
|
4
|
+
|
5
|
+
# :nocov:
|
6
|
+
module RuboCop
|
7
|
+
module Cop
|
8
|
+
module Primer
|
9
|
+
# This cop ensures that `ButtonComponent` doesn't use deprecated arguments.
|
10
|
+
#
|
11
|
+
# bad
|
12
|
+
# ButtonComponent.new(variant: :small)
|
13
|
+
#
|
14
|
+
# good
|
15
|
+
# ButtonComponent.new(size: :small)
|
16
|
+
class DeprecatedButtonArguments < BaseCop
|
17
|
+
INVALID_MESSAGE = <<~STR
|
18
|
+
`variant` is deprecated. Use `size` instead.
|
19
|
+
STR
|
20
|
+
|
21
|
+
def_node_matcher :button_component?, <<~PATTERN
|
22
|
+
(send (const (const nil? :Primer) :ButtonComponent) :new ...)
|
23
|
+
PATTERN
|
24
|
+
|
25
|
+
DEPRECATIONS = {
|
26
|
+
variant: :size
|
27
|
+
}.freeze
|
28
|
+
|
29
|
+
def on_send(node)
|
30
|
+
return unless button_component?(node)
|
31
|
+
|
32
|
+
kwargs = node.arguments.last
|
33
|
+
|
34
|
+
return if kwargs.nil?
|
35
|
+
|
36
|
+
pair = kwargs.pairs.find { |x| x.key.value == :variant }
|
37
|
+
|
38
|
+
return if pair.nil?
|
39
|
+
|
40
|
+
add_offense(pair.key, message: INVALID_MESSAGE)
|
41
|
+
end
|
42
|
+
|
43
|
+
def autocorrect(node)
|
44
|
+
lambda do |corrector|
|
45
|
+
corrector.replace(node, DEPRECATIONS[node.value])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rubocop"
|
4
|
+
|
5
|
+
# :nocov:
|
6
|
+
module RuboCop
|
7
|
+
module Cop
|
8
|
+
module Primer
|
9
|
+
# This cop ensures that components don't use deprecated `Label` schemes.
|
10
|
+
#
|
11
|
+
# bad
|
12
|
+
# Primer::LabelComponent.new(scheme: :info)
|
13
|
+
#
|
14
|
+
# good
|
15
|
+
# Primer::LabelComponent.new(scheme: :accent)
|
16
|
+
class DeprecatedLabelSchemes < BaseCop
|
17
|
+
INVALID_MESSAGE = <<~STR
|
18
|
+
Avoid using deprecated schemes: https://primer.style/view-components/deprecated#labelcomponent.
|
19
|
+
STR
|
20
|
+
|
21
|
+
# This is a hash of deprecated schemes and their replacements.
|
22
|
+
DEPRECATIONS = {
|
23
|
+
info: ":accent",
|
24
|
+
warning: ":attention",
|
25
|
+
orange: ":severe",
|
26
|
+
purple: ":done"
|
27
|
+
}.freeze
|
28
|
+
|
29
|
+
def on_send(node)
|
30
|
+
return unless label_node?(node)
|
31
|
+
return unless node.arguments?
|
32
|
+
|
33
|
+
# we are looking for hash arguments and they are always last
|
34
|
+
kwargs = node.arguments.last
|
35
|
+
|
36
|
+
return unless kwargs.type == :hash
|
37
|
+
|
38
|
+
kwargs.pairs.each do |pair|
|
39
|
+
# Skip if we're not dealing with a symbol
|
40
|
+
next if pair.key.type != :sym
|
41
|
+
next unless pair.value.type == :sym || pair.value.type == :str
|
42
|
+
|
43
|
+
value = pair.value.value.to_sym
|
44
|
+
|
45
|
+
next unless DEPRECATIONS.key?(value)
|
46
|
+
|
47
|
+
add_offense(pair.value, message: INVALID_MESSAGE)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def autocorrect(node)
|
52
|
+
lambda do |corrector|
|
53
|
+
replacement = DEPRECATIONS[node.value.to_sym]
|
54
|
+
corrector.replace(node, replacement)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def label_node?(node)
|
61
|
+
return if node.nil?
|
62
|
+
|
63
|
+
node.method_name == :new && !node.receiver.nil? && node.receiver.const_name == "Primer::LabelComponent"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/tasks/utilities.rake
CHANGED
@@ -5,7 +5,6 @@ namespace :utilities do
|
|
5
5
|
require "yaml"
|
6
6
|
require "json"
|
7
7
|
require File.expand_path("./../../demo/config/environment.rb", __dir__)
|
8
|
-
require "primer/classify/utilities"
|
9
8
|
|
10
9
|
# Keys that are looked for to be included in the utilities.yml file
|
11
10
|
# rubocop:disable Lint/ConstantDefinitionInBlock
|
@@ -29,6 +28,20 @@ namespace :utilities do
|
|
29
28
|
/^v\b/
|
30
29
|
].freeze
|
31
30
|
|
31
|
+
# Replacements for some classnames that end up being a different argument key
|
32
|
+
REPLACEMENT_KEYS = {
|
33
|
+
"^anim" => "animation",
|
34
|
+
"^v-align" => "vertical_align",
|
35
|
+
"^d" => "display",
|
36
|
+
"^wb" => "word_break",
|
37
|
+
"^v" => "visibility",
|
38
|
+
"^width" => "w",
|
39
|
+
"^height" => "h",
|
40
|
+
"^color-bg" => "bg",
|
41
|
+
"^color-border" => "border_color",
|
42
|
+
"^color-fg" => "color"
|
43
|
+
}.freeze
|
44
|
+
|
32
45
|
BREAKPOINTS = [nil, "sm", "md", "lg", "xl"].freeze
|
33
46
|
# rubocop:enable Lint/ConstantDefinitionInBlock
|
34
47
|
|
@@ -67,7 +80,7 @@ namespace :utilities do
|
|
67
80
|
key = ""
|
68
81
|
|
69
82
|
# Look for a replacement key
|
70
|
-
|
83
|
+
REPLACEMENT_KEYS.each do |k, v|
|
71
84
|
next unless classname.match?(Regexp.new(k))
|
72
85
|
|
73
86
|
key = v
|
data/static/arguments.yml
CHANGED
@@ -324,6 +324,10 @@
|
|
324
324
|
description: One of `:danger`, `:default`, `:invisible`, `:link`, `:outline`,
|
325
325
|
or `:primary`.
|
326
326
|
- name: variant
|
327
|
+
type: Symbol
|
328
|
+
default: "`nil`"
|
329
|
+
description: DEPRECATED. One of `:medium` and `:small`.
|
330
|
+
- name: size
|
327
331
|
type: Symbol
|
328
332
|
default: "`:medium`"
|
329
333
|
description: One of `:medium` and `:small`.
|
@@ -355,6 +359,10 @@
|
|
355
359
|
source: https://github.com/primer/view_components/tree/main/app/components/primer/button_group.rb
|
356
360
|
parameters:
|
357
361
|
- name: variant
|
362
|
+
type: Symbol
|
363
|
+
default: "`nil`"
|
364
|
+
description: DEPRECATED. One of `:medium` and `:small`.
|
365
|
+
- name: size
|
358
366
|
type: Symbol
|
359
367
|
default: "`:medium`"
|
360
368
|
description: One of `:medium` and `:small`.
|
@@ -655,9 +663,10 @@
|
|
655
663
|
description: One of `:a`, `:div`, `:span`, or `:summary`.
|
656
664
|
- name: scheme
|
657
665
|
type: Symbol
|
658
|
-
default: "`
|
659
|
-
description: One of `:
|
660
|
-
`:
|
666
|
+
default: "`:default`"
|
667
|
+
description: One of `:accent`, `:attention`, `:danger`, `:default`, `:done`, `:info`,
|
668
|
+
`:orange`, `:primary`, `:purple`, `:secondary`, `:severe`, `:sponsors`, `:success`,
|
669
|
+
or `:warning`.
|
661
670
|
- name: variant
|
662
671
|
type: Symbol
|
663
672
|
default: "`nil`"
|
data/static/classes.yml
CHANGED
@@ -20,13 +20,16 @@
|
|
20
20
|
- ".Counter--primary"
|
21
21
|
- ".Counter--secondary"
|
22
22
|
- ".Label"
|
23
|
+
- ".Label--accent"
|
24
|
+
- ".Label--attention"
|
23
25
|
- ".Label--danger"
|
24
|
-
- ".Label--
|
26
|
+
- ".Label--done"
|
25
27
|
- ".Label--large"
|
26
28
|
- ".Label--primary"
|
27
29
|
- ".Label--secondary"
|
30
|
+
- ".Label--severe"
|
31
|
+
- ".Label--sponsors"
|
28
32
|
- ".Label--success"
|
29
|
-
- ".Label--warning"
|
30
33
|
- ".Layout"
|
31
34
|
- ".Layout--flowRow-until-lg"
|
32
35
|
- ".Layout--flowRow-until-md"
|
@@ -191,7 +194,6 @@
|
|
191
194
|
- ".pr-2"
|
192
195
|
- ".pt-5"
|
193
196
|
- ".right-0"
|
194
|
-
- ".sr-only"
|
195
197
|
- ".tabnav"
|
196
198
|
- ".tabnav-tab"
|
197
199
|
- ".tabnav-tabs"
|
@@ -202,4 +204,3 @@
|
|
202
204
|
- ".tooltipped-n"
|
203
205
|
- ".tooltipped-no-delay"
|
204
206
|
- ".tooltipped-s"
|
205
|
-
- ".v-align-bottom"
|
data/static/constants.json
CHANGED
@@ -279,7 +279,7 @@
|
|
279
279
|
},
|
280
280
|
"Primer::ButtonComponent": {
|
281
281
|
"DEFAULT_SCHEME": "default",
|
282
|
-
"
|
282
|
+
"DEFAULT_SIZE": "medium",
|
283
283
|
"LINK_SCHEME": "link",
|
284
284
|
"SCHEME_MAPPINGS": {
|
285
285
|
"default": "",
|
@@ -297,11 +297,11 @@
|
|
297
297
|
"invisible",
|
298
298
|
"link"
|
299
299
|
],
|
300
|
-
"
|
300
|
+
"SIZE_MAPPINGS": {
|
301
301
|
"small": "btn-sm",
|
302
302
|
"medium": ""
|
303
303
|
},
|
304
|
-
"
|
304
|
+
"SIZE_OPTIONS": [
|
305
305
|
"small",
|
306
306
|
"medium"
|
307
307
|
]
|
@@ -504,29 +504,41 @@
|
|
504
504
|
"Primer::ImageCrop": {
|
505
505
|
},
|
506
506
|
"Primer::LabelComponent": {
|
507
|
+
"DEFAULT_SCHEME": "default",
|
507
508
|
"DEFAULT_TAG": "span",
|
508
509
|
"DEPRECATED_SCHEME_OPTIONS": [
|
510
|
+
"info",
|
511
|
+
"warning",
|
509
512
|
"orange",
|
510
513
|
"purple"
|
511
514
|
],
|
512
515
|
"SCHEME_MAPPINGS": {
|
516
|
+
"default": "",
|
513
517
|
"primary": "Label--primary",
|
514
518
|
"secondary": "Label--secondary",
|
515
|
-
"
|
519
|
+
"accent": "Label--accent",
|
516
520
|
"success": "Label--success",
|
517
|
-
"
|
521
|
+
"attention": "Label--attention",
|
518
522
|
"danger": "Label--danger",
|
523
|
+
"severe": "Label--severe",
|
524
|
+
"done": "Label--done",
|
525
|
+
"sponsors": "Label--sponsors",
|
526
|
+
"info": "Label--info",
|
527
|
+
"warning": "Label--warning",
|
519
528
|
"orange": "Label--orange",
|
520
529
|
"purple": "Label--purple"
|
521
530
|
},
|
522
531
|
"SCHEME_OPTIONS": [
|
532
|
+
"default",
|
523
533
|
"primary",
|
524
534
|
"secondary",
|
525
|
-
"
|
535
|
+
"accent",
|
526
536
|
"success",
|
527
|
-
"
|
537
|
+
"attention",
|
528
538
|
"danger",
|
529
|
-
|
539
|
+
"severe",
|
540
|
+
"done",
|
541
|
+
"sponsors"
|
530
542
|
],
|
531
543
|
"TAG_OPTIONS": [
|
532
544
|
"span",
|