primer_view_components 0.0.53 → 0.0.54

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4df5bb105c8b48aed71b4652afbf6814257fcb2c344085b328c27f8f109a80c1
4
- data.tar.gz: 72ff93288cac5eb1cabdc7cb8031c488452499203d768fcf3795bbe18cb31a43
3
+ metadata.gz: c9b70049a9f24586f7b1239cdd97832cb9e813cc063ca475c77ae00ed448a6c4
4
+ data.tar.gz: 8df167c58fa86039a008d301969af68f7efa8e4345d49abf269cb09734ec1841
5
5
  SHA512:
6
- metadata.gz: 3af26e886cc8998ef3d449471400319615c0e820ce7265316e6de6fda2b55340f7f7a82d3c7c78f5c4e393f60d7638126bd8e8a88675735bfe570d2958ee2484
7
- data.tar.gz: aff9d0ca813126c33daab60f57bb01915ea8b779f17df99e648ec236f0da12bb9b16f54af24dfa871a50253663d71813533386457424f09f46a5458d5556a5b2
6
+ metadata.gz: 7c87327784f69a03b4636e2952c98da1feb4b5c47776c8e46cd423ae562d25aa061c99f0ff3ebee605984816db3b3c6209fd7ddb5ed0577a1ed7b1ff8a68bbc8
7
+ data.tar.gz: c386eb3940ee79d8992b45168e18846863c6d503801674d13efe6ea8617cfc9d7a3957e3e324959c884d13bdd66113188ea23c9bcbf9dce00ff9eb54ce0deef3
data/CHANGELOG.md CHANGED
@@ -30,6 +30,18 @@ The category for changes related to documentation, testing and tooling. Also, fo
30
30
 
31
31
  ## main
32
32
 
33
+ ## 0.0.54
34
+
35
+ ### Breaking changes
36
+
37
+ * Rename `BreadcrumbComponent` to `Beta::Breadcrumbs`.
38
+
39
+ *Joel Hawksley*
40
+
41
+ * Split `UnderlineNavComponent` into `Alpha::UnderlineNav` and `Alpha::UnderlinePanels`.
42
+
43
+ *Kate Higa*
44
+
33
45
  ## 0.0.53
34
46
 
35
47
  ### New
@@ -44,6 +56,10 @@ The category for changes related to documentation, testing and tooling. Also, fo
44
56
 
45
57
  *Manuel Puyol*
46
58
 
59
+ * Deprecating background and border color presentational arguments
60
+
61
+ *Jon Rohan*
62
+
47
63
  * Map the `for` argument when autofixing `ClipboardCopy` migrations.
48
64
 
49
65
  *Kristján Oddsson*
