primer_view_components 0.43.5 → 0.44.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.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -0
  3. data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view.d.ts +39 -0
  4. data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_icon_pair_element.d.ts +15 -0
  5. data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_include_fragment_element.d.ts +9 -0
  6. data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_roving_tab_index.d.ts +3 -0
  7. data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_sub_tree_node_element.d.ts +42 -0
  8. data/app/assets/javascripts/components/primer/primer.d.ts +4 -0
  9. data/app/assets/javascripts/components/primer/shared_events.d.ts +15 -0
  10. data/app/assets/javascripts/primer_view_components.js +1 -1
  11. data/app/assets/javascripts/primer_view_components.js.map +1 -1
  12. data/app/assets/styles/primer_view_components.css +1 -1
  13. data/app/assets/styles/primer_view_components.css.map +1 -1
  14. data/app/components/primer/alpha/file_tree_view/directory_node.html.erb +5 -0
  15. data/app/components/primer/alpha/file_tree_view/directory_node.rb +24 -0
  16. data/app/components/primer/alpha/file_tree_view/file_node.html.erb +2 -0
  17. data/app/components/primer/alpha/file_tree_view/file_node.rb +14 -0
  18. data/app/components/primer/alpha/file_tree_view.rb +15 -0
  19. data/app/components/primer/alpha/skeleton_box.css +1 -0
  20. data/app/components/primer/alpha/skeleton_box.css.json +6 -0
  21. data/app/components/primer/alpha/skeleton_box.css.map +1 -0
  22. data/app/components/primer/alpha/skeleton_box.html.erb +1 -0
  23. data/app/components/primer/alpha/skeleton_box.pcss +30 -0
  24. data/app/components/primer/alpha/skeleton_box.rb +29 -0
  25. data/app/components/primer/alpha/tree_view/icon.html.erb +1 -0
  26. data/app/components/primer/alpha/tree_view/icon.rb +22 -0
  27. data/app/components/primer/alpha/tree_view/icon_pair.html.erb +13 -0
  28. data/app/components/primer/alpha/tree_view/icon_pair.rb +42 -0
  29. data/app/components/primer/alpha/tree_view/leading_action.html.erb +3 -0
  30. data/app/components/primer/alpha/tree_view/leading_action.rb +18 -0
  31. data/app/components/primer/alpha/tree_view/leaf_node.html.erb +18 -0
  32. data/app/components/primer/alpha/tree_view/leaf_node.rb +96 -0
  33. data/app/components/primer/alpha/tree_view/loading_failure_message.html.erb +13 -0
  34. data/app/components/primer/alpha/tree_view/loading_failure_message.rb +31 -0
  35. data/app/components/primer/alpha/tree_view/node.html.erb +32 -0
  36. data/app/components/primer/alpha/tree_view/node.rb +194 -0
  37. data/app/components/primer/alpha/tree_view/skeleton_loader.html.erb +23 -0
  38. data/app/components/primer/alpha/tree_view/skeleton_loader.rb +36 -0
  39. data/app/components/primer/alpha/tree_view/spinner_loader.html.erb +20 -0
  40. data/app/components/primer/alpha/tree_view/spinner_loader.rb +33 -0
  41. data/app/components/primer/alpha/tree_view/sub_tree.html.erb +21 -0
  42. data/app/components/primer/alpha/tree_view/sub_tree.rb +113 -0
  43. data/app/components/primer/alpha/tree_view/sub_tree_container.html.erb +3 -0
  44. data/app/components/primer/alpha/tree_view/sub_tree_container.rb +39 -0
  45. data/app/components/primer/alpha/tree_view/sub_tree_node.html.erb +49 -0
  46. data/app/components/primer/alpha/tree_view/sub_tree_node.rb +188 -0
  47. data/app/components/primer/alpha/tree_view/tree_view.d.ts +39 -0
  48. data/app/components/primer/alpha/tree_view/tree_view.js +363 -0
  49. data/app/components/primer/alpha/tree_view/tree_view.ts +396 -0
  50. data/app/components/primer/alpha/tree_view/tree_view_icon_pair_element.d.ts +15 -0
  51. data/app/components/primer/alpha/tree_view/tree_view_icon_pair_element.js +62 -0
  52. data/app/components/primer/alpha/tree_view/tree_view_icon_pair_element.ts +56 -0
  53. data/app/components/primer/alpha/tree_view/tree_view_include_fragment_element.d.ts +9 -0
  54. data/app/components/primer/alpha/tree_view/tree_view_include_fragment_element.js +28 -0
  55. data/app/components/primer/alpha/tree_view/tree_view_include_fragment_element.ts +28 -0
  56. data/app/components/primer/alpha/tree_view/tree_view_roving_tab_index.d.ts +3 -0
  57. data/app/components/primer/alpha/tree_view/tree_view_roving_tab_index.js +130 -0
  58. data/app/components/primer/alpha/tree_view/tree_view_roving_tab_index.ts +161 -0
  59. data/app/components/primer/alpha/tree_view/tree_view_sub_tree_node_element.d.ts +42 -0
  60. data/app/components/primer/alpha/tree_view/tree_view_sub_tree_node_element.js +418 -0
  61. data/app/components/primer/alpha/tree_view/tree_view_sub_tree_node_element.ts +470 -0
  62. data/app/components/primer/alpha/tree_view/visual.html.erb +14 -0
  63. data/app/components/primer/alpha/tree_view/visual.rb +27 -0
  64. data/app/components/primer/alpha/tree_view.css +1 -0
  65. data/app/components/primer/alpha/tree_view.css.json +52 -0
  66. data/app/components/primer/alpha/tree_view.css.map +1 -0
  67. data/app/components/primer/alpha/tree_view.html.erb +12 -0
  68. data/app/components/primer/alpha/tree_view.pcss +373 -0
  69. data/app/components/primer/alpha/tree_view.rb +439 -0
  70. data/app/components/primer/beta/breadcrumbs.css +1 -1
  71. data/app/components/primer/beta/breadcrumbs.css.json +0 -1
  72. data/app/components/primer/beta/breadcrumbs.css.map +1 -1
  73. data/app/components/primer/beta/breadcrumbs.pcss +2 -8
  74. data/app/components/primer/beta/progress_bar.css +1 -1
  75. data/app/components/primer/beta/progress_bar.css.map +1 -1
  76. data/app/components/primer/beta/progress_bar.pcss +3 -2
  77. data/app/components/primer/beta/relative_time.rb +3 -0
  78. data/app/components/primer/beta/spinner.html.erb +1 -1
  79. data/app/components/primer/beta/spinner.rb +2 -0
  80. data/app/components/primer/primer.d.ts +4 -0
  81. data/app/components/primer/primer.js +4 -0
  82. data/app/components/primer/primer.pcss +2 -0
  83. data/app/components/primer/primer.ts +4 -0
  84. data/app/components/primer/shared_events.d.ts +15 -0
  85. data/app/components/primer/shared_events.ts +19 -0
  86. data/app/controllers/primer/view_components/tree_view_items.json +293 -0
  87. data/app/controllers/primer/view_components/tree_view_items_controller.rb +55 -0
  88. data/app/forms/check_box_with_nested_form.rb +10 -10
  89. data/app/forms/radio_button_with_nested_form.rb +16 -16
  90. data/app/views/primer/view_components/tree_view_items/async_alpha.html_fragment.erb +23 -0
  91. data/app/views/primer/view_components/tree_view_items/index.html_fragment.erb +24 -0
  92. data/config/routes.rb +2 -0
  93. data/lib/primer/view_components/version.rb +2 -2
  94. data/previews/primer/alpha/file_tree_view_preview/default.html.erb +16 -0
  95. data/previews/primer/alpha/file_tree_view_preview/playground.html.erb +4 -0
  96. data/previews/primer/alpha/file_tree_view_preview.rb +69 -0
  97. data/previews/primer/alpha/skeleton_box_preview.rb +20 -0
  98. data/previews/primer/alpha/tree_view_preview/async_alpha.html.erb +12 -0
  99. data/previews/primer/alpha/tree_view_preview/buttons.html.erb +10 -0
  100. data/previews/primer/alpha/tree_view_preview/default.html.erb +24 -0
  101. data/previews/primer/alpha/tree_view_preview/empty.html.erb +10 -0
  102. data/previews/primer/alpha/tree_view_preview/form_input.html.erb +14 -0
  103. data/previews/primer/alpha/tree_view_preview/leaf_node_playground.html.erb +15 -0
  104. data/previews/primer/alpha/tree_view_preview/links.html.erb +17 -0
  105. data/previews/primer/alpha/tree_view_preview/loading_failure.html.erb +36 -0
  106. data/previews/primer/alpha/tree_view_preview/loading_skeleton.html.erb +12 -0
  107. data/previews/primer/alpha/tree_view_preview/loading_spinner.html.erb +12 -0
  108. data/previews/primer/alpha/tree_view_preview/playground.html.erb +4 -0
  109. data/previews/primer/alpha/tree_view_preview.rb +208 -0
  110. data/static/arguments.json +456 -0
  111. data/static/audited_at.json +17 -0
  112. data/static/classes.json +15 -0
  113. data/static/constants.json +101 -0
  114. data/static/info_arch.json +1410 -56
  115. data/static/previews.json +232 -0
  116. data/static/statuses.json +17 -0
  117. metadata +89 -8
