primer_view_components 0.0.65 → 0.0.68

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 63241aa31675216aea8f62b033158b0c4579b6d23948a1e18a37121227db5950
4
- data.tar.gz: 318312368ae79269609964c085921d6c3a152644e2e0fbe14bd0d60d277f47ce
3
+ metadata.gz: 537c5d2b6d37e3cfc2493426db201a7ea7268a00b3e5b06536d49956ad25658f
4
+ data.tar.gz: a8aa51d217947855498867c2e18e0ad8d34ee5c9dd565170544e3deeec63a25f
5
5
  SHA512:
6
- metadata.gz: 13aed5a21c4b87d3934b5b8269bf5fa24547b1616c9872be2d88897b3a1d712ea337b510119a07496d64f7ad1af2e8f337596c4a8d8e089d069fa2a31a1cd922
7
- data.tar.gz: c4b70c2613f21b890c9a6cac679bac409160acc055a16dc669a90bb318c617c477d595d51c2ae07841e277aef1a2c6125b82caa3783240caea958731fb4cb4e0
6
+ metadata.gz: e5965f3012b7407029185f7698020c0207d9541dcc8fe78e93fabf207de062eba38358f00c3c270189ee2811ace542f97941e2b6e4f96d77f05c33da23af9098
7
+ data.tar.gz: 63b806a174ea5f35c89d2e5568781c010e307680b8bee36bb4de835b77cea5cc82c816bbfdd03d2b0ec283f47b23c8c351c9ef552a691dcd42097964bc88fa88
data/CHANGELOG.md CHANGED
@@ -30,6 +30,64 @@ The category for changes related to documentation, testing and tooling. Also, fo
30
30
 
31
31
  ## main
32
32
 
33
+ ## 0.0.68
34
+
35
+ ### Updates
36
+
37
+ - Add accessible labels to Search AutoComplete when provided with an icon.
38
+
39
+ _Andri Alexandrou_
40
+
41
+ - Restricts children for AutoComplete API to prevent accessibility violations and misuse
42
+
43
+ _Lindsey Wild_
44
+
45
+ - Migrate from Heroku to Azure for the Rails storybook server.
46
+
47
+ _Cameron Dutro_
48
+
49
+ - Remove CSS utilities from Blankslate
50
+
51
+ _Hector Garcia_
52
+
53
+ - Improve last example on the PopoverComponent docs
54
+
55
+ _Hector Garcia_
56
+
57
+ ### Bug Fixes
58
+
59
+ - Fix live reloading during local docs development.
60
+
61
+ _Cameron Dutro_
62
+
63
+ ### Deprecations
64
+
65
+ - Deprecate `Tooltip` component.
66
+
67
+ _Kate Higa_
68
+
69
+ ### Misc
70
+
71
+ - Updates README with missing `alt` attribute on image
72
+
73
+ _Kate Higa_
74
+
75
+ - Updates contributing docs
76
+
77
+ _Lindsey Wild_
78
+
79
+ ## 0.0.67
80
+
81
+ - Updating octicons to `> 16`
82
+
83
+ _Jon Rohan_
84
+
85
+ ## 0.0.66
86
+
87
+ - Revert optimization changes to utilities.
88
+
89
+ _Josh Klina_
90
+
33
91
  ## 0.0.65
34
92
 
35
93
  ### Breaking Changes
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img width="300px" src="/static/assets/view-components.svg">
2
+ <img width="300px" alt="" src="/static/assets/view-components.svg">
3
3
  </p>
4
4
 
5
5
  <h1 align="center">Primer ViewComponents</h1>
@@ -1,6 +1,14 @@
1
- <%= label %>
2
1
  <%= render Primer::BaseComponent.new(**@system_arguments) do %>
3
- <%= input %>
4
- <%= icon %>
2
+ <label for="<%= @input_id %>">
3
+ <% if @is_label_visible %>
4
+ <%= @label_text %>
5
+ <% else %>
6
+ <span class="sr-only"><%= @label_text %></span>
7
+ <% end %>
8
+ <% if icon.present? %>
9
+ <%= icon %>
10
+ <% end %>
11
+ </label>
12
+ <input id="<%= @input_id %>" name="<%= @input_id %>" type="text" class="form-control" autocomplete="off">
5
13
  <%= results %>
6
14
  <% end %>
@@ -7,41 +7,14 @@ module Primer
7
7
  # @accessibility
8
8
  # Always set an accessible label to help the user interact with the component.
9
9
  #