@@ -0,0 +1,15 @@
1
+ <%= render Primer::BaseComponent.new(**@system_arguments) do %>
2
+ <% if @align == :right %>
3
+ <%= actions %>
4
+ <% end %>
5
+
6
+ <%= render body do %>
7
+ <% tabs.each do |tab| %>
8
+ <%= tab %>
9
+ <% end %>
10
+ <% end %>
11
+
12
+ <% if @align == :left %>
13
+ <%= actions %>
14
+ <% end %>
15
+ <% end %>
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Alpha
5
+ # Use `UnderlineNav` to style navigation links with a minimal
6
+ # underlined selected state, typically placed at the top
7
+ # of the page.
8
+ # For panel navigation, use <%= link_to_component(Primer::Alpha::UnderlinePanels) %> instead.
9
+ #
10
+ # @accessibility
11
+ # - By default, `UnderlineNav` renders links within a `<nav>` element. `<nav>` has an
12
+ # implicit landmark role of `navigation` which should be reserved for main links.
13
+ # For all other set of links, set tag to `:div`.
14
+ # - See <%= link_to_component(Primer::Navigation::TabComponent) %> for additional
15
+ # accessibility considerations.
16
+ class UnderlineNav < Primer::Component
17
+ include Primer::TabbedComponentHelper
18
+ include Primer::UnderlineNavHelper
19
+
20
+ ALIGN_DEFAULT = :left
21
+ ALIGN_OPTIONS = [ALIGN_DEFAULT, :right].freeze
22
+
23
+ BODY_TAG_DEFAULT = :ul
24
+
25
+ TAG_DEFAULT = :nav
26
+ TAG_OPTIONS = [TAG_DEFAULT, :div].freeze
27
+
28
+ ACTIONS_TAG_DEFAULT = :div
29
+ ACTIONS_TAG_OPTIONS = [ACTIONS_TAG_DEFAULT, :span].freeze
30
+
31
+ # Use the tabs to list page links.
32
+ #
33
+ # @param selected [Boolean] Whether the tab is selected.
34
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
35
+ renders_many :tabs, lambda { |selected: false, **system_arguments|
36
+ system_arguments[:classes] = underline_nav_tab_classes(system_arguments[:classes])
37
+ Primer::Navigation::TabComponent.new(
38
+ list: true,
39
+ selected: selected,
40
+ icon_classes: "UnderlineNav-octicon",
41
+ **system_arguments
42
+ )
43
+ }
44
+
45
+ # Use actions for a call to action.
46
+ #
47
+ # @param tag [Symbol] (Primer::UnderlineNavHelper::ACTIONS_TAG_DEFAULT) <%= one_of(Primer::UnderlineNavHelper::ACTIONS_TAG_OPTIONS) %>
48
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
49
+ renders_one :actions, lambda { |tag: ACTIONS_TAG_DEFAULT, **system_arguments|
50
+ system_arguments[:tag] = fetch_or_fallback(ACTIONS_TAG_OPTIONS, tag, ACTIONS_TAG_DEFAULT)
51
+ system_arguments[:classes] = underline_nav_action_classes(system_arguments[:classes])
52
+
53
+ Primer::BaseComponent.new(**system_arguments)
54
+ }
55
+
56
+ # @example Default with `<nav>`
57
+ # @description
58
+ # `<nav>` is a landmark and should be reserved for main navigation links. See <%= link_to_accessibility %>.
59
+ # @code
60
+ # <%= render(Primer::Alpha::UnderlineNav.new(label: "Default with nav element")) do |component| %>
61
+ # <% component.tab(href: "#", selected: true) { "Item 1" } %>
62
+ # <% component.tab(href: "#") { "Item 2" } %>
63
+ # <% component.actions do %>
64
+ # <%= render(Primer::ButtonComponent.new) { "Button!" } %>
65
+ # <% end %>
66
+ # <% end %>
67
+ #
68
+ # @example With `<div>`
69
+ # <%= render(Primer::Alpha::UnderlineNav.new(tag: :div, label: "With div element")) do |component| %>
70
+ # <% component.tab(href: "#", selected: true) { "Item 1" } %>
71
+ # <% component.tab(href: "#") { "Item 2" } %>
72
+ # <% component.actions do %>
73
+ # <%= render(Primer::ButtonComponent.new) { "Button!" } %>
74
+ # <% end %>
75
+ # <% end %>
76
+ #
77
+ # @example With icons and counters
78
+ # <%= render(Primer::Alpha::UnderlineNav.new(label: "With icons and counters")) do |component| %>
79
+ # <% component.tab(href: "#", selected: true) do |t| %>
80
+ # <% t.icon(icon: :star) %>
81
+ # <% t.text { "Item 1" } %>
82
+ # <% end %>
83
+ # <% component.tab(href: "#") do |t| %>
84
+ # <% t.icon(icon: :star) %>
85
+ # <% t.text { "Item 2" } %>
86
+ # <% t.counter(count: 10) %>
87
+ # <% end %>
88
+ # <% component.tab(href: "#") do |t| %>
89
+ # <% t.text { "Item 3" } %>
90
+ # <% t.counter(count: 10) %>
91
+ # <% end %>
92
+ # <% component.actions do %>
93
+ # <%= render(Primer::ButtonComponent.new) { "Button!" } %>
94
+ # <% end %>
95
+ # <% end %>
96
+ #
97
+ # @example Align right
98
+ # <%= render(Primer::Alpha::UnderlineNav.new(label: "Align right", align: :right)) do |component| %>
99
+ # <% component.tab(href: "#", selected: true) do |t| %>
100
+ # <% t.text { "Item 1" } %>
101
+ # <% end %>
102
+ # <% component.tab(href: "#") do |t| %>
103
+ # <% t.text { "Item 2" } %>
104
+ # <% end %>
105
+ # <% component.actions do %>
106
+ # <%= render(Primer::ButtonComponent.new) { "Button!" } %>
107
+ # <% end %>
108
+ # <% end %>
109
+ #
110
+ # @example Customizing the body
111
+ # <%= render(Primer::Alpha::UnderlineNav.new(label: "Default", body_arguments: { classes: "custom-class", border: true, border_color: :info })) do |c| %>
112
+ # <% c.tab(selected: true, href: "#") { "Tab 1" }%>
113
+ # <% c.tab(href: "#") { "Tab 2" } %>
114
+ # <% c.tab(href: "#") { "Tab 3" } %>
115
+ # <% end %>
116
+ #
117
+ # @param tag [Symbol] <%= one_of(Primer::Alpha::UnderlineNav::TAG_OPTIONS) %>
118
+ # @param label [String] Sets an `aria-label` that helps assistive technology users understand the purpose of the links, and distinguish it from similar elements.
119
+ # @param align [Symbol] <%= one_of(Primer::UnderlineNavHelper::ALIGN_OPTIONS) %> - Defaults to <%= Primer::UnderlineNavHelper::ALIGN_DEFAULT %>
120
+ # @param body_arguments [Hash] <%= link_to_system_arguments_docs %> for the body wrapper.
121
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
122
+ def initialize(label:, tag: TAG_DEFAULT, align: ALIGN_DEFAULT, body_arguments: {}, **system_arguments)
123
+ @align = fetch_or_fallback(ALIGN_OPTIONS, align, ALIGN_DEFAULT)
124
+
125
+ @system_arguments = system_arguments
126
+ @system_arguments[:tag] = fetch_or_fallback(TAG_OPTIONS, tag, TAG_DEFAULT)
127
+ @system_arguments[:classes] = underline_nav_classes(@system_arguments[:classes], @align)
128
+
129
+ @body_arguments = body_arguments
130
+ @body_arguments[:tag] = :ul
131
+ @body_arguments[:classes] = underline_nav_body_classes(@body_arguments[:classes])
132
+
133
+ @system_arguments[:tag] == :nav ? @system_arguments[:"aria-label"] = label : @body_arguments[:"aria-label"] = label
134
+ end
135
+
136
+ private
137
+
138
+ def body
139
+ Primer::BaseComponent.new(**@body_arguments)
140
+ end
141
+ end
142
+ end
143
+ end
@@ -1,23 +1,18 @@
1
- <%= wrapper(**@wrapper_arguments) do %>
1
+ <%= wrapper(with_panel: true, **@wrapper_arguments) do %>
2
2
  <%= render Primer::BaseComponent.new(**@system_arguments) do %>
3
3
  <% if @align == :right %>
4
4
  <%= actions %>
5
5
  <% end %>
6
-
7
6
  <%= render body do %>
8
7
  <% tabs.each do |tab| %>
9
8
  <%= tab %>
10
9
  <% end %>
11
10
  <% end %>
12
-
13
11
  <% if @align == :left %>
14
12
  <%= actions %>
15
13
  <% end %>
16
14
  <% end %>
17
-
18
- <% if @with_panel %>
19
- <% tabs.each do |tab| %>
20
- <%= tab.panel %>
21
- <% end %>
15
+ <% tabs.each do |tab| %>
16
+ <%= tab.panel %>
22
17
  <% end %>
