primer_view_components 0.0.39 → 0.0.44

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.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +269 -3
  3. data/app/assets/javascripts/primer_view_components.js +1 -1
  4. data/app/assets/javascripts/primer_view_components.js.map +1 -1
  5. data/app/components/primer/alpha/button_marketing.rb +70 -0
  6. data/app/components/primer/auto_complete.rb +99 -41
  7. data/app/components/primer/auto_complete/auto_complete.html.erb +1 -0
  8. data/app/components/primer/avatar_stack_component.rb +7 -4
  9. data/app/components/primer/base_component.rb +17 -7
  10. data/app/components/primer/beta/text.rb +27 -0
  11. data/app/components/primer/blankslate_component.html.erb +1 -0
  12. data/app/components/primer/blankslate_component.rb +68 -49
  13. data/app/components/primer/button_component.rb +3 -2
  14. data/app/components/primer/button_group.rb +2 -2
  15. data/app/components/primer/clipboard_copy_component.js +13 -2
  16. data/app/components/primer/clipboard_copy_component.ts +15 -2
  17. data/app/components/primer/component.rb +6 -1
  18. data/app/components/primer/counter_component.rb +6 -1
  19. data/app/components/primer/details_component.rb +12 -1
  20. data/app/components/primer/dropdown.d.ts +1 -0
  21. data/app/components/primer/{dropdown_component.html.erb → dropdown.html.erb} +2 -1
  22. data/app/components/primer/dropdown.js +1 -0
  23. data/app/components/primer/dropdown.rb +149 -0
  24. data/app/components/primer/dropdown.ts +1 -0
  25. data/app/components/primer/dropdown/menu.d.ts +1 -0
  26. data/app/components/primer/dropdown/menu.html.erb +25 -0
  27. data/app/components/primer/dropdown/menu.js +1 -0
  28. data/app/components/primer/dropdown/menu.rb +99 -0
  29. data/app/components/primer/dropdown/menu.ts +1 -0
  30. data/app/components/primer/flash_component.rb +2 -2
  31. data/app/components/primer/flex_component.rb +27 -0
  32. data/app/components/primer/flex_item_component.rb +1 -1
  33. data/app/components/primer/heading_component.rb +11 -18
  34. data/app/components/primer/hidden_text_expander.rb +3 -3
  35. data/app/components/primer/icon_button.rb +20 -3
  36. data/app/components/primer/image.rb +46 -0
  37. data/app/components/primer/image_crop.d.ts +1 -0
  38. data/app/components/primer/image_crop.html.erb +12 -0
  39. data/app/components/primer/image_crop.js +1 -0
  40. data/app/components/primer/image_crop.rb +36 -0
  41. data/app/components/primer/image_crop.ts +1 -0
  42. data/app/components/primer/label_component.rb +6 -2
  43. data/app/components/primer/local_time.d.ts +1 -0
  44. data/app/components/primer/local_time.js +1 -0
  45. data/app/components/primer/local_time.rb +59 -0
  46. data/app/components/primer/local_time.ts +1 -0
  47. data/app/components/primer/{markdown_component.rb → markdown.rb} +11 -6
  48. data/app/components/primer/navigation/tab_component.rb +10 -3
  49. data/app/components/primer/octicon_component.html.erb +7 -0
  50. data/app/components/primer/octicon_component.rb +25 -15
  51. data/app/components/primer/octicon_symbols_component.html.erb +3 -0
  52. data/app/components/primer/octicon_symbols_component.rb +61 -0
  53. data/app/components/primer/primer.d.ts +3 -0
  54. data/app/components/primer/primer.js +3 -0
  55. data/app/components/primer/primer.ts +3 -0
  56. data/app/components/primer/spinner_component.rb +4 -2
  57. data/app/components/primer/subhead_component.rb +34 -4
  58. data/app/components/primer/tab_nav_component.html.erb +5 -1
  59. data/app/components/primer/tab_nav_component.rb +62 -9
  60. data/app/components/primer/{tooltip_component.rb → tooltip.rb} +10 -8
  61. data/app/components/primer/truncate.rb +6 -2
  62. data/app/components/primer/underline_nav_component.html.erb +1 -1
  63. data/app/components/primer/underline_nav_component.rb +17 -1
  64. data/app/lib/primer/classify.rb +21 -8
  65. data/app/lib/primer/classify/cache.rb +16 -1
  66. data/app/lib/primer/classify/grid.rb +45 -0
  67. data/app/lib/primer/octicon/cache.rb +4 -0
  68. data/app/lib/primer/tabbed_component_helper.rb +2 -2
  69. data/app/lib/primer/view_helper.rb +2 -1
  70. data/lib/primer/view_components.rb +1 -1
  71. data/lib/primer/view_components/engine.rb +2 -0
  72. data/lib/primer/view_components/linters.rb +3 -0
  73. data/lib/primer/view_components/linters/argument_mappers/button.rb +82 -0
  74. data/lib/primer/view_components/linters/argument_mappers/conversion_error.rb +10 -0
  75. data/lib/primer/view_components/linters/argument_mappers/system_arguments.rb +46 -0
  76. data/lib/primer/view_components/linters/button_component_migration_counter.rb +35 -0
  77. data/lib/primer/view_components/linters/flash_component_migration_counter.rb +16 -0
  78. data/lib/primer/view_components/linters/helpers.rb +93 -0
  79. data/lib/primer/view_components/version.rb +1 -1
  80. data/lib/tasks/coverage.rake +14 -0
  81. data/lib/tasks/docs.rake +387 -0
  82. data/lib/tasks/statuses.rake +12 -0
  83. data/lib/yard/docs_helper.rb +67 -0
  84. data/static/statuses.json +56 -1
  85. metadata +72 -13
  86. data/app/components/primer/button_marketing_component.rb +0 -68
  87. data/app/components/primer/dropdown/menu_component.html.erb +0 -12
  88. data/app/components/primer/dropdown/menu_component.rb +0 -46
  89. data/app/components/primer/dropdown_component.rb +0 -73
  90. data/app/components/primer/text_component.rb +0 -22