10
- # * Set the `label` slot to render a visible label. Alternatively, associate an existing visible text element
11
- # as a label by setting `aria-labelledby`.
12
- # * If you must use a non-visible label, set `:"aria-label"` on `AutoComplete` and Primer
13
- # will apply it to the correct elements. However, please note that a visible label should almost
14
- # always be used unless there is compelling reason not to. A placeholder is not a label.
10
+ # * `label_text` is required and visible by default.
11
+ # * If you must use a non-visible label, set `is_label_visible` to `false`.
12
+ # However, please note that a visible label should almost always
13
+ # be used unless there is compelling reason not to. A placeholder is not a label.
15
14
  class AutoComplete < Primer::Component
16
15
  status :beta
17
16
 
18
- # Optionally render a visible label. See <%= link_to_accessibility %>
19
- #
20
- # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
21
- renders_one :label, lambda { |**system_arguments|
22
- deny_tag_argument(**system_arguments)
23
- system_arguments[:for] = @input_id
24
- system_arguments[:tag] = :label
25
- Primer::BaseComponent.new(**system_arguments)
26
- }
27
-
28
- # Required input used to search for results
29
- #
30
- # @param type [Symbol] <%= one_of(Primer::Beta::AutoComplete::Input::TYPE_OPTIONS) %>
31
- # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
32
- renders_one :input, lambda { |**system_arguments|
33
- aria_label = aria("label", system_arguments) || @aria_label
34
- if aria_label.present?
35
- system_arguments[:"aria-label"] = aria_label
36
- system_arguments[:aria]&.delete(:label)
37
- end
38
-
39
- name = system_arguments[:name] || @input_id
40
- Input.new(id: @input_id, name: name, **system_arguments)
41
- }
42
-
43
17
  # Optional icon to be rendered before the input. Has the same arguments as <%= link_to_component(Primer::OcticonComponent) %>.
44
- #
45
18
  renders_one :icon, Primer::OcticonComponent
46
19
 
47
20
  # Customizable results list.
@@ -56,34 +29,17 @@ module Primer
56
29
  system_arguments[:classes]
57
30
  )
58
31
 
59
- aria_label = system_arguments[:"aria-label"] || system_arguments.dig(:aria, :label) || @aria_label
60
- system_arguments[:"aria-label"] = aria_label if aria_label.present?
61
- system_arguments[:aria]&.delete(:label)
62
-
63
32
  Primer::BaseComponent.new(**system_arguments)
64
33
  }
65
34
 
66
35
  # @example Default
67
- # <%= render(Primer::Beta::AutoComplete.new(src: "/auto_complete", input_id: "fruits-input-1", list_id: "fruits-popup-1", position: :relative)) do |c| %>
68
- # <% c.label(classes:"").with_content("Fruits") %>
69
- # <% c.input(type: :text) %>
70
- # <% end %>
36
+ # <%= render(Primer::Beta::AutoComplete.new(label_text: "Fruits", src: "/auto_complete", input_id: "fruits-input-1", list_id: "fruits-popup-1", position: :relative)) %>
71
37
  #
72
- # @example With `aria-label`
73
- # <%= render(Primer::Beta::AutoComplete.new("aria-label": "Fruits", src: "/auto_complete", input_id: "fruits-input-2", list_id: "fruits-popup-2", position: :relative)) do |c| %>
74
- # <% c.input(type: :text) %>
75
- # <% end %>
76
- #
77
- # @example With `aria-labelledby`
78
- # <%= render(Primer::HeadingComponent.new(tag: :h2, id: "search-1")) { "Search" } %>
79
- # <%= render(Primer::Beta::AutoComplete.new(src: "/auto_complete", input_id: "fruits-input-3", list_id: "fruits-popup-2", position: :relative)) do |c| %>
80
- # <% c.input("aria-labelledby": "search-1") %>
81
- # <% end %>
38
+ # @example With Non-Visible Label
39
+ # <%= render(Primer::Beta::AutoComplete.new(label_text: "Fruits", src: "/auto_complete", input_id: "fruits-input-2", list_id: "fruits-popup-2", is_label_visible: false, position: :relative)) %>
82
40
  #
83
- # @example With custom classes for the results
84
- # <%= render(Primer::Beta::AutoComplete.new(src: "/auto_complete", input_id: "fruits-input-4", list_id: "fruits-popup-3", position: :relative)) do |c| %>
85
- # <% c.label(classes:"").with_content("Fruits") %>
86
- # <% c.input(type: :text) %>
41
+ # @example With Custom Classes for the Results
42
+ # <%= render(Primer::Beta::AutoComplete.new(label_text: "Fruits", src: "/auto_complete", input_id: "fruits-input-3", list_id: "fruits-popup-3", position: :relative)) do |c| %>
87
43
  # <% c.results(classes: "custom-class") do %>