23
18
  <% end %>
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Alpha
5
+ # Use `UnderlinePanels` to style tabs with an associated panel and an underlined selected state.
6
+ class UnderlinePanels < Primer::Component
7
+ include Primer::TabbedComponentHelper
8
+ include Primer::UnderlineNavHelper
9
+ # Use to render a button and an associated panel slot. See the example below or refer to <%= link_to_component(Primer::Navigation::TabComponent) %>.
10
+ #
11
+ # @param id [String] Unique ID of tab.
12
+ # @param selected [Boolean] Whether the tab is selected.
13
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
14
+ renders_many :tabs, lambda { |id:, selected: false, **system_arguments|
15
+ system_arguments[:id] = id
16
+ system_arguments[:classes] = underline_nav_tab_classes(system_arguments[:classes])
17
+
18
+ Primer::Navigation::TabComponent.new(
19
+ selected: selected,
20
+ with_panel: true,
21
+ list: true,
22
+ icon_classes: "UnderlineNav-octicon",
23
+ panel_id: "panel-#{id}",
24
+ **system_arguments
25
+ )
26
+ }
27
+
28
+ # Use actions for a call to action.
29
+ #
30
+ # @param tag [Symbol] (Primer::UnderlineNavHelper::ACTIONS_TAG_DEFAULT) <%= one_of(Primer::UnderlineNavHelper::ACTIONS_TAG_OPTIONS) %>
31
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
32
+ renders_one :actions, lambda { |tag: ACTIONS_TAG_DEFAULT, **system_arguments|
33
+ system_arguments[:tag] = fetch_or_fallback(ACTIONS_TAG_OPTIONS, tag, ACTIONS_TAG_DEFAULT)
34
+ system_arguments[:classes] = underline_nav_action_classes(system_arguments[:classes])
35
+
36
+ Primer::BaseComponent.new(**system_arguments)
37
+ }
38
+
39
+ # @example Default
40
+ # <%= render(Primer::Alpha::UnderlinePanels.new(label: "With panels")) do |component| %>
41
+ # <% component.tab(id: "tab-1", selected: true) do |t| %>
42
+ # <% t.text { "Tab 1" } %>
43
+ # <% t.panel do %>
44
+ # Panel 1
45
+ # <% end %>
46
+ # <% end %>
47
+ # <% component.tab(id: "tab-2") do |t| %>
48
+ # <% t.text { "Tab 2" } %>
49
+ # <% t.panel do %>
50
+ # Panel 2
51
+ # <% end %>
52
+ # <% end %>
53
+ # <% component.actions do %>
54
+ # <%= render(Primer::ButtonComponent.new) { "Button!" } %>
55
+ # <% end %>
56
+ # <% end %>
57
+ #
58
+ # @param label [String] Sets an `aria-label` that helps assistive technology users understand the purpose of the tabs.
59
+ # @param align [Symbol] <%= one_of(Primer::UnderlineNavHelper::ALIGN_OPTIONS) %> - Defaults to <%= Primer::UnderlineNavHelper::ALIGN_DEFAULT %>
60
+ # @param body_arguments [Hash] <%= link_to_system_arguments_docs %> for the body wrapper.
61
+ # @param wrapper_arguments [Hash] <%= link_to_system_arguments_docs %> for the `TabContainer` wrapper.
62
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
63
+ def initialize(label:, align: ALIGN_DEFAULT, body_arguments: {}, wrapper_arguments: {}, **system_arguments)
64
+ @align = fetch_or_fallback(ALIGN_OPTIONS, align, ALIGN_DEFAULT)
65
+ @wrapper_arguments = wrapper_arguments
66
+
67
+ @system_arguments = system_arguments
68
+ @system_arguments[:tag] = :div
69
+ @system_arguments[:classes] = underline_nav_classes(@system_arguments[:classes], @align)
70
+
71
+ @body_arguments = body_arguments
72
+ @body_arguments[:tag] = :ul
73
+ @body_arguments[:classes] = underline_nav_body_classes(@body_arguments[:classes])
74
+
75
+ @body_arguments[:role] = :tablist
76
+ @body_arguments[:"aria-label"] = label
77
+ end
78
+
79
+ private
80
+
81
+ def body
82
+ Primer::BaseComponent.new(**@body_arguments)
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Beta
5
+ # Use `Breadcrumb` to display page hierarchy within a section of the site. All of the items in the breadcrumb "trail" are links except for the final item, which is a plain string indicating the current page.
6
+ class Breadcrumbs < Primer::Component
7
+ status :beta
8
+
9
+ # _Note: if both `href` and `selected: true` are passed in, `href` will be ignored and the item will not be rendered as a link._
10
+ #
11
+ # @param href [String] The URL to link to.
12
+ # @param selected [Boolean] Whether or not the item is selected and not rendered as a link.
13
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
14
+ renders_many :items, "Item"
15
+
16
+ # @example Basic
17
+ # <%= render(Primer::Beta::Breadcrumbs.new) do |component| %>
18
+ # <% component.item(href: "/") do %>Home<% end %>
19
+ # <% component.item(href: "/about") do %>About<% end %>
20
+ # <% component.item(selected: true) do %>Team<% end %>
21
+ # <% end %>
22
+ #
23
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
24
+ def initialize(**system_arguments)
25
+ @system_arguments = system_arguments
26
+ @system_arguments[:tag] = :nav
27
+ @system_arguments[:aria] = { label: "Breadcrumb" }
28
+ end
29
+
30
+ def render?
31
+ items.any?
32
+ end
33
+
34
+ # This component is part of `Primer::Beta::Breadcrumbs` and should not be
35
+ # used as a standalone component.
36
+ class Item < Primer::Component
37
+ def initialize(href: nil, selected: false, **system_arguments)
38
+ @href = href
39
+ @system_arguments = system_arguments
40
+
41
+ @href = nil if selected
42
+ @system_arguments[:tag] = :li
43
+ @system_arguments[:"aria-current"] = "page" if selected
44
+ @system_arguments[:classes] = "breadcrumb-item #{@system_arguments[:classes]}"
45
+ end
46
+
47
+ def call
48
+ render(Primer::BaseComponent.new(**@system_arguments)) do
49
+ if @href.present?
50
+ render(Primer::LinkComponent.new(href: @href)) { content }
51
+ else
52
+ content
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -3,7 +3,7 @@
3
3
  module Primer
4
4
  module Navigation
5
5
  # This component is part of navigation components such as `Primer::TabNavComponent`
6
- # and `Primer::UnderlineNavComponent` and should not be used by itself.
6
+ # and `Primer::Alpha::UnderlineNav` and should not be used by itself.
7
7
  #
8
8
  # @accessibility
9
9
  # `TabComponent` renders the selected anchor tab with `aria-current="page"` by default.
@@ -14,7 +14,7 @@ module Primer
14
14
  # Panel controlled by the Tab. This will not render anything in the tab itself.
15
15
  # It will provide a accessor for the Tab's parent to call and render the panel
16
16
  # content in the appropriate place.
17
- # Refer to `UnderlineNavComponent` and `TabNavComponent` implementations for examples.
17
+ # Refer to `UnderlineNav` and `TabNavComponent` implementations for examples.
18
18
  #
