primer_view_components 0.0.41 → 0.0.42

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: 7688c3b98d5f6ccb72ff70e62ed06b97b0b5278249fb4aae39501b6b6fa8d009
4
- data.tar.gz: b7cbebb4f08c8d380e164b62b9a15fc9fde7d03c1c7ca633f057e50daecbe6a4
3
+ metadata.gz: 84c899ab3302b9bffbfe3f0d6471a732d3f457fa8f2eec84a3e7e4b9a9e003b0
4
+ data.tar.gz: b3f96f4caf1154320ebe772c3696526901ad07b9cd0b2327383b94b995c8bac4
5
5
  SHA512:
6
- metadata.gz: 70a4c3486366d38a89aed292a00a1b196b40031c3f0e53e13dd6bd330805bf0e74c4d631ece19d727c9dd358bfa14075cdd8ae099e2ef9dc715046151f700085
7
- data.tar.gz: 94bbad0f1b3b7cb267e566f76deddbacd7ca18b9f8965988c67aff403f4fc297ca926aa55e8881d242a249a4bf61b4b428f4a42e2131a8b0f981ddea4b2c9154
6
+ metadata.gz: 9cab0b4a7016357d29d099e07ae047a335dc4e394422250cada38c4f861900433a639b20748ae239a0962eb49c4cb0b5a1279746bfab2c5713f51647834c6056
7
+ data.tar.gz: 89e0b7c38eff95e73b6e0f829153b14033644bd74553fef7a784a9d25d16b7fd52aea7305e4163c1ef294a8a758c4278d24b5f25d6bb194be994f31dd07401e5
data/CHANGELOG.md CHANGED
@@ -2,6 +2,48 @@
2
2
 
3
3
  ## main
4
4
 
5
+ ## 0.0.42
6
+
7
+ ### New
8
+
9
+ * Add `font_family`, `font_style` and `text_transform` system arguments.
10
+
11
+ *Manuel Puyol*
12
+
13
+ * Add more options for `font_size` and `font_weight`.
14
+
15
+ *Manuel Puyol*
16
+
17
+ ### Updates
18
+
19
+ * Add `align` option to the `TabNav` extra slot to allow HTML ordering.
20
+
21
+ *Manuel Puyol*
22
+
23
+ ### Misc
24
+
25
+ * Auto-generate component previews from doc examples and run integration test checks.
26
+
27
+ *Kate Higa, Joel Hawksley*
28
+
29
+ * Configure previews controller to allow view helper usage in preview template.
30
+
31
+ *Kate Higa*
32
+
33
+ * Only include `ViewComponent::SlotableV2` if `ViewComponent::Base` does not already include it.
34
+
35
+ *Manuel Puyol*
36
+
37
+ * Add `force_system_arguments` option to raise an error if a class is used instead of using System Arguments.
38
+
39
+ *Manuel Puyol*
40
+
41
+ ### Breaking changes
42
+
43
+ * Restrict allowed tags for `Truncate`, `Markdown`, and `HiddenTextExpander`.
44
+
45
+ *Kate Higa*
46
+
5
47
  ## 0.0.41
6
48
 
7
49
  ### New
@@ -46,6 +88,10 @@
46
88
 
47
89
  ### Breaking changes
48
90
 
91
+ * Rename `TooltipComponent` to `Tooltip`.
92
+
93
+ *Manuel Puyol*
94
+
49
95
  * Don't allow `OcticonComponent` height/width values under 16px
50
96
 
51
97
  *Jon Rohan*
@@ -54,7 +54,7 @@ module Primer
54
54
  # @example With custom classes for the results
55
55
  # <%= render(Primer::AutoComplete.new(src: "/users/search", id: "user-popup", position: :relative)) do |c| %>
56
56
  # <% c.input(type: :text, name: "input") %>
57
- # <% c.results(classes: "my-custom-class") do %>
57
+ # <% c.results(classes: "custom-class") do %>
58
58
  # <%= render(Primer::AutoComplete::Item.new(selected: true, value: "value")) do |c| %>
59
59
  # Selected
60
60
  # <% end %>
@@ -129,9 +129,12 @@ module Primer
129
129
  #
130
130
  # | Name | Type | Description |
131
131
  # | :- | :- | :- |