@@ -2,3 +2,6 @@ import './auto_complete/auto_complete';
2
2
  import './clipboard_copy_component';
3
3
  import './tab_container_component';
4
4
  import './time_ago_component';
5
+ import './local_time';
6
+ import './image_crop';
7
+ import './dropdown';
@@ -2,3 +2,6 @@ import './auto_complete/auto_complete';
2
2
  import './clipboard_copy_component';
3
3
  import './tab_container_component';
4
4
  import './time_ago_component';
5
+ import './local_time';
6
+ import './image_crop';
7
+ import './dropdown';
@@ -2,3 +2,6 @@ import './auto_complete/auto_complete'
2
2
  import './clipboard_copy_component'
3
3
  import './tab_container_component'
4
4
  import './time_ago_component'
5
+ import './local_time'
6
+ import './image_crop'
7
+ import './dropdown'
@@ -27,10 +27,12 @@ module Primer
27
27
  # <%= render(Primer::SpinnerComponent.new(size: :large)) %>
28
28
  #
29
29
  # @param size [Symbol] <%= one_of(Primer::SpinnerComponent::SIZE_MAPPINGS) %>
30
- def initialize(size: DEFAULT_SIZE, **system_arguments)
30
+ # @param style [String] Custom element styles.
31
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
32
+ def initialize(size: DEFAULT_SIZE, style: DEFAULT_STYLE, **system_arguments)
31
33
  @system_arguments = system_arguments
32
34
  @system_arguments[:tag] = :svg
33
- @system_arguments[:style] ||= DEFAULT_STYLE
35
+ @system_arguments[:style] ||= style
34
36
  @system_arguments[:animation] = :rotate
35
37
  @system_arguments[:width] = SIZE_MAPPINGS[fetch_or_fallback(SIZE_OPTIONS, size, DEFAULT_SIZE)]
36
38
  @system_arguments[:height] = SIZE_MAPPINGS[fetch_or_fallback(SIZE_OPTIONS, size, DEFAULT_SIZE)]
@@ -1,16 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
- # Use `Subhead` for page headings.
4
+ # Use `Subhead` as the start of a section. The `:heading` slot will render an `<h2>` font-sized text.
5
+ #
6
+ # - Optionally set the `:description` slot to render a short description and the `:actions` slot for a related action.
7
+ # - Use a succint, one-line description for the `:description` slot. For longer descriptions, omit the description slot and render a paragraph below the `Subhead`.
8
+ # - Use the actions slot to render a related action to the right of the heading. Use <%= link_to_component(Primer::ButtonComponent) %> or <%= link_to_component(Primer::LinkComponent) %>.
9
+ #
10
+ # @accessibility
11
+ # The `:heading` slot defaults to rendering a `<div>`. Update the tag to a heading element with the appropriate level to improve page navigation for assistive technologies.
12
+ # <%= link_to_heading_practices %>
5
13
  class SubheadComponent < Primer::Component