19
19
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
20
20
  renders_one :panel, lambda { |**system_arguments|
@@ -111,19 +111,21 @@ module Primer
111
111
 
112
112
  @system_arguments = system_arguments
113
113
  @id = @system_arguments[:id]
114
+ @wrapper_arguments = wrapper_arguments
114
115
 
115
116
  if with_panel || @system_arguments[:tag] == :button
116
117
  @system_arguments[:tag] = :button
117
118
  @system_arguments[:type] = :button
118
119
  @system_arguments[:role] = :tab
119
120
  panel_id(panel_id)
121
+ # https://www.w3.org/TR/wai-aria-practices/#presentation_role
122
+ @wrapper_arguments[:role] = :presentation
120
123
  else
121
124
  @system_arguments[:tag] = :a
122
125
  end
123
126
 
124
- @wrapper_arguments = wrapper_arguments
125
127
  @wrapper_arguments[:tag] = :li
126
- @wrapper_arguments[:display] ||= :flex
128
+ @wrapper_arguments[:display] ||= :inline_flex
127
129
 
128
130
  return unless @selected
129
131
 
@@ -1,4 +1,4 @@
1
- <%= wrapper(**@wrapper_arguments) do %>
1
+ <%= wrapper(with_panel: @with_panel, **@wrapper_arguments) do %>
2
2
  <%= render Primer::BaseComponent.new(**@system_arguments) do %>
3
3
  <%= extra if @align == :left %>
4
4
 
@@ -20,8 +20,8 @@ module Primer
20
20
  with_panel ? :div : :nav
21
21
  end
22
22
 
23
- def wrapper(**system_arguments)
24
- return yield unless @with_panel
23
+ def wrapper(with_panel:, **system_arguments)
24
+ return yield unless with_panel
25
25
 
26
26
  render Primer::TabContainerComponent.new(**system_arguments) do
27
27
  yield if block_given?
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Primer
6
+ # Helper to share tab validation logic between components.
7
+ # The component will raise an error if there are 0 or 2+ selected tabs.
8
+ module UnderlineNavHelper
9
+ extend ActiveSupport::Concern
10
+
11
+ ALIGN_DEFAULT = :left
12
+ ALIGN_OPTIONS = [ALIGN_DEFAULT, :right].freeze
13
+
14
+ ACTIONS_TAG_DEFAULT = :div
15
+ ACTIONS_TAG_OPTIONS = [ACTIONS_TAG_DEFAULT, :span].freeze
16
+
17
+ def underline_nav_classes(classes, align)
18
+ class_names(
19
+ classes,
20
+ "UnderlineNav",
21
+ "UnderlineNav--right" => align == :right
22
+ )
23
+ end
24
+
25
+ def underline_nav_body_classes(classes)
26
+ class_names(
27
+ "UnderlineNav-body",
28
+ classes,
29
+ "list-style-none"
30
+ )
31
+ end
32
+
33
+ def underline_nav_action_classes(classes)
34
+ class_names("UnderlineNav-actions", classes)
35
+ end
36
+
37
+ def underline_nav_tab_classes(classes)
38
+ class_names(
39
+ "UnderlineNav-item",
40
+ classes
41
+ )
42
+ end
43
+ end
44
+ end
@@ -5,7 +5,7 @@ module Primer
5
5
  module VERSION
6
6
  MAJOR = 0
7
7
  MINOR = 0
8
- PATCH = 53
8
+ PATCH = 54
9
9
 
10
10
  STRING = [MAJOR, MINOR, PATCH].join(".")
11
11
  end
@@ -35,6 +35,110 @@ module RuboCop
35
35
  # }
36
36
  #
37
37
  DEPRECATED = {
38
+ bg: {
39
+ white: "bg: :primary",
40
+ gray_light: "bg: :secondary",
41
+ gray: "bg: :tertiary",
42
+ gray_dark: "bg: :canvas_inverse",
43
+ blue_light: "bg: :info",
44
+ blue: "bg: :info_inverse",
45
+ green_light: "bg: :success",
46
+ green: "bg: :success_inverse",
47
+ yellow_light: "bg: :warning",
48
+ yellow: "bg: :warning_inverse",
49
+ red_light: "bg: :danger",
50
+ red: "bg: :danger_inverse",
51
+ gray_0: nil,
52
+ gray_1: nil,
53
+ gray_2: nil,
54
+ gray_3: nil,
55
+ gray_4: nil,
56
+ gray_5: nil,
57
+ gray_6: nil,
58
+ gray_7: nil,
59
+ gray_8: nil,
60
+ gray_9: nil,
61
+ blue_0: nil,
62
+ blue_1: nil,
63
+ blue_2: nil,
64
+ blue_3: nil,
65
+ blue_4: nil,
66
+ blue_5: nil,
67
+ blue_6: nil,
68
+ blue_7: nil,
69
+ blue_8: nil,
70
+ blue_9: nil,
71
+ green_0: nil,
72
+ green_1: nil,
73
+ green_2: nil,
74
+ green_3: nil,
75
+ green_4: nil,
76
+ green_5: nil,
77
+ green_6: nil,
78
+ green_7: nil,
79
+ green_8: nil,
80
+ green_9: nil,
81
+ yellow_0: nil,
82
+ yellow_1: nil,
83
+ yellow_2: nil,
84
+ yellow_3: nil,
85
+ yellow_4: nil,
86
+ yellow_5: nil,
87
+ yellow_6: nil,
88
+ yellow_7: nil,
89
+ yellow_8: nil,
90
+ yellow_9: nil,
91
+ red_0: nil,
92
+ red_1: nil,
93
+ red_2: nil,
94
+ red_3: nil,
95
+ red_4: nil,
96
+ red_5: nil,
97
+ red_6: nil,
98
+ red_7: nil,
99
+ red_8: nil,
100
+ red_9: nil,
101
+ purple_0: nil,
102
+ purple_1: nil,
103
+ purple_2: nil,
104
+ purple_3: nil,
105
+ purple_4: nil,
106
+ purple_5: nil,
107
+ purple_6: nil,
108
+ purple_7: nil,
109
+ purple_8: nil,
110
+ purple_9: nil,
111
+ pink_0: nil,
112
+ pink_1: nil,
113
+ pink_2: nil,
114
+ pink_3: nil,
115
+ pink_4: nil,
116
+ pink_5: nil,
117
+ pink_6: nil,
118
+ pink_7: nil,
119
+ pink_8: nil,
120
+ pink_9: nil,
121
+ orange_0: nil,
122
+ orange_1: nil,
123
+ orange_2: nil,
124
+ orange_3: nil,
125
+ orange_4: nil,
126
+ orange_5: nil,
127
+ orange_6: nil,
128
+ orange_7: nil,
129
+ orange_8: nil,
130
+ orange_9: nil
131
+ },
132
+ border_color: {
133
+ gray: "border_color: :primary",
134
+ gray_light: "border_color: :secondary",
135
+ gray_dark: "border_color: :tertiary",
136
+ blue: "border_color: :info",
137
+ green: "border_color: :success",
138
+ yellow: "border_color: :warning",
139
+ red: "border_color: :danger",
140
+ white: "border_color: :inverse"
141
+ },
38
142
  color: {
39
143
  blue: "color: :text_link",
40
144
  gray_dark: "color: :text_primary",
data/lib/tasks/docs.rake CHANGED
@@ -40,7 +40,7 @@ namespace :docs do
40
40
  Primer::BlankslateComponent,
41
41
  Primer::BorderBoxComponent,
42
42
  Primer::BoxComponent,
43
- Primer::BreadcrumbComponent,
43
+ Primer::Beta::Breadcrumbs,
44
44
  Primer::ButtonComponent,
45
45
  Primer::ButtonGroup,
46
46
  Primer::Alpha::ButtonMarketing,
@@ -75,7 +75,8 @@ namespace :docs do
75
75
  Primer::Tooltip,
76
76
  Primer::Truncate,
77
77
  Primer::Beta::Truncate,
78
- Primer::UnderlineNavComponent
78
+ Primer::Alpha::UnderlineNav,
79
+ Primer::Alpha::UnderlinePanels
79
80
  ]
80
81
 
81
82
  js_components = [
@@ -87,7 +88,7 @@ namespace :docs do
87
88
  Primer::TabContainerComponent,
88
89
  Primer::TabNavComponent,
89
90
  Primer::TimeAgoComponent,
90
- Primer::UnderlineNavComponent
91
+ Primer::Alpha::UnderlinePanels
91
92
  ]
92
93
 
93
94
  all_components = Primer::Component.descendants - [Primer::BaseComponent]
data/static/arguments.yml CHANGED
@@ -22,6 +22,54 @@
22
22
  type: Hash
23
23
  default: N/A
24
24
  description: "[System arguments](/system-arguments)"
25
+ - component: UnderlineNav
26
+ source: https://github.com/primer/view_components/tree/main/app/components/primer/alpha/underline_nav.rb
27
+ parameters:
28
+ - name: tag
29
+ type: Symbol
30
+ default: "`:nav`"
31
+ description: One of `:div` and `:nav`.
32
+ - name: label
33
+ type: String
34
+ default: N/A
35
+ description: Sets an `aria-label` that helps assistive technology users understand
36
+ the purpose of the links, and distinguish it from similar elements.
37
+ - name: align
38
+ type: Symbol
39
+ default: "`:left`"
40
+ description: One of `:left` and `:right`. - Defaults to left
41
+ - name: body_arguments
42
+ type: Hash
43
+ default: "`{}`"
44
+ description: "[System arguments](/system-arguments) for the body wrapper."
45
+ - name: system_arguments
46
+ type: Hash
47
+ default: N/A
48
+ description: "[System arguments](/system-arguments)"
49
+ - component: UnderlinePanels
50
+ source: https://github.com/primer/view_components/tree/main/app/components/primer/alpha/underline_panels.rb
51
+ parameters:
52
+ - name: label
53
+ type: String
54
+ default: N/A
55
+ description: Sets an `aria-label` that helps assistive technology users understand
56
+ the purpose of the tabs.
57
+ - name: align
58
+ type: Symbol
59
+ default: "`:left`"
60
+ description: One of `:left` and `:right`. - Defaults to left
61
+ - name: body_arguments
62
+ type: Hash
63
+ default: "`{}`"
64
+ description: "[System arguments](/system-arguments) for the body wrapper."
65
+ - name: wrapper_arguments
66
+ type: Hash
67
+ default: "`{}`"
68
+ description: "[System arguments](/system-arguments) for the `TabContainer` wrapper."
69
+ - name: system_arguments
70
+ type: Hash
71
+ default: N/A
72
+ description: "[System arguments](/system-arguments)"
25
73
  - component: BaseButton
26
74
  source: https://github.com/primer/view_components/tree/main/app/components/primer/base_button.rb
27
75
  parameters:
@@ -132,6 +180,13 @@
132
180
  type: Hash
133
181
  default: N/A
134
182
  description: "[System arguments](/system-arguments)"
183
+ - component: Breadcrumbs
184
+ source: https://github.com/primer/view_components/tree/main/app/components/primer/beta/breadcrumbs.rb
185
+ parameters:
186
+ - name: system_arguments
187
+ type: Hash
188
+ default: N/A
189
+ description: "[System arguments](/system-arguments)"
135
190
  - component: Text
136
191
  source: https://github.com/primer/view_components/tree/main/app/components/primer/beta/text.rb
137
192
  parameters:
@@ -235,13 +290,6 @@
235
290
  type: Hash
236
291
  default: N/A
237
292
  description: "[System arguments](/system-arguments)"
238
- - component: Breadcrumb
239
- source: https://github.com/primer/view_components/tree/main/app/components/primer/breadcrumb_component.rb
240
- parameters:
241
- - name: system_arguments
242
- type: Hash
243
- default: N/A
244
- description: "[System arguments](/system-arguments)"
245
293
  - component: Button
246
294
  source: https://github.com/primer/view_components/tree/main/app/components/primer/button_component.rb
247
295
  parameters:
@@ -948,33 +996,3 @@
948
996
  type: Hash
949
997
  default: N/A
950
998
  description: "[System arguments](/system-arguments)"
951
- - component: UnderlineNav
952
- source: https://github.com/primer/view_components/tree/main/app/components/primer/underline_nav_component.rb
953
- parameters:
954
- - name: label
955
- type: String
956
- default: N/A
957
- description: The `aria-label` on top level `<nav>` element.
958
- - name: with_panel
959
- type: Boolean
960
- default: "`false`"
961
- description: Whether the `UnderlineNav` should navigate through pages or panels.
962
- When true, [TabContainer](/components/tabcontainer) is rendered along with JavaScript
963
- behavior.
964
- - name: align
965
- type: Symbol
966
- default: "`:left`"
967
- description: One of `:left` and `:right`. - Defaults to left
968
- - name: body_arguments
969
- type: Hash
970
- default: "`{ tag: BODY_TAG_DEFAULT }`"
971
- description: "[System arguments](/system-arguments) for the body wrapper."
972
- - name: wrapper_arguments
973
- type: Hash
974
- default: "`{}`"
975
- description: "[System arguments](/system-arguments) for the `TabContainer` wrapper.
976
- Only applies if `with_panel` is `true`."
977
- - name: system_arguments
978
- type: Hash
979
- default: N/A
980
- description: "[System arguments](/system-arguments)"
data/static/classes.yml CHANGED
@@ -114,6 +114,7 @@
114
114
  - ".custom-class"
115
115
  - ".d-flex"
116
116
  - ".d-inline-block"
117
+ - ".d-inline-flex"
117
118
  - ".details-overlay"
118
119
  - ".details-reset"
119
120
  - ".dropdown"
@@ -33,6 +33,26 @@
33
33
  "large"
34
34
  ]
35
35
  },
