openproject-primer_view_components 0.36.1 → 0.37.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/app/assets/styles/primer_view_components.css +1 -1
  4. data/app/assets/styles/primer_view_components.css.map +1 -1
  5. data/app/components/primer/open_project/border_grid.rb +2 -2
  6. data/app/components/primer/open_project/input_group.html.erb +1 -3
  7. data/app/components/primer/open_project/side_panel/section.css +1 -0
  8. data/app/components/primer/open_project/side_panel/section.css.json +10 -0
  9. data/app/components/primer/open_project/side_panel/section.css.map +1 -0
  10. data/app/components/primer/open_project/side_panel/section.html.erb +29 -0
  11. data/app/components/primer/open_project/side_panel/section.pcss +24 -0
  12. data/app/components/primer/open_project/side_panel/section.rb +65 -0
  13. data/app/components/primer/open_project/side_panel.html.erb +1 -0
  14. data/app/components/primer/open_project/side_panel.rb +48 -0
  15. data/app/components/primer/primer.pcss +1 -0
  16. data/lib/primer/view_components/version.rb +2 -2
  17. data/previews/primer/open_project/side_panel_preview/default.html.erb +40 -0
  18. data/previews/primer/open_project/side_panel_preview/playground.html.erb +25 -0
  19. data/previews/primer/open_project/side_panel_preview/with_component.html.erb +36 -0
  20. data/previews/primer/open_project/side_panel_preview.rb +38 -0
  21. data/static/arguments.json +27 -0
  22. data/static/audited_at.json +2 -0
  23. data/static/classes.json +15 -0
  24. data/static/constants.json +20 -0
  25. data/static/info_arch.json +152 -0
  26. data/static/previews.json +47 -0
  27. data/static/statuses.json +2 -0
  28. metadata +14 -2
@@ -9,8 +9,8 @@ module Primer
9
9
  # Use to render a block inside the grid
10
10
  #