6
14
  status :beta
7
15
 
16
+ DEFAULT_HEADING_TAG = :div
17
+ HEADING_TAG_OPTIONS = [DEFAULT_HEADING_TAG, :h1, :h2, :h3, :h4, :h5, :h6].freeze
18
+
8
19
  # The heading
9
20
  #
21
+ # @param tag [Symbol] <%= one_of(Primer::SubheadComponent::HEADING_TAG_OPTIONS)%>
10
22
  # @param danger [Boolean] Whether to style the heading as dangerous.
11
23
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
12
- renders_one :heading, lambda { |danger: false, **system_arguments|
13
- system_arguments[:tag] ||= :div
24
+ renders_one :heading, lambda { |tag: DEFAULT_HEADING_TAG, danger: false, **system_arguments|
25
+ system_arguments[:tag] = fetch_or_fallback(HEADING_TAG_OPTIONS, tag, DEFAULT_HEADING_TAG)
14
26
  system_arguments[:classes] = class_names(
15
27
  system_arguments[:classes],
16
28
  "Subhead-heading",
@@ -42,7 +54,7 @@ module Primer
42
54
 
43
55
  # @example Default
44
56
  # <%= render(Primer::SubheadComponent.new) do |component| %>
45
- # <% component.heading do %>
57
+ # <% component.heading(tag: :h3) do %>
46
58
  # My Heading
47
59
  # <% end %>
48
60
  # <% component.description do %>
@@ -50,6 +62,24 @@ module Primer
50
62
  # <% end %>
51
63
  # <% end %>
52
64
  #
65
+ # @example With dangerous heading
66
+ # <%= render(Primer::SubheadComponent.new) do |component| %>
67
+ # <% component.heading(tag: :h3, danger: true) do %>
68
+ # My Heading
69
+ # <% end %>
70
+ # <% component.description do %>
71
+ # My Description
72
+ # <% end %>
73
+ # <% end %>
74
+ #
75
+ # @example With long description
76
+ # <%= render(Primer::SubheadComponent.new) do |component| %>
77
+ # <% component.heading(tag: :h3) do %>
78
+ # My Heading
79
+ # <% end %>
80
+ # <% end %>
81
+ # <p> This is a longer description that is sitting below the Subhead. It's much longer than a description that could sit comfortably in the Subhead. </p>
82
+ #
53
83
  # @example Without border
54
84
  # <%= render(Primer::SubheadComponent.new(hide_border: true)) do |component| %>
55
85
  # <% component.heading do %>
@@ -1,10 +1,14 @@
1
- <%= wrapper do %>
1
+ <%= wrapper(**@wrapper_arguments) do %>
2
2
  <%= render Primer::BaseComponent.new(**@system_arguments) do %>
3
+ <%= extra if @align == :left %>
4
+
3
5
  <%= render Primer::BaseComponent.new(**@body_arguments) do %>
4
6
  <% tabs.each do |tab| %>
5
7
  <%= tab %>
6
8
  <% end %>
7
9
  <% end %>
10
+
11
+ <%= extra if @align == :right %>
8
12
  <% end %>
9
13
 
10
14
  <% if @with_panel %>
@@ -5,6 +5,11 @@ module Primer
5
5
  class TabNavComponent < Primer::Component
6
6
  include Primer::TabbedComponentHelper
7
7
 
8
+ status :beta
9
+
10
+ DEFAULT_EXTRA_ALIGN = :left
11
+ EXTRA_ALIGN_OPTIONS = [DEFAULT_EXTRA_ALIGN, :right].freeze
12
+
8
13
  # Tabs to be rendered. For more information, refer to <%= link_to_component(Primer::Navigation::TabComponent) %>.
9
14
  #
10
15
  # @param selected [Boolean] Whether the tab is selected.
@@ -22,6 +27,15 @@ module Primer
22
27
  )
23
28
  }
24
29
 
30
+ # Renders extra content to the `TabNav`. This will be rendered after the tabs.
31
+ #
32
+ # @param align [Symbol] <%= one_of(Primer::TabNavComponent::EXTRA_ALIGN_OPTIONS) %>
33
+ renders_one :extra, lambda { |align: DEFAULT_EXTRA_ALIGN, &block|
34
+ @align = fetch_or_fallback(EXTRA_ALIGN_OPTIONS, align, DEFAULT_EXTRA_ALIGN)
35
+
36
+ view_context.capture { block&.call }
37
+ }
38
+
25
39
  # @example Default
26
40
  # <%= render(Primer::TabNavComponent.new(label: "Default")) do |c| %>
27
41
  # <% c.tab(selected: true, href: "#") { "Tab 1" }%>
@@ -68,12 +82,53 @@ module Primer
68
82
  # <% end %>
69
83
  # <% end %>
70
84
  #
85
+ # @example With extra content
86
+ # <%= render(Primer::TabNavComponent.new(label: "With extra content")) do |c| %>
87
+ # <% c.tab(selected: true, href: "#") { "Tab 1" }%>
88
+ # <% c.tab(href: "#") { "Tab 2" } %>
89
+ # <% c.tab(href: "#") { "Tab 3" } %>
90
+ # <% c.extra do %>
91
+ # <%= render(Primer::ButtonComponent.new(float: :right)) { "Button" } %>
92
+ # <% end %>
93
+ # <% end %>
94
+ #
95
+ # @example Adding extra content after the tabs
96
+ # <%= render(Primer::TabNavComponent.new(label: "Adding extra content after the tabs", display: :flex, body_arguments: { flex: 1 })) do |c| %>
97
+ # <% c.tab(selected: true, href: "#") { "Tab 1" }%>
98
+ # <% c.tab(href: "#") { "Tab 2" } %>
99
+ # <% c.tab(href: "#") { "Tab 3" } %>
100
+ # <% c.extra(align: :right) do %>
101
+ # <div>
102
+ # <%= render(Primer::ButtonComponent.new) { "Button" } %>
103
+ # </div>
104
+ # <% end %>
105
+ # <% end %>
106
+ #
107
+ # @example Customizing the body
108
+ # <%= render(Primer::TabNavComponent.new(label: "Default", body_arguments: { classes: "custom-class", border: true, border_color: :info })) do |c| %>
109
+ # <% c.tab(selected: true, href: "#") { "Tab 1" }%>
110
+ # <% c.tab(href: "#") { "Tab 2" } %>
111
+ # <% c.tab(href: "#") { "Tab 3" } %>
112
+ # <% end %>
113
+ #
114
+ # @example Customizing the wrapper
115
+ # <%= render(Primer::TabNavComponent.new(label: "Default", wrapper_arguments: { classes: "custom-class", border: true, border_color: :info })) do |c| %>
116
+ # <% c.tab(selected: true, href: "#") { "Tab 1" }%>
117
+ # <% c.tab(href: "#") { "Tab 2" } %>
118
+ # <% c.tab(href: "#") { "Tab 3" } %>
119
+ # <% end %>
120
+ #
71
121
  # @param label [String] Used to set the `aria-label` on the top level `<nav>` element.
72
122
  # @param with_panel [Boolean] Whether the TabNav should navigate through pages or panels.
123
+ # @param body_arguments [Hash] <%= link_to_system_arguments_docs %> for the body wrapper.
124
+ # @param wrapper_arguments [Hash] <%= link_to_system_arguments_docs %> for the `TabContainer` wrapper. Only applies if `with_panel` is `true`.
73
125
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
74
- def initialize(label:, with_panel: false, **system_arguments)
126
+ def initialize(label:, with_panel: false, body_arguments: {}, wrapper_arguments: {}, **system_arguments)
127
+ @align = DEFAULT_EXTRA_ALIGN
75
128
  @with_panel = with_panel
76
129
  @system_arguments = system_arguments
130
+ @body_arguments = body_arguments
131
+ @wrapper_arguments = wrapper_arguments
77
132
 
78
133
  @system_arguments[:tag] ||= :div
79
134
  @system_arguments[:classes] = class_names(
@@ -81,15 +136,13 @@ module Primer
81
136
  system_arguments[:classes]
82
137
  )
83
138
 
84
- @body_arguments = {
85
- tag: navigation_tag(with_panel),
86
- classes: "tabnav-tabs",
87
- aria: {
88
- label: label
89
- }
90
- }
91
-
139
+ @body_arguments[:tag] = navigation_tag(with_panel)
140
+ @body_arguments[:"aria-label"] = label
92
141
  @body_arguments[:role] = :tablist if @with_panel
142
+ @body_arguments[:classes] = class_names(
143
+ "tabnav-tabs",
144
+ body_arguments[:classes]
145
+ )
93
146
  end
94
147
  end
95
148
  end
@@ -2,7 +2,9 @@
2
2
 
3
3
  module Primer
4
4
  # `Tooltip` is a wrapper component that will apply a tooltip to the provided content.
5
- class TooltipComponent < Primer::Component
5
+ class Tooltip < Primer::Component
6
+ status :beta
7
+
6
8
  DIRECTION_DEFAULT = :n
7
9
  ALIGN_DEFAULT = :default
8
10
  MULTILINE_DEFAULT = false
@@ -28,34 +30,34 @@ module Primer
28
30
 
29
31
  # @example Default
30
32
  # <div class="pt-5">
31
- # <%= render(Primer::TooltipComponent.new(label: "Even bolder")) { "Default Bold Text" } %>
33
+ # <%= render(Primer::Tooltip.new(label: "Even bolder")) { "Default Bold Text" } %>
32
34
  # </div>
33
35
  #
34
36
  # @example Wrapping another component
35
37
  # <div class="pt-5">
36
- # <%= render(Primer::TooltipComponent.new(label: "Even bolder")) do %>
38
+ # <%= render(Primer::Tooltip.new(label: "Even bolder")) do %>
37
39
  # <%= render(Primer::ButtonComponent.new) { "Bold Button" } %>
38
40
  # <% end %>
39
41
  # </div>
40
42
  #
41
43
  # @example With a direction
42
44
  # <div class="pt-5">
43
- # <%= render(Primer::TooltipComponent.new(label: "Even bolder", direction: :s)) { "Bold Text With a Direction" } %>
45
+ # <%= render(Primer::Tooltip.new(label: "Even bolder", direction: :s)) { "Bold Text With a Direction" } %>
44
46
  # </div>
45
47
  #
46
48
  # @example With an alignment
47
49
  # <div class="pt-5">
48
- # <%= render(Primer::TooltipComponent.new(label: "Even bolder", direction: :s, alignment: :right_1)) { "Bold Text With an Alignment" } %>
50
+ # <%= render(Primer::Tooltip.new(label: "Even bolder", direction: :s, alignment: :right_1)) { "Bold Text With an Alignment" } %>
49
51
  # </div>
50
52
  #
51
53
  # @example Without a delay
52
54
  # <div class="pt-5">
53
- # <%= render(Primer::TooltipComponent.new(label: "Even bolder", direction: :s, no_delay: true)) { "Bold Text without a delay" } %>
55
+ # <%= render(Primer::Tooltip.new(label: "Even bolder", direction: :s, no_delay: true)) { "Bold Text without a delay" } %>
54
56
  # </div>
55
57
  #
56
58
  # @param label [String] the text to appear in the tooltip
57
- # @param direction [String] Direction of the tooltip. <%= one_of(Primer::TooltipComponent::DIRECTION_OPTIONS) %>
58
- # @param align [String] Align tooltips to the left or right of an element, combined with a `direction` to specify north or south. <%= one_of(Primer::TooltipComponent::ALIGN_MAPPING.keys) %>
59
+ # @param direction [String] Direction of the tooltip. <%= one_of(Primer::Tooltip::DIRECTION_OPTIONS) %>
60
+ # @param align [String] Align tooltips to the left or right of an element, combined with a `direction` to specify north or south. <%= one_of(Primer::Tooltip::ALIGN_MAPPING.keys) %>
59
61
  # @param multiline [Boolean] Use this when you have long content
60
62
  # @param no_delay [Boolean] By default the tooltips have a slight delay before appearing. Set true to override this
61
63
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
@@ -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",
@@ -1,4 +1,4 @@
1
- <%= wrapper do %>
1
+ <%= wrapper(**@wrapper_arguments) do %>
2
2
  <%= render Primer::BaseComponent.new(**@system_arguments) do %>
3
3
  <% if @align == :right %>
4
4
  <%= actions %>
@@ -116,14 +116,30 @@ module Primer
116
116
  # <% end %>
117
117
  # <% end %>
118
118
  #
119
+ # @example Customizing the body
120
+ # <%= render(Primer::UnderlineNavComponent.new(label: "Default", body_arguments: { tag: :ul, classes: "custom-class", border: true, border_color: :info })) do |c| %>
121
+ # <% c.tab(selected: true, href: "#") { "Tab 1" }%>
122
+ # <% c.tab(href: "#") { "Tab 2" } %>
123
+ # <% c.tab(href: "#") { "Tab 3" } %>
124
+ # <% end %>
125
+ #
126
+ # @example Customizing the wrapper
127
+ # <%= render(Primer::UnderlineNavComponent.new(label: "Default", wrapper_arguments: { classes: "custom-class", border: true, border_color: :info })) do |c| %>
128
+ # <% c.tab(selected: true, href: "#") { "Tab 1" }%>
129
+ # <% c.tab(href: "#") { "Tab 2" } %>
130
+ # <% c.tab(href: "#") { "Tab 3" } %>
131
+ # <% end %>
132
+ #
119
133
  # @param label [String] The `aria-label` on top level `<nav>` element.
120
134
  # @param with_panel [Boolean] Whether the TabNav should navigate through pages or panels.
121
135
  # @param align [Symbol] <%= one_of(Primer::UnderlineNavComponent::ALIGN_OPTIONS) %> - Defaults to <%= Primer::UnderlineNavComponent::ALIGN_DEFAULT %>
122
136
  # @param body_arguments [Hash] <%= link_to_system_arguments_docs %> for the body wrapper.
137
+ # @param wrapper_arguments [Hash] <%= link_to_system_arguments_docs %> for the `TabContainer` wrapper. Only applies if `with_panel` is `true`.
123
138
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
124
- def initialize(label:, with_panel: false, align: ALIGN_DEFAULT, body_arguments: { tag: BODY_TAG_DEFAULT }, **system_arguments)
139
+ def initialize(label:, with_panel: false, align: ALIGN_DEFAULT, body_arguments: { tag: BODY_TAG_DEFAULT }, wrapper_arguments: {}, **system_arguments)
125
140
  @with_panel = with_panel
126
141
  @align = fetch_or_fallback(ALIGN_OPTIONS, align, ALIGN_DEFAULT)
142
+ @wrapper_arguments = wrapper_arguments
127
143
 
128
144
  @system_arguments = system_arguments
129
145
  @system_arguments[:tag] = navigation_tag(with_panel)
@@ -7,7 +7,7 @@ module Primer
7
7
  SPACING_KEYS = Primer::Classify::Spacing::KEYS
8
8
 
9
9
  # Keys where we can simply translate { key: value } into ".key-value"
10
- CONCAT_KEYS = SPACING_KEYS + %i[hide position v float col text box_shadow].freeze
10
+ CONCAT_KEYS = SPACING_KEYS + %i[hide position v float text box_shadow].freeze
11
11
 
12
12
  INVALID_CLASS_NAME_PREFIXES =
13
13
  (["bg-", "color-", "text-", "d-", "v-align-", "wb-", "box-shadow-"] + CONCAT_KEYS.map { |k| "#{k}-" }).freeze
@@ -16,15 +16,16 @@ 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
23
23
  VISIBILITY_KEY = :visibility
24
24
  ANIMATION_KEY = :animation
25
+ CONTAINER_KEY = :container
25
26
 
26
27
  BREAKPOINTS = ["", "-sm", "-md", "-lg", "-xl"].freeze
27
- RESPONSIVE_KEYS = ([DISPLAY_KEY, :col, :float] + SPACING_KEYS + Primer::Classify::Flex::RESPONSIVE_KEYS).freeze
28
+ RESPONSIVE_KEYS = ([DISPLAY_KEY, :float, Primer::Classify::Grid::COL_KEY] + SPACING_KEYS + Primer::Classify::Flex::RESPONSIVE_KEYS).freeze
28
29
 
29
30
  BOOLEAN_MAPPINGS = {
30
31
  underline: {
@@ -84,6 +85,7 @@ module Primer
84
85
  TYPOGRAPHY_KEYS +
85
86
  TEXT_KEYS +
86
87
  Primer::Classify::Flex::KEYS +
88
+ Primer::Classify::Grid::KEYS +
87
89
  [
88
90
  BORDER_KEY,
89
91
  BORDER_COLOR_KEY,
@@ -97,7 +99,8 @@ module Primer
97
99
  HEIGHT_KEY,
98
100
  BOX_SHADOW_KEY,
99
101
  VISIBILITY_KEY,
100
- ANIMATION_KEY
102
+ ANIMATION_KEY,
103
+ CONTAINER_KEY
101
104
  ]
102
105
  ).freeze
103
106
 
@@ -123,13 +126,13 @@ module Primer
123
126
  def validated_class_names(classes)
124
127
  return if classes.blank?
125
128
 
126
- if ENV["RAILS_ENV"] == "development"
129
+ if force_system_arguments? && !ENV["PRIMER_WARNINGS_DISABLED"]
127
130
  invalid_class_names =
128
131
  classes.split(" ").each_with_object([]) do |class_name, memo|
129
132
  memo << class_name if INVALID_CLASS_NAME_PREFIXES.any? { |prefix| class_name.start_with?(prefix) }
130
133
  end
131
134
 
132
- raise ArgumentError, "Use System Arguments (https://primer.style/view-components/system-arguments) instead of Primer CSS class #{'name'.pluralize(invalid_class_names.length)} #{invalid_class_names.to_sentence}. This warning will not be raised in production." if invalid_class_names.any?
135
+ raise ArgumentError, "Use System Arguments (https://primer.style/view-components/system-arguments) instead of Primer CSS class #{'name'.pluralize(invalid_class_names.length)} #{invalid_class_names.to_sentence}. This warning will not be raised in production. Set PRIMER_WARNINGS_DISABLED=1 to disable this warning." if invalid_class_names.any?
133
136
  end
134
137
 
135
138
  classes
@@ -206,8 +209,10 @@ module Primer
206
209
  memo[:classes] << "rounded-#{val}"
207
210
  elsif Primer::Classify::Flex::KEYS.include?(key)
208
211
  memo[:classes] << Primer::Classify::Flex.classes(key, val, breakpoint)
212
+ elsif Primer::Classify::Grid::KEYS.include?(key)
213
+ memo[:classes] << Primer::Classify::Grid.classes(key, val, breakpoint)
209
214
  elsif key == WIDTH_KEY || key == HEIGHT_KEY
210
- if val == :fit || val == :fill
215
+ if val == :fit
211
216
  memo[:classes] << "#{key}-#{val}"
212
217
  else
213
218
  memo[key] = val
@@ -215,7 +220,11 @@ module Primer
215
220
  elsif TEXT_KEYS.include?(key)
216
221
  memo[:classes] << "text-#{val.to_s.dasherize}"
217
222
  elsif TYPOGRAPHY_KEYS.include?(key)
218
- memo[:classes] << "f#{val.to_s.dasherize}"
223
+ memo[:classes] << if val == :small || val == :normal
224
+ "text-#{val.to_s.dasherize}"
225
+ else
226
+ "f#{val.to_s.dasherize}"
227
+ end
219
228
  elsif key == BOX_SHADOW_KEY
220
229
  memo[:classes] << if val == true
221
230
  "color-shadow-small"
@@ -236,6 +245,10 @@ module Primer
236
245
  memo[:classes] << "#{key.to_s.dasherize}#{breakpoint}-#{val.to_s.dasherize}"
237
246
  end
238
247
  end
248
+
249
+ def force_system_arguments?
250
+ Rails.application.config.primer_view_components.force_system_arguments
251
+ end
239
252
  end
240
253
 
241
254
  Cache.preload!
@@ -54,6 +54,21 @@ module Primer
54
54
  values: Primer::Classify::Flex::ALIGN_ITEMS_VALUES
55
55
  )
56
56
 
57
+ preload(
58
+ keys: Primer::Classify::Grid::CONTAINER_KEY,
59
+ values: Primer::Classify::Grid::CONTAINER_VALUES
60
+ )
61
+
62
+ preload(
63
+ keys: Primer::Classify::Grid::CLEARFIX_KEY,
64
+ values: [true]
65
+ )
66
+
67
+ preload(
68
+ keys: Primer::Classify::Grid::COL_KEY,
69
+ values: Primer::Classify::Grid::COL_VALUES
70
+ )
71
+
57
72
  preload(
58
73
  keys: Primer::Classify::DISPLAY_KEY,
59
74
  values: [:flex, :block, :inline_block, :inline_flex, :none, :table, :table_cell]
@@ -111,7 +126,7 @@ module Primer
111
126
 
112
127
  preload(
113
128
  keys: [Primer::Classify::WIDTH_KEY, Primer::Classify::HEIGHT_KEY],
114
- values: [:fit, :fill]
129
+ values: [:fit]
115
130
  )
116
131
 
117
132
  preload(