primer_view_components 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/app/assets/javascripts/primer_view_components.js +1 -1
- data/app/assets/javascripts/primer_view_components.js.map +1 -1
- data/app/assets/styles/primer_view_components.css +2 -2
- data/app/assets/styles/primer_view_components.css.map +1 -1
- data/app/components/primer/alpha/action_list/heading.html.erb +1 -1
- data/app/components/primer/alpha/action_list/heading.rb +5 -3
- data/app/components/primer/alpha/action_list/item.html.erb +9 -0
- data/app/components/primer/alpha/action_list/item.rb +31 -10
- data/app/components/primer/alpha/action_list.css +1 -1
- data/app/components/primer/alpha/action_list.css.json +4 -41
- data/app/components/primer/alpha/action_list.css.map +1 -1
- data/app/components/primer/alpha/action_list.pcss +19 -20
- data/app/components/primer/alpha/action_list.rb +54 -6
- data/app/components/primer/alpha/action_menu/action_menu_element.d.ts +22 -0
- data/app/components/primer/alpha/action_menu/action_menu_element.js +139 -0
- data/app/components/primer/alpha/action_menu/action_menu_element.ts +137 -0
- data/app/components/primer/alpha/action_menu/list.rb +81 -0
- data/app/components/primer/alpha/action_menu.html.erb +26 -0
- data/app/components/primer/alpha/action_menu.rb +322 -0
- data/app/components/primer/alpha/auto_complete.css.json +0 -11
- data/app/components/primer/alpha/banner.css.json +0 -14
- data/app/components/primer/alpha/button_marketing.css.json +0 -10
- data/app/components/primer/alpha/dialog.css.json +0 -63
- data/app/components/primer/alpha/dialog.rb +6 -2
- data/app/components/primer/alpha/dropdown.css.json +0 -21
- data/app/components/primer/alpha/layout.css.json +0 -27
- data/app/components/primer/alpha/menu.css.json +0 -11
- data/app/components/primer/alpha/nav_list/item.rb +5 -0
- data/app/components/primer/alpha/overlay.css +1 -1
- data/app/components/primer/alpha/overlay.css.json +0 -3
- data/app/components/primer/alpha/overlay.css.map +1 -1
- data/app/components/primer/alpha/overlay.pcss +1 -0
- data/app/components/primer/alpha/overlay.rb +14 -18
- data/app/components/primer/alpha/segmented_control.css.json +0 -15
- data/app/components/primer/alpha/tab_nav.css.json +0 -10
- data/app/components/primer/alpha/text_field.css.json +0 -38
- data/app/components/primer/alpha/toggle_switch.css.json +0 -16
- data/app/components/primer/alpha/underline_nav.css.json +0 -13
- data/app/components/primer/beta/avatar.css.json +0 -14
- data/app/components/primer/beta/avatar_stack.css.json +0 -9
- data/app/components/primer/beta/blankslate.css.json +0 -12
- data/app/components/primer/beta/border_box.css.json +0 -32
- data/app/components/primer/beta/border_box.rb +3 -3
- data/app/components/primer/beta/breadcrumbs.css.json +0 -4
- data/app/components/primer/beta/button.css +1 -1
- data/app/components/primer/beta/button.css.json +0 -22
- data/app/components/primer/beta/button.css.map +1 -1
- data/app/components/primer/beta/button.pcss +3 -3
- data/app/components/primer/beta/counter.css.json +0 -6
- data/app/components/primer/beta/flash.css.json +0 -15
- data/app/components/primer/beta/label.css.json +0 -20
- data/app/components/primer/beta/link.css.json +0 -8
- data/app/components/primer/beta/popover.css.json +0 -18
- data/app/components/primer/beta/progress_bar.css.json +0 -6
- data/app/components/primer/beta/state.css.json +0 -10
- data/app/components/primer/beta/subhead.css.json +0 -8
- data/app/components/primer/beta/timeline_item.css.json +0 -9
- data/app/components/primer/beta/truncate.css.json +0 -6
- data/app/components/primer/focus_group.d.ts +19 -0
- data/app/components/primer/focus_group.js +144 -0
- data/app/components/primer/focus_group.ts +137 -0
- data/app/components/primer/icon_button.rb +1 -1
- data/app/components/primer/primer.d.ts +2 -0
- data/app/components/primer/primer.js +2 -0
- data/app/components/primer/primer.ts +2 -0
- data/app/components/primer/truncate.css.json +0 -7
- data/app/lib/primer/css/layout.css.json +0 -263
- data/app/lib/primer/css/utilities.css.json +0 -1636
- data/lib/primer/static/generate_arguments.rb +55 -0
- data/lib/primer/static/generate_audited_at.rb +17 -0
- data/lib/primer/static/generate_constants.rb +19 -0
- data/lib/primer/static/generate_info_arch.rb +156 -0
- data/lib/primer/static/generate_previews.rb +45 -0
- data/lib/primer/static/generate_statuses.rb +17 -0
- data/lib/primer/static.rb +72 -0
- data/lib/primer/view_components/linters/disallow_component_css_counter.rb +43 -4
- data/lib/primer/view_components/version.rb +1 -1
- data/lib/primer/view_components.rb +0 -48
- data/lib/primer/yard/component_manifest.rb +1 -0
- data/lib/primer/yard/component_ref.rb +14 -0
- data/lib/primer/yard/docs_helper.rb +3 -0
- data/lib/primer/yard/info_arch_docs_helper.rb +31 -0
- data/lib/primer/yard/legacy_gatsby_backend.rb +3 -35
- data/lib/primer/yard/registry.rb +2 -1
- data/lib/primer/yard.rb +1 -0
- data/lib/tasks/docs.rake +10 -12
- data/lib/tasks/static.rake +20 -28
- data/previews/primer/alpha/action_list_preview.rb +4 -1
- data/previews/primer/alpha/action_menu_preview/align_end.html.erb +6 -0
- data/previews/primer/alpha/action_menu_preview/opens_dialog.html.erb +21 -0
- data/previews/primer/alpha/action_menu_preview.rb +238 -0
- data/previews/primer/alpha/dialog_preview/body_has_scrollbar_overflow.html.erb +2 -2
- data/previews/primer/alpha/dialog_preview/custom_header.html.erb +3 -3
- data/previews/primer/alpha/dialog_preview/nested_dialog.html.erb +4 -4
- data/previews/primer/alpha/dialog_preview/test.html.erb +3 -3
- data/previews/primer/alpha/dialog_preview/with_footer.html.erb +3 -3
- data/previews/primer/alpha/dialog_preview/with_form.html.erb +1 -1
- data/previews/primer/alpha/dialog_preview/with_text_input.html.erb +2 -2
- data/previews/primer/alpha/dialog_preview.rb +7 -2
- data/previews/primer/beta/auto_complete_item_preview.rb +1 -0
- data/static/arguments.json +3078 -1404
- data/static/audited_at.json +2 -0
- data/static/classes.json +576 -311
- data/static/constants.json +42 -2
- data/static/info_arch.json +8859 -0
- data/static/previews.json +221 -101
- data/static/statuses.json +2 -0
- metadata +23 -2
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
# typed: false
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Primer
|
|
5
|
+
module Alpha
|
|
6
|
+
# The ActionMenu should be used when a user can select a single option triggering an action from a list of items. Primer will automatically nest an `Item` within a presentational `<li>` tag.
|
|
7
|
+
#
|
|
8
|
+
# The only allowed elements for the `Item` components are: `:a`, `:button`, and `:clipboard-copy`. If one isn't selected, a fallback `:span` will be used. To add functionality, use a `.js` class to create the functionality, or an `onclick` handler.
|
|
9
|
+
#
|
|
10
|
+
# @accessibility
|
|
11
|
+
# The action for the menu item needs to be on the element with `role="menuitem"`. Semantics are removed for everything nested inside of it. When a menu item is selected, the menu will close immediately.
|
|
12
|
+
#
|
|
13
|
+
# Additional information around the keyboard functionality and implementation can be found on the [WAI-ARIA Authoring Practices](https://www.w3.org/TR/wai-aria-practices-1.2/#menu).
|
|
14
|
+
class ActionMenu < Primer::Component
|
|
15
|
+
status :alpha
|
|
16
|
+
|
|
17
|
+
DEFAULT_PRELOAD = false
|
|
18
|
+
|
|
19
|
+
DEFAULT_SELECT_VARIANT = :none
|
|
20
|
+
SELECT_VARIANT_OPTIONS = [
|
|
21
|
+
:single,
|
|
22
|
+
:multiple,
|
|
23
|
+
DEFAULT_SELECT_VARIANT
|
|
24
|
+
].freeze
|
|
25
|
+
|
|
26
|
+
attr_reader :list, :preload
|
|
27
|
+
|
|
28
|
+
alias preload? preload
|
|
29
|
+
|
|
30
|
+
# @example Default
|
|
31
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-0") do |c| %>
|
|
32
|
+
# <% c.with_show_button { "Menu" } %>
|
|
33
|
+
# <% c.with_item(tag: :a, href: "https://primer.style/design/") do %>
|
|
34
|
+
# Primer Design
|
|
35
|
+
# <% end %>
|
|
36
|
+
# <% c.with_item(tag: :button, type: "button", onclick: "() => {}") do %>
|
|
37
|
+
# Quote Reply
|
|
38
|
+
# <% end %>
|
|
39
|
+
# <% c.with_item(tag: :"clipboard-copy", value: "Text to copy") do %>
|
|
40
|
+
# Copy Text
|
|
41
|
+
# <% end %>
|
|
42
|
+
# <% end %>
|
|
43
|
+
#
|
|
44
|
+
# @example With caret
|
|
45
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-1") do |c| %>
|
|
46
|
+
# <% c.with_show_button(with_caret: true) { "Menu" } %>
|
|
47
|
+
# <% c.with_item(tag: :a, href: "https://primer.style/design/") do %>
|
|
48
|
+
# Primer Design
|
|
49
|
+
# <% end %>
|
|
50
|
+
# <% c.with_item(tag: :button, type: "button") do %>
|
|
51
|
+
# Quote Reply
|
|
52
|
+
# <% end %>
|
|
53
|
+
# <% c.with_item(tag: :"clipboard-copy", value: "Text to copy") do %>
|
|
54
|
+
# Copy Text
|
|
55
|
+
# <% end %>
|
|
56
|
+
# <% end %>
|
|
57
|
+
#
|
|
58
|
+
# @example With `IconButton` trigger
|
|
59
|
+
# @description
|
|
60
|
+
# Set `icon:` to the octicon you want to use. Always provide an accessible name for the menu by setting `aria-label`.
|
|
61
|
+
# @code
|
|
62
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-2") do |c| %>
|
|
63
|
+
# <% c.with_show_button(icon: :"kebab-horizontal", "aria-label": "Menu") %>
|
|
64
|
+
# <% c.with_item(tag: :a, href: "https://primer.style/design/") do %>
|
|
65
|
+
# Primer Design Link
|
|
66
|
+
# <% end %>
|
|
67
|
+
# <% c.with_item(tag: :button, type: "button") do %>
|
|
68
|
+
# Quote Reply
|
|
69
|
+
# <% end %>
|
|
70
|
+
# <% c.with_item(tag: :"clipboard-copy", value: "Text to copy") do %>
|
|
71
|
+
# Copy Text
|
|
72
|
+
# <% end %>
|
|
73
|
+
# <% end %>
|
|
74
|
+
#
|
|
75
|
+
# @example With divider
|
|
76
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-3") do |c| %>
|
|
77
|
+
# <% c.with_show_button(icon: :"kebab-horizontal", "aria-label": "Menu") %>
|
|
78
|
+
# <% c.with_item(tag: :a, href: "https://primer.style/design/") do %>
|
|
79
|
+
# Primer Design Link
|
|
80
|
+
# <% end %>
|
|
81
|
+
# <% c.with_item(tag: :button, type: "button") do %>
|
|
82
|
+
# Quote Reply
|
|
83
|
+
# <% end %>
|
|
84
|
+
# <% c.with_item(is_divider: true) %>
|
|
85
|
+
# <% c.with_item(tag: :"clipboard-copy", value: "Text to copy") do %>
|
|
86
|
+
# Copy Text
|
|
87
|
+
# <% end %>
|
|
88
|
+
# <% end %>
|
|
89
|
+
#
|
|
90
|
+
# @example With danger item
|
|
91
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-4") do |c| %>
|
|
92
|
+
# <% c.with_show_button(icon: :"kebab-horizontal", "aria-label": "Menu") %>
|
|
93
|
+
# <% c.with_item(tag: :a, href: "https://primer.style/design/") do %>
|
|
94
|
+
# Primer Design Link
|
|
95
|
+
# <% end %>
|
|
96
|
+
# <% c.with_item(tag: :button, type: "button") do %>
|
|
97
|
+
# Quote Reply
|
|
98
|
+
# <% end %>
|
|
99
|
+
# <% c.with_item(tag: :"clipboard-copy", value: "Text to copy") do %>
|
|
100
|
+
# Copy Text
|
|
101
|
+
# <% end %>
|
|
102
|
+
# <% c.with_item(tag: :button, type: "button", is_dangerous: true) do %>
|
|
103
|
+
# Delete
|
|
104
|
+
# <% end %>
|
|
105
|
+
# <% end %>
|
|
106
|
+
#
|
|
107
|
+
# @example With center align
|
|
108
|
+
# @description
|
|
109
|
+
# Align the menu to the center of the trigger button
|
|
110
|
+
# @code
|
|
111
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-5", anchor_align: :center, anchor_side: :outside_top) do |c| %>
|
|
112
|
+
# <% c.with_show_button(with_caret: true) { "Outside top" } %>
|
|
113
|
+
# <% c.with_item do %>
|
|
114
|
+
# Item 1 that does something
|
|
115
|
+
# <% end %>
|
|
116
|
+
# <% c.with_item do %>
|
|
117
|
+
# Item 2 that does another thing
|
|
118
|
+
# <% end %>
|
|
119
|
+
# <% end %>
|
|
120
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-6", anchor_align: :center, anchor_side: :outside_left) do |c| %>
|
|
121
|
+
# <% c.with_show_button(with_caret: true) { "Outside left" } %>
|
|
122
|
+
# <% c.with_item do %>
|
|
123
|
+
# Item 1 that does something
|
|
124
|
+
# <% end %>
|
|
125
|
+
# <% c.with_item do %>
|
|
126
|
+
# Item 2 that does another thing
|
|
127
|
+
# <% end %>
|
|
128
|
+
# <% end %>
|
|
129
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-7", anchor_align: :center, anchor_side: :outside_right) do |c| %>
|
|
130
|
+
# <% c.with_show_button(with_caret: true) { "Outside right" } %>
|
|
131
|
+
# <% c.with_item do %>
|
|
132
|
+
# Item 1 that does something
|
|
133
|
+
# <% end %>
|
|
134
|
+
# <% c.with_item do %>
|
|
135
|
+
# Item 2 that does another thing
|
|
136
|
+
# <% end %>
|
|
137
|
+
# <% end %>
|
|
138
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-8", anchor_align: :center, anchor_side: :outside_bottom) do |c| %>
|
|
139
|
+
# <% c.with_show_button(with_caret: true) { "Outside bottom" } %>
|
|
140
|
+
# <% c.with_item do %>
|
|
141
|
+
# Item 1 that does something
|
|
142
|
+
# <% end %>
|
|
143
|
+
# <% c.with_item do %>
|
|
144
|
+
# Item 2 that does another thing
|
|
145
|
+
# <% end %>
|
|
146
|
+
# <% end %>
|
|
147
|
+
#
|
|
148
|
+
# @example With start align
|
|
149
|
+
# @description
|
|
150
|
+
# Align the menu to the start of the trigger button
|
|
151
|
+
# @code
|
|
152
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-9", anchor_align: :start, anchor_side: :outside_top) do |c| %>
|
|
153
|
+
# <% c.with_show_button(with_caret: true) { "Outside top" } %>
|
|
154
|
+
# <% c.with_item do %>
|
|
155
|
+
# Item 1 that does something
|
|
156
|
+
# <% end %>
|
|
157
|
+
# <% c.with_item do %>
|
|
158
|
+
# Item 2 that does another thing
|
|
159
|
+
# <% end %>
|
|
160
|
+
# <% end %>
|
|
161
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-10", anchor_align: :start, anchor_side: :outside_left) do |c| %>
|
|
162
|
+
# <% c.with_show_button(with_caret: true) { "Outside left" } %>
|
|
163
|
+
# <% c.with_item do %>
|
|
164
|
+
# Item 1 that does something
|
|
165
|
+
# <% end %>
|
|
166
|
+
# <% c.with_item do %>
|
|
167
|
+
# Item 2 that does another thing
|
|
168
|
+
# <% end %>
|
|
169
|
+
# <% end %>
|
|
170
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-11", anchor_align: :start, anchor_side: :outside_right) do |c| %>
|
|
171
|
+
# <% c.with_show_button(with_caret: true) { "Outside right" } %>
|
|
172
|
+
# <% c.with_item do %>
|
|
173
|
+
# Item 1 that does something
|
|
174
|
+
# <% end %>
|
|
175
|
+
# <% c.with_item do %>
|
|
176
|
+
# Item 2 that does another thing
|
|
177
|
+
# <% end %>
|
|
178
|
+
# <% end %>
|
|
179
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-12", anchor_align: :start, anchor_side: :outside_bottom) do |c| %>
|
|
180
|
+
# <% c.with_show_button(with_caret: true) { "Outside bottom" } %>
|
|
181
|
+
# <% c.with_item do %>
|
|
182
|
+
# Item 1 that does something
|
|
183
|
+
# <% end %>
|
|
184
|
+
# <% c.with_item do %>
|
|
185
|
+
# Item 2 that does another thing
|
|
186
|
+
# <% end %>
|
|
187
|
+
# <% end %>
|
|
188
|
+
#
|
|
189
|
+
# @example With end align
|
|
190
|
+
# @description
|
|
191
|
+
# Align the menu to the end of the trigger button
|
|
192
|
+
# @code
|
|
193
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-13", anchor_align: :end, anchor_side: :outside_top) do |c| %>
|
|
194
|
+
# <% c.with_show_button(with_caret: true) { "Outside top" } %>
|
|
195
|
+
# <% c.with_item do %>
|
|
196
|
+
# Item 1 that does something
|
|
197
|
+
# <% end %>
|
|
198
|
+
# <% c.with_item do %>
|
|
199
|
+
# Item 2 that does another thing
|
|
200
|
+
# <% end %>
|
|
201
|
+
# <% end %>
|
|
202
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-14", anchor_align: :end, anchor_side: :outside_left) do |c| %>
|
|
203
|
+
# <% c.with_show_button(with_caret: true) { "Outside left" } %>
|
|
204
|
+
# <% c.with_item do %>
|
|
205
|
+
# Item 1 that does something
|
|
206
|
+
# <% end %>
|
|
207
|
+
# <% c.with_item do %>
|
|
208
|
+
# Item 2 that does another thing
|
|
209
|
+
# <% end %>
|
|
210
|
+
# <% end %>
|
|
211
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-15", anchor_align: :end, anchor_side: :outside_right) do |c| %>
|
|
212
|
+
# <% c.with_show_button(with_caret: true) { "Outside right" } %>
|
|
213
|
+
# <% c.with_item do %>
|
|
214
|
+
# Item 1 that does something
|
|
215
|
+
# <% end %>
|
|
216
|
+
# <% c.with_item do %>
|
|
217
|
+
# Item 2 that does another thing
|
|
218
|
+
# <% end %>
|
|
219
|
+
# <% end %>
|
|
220
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-16", anchor_align: :end, anchor_side: :outside_bottom) do |c| %>
|
|
221
|
+
# <% c.with_show_button(with_caret: true) { "Outside bottom" } %>
|
|
222
|
+
# <% c.with_item do %>
|
|
223
|
+
# Item 1 that does something
|
|
224
|
+
# <% end %>
|
|
225
|
+
# <% c.with_item do %>
|
|
226
|
+
# Item 2 that does another thing
|
|
227
|
+
# <% end %>
|
|
228
|
+
# <% end %>
|
|
229
|
+
#
|
|
230
|
+
# @example With deferred menu content loaded with an `include-fragment`
|
|
231
|
+
# <%= render Primer::Alpha::ActionMenu.new(menu_id: "my-action-menu-3", src: "/") do |c| %>
|
|
232
|
+
# <% c.with_show_button(icon: :"kebab-horizontal", "aria-label": "Menu") %>
|
|
233
|
+
# <% end %>
|
|
234
|
+
#
|
|
235
|
+
# @param menu_id [String] Id of the menu.
|
|
236
|
+
# @param anchor_align [Symbol] <%= one_of(Primer::Alpha::Overlay::ANCHOR_ALIGN_OPTIONS) %>.
|
|
237
|
+
# @param anchor_side [Symbol] <%= one_of(Primer::Alpha::Overlay::ANCHOR_SIDE_OPTIONS) %>.
|
|
238
|
+
# @param src [String] Used with an `include-fragment` element to load menu content from the given source URL.
|
|
239
|
+
# @param preload [Boolean] When true, and src is present, loads the `include-fragment` on trigger hover.
|
|
240
|
+
# @param dynamic_label [Boolean] Whether or not to display the text of the currently selected item in the show button.
|
|
241
|
+
# @param dynamic_label_prefix [String] If provided, the prefix is prepended to the dynamic label and displayed in the show button.
|
|
242
|
+
# @param select_variant [Symbol]. <%= one_of(Primer::Alpha::ActionMenu::SELECT_VARIANT_OPTIONS) %>.
|
|
243
|
+
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>.
|
|
244
|
+
def initialize(
|
|
245
|
+
menu_id: self.class.generate_id,
|
|
246
|
+
anchor_align: Primer::Alpha::Overlay::DEFAULT_ANCHOR_ALIGN,
|
|
247
|
+
anchor_side: Primer::Alpha::Overlay::DEFAULT_ANCHOR_SIDE,
|
|
248
|
+
src: nil,
|
|
249
|
+
preload: DEFAULT_PRELOAD,
|
|
250
|
+
dynamic_label: false,
|
|
251
|
+
dynamic_label_prefix: nil,
|
|
252
|
+
select_variant: DEFAULT_SELECT_VARIANT,
|
|
253
|
+
**system_arguments
|
|
254
|
+
)
|
|
255
|
+
@menu_id = menu_id
|
|
256
|
+
@src = src
|
|
257
|
+
@preload = fetch_or_fallback_boolean(preload, DEFAULT_PRELOAD)
|
|
258
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
|
259
|
+
|
|
260
|
+
@system_arguments[:preload] = true if @src.present? && preload?
|
|
261
|
+
|
|
262
|
+
select_variant = fetch_or_fallback(SELECT_VARIANT_OPTIONS, select_variant, DEFAULT_SELECT_VARIANT)
|
|
263
|
+
|
|
264
|
+
@system_arguments[:tag] = :"action-menu"
|
|
265
|
+
@system_arguments[:"data-select-variant"] = select_variant
|
|
266
|
+
@system_arguments[:"data-dynamic-label"] = "" if dynamic_label
|
|
267
|
+
@system_arguments[:"data-dynamic-label-prefix"] = dynamic_label_prefix if dynamic_label_prefix.present?
|
|
268
|
+
|
|
269
|
+
@overlay = Primer::Alpha::Overlay.new(
|
|
270
|
+
id: "#{@menu_id}-overlay",
|
|
271
|
+
title: "Menu",
|
|
272
|
+
visually_hide_title: true,
|
|
273
|
+
anchor_align: anchor_align,
|
|
274
|
+
anchor_side: anchor_side
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
@list = Primer::Alpha::ActionMenu::List.new(
|
|
278
|
+
menu_id: @menu_id,
|
|
279
|
+
select_variant: select_variant
|
|
280
|
+
)
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
# Button to activate the menu. This may be a <%= link_to_component(Primer::ButtonComponent) %> or <%= link_to_component(Primer::IconButton) %>.
|
|
284
|
+
#
|
|
285
|
+
# @param icon [Symbol] Set this to an [Octicon name](https://primer.style/octicons/) when you want to render an `IconButton`. Otherwise, this renders as a <%= link_to_component(Primer::ButtonComponent) %>.
|
|
286
|
+
def with_show_button(**system_arguments, &block)
|
|
287
|
+
@overlay.with_show_button(**system_arguments, id: "#{@menu_id}-button", controls: "#{@menu_id}-list", &block)
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
# Adds a new item to the list.
|
|
291
|
+
#
|
|
292
|
+
# @param system_arguments [Hash] The arguments accepted by <%= link_to_component(Primer::Alpha::ActionList::Item) %>.
|
|
293
|
+
def with_item(**system_arguments, &block)
|
|
294
|
+
@list.with_item(**system_arguments, &block)
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
# Retrieves the list of items.
|
|
298
|
+
def items
|
|
299
|
+
@list.items
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
# Adds a divider to the list.
|
|
303
|
+
#
|
|
304
|
+
# @param system_arguments [Hash] The arguments accepted by <%= link_to_component(Primer::Alpha::ActionList) %>'s `divider` slot.
|
|
305
|
+
def with_divider(**system_arguments, &block)
|
|
306
|
+
@list.with_divider(**system_arguments, &block)
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
private
|
|
310
|
+
|
|
311
|
+
def before_render
|
|
312
|
+
content
|
|
313
|
+
|
|
314
|
+
raise ArgumentError, "`items` cannot be set when `src` is specified" if @src.present? && items.any?
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
def render?
|
|
318
|
+
items.any? || @src.present?
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|
|
@@ -19,16 +19,5 @@
|
|
|
19
19
|
".autocomplete-item.navigation-focus *",
|
|
20
20
|
".autocomplete-item.selected *",
|
|
21
21
|
".autocomplete-item[aria-selected=true] *"
|
|
22
|
-
],
|
|
23
|
-
"classes": [
|
|
24
|
-
"autocomplete-label-stacked",
|
|
25
|
-
"autocomplete-label-inline",
|
|
26
|
-
"autocomplete-body",
|
|
27
|
-
"autocomplete-embedded-icon-wrap",
|
|
28
|
-
"form-control",
|
|
29
|
-
"autocomplete-results",
|
|
30
|
-
"autocomplete-item",
|
|
31
|
-
"navigation-focus",
|
|
32
|
-
"selected"
|
|
33
22
|
]
|
|
34
23
|
}
|
|
@@ -20,19 +20,5 @@
|
|
|
20
20
|
".Banner.Banner--success .Banner-visual .octicon",
|
|
21
21
|
".Banner.Banner--full",
|
|
22
22
|
".Banner.Banner--full-whenNarrow"
|
|
23
|
-
],
|
|
24
|
-
"classes": [
|
|
25
|
-
"Banner",
|
|
26
|
-
"Banner-actions",
|
|
27
|
-
"Banner-visual",
|
|
28
|
-
"octicon",
|
|
29
|
-
"Banner-message",
|
|
30
|
-
"Banner-title",
|
|
31
|
-
"Banner-close",
|
|
32
|
-
"Banner--warning",
|
|
33
|
-
"Banner--error",
|
|
34
|
-
"Banner--success",
|
|
35
|
-
"Banner--full",
|
|
36
|
-
"Banner--full-whenNarrow"
|
|
37
23
|
]
|
|
38
24
|
}
|
|
@@ -29,15 +29,5 @@
|
|
|
29
29
|
".btn-signup-mktg:focus-visible",
|
|
30
30
|
".btn-small-mktg",
|
|
31
31
|
".btn-large-mktg"
|
|
32
|
-
],
|
|
33
|
-
"classes": [
|
|
34
|
-
"btn-mktg",
|
|
35
|
-
"focus",
|
|
36
|
-
"disabled",
|
|
37
|
-
"btn-muted-mktg",
|
|
38
|
-
"btn-subtle-mktg",
|
|
39
|
-
"btn-signup-mktg",
|
|
40
|
-
"btn-small-mktg",
|
|
41
|
-
"btn-large-mktg"
|
|
42
32
|
]
|
|
43
33
|
}
|
|
@@ -78,68 +78,5 @@
|
|
|
78
78
|
".Overlay-backdrop--side-whenNarrow.Overlay-backdrop--placement-top-whenNarrow>.Overlay-whenNarrow",
|
|
79
79
|
".Overlay-backdrop--full-whenNarrow",
|
|
80
80
|
".Overlay-backdrop--full-whenNarrow .Overlay"
|
|
81
|
-
],
|
|
82
|
-
"classes": [
|
|
83
|
-
"Overlay--hidden",
|
|
84
|
-
"Overlay--visibilityHidden",
|
|
85
|
-
"Overlay",
|
|
86
|
-
"Overlay--size-auto",
|
|
87
|
-
"Overlay--size-full",
|
|
88
|
-
"Overlay--size-xsmall",
|
|
89
|
-
"Overlay--size-small",
|
|
90
|
-
"Overlay--size-small-portrait",
|
|
91
|
-
"Overlay--size-medium",
|
|
92
|
-
"Overlay--size-medium-portrait",
|
|
93
|
-
"Overlay--size-large",
|
|
94
|
-
"Overlay--size-xlarge",
|
|
95
|
-
"Overlay--height-auto",
|
|
96
|
-
"Overlay--height-xsmall",
|
|
97
|
-
"Overlay--height-small",
|
|
98
|
-
"Overlay--height-medium",
|
|
99
|
-
"Overlay--height-large",
|
|
100
|
-
"Overlay--height-xlarge",
|
|
101
|
-
"Overlay--width-auto",
|
|
102
|
-
"Overlay--width-small",
|
|
103
|
-
"Overlay--width-medium",
|
|
104
|
-
"Overlay--width-large",
|
|
105
|
-
"Overlay--width-xlarge",
|
|
106
|
-
"Overlay--width-xxlarge",
|
|
107
|
-
"Overlay--motion-scaleFade",
|
|
108
|
-
"Overlay-form",
|
|
109
|
-
"Overlay-header",
|
|
110
|
-
"Overlay-header--divided",
|
|
111
|
-
"Overlay-body",
|
|
112
|
-
"Overlay-header--large",
|
|
113
|
-
"Overlay-headerContentWrap",
|
|
114
|
-
"Overlay-titleWrap",
|
|
115
|
-
"Overlay-title",
|
|
116
|
-
"Overlay-description",
|
|
117
|
-
"Overlay-actionWrap",
|
|
118
|
-
"Overlay-body--paddingCondensed",
|
|
119
|
-
"Overlay-body--paddingNone",
|
|
120
|
-
"Overlay-footer",
|
|
121
|
-
"Overlay-footer--divided",
|
|
122
|
-
"Overlay-footer--alignStart",
|
|
123
|
-
"Overlay-footer--alignCenter",
|
|
124
|
-
"Overlay-footer--alignEnd",
|
|
125
|
-
"Overlay-closeButton",
|
|
126
|
-
"close-button",
|
|
127
|
-
"Overlay-backdrop--center",
|
|
128
|
-
"Overlay-backdrop--anchor",
|
|
129
|
-
"Overlay-backdrop--side",
|
|
130
|
-
"Overlay-backdrop--placement-left",
|
|
131
|
-
"Overlay-backdrop--placement-right",
|
|
132
|
-
"Overlay-backdrop--placement-bottom",
|
|
133
|
-
"Overlay-backdrop--placement-top",
|
|
134
|
-
"Overlay-backdrop--full",
|
|
135
|
-
"Overlay-backdrop--center-whenNarrow",
|
|
136
|
-
"Overlay-backdrop--anchor-whenNarrow",
|
|
137
|
-
"Overlay-backdrop--side-whenNarrow",
|
|
138
|
-
"Overlay-backdrop--placement-left-whenNarrow",
|
|
139
|
-
"Overlay-whenNarrow",
|
|
140
|
-
"Overlay-backdrop--placement-right-whenNarrow",
|
|
141
|
-
"Overlay-backdrop--placement-bottom-whenNarrow",
|
|
142
|
-
"Overlay-backdrop--placement-top-whenNarrow",
|
|
143
|
-
"Overlay-backdrop--full-whenNarrow"
|
|
144
81
|
]
|
|
145
82
|
}
|
|
@@ -53,13 +53,17 @@ module Primer
|
|
|
53
53
|
# Optional button to open the dialog.
|
|
54
54
|
#
|
|
55
55
|
# @param system_arguments [Hash] The same arguments as <%= link_to_component(Primer::Beta::Button) %>.
|
|
56
|
-
renders_one :show_button, lambda {
|
|
56
|
+
renders_one :show_button, lambda { |icon: nil, **system_arguments|
|
|
57
57
|
system_arguments[:classes] = class_names(
|
|
58
58
|
system_arguments[:classes]
|
|
59
59
|
)
|
|
60
60
|
system_arguments[:id] = "dialog-show-#{@system_arguments[:id]}"
|
|
61
61
|
system_arguments[:data] = (system_arguments[:data] || {}).merge({ "show-dialog-id": @system_arguments[:id] })
|
|
62
|
-
|
|
62
|
+
if icon.present?
|
|
63
|
+
Primer::Beta::IconButton.new(icon: icon, **system_arguments)
|
|
64
|
+
else
|
|
65
|
+
Primer::Beta::Button.new(**system_arguments)
|
|
66
|
+
end
|
|
63
67
|
}
|
|
64
68
|
|
|
65
69
|
# Header content.
|
|
@@ -36,26 +36,5 @@
|
|
|
36
36
|
".dropdown-menu-sw:after",
|
|
37
37
|
".dropdown-menu-se:before",
|
|
38
38
|
".dropdown-menu-se:after"
|
|
39
|
-
],
|
|
40
|
-
"classes": [
|
|
41
|
-
"dropdown",
|
|
42
|
-
"dropdown-caret",
|
|
43
|
-
"dropdown-menu",
|
|
44
|
-
"dropdown-menu-no-overflow",
|
|
45
|
-
"dropdown-item",
|
|
46
|
-
"octicon",
|
|
47
|
-
"color-fg-",
|
|
48
|
-
"Label",
|
|
49
|
-
"btn-link",
|
|
50
|
-
"dropdown-signout",
|
|
51
|
-
"dropdown-divider",
|
|
52
|
-
"dropdown-header",
|
|
53
|
-
"octicon-check",
|
|
54
|
-
"dropdown-menu-w",
|
|
55
|
-
"dropdown-menu-e",
|
|
56
|
-
"dropdown-menu-ne",
|
|
57
|
-
"dropdown-menu-s",
|
|
58
|
-
"dropdown-menu-sw",
|
|
59
|
-
"dropdown-menu-se"
|
|
60
39
|
]
|
|
61
40
|
}
|
|
@@ -76,32 +76,5 @@
|
|
|
76
76
|
".Layout-main .Layout-main-centered-xl>.container-lg",
|
|
77
77
|
".Layout-main .Layout-main-centered-xl>.container-md",
|
|
78
78
|
".Layout-main .Layout-main-centered-xl>.container-xl"
|
|
79
|
-
],
|
|
80
|
-
"classes": [
|
|
81
|
-
"Layout",
|
|
82
|
-
"Layout-divider",
|
|
83
|
-
"Layout-main",
|
|
84
|
-
"Layout-sidebar",
|
|
85
|
-
"Layout--sidebarPosition-flowRow-start",
|
|
86
|
-
"Layout--sidebarPosition-flowRow-end",
|
|
87
|
-
"Layout--sidebarPosition-flowRow-none",
|
|
88
|
-
"Layout--divided",
|
|
89
|
-
"Layout-divider--flowRow-hidden",
|
|
90
|
-
"Layout-divider--flowRow-shallow",
|
|
91
|
-
"Layout--flowRow-until-md",
|
|
92
|
-
"Layout--flowRow-until-lg",
|
|
93
|
-
"Layout--gutter-none",
|
|
94
|
-
"Layout--gutter-condensed",
|
|
95
|
-
"Layout--gutter-spacious",
|
|
96
|
-
"Layout--sidebar-narrow",
|
|
97
|
-
"Layout--sidebar-wide",
|
|
98
|
-
"Layout--sidebarPosition-start",
|
|
99
|
-
"Layout--sidebarPosition-end",
|
|
100
|
-
"Layout-main-centered-lg",
|
|
101
|
-
"Layout-main-centered-md",
|
|
102
|
-
"Layout-main-centered-xl",
|
|
103
|
-
"container-lg",
|
|
104
|
-
"container-md",
|
|
105
|
-
"container-xl"
|
|
106
79
|
]
|
|
107
80
|
}
|
|
@@ -24,16 +24,5 @@
|
|
|
24
24
|
".menu-heading:hover",
|
|
25
25
|
".menu-heading:first-child",
|
|
26
26
|
".menu-heading:last-child"
|
|
27
|
-
],
|
|
28
|
-
"classes": [
|
|
29
|
-
"menu",
|
|
30
|
-
"menu-item",
|
|
31
|
-
"selected",
|
|
32
|
-
"octicon",
|
|
33
|
-
"Counter",
|
|
34
|
-
"menu-warning",
|
|
35
|
-
"avatar",
|
|
36
|
-
"alert",
|
|
37
|
-
"menu-heading"
|
|
38
27
|
]
|
|
39
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.Overlay[popover]{border-width:0;padding:0;position:absolute}.Overlay[popover]:not(:open){display:none}anchored-position{display:block}
|
|
1
|
+
.Overlay[popover]{border-width:0;padding:0;position:absolute;width:min(192px,100vw - 2rem)}.Overlay[popover]:not(:open){display:none}anchored-position{display:block}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["overlay.pcss"],"names":[],"mappings":"AAAA,kBACE,cAAe,CACf,SAAU,CACV,
|
|
1
|
+
{"version":3,"sources":["overlay.pcss"],"names":[],"mappings":"AAAA,kBACE,cAAe,CACf,SAAU,CACV,iBAAkB,CAClB,6BACF,CAGA,6BACE,YACF,CAEA,kBACE,aACF","file":"overlay.css","sourcesContent":[".Overlay[popover] {\n border-width: 0;\n padding: 0;\n position: absolute;\n width: min(192px, 100vw - 2rem);\n}\n\n/* stylelint-disable-next-line selector-pseudo-class-no-unknown */\n.Overlay[popover]:not(:open) {\n display: none;\n}\n\nanchored-position {\n display: block;\n}\n"]}
|
|
@@ -63,22 +63,23 @@ module Primer
|
|
|
63
63
|
DEFAULT_POPOVER = :auto
|
|
64
64
|
POPOVER_OPTIONS = [DEFAULT_POPOVER, :manual].freeze
|
|
65
65
|
|
|
66
|
-
ROLE_OPTIONS = [:dialog, :menu].freeze
|
|
66
|
+
ROLE_OPTIONS = [:dialog, :menu, nil].freeze
|
|
67
67
|
|
|
68
68
|
# Optional button to open the Overlay.
|
|
69
69
|
#
|
|
70
70
|
# @param system_arguments [Hash] The same arguments as <%= link_to_component(Primer::ButtonComponent) %>.
|
|
71
|
-
renders_one :show_button, lambda { |icon: nil, **
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
renders_one :show_button, lambda { |icon: nil, controls: nil, **button_arguments|
|
|
72
|
+
button_arguments[:classes] = class_names(
|
|
73
|
+
button_arguments[:classes]
|
|
74
74
|
)
|
|
75
|
-
|
|
76
|
-
system_arguments[
|
|
77
|
-
|
|
75
|
+
button_arguments[:id] ||= show_button_id
|
|
76
|
+
@system_arguments[:anchor] = button_arguments[:id]
|
|
77
|
+
button_arguments["popovertarget"] = @id
|
|
78
|
+
button_arguments[:aria] = (button_arguments[:aria] || {}).merge({ controls: controls, haspopup: "true" })
|
|
78
79
|
if icon.present?
|
|
79
|
-
Primer::Beta::IconButton.new(icon: icon, **
|
|
80
|
+
Primer::Beta::IconButton.new(icon: icon, **button_arguments)
|
|
80
81
|
else
|
|
81
|
-
Primer::Beta::Button.new(**
|
|
82
|
+
Primer::Beta::Button.new(**button_arguments)
|
|
82
83
|
end
|
|
83
84
|
}
|
|
84
85
|
|
|
@@ -134,7 +135,6 @@ module Primer
|
|
|
134
135
|
# @param title [String] Describes the content of the Overlay.
|
|
135
136
|
# @param subtitle [String] Provides dditional context for the Overlay, also setting the `aria-describedby` attribute.
|
|
136
137
|
# @param popover [Symbol] The popover behaviour. <%= one_of(Primer::Alpha::Overlay::POPOVER_OPTIONS) %>
|
|
137
|
-
# @param popover [Symbol] The popover behaviour. <%= one_of(Primer::Alpha::Overlay::POPOVER_OPTIONS) %>
|
|
138
138
|
# @param size [Symbol] The size of the Overlay. <%= one_of(Primer::Alpha::Overlay::SIZE_OPTIONS) %>
|
|
139
139
|
# @param padding [Symbol] The padding given to the Overlay body. <%= one_of(Primer::Alpha::Overlay::PADDING_OPTIONS) %>
|
|
140
140
|
# @param anchor [String] An ID of the element to anchor onto. Defaults to the `show_button`.
|
|
@@ -147,7 +147,7 @@ module Primer
|
|
|
147
147
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
|
148
148
|
def initialize(
|
|
149
149
|
title:,
|
|
150
|
-
role
|
|
150
|
+
role: nil,
|
|
151
151
|
subtitle: nil,
|
|
152
152
|
popover: DEFAULT_POPOVER,
|
|
153
153
|
size: DEFAULT_SIZE,
|
|
@@ -163,7 +163,7 @@ module Primer
|
|
|
163
163
|
)
|
|
164
164
|
@system_arguments = deny_tag_argument(**system_arguments)
|
|
165
165
|
|
|
166
|
-
@system_arguments[:role] = fetch_or_fallback(ROLE_OPTIONS, role)
|
|
166
|
+
@system_arguments[:role] = fetch_or_fallback(ROLE_OPTIONS, role) if role.present?
|
|
167
167
|
|
|
168
168
|
@system_arguments[:id] = id.to_s
|
|
169
169
|
@system_arguments[:classes] = class_names(
|
|
@@ -198,16 +198,12 @@ module Primer
|
|
|
198
198
|
|
|
199
199
|
private
|
|
200
200
|
|
|
201
|
-
def overlay_id
|
|
202
|
-
@system_arguments[:id]
|
|
203
|
-
end
|
|
204
|
-
|
|
205
201
|
def title_id
|
|
206
|
-
"overlay-title-#{
|
|
202
|
+
"overlay-title-#{@id}"
|
|
207
203
|
end
|
|
208
204
|
|
|
209
205
|
def show_button_id
|
|
210
|
-
"overlay-show-#{
|
|
206
|
+
"overlay-show-#{@id}"
|
|
211
207
|
end
|
|
212
208
|
end
|
|
213
209
|
end
|