11
11
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
12
- renders_many :rows, lambda { |**system_arguments|
13
- Primer::OpenProject::BorderGrid::Cell.new(**system_arguments)
12
+ renders_many :rows, lambda { |**system_arguments, &block|
13
+ Primer::OpenProject::BorderGrid::Cell.new(**system_arguments, &block)
14
14
  }
15
15
 
16
16
  # @param spacious [Boolean] Whether to add margin to the bottom of the component.
@@ -5,8 +5,6 @@
5
5
  <% end %>
6
6
 
7
7
  <% if caption %>
8
- <%= render(Primer::Beta::Text.new(tag: :div, display: :flex, direction: :column)) do %>
9
- <%= caption %>
10
- <% end %>
8
+ <%= caption %>
11
9
  <% end %>
12
10
  <% end %>
@@ -0,0 +1 @@
1
+ .SidePanel-sectionHeader{align-items:center;display:flex;height:32px;margin-bottom:8px}.SidePanel-sectionCounter{margin-left:8px}.SidePanel-sectionAction{display:flex;flex:1;justify-content:right}.SidePanel-sectionContent,.SidePanel-sectionDescription{line-height:1;margin-bottom:16px}
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "open_project/side_panel/section",
3
+ "selectors": [
4
+ ".SidePanel-sectionHeader",
5
+ ".SidePanel-sectionCounter",
6
+ ".SidePanel-sectionAction",
7
+ ".SidePanel-sectionContent",
8
+ ".SidePanel-sectionDescription"
9
+ ]
10
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["section.pcss"],"names":[],"mappings":"AAEA,yBAEE,kBAAmB,CADnB,YAAa,CAEb,WAAY,CACZ,iBACF,CAEA,0BACE,eACF,CAEA,yBAGE,YAAa,CADb,MAAO,CADP,qBAGF,CAEA,wDAGE,aAAc,CADd,kBAEF","file":"section.css","sourcesContent":["/* CSS for OpenProject::SidePanel::Section */\n\n.SidePanel-sectionHeader {\n display: flex;\n align-items: center;\n height: 32px;\n margin-bottom: 8px;\n}\n\n.SidePanel-sectionCounter {\n margin-left: 8px;\n}\n\n.SidePanel-sectionAction {\n justify-content: right;\n flex: 1;\n display: flex;\n}\n\n.SidePanel-sectionContent,\n.SidePanel-sectionDescription {\n margin-bottom: 16px;\n line-height: 1;\n}\n"]}
@@ -0,0 +1,29 @@
1
+ <%= render Primer::BaseComponent.new(**@system_arguments) do %>
2
+ <div class="SidePanel-sectionHeader">
3
+ <%= title %>
4
+ <% if counter %>
5
+ <div class="SidePanel-sectionCounter">
6
+ <%= counter %>
7
+ </div>
8
+ <% end %>
9
+ <% if action %>
10
+ <div class="SidePanel-sectionAction">
11
+ <%= action %>
12
+ </div>
13
+ <% end %>
14
+ </div>
15
+
16
+ <% if description? %>
17
+ <div class="SidePanel-sectionDescription">
18
+ <%= description %>
19
+ </div>
20
+ <% end %>
21
+
22
+ <div class="SidePanel-sectionContent">
23
+ <%= content %>
24
+ </div>
25
+
26
+ <% if footer? %>
27
+ <%= footer %>
28
+ <% end %>
29
+ <% end %>
@@ -0,0 +1,24 @@
1
+ /* CSS for OpenProject::SidePanel::Section */
2
+
3
+ .SidePanel-sectionHeader {
4
+ display: flex;
5
+ align-items: center;
6
+ height: 32px;
7
+ margin-bottom: 8px;
8
+ }
9
+
10
+ .SidePanel-sectionCounter {
11
+ margin-left: 8px;
12
+ }
13
+
14
+ .SidePanel-sectionAction {
15
+ justify-content: right;
16
+ flex: 1;
17
+ display: flex;
18
+ }
19
+
20
+ .SidePanel-sectionContent,
21
+ .SidePanel-sectionDescription {
22
+ margin-bottom: 16px;
23
+ line-height: 1;
24
+ }
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module OpenProject
5
+ class SidePanel
6
+ # SidePanel::Section is an internal component that deals with individual sections of a sidepanel.
7
+ class Section < Primer::Component
8
+ status :open_project
9
+
10
+ TITLE_TAG_FALLBACK = :h4
11
+ TITLE_TAG_OPTIONS = [:h1, :h2, :h3, TITLE_TAG_FALLBACK, :h5, :h6].freeze
12
+
13
+ renders_one :title, lambda { |tag: TITLE_TAG_FALLBACK, **system_arguments, &block|
14
+ system_arguments[:tag] = fetch_or_fallback(TITLE_TAG_OPTIONS, tag, TITLE_TAG_FALLBACK)
15
+ Primer::BaseComponent.new(**system_arguments, &block)
16
+ }
17
+
18
+ renders_one :counter, Primer::Beta::Counter
19
+
20
+ renders_one :action, types: {
21
+ icon: lambda { |**system_arguments, &block|
22
+ system_arguments[:scheme] ||= :invisible
23
+ Primer::Beta::IconButton.new(**system_arguments, &block)
24
+ }
25
+ }
26
+
27
+ renders_one :description, lambda { |**system_arguments, &block|
28
+ system_arguments[:color] = :subtle
29
+ Primer::Beta::Text.new(**system_arguments, &block)
30
+ }
31
+
32
+ renders_one :footer, types: {
33
+ button: lambda { |**system_arguments, &block|
34
+ defaults = {
35
+ scheme: :link,
36
+ color: :default,
37
+ font_weight: :bold,
38
+ underline: false
39
+ }
40
+ system_arguments.reverse_merge!(defaults)
41
+
42
+ system_arguments[:classes] = class_names(
43
+ "SidePanel-sectionFooter",
44
+ system_arguments[:classes]
45
+ )
46
+
47
+ Primer::Beta::Button.new(**system_arguments, &block)
48
+ }
49
+ }
50
+
51
+ DEFAULT_TAG = :section
52
+ TAG_OPTIONS = [DEFAULT_TAG, :div, :span].freeze
53
+
54
+ def initialize(tag: DEFAULT_TAG, **system_arguments)
55
+ @system_arguments = system_arguments
56
+ @system_arguments[:tag] = fetch_or_fallback(TAG_OPTIONS, tag, DEFAULT_TAG)
57
+ end
58
+
59
+ def render?
60
+ title? && content?
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1 @@
1
+ <%= render(@border_grid) %>
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module OpenProject
5
+ # Add a general description of component here
6
+ # Add additional usage considerations or best practices that may aid the user to use the component correctly.
7
+ # @accessibility Add any accessibility considerations
8
+ class SidePanel < Primer::Component
9
+ status :open_project
10
+
11
+ # @param grid_row_arguments [Hash] Arguments to pass to +Primer::OpenProject::BorderGrid::Cell+ %>
12
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
13
+ # A side panel consists of one or multiple sections
14
+ renders_many :sections, lambda { |component = nil, grid_row_arguments: {}, **system_arguments, &block|
15
+ if component.nil?
16
+ @border_grid.with_row(**grid_row_arguments) do
17
+ render(Primer::OpenProject::SidePanel::Section.new(**system_arguments)) do |section|
18
+ evaluate_block(section, &block)
19
+ end
20
+ end
21
+ elsif component.render?
22
+ @border_grid.with_row(**grid_row_arguments) do
23
+ render(component)
24
+ end
25
+ end
26
+ }
27
+
28
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
29
+ def initialize(**system_arguments)
30
+ @system_arguments = system_arguments
31
+ @system_arguments[:classes] = class_names(
32
+ "SidePanel",
33
+ @system_arguments[:classes]
34
+ )
35
+
36
+ @border_grid = Primer::OpenProject::BorderGrid.new(**@system_arguments)
37
+ end
38
+
39
+ def render?
40
+ sections.present?
41
+ end
42
+
43
+ def before_render
44
+ content
45
+ end
46
+ end
47
+ end
48
+ end
@@ -45,3 +45,4 @@
45
45
  @import "./open_project/border_grid.pcss";
