openproject-primer_view_components 0.29.0 → 0.30.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +32 -0
- data/app/assets/javascripts/app/components/primer/open_project/page_header_element.d.ts +0 -2
- 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 +1 -1
- data/app/assets/styles/primer_view_components.css.map +1 -1
- data/app/components/primer/alpha/action_list/form_wrapper.rb +5 -0
- data/app/components/primer/alpha/button_marketing.rb +2 -0
- data/app/components/primer/alpha/dialog/header.html.erb +3 -0
- data/app/components/primer/alpha/dialog/header.rb +26 -0
- data/app/components/primer/alpha/overlay/header.html.erb +3 -1
- data/app/components/primer/alpha/overlay/header.rb +15 -0
- data/app/components/primer/alpha/tab_nav.css +1 -1
- data/app/components/primer/alpha/tab_nav.css.json +2 -0
- data/app/components/primer/alpha/tab_nav.css.map +1 -1
- data/app/components/primer/alpha/tab_nav.pcss +10 -0
- data/app/components/primer/alpha/tab_panels.html.erb +5 -9
- data/app/components/primer/alpha/tab_panels.rb +4 -13
- data/app/components/primer/alpha/underline_nav.css +1 -1
- data/app/components/primer/alpha/underline_nav.css.json +2 -0
- data/app/components/primer/alpha/underline_nav.css.map +1 -1
- data/app/components/primer/alpha/underline_nav.pcss +7 -1
- data/app/components/primer/alpha/underline_panels.css +1 -0
- data/app/components/primer/alpha/underline_panels.css.json +6 -0
- data/app/components/primer/alpha/underline_panels.css.map +1 -0
- data/app/components/primer/alpha/underline_panels.html.erb +6 -8
- data/app/components/primer/alpha/underline_panels.pcss +4 -0
- data/app/components/primer/alpha/underline_panels.rb +6 -14
- data/app/components/primer/anchored_position.js +2 -0
- data/app/components/primer/anchored_position.ts +2 -0
- data/app/components/primer/beta/button.css +1 -1
- data/app/components/primer/beta/button.css.map +1 -1
- data/app/components/primer/beta/button.html.erb +6 -1
- data/app/components/primer/beta/button.pcss +1 -0
- data/app/components/primer/beta/button.rb +9 -1
- data/app/components/primer/open_project/page_header.css +1 -1
- data/app/components/primer/open_project/page_header.css.json +0 -1
- data/app/components/primer/open_project/page_header.css.map +1 -1
- data/app/components/primer/open_project/page_header.html.erb +2 -0
- data/app/components/primer/open_project/page_header.pcss +0 -10
- data/app/components/primer/open_project/page_header.rb +53 -36
- data/app/components/primer/open_project/page_header_element.d.ts +0 -2
- data/app/components/primer/open_project/page_header_element.js +1 -16
- data/app/components/primer/open_project/page_header_element.ts +1 -16
- data/app/components/primer/open_project/zen_mode_button.html.erb +1 -0
- data/app/components/primer/open_project/zen_mode_button.rb +2 -0
- data/app/components/primer/primer.pcss +1 -0
- data/lib/primer/view_components/version.rb +1 -1
- data/previews/primer/alpha/button_marketing_preview.rb +15 -3
- data/previews/primer/alpha/dialog_preview/with_header_filter.html.erb +19 -0
- data/previews/primer/alpha/dialog_preview.rb +4 -0
- data/previews/primer/alpha/overlay_preview/in_a_sticky_container.html.erb +19 -0
- data/previews/primer/alpha/overlay_preview.rb +15 -0
- data/previews/primer/beta/button_group_preview.rb +3 -7
- data/previews/primer/beta/button_preview/small_scheme_one_character.html.erb +5 -0
- data/previews/primer/beta/button_preview/summary_as_button.html.erb +14 -0
- data/previews/primer/beta/button_preview.rb +42 -12
- data/previews/primer/open_project/page_header_preview.rb +15 -0
- data/static/arguments.json +0 -12
- data/static/classes.json +0 -3
- data/static/constants.json +1 -1
- data/static/info_arch.json +131 -17
- data/static/previews.json +93 -2
- metadata +10 -2
@@ -47,16 +47,6 @@
|
|
47
47
|
align-items: center;
|
48
48
|
}
|
49
49
|
|
50
|
-
.PageHeader--singleAction .PageHeader-action {
|
51
|
-
@media (max-width: 543.98px) {
|
52
|
-
position: absolute;
|
53
|
-
top: 10px;
|
54
|
-
|
55
|
-
/* Normally, the actions are hidden on mobile, except for this special case of a single action */
|
56
|
-
display: flex !important;
|
57
|
-
}
|
58
|
-
}
|
59
|
-
|
60
50
|
.PageHeader-breadcrumbs {
|
61
51
|
display: block;
|
62
52
|
width: 100%;
|
@@ -21,7 +21,7 @@ module Primer
|
|
21
21
|
].freeze
|
22
22
|
|
23
23
|
DEFAULT_ACTION_SCHEME = :default
|
24
|
-
|
24
|
+
MOBILE_ACTIONS_DISPLAY = [:flex, :none].freeze
|
25
25
|
|
26
26
|
DEFAULT_LEADING_ACTION_DISPLAY = [:none, :flex].freeze
|
27
27
|
DEFAULT_BREADCRUMBS_DISPLAY = [:none, :flex].freeze
|
@@ -58,32 +58,37 @@ module Primer
|
|
58
58
|
#
|
59
59
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
60
60
|
renders_many :actions, types: {
|
61
|
-
icon_button: lambda { |icon:, mobile_icon:, label:, scheme: DEFAULT_ACTION_SCHEME, **system_arguments|
|
61
|
+
icon_button: lambda { |icon:, mobile_icon:, label:, scheme: DEFAULT_ACTION_SCHEME, **system_arguments, &block|
|
62
62
|
deny_tag_argument(**system_arguments)
|
63
63
|
|
64
|
-
system_arguments =
|
64
|
+
system_arguments[:icon] = icon
|
65
|
+
system_arguments[:"aria-label"] ||= label
|
66
|
+
system_arguments = set_action_arguments(system_arguments, scheme: scheme)
|
65
67
|
|
66
|
-
|
68
|
+
component = Primer::Beta::IconButton
|
69
|
+
create_mobile_alternatives(component, mobile_icon, label, scheme, **system_arguments, &block)
|
67
70
|
|
68
|
-
|
71
|
+
component.new(**system_arguments)
|
69
72
|
},
|
70
|
-
button: lambda { |mobile_icon:, mobile_label:, scheme: DEFAULT_ACTION_SCHEME, **system_arguments|
|
73
|
+
button: lambda { |mobile_icon:, mobile_label:, scheme: DEFAULT_ACTION_SCHEME, **system_arguments, &block|
|
71
74
|
deny_tag_argument(**system_arguments)
|
72
75
|
|
73
|
-
system_arguments = set_action_arguments(system_arguments, scheme: scheme
|
76
|
+
system_arguments = set_action_arguments(system_arguments, scheme: scheme)
|
74
77
|
|
75
|
-
|
78
|
+
component = Primer::Beta::Button
|
79
|
+
create_mobile_alternatives(component, mobile_icon, mobile_label, scheme, **system_arguments, &block)
|
76
80
|
|
77
|
-
|
81
|
+
component.new(**system_arguments)
|
78
82
|
},
|
79
|
-
zen_mode_button: lambda { |mobile_icon: Primer::OpenProject::ZenModeButton::ZEN_MODE_BUTTON_ICON, mobile_label: Primer::OpenProject::ZenModeButton::ZEN_MODE_BUTTON_LABEL, **system_arguments|
|
83
|
+
zen_mode_button: lambda { |mobile_icon: Primer::OpenProject::ZenModeButton::ZEN_MODE_BUTTON_ICON, mobile_label: Primer::OpenProject::ZenModeButton::ZEN_MODE_BUTTON_LABEL, **system_arguments, &block|
|
80
84
|
deny_tag_argument(**system_arguments)
|
81
85
|
|
82
|
-
system_arguments = set_action_arguments(system_arguments, scheme: DEFAULT_ACTION_SCHEME
|
86
|
+
system_arguments = set_action_arguments(system_arguments, scheme: DEFAULT_ACTION_SCHEME)
|
83
87
|
|
84
|
-
|
88
|
+
component = Primer::OpenProject::ZenModeButton
|
89
|
+
create_mobile_alternatives(component, mobile_icon, mobile_label, DEFAULT_ACTION_SCHEME, **system_arguments, &block)
|
85
90
|
|
86
|
-
|
91
|
+
component.new(**system_arguments)
|
87
92
|
},
|
88
93
|
|
89
94
|
link: lambda { |mobile_icon:, mobile_label:, scheme: DEFAULT_ACTION_SCHEME, **system_arguments|
|
@@ -109,29 +114,31 @@ module Primer
|
|
109
114
|
renders: lambda { |**system_arguments, &block|
|
110
115
|
deny_tag_argument(**system_arguments)
|
111
116
|
|
112
|
-
system_arguments[:menu_arguments] = set_action_arguments(system_arguments[:menu_arguments])
|
113
117
|
system_arguments[:button_arguments] ||= {}
|
114
|
-
system_arguments[:button_arguments][:
|
115
|
-
system_arguments[:button_arguments][:data][:targets] = "page-header.actionItems"
|
118
|
+
system_arguments[:button_arguments] = set_action_arguments(system_arguments[:button_arguments])
|
116
119
|
|
117
120
|
# Add the options individually to the mobile menu in the template
|
118
121
|
@desktop_menu_block = block
|
119
122
|
|
120
|
-
Primer::OpenProject::PageHeader::Menu
|
123
|
+
component = Primer::OpenProject::PageHeader::Menu
|
124
|
+
create_mobile_single_action(component, **system_arguments, &block)
|
125
|
+
|
126
|
+
component.new(**system_arguments)
|
121
127
|
},
|
122
128
|
},
|
123
129
|
dialog: {
|
124
|
-
renders: lambda { |mobile_icon:, mobile_label:, **system_arguments|
|
130
|
+
renders: lambda { |mobile_icon:, mobile_label:, **system_arguments, &block|
|
125
131
|
deny_tag_argument(**system_arguments)
|
126
132
|
|
127
133
|
# The id will be automatically calculated for the trigger button, so we have to behave the same, for the mobile click to work
|
128
134
|
system_arguments[:button_arguments] ||= {}
|
129
135
|
system_arguments[:button_arguments][:id] = "dialog-show-#{system_arguments[:dialog_arguments][:id]}"
|
130
|
-
system_arguments[:button_arguments] = set_action_arguments(system_arguments[:button_arguments]
|
136
|
+
system_arguments[:button_arguments] = set_action_arguments(system_arguments[:button_arguments])
|
131
137
|
|
132
|
-
|
138
|
+
component = Primer::OpenProject::PageHeader::Dialog
|
139
|
+
create_mobile_alternatives(component, mobile_icon, mobile_label, :default, **system_arguments, &block)
|
133
140
|
|
134
|
-
|
141
|
+
component.new(**system_arguments)
|
135
142
|
},
|
136
143
|
},
|
137
144
|
}
|
@@ -212,7 +219,7 @@ module Primer
|
|
212
219
|
)
|
213
220
|
|
214
221
|
@mobile_action_menu = Primer::Alpha::ActionMenu.new(
|
215
|
-
display:
|
222
|
+
display: MOBILE_ACTIONS_DISPLAY,
|
216
223
|
anchor_align: :end
|
217
224
|
)
|
218
225
|
end
|
@@ -224,15 +231,6 @@ module Primer
|
|
224
231
|
title? && breadcrumbs?
|
225
232
|
end
|
226
233
|
|
227
|
-
def before_render
|
228
|
-
@system_arguments[:classes] = class_names(
|
229
|
-
@system_arguments[:classes],
|
230
|
-
"PageHeader--singleAction": !render_mobile_menu?
|
231
|
-
)
|
232
|
-
|
233
|
-
content
|
234
|
-
end
|
235
|
-
|
236
234
|
def render_mobile_menu?
|
237
235
|
actions.count > 1
|
238
236
|
end
|
@@ -242,26 +240,32 @@ module Primer
|
|
242
240
|
def set_action_arguments(system_arguments, scheme: nil, button_action: false)
|
243
241
|
system_arguments[:ml] ||= 2
|
244
242
|
system_arguments[:display] = [:none, :flex]
|
243
|
+
system_arguments[:size] = :medium
|
245
244
|
system_arguments[:scheme] = scheme unless scheme.nil?
|
246
245
|
system_arguments[:classes] = class_names(
|
247
246
|
system_arguments[:classes],
|
248
247
|
"PageHeader-action",
|
249
248
|
)
|
250
|
-
if button_action
|
251
|
-
system_arguments[:data] ||= {}
|
252
|
-
system_arguments[:data][:targets] = "page-header.actionItems"
|
253
|
-
end
|
254
249
|
|
255
250
|
system_arguments[:id] ||= self.class.generate_id
|
256
251
|
system_arguments
|
257
252
|
end
|
258
253
|
|
254
|
+
def create_mobile_alternatives(component, mobile_icon, mobile_label, scheme, **system_arguments, &block)
|
255
|
+
# All actions should collapse into a single actionMenu on mobile
|
256
|
+
add_option_to_mobile_menu(system_arguments, mobile_icon, mobile_label, scheme)
|
257
|
+
|
258
|
+
# Except for single actions, which remain as they are, just smaller.
|
259
|
+
create_mobile_single_action(component, **system_arguments, &block)
|
260
|
+
end
|
261
|
+
|
259
262
|
def add_option_to_mobile_menu(system_arguments, mobile_icon, mobile_label, scheme)
|
260
263
|
unless mobile_icon.nil? || mobile_label.nil?
|
261
264
|
# In action menus, only :default and :danger are allowed
|
262
265
|
scheme = DEFAULT_ACTION_SCHEME unless scheme == :danger
|
263
266
|
|
264
|
-
|
267
|
+
id = system_arguments[:button_arguments].present? ? system_arguments[:button_arguments][:id] : system_arguments[:id]
|
268
|
+
with_menu_item(id: id, label: mobile_label, scheme: scheme) do |c|
|
265
269
|
c.with_leading_visual_icon(icon: mobile_icon)
|
266
270
|
end
|
267
271
|
end
|
@@ -281,6 +285,19 @@ module Primer
|
|
281
285
|
)
|
282
286
|
end
|
283
287
|
|
288
|
+
def create_mobile_single_action(component, **system_arguments, &block)
|
289
|
+
# Single actions shall not collapse into an action menu on mobile, but keep their state.
|
290
|
+
# However the position and size will change
|
291
|
+
unless render_mobile_menu?
|
292
|
+
mobile_options = system_arguments[:button_arguments].present? ?
|
293
|
+
{ button_arguments: { display: MOBILE_ACTIONS_DISPLAY, size: :small } } :
|
294
|
+
{ display: MOBILE_ACTIONS_DISPLAY, size: :small }
|
295
|
+
|
296
|
+
@mobile_action = component.new(**system_arguments.deep_merge(mobile_options))
|
297
|
+
@mobile_action_block = block
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
284
301
|
# transform anchor tag strings to {href, text} objects
|
285
302
|
# e.g "\u003ca href=\"/admin\"\u003eAdministration\u003c/a\u003e"
|
286
303
|
def anchor_string_to_object(html_string)
|
@@ -4,20 +4,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
6
6
|
};
|
7
|
-
import { controller
|
7
|
+
import { controller } from '@github/catalyst';
|
8
8
|
let PageHeaderElement = class PageHeaderElement extends HTMLElement {
|
9
|
-
connectedCallback() {
|
10
|
-
for (const item of this.actionItems) {
|
11
|
-
/*
|
12
|
-
If there is only one action to be shown, we show that instead of the mobile action menu. However, the buttons should be the smaller button variant.
|
13
|
-
Unfortunately, the `size` attribute does not support responsive attributes and the .pcss syntax does not support inheritance between classes.
|
14
|
-
So we have to add the class manually here.
|
15
|
-
*/
|
16
|
-
if (window.innerWidth <= 544) {
|
17
|
-
item.classList.add('Button--small');
|
18
|
-
}
|
19
|
-
}
|
20
|
-
}
|
21
9
|
menuItemClick(event) {
|
22
10
|
const currentTarget = event.currentTarget;
|
23
11
|
const id = currentTarget?.getAttribute('data-for');
|
@@ -26,9 +14,6 @@ let PageHeaderElement = class PageHeaderElement extends HTMLElement {
|
|
26
14
|
}
|
27
15
|
}
|
28
16
|
};
|
29
|
-
__decorate([
|
30
|
-
targets
|
31
|
-
], PageHeaderElement.prototype, "actionItems", void 0);
|
32
17
|
PageHeaderElement = __decorate([
|
33
18
|
controller
|
34
19
|
], PageHeaderElement);
|
@@ -1,22 +1,7 @@
|
|
1
|
-
import {controller
|
1
|
+
import {controller} from '@github/catalyst'
|
2
2
|
|
3
3
|
@controller
|
4
4
|
class PageHeaderElement extends HTMLElement {
|
5
|
-
@targets actionItems: HTMLElement[]
|
6
|
-
|
7
|
-
connectedCallback() {
|
8
|
-
for (const item of this.actionItems) {
|
9
|
-
/*
|
10
|
-
If there is only one action to be shown, we show that instead of the mobile action menu. However, the buttons should be the smaller button variant.
|
11
|
-
Unfortunately, the `size` attribute does not support responsive attributes and the .pcss syntax does not support inheritance between classes.
|
12
|
-
So we have to add the class manually here.
|
13
|
-
*/
|
14
|
-
if (window.innerWidth <= 544) {
|
15
|
-
item.classList.add('Button--small')
|
16
|
-
}
|
17
|
-
}
|
18
|
-
}
|
19
|
-
|
20
5
|
menuItemClick(event: Event) {
|
21
6
|
const currentTarget = event.currentTarget as HTMLButtonElement
|
22
7
|
|
@@ -10,19 +10,31 @@ module Primer
|
|
10
10
|
# @param tag [Symbol] select [button, a]
|
11
11
|
# @param type [Symbol] select [button, submit]
|
12
12
|
# @param disabled [Boolean]
|
13
|
-
def playground(tag: :button, type: :button, scheme: :default, variant: :default, disabled: false)
|
14
|
-
|
13
|
+
def playground(tag: :button, type: :button, scheme: :default, variant: :default, disabled: false, href: nil)
|
14
|
+
# Sets default href to `a`, to ensure it's keyboard interactive and proper markup
|
15
|
+
if tag == :a && href.nil?
|
16
|
+
href = "#"
|
17
|
+
end
|
18
|
+
render(Primer::Alpha::ButtonMarketing.new(tag: tag, type: type, scheme: scheme, variant: variant, disabled: disabled, href: href)) { "Default" }
|
15
19
|
end
|
16
20
|
|
17
21
|
# @label Default options
|
18
22
|
# @param scheme [Symbol] select [default, primary, outline, transparent]
|
19
23
|
# @param variant [Symbol] select [default, large]
|
20
|
-
# @param tag [Symbol] select [button, a]
|
21
24
|
# @param type [Symbol] select [button, submit]
|
22
25
|
def default(tag: :button, type: :button, scheme: :default, variant: :default)
|
23
26
|
render(Primer::Alpha::ButtonMarketing.new(tag: tag, type: type, scheme: scheme, variant: variant)) { "Default" }
|
24
27
|
end
|
25
28
|
|
29
|
+
# @label Link as button options
|
30
|
+
# @param scheme [Symbol] select [default, primary, outline, transparent]
|
31
|
+
# @param variant [Symbol] select [default, large]
|
32
|
+
# @param type [Symbol] select [button, submit]
|
33
|
+
# @param href [String]
|
34
|
+
def link_as_button(tag: :a, href: "#", type: :button, scheme: :default, variant: :default)
|
35
|
+
render(Primer::Alpha::ButtonMarketing.new(tag: tag, href: href, type: type, scheme: scheme, variant: variant)) { "Default" }
|
36
|
+
end
|
37
|
+
|
26
38
|
# @!group Size Variants
|
27
39
|
# @snapshot
|
28
40
|
#
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<%= render(Primer::Alpha::Dialog.new(open: true, title: "Dialog")) do |dialog| %>
|
2
|
+
<% dialog.with_show_button { "Open" } %>
|
3
|
+
<% dialog.with_header do |header| %>
|
4
|
+
<% header.with_filter(pr: 3, pl: 3) do %>
|
5
|
+
<%= render Primer::Alpha::TextField.new(
|
6
|
+
autofocus: true,
|
7
|
+
visually_hide_label: true,
|
8
|
+
name: "filter",
|
9
|
+
label: "Filter dialog",
|
10
|
+
) %>
|
11
|
+
<% end %>
|
12
|
+
<% end %>
|
13
|
+
<% dialog.with_body do %>
|
14
|
+
Body
|
15
|
+
<% end %>
|
16
|
+
<% dialog.with_footer do %>
|
17
|
+
Footer
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<div style="position:sticky;top:0;" class="color-bg-accent">
|
2
|
+
<%= render(Primer::Alpha::Overlay.new(title: "Dialog", role: :dialog, size: :large, padding: :condensed)) do |d| %>
|
3
|
+
<% d.with_header(title: "Large Dialog Header", divider: true) do |header| %>
|
4
|
+
<% header.with_filter do %>
|
5
|
+
<%= render Primer::Alpha::TextField.new(
|
6
|
+
autofocus: true,
|
7
|
+
visually_hide_label:
|
8
|
+
true,
|
9
|
+
name: "filter",
|
10
|
+
label: "Filter Overlay"
|
11
|
+
) %>
|
12
|
+
<% end %>
|
13
|
+
<% end %>
|
14
|
+
<% d.with_show_button { "Show Overlay" } %>
|
15
|
+
<% d.with_footer { "Large Dialog Footer" } %>
|
16
|
+
<% d.with_body { "This is a long body for the overlay dialog. <br>".html_safe * 20 } %>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
19
|
+
<div style="height:3000px;"></div>
|
@@ -183,6 +183,21 @@ module Primer
|
|
183
183
|
def overlay_with_header_filter
|
184
184
|
render_with_template(locals: {})
|
185
185
|
end
|
186
|
+
|
187
|
+
def overlay_with_header_subtitle
|
188
|
+
render(Primer::Alpha::Overlay.new(title: "Dialog", role: :dialog, size: :large, padding: :condensed)) do |d|
|
189
|
+
d.with_header(title: "Large Dialog Header", divider: true) do |h|
|
190
|
+
h.with_subtitle {"A subtitle"}
|
191
|
+
end
|
192
|
+
d.with_show_button { "Show Overlay" }
|
193
|
+
d.with_footer { "Large Dialog Footer" }
|
194
|
+
d.with_body { "This is a long body for the overlay dialog. <br>".html_safe * 20 }
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def in_a_sticky_container
|
199
|
+
render_with_template(locals: {})
|
200
|
+
end
|
186
201
|
end
|
187
202
|
end
|
188
203
|
end
|
@@ -63,22 +63,18 @@ module Primer
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
-
# @label Button group with
|
66
|
+
# @label Button group with multiple tags
|
67
67
|
# @snapshot
|
68
|
-
def
|
68
|
+
def multiple_tags
|
69
69
|
render(Primer::Beta::ButtonGroup.new) do |component|
|
70
70
|
component.with_button(id: "button-1", tag: :button) do |button|
|
71
71
|
button.with_tooltip(text: "Button Tooltip")
|
72
72
|
"Button 1"
|
73
73
|
end
|
74
|
-
component.with_button(id: "button-2", tag: :a) do |button|
|
74
|
+
component.with_button(id: "button-2", tag: :a, href: "#") do |button|
|
75
75
|
button.with_tooltip(text: "Button Tooltip")
|
76
76
|
"Button 2"
|
77
77
|
end
|
78
|
-
component.with_button(id: "button-3", tag: :summary) do |button|
|
79
|
-
button.with_tooltip(text: "Button Tooltip")
|
80
|
-
"Button 3"
|
81
|
-
end
|
82
78
|
end
|
83
79
|
end
|
84
80
|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<details>
|
2
|
+
<%= render(Primer::Beta::Button.new(
|
3
|
+
scheme: scheme,
|
4
|
+
size: size,
|
5
|
+
block: block,
|
6
|
+
id: id,
|
7
|
+
align_content: align_content,
|
8
|
+
tag: tag
|
9
|
+
)) do %>
|
10
|
+
Button
|
11
|
+
<% end %>
|
12
|
+
<p>A wrapping `details` tag is required when using the button with the `:summary` tag</p>
|
13
|
+
</details>
|
14
|
+
|
@@ -20,7 +20,7 @@ module Primer
|
|
20
20
|
# @param disabled toggle
|
21
21
|
# @param inactive toggle
|
22
22
|
# @param align_content select [center, start]
|
23
|
-
# @param tag select [a,
|
23
|
+
# @param tag select [a, button]
|
24
24
|
# @param label_wrap toggle
|
25
25
|
def playground(
|
26
26
|
scheme: :default,
|
@@ -31,8 +31,13 @@ module Primer
|
|
31
31
|
tag: :button,
|
32
32
|
disabled: false,
|
33
33
|
inactive: false,
|
34
|
-
label_wrap: false
|
34
|
+
label_wrap: false,
|
35
|
+
href: nil
|
35
36
|
)
|
37
|
+
# Sets default href to `a`, to ensure it's keyboard interactive and proper markup
|
38
|
+
if tag == :a && href.nil?
|
39
|
+
href = "#"
|
40
|
+
end
|
36
41
|
render(Primer::Beta::Button.new(
|
37
42
|
scheme: scheme,
|
38
43
|
size: size,
|
@@ -42,8 +47,9 @@ module Primer
|
|
42
47
|
tag: tag,
|
43
48
|
disabled: disabled,
|
44
49
|
inactive: inactive,
|
45
|
-
label_wrap: label_wrap
|
46
|
-
|
50
|
+
label_wrap: label_wrap,
|
51
|
+
href: href
|
52
|
+
)) do |_c|
|
47
53
|
"Button"
|
48
54
|
end
|
49
55
|
end
|
@@ -51,7 +57,6 @@ module Primer
|
|
51
57
|
# @label Default
|
52
58
|
# @param block toggle
|
53
59
|
# @param disabled toggle
|
54
|
-
# @param tag select [a, summary, button]
|
55
60
|
def default(
|
56
61
|
block: false,
|
57
62
|
id: "button-preview",
|
@@ -73,7 +78,6 @@ module Primer
|
|
73
78
|
# @label Primary
|
74
79
|
# @param block toggle
|
75
80
|
# @param disabled toggle
|
76
|
-
# @param tag select [a, summary, button]
|
77
81
|
def primary(
|
78
82
|
id: "button-preview",
|
79
83
|
block: false,
|
@@ -95,7 +99,6 @@ module Primer
|
|
95
99
|
# @label Danger
|
96
100
|
# @param block toggle
|
97
101
|
# @param disabled toggle
|
98
|
-
# @param tag select [a, summary, button]
|
99
102
|
def danger(
|
100
103
|
id: "button-preview",
|
101
104
|
block: false,
|
@@ -117,7 +120,6 @@ module Primer
|
|
117
120
|
# @label Invisible
|
118
121
|
# @param block toggle
|
119
122
|
# @param disabled toggle
|
120
|
-
# @param tag select [a, summary, button]
|
121
123
|
def invisible(
|
122
124
|
id: "button-preview",
|
123
125
|
block: false,
|
@@ -145,7 +147,6 @@ module Primer
|
|
145
147
|
# @label Link
|
146
148
|
# @param block toggle
|
147
149
|
# @param disabled toggle
|
148
|
-
# @param tag select [a, summary, button]
|
149
150
|
# @snapshot
|
150
151
|
def link(
|
151
152
|
id: "button-preview",
|
@@ -178,7 +179,6 @@ module Primer
|
|
178
179
|
|
179
180
|
# @label Full width
|
180
181
|
# @param disabled toggle
|
181
|
-
# @param tag select [a, summary, button]
|
182
182
|
# @snapshot
|
183
183
|
def full_width(
|
184
184
|
id: "button-preview",
|
@@ -222,6 +222,7 @@ module Primer
|
|
222
222
|
# @param size select [small, medium]
|
223
223
|
# @param block toggle
|
224
224
|
# @param align_content select [center, start]
|
225
|
+
# @param href
|
225
226
|
# @snapshot
|
226
227
|
def link_as_button(
|
227
228
|
scheme: :default,
|
@@ -245,12 +246,35 @@ module Primer
|
|
245
246
|
end
|
246
247
|
end
|
247
248
|
|
249
|
+
# @label Summary as button
|
250
|
+
# @param scheme select [default, primary, danger, invisible, link]
|
251
|
+
# @param size select [small, medium]
|
252
|
+
# @param block toggle
|
253
|
+
# @param align_content select [center, start]
|
254
|
+
# @snapshot
|
255
|
+
def summary_as_button(
|
256
|
+
scheme: :default,
|
257
|
+
size: :medium,
|
258
|
+
block: false,
|
259
|
+
id: "button-preview",
|
260
|
+
align_content: :center,
|
261
|
+
tag: :summary
|
262
|
+
)
|
263
|
+
render_with_template(locals: {
|
264
|
+
scheme: scheme,
|
265
|
+
size: size,
|
266
|
+
block: block,
|
267
|
+
id: id,
|
268
|
+
align_content: align_content,
|
269
|
+
tag: tag
|
270
|
+
})
|
271
|
+
end
|
272
|
+
|
248
273
|
# @label Trailing visual
|
249
274
|
# @param scheme select [default, primary, danger, invisible, link]
|
250
275
|
# @param size select [small, medium]
|
251
276
|
# @param block toggle
|
252
277
|
# @param align_content select [center, start]
|
253
|
-
# @param tag select [a, summary, button]
|
254
278
|
# @snapshot
|
255
279
|
def trailing_visual(
|
256
280
|
scheme: :default,
|
@@ -258,7 +282,7 @@ module Primer
|
|
258
282
|
block: false,
|
259
283
|
id: "button-preview",
|
260
284
|
align_content: :center,
|
261
|
-
tag: :
|
285
|
+
tag: :button
|
262
286
|
)
|
263
287
|
render_with_template(locals: {
|
264
288
|
scheme: scheme,
|
@@ -390,6 +414,12 @@ module Primer
|
|
390
414
|
def link_scheme_label_wrap
|
391
415
|
render_with_template(locals: {})
|
392
416
|
end
|
417
|
+
|
418
|
+
# @label Small scheme with one character
|
419
|
+
# @snapshot
|
420
|
+
def small_scheme_one_character
|
421
|
+
render_with_template(locals: {})
|
422
|
+
end
|
393
423
|
end
|
394
424
|
end
|
395
425
|
end
|
@@ -120,6 +120,21 @@ module Primer
|
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
123
|
+
|
124
|
+
# @label With a single action
|
125
|
+
# The single action will not be transformed into a menu on mobile, but remains in a smaller variant
|
126
|
+
def single_action
|
127
|
+
render(Primer::OpenProject::PageHeader.new) do |component|
|
128
|
+
component.with_title { "Great news" }
|
129
|
+
component.with_breadcrumbs([{ href: "/foo", text: "Foo" }, { href: "/bar", text: "Bar" }, "Baz"])
|
130
|
+
|
131
|
+
component.with_action_button(mobile_icon: "plus", mobile_label: "Meeting", scheme: :primary) do |button|
|
132
|
+
button.with_leading_visual_icon(icon: "plus")
|
133
|
+
"Meeting"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
123
138
|
# @label With leading action (on wide)
|
124
139
|
# **Leading action** is only shown on **wide screens** by default.
|
125
140
|
# If you want to override that behaviour please use the system_argument: **display**
|
data/static/arguments.json
CHANGED
@@ -2462,18 +2462,6 @@
|
|
2462
2462
|
"default": "N/A",
|
2463
2463
|
"description": "One of `:left` or `:right`. - Defaults to left"
|
2464
2464
|
},
|
2465
|
-
{
|
2466
|
-
"name": "body_arguments",
|
2467
|
-
"type": "Hash",
|
2468
|
-
"default": "`{}`",
|
2469
|
-
"description": "[System arguments](/system-arguments) for the body wrapper."
|
2470
|
-
},
|
2471
|
-
{
|
2472
|
-
"name": "wrapper_arguments",
|
2473
|
-
"type": "Hash",
|
2474
|
-
"default": "`{}`",
|
2475
|
-
"description": "[System arguments](/system-arguments) for the `TabContainer` wrapper."
|
2476
|
-
},
|
2477
2465
|
{
|
2478
2466
|
"name": "system_arguments",
|
2479
2467
|
"type": "Hash",
|