36
+ "Primer::Alpha::UnderlineNav": {
37
+ "ACTIONS_TAG_DEFAULT": "div",
38
+ "ACTIONS_TAG_OPTIONS": [
39
+ "div",
40
+ "span"
41
+ ],
42
+ "ALIGN_DEFAULT": "left",
43
+ "ALIGN_OPTIONS": [
44
+ "left",
45
+ "right"
46
+ ],
47
+ "BODY_TAG_DEFAULT": "ul",
48
+ "TAG_DEFAULT": "nav",
49
+ "TAG_OPTIONS": [
50
+ "nav",
51
+ "div"
52
+ ]
53
+ },
54
+ "Primer::Alpha::UnderlinePanels": {
55
+ },
36
56
  "Primer::BaseButton": {
37
57
  "DEFAULT_TAG": "button",
38
58
  "DEFAULT_TYPE": "button",
@@ -82,6 +102,11 @@
82
102
  "span"
83
103
  ]
84
104
  },
105
+ "Primer::Beta::Breadcrumbs": {
106
+ "Item": "Primer::Beta::Breadcrumbs::Item"
107
+ },
108
+ "Primer::Beta::Breadcrumbs::Item": {
109
+ },
85
110
  "Primer::Beta::Text": {
86
111
  "DEFAULT_TAG": "span"
87
112
  },