46
46
  @import "./open_project/input_group.pcss";
47
47
  @import "./open_project/sub_header.pcss";
48
+ @import "./open_project/side_panel/section.pcss";
@@ -5,8 +5,8 @@ module Primer
5
5
  module ViewComponents
6
6
  module VERSION
7
7
  MAJOR = 0
8
- MINOR = 36
9
- PATCH = 1
8
+ MINOR = 37
9
+ PATCH = 0
10
10
 
11
11
  STRING = [MAJOR, MINOR, PATCH].join(".")
12
12
  end
@@ -0,0 +1,40 @@
1
+ <%=
2
+ render(Primer::Alpha::Layout.new) do |component|
3
+ component.with_main do
4
+ "Main content"
5
+ end
6
+ component.with_sidebar(row_placement: :start, col_placement: :end) do
7
+ render(Primer::OpenProject::SidePanel.new) do |panel|
8
+ panel.with_section do |section|
9
+ section.with_title { "Attributes" }
10
+ section.with_counter(count: 5)
11
+ section.with_description do
12
+ "Attached files are available to all meeting participants. You can also drag and drop these into agenda item notes."
13
+ end
14
+
15
+ section.with_action_icon(icon: :pencil, 'aria-label': 'Edit')
16
+ section.with_footer_button(tag: :a, href: '#') do |button|
17
+ button.with_leading_visual_icon(icon: :pencil)
18
+ "Additional action"
19
+ end
20
+
21
+ "Section content"
22
+ end
23
+
24
+ panel.with_section do |section|
25
+ section.with_title { "Without counter" }
26
+ section.with_action_icon(icon: :gear, 'aria-label': 'Manage')
27
+
28
+ "Some more content here"
29
+ end
30
+
31
+ panel.with_section do |section|
32
+ section.with_title { "Without action" }
33
+
34
+ "Even more content here"
35
+ end
36
+ end
37
+
38
+ end
39
+ end
40
+ %>
@@ -0,0 +1,25 @@
1
+ <%=
2
+ render(Primer::Alpha::Layout.new) do |component|
3
+ component.with_main do
4
+ "Main content"
5
+ end
6
+
7
+ component.with_sidebar(row_placement: :start, col_placement: :end) do
8
+ render(Primer::OpenProject::SidePanel.new) do |panel|
9
+ panel.with_section do |section|
10
+ section.with_title { "Attributes" }
11
+ section.with_counter(count: counter)
12
+ section.with_description { description } if show_description
13
+
14
+ section.with_action_icon(icon: :pencil, 'aria-label': 'Edit') if show_action
15
+ section.with_footer_button(tag: :a, href: '#') do |button|
16
+ button.with_leading_visual_icon(icon: :pencil)
17
+ "Additional action"
18
+ end if show_footer_action
19
+
20
+ "Section content"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ %>
@@ -0,0 +1,36 @@
1
+ <%=
2
+ clazz = Class.new(ViewComponent::Base) do
3
+ def self.name
4
+ "CustomComponent"
5
+ end
6
+
7
+ def call
8
+ render(Primer::OpenProject::SidePanel::Section.new) do |section|
9
+ section.with_title { "My custom component" }
10
+ section.with_counter(count: 5)
11
+ section.with_description do
12
+ "Some text here"
13
+ end
14
+
15
+ section.with_action_icon(icon: :pencil, 'aria-label': 'Edit')
16
+ section.with_footer_button(tag: :a, href: '#') do |button|
17
+ button.with_leading_visual_icon(icon: :pencil)
18
+ "Additional action"
19
+ end
20
+
21
+ "Section content"
22
+ end
23
+ end
24
+ end
25
+
26
+ render(Primer::Alpha::Layout.new) do |component|
27
+ component.with_main do
28
+ "Main content"
29
+ end
30
+ component.with_sidebar(row_placement: :start, col_placement: :end) do
31
+ render(Primer::OpenProject::SidePanel.new) do |panel|
32
+ panel.with_section(clazz.new)
33
+ end
34
+ end
35
+ end
36
+ %>
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Setup Playground to use all available component props
4
+ # Setup Features to use individual component props and combinations
5
+
6
+ module Primer
7
+ module OpenProject
8
+ # @label SidePanel
9
+ class SidePanelPreview < ViewComponent::Preview
10
+ # @label Playground
11
+ # @param description text
12
+ # @param show_description toggle
13
+ # @param show_action toggle
14
+ # @param show_footer_action toggle
15
+ # @param counter number
16
+ def playground(description: "Some information", counter: 12, show_description: true, show_action: true, show_footer_action: true)
17
+ render_with_template(
18
+ locals: {
19
+ description: description,
20
+ counter: counter,
21
+ show_description: show_description,
22
+ show_action: show_action,
23
+ show_footer_action: show_footer_action
24
+ }
25
+ )
26
+ end
27
+
28
+ # @label Default
29
+ # @snapshot
30
+ def default
31
+ end
32
+
33
+ # @label With custom component
34
+ def with_component
35
+ end
36
+ end
37
+ end
38
+ end
@@ -5053,6 +5053,33 @@
5053
5053
  }