88
44
  # <%= render(Primer::Beta::AutoComplete::Item.new(selected: true, value: "apple")) do |c| %>
89
45
  # Apple
@@ -95,22 +51,25 @@ module Primer
95
51
  # <% end %>
96
52
  #
97
53
  # @example With Icon
98
- # <%= render(Primer::Beta::AutoComplete.new(src: "/auto_complete", list_id: "fruits-popup-4", input_id: "fruits-input-4", position: :relative)) do |c| %>
99
- # <% c.label(classes:"").with_content("Fruits") %>
100
- # <% c.input(type: :text) %>
54
+ # <%= render(Primer::Beta::AutoComplete.new(label_text: "Fruits", src: "/auto_complete", list_id: "fruits-popup-4", input_id: "fruits-input-4", position: :relative)) do |c| %>
101
55
  # <% c.icon(icon: :search) %>
102
56
  # <% end %>
103
57
  #
58
+ # @example With Icon and Non-Visible Label
59
+ # <%= render(Primer::Beta::AutoComplete.new(label_text: "Fruits", src: "/auto_complete", list_id: "fruits-popup-5", input_id: "fruits-input-5", is_label_visible: false, position: :relative)) do |c| %>
60
+ # <% c.icon(icon: :search) %>
61
+ # <% end %>
62
+ # @param label_text [String] The label of the input.
104
63
  # @param src [String] The route to query.
105
64
  # @param input_id [String] Id of the input element.
106
65
  # @param list_id [String] Id of the list element.
66
+ # @param is_label_visible [Boolean] Controls if the label is visible. If `false`, screen reader only text will be added.
107
67
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
108
- def initialize(src:, list_id:, input_id:, **system_arguments)
68
+ def initialize(label_text:, src:, list_id:, input_id:, is_label_visible: true, **system_arguments)
69
+ @label_text = label_text
109
70
  @list_id = list_id
110
71
  @input_id = input_id
111
- @aria_label = aria("label", system_arguments)
112
-
113
- system_arguments.delete(:"aria-label") && system_arguments[:aria]&.delete(:label)
72
+ @is_label_visible = is_label_visible
114
73
 
115
74
  @system_arguments = deny_tag_argument(**system_arguments)
116
75
  @system_arguments[:tag] = "auto-complete"
@@ -118,44 +77,10 @@ module Primer
118
77
  @system_arguments[:for] = list_id
119
78
  end
120
79
 
121
- # add `results` without needing to explicitly call it in the view
80
+ # add `results` without needing to explicitly call them in the view
122
81
  def before_render
123
- raise ArgumentError, "Missing `input` slot" if input.blank?
124
- raise ArgumentError, "Accessible label is required." if label.blank? && input.missing_label?
125
-
126
82
  results(classes: "") unless results
127
83
  end
128
-
129
- # This component is part of `Primer::Beta::AutoCompleteComponent` and should not be
130
- # used as a standalone component.
131
- class Input < Primer::Component
132
- DEFAULT_TYPE = :text
133
- TYPE_OPTIONS = [DEFAULT_TYPE, :search].freeze
134
-
135
- # @param type [Symbol] <%= one_of(Primer::Beta::AutoComplete::Input::TYPE_OPTIONS) %>
136
- # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
137
- def initialize(type: DEFAULT_TYPE, **system_arguments)
138
- @system_arguments = deny_tag_argument(**system_arguments)
139
- @system_arguments[:tag] = :input
140
-
141
- @aria_label = system_arguments[:"aria-label"]
142
- @aria_labelledby = system_arguments[:"aria-labelledby"] || system_arguments.dig(:aria, :labelledby)
143
-
144
- @system_arguments[:type] = fetch_or_fallback(TYPE_OPTIONS, type, DEFAULT_TYPE)
145
- @system_arguments[:classes] = class_names(
146
- "form-control",
147
- system_arguments[:classes]
148
- )
149
- end
150
-
151
- def missing_label?
152
- @aria_label.blank? && @aria_labelledby.blank?
153
- end
154
-
155
- def call
156
- render(Primer::BaseComponent.new(**@system_arguments))
157
- end
158
- end
159
84
  end