@@ -110,11 +135,6 @@
110
135
  },
111
136
  "Primer::BoxComponent": {
112
137
  },
113
- "Primer::BreadcrumbComponent": {
114
- "ItemComponent": "Primer::BreadcrumbComponent::ItemComponent"
115
- },
116
- "Primer::BreadcrumbComponent::ItemComponent": {
117
- },
118
138
  "Primer::ButtonComponent": {
119
139
  "DEFAULT_SCHEME": "default",
120
140
  "DEFAULT_VARIANT": "medium",
@@ -619,22 +639,5 @@
619
639
  "p",
620
640
  "strong"
621
641
  ]
622
- },
623
- "Primer::UnderlineNavComponent": {
624
- "ACTIONS_TAG_DEFAULT": "div",
625
- "ACTIONS_TAG_OPTIONS": [
626
- "div",
627
- "span"
628
- ],
629
- "ALIGN_DEFAULT": "left",
630
- "ALIGN_OPTIONS": [
631
- "left",
632
- "right"
633
- ],
634
- "BODY_TAG_DEFAULT": "div",
635
- "BODY_TAG_OPTIONS": [
636
- "div",
637
- "ul"
638
- ]
639
642
  }
640
643
  }
data/static/statuses.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "Primer::Alpha::ButtonMarketing": "alpha",
3
+ "Primer::Alpha::UnderlineNav": "alpha",
4
+ "Primer::Alpha::UnderlinePanels": "alpha",
3
5
  "Primer::BaseButton": "beta",
4
6
  "Primer::BaseComponent": "beta",
5
7
  "Primer::Beta::AutoComplete": "beta",
@@ -7,14 +9,14 @@
7
9
  "Primer::Beta::AutoComplete::Item": "beta",
8
10
  "Primer::Beta::Avatar": "beta",
9
11
  "Primer::Beta::AvatarStack": "beta",
12
+ "Primer::Beta::Breadcrumbs": "beta",
13
+ "Primer::Beta::Breadcrumbs::Item": "alpha",
10
14
  "Primer::Beta::Text": "beta",
11
15
  "Primer::Beta::Truncate": "beta",
12
16
  "Primer::Beta::Truncate::TruncateText": "alpha",
13
17
  "Primer::BlankslateComponent": "beta",
14
18
  "Primer::BorderBoxComponent": "beta",
15
19
  "Primer::BoxComponent": "stable",
16
- "Primer::BreadcrumbComponent": "beta",
17
- "Primer::BreadcrumbComponent::ItemComponent": "alpha",
18
20
  "Primer::ButtonComponent": "beta",
19
21
  "Primer::ButtonGroup": "beta",
20
22
  "Primer::ClipboardCopy": "beta",
@@ -53,6 +55,5 @@
53
55
  "Primer::TimelineItemComponent": "beta",
54
56
  "Primer::TimelineItemComponent::BadgeComponent": "alpha",
55
57
  "Primer::Tooltip": "beta",
56
- "Primer::Truncate": "beta",
57
- "Primer::UnderlineNavComponent": "alpha"
58
+ "Primer::Truncate": "beta"
58
59
  }
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.53
4
+ version: 0.0.54
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub Open Source
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-26 00:00:00.000000000 Z
11
+ date: 2021-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionview
@@ -352,7 +352,7 @@ dependencies:
352
352
  - - "~>"
353
353
  - !ruby/object:Gem::Version
354
354
  version: 0.9.25
355
- description:
355
+ description:
356
356
  email:
357
357
  - opensource+primer_view_components@github.com
358
358
  executables: []
@@ -365,10 +365,12 @@ files:
365
365
  - app/assets/javascripts/primer_view_components.js
366
366
  - app/assets/javascripts/primer_view_components.js.map
367
367
  - app/components/primer/alpha/button_marketing.rb
368
+ - app/components/primer/alpha/underline_nav.html.erb
369
+ - app/components/primer/alpha/underline_nav.rb
370
+ - app/components/primer/alpha/underline_panels.html.erb
371
+ - app/components/primer/alpha/underline_panels.rb
368
372
  - app/components/primer/auto_complete/auto_complete.d.ts
369
373
  - app/components/primer/auto_complete/auto_complete.js
370
- - app/components/primer/auto_complete/auto_component.d.ts
371
- - app/components/primer/auto_complete/auto_component.js
372
374
  - app/components/primer/base_button.rb
373
375
  - app/components/primer/base_component.rb
374
376
  - app/components/primer/beta/auto_complete.rb
@@ -380,6 +382,8 @@ files:
380
382
  - app/components/primer/beta/avatar.rb
381
383
  - app/components/primer/beta/avatar_stack.html.erb
382
384
  - app/components/primer/beta/avatar_stack.rb
385
+ - app/components/primer/beta/breadcrumbs.html.erb
386
+ - app/components/primer/beta/breadcrumbs.rb
383
387
  - app/components/primer/beta/text.rb
384
388
  - app/components/primer/beta/truncate.html.erb
385
389
  - app/components/primer/beta/truncate.rb
@@ -388,8 +392,6 @@ files:
388
392
  - app/components/primer/border_box_component.html.erb
389
393
  - app/components/primer/border_box_component.rb
390
394
  - app/components/primer/box_component.rb