5054
5054
  ]
5055
5055
  },
5056
+ {
5057
+ "component": "OpenProject::SidePanel",
5058
+ "status": "open_project",
5059
+ "a11y_reviewed": false,
5060
+ "short_name": "OpenProjectSidePanel",
5061
+ "source": "https://github.com/primer/view_components/tree/main/app/components/primer/open_project/side_panel.rb",
5062
+ "lookbook": "https://primer.style/view-components/lookbook/inspect/primer/open_project/side_panel/default/",
5063
+ "parameters": [
5064
+ {
5065
+ "name": "system_arguments",
5066
+ "type": "Hash",
5067
+ "default": "N/A",
5068
+ "description": "[System arguments](/system-arguments)"
5069
+ }
5070
+ ]
5071
+ },
5072
+ {
5073
+ "component": "OpenProject::SidePanel::Section",
5074
+ "status": "open_project",
5075
+ "a11y_reviewed": false,
5076
+ "short_name": "OpenProjectSidePanelSection",
5077
+ "source": "https://github.com/primer/view_components/tree/main/app/components/primer/open_project/side_panel/section.rb",
5078
+ "lookbook": "https://primer.style/view-components/lookbook/inspect/primer/open_project/side_panel/section/default/",
5079
+ "parameters": [
5080
+
5081
+ ]
5082
+ },
5056
5083
  {
5057
5084
  "component": "OpenProject::SubHeader",
5058
5085
  "status": "open_project",
@@ -123,6 +123,8 @@
123
123
  "Primer::OpenProject::PageHeader": "",
124
124
  "Primer::OpenProject::PageHeader::Dialog": "",
125
125
  "Primer::OpenProject::PageHeader::Menu": "",
126
+ "Primer::OpenProject::SidePanel": "",
127
+ "Primer::OpenProject::SidePanel::Section": "",
126
128
  "Primer::OpenProject::SubHeader": "",
127
129
  "Primer::OpenProject::ZenModeButton": "",
128
130
  "Primer::Tooltip": "",
data/static/classes.json CHANGED
@@ -534,6 +534,21 @@
534
534
  "SegmentedControl-item": [
535
535
  "Primer::Alpha::SegmentedControl"
536
536
  ],
537
+ "SidePanel-sectionAction": [
538
+ "Primer::OpenProject::SidePanel::Section"
539
+ ],
540
+ "SidePanel-sectionContent": [
541
+ "Primer::OpenProject::SidePanel::Section"
542
+ ],
543
+ "SidePanel-sectionCounter": [
544
+ "Primer::OpenProject::SidePanel::Section"
545
+ ],
546
+ "SidePanel-sectionDescription": [
547
+ "Primer::OpenProject::SidePanel::Section"
548
+ ],
549
+ "SidePanel-sectionHeader": [
550
+ "Primer::OpenProject::SidePanel::Section"
551
+ ],
537
552
  "State": [
538
553
  "Primer::Beta::State"
539
554
  ],
@@ -1480,6 +1480,26 @@
1480
1480
  },
