primer_view_components 0.0.64 → 0.0.65
Sign up to get free protection for your applications and to get access to all the features.
- 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",
|