391
- - app/components/primer/breadcrumb_component.html.erb
392
- - app/components/primer/breadcrumb_component.rb
393
395
  - app/components/primer/button_component.html.erb
394
396
  - app/components/primer/button_component.rb
395
397
  - app/components/primer/button_group.html.erb
@@ -472,8 +474,6 @@ files:
472
474
  - app/components/primer/timeline_item_component.rb
473
475
  - app/components/primer/tooltip.rb
474
476
  - app/components/primer/truncate.rb
475
- - app/components/primer/underline_nav_component.html.erb
476
- - app/components/primer/underline_nav_component.rb
477
477
  - app/lib/primer/class_name_helper.rb
478
478
  - app/lib/primer/fetch_or_fallback_helper.rb
479
479
  - app/lib/primer/join_style_arguments_helper.rb
@@ -481,6 +481,7 @@ files:
481
481
  - app/lib/primer/status/dsl.rb
482
482
  - app/lib/primer/tabbed_component_helper.rb
483
483
  - app/lib/primer/test_selector_helper.rb
484
+ - app/lib/primer/underline_nav_helper.rb
484
485
  - app/lib/primer/view_helper.rb
485
486
  - lib/primer/classify.rb
486
487
  - lib/primer/classify/cache.rb
@@ -539,7 +540,7 @@ licenses:
539
540
  - MIT
540
541
  metadata:
541
542
  allowed_push_host: https://rubygems.org
542
- post_install_message:
543
+ post_install_message:
543
544
  rdoc_options: []
544
545
  require_paths:
545
546
  - lib
@@ -555,7 +556,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
555
556
  version: '0'
556
557
  requirements: []
557
558
  rubygems_version: 3.1.2
558
- signing_key:
559
+ signing_key:
559
560
  specification_version: 4
560
561
  summary: ViewComponents for the Primer Design System
561
562
  test_files: []