160
85
  end
161
86
  end
@@ -5,9 +5,13 @@
5
5
  <%= heading %>
6
6
  <%= description %>
7
7
 
8
- <%= primary_action %>
8
+ <% if primary_action.present? %>
9
+ <div class="blankslate-action">
10
+ <%= primary_action %>
11
+ </div>
12
+ <% end %>
9
13
  <% if secondary_action.present? %>
10
- <div class="mt-3">
14
+ <div class="blankslate-action">
11
15
  <%= secondary_action %>
12
16
  </div>
13
17
  <% end %>
@@ -5,9 +5,11 @@ module Primer
5
5
  # Use `Blankslate` when there is a lack of content within a page or section. Use as placeholder to tell users why something isn't there.
6
6
  #
7
7
  # @accessibility
8
- # - Set the `heading` level based on what is appropriate for your page hierarchy. <%= link_to_heading_practices %>
9
- # - `secondary_action` can be set to provide more information that is relevant in the context of the `Blankslate`.
8
+ # - The blankslate uses a semantic heading that must be set at the appropriate level based on the hierarchy of the page.
9
+ # - All blankslate visuals have been programmed as decorative images, using `aria-hidden=”true”` and `img alt=””`, which will hide the visual from screen reader users.
10
+ # - The blankslate supports a primary and secondary action. Both actions have been built as semantic links with primary and secondary styling.
10
11
  # - `secondary_action` text should be meaningful out of context and clearly describe the destination. Avoid using vague text like, "Learn more" or "Click here".
12
+ # - The blankslate can leverage the spinner component, which will communicate to screen reader users that the content is still loading.
11
13
  class Blankslate < Primer::Component
12
14
  status :beta
13
15
 