132
- # | `font_size` | String, Integer | <%= one_of(["00", 0, 1, 2, 3, 4, 5, 6]) %> |
133
- # | `font_weight` | Symbol | Font weight. <%= one_of([:light, :normal, :bold]) %> |
132
+ # | `font_family` | Symbol | Font weight. <%= one_of([:mono]) %> |
133
+ # | `font_size` | String, Integer, Symbol | <%= one_of(["00", 0, 1, 2, 3, 4, 5, 6, :small, :normal]) %> |
134
+ # | `font_style` | Symbol | Font weight. <%= one_of([:italic]) %> |
135
+ # | `font_weight` | Symbol | Font weight. <%= one_of([:light, :normal, :bold, :emphasized]) %> |
134
136
  # | `text_align` | Symbol | Text alignment. <%= one_of([:left, :right, :center]) %> |
137
+ # | `text_transform` | Symbol | Text alignment. <%= one_of([:uppercase]) %> |
135
138
  # | `underline` | Boolean | Whether text should be underlined. |
136
139
  # | `word_break` | Symbol | Whether to break words on line breaks. Can only be `:break_all`. |
137
140
  #
@@ -22,7 +22,7 @@ module Primer
22
22
  # <% component.button(scheme: :primary) { "Primary" } %>
23
23
  # <% component.button(scheme: :danger) { "Danger" } %>
24
24
  # <% component.button(scheme: :outline) { "Outline" } %>
25
- # <% component.button(classes: "my-class") { "Custom class" } %>
25
+ # <% component.button(classes: "custom-class") { "Custom class" } %>
26
26
  # <% end %>
27
27
  #
28
28
  # @example Variants
@@ -5,7 +5,7 @@ require "view_component/version"
5
5
  module Primer
6
6
  # @private
7
7
  class Component < ViewComponent::Base
8
- include ViewComponent::SlotableV2 unless ViewComponent::VERSION::STRING.to_f >= 2.28
8
+ include ViewComponent::SlotableV2 unless ViewComponent::Base < ViewComponent::SlotableV2
9
9
  include ClassNameHelper
10
10
  include FetchOrFallbackHelper
11
11
  include TestSelectorHelper
@@ -10,14 +10,14 @@ module Primer
10
10
  # <%= render(Primer::HiddenTextExpander.new(inline: true)) %>
11
11
  #
12
12
  # @example Styling the button
13
- # <%= render(Primer::HiddenTextExpander.new(button_arguments: { p: 1, classes: "my-custom-class" })) %>
13
+ # <%= render(Primer::HiddenTextExpander.new(button_arguments: { p: 1, classes: "custom-class" })) %>
14
14
  #
15
15
  # @param inline [Boolean] Whether or not the expander is inline.
16
16
  # @param button_arguments [Hash] <%= link_to_system_arguments_docs %> for the button element.
17
17
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
18
18
  def initialize(inline: false, button_arguments: {}, **system_arguments)
19
19
  @system_arguments = system_arguments