@@ -1 +0,0 @@
1
- import '@github/auto-complete-element';
@@ -1 +0,0 @@
1
- import '@github/auto-complete-element';
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Primer
4
- # Use `Breadcrumb` to display page hierarchy within a section of the site. All of the items in the breadcrumb "trail" are links except for the final item, which is a plain string indicating the current page.
5
- class BreadcrumbComponent < Primer::Component
6
- status :beta
7
-
8
- # _Note: if both `href` and `selected: true` are passed in, `href` will be ignored and the item will not be rendered as a link._
9
- #
10
- # @param href [String] The URL to link to.
11
- # @param selected [Boolean] Whether or not the item is selected and not rendered as a link.
12
- # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
13
- renders_many :items, "ItemComponent"
14
-
15
- # @example Basic
16
- # <%= render(Primer::BreadcrumbComponent.new) do |component| %>
17
- # <% component.item(href: "/") do %>Home<% end %>
18
- # <% component.item(href: "/about") do %>About<% end %>
19
- # <% component.item(selected: true) do %>Team<% end %>
20
- # <% end %>
21
- #
22
- # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
23
- def initialize(**system_arguments)
24
- @system_arguments = system_arguments
25
- @system_arguments[:tag] = :nav
26
- @system_arguments[:aria] = { label: "Breadcrumb" }
27
- end
28
-
29
- def render?
30
- items.any?
31
- end
32
-
33
- # This component is part of `Primer::BreadcrumbComponent` and should not be
34
- # used as a standalone component.
35
- class ItemComponent < Primer::Component
36
- def initialize(href: nil, selected: false, **system_arguments)
37
- @href = href
38
- @system_arguments = system_arguments
39
-
40
- @href = nil if selected
41
- @system_arguments[:tag] = :li
42
- @system_arguments[:"aria-current"] = "page" if selected
43
- @system_arguments[:classes] = "breadcrumb-item #{@system_arguments[:classes]}"
44
- end
45
-
46
- def call
47
- render(Primer::BaseComponent.new(**@system_arguments)) do
48
- if @href.present?
49
- render(Primer::LinkComponent.new(href: @href)) { content }
50
- else
51
- content
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end
@@ -1,187 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Primer
4
- # Use `UnderlineNav` to style navigation with a minimal
5
- # underlined selected state, typically used for navigation placed at the top
6
- # of the page.
7
- class UnderlineNavComponent < Primer::Component
8
- include Primer::TabbedComponentHelper
9
-
10
- ALIGN_DEFAULT = :left
11
- ALIGN_OPTIONS = [ALIGN_DEFAULT, :right].freeze
12
-
13
- BODY_TAG_DEFAULT = :div
14
- BODY_TAG_OPTIONS = [BODY_TAG_DEFAULT, :ul].freeze
15
-
16
- ACTIONS_TAG_DEFAULT = :div
17
- ACTIONS_TAG_OPTIONS = [ACTIONS_TAG_DEFAULT, :span].freeze
18
-
19
- # Use the tabs to list navigation items. When `with_panel` is set on the parent, a button is rendered for panel navigation. Otherwise,
20
- # an anchor tag is rendered for page navigation. For more information, refer to <%= link_to_component(Primer::Navigation::TabComponent) %>.
21
- #
22
- # @param panel_id [String] Only applies if `with_panel` is `true`. Unique id of panel.
23
- # @param selected [Boolean] Whether the tab is selected.
24
- # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
25
- renders_many :tabs, lambda { |selected: false, **system_arguments|
26
- system_arguments[:classes] = class_names(
27
- "UnderlineNav-item",
28
- system_arguments[:classes]
29
- )
30
-
31
- Primer::Navigation::TabComponent.new(
32
- list: list?,
33
- selected: selected,
34
- with_panel: @with_panel,
35
- icon_classes: "UnderlineNav-octicon",
36
- **system_arguments
37
- )
38
- }
39
-
40
- # Use actions for a call to action.
41
- #
42
- # @param tag [Symbol] (Primer::UnderlineNavComponent::ACTIONS_TAG_DEFAULT) <%= one_of(Primer::UnderlineNavComponent::ACTIONS_TAG_OPTIONS) %>
43
- # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
44
- renders_one :actions, lambda { |tag: ACTIONS_TAG_DEFAULT, **system_arguments|
45
- system_arguments[:tag] = fetch_or_fallback(ACTIONS_TAG_OPTIONS, tag, ACTIONS_TAG_DEFAULT)
46
- system_arguments[:classes] = class_names("UnderlineNav-actions", system_arguments[:classes])
47
-
48
- Primer::BaseComponent.new(**system_arguments)
49
- }
50
-
51
- # @example Default
52
- # <%= render(Primer::UnderlineNavComponent.new(label: "Default")) do |component| %>
53
- # <% component.tab(href: "#", selected: true) { "Item 1" } %>
54
- # <% component.tab(href: "#") { "Item 2" } %>
55
- # <% component.actions do %>
56
- # <%= render(Primer::ButtonComponent.new) { "Button!" } %>
57
- # <% end %>
58
- # <% end %>
59
- #
60
- # @example With icons and counters
61
- # <%= render(Primer::UnderlineNavComponent.new(label: "With icons and counters")) do |component| %>
62
- # <% component.tab(href: "#", selected: true) do |t| %>
63
- # <% t.icon(icon: :star) %>
64
- # <% t.text { "Item 1" } %>
65
- # <% end %>
66
- # <% component.tab(href: "#") do |t| %>
67
- # <% t.icon(icon: :star) %>
68
- # <% t.text { "Item 2" } %>
69
- # <% t.counter(count: 10) %>
70
- # <% end %>
71
- # <% component.tab(href: "#") do |t| %>
72
- # <% t.text { "Item 3" } %>
73
- # <% t.counter(count: 10) %>
74
- # <% end %>
75
- # <% component.actions do %>
76
- # <%= render(Primer::ButtonComponent.new) { "Button!" } %>
77
- # <% end %>
78
- # <% end %>
79
- #
80
- # @example Align right
81
- # <%= render(Primer::UnderlineNavComponent.new(label: "Align right", align: :right)) do |component| %>
82
- # <% component.tab(href: "#", selected: true) do |t| %>
83
- # <% t.text { "Item 1" } %>
84
- # <% end %>
85
- # <% component.tab(href: "#") do |t| %>
86
- # <% t.text { "Item 2" } %>
87
- # <% end %>
88
- # <% component.actions do %>
89
- # <%= render(Primer::ButtonComponent.new) { "Button!" } %>
90
- # <% end %>
91
- # <% end %>
92
- #
93
- # @example As a list
94
- # <%= render(Primer::UnderlineNavComponent.new(label: "As a list", body_arguments: { tag: :ul })) do |component| %>
95
- # <% component.tab(href: "#", selected: true) do |t| %>
96
- # <% t.text { "Item 1" } %>
97
- # <% end %>
98
- # <% component.tab(href: "#") do |t| %>
99
- # <% t.text { "Item 2" } %>
100
- # <% end %>
101
- # <% component.actions do %>
102
- # <%= render(Primer::ButtonComponent.new) { "Button!" } %>
103
- # <% end %>
104
- # <% end %>
105
- #
106
- # @example With panels
107
- # <%= render(Primer::UnderlineNavComponent.new(label: "With panels", with_panel: true)) do |component| %>
108
- # <% component.tab(selected: true, id: "tab-1", panel_id: "panel-1") do |t| %>
109
- # <% t.text { "Item 1" } %>
110
- # <% t.panel do %>
111
- # Panel 1
112
- # <% end %>
113
- # <% end %>
114
- # <% component.tab(id: "tab-2", panel_id: "panel-2") do |t| %>
115
- # <% t.text { "Item 2" } %>
116
- # <% t.panel do %>
117
- # Panel 2
118
- # <% end %>
119
- # <% end %>
120
- # <% component.actions do %>
121
- # <%= render(Primer::ButtonComponent.new) { "Button!" } %>
122
- # <% end %>
123
- # <% end %>
124
- #
125
- # @example Customizing the body
126
- # <%= render(Primer::UnderlineNavComponent.new(label: "Default", body_arguments: { tag: :ul, classes: "custom-class", border: true, border_color: :info })) do |c| %>
127
- # <% c.tab(selected: true, href: "#") { "Tab 1" }%>
128
- # <% c.tab(href: "#") { "Tab 2" } %>
129
- # <% c.tab(href: "#") { "Tab 3" } %>
130
- # <% end %>
131
- #
132
- # @example Customizing the wrapper
133
- # <%= render(Primer::UnderlineNavComponent.new(label: "Default", wrapper_arguments: { classes: "custom-class", border: true, border_color: :info })) do |c| %>
134
- # <% c.tab(selected: true, href: "#") { "Tab 1" }%>
135
- # <% c.tab(href: "#") { "Tab 2" } %>
136
- # <% c.tab(href: "#") { "Tab 3" } %>
137
- # <% end %>
138
- #
139
- # @param label [String] The `aria-label` on top level `<nav>` element.
140
- # @param with_panel [Boolean] Whether the `UnderlineNav` should navigate through pages or panels. When true, <%= link_to_component(Primer::TabContainerComponent) %> is
141
- # rendered along with JavaScript behavior.
142
- # @param align [Symbol] <%= one_of(Primer::UnderlineNavComponent::ALIGN_OPTIONS) %> - Defaults to <%= Primer::UnderlineNavComponent::ALIGN_DEFAULT %>
143
- # @param body_arguments [Hash] <%= link_to_system_arguments_docs %> for the body wrapper.
144
- # @param wrapper_arguments [Hash] <%= link_to_system_arguments_docs %> for the `TabContainer` wrapper. Only applies if `with_panel` is `true`.
145
- # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
146
- def initialize(label:, with_panel: false, align: ALIGN_DEFAULT, body_arguments: { tag: BODY_TAG_DEFAULT }, wrapper_arguments: {}, **system_arguments)
147
- @with_panel = with_panel
148
- @align = fetch_or_fallback(ALIGN_OPTIONS, align, ALIGN_DEFAULT)
149
- @wrapper_arguments = wrapper_arguments
150
-
151
- @system_arguments = system_arguments
152
- @system_arguments[:tag] = navigation_tag(with_panel)
153
- @system_arguments[:classes] = class_names(
154
- @system_arguments[:classes],
155
- "UnderlineNav",
156
- "UnderlineNav--right" => @align == :right
157
- )
158
-
159
- @body_arguments = body_arguments
160
- @body_tag = fetch_or_fallback(BODY_TAG_OPTIONS, body_arguments[:tag]&.to_sym, BODY_TAG_DEFAULT)
161
-
162
- @body_arguments[:tag] = @body_tag
163
- @body_arguments[:classes] = class_names(
164
- "UnderlineNav-body",
165
- @body_arguments[:classes],
166
- "list-style-none" => list?
167
- )
168
-
169
- if with_panel
170
- @body_arguments[:role] = :tablist
171
- @body_arguments[:"aria-label"] = label
172
- else
173
- @system_arguments[:"aria-label"] = label
174
- end
175
- end
176
-
177
- private
178
-
179
- def list?
180
- @body_tag == :ul
181
- end
182
-
183
- def body
184
- Primer::BaseComponent.new(**@body_arguments)
185
- end
186
- end
187
- end