primer_view_components 0.0.61 → 0.0.62
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 +44 -2
- data/app/components/primer/alpha/border_box/header.rb +1 -2
- data/app/components/primer/alpha/button_marketing.rb +4 -4
- data/app/components/primer/alpha/tab_nav.rb +1 -1
- data/app/components/primer/alpha/tab_panels.rb +2 -2
- data/app/components/primer/alpha/underline_nav.rb +2 -1
- data/app/components/primer/alpha/underline_panels.rb +2 -2
- data/app/components/primer/base_component.rb +8 -36
- data/app/components/primer/beta/auto_complete/item.rb +1 -1
- data/app/components/primer/beta/auto_complete.rb +4 -2
- data/app/components/primer/beta/avatar.rb +1 -1
- data/app/components/primer/beta/blankslate.html.erb +2 -2
- data/app/components/primer/beta/blankslate.rb +6 -3
- data/app/components/primer/beta/breadcrumbs.rb +2 -2
- data/app/components/primer/beta/text.rb +1 -1
- data/app/components/primer/border_box_component.rb +1 -1
- data/app/components/primer/box_component.rb +3 -2
- data/app/components/primer/button_component.html.erb +3 -9
- data/app/components/primer/button_component.rb +21 -2
- data/app/components/primer/button_group.rb +1 -1
- data/app/components/primer/clipboard_copy.rb +1 -1
- data/app/components/primer/close_button.rb +1 -1
- data/app/components/primer/component.rb +71 -0
- data/app/components/primer/counter_component.rb +1 -1
- data/app/components/primer/details_component.rb +1 -1
- data/app/components/primer/dropdown/menu.rb +1 -1
- data/app/components/primer/dropdown.html.erb +0 -1
- data/app/components/primer/dropdown.rb +1 -0
- data/app/components/primer/dropdown_menu_component.rb +1 -1
- data/app/components/primer/flash_component.rb +2 -1
- data/app/components/primer/flex_component.rb +16 -16
- data/app/components/primer/flex_item_component.rb +1 -1
- data/app/components/primer/hellip_button.rb +1 -1
- data/app/components/primer/hidden_text_expander.rb +1 -1
- data/app/components/primer/image.rb +1 -1
- data/app/components/primer/image_crop.rb +2 -1
- data/app/components/primer/layout_component.rb +1 -0
- data/app/components/primer/local_time.rb +1 -1
- data/app/components/primer/markdown.rb +1 -1
- data/app/components/primer/menu_component.rb +2 -1
- data/app/components/primer/navigation/tab_component.rb +1 -0
- data/app/components/primer/octicon_symbols_component.rb +2 -2
- data/app/components/primer/popover_component.rb +1 -1
- data/app/components/primer/progress_bar_component.rb +7 -6
- data/app/components/primer/spinner_component.rb +1 -1
- data/app/components/primer/subhead_component.rb +3 -1
- data/app/components/primer/tab_container_component.rb +1 -1
- data/app/components/primer/time_ago_component.rb +1 -1
- data/app/components/primer/timeline_item_component.rb +4 -3
- data/app/components/primer/tooltip.rb +1 -0
- data/lib/primer/classify/utilities.rb +26 -23
- data/lib/primer/classify/utilities.yml +192 -68
- data/lib/primer/classify.rb +92 -178
- data/lib/primer/view_components/linters/blankslate_api_migration.rb +11 -5
- data/lib/primer/view_components/version.rb +1 -1
- data/lib/rubocop/cop/primer/deprecated_layout_component.rb +30 -0
- data/lib/rubocop/cop/primer/primer_octicon.rb +1 -3
- data/lib/tasks/custom_utilities.yml +192 -0
- data/lib/tasks/docs.rake +1 -1
- data/lib/tasks/utilities.rake +6 -2
- data/static/classes.yml +14 -14
- data/static/constants.json +3 -3
- metadata +4 -4
- data/lib/primer/classify/cache.rb +0 -109
- data/lib/primer/classify/flex.rb +0 -111
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: adce588d18cdf5a429f1cfbf22474252e3bfb96e929c7a991590069b38d7a8c6
|
4
|
+
data.tar.gz: d7c0ada1fa78d39d82b7beb6ef90b1900b923a4fcc0a401f5dc14a0f7e8d157e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d7a91266039e243395f6a630a1fa7838e1ca8cc6a038e66f22ad286e2b80e7c937408ce6f2f71bd3c2474680818d2a6fd0017a1ccc390432a83a331564309c8
|
7
|
+
data.tar.gz: 4f9d8101365c03c8fe01cd9b18da13ea6d602e93469511dd3d8b0792861f8d9f34a78b4a6137e6d80ebfa67c0387e46dd3fd391c6547cf232accc24536310b21
|
data/CHANGELOG.md
CHANGED
@@ -30,6 +30,48 @@ The category for changes related to documentation, testing and tooling. Also, fo
|
|
30
30
|
|
31
31
|
## main
|
32
32
|
|
33
|
+
## 0.0.62
|
34
|
+
|
35
|
+
### New
|
36
|
+
|
37
|
+
* Add linter for tracking deprecated `LayoutComponent` callsites
|
38
|
+
|
39
|
+
*Josh Klina*
|
40
|
+
|
41
|
+
### Updates
|
42
|
+
|
43
|
+
* Update `Button` to add `8px` spacing between icon, text and counter.
|
44
|
+
|
45
|
+
*Manuel Puyol*
|
46
|
+
|
47
|
+
* Update `BlankslateApiMigration` linter to support interpolations.
|
48
|
+
|
49
|
+
*Manuel Puyol*
|
50
|
+
|
51
|
+
* Change spacing in `Blankslate`:
|
52
|
+
* Between `description` and `primary_action` to `32px`.
|
53
|
+
* Between `primary_action` and `secondary_action` to `16px`.
|
54
|
+
|
55
|
+
*Manuel Puyol*
|
56
|
+
|
57
|
+
* Improve performance of `Classify#call`.
|
58
|
+
|
59
|
+
*Cameron Dutro*
|
60
|
+
|
61
|
+
### Breaking Changes
|
62
|
+
|
63
|
+
* Add a warning to users if they try to use `tag:` parameters on a component where the tag is fixed
|
64
|
+
|
65
|
+
*Owen Niblock*
|
66
|
+
|
67
|
+
* Updating to @primer/css@19.0.0 and @primer/primitives@7.1.0. Which removes support for deprecated system color arguments
|
68
|
+
|
69
|
+
*Jon Rohan*
|
70
|
+
|
71
|
+
* Prevent `aria-label` to be used with `:div, :span, :p` tags without an explicit `role`.
|
72
|
+
|
73
|
+
*Manuel Puyol*
|
74
|
+
|
33
75
|
## 0.0.61
|
34
76
|
|
35
77
|
### New
|
@@ -48,7 +90,7 @@ The category for changes related to documentation, testing and tooling. Also, fo
|
|
48
90
|
|
49
91
|
### Updates
|
50
92
|
|
51
|
-
* Bump Storybook version to include Skip to Content links for keyboard auditors
|
93
|
+
* Bump Storybook version to include Skip to Content links for keyboard auditors.
|
52
94
|
|
53
95
|
*Katie Foster @inkblotty*
|
54
96
|
|
@@ -68,7 +110,7 @@ The category for changes related to documentation, testing and tooling. Also, fo
|
|
68
110
|
|
69
111
|
### Bug Fixes
|
70
112
|
|
71
|
-
* Fix issue where tags were not self-closing when they are void elements
|
113
|
+
* Fix issue where tags were not self-closing when they are void elements.
|
72
114
|
|
73
115
|
*Owen Niblock*
|
74
116
|
|
@@ -3,8 +3,7 @@
|
|
3
3
|
module Primer
|
4
4
|
module Alpha
|
5
5
|
module BorderBox
|
6
|
-
# BorderBox::Header
|
7
|
-
# Optional title slot
|
6
|
+
# `BorderBox::Header` is used inside `BorderBox` to render its header slot.
|
8
7
|
#
|
9
8
|
# @accessibility When using `header.title`, set `tag` to one of `h1`, `h2`, `h3`, etc. based on what is appropriate for the page context. <%= link_to_heading_practices %>
|
10
9
|
class Header < Primer::Component
|
@@ -7,9 +7,9 @@ module Primer
|
|
7
7
|
DEFAULT_SCHEME = :default
|
8
8
|
SCHEME_MAPPINGS = {
|
9
9
|
DEFAULT_SCHEME => "",
|
10
|
-
:primary => "btn-
|
11
|
-
:outline => "btn-
|
12
|
-
:transparent => "btn-
|
10
|
+
:primary => "btn-signup-mktg",
|
11
|
+
:outline => "btn-muted-mktg",
|
12
|
+
:transparent => "btn-subtle-mktg"
|
13
13
|
}.freeze
|
14
14
|
SCHEME_OPTIONS = SCHEME_MAPPINGS.keys
|
15
15
|
|
@@ -30,7 +30,7 @@ module Primer
|
|
30
30
|
# <%= render(Primer::Alpha::ButtonMarketing.new(mr: 2)) { "Default" } %>
|
31
31
|
# <%= render(Primer::Alpha::ButtonMarketing.new(scheme: :primary, mr: 2)) { "Primary" } %>
|
32
32
|
# <%= render(Primer::Alpha::ButtonMarketing.new(scheme: :outline)) { "Outline" } %>
|
33
|
-
# <div class="color-bg-
|
33
|
+
# <div class="color-bg-emphasis">
|
34
34
|
# <%= render(Primer::Alpha::ButtonMarketing.new(scheme: :transparent)) { "Transparent" } %>
|
35
35
|
# </div>
|
36
36
|
#
|
@@ -101,7 +101,7 @@ module Primer
|
|
101
101
|
# <% end %>
|
102
102
|
#
|
103
103
|
# @example Customizing the body
|
104
|
-
# <%= render(Primer::Alpha::TabNav.new(label: "Default", body_arguments: { classes: "custom-class", border: true, border_color: :
|
104
|
+
# <%= render(Primer::Alpha::TabNav.new(label: "Default", body_arguments: { classes: "custom-class", border: true, border_color: :accent_emphasis })) do |c| %>
|
105
105
|
# <% c.tab(selected: true, href: "#") { "Tab 1" }%>
|
106
106
|
# <% c.tab(href: "#") { "Tab 2" } %>
|
107
107
|
# <% c.tab(href: "#") { "Tab 3" } %>
|
@@ -66,11 +66,11 @@ module Primer
|
|
66
66
|
@align = EXTRA_ALIGN_DEFAULT
|
67
67
|
@wrapper_arguments = wrapper_arguments
|
68
68
|
|
69
|
-
@system_arguments = system_arguments
|
69
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
70
70
|
@system_arguments[:tag] = :div
|
71
71
|
@system_arguments[:classes] = tab_nav_classes(@system_arguments[:classes])
|
72
72
|
|
73
|
-
@body_arguments = body_arguments
|
73
|
+
@body_arguments = deny_tag_argument(**body_arguments)
|
74
74
|
@body_arguments[:tag] = :ul
|
75
75
|
@body_arguments[:classes] = tab_nav_body_classes(@body_arguments[:classes])
|
76
76
|
|
@@ -5,6 +5,7 @@ module Primer
|
|
5
5
|
# Use `UnderlineNav` to style navigation links with a minimal
|
6
6
|
# underlined selected state, typically placed at the top
|
7
7
|
# of the page.
|
8
|
+
#
|
8
9
|
# For panel navigation, use <%= link_to_component(Primer::Alpha::UnderlinePanels) %> instead.
|
9
10
|
#
|
10
11
|
# @accessibility
|
@@ -102,7 +103,7 @@ module Primer
|
|
102
103
|
# <% end %>
|
103
104
|
#
|
104
105
|
# @example Customizing the body
|
105
|
-
# <%= render(Primer::Alpha::UnderlineNav.new(label: "Default", body_arguments: { classes: "custom-class", border: true, border_color: :
|
106
|
+
# <%= render(Primer::Alpha::UnderlineNav.new(label: "Default", body_arguments: { classes: "custom-class", border: true, border_color: :accent_emphasis })) do |c| %>
|
106
107
|
# <% c.tab(selected: true, href: "#") { "Tab 1" }%>
|
107
108
|
# <% c.tab(href: "#") { "Tab 2" } %>
|
108
109
|
# <% c.tab(href: "#") { "Tab 3" } %>
|
@@ -64,11 +64,11 @@ module Primer
|
|
64
64
|
@align = fetch_or_fallback(ALIGN_OPTIONS, align, ALIGN_DEFAULT)
|
65
65
|
@wrapper_arguments = wrapper_arguments
|
66
66
|
|
67
|
-
@system_arguments = system_arguments
|
67
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
68
68
|
@system_arguments[:tag] = :div
|
69
69
|
@system_arguments[:classes] = underline_nav_classes(@system_arguments[:classes], @align)
|
70
70
|
|
71
|
-
@body_arguments = body_arguments
|
71
|
+
@body_arguments = deny_tag_argument(**body_arguments)
|
72
72
|
@body_arguments[:tag] = :ul
|
73
73
|
@body_arguments[:classes] = underline_nav_body_classes(@body_arguments[:classes])
|
74
74
|
|
@@ -72,14 +72,14 @@ module Primer
|
|
72
72
|
#
|
73
73
|
# | Name | Type | Description |
|
74
74
|
# | :- | :- | :- |
|
75
|
-
# | `align_items` | Symbol | <%= one_of(Primer::Classify::
|
76
|
-
# | `align_self` | Symbol | <%= one_of(Primer::Classify::
|
77
|
-
# | `direction` | Symbol | <%= one_of(Primer::Classify::
|
78
|
-
# | `flex` | Integer, Symbol | <%= one_of(Primer::Classify::
|
75
|
+
# | `align_items` | Symbol | <%= one_of(Primer::Classify::FLEX_ALIGN_ITEMS_VALUES) %> |
|
76
|
+
# | `align_self` | Symbol | <%= one_of(Primer::Classify::FLEX_ALIGN_SELF_VALUES) %> |
|
77
|
+
# | `direction` | Symbol | <%= one_of(Primer::Classify::FLEX_DIRECTION_VALUES) %> |
|
78
|
+
# | `flex` | Integer, Symbol | <%= one_of(Primer::Classify::FLEX_VALUES) %> |
|
79
79
|
# | `flex_grow` | Integer | To enable, set to `0`. |
|
80
80
|
# | `flex_shrink` | Integer | To enable, set to `0`. |
|
81
|
-
# | `flex_wrap` | Symbol | <%= one_of(Primer::Classify::
|
82
|
-
# | `justify_content` | Symbol | <%= one_of(Primer::Classify::
|
81
|
+
# | `flex_wrap` | Symbol | <%= one_of(Primer::Classify::FLEX_WRAP_MAPPINGS.keys) %> |
|
82
|
+
# | `justify_content` | Symbol | <%= one_of(Primer::Classify::FLEX_JUSTIFY_CONTENT_VALUES) %> |
|
83
83
|
#
|
84
84
|
# ## Grid
|
85
85
|
#
|
@@ -151,42 +151,14 @@ module Primer
|
|
151
151
|
# | test_selector | String | Adds `data-test-selector='given value'` in non-Production environments for testing purposes. |
|
152
152
|
def initialize(tag:, classes: nil, **system_arguments)
|
153
153
|
@tag = tag
|
154
|
-
@system_arguments = system_arguments
|
155
154
|
|
156
|
-
|
157
|
-
|
158
|
-
if (denylist = system_arguments[:system_arguments_denylist])
|
159
|
-
if raise_on_invalid_options? && !ENV["PRIMER_WARNINGS_DISABLED"]
|
160
|
-
# Convert denylist from:
|
161
|
-
# { [:p, :pt] => "message" } to:
|
162
|
-
# { p: "message", pt: "message" }
|
163
|
-
unpacked_denylist =
|
164
|
-
denylist.each_with_object({}) do |(keys, value), memo|
|
165
|
-
keys.each { |key| memo[key] = value }
|
166
|
-
end
|
167
|
-
|
168
|
-
violations = unpacked_denylist.keys & @system_arguments.keys
|
169
|
-
|
170
|
-
if violations.any?
|
171
|
-
message = "Found #{violations.count} #{'violation'.pluralize(violations)}:"
|
172
|
-
violations.each do |violation|
|
173
|
-
message += "\n The #{violation} system argument is not allowed here. #{unpacked_denylist[violation]}"
|
174
|
-
end
|
175
|
-
|
176
|
-
raise(ArgumentError, message)
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
# Remove :system_arguments_denylist key and any denied keys from system arguments
|
181
|
-
@system_arguments.except!(:system_arguments_denylist)
|
182
|
-
@system_arguments.except!(*denylist.keys.flatten)
|
183
|
-
end
|
155
|
+
@system_arguments = validate_arguments(tag: tag, **system_arguments)
|
184
156
|
|
185
157
|
@result = Primer::Classify.call(**@system_arguments.merge(classes: classes))
|
186
158
|
|
187
159
|
@system_arguments[:"data-view-component"] = true
|
188
160
|
# Filter out Primer keys so they don't get assigned as HTML attributes
|
189
|
-
@content_tag_args = add_test_selector(@system_arguments).except(*Primer::Classify::
|
161
|
+
@content_tag_args = add_test_selector(@system_arguments).except(*Primer::Classify::Utilities::UTILITIES.keys)
|
190
162
|
end
|
191
163
|
|
192
164
|
def call
|
@@ -20,7 +20,7 @@ module Primer
|
|
20
20
|
# @param disabled [Boolean] Whether the item is disabled.
|
21
21
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
22
22
|
def initialize(value:, selected: false, disabled: false, **system_arguments)
|
23
|
-
@system_arguments = system_arguments
|
23
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
24
24
|
@system_arguments[:tag] = :li
|
25
25
|
@system_arguments[:role] = :option
|
26
26
|
@system_arguments[:"data-autocomplete-value"] = value
|
@@ -19,6 +19,7 @@ module Primer
|
|
19
19
|
#
|
20
20
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
21
21
|
renders_one :label, lambda { |**system_arguments|
|
22
|
+
deny_tag_argument(**system_arguments)
|
22
23
|
system_arguments[:for] = @input_id
|
23
24
|
system_arguments[:tag] = :label
|
24
25
|
Primer::BaseComponent.new(**system_arguments)
|
@@ -47,6 +48,7 @@ module Primer
|
|
47
48
|
#
|
48
49
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
49
50
|
renders_one :results, lambda { |**system_arguments|
|
51
|
+
deny_tag_argument(**system_arguments)
|
50
52
|
system_arguments[:tag] = :ul
|
51
53
|
system_arguments[:id] = @list_id
|
52
54
|
system_arguments[:classes] = class_names(
|
@@ -110,7 +112,7 @@ module Primer
|
|
110
112
|
|
111
113
|
system_arguments.delete(:"aria-label") && system_arguments[:aria]&.delete(:label)
|
112
114
|
|
113
|
-
@system_arguments = system_arguments
|
115
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
114
116
|
@system_arguments[:tag] = "auto-complete"
|
115
117
|
@system_arguments[:src] = src
|
116
118
|
@system_arguments[:for] = list_id
|
@@ -133,7 +135,7 @@ module Primer
|
|
133
135
|
# @param type [Symbol] <%= one_of(Primer::Beta::AutoComplete::Input::TYPE_OPTIONS) %>
|
134
136
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
135
137
|
def initialize(type: DEFAULT_TYPE, **system_arguments)
|
136
|
-
@system_arguments = system_arguments
|
138
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
137
139
|
@system_arguments[:tag] = :input
|
138
140
|
|
139
141
|
@aria_label = system_arguments[:"aria-label"]
|
@@ -53,7 +53,7 @@ module Primer
|
|
53
53
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
54
54
|
def initialize(src:, alt:, size: DEFAULT_SIZE, shape: DEFAULT_SHAPE, href: nil, **system_arguments)
|
55
55
|
@href = href
|
56
|
-
@system_arguments = system_arguments
|
56
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
57
57
|
@system_arguments[:tag] = :img
|
58
58
|
@system_arguments[:src] = src
|
59
59
|
@system_arguments[:alt] = alt
|
@@ -50,6 +50,7 @@ module Primer
|
|
50
50
|
# @param tag [String] <%= one_of(Primer::HeadingComponent::TAG_OPTIONS) %>
|
51
51
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
52
52
|
renders_one :heading, lambda { |tag:, **system_arguments|
|
53
|
+
deny_tag_argument(**system_arguments)
|
53
54
|
system_arguments[:tag] = tag
|
54
55
|
system_arguments[:mb] = 1
|
55
56
|
system_arguments[:classes] = class_names("h2", system_arguments[:classes])
|
@@ -64,7 +65,8 @@ module Primer
|
|
64
65
|
#
|
65
66
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
66
67
|
renders_one :description, lambda { |**system_arguments|
|
67
|
-
system_arguments
|
68
|
+
deny_tag_argument(**system_arguments)
|
69
|
+
system_arguments[:tag] = :div
|
68
70
|
|
69
71
|
Primer::BaseComponent.new(**system_arguments)
|
70
72
|
}
|
@@ -77,9 +79,10 @@ module Primer
|
|
77
79
|
# @param href [String] URL to be used for the primary action.
|
78
80
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
79
81
|
renders_one :primary_action, lambda { |href:, **system_arguments|
|
82
|
+
deny_tag_argument(**system_arguments)
|
80
83
|
system_arguments[:tag] = :a
|
81
84
|
system_arguments[:href] = href
|
82
|
-
system_arguments[:
|
85
|
+
system_arguments[:mt] = 5
|
83
86
|
system_arguments[:variant] = :medium
|
84
87
|
system_arguments[:scheme] ||= :primary
|
85
88
|
|
@@ -211,7 +214,7 @@ module Primer
|
|
211
214
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
212
215
|
def initialize(narrow: false, spacious: false, border: false, **system_arguments)
|
213
216
|
@border = border
|
214
|
-
@system_arguments = system_arguments
|
217
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
215
218
|
@system_arguments[:tag] = :div
|
216
219
|
@system_arguments[:classes] = class_names(
|
217
220
|
@system_arguments[:classes],
|
@@ -40,7 +40,7 @@ module Primer
|
|
40
40
|
#
|
41
41
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
42
42
|
def initialize(**system_arguments)
|
43
|
-
@system_arguments = system_arguments
|
43
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
44
44
|
@system_arguments[:tag] = :nav
|
45
45
|
@system_arguments[:aria] = ARIA_LABEL
|
46
46
|
@system_arguments[:system_arguments_denylist] = ARGS_DENYLIST
|
@@ -57,7 +57,7 @@ module Primer
|
|
57
57
|
|
58
58
|
def initialize(href:, **system_arguments)
|
59
59
|
@href = href
|
60
|
-
@system_arguments = system_arguments
|
60
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
61
61
|
@selected = false
|
62
62
|
|
63
63
|
@system_arguments[:tag] = :li
|
@@ -10,7 +10,7 @@ module Primer
|
|
10
10
|
|
11
11
|
# @example Default
|
12
12
|
# <%= render(Primer::Beta::Text.new(tag: :p, font_weight: :bold)) { "Bold Text" } %>
|
13
|
-
# <%= render(Primer::Beta::Text.new(tag: :p, color: :
|
13
|
+
# <%= render(Primer::Beta::Text.new(tag: :p, color: :danger)) { "Danger Text" } %>
|
14
14
|
#
|
15
15
|
# @param tag [Symbol]
|
16
16
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
@@ -127,7 +127,7 @@ module Primer
|
|
127
127
|
# @param padding [Symbol] <%= one_of(Primer::BorderBoxComponent::PADDING_MAPPINGS.keys) %>
|
128
128
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
129
129
|
def initialize(padding: DEFAULT_PADDING, **system_arguments)
|
130
|
-
@system_arguments = system_arguments
|
130
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
131
131
|
@system_arguments[:tag] = :div
|
132
132
|
@system_arguments[:classes] = class_names(
|
133
133
|
"Box",
|
@@ -9,11 +9,12 @@ module Primer
|
|
9
9
|
# <%= render(Primer::BoxComponent.new) { "Your content here" } %>
|
10
10
|
#
|
11
11
|
# @example Color and padding
|
12
|
-
# <%= render(Primer::BoxComponent.new(bg: :
|
12
|
+
# <%= render(Primer::BoxComponent.new(bg: :subtle, p: 3)) { "Hello world" } %>
|
13
13
|
#
|
14
14
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
15
15
|
def initialize(**system_arguments)
|
16
|
-
@system_arguments = system_arguments
|
16
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
17
|
+
|
17
18
|
@system_arguments[:tag] = :div
|
18
19
|
end
|
19
20
|
|
@@ -1,9 +1,3 @@
|
|
1
|
-
<%= render Primer::BaseButton.new(**@system_arguments) do
|
2
|
-
<%= icon %>
|
3
|
-
|
4
|
-
<%= counter %>
|
5
|
-
|
6
|
-
<% if @caret %>
|
7
|
-
<%= primer_octicon("triangle-down") %>
|
8
|
-
<% end %>
|
9
|
-
<% end %>
|
1
|
+
<%= render Primer::BaseButton.new(**@system_arguments) do -%>
|
2
|
+
<%= icon %><%= trimmed_content %><%= counter %><%= primer_octicon("triangle-down", mr: -1) if @caret %>
|
3
|
+
<% end -%>
|
@@ -28,12 +28,20 @@ module Primer
|
|
28
28
|
# Icon to be rendered in the button.
|
29
29
|
#
|
30
30
|
# @param system_arguments [Hash] Same arguments as <%= link_to_component(Primer::OcticonComponent) %>.
|
31
|
-
renders_one :icon,
|
31
|
+
renders_one :icon, lambda { |**system_arguments|
|
32
|
+
system_arguments[:mr] = 2
|
33
|
+
|
34
|
+
Primer::OcticonComponent.new(**system_arguments)
|
35
|
+
}
|
32
36
|
|
33
37
|
# Counter to be rendered in the button.
|
34
38
|
#
|
35
39
|
# @param system_arguments [Hash] Same arguments as <%= link_to_component(Primer::CounterComponent) %>.
|
36
|
-
renders_one :counter,
|
40
|
+
renders_one :counter, lambda { |**system_arguments|
|
41
|
+
system_arguments[:ml] = 2
|
42
|
+
|
43
|
+
Primer::CounterComponent.new(**system_arguments)
|
44
|
+
}
|
37
45
|
|
38
46
|
# @example Schemes
|
39
47
|
# <%= render(Primer::ButtonComponent.new) { "Default" } %>
|
@@ -111,5 +119,16 @@ module Primer
|
|
111
119
|
def link?
|
112
120
|
@scheme == LINK_SCHEME
|
113
121
|
end
|
122
|
+
|
123
|
+
def trimmed_content
|
124
|
+
return if content.blank?
|
125
|
+
|
126
|
+
trimmed_content = content.strip
|
127
|
+
|
128
|
+
return trimmed_content unless content.html_safe?
|
129
|
+
|
130
|
+
# strip unsets `html_safe`, so we have to set it back again to guarantee that HTML blocks won't break
|
131
|
+
trimmed_content.html_safe # rubocop:disable Rails/OutputSafety
|
132
|
+
end
|
114
133
|
end
|
115
134
|
end
|
@@ -45,7 +45,7 @@ module Primer
|
|
45
45
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
46
46
|
def initialize(variant: Primer::ButtonComponent::DEFAULT_VARIANT, **system_arguments)
|
47
47
|
@variant = variant
|
48
|
-
@system_arguments = system_arguments
|
48
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
49
49
|
@system_arguments[:tag] = :div
|
50
50
|
|
51
51
|
@system_arguments[:classes] = class_names(
|
@@ -25,7 +25,7 @@ module Primer
|
|
25
25
|
# @param for [String] Element id from where to get the copied value.
|
26
26
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
27
27
|
def initialize(value: nil, **system_arguments)
|
28
|
-
@system_arguments = system_arguments
|
28
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
29
29
|
@value = value
|
30
30
|
|
31
31
|
validate!
|
@@ -19,7 +19,7 @@ module Primer
|
|
19
19
|
# @param type [Symbol] <%= one_of(Primer::CloseButton::TYPE_OPTIONS) %>
|
20
20
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
21
21
|
def initialize(type: DEFAULT_TYPE, **system_arguments)
|
22
|
-
@system_arguments = system_arguments
|
22
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
23
23
|
@system_arguments[:tag] = :button
|
24
24
|
@system_arguments[:block] = false
|
25
25
|
@system_arguments[:type] = fetch_or_fallback(TYPE_OPTIONS, type, DEFAULT_TYPE)
|
@@ -14,6 +14,8 @@ module Primer
|
|
14
14
|
include Status::Dsl
|
15
15
|
include Audited::Dsl
|
16
16
|
|
17
|
+
INVALID_ARIA_LABEL_TAGS = [:div, :span, :p].freeze
|
18
|
+
|
17
19
|
private
|
18
20
|
|
19
21
|
def raise_on_invalid_options?
|
@@ -42,5 +44,74 @@ module Primer
|
|
42
44
|
def silence_deprecations?
|
43
45
|
Rails.application.config.primer_view_components.silence_deprecations
|
44
46
|
end
|
47
|
+
|
48
|
+
def check_denylist(denylist = [], **arguments)
|
49
|
+
if should_raise_error?
|
50
|
+
|
51
|
+
# Convert denylist from:
|
52
|
+
# { [:p, :pt] => "message" } to:
|
53
|
+
# { p: "message", pt: "message" }
|
54
|
+
unpacked_denylist =
|
55
|
+
denylist.each_with_object({}) do |(keys, value), memo|
|
56
|
+
keys.each { |key| memo[key] = value }
|
57
|
+
end
|
58
|
+
|
59
|
+
violations = unpacked_denylist.keys & arguments.keys
|
60
|
+
|
61
|
+
if violations.any?
|
62
|
+
message = "Found #{violations.count} #{'violation'.pluralize(violations)}:"
|
63
|
+
violations.each do |violation|
|
64
|
+
message += "\n The #{violation} argument is not allowed here. #{unpacked_denylist[violation]}"
|
65
|
+
end
|
66
|
+
|
67
|
+
raise(ArgumentError, message)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
arguments
|
72
|
+
end
|
73
|
+
|
74
|
+
def validate_arguments(tag:, denylist_name: :system_arguments_denylist, **arguments)
|
75
|
+
deny_single_argument(:class, "Use `classes` instead.", **arguments)
|
76
|
+
|
77
|
+
if (denylist = arguments[denylist_name])
|
78
|
+
check_denylist(denylist, **arguments)
|
79
|
+
|
80
|
+
# Remove :system_arguments_denylist key and any denied keys from system arguments
|
81
|
+
arguments.except!(denylist_name)
|
82
|
+
arguments.except!(*denylist.keys.flatten)
|
83
|
+
end
|
84
|
+
|
85
|
+
deny_aria_label(tag: tag, arguments: arguments)
|
86
|
+
|
87
|
+
arguments
|
88
|
+
end
|
89
|
+
|
90
|
+
def deny_single_argument(key, help_text, **arguments)
|
91
|
+
raise ArgumentError, "`#{key}` is an invalid argument. #{help_text}" \
|
92
|
+
if should_raise_error? && arguments.key?(key)
|
93
|
+
|
94
|
+
arguments.except!(key)
|
95
|
+
end
|
96
|
+
|
97
|
+
def deny_aria_label(tag:, arguments:)
|
98
|
+
return arguments.except!(:skip_aria_label_check) if arguments[:skip_aria_label_check]
|
99
|
+
return if arguments[:role]
|
100
|
+
return unless aria(:label, arguments)
|
101
|
+
return unless INVALID_ARIA_LABEL_TAGS.include?(tag)
|
102
|
+
|
103
|
+
raise ArgumentError, "Don't use `aria-label` on `#{tag}` elements. See https://www.tpgi.com/short-note-on-aria-label-aria-labelledby-and-aria-describedby/" if should_raise_error?
|
104
|
+
|
105
|
+
arguments.except!(:"aria-label")
|
106
|
+
arguments[:aria] = arguments[:aria].except!(:label) if arguments[:aria]
|
107
|
+
end
|
108
|
+
|
109
|
+
def deny_tag_argument(**arguments)
|
110
|
+
deny_single_argument(:tag, "This component has a fixed tag.", **arguments)
|
111
|
+
end
|
112
|
+
|
113
|
+
def should_raise_error?
|
114
|
+
raise_on_invalid_options? && !ENV["PRIMER_WARNINGS_DISABLED"]
|
115
|
+
end
|
45
116
|
end
|
46
117
|
end
|
@@ -52,7 +52,7 @@ module Primer
|
|
52
52
|
# @param reset [Boolean] Defatuls to false. If set to true, it will remove the default caret and remove style from the summary element
|
53
53
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
54
54
|
def initialize(overlay: NO_OVERLAY, reset: false, **system_arguments)
|
55
|
-
@system_arguments = system_arguments
|
55
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
56
56
|
@system_arguments[:tag] = :details
|
57
57
|
@system_arguments[:classes] = class_names(
|
58
58
|
system_arguments[:classes],
|
@@ -33,7 +33,7 @@ module Primer
|
|
33
33
|
@direction = direction
|
34
34
|
@as = fetch_or_fallback(AS_OPTIONS, as, AS_DEFAULT)
|
35
35
|
|
36
|
-
@system_arguments = system_arguments
|
36
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
37
37
|
@system_arguments[:tag] = "details-menu"
|
38
38
|
@system_arguments[:role] = "menu"
|
39
39
|
|
@@ -42,7 +42,7 @@ module Primer
|
|
42
42
|
def initialize(direction: DIRECTION_DEFAULT, scheme: SCHEME_DEFAULT, header: nil, **system_arguments)
|
43
43
|
@header = header
|
44
44
|
@direction = direction
|
45
|
-
@system_arguments = system_arguments
|
45
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
46
46
|
|
47
47
|
@system_arguments[:tag] = "details-menu"
|
48
48
|
@system_arguments[:role] = "menu"
|
@@ -9,6 +9,7 @@ module Primer
|
|
9
9
|
#
|
10
10
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
11
11
|
renders_one :action, lambda { |**system_arguments|
|
12
|
+
deny_tag_argument(**system_arguments)
|
12
13
|
system_arguments[:tag] = :div
|
13
14
|
system_arguments[:classes] = class_names(system_arguments[:classes], "flash-action")
|
14
15
|
|
@@ -54,7 +55,7 @@ module Primer
|
|
54
55
|
def initialize(full: false, spacious: false, dismissible: false, icon: nil, scheme: DEFAULT_SCHEME, **system_arguments)
|
55
56
|
@icon = icon
|
56
57
|
@dismissible = dismissible
|
57
|
-
@system_arguments = system_arguments
|
58
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
58
59
|
@system_arguments[:tag] = :div
|
59
60
|
@system_arguments[:classes] = class_names(
|
60
61
|
@system_arguments[:classes],
|