@@ -24,20 +26,19 @@ module Primer
24
26
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
25
27
  renders_one :visual, types: {
26
28
  icon: lambda { |**system_arguments|
27
- system_arguments[:mb] = 3
28
29
  system_arguments[:size] ||= :medium
29
30
  system_arguments[:classes] = class_names("blankslate-icon", system_arguments[:classes])
30
31
 
31
32
  Primer::OcticonComponent.new(**system_arguments)
32
33
  },
33
34
  spinner: lambda { |**system_arguments|
34
- system_arguments[:mb] = 3
35
+ system_arguments[:classes] = class_names("blankslate-image", system_arguments[:classes])
35
36
 
36
37
  Primer::SpinnerComponent.new(**system_arguments)
37
38
  },
38
39
  image: lambda { |**system_arguments|
39
- system_arguments[:mb] = 3
40
40
  system_arguments[:size] = "56x56"
41
+ system_arguments[:classes] = class_names("blankslate-image", system_arguments[:classes])
41
42
 
42
43
  Primer::Image.new(**system_arguments)
43
44
  }
@@ -50,8 +51,7 @@ module Primer
50
51
  renders_one :heading, lambda { |tag:, **system_arguments|
51
52
  deny_tag_argument(**system_arguments)
52
53
  system_arguments[:tag] = tag
53
- system_arguments[:mb] = 1
54
- system_arguments[:classes] = class_names("h2", system_arguments[:classes])
54
+ system_arguments[:classes] = class_names("blankslate-heading", system_arguments[:classes])
55
55
 
56
56
  Primer::HeadingComponent.new(**system_arguments)
57
57
  }
@@ -64,7 +64,7 @@ module Primer
64
64
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
65
65
  renders_one :description, lambda { |**system_arguments|
66
66
  deny_tag_argument(**system_arguments)
67
- system_arguments[:tag] = :div
67
+ system_arguments[:tag] = :p
68
68
 
69
69
  Primer::BaseComponent.new(**system_arguments)
70
70
  }
@@ -80,7 +80,6 @@ module Primer
80
80
  deny_tag_argument(**system_arguments)
81
81
  system_arguments[:tag] = :a
82
82
  system_arguments[:href] = href
83
- system_arguments[:mt] = 5
84
83
  system_arguments[:size] = :medium
85
84
  system_arguments[:scheme] ||= :primary
86
85
 
@@ -96,8 +95,6 @@ module Primer
96
95
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
97
96
  renders_one :secondary_action, lambda { |href:, **system_arguments|
98
97
  system_arguments[:href] = href
99
- # Padding is needed to increase touch area.
100
- system_arguments[:p] = 3
101
98
 
102
99
  Primer::LinkComponent.new(**system_arguments)
103
100
  }
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ # Use `Content` as a helper to render content passed to a slot without adding any tags.
5
+ class Content < Primer::Component
6
+ status :stable
7
+
8
+ def call
9
+ content
10
+ end
11
+ end
12
+ end
@@ -6,12 +6,12 @@ module Primer
6
6
  class Dropdown < Primer::Component
7
7
  # Required trigger for the dropdown. Has the same arguments as <%= link_to_component(Primer::ButtonComponent) %>,
8
8
  # but it is locked as a `summary` tag.
9
- renders_one :button, lambda { |**system_arguments, &block|
9
+ renders_one :button, lambda { |**system_arguments|
10
10
  @button_arguments = system_arguments
11
11
  @button_arguments[:button] = true
12
12
  @button_arguments[:dropdown] = @with_caret
13
13
 
14
- view_context.capture { block&.call }
14
+ Primer::Content.new
15
15
  }
16
16
 
17
17
  # Required context menu for the dropdown.
@@ -41,22 +41,21 @@ module Primer
41
41
  # @param caret [Symbol] <%= one_of(Primer::PopoverComponent::CARET_MAPPINGS.keys) %>
42
42
  # @param large [Boolean] Whether to use the large version of the component.
43
43
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
44
- renders_one :body, lambda { |caret: CARET_DEFAULT, large: false, **system_arguments, &block|
45
- system_arguments[:classes] = class_names(
46
- system_arguments[:classes],
44
+ renders_one :body, lambda { |caret: CARET_DEFAULT, large: false, **system_arguments|
45
+ @body_arguments = system_arguments
46
+ @body_arguments[:classes] = class_names(
47
+ @body_arguments[:classes],
47
48
  "Popover-message Box",
48
49
  CARET_MAPPINGS[fetch_or_fallback(CARET_MAPPINGS.keys, caret, CARET_DEFAULT)],
49
50
  "Popover-message--large" => large
50
51
  )
51
- system_arguments[:p] ||= 4
52
- system_arguments[:mt] ||= 2
53
- system_arguments[:mx] ||= :auto
54
- system_arguments[:text_align] ||= :left
55
- system_arguments[:box_shadow] ||= :large
52
+ @body_arguments[:p] ||= 4
53
+ @body_arguments[:mt] ||= 2
54
+ @body_arguments[:mx] ||= :auto
55
+ @body_arguments[:text_align] ||= :left
56
+ @body_arguments[:box_shadow] ||= :large
56
57
 
57
- # This is a hack to allow the parent to set the slot's content
58
- @body_arguments = system_arguments
59
- view_context.capture { block&.call }
58
+ Primer::Content.new
60
59
  }
61
60
 
62
61
  # @example Default
@@ -89,20 +88,16 @@ module Primer
89
88
  # <% end %>
90
89
  # <% end %>
91
90
  #
92
- # @example With HTML body
91
+ # @example With multiple elements in the body
93
92
  # <%= render Primer::PopoverComponent.new do |component| %>
94
93
  # <% component.heading do %>
95
94
  # Activity feed
96
95
  # <% end %>
97
96
  # <% component.body(caret: :left) do %>
98
- # <p> This is the Popover body.</p>
99
- # <div>
100
- # This is using HTML.
101
- # <ul>
102
- # <li>Thing #1</li>
103
- # <li>Thing #2</li>
104
- # </ul>
105
- # </div>
97
+ # <p>This is the Popover body.</p>
98
+ # <%= render Primer::ButtonComponent.new(type: :submit) do %>
99
+ # Got it!
100
+ # <% end %>
106
101
  # <% end %>
107
102
  # <% end %>
108
103
  #
@@ -3,7 +3,7 @@
3
3
  module Primer
4
4
  # `Tooltip` is a wrapper component that will apply a tooltip to the provided content.
5
5
  class Tooltip < Primer::Component
6
- status :beta
6
+ status :deprecated
7
7
 
8
8
  DIRECTION_DEFAULT = :n
9
9
  ALIGN_DEFAULT = :default
@@ -4,7 +4,7 @@ module Primer
4
4
  # Module to allow components to deal with the `test_selector` argument.
5
5
  # It will only add the selector if env is not Production.
6
6
  #
7
- # test_selecotr: "foo" => data-test-selector="foo"
7
+ # test_selector: "foo" => data-test-selector="foo"
8
8
  module TestSelectorHelper
9
9
  TEST_SELECTOR_TAG = :test_selector
10
10
 
@@ -19,6 +19,20 @@ 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
+
22
36
  SUPPORTED_KEY_CACHE = Hash.new { |h, k| h[k] = !UTILITIES[k].nil? }
23
37
  BREAKPOINT_INDEX_CACHE = Hash.new { |h, k| h[k] = BREAKPOINTS.index(k) }
24
38
 
@@ -159,15 +173,30 @@ module Primer
159
173
  private
160
174
 
161
175
  def find_selector(selector)
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
176
+ key = infer_selector_key(selector)
177
+ value_hash = UTILITIES[key]
178
+
179
+ return nil if value_hash.blank?
180
+
181
+ # Each value hash will also contain an array of classnames for breakpoints
182
+ # Key argument `0`, classes `[ "mr-0", "mr-sm-0", "mr-md-0", "mr-lg-0", "mr-xl-0" ]`
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))
169
198
  end
170
- @selector_cache[selector]
199
+ selector.split("-").first.to_sym
171
200
  end
172
201
  end
173
202
  end
@@ -5,7 +5,7 @@ module Primer
5
5
  module VERSION
6
6
  MAJOR = 0
7
7
  MINOR = 0
8
- PATCH = 65
8
+ PATCH = 68
9
9
 
10
10
  STRING = [MAJOR, MINOR, PATCH].join(".")
11
11
  end
@@ -0,0 +1,35 @@
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 component names
10
+ #
11
+ # bad
12
+ # Primer::ComponentNameComponent.new()
13
+ #
14
+ # good
15
+ # Primer::Beta::ComponentName.new()
16
+ class ComponentNameMigration < BaseCop
17
+ DEPRECATIONS = {
18
+ "Primer::TestComponent" => "Primer::Beta::Test"
19
+ }.freeze
20
+
21
+ def on_send(node)
22
+ return unless node.method_name == :new && !node.receiver.nil? && DEPRECATIONS.key?(node.receiver.const_name)
23
+
24
+ add_offense(node.receiver, message: "Don't use deprecated names")
25
+ end
26
+
27
+ def autocorrect(node)
28
+ lambda do |corrector|
29
+ corrector.replace(node, DEPRECATIONS[node.const_name])
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
data/lib/tasks/docs.rake CHANGED
@@ -106,7 +106,8 @@ namespace :docs do
106
106
  errors = []
107
107
 
108
108
  # Deletes docs before regenerating them, guaranteeing that we don't keep stale docs.
109
- FileUtils.rm_rf(Dir.glob("docs/content/components/**/*.md"))
109
+ components_content_glob = File.join(*%w[docs content components ** *.md])
110
+ FileUtils.rm_rf(components_content_glob)
110
111
 
111
112
  components.sort_by(&:name).each do |component|
112
113
  documentation = registry.get(component.name)
@@ -114,7 +115,7 @@ namespace :docs do
114
115
  data = docs_metadata(component)
115
116
 
116
117
  path = Pathname.new(data[:path])
117
- path.dirname.mkdir unless path.dirname.exist?
118
+ path.dirname.mkpath unless path.dirname.exist?
118
119
  File.open(path, "w") do |f|
119
120
  f.puts("---")
120
121
  f.puts("title: #{data[:title]}")
@@ -315,7 +316,6 @@ namespace :docs do
315
316
  nav_entries = Dir[File.join(*%w[adr *.md])].sort.map do |orig_path|
316
317
  orig_file_name = File.basename(orig_path)
317
318
  url_name = orig_file_name.chomp(".md")
318
- title = ActiveSupport::Inflector.titleize(url_name.sub(/\A\d+-/, ""))
319
319
 
320
320
  file_contents = File.read(orig_path)
321
321
  file_contents = <<~CONTENTS.sub(/\n+\z/, "\n")
@@ -323,6 +323,12 @@ namespace :docs do
323
323
  #{file_contents}
324
324
  CONTENTS
325
325
 
326
+ title_match = /^# (.+)/.match(file_contents)
327
+ title = title_match[1]
328
+
329
+ # Don't include initial ADR for recording ADRs
330
+ next nil if title == "Record architecture decisions"
331
+
326
332
  File.write(File.join(adr_content_dir, orig_file_name), file_contents)
327
333
  puts "Copied #{orig_path}"
328
334
 
@@ -332,9 +338,9 @@ namespace :docs do
332
338
  nav_yaml_file = File.join(*%w[docs src @primer gatsby-theme-doctocat nav.yml])
333
339
  nav_yaml = YAML.load_file(nav_yaml_file)
334
340
  adr_entry = {
335
- "title" => "Architecture Decisions",
341
+ "title" => "Architecture decisions",
336
342
  "url" => "/adr",
337
- "children" => nav_entries
343
+ "children" => nav_entries.compact
338
344
  }
339
345
 
340
346
  existing_index = nav_yaml.index { |entry| entry["url"] == "/adr" }
@@ -360,7 +366,7 @@ namespace :docs do
360
366
  short_name = component.name.gsub(/Primer|::/, "")
361
367
  initialize_method = documentation.meths.find(&:constructor?)
362
368
 
363
- next unless initialize_method.tags(:example).any?
369
+ next unless initialize_method&.tags(:example)&.any?
364
370
 
365
371
  yard_example_tags = initialize_method.tags(:example)
366
372
 
@@ -5,6 +5,7 @@ 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"
8
9
 
9
10
  # Keys that are looked for to be included in the utilities.yml file
10
11
  # rubocop:disable Lint/ConstantDefinitionInBlock
@@ -28,20 +29,6 @@ namespace :utilities do
28
29
  /^v\b/
29
30
  ].freeze
30
31
 
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
-
45
32
  BREAKPOINTS = [nil, "sm", "md", "lg", "xl"].freeze
46
33
  # rubocop:enable Lint/ConstantDefinitionInBlock
47
34
 
@@ -80,7 +67,7 @@ namespace :utilities do
80
67
  key = ""
81
68
 
82
69
  # Look for a replacement key
83
- REPLACEMENT_KEYS.each do |k, v|
70
+ Primer::Classify::Utilities::REPLACEMENT_KEYS.each do |k, v|
84
71
  next unless classname.match?(Regexp.new(k))
85
72
 
86
73
  key = v
data/static/arguments.yml CHANGED
@@ -165,6 +165,10 @@
165
165
  - component: AutoComplete
166
166
  source: https://github.com/primer/view_components/tree/main/app/components/primer/beta/auto_complete.rb
167
167
  parameters:
168
+ - name: label_text
169
+ type: String
170
+ default: N/A
171
+ description: The label of the input.
168
172
  - name: src
169
173
  type: String
170
174
  default: N/A
@@ -177,6 +181,11 @@
177
181
  type: String
178
182
  default: N/A
179
183
  description: Id of the list element.
184
+ - name: is_label_visible
185
+ type: Boolean
186
+ default: "`true`"
187
+ description: Controls if the label is visible. If `false`, screen reader only
188
+ text will be added.
180
189
  - name: system_arguments
181
190
  type: Hash
182
191
  default: N/A
@@ -11,7 +11,6 @@
11
11
  "Primer::BaseButton": "",
12
12
  "Primer::BaseComponent": "",
13
13
  "Primer::Beta::AutoComplete": "",
14
- "Primer::Beta::AutoComplete::Input": "",
15
14
  "Primer::Beta::AutoComplete::Item": "",
16
15
  "Primer::Beta::Avatar": "",
17
16
  "Primer::Beta::AvatarStack": "",
@@ -28,6 +27,7 @@
28
27
  "Primer::ButtonGroup": "",
29
28
  "Primer::ClipboardCopy": "",
30
29
  "Primer::CloseButton": "",
30
+ "Primer::Content": "",
31
31
  "Primer::CounterComponent": "",
32
32
  "Primer::DetailsComponent": "",
33
33
  "Primer::Dropdown": "",
data/static/classes.yml CHANGED
@@ -88,7 +88,10 @@
88
88
  - ".avatar-more"
89
89
  - ".avatar-small"
90
90
  - ".blankslate"
91
+ - ".blankslate-action"
92
+ - ".blankslate-heading"
91
93
  - ".blankslate-icon"
94
+ - ".blankslate-image"
92
95
  - ".blankslate-narrow"
93
96
  - ".blankslate-spacious"
94
97
  - ".border"
@@ -163,7 +166,6 @@
163
166
  - ".form-control"
164
167
  - ".gutter-condensed"
165
168
  - ".gutter-lg"
166
- - ".h2"
167
169
  - ".hidden-text-expander"
168
170
  - ".inline"
169
171
  - ".left-0"
@@ -171,9 +173,7 @@
171
173
  - ".list-style-none"
172
174
  - ".markdown-body"
173
175
  - ".mb-0"
174
- - ".mb-1"
175
176
  - ".mb-2"
176
- - ".mb-3"
177
177
  - ".menu"
178
178
  - ".menu-heading"
179
179
  - ".menu-item"
@@ -181,7 +181,6 @@
181
181
  - ".mr-2"
182
182
  - ".mr-n1"
183
183
  - ".mt-2"
184
- - ".mt-3"
185
184
  - ".mt-5"
186
185
  - ".mx-auto"
187
186
  - ".no-underline"
@@ -194,6 +193,7 @@
194
193
  - ".pr-2"
195
194
  - ".pt-5"
196
195
  - ".right-0"
196
+ - ".sr-only"
197
197
  - ".tabnav"
198
198
  - ".tabnav-tab"
199
199
  - ".tabnav-tabs"
@@ -181,16 +181,8 @@
181
181
  ]
