openproject-primer_view_components 0.29.0 → 0.30.0
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 +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",
|