@@ -0,0 +1,293 @@
1
+ {
2
+ "children": {
3
+ "primer": {
4
+ "children": {
5
+ "alpha": {
6
+ "children": {
7
+ "action_bar": {
8
+ "children": {},
9
+ "files": [
10
+ "divider.rb",
11
+ "item.rb"
12
+ ]
13
+ },
14
+ "action_list": {
15
+ "children": {},
16
+ "files": [
17
+ "divider.rb",
18
+ "form_wrapper.rb",
19
+ "heading.rb",
20
+ "item.rb"
21
+ ]
22
+ },
23
+ "action_menu": {
24
+ "children": {},
25
+ "files": [
26
+ "action_menu_element.ts",
27
+ "group.rb",
28
+ "heading.rb",
29
+ "list.rb",
30
+ "list_wrapper.rb"
31
+ ]
32
+ },
33
+ "auto_complete": {
34
+ "children": {},
35
+ "files": [
36
+ "item.rb"
37
+ ]
38
+ },
39
+ "dialog": {
40
+ "children": {},
41
+ "files": [
42
+ "body.rb",
43
+ "footer.rb",
44
+ "header.rb"
45
+ ]
46
+ },
47
+ "dropdown": {
48
+ "children": {},
49
+ "files": [
50
+ "menu.rb",
51
+ "menu.ts"
52
+ ]
53
+ },
54
+ "file_tree_view": {
55
+ "children": {},
56
+ "files": [
57
+ "directory_item.rb",
58
+ "file_item.rb"
59
+ ]
60
+ },
61
+ "nav_list": {
62
+ "children": {},
63
+ "files": [
64
+ "divider.rb",
65
+ "group.rb",
66
+ "heading.rb",
67
+ "item.rb"
68
+ ]
69
+ },
70
+ "navigation": {
71
+ "children": {},
72
+ "files": [
73
+ "tab.rb"
74
+ ]
75
+ },
76
+ "overlay": {
77
+ "children": {},
78
+ "files": [
79
+ "body.rb",
80
+ "footer.rb",
81
+ "header.rb"
82
+ ]
83
+ },
84
+ "segmented_control": {
85
+ "children": {},
86
+ "files": [
87
+ "item.rb"
88
+ ]
89
+ },
90
+ "tree_view": {
91
+ "children": {},
92
+ "files": [
93
+ "icon.rb",
94
+ "icon_pair.rb",
95
+ "item.rb",
96
+ "leaf_item.rb",
97
+ "spinner_loader.rb",
98
+ "sub_tree.rb",
99
+ "sub_tree_container.rb",
100
+ "sub_tree_item.rb",
101
+ "tree_view_icon_pair_element.ts",
102
+ "tree_view_sub_tree_item_element.ts",
103
+ "visual.rb"
104
+ ]
105
+ }
106
+ },
107
+ "files": [
108
+ "action_bar.pcss",
109
+ "action_bar.rb",
110
+ "action_bar_element.ts",
111
+ "action_list.pcss",
112
+ "action_list.rb",
113
+ "action_list.ts",
114
+ "action_menu.rb",
115
+ "auto_complete.pcss",
116
+ "auto_complete.rb",
117
+ "banner.pcss",
118
+ "banner.rb",
119
+ "button_marketing.pcss",
120
+ "button_marketing.rb",
121
+ "check_box.rb",
122
+ "check_box_group.rb",
123
+ "dialog.pcss",
124
+ "dialog.rb",
125
+ "dropdown.pcss",
126
+ "dropdown.rb",
127
+ "dropdown.ts",
128
+ "file_tree_view.rb",
129
+ "form_button.rb",
130
+ "form_control.rb",
131
+ "hellip_button.rb",
132
+ "hidden_text_expander.rb",
133
+ "image.rb",
134
+ "layout.pcss",
135
+ "layout.rb",
136
+ "menu.pcss",
137
+ "menu.rb",
138
+ "modal_dialog.ts",
139
+ "multi_input.rb",
140
+ "nav_list.rb",
141
+ "octicon_symbols.rb",
142
+ "overlay.pcss",
143
+ "overlay.rb",
144
+ "radio_button.rb",
145
+ "radio_button_group.rb",
146
+ "segmented_control.pcss",
147
+ "segmented_control.rb",
148
+ "segmented_control.ts",
149
+ "select.rb",
150
+ "select_panel.pcss",
151
+ "select_panel.rb",
152
+ "select_panel_element.ts",
153
+ "stack.pcss",
154
+ "stack.rb",
155
+ "stack_item.pcss",
156
+ "stack_item.rb",
157
+ "submit_button.rb",
158
+ "tab_container.rb",
159
+ "tab_container.ts",
160
+ "tab_nav.pcss",
161
+ "tab_nav.rb",
162
+ "tab_panels.rb",
163
+ "text_area.rb",
164
+ "text_field.pcss",
165
+ "text_field.rb",
166
+ "toggle_switch.pcss",
167
+ "toggle_switch.rb",
168
+ "toggle_switch.ts",
169
+ "tool_tip.ts",
170
+ "tooltip.rb",
171
+ "tree_view.pcss",
172
+ "tree_view.rb",
173
+ "underline_nav.pcss",
174
+ "underline_nav.rb",
175
+ "underline_panels.rb",
176
+ "x_banner.ts"
177
+ ]
178
+ },
179
+ "beta": {
180
+ "children": {
181
+ "auto_complete": {
182
+ "children": {},
183
+ "files": [
184
+ "auto_complete.ts",
185
+ "item.rb",
186
+ "no_result_item.rb"
187
+ ]
188
+ },
189
+ "border_box": {
190
+ "children": {},
191
+ "files": [
192
+ "header.rb"
193
+ ]
194
+ },
195
+ "nav_list": {
196
+ "children": {},
197
+ "files": [
198
+ "divider.rb",
199
+ "group.rb",
200
+ "heading.rb",
201
+ "item.rb"
202
+ ]
203
+ }
204
+ },
205
+ "files": [
206
+ "auto_complete.rb",
207
+ "avatar.pcss",
208
+ "avatar.rb",
209
+ "avatar_stack.pcss",
210
+ "avatar_stack.rb",
211
+ "base_button.rb",
212
+ "blankslate.pcss",
213
+ "blankslate.rb",
214
+ "border_box.pcss",
215
+ "border_box.rb",
216
+ "breadcrumbs.pcss",
217
+ "breadcrumbs.rb",
218
+ "button.pcss",
219
+ "button.rb",
220
+ "button_group.pcss",
221
+ "button_group.rb",
222
+ "clipboard_copy.rb",
223
+ "clipboard_copy.ts",
224
+ "clipboard_copy_button.rb",
225
+ "close_button.rb",
226
+ "counter.pcss",
227
+ "counter.rb",
228
+ "details.rb",
229
+ "details_toggle_element.ts",
230
+ "flash.pcss",
231
+ "flash.rb",
232
+ "heading.rb",
233
+ "icon_button.rb",
234
+ "label.pcss",
235
+ "label.rb",
236
+ "link.pcss",
237
+ "link.rb",
238
+ "markdown.rb",
239
+ "nav_list.rb",
240
+ "nav_list.ts",
241
+ "nav_list_group_element.ts",
242
+ "octicon.rb",
243
+ "popover.pcss",
244
+ "popover.rb",
245
+ "progress_bar.pcss",
246
+ "progress_bar.rb",
247
+ "relative_time.rb",
248
+ "relative_time.ts",
249
+ "spinner.rb",
250
+ "state.pcss",
251
+ "state.rb",
252
+ "subhead.pcss",
253
+ "subhead.rb",
254
+ "text.rb",
255
+ "timeline_item.pcss",
256
+ "timeline_item.rb",
257
+ "truncate.pcss",
258
+ "truncate.rb"
259
+ ]
260
+ },
261
+ "navigation": {
262
+ "children": {},
263
+ "files": [
264
+ "tab_component.rb"
265
+ ]
266
+ }
267
+ },
268
+ "files": [
269
+ "anchored_position.ts",
270
+ "base_component.rb",
271
+ "blankslate_component.rb",
272
+ "box.rb",
273
+ "button_component.rb",
274
+ "component.rb",
275
+ "conditional_wrapper.rb",
276
+ "content.rb",
277
+ "dialog_helper.ts",
278
+ "focus_group.ts",
279
+ "icon_button.rb",
280
+ "layout_component.rb",
281
+ "primer.pcss",
282
+ "primer.ts",
283
+ "responsive_arg.rb",
284
+ "scrollable_region.ts",
285
+ "shared_events.ts",
286
+ "tooltip.rb",
287
+ "truncate.pcss",
288
+ "truncate.rb",
289
+ "utils.ts"
290
+ ]
291
+ }
292
+ }
293
+ }
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+
6
+ module Primer
7
+ module ViewComponents
8
+ # :nodoc:
9
+ # :nocov:
10
+ class TreeViewItemsController < ApplicationController
11
+ TREE = JSON.parse(File.read(File.join(__dir__, "tree_view_items.json"))).freeze
12
+
13
+ def index
14
+ # delay a bit so loading spinners, etc can be seen
15
+ sleep 1
16
+
17
+ if params[:fail] == "true"
18
+ head :internal_server_error and return
19
+ end
20
+
21
+ path = JSON.parse(params[:path])
22
+ node = path.inject(TREE) do |current, segment|
23
+ current["children"][segment]
24
+ end
25
+
26
+ entries = (
27
+ node["children"].keys.map { |label| [label, :directory] } +
28
+ node["files"].map { |label| [label, :file] }
29
+ )
30
+
31
+ entries.sort_by!(&:first)
32
+
33
+ render(
34
+ locals: {
35
+ entries: entries,
36
+ path: path,
37
+ loader: (params[:loader] || :spinner).to_sym,
38
+ select_variant: (params[:select_variant] || :none).to_sym
39
+ }
40
+ )
41
+ end
42
+
43
+ def async_alpha
44
+ # delay a bit so loading spinners, etc can be seen
45
+ sleep 1
46
+
47
+ render(
48
+ locals: {
49
+ action_menu_expanded: params[:action_menu_expanded] == "true"
50
+ }
51
+ )
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # :nodoc:
4
- class CustomCitiesForm < ApplicationForm
5
- form do |custom_cities_form|
6
- custom_cities_form.text_field(
7
- name: :custom_cities,
8
- label: "Custom cities",
9
- description: "A space-separated list of cities"
10
- )
4
+ class CheckBoxWithNestedForm < ApplicationForm
5
+ # :nodoc:
6
+ class CustomCitiesForm < ApplicationForm
7
+ form do |custom_cities_form|
8
+ custom_cities_form.text_field(
9
+ name: :custom_cities,
10
+ label: "Custom cities",
11
+ description: "A space-separated list of cities"
12
+ )
13
+ end
11
14
  end