20
- @system_arguments[:tag] ||= :span
20
+ @system_arguments[:tag] = :span
21
21
  @system_arguments[:classes] = class_names(
22
22
  "hidden-text-expander",
23
23
  @system_arguments[:classes],
@@ -20,7 +20,7 @@ module Primer
20
20
  #
21
21
  # @example Cropper with a custom loader
22
22
  # <%= render(Primer::ImageCrop.new(src: "https://github.com/koddsson.png", rounded: false)) do |cropper| %>
23
- # <% cropper.loading(style: "width: 120px", tag: :img, src: "spinner.gif") %>
23
+ # <% cropper.loading(style: "width: 120px").with_content("Loading...") %>
24
24
  # <% end %>
25
25
  #
26
26
  # @param src [String] The path of the image to crop.
@@ -4,6 +4,9 @@ module Primer
4
4
  # Use `Markdown` to wrap markdown content
5
5
  class Markdown < Primer::Component
6
6
  status :beta
7
+
8
+ DEFAULT_TAG = :div
9
+ TAG_OPTIONS = [DEFAULT_TAG, :article, :td].freeze
7
10
  # @example Default
8
11
  # <%= render(Primer::Markdown.new) do %>
9
12
  # <p>Text can be <b>bold</b>, <i>italic</i>, or <s>strikethrough</s>. <a href="https://github.com">Links </a> should be blue with no underlines (unless hovered over).</p>
@@ -276,10 +279,11 @@ module Primer
276
279
  # <pre><code>This is the final element on the page and there should be no margin below this.</code></pre>
277
280
  # <% end %>
278
281
  #
282
+ # @param tag [Symbol] <%= one_of(Primer::Markdown::TAG_OPTIONS) %>
279
283
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
280
- def initialize(**system_arguments)
284
+ def initialize(tag: DEFAULT_TAG, **system_arguments)
281
285
  @system_arguments = system_arguments
282
- @system_arguments[:tag] ||= :div
286
+ @system_arguments[:tag] = fetch_or_fallback(TAG_OPTIONS, tag, DEFAULT_TAG)
283
287
 
284
288
  @system_arguments[:classes] = class_names(
285
289
  "markdown-body",
@@ -35,7 +35,7 @@ module Primer
35
35
  icon_key = icon_name || icon
36
36
 
37
37
  # Don't allow sizes under 16px
38
- if system_arguments[:height].present? && system_arguments[:height] < 16 || system_arguments[:width].present? && system_arguments[:width] < 16
38
+ if system_arguments[:height].present? && system_arguments[:height].to_i < 16 || system_arguments[:width].present? && system_arguments[:width].to_i < 16
39
39
  system_arguments.delete(:height)
40
40
  system_arguments.delete(:width)
41
41
  end
@@ -1,12 +1,14 @@
1
1
  <%= wrapper do %>
2
2
  <%= render Primer::BaseComponent.new(**@system_arguments) do %>
3
- <%= extra %>
3
+ <%= extra if @align == :left %>
4
4
 
5
5
  <%= render Primer::BaseComponent.new(**@body_arguments) do %>
6
6
  <% tabs.each do |tab| %>
7
7
  <%= tab %>
8
8
  <% end %>
9
9
  <% end %>
10
+
11
+ <%= extra if @align == :right %>
10
12
  <% end %>
11
13
 
12
14
  <% if @with_panel %>
@@ -5,6 +5,9 @@ module Primer
5
5
  class TabNavComponent < Primer::Component
6
6
  include Primer::TabbedComponentHelper
7
7
 
8
+ DEFAULT_EXTRA_ALIGN = :left
9
+ EXTRA_ALIGN_OPTIONS = [DEFAULT_EXTRA_ALIGN, :right].freeze
10
+
8
11
  # Tabs to be rendered. For more information, refer to <%= link_to_component(Primer::Navigation::TabComponent) %>.
9
12
  #
10
13
  # @param selected [Boolean] Whether the tab is selected.
@@ -23,7 +26,13 @@ module Primer
23
26
  }
24
27
 
25
28
  # Renders extra content to the `TabNav`. This will be rendered after the tabs.
26
- renders_one :extra
29
+ #
30
+ # @param align [Symbol] <%= one_of(Primer::TabNavComponent::EXTRA_ALIGN_OPTIONS) %>
31
+ renders_one :extra, lambda { |align: DEFAULT_EXTRA_ALIGN, &block|
32
+ @align = fetch_or_fallback(EXTRA_ALIGN_OPTIONS, align, DEFAULT_EXTRA_ALIGN)
33
+
34
+ view_context.capture { block&.call }
35
+ }
27
36
 
28
37
  # @example Default
29
38
  # <%= render(Primer::TabNavComponent.new(label: "Default")) do |c| %>
@@ -72,7 +81,7 @@ module Primer
72
81
  # <% end %>
73
82
  #
74
83
  # @example With extra content
75
- # <%= render(Primer::TabNavComponent.new(label: "Default")) do |c| %>
84
+ # <%= render(Primer::TabNavComponent.new(label: "With extra content")) do |c| %>
76
85
  # <% c.tab(selected: true, href: "#") { "Tab 1" }%>
77
86
  # <% c.tab(href: "#") { "Tab 2" } %>
78
87
  # <% c.tab(href: "#") { "Tab 3" } %>
@@ -81,11 +90,24 @@ module Primer
81
90
  # <% end %>
82
91
  # <% end %>
83
92
  #
93
+ # @example Adding extra content after the tabs
94
+ # <%= render(Primer::TabNavComponent.new(label: "Adding extra content after the tabs", display: :flex, body_arguments: { flex: 1 })) do |c| %>
95
+ # <% c.tab(selected: true, href: "#") { "Tab 1" }%>
96
+ # <% c.tab(href: "#") { "Tab 2" } %>
97
+ # <% c.tab(href: "#") { "Tab 3" } %>
98
+ # <% c.extra(align: :right) do %>
99
+ # <div>
100
+ # <%= render(Primer::ButtonComponent.new) { "Button" } %>
101
+ # </div>
102
+ # <% end %>
103
+ # <% end %>
104
+ #
84
105
  # @param label [String] Used to set the `aria-label` on the top level `<nav>` element.
85
106
  # @param with_panel [Boolean] Whether the TabNav should navigate through pages or panels.
86
107
  # @param body_arguments [Hash] <%= link_to_system_arguments_docs %> for the body wrapper.
87
108
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
88
109
  def initialize(label:, with_panel: false, body_arguments: {}, **system_arguments)
110
+ @align = DEFAULT_EXTRA_ALIGN
89
111
  @with_panel = with_panel
90
112
  @system_arguments = system_arguments
91
113
  @body_arguments = body_arguments
@@ -5,6 +5,9 @@ module Primer
5
5
  class Truncate < Primer::Component
6
6
  status :beta
7
7
 
8
+ DEFAULT_TAG = :div
9
+ TAG_OPTIONS = [DEFAULT_TAG, :span, :p].freeze
10
+
8
11
  # @example Default
9
12
  # <div class="col-2">
10
13
  # <%= render(Primer::Truncate.new(tag: :p)) { "branch-name-that-is-really-long" } %>
@@ -19,13 +22,14 @@ module Primer
19
22
  # @example Custom size
20
23
  # <%= render(Primer::Truncate.new(tag: :span, inline: true, expandable: true, max_width: 100)) { "branch-name-that-is-really-long" } %>
21
24
  #
25
+ # @param tag [Symbol] <%= one_of(Primer::Truncate::TAG_OPTIONS) %>
22
26
  # @param inline [Boolean] Whether the element is inline (or inline-block).
23
27
  # @param expandable [Boolean] Whether the entire string should be revealed on hover. Can only be used in conjunction with `inline`.
24
28
  # @param max_width [Integer] Sets the max-width of the text.
25
29
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
26
- def initialize(inline: false, expandable: false, max_width: nil, **system_arguments)
30
+ def initialize(tag: DEFAULT_TAG, inline: false, expandable: false, max_width: nil, **system_arguments)
27
31
  @system_arguments = system_arguments
28
- @system_arguments[:tag] ||= :div
32
+ @system_arguments[:tag] = fetch_or_fallback(TAG_OPTIONS, tag, DEFAULT_TAG)
29
33
  @system_arguments[:classes] = class_names(
30
34
  @system_arguments[:classes],
31
35
  "css-truncate",
@@ -16,7 +16,7 @@ module Primer
16
16
  BG_KEY = :bg
17
17
  VERTICAL_ALIGN_KEY = :vertical_align
18
18
  WORD_BREAK_KEY = :word_break
19
- TEXT_KEYS = %i[text_align font_weight].freeze
19
+ TEXT_KEYS = %i[font_family font_style font_weight text_align text_transform].freeze
20
20
  WIDTH_KEY = :width
21
21
  HEIGHT_KEY = :height
22
22
  BOX_SHADOW_KEY = :box_shadow
@@ -123,7 +123,7 @@ module Primer
123
123
  def validated_class_names(classes)
124
124
  return if classes.blank?
125
125
 
126
- if ENV["RAILS_ENV"] == "development" && !ENV["PRIMER_WARNINGS_DISABLED"]
126
+ if force_system_arguments? && !ENV["PRIMER_WARNINGS_DISABLED"]
127
127
  invalid_class_names =
128
128
  classes.split(" ").each_with_object([]) do |class_name, memo|
129
129
  memo << class_name if INVALID_CLASS_NAME_PREFIXES.any? { |prefix| class_name.start_with?(prefix) }
@@ -215,7 +215,11 @@ module Primer
215
215
  elsif TEXT_KEYS.include?(key)
216
216
  memo[:classes] << "text-#{val.to_s.dasherize}"
217
217
  elsif TYPOGRAPHY_KEYS.include?(key)
218
- memo[:classes] << "f#{val.to_s.dasherize}"
218
+ memo[:classes] << if val == :small || val == :normal
219
+ "text-#{val.to_s.dasherize}"
220
+ else
221
+ "f#{val.to_s.dasherize}"
222
+ end
219
223
  elsif key == BOX_SHADOW_KEY
220
224
  memo[:classes] << if val == true
221
225
  "color-shadow-small"
@@ -236,6 +240,10 @@ module Primer
236
240
  memo[:classes] << "#{key.to_s.dasherize}#{breakpoint}-#{val.to_s.dasherize}"
237
241
  end
238
242
  end
243
+
244
+ def force_system_arguments?
245
+ Rails.application.config.primer_view_components.force_system_arguments
246
+ end
239
247
  end
240
248
 
241
249
  Cache.preload!
@@ -13,7 +13,9 @@ module Primer
13
13
  ]
14
14
 
15
15
  config.primer_view_components = ActiveSupport::OrderedOptions.new
16
+
16
17
  config.primer_view_components.force_functional_colors = true
18
+ config.primer_view_components.force_system_arguments = false
17
19
  config.primer_view_components.silence_deprecations = false
18
20
 
19
21
  initializer "primer_view_components.assets" do |app|
@@ -5,7 +5,7 @@ module Primer
5
5
  module VERSION
6
6
  MAJOR = 0
7
7
  MINOR = 0
8
- PATCH = 41
8
+ PATCH = 42
9
9
 
10
10
  STRING = [MAJOR, MINOR, PATCH].join(".")
11
11
  end
data/lib/tasks/docs.rake CHANGED
@@ -302,6 +302,41 @@ namespace :docs do
302
302
 
303
303
  puts "Markdown compiled."
304
304
 
305
+ # Generate previews from documentation examples
306
+ components.each do |component|
307
+ documentation = registry.get(component.name)
308
+ short_name = component.name.gsub(/Primer|::/, "")
309
+ initialize_method = documentation.meths.find(&:constructor?)
310
+
311
+ next unless initialize_method.tags(:example).any?
312
+
313
+ yard_example_tags = initialize_method.tags(:example)
314
+
315
+ path = Pathname.new("demo/test/components/previews/primer/docs/#{short_name.underscore}_preview.rb")
316
+ path.dirname.mkdir unless path.dirname.exist?
317
+
318
+ File.open(path, "w") do |f|
319
+ f.puts("module Primer")
320
+ f.puts(" module Docs")
321
+ f.puts(" class #{short_name}Preview < ViewComponent::Preview")
322
+
323
+ yard_example_tags.each_with_index do |tag, index|
324
+ method_name = tag.name.split("|").first.downcase.parameterize.underscore
325
+ f.puts(" def #{method_name}; end")
326
+ f.puts unless index == yard_example_tags.size - 1
327
+ path = Pathname.new("demo/test/components/previews/primer/docs/#{short_name.underscore}_preview/#{method_name}.html.erb")
328
+ path.dirname.mkdir unless path.dirname.exist?
329
+ File.open(path, "w") do |view_file|
330
+ view_file.puts(tag.text.to_s)
331
+ end
332
+ end
333
+
334
+ f.puts(" end")
335
+ f.puts(" end")
336
+ f.puts("end")
337
+ end
338
+ end
339
+
305
340
  if components_without_examples.any?
306
341
  puts
307
342
  puts "The following components have no examples defined: #{components_without_examples.map(&:name).join(', ')}. Consider adding an example?"
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.41
4
+ version: 0.0.42
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-05-17 00:00:00.000000000 Z
11
+ date: 2021-05-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionview
@@ -482,7 +482,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
482
482
  - !ruby/object:Gem::Version
483
483
  version: '0'
484
484
  requirements: []
485
- rubygems_version: 3.1.2
485
+ rubygems_version: 3.0.3
486
486
  signing_key:
487
487
  specification_version: 4
488
488
  summary: ViewComponents for the Primer Design System