182
182
  },
183
183
  "Primer::Beta::AutoComplete": {
184
- "Input": "Primer::Beta::AutoComplete::Input",
185
184
  "Item": "Primer::Beta::AutoComplete::Item"
186
185
  },
187
- "Primer::Beta::AutoComplete::Input": {
188
- "DEFAULT_TYPE": "text",
189
- "TYPE_OPTIONS": [
190
- "text",
191
- "search"
192
- ]
193
- },
194
186
  "Primer::Beta::AutoComplete::Item": {
195
187
  },
196
188
  "Primer::Beta::Avatar": {
@@ -317,6 +309,8 @@
317
309
  "submit"
318
310
  ]
319
311
  },
312
+ "Primer::Content": {
313
+ },
320
314
  "Primer::CounterComponent": {
321
315
  "DEFAULT_SCHEME": "default",
322
316
  "DEPRECATED_SCHEME_OPTIONS": [
data/static/statuses.json CHANGED
@@ -11,7 +11,6 @@
11
11
  "Primer::BaseButton": "beta",
12
12
  "Primer::BaseComponent": "beta",
13
13
  "Primer::Beta::AutoComplete": "beta",
14
- "Primer::Beta::AutoComplete::Input": "alpha",
15
14
  "Primer::Beta::AutoComplete::Item": "beta",
16
15
  "Primer::Beta::Avatar": "beta",
17
16
  "Primer::Beta::AvatarStack": "beta",
@@ -28,6 +27,7 @@
28
27
  "Primer::ButtonGroup": "beta",
29
28
  "Primer::ClipboardCopy": "beta",
30
29
  "Primer::CloseButton": "beta",
30
+ "Primer::Content": "stable",
31
31
  "Primer::CounterComponent": "beta",
32
32
  "Primer::DetailsComponent": "beta",
33
33
  "Primer::Dropdown": "alpha",
@@ -61,6 +61,6 @@
61
61
  "Primer::TimeAgoComponent": "beta",
62
62
  "Primer::TimelineItemComponent": "beta",
63
63
  "Primer::TimelineItemComponent::BadgeComponent": "alpha",
64
- "Primer::Tooltip": "beta",
64
+ "Primer::Tooltip": "deprecated",
65
65
  "Primer::Truncate": "beta"
66
66
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: primer_view_components
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.65
4
+ version: 0.0.68
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub Open Source
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-17 00:00:00.000000000 Z
11
+ date: 2022-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionview
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '15'
47
+ version: '16'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '15'
54
+ version: '16'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: view_component
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -425,6 +425,7 @@ files:
425
425
  - app/components/primer/clipboard_copy_component.ts
426
426
  - app/components/primer/close_button.rb
427
427
  - app/components/primer/component.rb
428
+ - app/components/primer/content.rb
428
429
  - app/components/primer/counter_component.rb
429
430
  - app/components/primer/details_component.html.erb
430
431
  - app/components/primer/details_component.rb
@@ -542,6 +543,7 @@ files:
542
543
  - lib/rubocop/config/default.yml
543
544
  - lib/rubocop/cop/primer.rb
544
545
  - lib/rubocop/cop/primer/base_cop.rb
546
+ - lib/rubocop/cop/primer/component_name_migration.rb
545
547
  - lib/rubocop/cop/primer/deprecated_arguments.rb
546
548
  - lib/rubocop/cop/primer/deprecated_button_arguments.rb
547
549
  - lib/rubocop/cop/primer/deprecated_label_schemes.rb
@@ -586,7 +588,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
586
588
  - !ruby/object:Gem::Version
587
589
  version: '0'
588
590
  requirements: []
589
- rubygems_version: 3.1.2
591
+ rubygems_version: 3.1.6
590
592
  signing_key:
591
593
  specification_version: 4
592
594
  summary: ViewComponents for the Primer Design System