12
- end
13
15
 
14
- # :nodoc:
15
- class CheckBoxWithNestedForm < ApplicationForm
16
16
  form do |check_form|
17
17
  check_form.check_box_group(name: :city_categories) do |check_group|
18
18
  check_group.check_box(
@@ -1,27 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # :nodoc:
4
- class FriendForm < ApplicationForm
5
- form do |friend_form|
6
- friend_form.group(layout: :horizontal) do |name_group|
7
- name_group.text_field(name: "first_name", label: "First Name")
8
- name_group.text_field(name: "last_name", label: "Last Name")
4
+ class RadioButtonWithNestedForm < ApplicationForm
5
+ # :nodoc:
6
+ class FriendForm < ApplicationForm
7
+ form do |friend_form|
8
+ friend_form.group(layout: :horizontal) do |name_group|
9
+ name_group.text_field(name: "first_name", label: "First Name")
10
+ name_group.text_field(name: "last_name", label: "Last Name")
11
+ end
9
12
  end
10
13
  end
11
- end
12
14
 
13
- # :nodoc:
14
- class FriendTextAreaForm < ApplicationForm
15
- form do |friend_text_area_form|
16
- friend_text_area_form.text_area(
17
- name: "description",
18
- label: "Describe this wonderful person in loving detail"
19
- )
15
+ # :nodoc:
16
+ class FriendTextAreaForm < ApplicationForm
17
+ form do |friend_text_area_form|
18
+ friend_text_area_form.text_area(
19
+ name: "description",
20
+ label: "Describe this wonderful person in loving detail"
21
+ )
22
+ end
20
23
  end
21
- end
22
24
 
23
- # :nodoc:
24
- class RadioButtonWithNestedForm < ApplicationForm
25
25
  form do |radio_form|
26
26
  radio_form.radio_button_group(name: "channel") do |radio_group|
27
27
  radio_group.radio_button(value: "online", label: "Online advertisement", caption: "Facebook maybe?")
@@ -0,0 +1,23 @@
1
+ <%= render(Primer::Alpha::TreeView::SubTree.new(path: ["primer"], node_variant: :div)) do |tree| %>
2
+ <% tree.with_sub_tree(label: "alpha") do |sub_tree| %>
3
+ <% sub_tree.with_leading_visual_icons do |icons| %>
4
+ <% icons.with_expanded_icon(icon: :"file-directory-open-fill", color: :accent) %>
5
+ <% icons.with_collapsed_icon(icon: :"file-directory-fill", color: :accent) %>
6
+ <% end %>
7
+
8
+ <% sub_tree.with_sub_tree(label: "action_menu", expanded: action_menu_expanded) do |sub_tree| %>
9
+ <% sub_tree.with_leading_visual_icons do |icons| %>
10
+ <% icons.with_expanded_icon(icon: :"file-directory-open-fill", color: :accent) %>
11
+ <% icons.with_collapsed_icon(icon: :"file-directory-fill", color: :accent) %>
12
+ <% end %>
13
+
14
+ <% sub_tree.with_leaf(label: "group.rb") do |item| %>
15
+ <% item.with_leading_visual_icon(icon: :file) %>
16
+ <% end %>
17
+
18
+ <% sub_tree.with_leaf(label: "heading.rb") do |item| %>
19
+ <% item.with_leading_visual_icon(icon: :file) %>
20
+ <% end %>
21
+ <% end %>
22
+ <% end %>
23
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <%= render(Primer::Alpha::TreeView::SubTree.new(path: path, select_variant: select_variant, node_variant: :div)) do |tree| %>
2
+ <% next if params[:empty] == "true" %>
3
+ <% entries.each do |label, type| %>
4
+ <% case type %>
5
+ <% when :directory %>
6
+ <% tree.with_sub_tree(label: label, select_variant: select_variant) do |sub_tree| %>
7
+ <% sub_tree.with_leading_visual_icons do |icons| %>
8
+ <% icons.with_expanded_icon(icon: :"file-directory-open-fill", color: :accent) %>
9
+ <% icons.with_collapsed_icon(icon: :"file-directory-fill", color: :accent) %>
10
+ <% end %>
11
+
12
+ <% if loader == :skeleton %>
13
+ <% sub_tree.with_loading_skeleton(src: primer_view_components.tree_view_items_path(loader: "skeleton", select_variant: select_variant)) %>
14
+ <% else %>
15
+ <% sub_tree.with_loading_spinner(src: primer_view_components.tree_view_items_path(loader: "spinner", select_variant: select_variant)) %>
16
+ <% end %>
17
+ <% end %>
18
+ <% when :file %>
19
+ <% tree.with_leaf(label: label, select_variant: select_variant) do |item| %>
20
+ <% item.with_leading_visual_icon(icon: :file) %>
21
+ <% end %>
22
+ <% end %>
23
+ <% end %>
24
+ <% end %>
data/config/routes.rb CHANGED
@@ -8,7 +8,9 @@ Primer::ViewComponents::Engine.routes.draw do
8
8
  resources :nav_list_items, only: [:index]
9
9
  resources :multi, only: [:create]
10
10
  resources :select_panel_items, only: [:index]
11
+
11
12
  resources :tree_view_items, only: [:index]
13
+ get "/tree_view_items/async_alpha", to: "tree_view_items#async_alpha", as: :tree_view_items_async_alpha
12
14
 
13
15
  # generic form submission path
14
16
  post "/form_handler", to: "form_handler#form_action", as: :generic_form_submission
@@ -5,8 +5,8 @@ module Primer
5
5
  module ViewComponents
6
6
  module VERSION
7
7
  MAJOR = 0
8
- MINOR = 43
9
- PATCH = 5
8
+ MINOR = 44
9
+ PATCH = 0
10
10
 
11
11
  STRING = [MAJOR, MINOR, PATCH].join(".")
12
12
  end
@@ -0,0 +1,16 @@
1
+ <div style="max-width: 400px">
2
+ <%= render(Primer::Alpha::FileTreeView.new) do |tree_view| %>
3
+ <% tree_view.with_directory(label: "src", expanded: expanded, select_variant: select_variant) do |dir| %>
4
+ <% dir.with_trailing_visual_icon(icon: :"diff-modified") %>
5
+
6
+ <% dir.with_file(label: "button.rb", select_variant: select_variant) %>
7
+ <% dir.with_file(label: "icon_button.rb", current: true, select_variant: select_variant) %>
8
+
9
+ <% dir.with_directory(label: "tree_view", select_variant: select_variant) do |subdir| %>
10
+ <% subdir.with_file(label: "sub_tree.rb", select_variant: select_variant) %>
11
+ <% end %>
12
+ <% end %>
13
+
14
+ <% tree_view.with_file(label: "action_menu.rb", select_variant: select_variant) %>
15
+ <% end %>
16
+ </div>
@@ -0,0 +1,4 @@
1
+ <% data = Primer::ViewComponents::TreeViewItemsController::TREE %>
2
+ <%= render(Primer::Alpha::FileTreeView.new) do |tree| %>
3
+ <% populate.call(tree, data, { select_variant: select_variant, expanded: expanded }) %>
4
+ <% end %>
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Alpha
5
+ # @label FileTreeView
6
+ class FileTreeViewPreview < ViewComponent::Preview
7
+ # @label Default
8
+ #
9
+ # @snapshot interactive
10
+ # @param expanded [Boolean] toggle
11
+ # @param select_variant [Symbol] select [multiple, none]
12
+ def default(expanded: false, select_variant: :none)
13
+ render_with_template(locals: {
14
+ expanded: coerce_bool(expanded),
15
+ select_variant: select_variant.to_sym
16
+ })
17
+ end
18
+
19
+ # @label Playground
20
+ #
21
+ # @param expanded [Boolean] toggle
22
+ # @param select_variant [Symbol] select [multiple, none]
23
+ def playground(expanded: false, select_variant: :none)
24
+ render_with_template(locals: {
25
+ expanded: coerce_bool(expanded),
26
+ select_variant: select_variant.to_sym,
27
+ populate: -> (*args) { populate(*args) }
28
+ })
29
+ end
30
+
31
+ private
32
+
33
+ def coerce_bool(value)
34
+ case value
35
+ when true, false
36
+ value
37
+ when "true"
38
+ true
39
+ when "false"
40
+ false
41
+ else
42
+ false
43
+ end
44
+ end
45
+
46
+ def populate(node, data, node_arguments)
47
+ return unless data
48
+
49
+ entries = (
50
+ data.fetch("children", {}).keys.map { |label, idx| [label, :directory] } +
51
+ data.fetch("files", []).map { |label| [label, :file] }
52
+ )
53
+
54
+ entries.sort_by!(&:first)
55
+
56
+ entries.each do |label, kind, idx|
57
+ case kind
58
+ when :directory
59
+ node.with_directory(label: label, **node_arguments) do |sub_tree|
60
+ populate(sub_tree, data["children"][label], node_arguments)
61
+ end
62
+ when :file
63
+ node.with_file(label: label, **node_arguments)
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Alpha
5
+ # @label SkeletonBox
6
+ class SkeletonBoxPreview < ViewComponent::Preview
7
+ # @label Default
8
+ def default
9
+ render(Primer::Alpha::SkeletonBox.new(width: "64px", height: "64px"))
10
+ end
11
+
12
+ # @label Playground
13
+ # @param width text
14
+ # @param height text
15
+ def playground(width: "64px", height: "64px")
16
+ render(Primer::Alpha::SkeletonBox.new(width: width, height: height))
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ <div style="max-width: 400px">
2
+ <%= render(Primer::Alpha::TreeView.new) do |tree_view| %>
3
+ <% tree_view.with_sub_tree(label: "primer") do |sub_tree| %>
4
+ <% sub_tree.with_leading_visual_icons do |icons| %>
5
+ <% icons.with_expanded_icon(icon: :"file-directory-open-fill", color: :accent) %>
6
+ <% icons.with_collapsed_icon(icon: :"file-directory-fill", color: :accent) %>
7
+ <% end %>
8
+
9
+ <% sub_tree.with_loading_skeleton(src: primer_view_components.tree_view_items_async_alpha_path(action_menu_expanded: action_menu_expanded)) %>
10
+ <% end %>
11
+ <% end %>
12
+ </div>
@@ -0,0 +1,10 @@
1
+ <div style="max-width: 400px">
2
+ <%= render(Primer::Alpha::TreeView.new(node_variant: :button)) do |tree_view| %>
3
+ <% tree_view.with_sub_tree(label: "Secrets", expanded: expanded, onclick: "alert('Shhhh')", disabled: disabled) do |sub_tree| %>
4
+ <% sub_tree.with_leaf(label: "Life and the universe", onclick: "alert(42)", disabled: disabled) %>
5
+ <% sub_tree.with_leaf(label: "Secret ingredient", onclick: "alert('Love')", disabled: disabled) %>
6
+ <% end %>
7
+
8
+ <% tree_view.with_leaf(label: "What do you give a sick bird?", onclick: "alert('Tweetment')", disabled: disabled) %>
9
+ <% end %>
10
+ </div>
@@ -0,0 +1,24 @@
1
+ <div style="max-width: 400px">
2
+ <%= render(Primer::Alpha::TreeView.new) do |tree_view| %>
3
+ <% tree_view.with_sub_tree(label: "src", expanded: expanded, disabled: disabled, select_variant: select_variant, select_strategy: select_strategy) do |sub_tree| %>
4
+ <% sub_tree.with_leading_visual_icons(label: "Foobar") do |icons| %>
5
+ <% icons.with_expanded_icon(icon: :"file-directory-open-fill", color: :accent) %>
6
+ <% icons.with_collapsed_icon(icon: :"file-directory-fill", color: :accent) %>
7
+ <% end %>
8
+
9
+ <% sub_tree.with_trailing_visual_icon(icon: :"diff-modified") %>
10
+
11
+ <% sub_tree.with_leaf(label: "button.rb", disabled: disabled, select_variant: select_variant) do |item| %>
12
+ <% item.with_leading_visual_icon(icon: :file) %>
13
+ <% end %>
14
+
15
+ <% sub_tree.with_leaf(label: "icon_button.rb", current: true, disabled: disabled, select_variant: select_variant) do |item| %>
16
+ <% item.with_leading_visual_icon(icon: :file) %>
17
+ <% end %>
18
+ <% end %>
19
+
20
+ <% tree_view.with_leaf(label: "action_menu.rb", disabled: disabled, select_variant: select_variant) do |item| %>
21
+ <% item.with_leading_visual_icon(icon: :file) %>
22
+ <% end %>
23
+ <% end %>
24
+ </div>
@@ -0,0 +1,10 @@
1
+ <div style="max-width: 400px">
2
+ <%= render(Primer::Alpha::TreeView.new) do |tree_view| %>
3
+ <% tree_view.with_sub_tree(label: "src") do |sub_tree| %>
4
+ <% sub_tree.with_leading_visual_icons do |icons| %>
5
+ <% icons.with_expanded_icon(icon: :"file-directory-open-fill", color: :accent) %>
6
+ <% icons.with_collapsed_icon(icon: :"file-directory-fill", color: :accent) %>
7
+ <% end %>
8
+ <% end %>
9
+ <% end %>
10
+ </div>