1481
1481
  "Primer::OpenProject::PageHeader::Menu": {
1482
1482
  },
1483
+ "Primer::OpenProject::SidePanel": {
1484
+ "Section": "Primer::OpenProject::SidePanel::Section"
1485
+ },
1486
+ "Primer::OpenProject::SidePanel::Section": {
1487
+ "DEFAULT_TAG": "section",
1488
+ "TAG_OPTIONS": [
1489
+ "section",
1490
+ "div",
1491
+ "span"
1492
+ ],
1493
+ "TITLE_TAG_FALLBACK": "h4",
1494
+ "TITLE_TAG_OPTIONS": [
1495
+ "h1",
1496
+ "h2",
1497
+ "h3",
1498
+ "h4",
1499
+ "h5",
1500
+ "h6"
1501
+ ]
1502
+ },
1483
1503
  "Primer::OpenProject::SubHeader": {
1484
1504
  "HIDDEN_FILTER_TARGET_SELECTOR": "sub-header.hiddenItemsOnExpandedFilter",
1485
1505
  "SHOWN_FILTER_TARGET_SELECTOR": "sub-header.shownItemsOnExpandedFilter"
@@ -17138,6 +17138,158 @@
17138
17138
 
17139
17139
  ]
17140
17140
  },
17141
+ {
17142
+ "fully_qualified_name": "Primer::OpenProject::SidePanel",
17143
+ "description": "Add a general description of component here\nAdd additional usage considerations or best practices that may aid the user to use the component correctly.",
17144
+ "accessibility_docs": "Add any accessibility considerations",
17145
+ "is_form_component": false,
17146
+ "is_published": true,
17147
+ "requires_js": false,
17148
+ "component": "OpenProject::SidePanel",
17149
+ "status": "open_project",
17150
+ "a11y_reviewed": false,
17151
+ "short_name": "OpenProjectSidePanel",
17152
+ "source": "https://github.com/primer/view_components/tree/main/app/components/primer/open_project/side_panel.rb",
17153
+ "lookbook": "https://primer.style/view-components/lookbook/inspect/primer/open_project/side_panel/default/",
17154
+ "parameters": [
17155
+ {
17156
+ "name": "system_arguments",
17157
+ "type": "Hash",
17158
+ "default": "N/A",
17159
+ "description": "{{link_to_system_arguments_docs}}"
17160
+ }
17161
+ ],
17162
+ "slots": [
17163
+ {
17164
+ "name": "sections",
17165
+ "description": "A side panel consists of one or multiple sections",
17166
+ "parameters": [
17167
+ {
17168
+ "name": "grid_row_arguments",
17169
+ "type": "Hash",
17170
+ "default": "N/A",
17171
+ "description": "Arguments to pass to +Primer::OpenProject::BorderGrid::Cell+ %>"
17172
+ },
17173
+ {
17174
+ "name": "system_arguments",
17175
+ "type": "Hash",
17176
+ "default": "N/A",
17177
+ "description": "{{link_to_system_arguments_docs}}"
17178
+ }
17179
+ ]
17180
+ }
17181
+ ],
17182
+ "methods": [
17183
+
17184
+ ],
17185
+ "previews": [
17186
+ {
17187
+ "preview_path": "primer/open_project/side_panel/playground",
17188
+ "name": "playground",
17189
+ "snapshot": "false",
17190
+ "skip_rules": {
17191
+ "wont_fix": [
17192
+ "region"
17193
+ ],
17194
+ "will_fix": [
17195
+ "color-contrast"
17196
+ ]
17197
+ }
17198
+ },
17199
+ {
17200
+ "preview_path": "primer/open_project/side_panel/default",
17201
+ "name": "default",
17202
+ "snapshot": "true",
17203
+ "skip_rules": {
17204
+ "wont_fix": [
17205
+ "region"
17206
+ ],
17207
+ "will_fix": [
17208
+ "color-contrast"
17209
+ ]
17210
+ }
17211
+ },
17212
+ {
17213
+ "preview_path": "primer/open_project/side_panel/with_component",
17214
+ "name": "with_component",
17215
+ "snapshot": "false",
17216
+ "skip_rules": {
17217
+ "wont_fix": [
17218
+ "region"
17219
+ ],
17220
+ "will_fix": [
17221
+ "color-contrast"
17222
+ ]
17223
+ }
17224
+ }
17225
+ ],
17226
+ "subcomponents": [
17227
+
17228
+ ]
17229
+ },
17230
+ {
17231
+ "fully_qualified_name": "Primer::OpenProject::SidePanel::Section",
17232
+ "description": "SidePanel::Section is an internal component that deals with individual sections of a sidepanel.",
17233
+ "accessibility_docs": null,
17234
+ "is_form_component": false,
17235
+ "is_published": true,
17236
+ "requires_js": false,
17237
+ "component": "OpenProject::SidePanel::Section",
17238
+ "status": "open_project",
17239
+ "a11y_reviewed": false,
17240
+ "short_name": "OpenProjectSidePanelSection",
17241
+ "source": "https://github.com/primer/view_components/tree/main/app/components/primer/open_project/side_panel/section.rb",
17242
+ "lookbook": "https://primer.style/view-components/lookbook/inspect/primer/open_project/side_panel/section/default/",
17243
+ "parameters": [
17244
+
17245
+ ],
17246
+ "slots": [
17247
+ {
17248
+ "name": "title",
17249
+ "description": null,
17250
+ "parameters": [
17251
+
17252
+ ]
17253
+ },
17254
+ {
17255
+ "name": "counter",
17256
+ "description": null,
17257
+ "parameters": [
17258
+
17259
+ ]
17260
+ },
17261
+ {
17262
+ "name": "action",
17263
+ "description": null,
17264
+ "parameters": [
17265
+
17266
+ ]
17267
+ },
17268
+ {
17269
+ "name": "description",
17270
+ "description": null,
17271
+ "parameters": [
17272
+
17273
+ ]
17274
+ },
17275
+ {
17276
+ "name": "footer",
17277
+ "description": null,
17278
+ "parameters": [
17279
+
17280
+ ]
17281
+ }
17282
+ ],
17283
+ "methods": [
17284
+
17285
+ ],
17286
+ "previews": [
17287
+
17288
+ ],
17289
+ "subcomponents": [
17290
+
17291
+ ]
17292
+ },
17141
17293
  {
17142
17294
  "fully_qualified_name": "Primer::OpenProject::SubHeader",
17143
17295
  "description": "The SubHeader contains specific actions to modify the page content below, e.g a filter button or a create button\nIt should not be used stand alone, but in combination with a PageHeader, either as a direct sibling or as part of a tab content",