openproject-primer_view_components 0.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +2931 -0
- data/LICENSE.txt +21 -0
- data/README.md +17 -0
- data/app/assets/javascripts/app/components/primer/alpha/action_bar_element.d.ts +16 -0
- data/app/assets/javascripts/app/components/primer/alpha/action_menu/action_menu_element.d.ts +31 -0
- data/app/assets/javascripts/app/components/primer/alpha/dropdown/menu.d.ts +1 -0
- data/app/assets/javascripts/app/components/primer/alpha/dropdown.d.ts +1 -0
- data/app/assets/javascripts/app/components/primer/alpha/image_crop.d.ts +1 -0
- data/app/assets/javascripts/app/components/primer/alpha/modal_dialog.d.ts +18 -0
- data/app/assets/javascripts/app/components/primer/alpha/nav_list.d.ts +28 -0
- data/app/assets/javascripts/app/components/primer/alpha/segmented_control.d.ts +12 -0
- data/app/assets/javascripts/app/components/primer/alpha/tab_container.d.ts +1 -0
- data/app/assets/javascripts/app/components/primer/alpha/toggle_switch.d.ts +30 -0
- data/app/assets/javascripts/app/components/primer/alpha/tool_tip.d.ts +26 -0
- data/app/assets/javascripts/app/components/primer/alpha/x_banner.d.ts +13 -0
- data/app/assets/javascripts/app/components/primer/anchored_position.d.ts +27 -0
- data/app/assets/javascripts/app/components/primer/beta/auto_complete/auto_complete.d.ts +1 -0
- data/app/assets/javascripts/app/components/primer/beta/clipboard_copy.d.ts +1 -0
- data/app/assets/javascripts/app/components/primer/beta/relative_time.d.ts +1 -0
- data/app/assets/javascripts/app/components/primer/focus_group.d.ts +19 -0
- data/app/assets/javascripts/app/components/primer/primer.d.ts +21 -0
- data/app/assets/javascripts/lib/primer/forms/primer_multi_input.d.ts +10 -0
- data/app/assets/javascripts/lib/primer/forms/primer_text_field.d.ts +1 -0
- data/app/assets/javascripts/lib/primer/forms/toggle_switch_input.d.ts +5 -0
- data/app/assets/javascripts/primer_view_components.js +2 -0
- data/app/assets/javascripts/primer_view_components.js.map +1 -0
- data/app/assets/styles/primer_view_components.css +1 -0
- data/app/assets/styles/primer_view_components.css.map +1 -0
- data/app/components/primer/alpha/action_bar/divider.rb +30 -0
- data/app/components/primer/alpha/action_bar/item.rb +26 -0
- data/app/components/primer/alpha/action_bar.css +1 -0
- data/app/components/primer/alpha/action_bar.css.json +17 -0
- data/app/components/primer/alpha/action_bar.css.map +1 -0
- data/app/components/primer/alpha/action_bar.html.erb +12 -0
- data/app/components/primer/alpha/action_bar.pcss +69 -0
- data/app/components/primer/alpha/action_bar.rb +109 -0
- data/app/components/primer/alpha/action_bar_element.d.ts +16 -0
- data/app/components/primer/alpha/action_bar_element.js +172 -0
- data/app/components/primer/alpha/action_bar_element.ts +175 -0
- data/app/components/primer/alpha/action_list/divider.rb +35 -0
- data/app/components/primer/alpha/action_list/form_wrapper.html.erb +10 -0
- data/app/components/primer/alpha/action_list/form_wrapper.rb +61 -0
- data/app/components/primer/alpha/action_list/heading.html.erb +8 -0
- data/app/components/primer/alpha/action_list/heading.rb +50 -0
- data/app/components/primer/alpha/action_list/item.html.erb +53 -0
- data/app/components/primer/alpha/action_list/item.rb +301 -0
- data/app/components/primer/alpha/action_list.css +1 -0
- data/app/components/primer/alpha/action_list.css.json +134 -0
- data/app/components/primer/alpha/action_list.css.map +1 -0
- data/app/components/primer/alpha/action_list.html.erb +20 -0
- data/app/components/primer/alpha/action_list.pcss +697 -0
- data/app/components/primer/alpha/action_list.rb +256 -0
- data/app/components/primer/alpha/action_menu/action_menu_element.d.ts +31 -0
- data/app/components/primer/alpha/action_menu/action_menu_element.js +241 -0
- data/app/components/primer/alpha/action_menu/action_menu_element.ts +252 -0
- data/app/components/primer/alpha/action_menu/list.rb +123 -0
- data/app/components/primer/alpha/action_menu.html.erb +26 -0
- data/app/components/primer/alpha/action_menu.rb +411 -0
- data/app/components/primer/alpha/auto_complete/auto_complete.html.erb +24 -0
- data/app/components/primer/alpha/auto_complete/item.rb +46 -0
- data/app/components/primer/alpha/auto_complete.css +1 -0
- data/app/components/primer/alpha/auto_complete.css.json +23 -0
- data/app/components/primer/alpha/auto_complete.css.map +1 -0
- data/app/components/primer/alpha/auto_complete.pcss +118 -0
- data/app/components/primer/alpha/auto_complete.rb +158 -0
- data/app/components/primer/alpha/banner.css +1 -0
- data/app/components/primer/alpha/banner.css.json +24 -0
- data/app/components/primer/alpha/banner.css.map +1 -0
- data/app/components/primer/alpha/banner.html.erb +33 -0
- data/app/components/primer/alpha/banner.pcss +126 -0
- data/app/components/primer/alpha/banner.rb +141 -0
- data/app/components/primer/alpha/button_marketing.css +1 -0
- data/app/components/primer/alpha/button_marketing.css.json +33 -0
- data/app/components/primer/alpha/button_marketing.css.map +1 -0
- data/app/components/primer/alpha/button_marketing.pcss +168 -0
- data/app/components/primer/alpha/button_marketing.rb +73 -0
- data/app/components/primer/alpha/check_box.rb +74 -0
- data/app/components/primer/alpha/check_box_group.rb +36 -0
- data/app/components/primer/alpha/dialog/body.rb +28 -0
- data/app/components/primer/alpha/dialog/footer.rb +34 -0
- data/app/components/primer/alpha/dialog/header.html.erb +17 -0
- data/app/components/primer/alpha/dialog/header.rb +40 -0
- data/app/components/primer/alpha/dialog.css +1 -0
- data/app/components/primer/alpha/dialog.css.json +80 -0
- data/app/components/primer/alpha/dialog.css.map +1 -0
- data/app/components/primer/alpha/dialog.html.erb +12 -0
- data/app/components/primer/alpha/dialog.pcss +482 -0
- data/app/components/primer/alpha/dialog.rb +176 -0
- data/app/components/primer/alpha/dropdown/menu.d.ts +1 -0
- data/app/components/primer/alpha/dropdown/menu.html.erb +25 -0
- data/app/components/primer/alpha/dropdown/menu.js +1 -0
- data/app/components/primer/alpha/dropdown/menu.rb +107 -0
- data/app/components/primer/alpha/dropdown/menu.ts +1 -0
- data/app/components/primer/alpha/dropdown.css +1 -0
- data/app/components/primer/alpha/dropdown.css.json +40 -0
- data/app/components/primer/alpha/dropdown.css.map +1 -0
- data/app/components/primer/alpha/dropdown.d.ts +1 -0
- data/app/components/primer/alpha/dropdown.html.erb +9 -0
- data/app/components/primer/alpha/dropdown.js +1 -0
- data/app/components/primer/alpha/dropdown.pcss +261 -0
- data/app/components/primer/alpha/dropdown.rb +154 -0
- data/app/components/primer/alpha/dropdown.ts +1 -0
- data/app/components/primer/alpha/form_button.rb +32 -0
- data/app/components/primer/alpha/form_control.html.erb +26 -0
- data/app/components/primer/alpha/form_control.rb +105 -0
- data/app/components/primer/alpha/hellip_button.rb +43 -0
- data/app/components/primer/alpha/hidden_text_expander.rb +57 -0
- data/app/components/primer/alpha/image.rb +50 -0
- data/app/components/primer/alpha/image_crop.d.ts +1 -0
- data/app/components/primer/alpha/image_crop.html.erb +12 -0
- data/app/components/primer/alpha/image_crop.js +1 -0
- data/app/components/primer/alpha/image_crop.rb +39 -0
- data/app/components/primer/alpha/image_crop.ts +1 -0
- data/app/components/primer/alpha/layout.css +1 -0
- data/app/components/primer/alpha/layout.css.json +80 -0
- data/app/components/primer/alpha/layout.css.map +1 -0
- data/app/components/primer/alpha/layout.html.erb +5 -0
- data/app/components/primer/alpha/layout.pcss +268 -0
- data/app/components/primer/alpha/layout.rb +278 -0
- data/app/components/primer/alpha/menu.css +1 -0
- data/app/components/primer/alpha/menu.css.json +28 -0
- data/app/components/primer/alpha/menu.css.map +1 -0
- data/app/components/primer/alpha/menu.html.erb +6 -0
- data/app/components/primer/alpha/menu.pcss +119 -0
- data/app/components/primer/alpha/menu.rb +76 -0
- data/app/components/primer/alpha/modal_dialog.d.ts +18 -0
- data/app/components/primer/alpha/modal_dialog.js +189 -0
- data/app/components/primer/alpha/modal_dialog.ts +202 -0
- data/app/components/primer/alpha/multi_input.rb +81 -0
- data/app/components/primer/alpha/nav_list/divider.rb +14 -0
- data/app/components/primer/alpha/nav_list/group.html.erb +7 -0
- data/app/components/primer/alpha/nav_list/group.rb +107 -0
- data/app/components/primer/alpha/nav_list/heading.rb +36 -0
- data/app/components/primer/alpha/nav_list/item.html.erb +13 -0
- data/app/components/primer/alpha/nav_list/item.rb +156 -0
- data/app/components/primer/alpha/nav_list.d.ts +28 -0
- data/app/components/primer/alpha/nav_list.html.erb +15 -0
- data/app/components/primer/alpha/nav_list.js +248 -0
- data/app/components/primer/alpha/nav_list.rb +281 -0
- data/app/components/primer/alpha/nav_list.ts +267 -0
- data/app/components/primer/alpha/navigation/tab.html.erb +11 -0
- data/app/components/primer/alpha/navigation/tab.rb +168 -0
- data/app/components/primer/alpha/octicon_symbols.html.erb +3 -0
- data/app/components/primer/alpha/octicon_symbols.rb +59 -0
- data/app/components/primer/alpha/overlay/body.rb +26 -0
- data/app/components/primer/alpha/overlay/footer.rb +41 -0
- data/app/components/primer/alpha/overlay/header.html.erb +17 -0
- data/app/components/primer/alpha/overlay/header.rb +50 -0
- data/app/components/primer/alpha/overlay.css +1 -0
- data/app/components/primer/alpha/overlay.css.json +8 -0
- data/app/components/primer/alpha/overlay.css.map +1 -0
- data/app/components/primer/alpha/overlay.html.erb +13 -0
- data/app/components/primer/alpha/overlay.pcss +30 -0
- data/app/components/primer/alpha/overlay.rb +214 -0
- data/app/components/primer/alpha/radio_button.rb +25 -0
- data/app/components/primer/alpha/radio_button_group.rb +36 -0
- data/app/components/primer/alpha/segmented_control/item.html.erb +13 -0
- data/app/components/primer/alpha/segmented_control/item.rb +30 -0
- data/app/components/primer/alpha/segmented_control.css +1 -0
- data/app/components/primer/alpha/segmented_control.css.json +33 -0
- data/app/components/primer/alpha/segmented_control.css.map +1 -0
- data/app/components/primer/alpha/segmented_control.d.ts +12 -0
- data/app/components/primer/alpha/segmented_control.html.erb +7 -0
- data/app/components/primer/alpha/segmented_control.js +47 -0
- data/app/components/primer/alpha/segmented_control.pcss +157 -0
- data/app/components/primer/alpha/segmented_control.rb +122 -0
- data/app/components/primer/alpha/segmented_control.ts +41 -0
- data/app/components/primer/alpha/select.rb +37 -0
- data/app/components/primer/alpha/submit_button.rb +32 -0
- data/app/components/primer/alpha/tab_container.d.ts +1 -0
- data/app/components/primer/alpha/tab_container.js +1 -0
- data/app/components/primer/alpha/tab_container.rb +43 -0
- data/app/components/primer/alpha/tab_container.ts +1 -0
- data/app/components/primer/alpha/tab_nav.css +1 -0
- data/app/components/primer/alpha/tab_nav.css.json +24 -0
- data/app/components/primer/alpha/tab_nav.css.map +1 -0
- data/app/components/primer/alpha/tab_nav.html.erb +11 -0
- data/app/components/primer/alpha/tab_nav.pcss +100 -0
- data/app/components/primer/alpha/tab_nav.rb +136 -0
- data/app/components/primer/alpha/tab_panels.html.erb +14 -0
- data/app/components/primer/alpha/tab_panels.rb +89 -0
- data/app/components/primer/alpha/text_area.rb +24 -0
- data/app/components/primer/alpha/text_field.css +1 -0
- data/app/components/primer/alpha/text_field.css.json +135 -0
- data/app/components/primer/alpha/text_field.css.map +1 -0
- data/app/components/primer/alpha/text_field.pcss +706 -0
- data/app/components/primer/alpha/text_field.rb +101 -0
- data/app/components/primer/alpha/toggle_switch.css +1 -0
- data/app/components/primer/alpha/toggle_switch.css.json +40 -0
- data/app/components/primer/alpha/toggle_switch.css.map +1 -0
- data/app/components/primer/alpha/toggle_switch.d.ts +30 -0
- data/app/components/primer/alpha/toggle_switch.html.erb +46 -0
- data/app/components/primer/alpha/toggle_switch.js +165 -0
- data/app/components/primer/alpha/toggle_switch.pcss +220 -0
- data/app/components/primer/alpha/toggle_switch.rb +96 -0
- data/app/components/primer/alpha/toggle_switch.ts +189 -0
- data/app/components/primer/alpha/tool_tip.d.ts +26 -0
- data/app/components/primer/alpha/tool_tip.js +427 -0
- data/app/components/primer/alpha/tool_tip.ts +430 -0
- data/app/components/primer/alpha/tooltip.rb +128 -0
- data/app/components/primer/alpha/underline_nav.css +1 -0
- data/app/components/primer/alpha/underline_nav.css.json +28 -0
- data/app/components/primer/alpha/underline_nav.css.map +1 -0
- data/app/components/primer/alpha/underline_nav.html.erb +15 -0
- data/app/components/primer/alpha/underline_nav.pcss +134 -0
- data/app/components/primer/alpha/underline_nav.rb +138 -0
- data/app/components/primer/alpha/underline_panels.html.erb +18 -0
- data/app/components/primer/alpha/underline_panels.rb +86 -0
- data/app/components/primer/alpha/x_banner.d.ts +13 -0
- data/app/components/primer/alpha/x_banner.js +49 -0
- data/app/components/primer/alpha/x_banner.ts +40 -0
- data/app/components/primer/anchored_position.d.ts +27 -0
- data/app/components/primer/anchored_position.js +147 -0
- data/app/components/primer/anchored_position.ts +153 -0
- data/app/components/primer/base_component.rb +172 -0
- data/app/components/primer/beta/auto_complete/auto_complete.d.ts +1 -0
- data/app/components/primer/beta/auto_complete/auto_complete.html.erb +28 -0
- data/app/components/primer/beta/auto_complete/auto_complete.js +1 -0
- data/app/components/primer/beta/auto_complete/auto_complete.ts +1 -0
- data/app/components/primer/beta/auto_complete/item.html.erb +21 -0
- data/app/components/primer/beta/auto_complete/item.rb +84 -0
- data/app/components/primer/beta/auto_complete.rb +218 -0
- data/app/components/primer/beta/avatar.css +1 -0
- data/app/components/primer/beta/avatar.css.json +17 -0
- data/app/components/primer/beta/avatar.css.map +1 -0
- data/app/components/primer/beta/avatar.pcss +73 -0
- data/app/components/primer/beta/avatar.rb +84 -0
- data/app/components/primer/beta/avatar_stack.css +1 -0
- data/app/components/primer/beta/avatar_stack.css.json +28 -0
- data/app/components/primer/beta/avatar_stack.css.map +1 -0
- data/app/components/primer/beta/avatar_stack.html.erb +10 -0
- data/app/components/primer/beta/avatar_stack.pcss +141 -0
- data/app/components/primer/beta/avatar_stack.rb +92 -0
- data/app/components/primer/beta/base_button.rb +56 -0
- data/app/components/primer/beta/blankslate.css +1 -0
- data/app/components/primer/beta/blankslate.css.json +22 -0
- data/app/components/primer/beta/blankslate.css.map +1 -0
- data/app/components/primer/beta/blankslate.html.erb +19 -0
- data/app/components/primer/beta/blankslate.pcss +90 -0
- data/app/components/primer/beta/blankslate.rb +238 -0
- data/app/components/primer/beta/border_box/header.html.erb +4 -0
- data/app/components/primer/beta/border_box/header.rb +52 -0
- data/app/components/primer/beta/border_box.css +1 -0
- data/app/components/primer/beta/border_box.css.json +54 -0
- data/app/components/primer/beta/border_box.css.map +1 -0
- data/app/components/primer/beta/border_box.html.erb +12 -0
- data/app/components/primer/beta/border_box.pcss +284 -0
- data/app/components/primer/beta/border_box.rb +147 -0
- data/app/components/primer/beta/breadcrumbs.css +1 -0
- data/app/components/primer/beta/breadcrumbs.css.json +11 -0
- data/app/components/primer/beta/breadcrumbs.css.map +1 -0
- data/app/components/primer/beta/breadcrumbs.html.erb +8 -0
- data/app/components/primer/beta/breadcrumbs.pcss +30 -0
- data/app/components/primer/beta/breadcrumbs.rb +82 -0
- data/app/components/primer/beta/button.css +1 -0
- data/app/components/primer/beta/button.css.json +75 -0
- data/app/components/primer/beta/button.css.map +1 -0
- data/app/components/primer/beta/button.html.erb +23 -0
- data/app/components/primer/beta/button.pcss +366 -0
- data/app/components/primer/beta/button.rb +197 -0
- data/app/components/primer/beta/button_group.css +1 -0
- data/app/components/primer/beta/button_group.css.json +14 -0
- data/app/components/primer/beta/button_group.css.map +1 -0
- data/app/components/primer/beta/button_group.html.erb +5 -0
- data/app/components/primer/beta/button_group.pcss +27 -0
- data/app/components/primer/beta/button_group.rb +59 -0
- data/app/components/primer/beta/clipboard_copy.d.ts +1 -0
- data/app/components/primer/beta/clipboard_copy.html.erb +8 -0
- data/app/components/primer/beta/clipboard_copy.js +43 -0
- data/app/components/primer/beta/clipboard_copy.rb +50 -0
- data/app/components/primer/beta/clipboard_copy.ts +55 -0
- data/app/components/primer/beta/close_button.rb +43 -0
- data/app/components/primer/beta/counter.css +1 -0
- data/app/components/primer/beta/counter.css.json +10 -0
- data/app/components/primer/beta/counter.css.map +1 -0
- data/app/components/primer/beta/counter.pcss +35 -0
- data/app/components/primer/beta/counter.rb +113 -0
- data/app/components/primer/beta/details.html.erb +8 -0
- data/app/components/primer/beta/details.rb +80 -0
- data/app/components/primer/beta/flash.css +1 -0
- data/app/components/primer/beta/flash.css.json +27 -0
- data/app/components/primer/beta/flash.css.map +1 -0
- data/app/components/primer/beta/flash.html.erb +10 -0
- data/app/components/primer/beta/flash.pcss +142 -0
- data/app/components/primer/beta/flash.rb +71 -0
- data/app/components/primer/beta/heading.rb +46 -0
- data/app/components/primer/beta/icon_button.html.erb +6 -0
- data/app/components/primer/beta/icon_button.rb +112 -0
- data/app/components/primer/beta/label.css +1 -0
- data/app/components/primer/beta/label.css.json +25 -0
- data/app/components/primer/beta/label.css.map +1 -0
- data/app/components/primer/beta/label.pcss +103 -0
- data/app/components/primer/beta/label.rb +100 -0
- data/app/components/primer/beta/link.css +1 -0
- data/app/components/primer/beta/link.css.json +19 -0
- data/app/components/primer/beta/link.css.map +1 -0
- data/app/components/primer/beta/link.pcss +64 -0
- data/app/components/primer/beta/link.rb +95 -0
- data/app/components/primer/beta/markdown.rb +290 -0
- data/app/components/primer/beta/octicon.html.erb +7 -0
- data/app/components/primer/beta/octicon.rb +88 -0
- data/app/components/primer/beta/popover.css +1 -0
- data/app/components/primer/beta/popover.css.json +39 -0
- data/app/components/primer/beta/popover.css.map +1 -0
- data/app/components/primer/beta/popover.html.erb +6 -0
- data/app/components/primer/beta/popover.pcss +225 -0
- data/app/components/primer/beta/popover.rb +127 -0
- data/app/components/primer/beta/progress_bar.css +1 -0
- data/app/components/primer/beta/progress_bar.css.json +10 -0
- data/app/components/primer/beta/progress_bar.css.map +1 -0
- data/app/components/primer/beta/progress_bar.html.erb +5 -0
- data/app/components/primer/beta/progress_bar.pcss +26 -0
- data/app/components/primer/beta/progress_bar.rb +72 -0
- data/app/components/primer/beta/relative_time.d.ts +1 -0
- data/app/components/primer/beta/relative_time.js +1 -0
- data/app/components/primer/beta/relative_time.rb +166 -0
- data/app/components/primer/beta/relative_time.ts +1 -0
- data/app/components/primer/beta/spinner.html.erb +4 -0
- data/app/components/primer/beta/spinner.rb +45 -0
- data/app/components/primer/beta/state.css +1 -0
- data/app/components/primer/beta/state.css.json +13 -0
- data/app/components/primer/beta/state.css.map +1 -0
- data/app/components/primer/beta/state.pcss +50 -0
- data/app/components/primer/beta/state.rb +76 -0
- data/app/components/primer/beta/subhead.css +1 -0
- data/app/components/primer/beta/subhead.css.json +12 -0
- data/app/components/primer/beta/subhead.css.map +1 -0
- data/app/components/primer/beta/subhead.html.erb +5 -0
- data/app/components/primer/beta/subhead.pcss +49 -0
- data/app/components/primer/beta/subhead.rb +135 -0
- data/app/components/primer/beta/text.rb +27 -0
- data/app/components/primer/beta/timeline_item.css +1 -0
- data/app/components/primer/beta/timeline_item.css.json +16 -0
- data/app/components/primer/beta/timeline_item.css.map +1 -0
- data/app/components/primer/beta/timeline_item.html.erb +5 -0
- data/app/components/primer/beta/timeline_item.pcss +93 -0
- data/app/components/primer/beta/timeline_item.rb +90 -0
- data/app/components/primer/beta/truncate.css +1 -0
- data/app/components/primer/beta/truncate.css.json +12 -0
- data/app/components/primer/beta/truncate.css.map +1 -0
- data/app/components/primer/beta/truncate.html.erb +5 -0
- data/app/components/primer/beta/truncate.pcss +31 -0
- data/app/components/primer/beta/truncate.rb +111 -0
- data/app/components/primer/blankslate_component.html.erb +25 -0
- data/app/components/primer/blankslate_component.rb +156 -0
- data/app/components/primer/box.rb +25 -0
- data/app/components/primer/button_component.html.erb +12 -0
- data/app/components/primer/button_component.rb +175 -0
- data/app/components/primer/component.rb +145 -0
- data/app/components/primer/conditional_wrapper.rb +36 -0
- data/app/components/primer/content.rb +12 -0
- data/app/components/primer/focus_group.d.ts +19 -0
- data/app/components/primer/focus_group.js +139 -0
- data/app/components/primer/focus_group.ts +133 -0
- data/app/components/primer/icon_button.html.erb +12 -0
- data/app/components/primer/icon_button.rb +108 -0
- data/app/components/primer/layout_component.html.erb +11 -0
- data/app/components/primer/layout_component.rb +73 -0
- data/app/components/primer/navigation/tab_component.rb +10 -0
- data/app/components/primer/primer.d.ts +21 -0
- data/app/components/primer/primer.js +21 -0
- data/app/components/primer/primer.pcss +42 -0
- data/app/components/primer/primer.ts +21 -0
- data/app/components/primer/tooltip.rb +91 -0
- data/app/components/primer/truncate.css +1 -0
- data/app/components/primer/truncate.css.json +13 -0
- data/app/components/primer/truncate.css.map +1 -0
- data/app/components/primer/truncate.pcss +30 -0
- data/app/components/primer/truncate.rb +52 -0
- data/app/forms/after_content_form/after_content.html.erb +1 -0
- data/app/forms/after_content_form.rb +13 -0
- data/app/forms/application_form.rb +5 -0
- data/app/forms/array_check_box_group_form/places_lopez_caption.html.erb +1 -0
- data/app/forms/array_check_box_group_form.rb +15 -0
- data/app/forms/both_types_of_caption_form/first_name_caption.html.erb +1 -0
- data/app/forms/both_types_of_caption_form.rb +13 -0
- data/app/forms/caption_template_form/age_middle_aged_caption.html.erb +1 -0
- data/app/forms/caption_template_form/age_young_caption.html.erb +1 -0
- data/app/forms/caption_template_form/cool_caption.html.erb +1 -0
- data/app/forms/caption_template_form/first_name_caption.html.erb +1 -0
- data/app/forms/caption_template_form.rb +22 -0
- data/app/forms/check_box_group_form.rb +28 -0
- data/app/forms/check_box_with_nested_form.rb +39 -0
- data/app/forms/composed_form.rb +14 -0
- data/app/forms/example_toggle_switch_form/example_field_caption.html.erb +1 -0
- data/app/forms/example_toggle_switch_form.rb +8 -0
- data/app/forms/first_name_form.rb +13 -0
- data/app/forms/horizontal_form.rb +34 -0
- data/app/forms/immediate_validation_form.rb +29 -0
- data/app/forms/invalid_form.rb +21 -0
- data/app/forms/last_name_form.rb +13 -0
- data/app/forms/multi_input_form.rb +27 -0
- data/app/forms/multi_text_field_form.rb +27 -0
- data/app/forms/name_with_question_mark_form/enabled_caption.html.erb +1 -0
- data/app/forms/name_with_question_mark_form.rb +11 -0
- data/app/forms/radio_button_group_form.rb +12 -0
- data/app/forms/radio_button_with_nested_form.rb +39 -0
- data/app/forms/select_form.rb +12 -0
- data/app/forms/single_text_field_form.rb +13 -0
- data/app/forms/submit_button_form.rb +26 -0
- data/app/forms/text_field_and_checkbox_form.rb +19 -0
- data/app/helpers/primer/form_helper.rb +23 -0
- data/app/lib/primer/attributes_helper.rb +105 -0
- data/app/lib/primer/audited/dsl.rb +32 -0
- data/app/lib/primer/class_name_helper.rb +29 -0
- data/app/lib/primer/css/layout.css +1541 -0
- data/app/lib/primer/css/layout.css.json +316 -0
- data/app/lib/primer/css/utilities.css +7304 -0
- data/app/lib/primer/css/utilities.css.json +1659 -0
- data/app/lib/primer/fetch_or_fallback_helper.rb +65 -0
- data/app/lib/primer/join_style_arguments_helper.rb +14 -0
- data/app/lib/primer/octicon/cache.rb +44 -0
- data/app/lib/primer/status/dsl.rb +44 -0
- data/app/lib/primer/tab_nav_helper.rb +35 -0
- data/app/lib/primer/tabbed_component_helper.rb +39 -0
- data/app/lib/primer/test_selector_helper.rb +20 -0
- data/app/lib/primer/underline_nav_helper.rb +44 -0
- data/app/lib/primer/view_helper.rb +21 -0
- data/lib/postcss_mixins/activeIndicatorLine.pcss +11 -0
- data/lib/postcss_mixins/clearfix.pcss +12 -0
- data/lib/postcss_mixins/focusBoxShadowInset.pcss +6 -0
- data/lib/postcss_mixins/focusOutline.pcss +5 -0
- data/lib/postcss_mixins/focusOutlineOnEmphasis.pcss +6 -0
- data/lib/postcss_mixins/minTouchTarget.js +20 -0
- data/lib/postcss_mixins/targetBoxShadow.pcss +6 -0
- data/lib/primer/accessibility.rb +74 -0
- data/lib/primer/classify/utilities.rb +201 -0
- data/lib/primer/classify/utilities.yml +1879 -0
- data/lib/primer/classify/validation.rb +18 -0
- data/lib/primer/classify.rb +135 -0
- data/lib/primer/deprecations.rb +99 -0
- data/lib/primer/deprecations.yml +45 -0
- data/lib/primer/example_image.rb +8 -0
- data/lib/primer/form_components.rb +57 -0
- data/lib/primer/forms/acts_as_component.rb +129 -0
- data/lib/primer/forms/base.html.erb +8 -0
- data/lib/primer/forms/base.rb +133 -0
- data/lib/primer/forms/base_component.rb +76 -0
- data/lib/primer/forms/buffer_rewriter.rb +51 -0
- data/lib/primer/forms/builder.rb +71 -0
- data/lib/primer/forms/button.html.erb +4 -0
- data/lib/primer/forms/button.rb +66 -0
- data/lib/primer/forms/caption.html.erb +10 -0
- data/lib/primer/forms/caption.rb +29 -0
- data/lib/primer/forms/check_box.html.erb +16 -0
- data/lib/primer/forms/check_box.rb +46 -0
- data/lib/primer/forms/check_box_group.html.erb +17 -0
- data/lib/primer/forms/check_box_group.rb +19 -0
- data/lib/primer/forms/dsl/button_input.rb +29 -0
- data/lib/primer/forms/dsl/check_box_group_input.rb +53 -0
- data/lib/primer/forms/dsl/check_box_input.rb +54 -0
- data/lib/primer/forms/dsl/form_object.rb +25 -0
- data/lib/primer/forms/dsl/form_reference_input.rb +59 -0
- data/lib/primer/forms/dsl/hidden_input.rb +29 -0
- data/lib/primer/forms/dsl/input.rb +315 -0
- data/lib/primer/forms/dsl/input_group.rb +34 -0
- data/lib/primer/forms/dsl/input_methods.rb +139 -0
- data/lib/primer/forms/dsl/multi_input.rb +55 -0
- data/lib/primer/forms/dsl/radio_button_group_input.rb +37 -0
- data/lib/primer/forms/dsl/radio_button_input.rb +37 -0
- data/lib/primer/forms/dsl/select_input.rb +61 -0
- data/lib/primer/forms/dsl/submit_button_input.rb +29 -0
- data/lib/primer/forms/dsl/text_area_input.rb +33 -0
- data/lib/primer/forms/dsl/text_field_input.rb +86 -0
- data/lib/primer/forms/dsl/toggle_switch_input.rb +39 -0
- data/lib/primer/forms/form_control.html.erb +20 -0
- data/lib/primer/forms/form_control.rb +28 -0
- data/lib/primer/forms/form_list.html.erb +5 -0
- data/lib/primer/forms/form_list.rb +21 -0
- data/lib/primer/forms/form_reference.html.erb +3 -0
- data/lib/primer/forms/form_reference.rb +18 -0
- data/lib/primer/forms/group.html.erb +5 -0
- data/lib/primer/forms/group.rb +27 -0
- data/lib/primer/forms/hidden_field.html.erb +1 -0
- data/lib/primer/forms/hidden_field.rb +15 -0
- data/lib/primer/forms/multi.html.erb +7 -0
- data/lib/primer/forms/multi.rb +16 -0
- data/lib/primer/forms/primer_base_component_wrapper.html.erb +3 -0
- data/lib/primer/forms/primer_base_component_wrapper.rb +24 -0
- data/lib/primer/forms/primer_multi_input.d.ts +10 -0
- data/lib/primer/forms/primer_multi_input.js +45 -0
- data/lib/primer/forms/primer_multi_input.ts +46 -0
- data/lib/primer/forms/primer_text_field.d.ts +1 -0
- data/lib/primer/forms/primer_text_field.js +73 -0
- data/lib/primer/forms/primer_text_field.ts +56 -0
- data/lib/primer/forms/radio_button.html.erb +16 -0
- data/lib/primer/forms/radio_button.rb +29 -0
- data/lib/primer/forms/radio_button_group.html.erb +17 -0
- data/lib/primer/forms/radio_button_group.rb +19 -0
- data/lib/primer/forms/select.html.erb +5 -0
- data/lib/primer/forms/select.rb +29 -0
- data/lib/primer/forms/separator.html.erb +1 -0
- data/lib/primer/forms/separator.rb +8 -0
- data/lib/primer/forms/spacing_wrapper.html.erb +3 -0
- data/lib/primer/forms/spacing_wrapper.rb +8 -0
- data/lib/primer/forms/submit_button.html.erb +1 -0
- data/lib/primer/forms/submit_button.rb +14 -0
- data/lib/primer/forms/text_area.html.erb +5 -0
- data/lib/primer/forms/text_area.rb +20 -0
- data/lib/primer/forms/text_field.html.erb +17 -0
- data/lib/primer/forms/text_field.rb +46 -0
- data/lib/primer/forms/toggle_switch.html.erb +22 -0
- data/lib/primer/forms/toggle_switch.rb +21 -0
- data/lib/primer/forms/toggle_switch_form.rb +81 -0
- data/lib/primer/forms/toggle_switch_input.d.ts +5 -0
- data/lib/primer/forms/toggle_switch_input.js +34 -0
- data/lib/primer/forms/toggle_switch_input.ts +26 -0
- data/lib/primer/forms/utils.rb +48 -0
- data/lib/primer/static/generate_arguments.rb +55 -0
- data/lib/primer/static/generate_audited_at.rb +17 -0
- data/lib/primer/static/generate_constants.rb +19 -0
- data/lib/primer/static/generate_info_arch.rb +160 -0
- data/lib/primer/static/generate_previews.rb +61 -0
- data/lib/primer/static/generate_statuses.rb +17 -0
- data/lib/primer/static.rb +72 -0
- data/lib/primer/view_components/audited.rb +14 -0
- data/lib/primer/view_components/constants.rb +55 -0
- data/lib/primer/view_components/engine.rb +69 -0
- data/lib/primer/view_components/linters/accessibility.yml +9 -0
- data/lib/primer/view_components/linters/argument_mappers/base.rb +100 -0
- data/lib/primer/view_components/linters/argument_mappers/button.rb +72 -0
- data/lib/primer/view_components/linters/argument_mappers/clipboard_copy.rb +21 -0
- data/lib/primer/view_components/linters/argument_mappers/close_button.rb +43 -0
- data/lib/primer/view_components/linters/argument_mappers/conversion_error.rb +10 -0
- data/lib/primer/view_components/linters/argument_mappers/flash.rb +32 -0
- data/lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb +67 -0
- data/lib/primer/view_components/linters/argument_mappers/label.rb +56 -0
- data/lib/primer/view_components/linters/argument_mappers/system_arguments.rb +48 -0
- data/lib/primer/view_components/linters/autocorrectable.rb +32 -0
- data/lib/primer/view_components/linters/base_linter.rb +190 -0
- data/lib/primer/view_components/linters/blankslate_api_migration.rb +152 -0
- data/lib/primer/view_components/linters/blankslate_component_migration_counter.rb +14 -0
- data/lib/primer/view_components/linters/breadcrumbs_component_migration_counter.rb +14 -0
- data/lib/primer/view_components/linters/button_component_migration_counter.rb +26 -0
- data/lib/primer/view_components/linters/clipboard_copy_component_migration_counter.rb +20 -0
- data/lib/primer/view_components/linters/close_button_component_migration_counter.rb +121 -0
- data/lib/primer/view_components/linters/deprecated_components_counter.rb +84 -0
- data/lib/primer/view_components/linters/details_menu_migration.rb +35 -0
- data/lib/primer/view_components/linters/disallow_action_list.rb +73 -0
- data/lib/primer/view_components/linters/disallow_component_css_counter.rb +69 -0
- data/lib/primer/view_components/linters/flash_migration_counter.rb +36 -0
- data/lib/primer/view_components/linters/helpers/deprecated_components_helpers.rb +20 -0
- data/lib/primer/view_components/linters/helpers/rubocop_helpers.rb +14 -0
- data/lib/primer/view_components/linters/helpers/rule_helpers.rb +39 -0
- data/lib/primer/view_components/linters/label_component_migration_counter.rb +24 -0
- data/lib/primer/view_components/linters/migrate_deprecated_flash_arguments.rb +140 -0
- data/lib/primer/view_components/linters/severity_schema.rb +14 -0
- data/lib/primer/view_components/linters/subhead_component_migration_counter.rb +14 -0
- data/lib/primer/view_components/linters/super_in_component_templates.rb +65 -0
- data/lib/primer/view_components/linters/tag_tree_helpers.rb +61 -0
- data/lib/primer/view_components/linters/tooltipped_migration.rb +35 -0
- data/lib/primer/view_components/linters/two_column_layout_migration_counter.rb +158 -0
- data/lib/primer/view_components/linters.rb +3 -0
- data/lib/primer/view_components/statuses.rb +14 -0
- data/lib/primer/view_components/version.rb +18 -0
- data/lib/primer/view_components.rb +15 -0
- data/lib/primer/yard/backend.rb +24 -0
- data/lib/primer/yard/component_manifest.rb +144 -0
- data/lib/primer/yard/component_ref.rb +54 -0
- data/lib/primer/yard/docs_helper.rb +98 -0
- data/lib/primer/yard/info_arch_docs_helper.rb +31 -0
- data/lib/primer/yard/legacy_gatsby_backend.rb +233 -0
- data/lib/primer/yard/lookbook_docs_helper.rb +32 -0
- data/lib/primer/yard/lookbook_pages_backend.rb +231 -0
- data/lib/primer/yard/registry.rb +136 -0
- data/lib/primer/yard/renders_many_handler.rb +23 -0
- data/lib/primer/yard/renders_one_handler.rb +23 -0
- data/lib/primer/yard.rb +20 -0
- data/lib/rubocop/config/default.yml +20 -0
- data/lib/rubocop/cop/primer/base_cop.rb +28 -0
- data/lib/rubocop/cop/primer/component_name_migration.rb +37 -0
- data/lib/rubocop/cop/primer/deprecated_arguments.rb +317 -0
- data/lib/rubocop/cop/primer/deprecated_button_arguments.rb +51 -0
- data/lib/rubocop/cop/primer/deprecated_components.rb +49 -0
- data/lib/rubocop/cop/primer/deprecated_label_schemes.rb +68 -0
- data/lib/rubocop/cop/primer/deprecated_label_variants.rb +71 -0
- data/lib/rubocop/cop/primer/deprecated_layout_component.rb +30 -0
- data/lib/rubocop/cop/primer/no_tag_memoize.rb +43 -0
- data/lib/rubocop/cop/primer/primer_octicon.rb +217 -0
- data/lib/rubocop/cop/primer/system_argument_instead_of_class.rb +57 -0
- data/lib/rubocop/cop/primer/test_selector.rb +48 -0
- data/lib/rubocop/cop/primer.rb +3 -0
- data/lib/tasks/custom_utilities.yml +372 -0
- data/previews/pages/forms/01_introduction.md.erb +44 -0
- data/previews/pages/forms/02_getting_started.md.erb +125 -0
- data/previews/pages/forms/03_caption_templates.md.erb +30 -0
- data/previews/pages/forms/04_after_content.md.erb +39 -0
- data/previews/pages/forms/05_groups_layouts.md.erb +22 -0
- data/previews/pages/forms/06_miscellaneous_inputs.md.erb +43 -0
- data/previews/pages/forms/07_toggle_switch_forms.md.erb +58 -0
- data/previews/pages/forms/08_validations.md.erb +28 -0
- data/previews/pages/forms/09_compound_forms.md.erb +97 -0
- data/previews/primer/alpha/action_bar_preview/inline.html.erb +16 -0
- data/previews/primer/alpha/action_bar_preview.rb +77 -0
- data/previews/primer/alpha/action_list_preview.rb +464 -0
- data/previews/primer/alpha/action_menu_preview/align_end.html.erb +6 -0
- data/previews/primer/alpha/action_menu_preview/content_labels.html.erb +9 -0
- data/previews/primer/alpha/action_menu_preview/multiple_select_form.html.erb +13 -0
- data/previews/primer/alpha/action_menu_preview/opens_dialog.html.erb +21 -0
- data/previews/primer/alpha/action_menu_preview/single_select_form.html.erb +13 -0
- data/previews/primer/alpha/action_menu_preview/submitting_forms.html.erb +15 -0
- data/previews/primer/alpha/action_menu_preview/two_menus.html.erb +13 -0
- data/previews/primer/alpha/action_menu_preview/with_actions.html.erb +21 -0
- data/previews/primer/alpha/action_menu_preview.rb +328 -0
- data/previews/primer/alpha/auto_complete_preview.rb +121 -0
- data/previews/primer/alpha/banner_preview/with_action_button.html.erb +4 -0
- data/previews/primer/alpha/banner_preview/with_action_content.html.erb +6 -0
- data/previews/primer/alpha/banner_preview.rb +102 -0
- data/previews/primer/alpha/button_marketing_preview.rb +65 -0
- data/previews/primer/alpha/check_box_group_preview.rb +90 -0
- data/previews/primer/alpha/check_box_preview.rb +68 -0
- data/previews/primer/alpha/dialog_preview/body_has_scrollbar_overflow.html.erb +9 -0
- data/previews/primer/alpha/dialog_preview/custom_header.html.erb +7 -0
- data/previews/primer/alpha/dialog_preview/nested_dialog.html.erb +14 -0
- data/previews/primer/alpha/dialog_preview/test.html.erb +7 -0
- data/previews/primer/alpha/dialog_preview/with_footer.html.erb +8 -0
- data/previews/primer/alpha/dialog_preview/with_form.html.erb +12 -0
- data/previews/primer/alpha/dialog_preview/with_text_input.html.erb +10 -0
- data/previews/primer/alpha/dialog_preview.rb +154 -0
- data/previews/primer/alpha/dropdown_preview.rb +211 -0
- data/previews/primer/alpha/form_control_preview/playground.html.erb +9 -0
- data/previews/primer/alpha/form_control_preview.rb +106 -0
- data/previews/primer/alpha/hellip_button_preview.rb +26 -0
- data/previews/primer/alpha/hidden_text_expander_preview.rb +23 -0
- data/previews/primer/alpha/image_crop_preview.rb +31 -0
- data/previews/primer/alpha/layout_preview.rb +215 -0
- data/previews/primer/alpha/menu_preview/default.html.erb +17 -0
- data/previews/primer/alpha/menu_preview/playground.html.erb +17 -0
- data/previews/primer/alpha/menu_preview.rb +15 -0
- data/previews/primer/alpha/multi_input_preview/playground.html.erb +41 -0
- data/previews/primer/alpha/multi_input_preview.rb +84 -0
- data/previews/primer/alpha/nav_list_preview/trailing_action.html.erb +19 -0
- data/previews/primer/alpha/nav_list_preview.rb +125 -0
- data/previews/primer/alpha/overlay_preview/middle_of_page.html.erb +17 -0
- data/previews/primer/alpha/overlay_preview/middle_of_page_with_relative_container.html.erb +19 -0
- data/previews/primer/alpha/overlay_preview.rb +179 -0
- data/previews/primer/alpha/radio_button_group_preview.rb +85 -0
- data/previews/primer/alpha/radio_button_preview.rb +72 -0
- data/previews/primer/alpha/segmented_control_preview/with_label_and_caption.html.erb +9 -0
- data/previews/primer/alpha/segmented_control_preview/with_subhead_actions.html.erb +11 -0
- data/previews/primer/alpha/segmented_control_preview.rb +183 -0
- data/previews/primer/alpha/select_preview.rb +136 -0
- data/previews/primer/alpha/tab_nav_preview/with_extra.html.erb +8 -0
- data/previews/primer/alpha/tab_nav_preview.rb +63 -0
- data/previews/primer/alpha/tab_panels_preview/with_extra.html.erb +17 -0
- data/previews/primer/alpha/tab_panels_preview.rb +44 -0
- data/previews/primer/alpha/text_area_preview.rb +94 -0
- data/previews/primer/alpha/text_field_preview.rb +194 -0
- data/previews/primer/alpha/toggle_switch_preview.rb +63 -0
- data/previews/primer/alpha/tooltip_preview/tooltip_inside_primer_overlay.html.erb +20 -0
- data/previews/primer/alpha/tooltip_preview/with_multiple_on_a_page.html.erb +14 -0
- data/previews/primer/alpha/tooltip_preview/with_right_most_position.html.erb +7 -0
- data/previews/primer/alpha/tooltip_preview.rb +88 -0
- data/previews/primer/alpha/underline_nav_preview/default.html.erb +8 -0
- data/previews/primer/alpha/underline_nav_preview/playground.html.erb +8 -0
- data/previews/primer/alpha/underline_nav_preview.rb +58 -0
- data/previews/primer/alpha/underline_panels_preview.rb +38 -0
- data/previews/primer/beta/auto_complete_item_preview/default.html.erb +9 -0
- data/previews/primer/beta/auto_complete_item_preview/playground.html.erb +9 -0
- data/previews/primer/beta/auto_complete_item_preview/with_description.html.erb +11 -0
- data/previews/primer/beta/auto_complete_item_preview.rb +57 -0
- data/previews/primer/beta/auto_complete_preview/with_submit_button.html.erb +20 -0
- data/previews/primer/beta/auto_complete_preview.rb +287 -0
- data/previews/primer/beta/avatar_preview.rb +92 -0
- data/previews/primer/beta/avatar_stack_preview.rb +104 -0
- data/previews/primer/beta/base_button_preview.rb +33 -0
- data/previews/primer/beta/blankslate_preview.rb +139 -0
- data/previews/primer/beta/border_box_preview.rb +102 -0
- data/previews/primer/beta/breadcrumbs_preview.rb +31 -0
- data/previews/primer/beta/button_group_preview/action_menus.html.erb +8 -0
- data/previews/primer/beta/button_group_preview.rb +74 -0
- data/previews/primer/beta/button_preview/all_schemes.html.erb +30 -0
- data/previews/primer/beta/button_preview/invisible_all_visuals.html.erb +54 -0
- data/previews/primer/beta/button_preview/leading_visual.html.erb +10 -0
- data/previews/primer/beta/button_preview/trailing_action.html.erb +10 -0
- data/previews/primer/beta/button_preview/trailing_counter.html.erb +11 -0
- data/previews/primer/beta/button_preview/trailing_visual.html.erb +11 -0
- data/previews/primer/beta/button_preview/with_tooltip.html.erb +10 -0
- data/previews/primer/beta/button_preview.rb +324 -0
- data/previews/primer/beta/clipboard_copy_preview/element.html.erb +2 -0
- data/previews/primer/beta/clipboard_copy_preview.rb +41 -0
- data/previews/primer/beta/close_button_preview.rb +24 -0
- data/previews/primer/beta/counter_preview.rb +93 -0
- data/previews/primer/beta/details_preview.rb +63 -0
- data/previews/primer/beta/flash_preview.rb +77 -0
- data/previews/primer/beta/heading_preview.rb +25 -0
- data/previews/primer/beta/icon_button_preview.rb +113 -0
- data/previews/primer/beta/label_preview.rb +117 -0
- data/previews/primer/beta/link_preview.rb +71 -0
- data/previews/primer/beta/markdown_preview.rb +294 -0
- data/previews/primer/beta/octicon_preview.rb +25 -0
- data/previews/primer/beta/popover_preview.rb +85 -0
- data/previews/primer/beta/progress_bar_preview.rb +64 -0
- data/previews/primer/beta/relative_time_preview.rb +286 -0
- data/previews/primer/beta/spinner_preview.rb +23 -0
- data/previews/primer/beta/state_preview.rb +72 -0
- data/previews/primer/beta/subhead_preview/actions.html.erb +14 -0
- data/previews/primer/beta/subhead_preview.rb +103 -0
- data/previews/primer/beta/text_preview.rb +25 -0
- data/previews/primer/beta/timeline_item_preview.rb +31 -0
- data/previews/primer/beta/truncate_preview.rb +55 -0
- data/previews/primer/box_preview.rb +30 -0
- data/previews/primer/forms_preview/after_content_form.html.erb +3 -0
- data/previews/primer/forms_preview/array_check_box_group_form.html.erb +3 -0
- data/previews/primer/forms_preview/caption_template_form.html.erb +3 -0
- data/previews/primer/forms_preview/check_box_group_form.html.erb +3 -0
- data/previews/primer/forms_preview/check_box_with_nested_form.html.erb +3 -0
- data/previews/primer/forms_preview/composed_form.html.erb +4 -0
- data/previews/primer/forms_preview/example_toggle_switch_form.html.erb +3 -0
- data/previews/primer/forms_preview/horizontal_form.html.erb +3 -0
- data/previews/primer/forms_preview/immediate_validation_form.html.erb +3 -0
- data/previews/primer/forms_preview/invalid_form.html.erb +3 -0
- data/previews/primer/forms_preview/multi_input_form.html.erb +14 -0
- data/previews/primer/forms_preview/multi_text_field_form.html.erb +3 -0
- data/previews/primer/forms_preview/name_with_question_mark_form.html.erb +3 -0
- data/previews/primer/forms_preview/radio_button_group_form.html.erb +3 -0
- data/previews/primer/forms_preview/radio_button_with_nested_form.html.erb +3 -0
- data/previews/primer/forms_preview/select_form.html.erb +3 -0
- data/previews/primer/forms_preview/single_text_field_form.html.erb +3 -0
- data/previews/primer/forms_preview/submit_button_form.html.erb +3 -0
- data/previews/primer/forms_preview/text_field_and_checkbox_form.html.erb +3 -0
- data/previews/primer/forms_preview.rb +44 -0
- data/previews/primer/url_helpers.rb +15 -0
- data/static/arguments.json +4501 -0
- data/static/assets/view-components.svg +18 -0
- data/static/audited_at.json +107 -0
- data/static/classes.json +606 -0
- data/static/constants.json +1335 -0
- data/static/info_arch.json +14465 -0
- data/static/previews.json +6408 -0
- data/static/statuses.json +107 -0
- metadata +1145 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "utilities"
|
4
|
+
|
5
|
+
module Primer
|
6
|
+
class Classify
|
7
|
+
# :nodoc:
|
8
|
+
class Validation
|
9
|
+
INVALID_CLASS_NAME_PREFIXES = /text-|box-shadow-|box_shadow-/.freeze
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def invalid?(class_name)
|
13
|
+
class_name.start_with?(INVALID_CLASS_NAME_PREFIXES) || Primer::Classify::Utilities.supported_selector?(class_name)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "classify/utilities"
|
4
|
+
require_relative "classify/validation"
|
5
|
+
|
6
|
+
module Primer
|
7
|
+
# :nodoc:
|
8
|
+
class Classify
|
9
|
+
FLEX_VALUES = [1, :auto].freeze
|
10
|
+
|
11
|
+
FLEX_WRAP_MAPPINGS = {
|
12
|
+
wrap: "flex-wrap",
|
13
|
+
nowrap: "flex-nowrap",
|
14
|
+
reverse: "flex-wrap-reverse"
|
15
|
+
}.freeze
|
16
|
+
|
17
|
+
FLEX_ALIGN_SELF_VALUES = [:auto, :start, :end, :center, :baseline, :stretch].freeze
|
18
|
+
|
19
|
+
FLEX_DIRECTION_VALUES = [:column, :column_reverse, :row, :row_reverse].freeze
|
20
|
+
|
21
|
+
FLEX_JUSTIFY_CONTENT_VALUES = [:flex_start, :flex_end, :center, :space_between, :space_around].freeze
|
22
|
+
|
23
|
+
FLEX_ALIGN_ITEMS_VALUES = [:flex_start, :flex_end, :center, :baseline, :stretch].freeze
|
24
|
+
|
25
|
+
LOOKUP = Primer::Classify::Utilities::UTILITIES
|
26
|
+
|
27
|
+
class << self
|
28
|
+
# Utility for mapping component configuration into Primer CSS class names.
|
29
|
+
#
|
30
|
+
# **args can contain utility keys that mimic the interface used by
|
31
|
+
# https://github.com/primer/components, as well as the special entries :classes
|
32
|
+
# and :style.
|
33
|
+
#
|
34
|
+
# Returns a hash containing two entries. The :classes entry is a string of
|
35
|
+
# Primer CSS class names, including any classes given in the :classes entry
|
36
|
+
# in **args. The :style entry is the value of the given :style entry given in
|
37
|
+
# **args.
|
38
|
+
#
|
39
|
+
#
|
40
|
+
# Example usage:
|
41
|
+
# extract_css_attrs({ mt: 4, py: 2 }) => { classes: "mt-4 py-2", style: nil }
|
42
|
+
# extract_css_attrs(classes: "d-flex", mt: 4, py: 2) => { classes: "d-flex mt-4 py-2", style: nil }
|
43
|
+
# extract_css_attrs(classes: "d-flex", style: "float: left", mt: 4, py: 2) => { classes: "d-flex mt-4 py-2", style: "float: left" }
|
44
|
+
#
|
45
|
+
def call(args = {})
|
46
|
+
style = nil
|
47
|
+
classes = [].tap do |result|
|
48
|
+
args.each do |key, val|
|
49
|
+
case key
|
50
|
+
when :classes
|
51
|
+
# insert :classes first to avoid huge doc diffs
|
52
|
+
if (class_names = validated_class_names(val))
|
53
|
+
result.unshift(class_names)
|
54
|
+
end
|
55
|
+
next
|
56
|
+
when :style
|
57
|
+
style = val
|
58
|
+
next
|
59
|
+
end
|
60
|
+
|
61
|
+
next unless LOOKUP[key]
|
62
|
+
|
63
|
+
if val.is_a?(Array)
|
64
|
+
# A while loop is ~3.5x faster than Array#each.
|
65
|
+
brk = 0
|
66
|
+
while brk < val.size
|
67
|
+
item = val[brk]
|
68
|
+
|
69
|
+
if item.nil?
|
70
|
+
brk += 1
|
71
|
+
next
|
72
|
+
end
|
73
|
+
|
74
|
+
# Believe it or not, three calls to Hash#[] and an inline rescue
|
75
|
+
# are about 30% faster than Hash#dig. It also ensures validate is
|
76
|
+
# only called when necessary, i.e. when the class can't be found
|
77
|
+
# in the lookup table.
|
78
|
+
# rubocop:disable Style/RescueModifier
|
79
|
+
found = (LOOKUP[key][item][brk] rescue nil) || validate(key, item, brk)
|
80
|
+
# rubocop:enable Style/RescueModifier
|
81
|
+
result << found if found
|
82
|
+
brk += 1
|
83
|
+
end
|
84
|
+
else
|
85
|
+
next if val.nil?
|
86
|
+
|
87
|
+
# rubocop:disable Style/RescueModifier
|
88
|
+
found = (LOOKUP[key][val][0] rescue nil) || validate(key, val, 0)
|
89
|
+
# rubocop:enable Style/RescueModifier
|
90
|
+
result << found if found
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end.join(" ")
|
94
|
+
|
95
|
+
# This is much faster than Rails' presence method.
|
96
|
+
# rubocop:disable Rails/Blank
|
97
|
+
{
|
98
|
+
class: !classes || classes.empty? ? nil : classes,
|
99
|
+
style: !style || style.empty? ? nil : style
|
100
|
+
}
|
101
|
+
# rubocop:enable Rails/Blank
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
def validate(key, val, brk)
|
107
|
+
brk_str = Primer::Classify::Utilities::BREAKPOINTS[brk]
|
108
|
+
Primer::Classify::Utilities.validate(key, val, brk_str)
|
109
|
+
end
|
110
|
+
|
111
|
+
def validated_class_names(classes)
|
112
|
+
return if classes.blank?
|
113
|
+
|
114
|
+
if raise_on_invalid_options? && !ENV["PRIMER_WARNINGS_DISABLED"]
|
115
|
+
invalid_class_names =
|
116
|
+
classes.split.each_with_object([]) do |class_name, memo|
|
117
|
+
memo << class_name if Primer::Classify::Validation.invalid?(class_name)
|
118
|
+
end
|
119
|
+
|
120
|
+
if invalid_class_names.any?
|
121
|
+
raise ArgumentError, "Use System Arguments (https://primer.style/view-components/system-arguments) "\
|
122
|
+
"instead of Primer CSS class #{'name'.pluralize(invalid_class_names.length)} #{invalid_class_names.to_sentence}. "\
|
123
|
+
"This warning will not be raised in production. Set PRIMER_WARNINGS_DISABLED=1 to disable this warning."
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
classes
|
128
|
+
end
|
129
|
+
|
130
|
+
def raise_on_invalid_options?
|
131
|
+
Rails.application.config.primer_view_components.raise_on_invalid_options
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "yaml"
|
4
|
+
|
5
|
+
module Primer
|
6
|
+
# :nodoc:
|
7
|
+
class Deprecations
|
8
|
+
class << self
|
9
|
+
def register(file_path)
|
10
|
+
data = YAML.load_file(file_path)
|
11
|
+
data["deprecations"].each do |dep|
|
12
|
+
register_deprecation(dep["component"], {
|
13
|
+
autocorrect: dep["autocorrect"],
|
14
|
+
guide: dep["guide"],
|
15
|
+
replacement: dep["replacement"]
|
16
|
+
})
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def register_deprecation(component, options)
|
21
|
+
registered_deprecations[component] = {
|
22
|
+
autocorrect: options[:autocorrect],
|
23
|
+
guide: options[:guide],
|
24
|
+
replacement: options[:replacement]
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def deprecated_components
|
29
|
+
registered_deprecations.keys.sort
|
30
|
+
end
|
31
|
+
|
32
|
+
def deprecated?(component_name)
|
33
|
+
# if the component is registered, it is deprecated
|
34
|
+
registered_deprecations.key?(component_name)
|
35
|
+
end
|
36
|
+
|
37
|
+
def replacement?(component_name)
|
38
|
+
!replacement(component_name).nil?
|
39
|
+
end
|
40
|
+
|
41
|
+
def replacement(component_name)
|
42
|
+
dep = registered_deprecations[component_name]
|
43
|
+
return nil if dep.nil?
|
44
|
+
|
45
|
+
dep[:replacement]
|
46
|
+
end
|
47
|
+
|
48
|
+
def correctable?(component_name)
|
49
|
+
dep = registered_deprecations[component_name]
|
50
|
+
return false if dep.nil?
|
51
|
+
|
52
|
+
dep[:autocorrect]
|
53
|
+
end
|
54
|
+
|
55
|
+
def guide?(component_name)
|
56
|
+
!guide(component_name).nil?
|
57
|
+
end
|
58
|
+
|
59
|
+
def guide(component_name)
|
60
|
+
dep = registered_deprecations[component_name]
|
61
|
+
return nil if dep.nil?
|
62
|
+
|
63
|
+
dep[:guide]
|
64
|
+
end
|
65
|
+
|
66
|
+
def deprecation_message(component_name)
|
67
|
+
return nil unless deprecated?(component_name)
|
68
|
+
|
69
|
+
msg = ["'#{component_name}' has been deprecated."]
|
70
|
+
|
71
|
+
# this nested structure is complex, because it has to
|
72
|
+
# match all of the valid scenarios for a component being
|
73
|
+
# replaceable, auto-correctable, and having a guide. for
|
74
|
+
# more information on what is and is not valid, see the
|
75
|
+
# documentation here: docs/contributors/deprecations.md
|
76
|
+
|
77
|
+
if replacement?(component_name)
|
78
|
+
msg << "Please update your code to use '#{replacement(component_name)}'."
|
79
|
+
msg << "Use Rubocop's auto-correct, or replace it yourself." if correctable?(component_name)
|
80
|
+
msg << "See #{guide(component_name)} for more information." if guide?(component_name)
|
81
|
+
else # if there is no replacement, it must have a guide. this is enforced through tests
|
82
|
+
msg << "Unfortunately, there is no direct replacement."
|
83
|
+
msg << "See #{guide(component_name)} for more information and available options."
|
84
|
+
end
|
85
|
+
|
86
|
+
msg.join(" ")
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
def registered_deprecations
|
92
|
+
@registered_deprecations ||= {}
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# auto-load PVC's deprecations
|
97
|
+
register(File.expand_path("deprecations.yml", __dir__))
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# PVC Component Deprecations
|
2
|
+
# --------------------------
|
3
|
+
#
|
4
|
+
# All component deprecations for PVC must be listed here, and must have valid configurations.
|
5
|
+
# See 'docs/contributors/deprecations.md' for information on configuration options.
|
6
|
+
|
7
|
+
deprecations:
|
8
|
+
- component: "Primer::Alpha::AutoComplete"
|
9
|
+
autocorrect: true
|
10
|
+
replacement: "Primer::Beta::AutoComplete"
|
11
|
+
|
12
|
+
- component: "Primer::Alpha::AutoComplete::Item"
|
13
|
+
autocorrect: true
|
14
|
+
replacement: "Primer::Beta::AutoComplete::Item"
|
15
|
+
|
16
|
+
- component: "Primer::BlankslateComponent"
|
17
|
+
autocorrect: true
|
18
|
+
replacement: "Primer::Beta::Blankslate"
|
19
|
+
|
20
|
+
- component: "Primer::ButtonComponent"
|
21
|
+
autocorrect: false
|
22
|
+
replacement: "Primer::Beta::Button"
|
23
|
+
guide: "https://primer.style/view-components/guides/primer_button_component"
|
24
|
+
|
25
|
+
- component: "Primer::IconButton"
|
26
|
+
autocorrect: true
|
27
|
+
replacement: "Primer::Beta::IconButton"
|
28
|
+
|
29
|
+
- component: "Primer::LayoutComponent"
|
30
|
+
autocorrect: false
|
31
|
+
replacement: "Primer::Alpha::Layout"
|
32
|
+
guide: "https://primer.style/view-components/guides/primer_layout_component"
|
33
|
+
|
34
|
+
- component: "Primer::Navigation::TabComponent"
|
35
|
+
autocorrect: true
|
36
|
+
replacement: "Primer::Alpha::Navigation::Tab"
|
37
|
+
|
38
|
+
- component: "Primer::Tooltip"
|
39
|
+
autocorrect: true
|
40
|
+
replacement: "Primer::Alpha::Tooltip"
|
41
|
+
|
42
|
+
- component: "Primer::Truncate"
|
43
|
+
autocorrect: false
|
44
|
+
replacement: "Primer::Beta::Truncate"
|
45
|
+
guide: "https://primer.style/view-components/guides/primer_truncate"
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# :nocov:
|
4
|
+
module Primer
|
5
|
+
class ExampleImage
|
6
|
+
BASE64_SRC = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA4AAAAOACAMAAABc6u1lAAAC+lBMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAFBgYMCwoXExA0KyVEODFWSD9oV0x6ZVmReGmYfm6ninmyk4G8m4jIpZHSrZjWsZvhuqPnvqfOqpW3l4SrjnyihnaKcmRwXVFMPzc7MSspIh5eTUSBa16bgXHBoIzwxq30yrHrwanctqDzybAgGhefg3N2YVX1zbX32cf54dP65dj76+L87+f76d743c331cH20Lr9+PX////98+3//v7++/r79PHt29jZtK/JlI28eW6yZ1y2bWHCgXTdvbjy5eTixcHOn5nCh3+5cmfTqKLmzcr27OusXFGvYVbq1dLv3tzir5nKinnZoY3SloTpuKENEhNBTEhkdG5ugHlOWlYfJCKEmpLD49egurAxQEMxOja518wUGRqatKt5jYW00cZaaGOVrqW/3tKow7kjLCyPp56a2fCb2e+c2vCZ1/Cb2fCc2u+c2vCe2eub2vCZ1+6Z2PCb2vCc2vCc2u+e2++c2vCb2e8jMDWuy8AXICOb2vCb2vCc2u+a2PCc2u+c3f6c2vCb2vCZ1++b2vCY1++b2u+b2O9Sc3+c2fBXeocvQ0mZ2fCc2vBdg5Bpk6KAs8V2pbVhiJab2fBpk6FObnt3qsAxRU2W0ueGu86TzuNxn6+Qyt5tmKdGY3CZ1usbJiuKwdWOxtpAWmU6UVlcgY4oOD6Z1++U0u6GxOp8uuZ+veeDwemLyeuOzOyJx+qRz+2W1e+S0O2Av+iMy+tciqt1sNljlrlReZaIxuqGxOmEwuiAv+iKyOqHxemFw+mDweg7Nu1hAAAA/nRSTlMAMGuRtc7m9f/Yy7qhh0ckAyBAXXyW+px3B0OqSxsSpdKtO98PNi1wsPBnF1D/xiqBY8BgDI3rWQn9VXMnJv///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yohl2zit/8K93NKwJP8D95T////fJ3pNqYDrdFCiFzKY/3w/6IY13jE//////////////////////////////////////////////////////+XwuP3ibXV7ty8AmoAAEHZSURBVHgB7MEBAQAQAAAgAPB/LxMMqAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2LKpbY+nt7m2ueyXx+IiXJRFIAPTgLHYHkYReyOyESwDrap+1/W33uxUvLI/ZZw+62WanUFkS/lNJ6brYfH8q+pcc2y3fYaHYiC6fK/uOVesz+AyMOw5o3GFv9LE6JgKvx/5ntv0oHIjjJKI5//z0exiKnF0yzbCxREBj68zEKe0UWhiIgXCHvPc4g0TRdtnxcYoVDEEy+zXHl1iHQMogeXl3GnKBCx5hXGmzVE0gal1ZKX+whRIBte59EbQCRnGMVLXiWGKBCf11rG2x1EElT/vctrLQcQhRHwFlZ7AnGv9f7AW3gQhfGONyq/THE70TnGvNEjRFEokzez2gFuI5z9gberQxTEhHd5OiqIq3VnS97DgyiIPe9kekOIa3yKyrzTI0RB+Lyb1apDXGrYPPB+DkQhGEzCsmdAXMJ5ZzEJJYhC2DAhdgPniPXoM5NhQxTCIxOzquEUYfSWTIo7hSiAOUlpwUwEMybpC0QBbElpwSwYMyarDVEAPSZt1cU/iXWPSTOhP6FCJs8O8FeiXlkyeWtoTwRMxfs1fifmLZdp+ArtCY/p+Nwe4Gdi17SYjgdoT9hMi7XZQajIZFpCBc0JZTE9ZqTwxvXLTFEAzYkJUzXu4y1b2zxFnkDhMWUP3/BWDVufma4ZNCdmTJtbneItUi8h03aA5sSB6TO3eHu6ZWbgO7QmHGbiKUC21HTgOIYRNH7WXyz6jZ8YP6k7znyH1A16zMQztCaOzMayNUR61PB70H9+2ezbvYfV2DfDJU+zDv54Fc9G7b0XfWl8GHSQKOVZzEYLQmt7ZuXwjITNjX7UbPXi8oF3s8yxPdp/PU6cjibX56+eILQWMzvxGkkYGouXfW/lu0zHYWy3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"
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
# :nocov:
|
5
|
+
# :nodoc:
|
6
|
+
class FormComponents
|
7
|
+
def self.from_input(input_klass)
|
8
|
+
Class.new(Primer::Component) do
|
9
|
+
@input_klass = input_klass
|
10
|
+
|
11
|
+
class << self
|
12
|
+
attr_reader :input_klass
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(**system_arguments)
|
16
|
+
@system_arguments = system_arguments
|
17
|
+
end
|
18
|
+
|
19
|
+
def render_in(view_context, &block)
|
20
|
+
builder = Primer::Forms::Builder.new(
|
21
|
+
nil, nil, view_context, {}
|
22
|
+
)
|
23
|
+
|
24
|
+
# `block` is the block passed to `#render`. We pass it to the
|
25
|
+
# input's constructor here to mimic the way constructors often
|
26
|
+
# yield in the forms framework. Only allowing the block to be
|
27
|
+
# passed to `#initialize` is awkward because `#render` is often
|
28
|
+
# called without parens, making it non-obvious which method the
|
29
|
+
# block is passed to. Moreover, users of view components expect
|
30
|
+
# `#render` to accept a block and for that block to yield the
|
31
|
+
# component, which allows setting slots, etc. They do not expect
|
32
|
+
# that block to be accepted by the component's initializer
|
33
|
+
# instead.
|
34
|
+
#
|
35
|
+
# One caveat here is that not all form input classes yield
|
36
|
+
# themselves to the block. In such a case, the block will
|
37
|
+
# never be called, which is potentially confusing. We could
|
38
|
+
# detect whether or not the block is called and yield the input
|
39
|
+
# if it is not, but that comes with its own set of problems and
|
40
|
+
# could also lead to confusion (for example, if the block is
|
41
|
+
# conditionally called with one set of arguments from the input
|
42
|
+
# and then a different set of arguments here). Since we can't
|
43
|
+
# know which arguments the input will yield, it's safer to simply
|
44
|
+
# pass the block as-is.
|
45
|
+
input = self.class.input_klass.new(
|
46
|
+
builder: builder,
|
47
|
+
form: nil,
|
48
|
+
**@system_arguments,
|
49
|
+
&block
|
50
|
+
)
|
51
|
+
|
52
|
+
input.to_component.render_in(view_context) { content }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pathname"
|
4
|
+
|
5
|
+
module Primer
|
6
|
+
module Forms
|
7
|
+
# :nodoc:
|
8
|
+
module ActsAsComponent
|
9
|
+
# :nodoc:
|
10
|
+
module InstanceMethods
|
11
|
+
delegate :render, :content_tag, :output_buffer, to: :@view_context
|
12
|
+
|
13
|
+
def render_in(view_context, &block)
|
14
|
+
@view_context = view_context
|
15
|
+
before_render
|
16
|
+
perform_render(&block)
|
17
|
+
end
|
18
|
+
|
19
|
+
# This is necessary to restore the functionality changed by https://github.com/rails/rails/pull/47194.
|
20
|
+
# I would love to remove this at some point, perhaps if we ever decide to replace
|
21
|
+
# ActsAsComponent with view component.
|
22
|
+
def capture(*args, &block)
|
23
|
+
old_buffer = @view_context.output_buffer
|
24
|
+
@view_context.output_buffer = ActionView::OutputBuffer.new
|
25
|
+
@view_context.capture(*args, &block)
|
26
|
+
ensure
|
27
|
+
@view_context.output_buffer = old_buffer
|
28
|
+
end
|
29
|
+
|
30
|
+
# :nocov:
|
31
|
+
def perform_render(&_block)
|
32
|
+
raise NotImplementedError, "subclasses must implement ##{__method__}."
|
33
|
+
end
|
34
|
+
# :nocov:
|
35
|
+
|
36
|
+
def before_render; end
|
37
|
+
|
38
|
+
# :nocov:
|
39
|
+
# rubocop:disable Naming/AccessorMethodName
|
40
|
+
def set_original_view_context(view_context)
|
41
|
+
@view_context = view_context
|
42
|
+
end
|
43
|
+
# rubocop:enable Naming/AccessorMethodName
|
44
|
+
# :nocov:
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.extended(base)
|
48
|
+
base.include(InstanceMethods)
|
49
|
+
end
|
50
|
+
|
51
|
+
TemplateGlob = Struct.new(:glob_pattern, :method_name, :on_compile_callback)
|
52
|
+
TemplateParams = Struct.new(:source, :identifier, :type, :format, keyword_init: true)
|
53
|
+
|
54
|
+
attr_accessor :template_root_path
|
55
|
+
|
56
|
+
def renders_templates(glob_pattern, method_name = nil, &block)
|
57
|
+
template_globs << TemplateGlob.new(glob_pattern, method_name, block)
|
58
|
+
end
|
59
|
+
alias renders_template renders_templates
|
60
|
+
|
61
|
+
def compile!
|
62
|
+
# always recompile in dev
|
63
|
+
return if defined?(@compiled) && @compiled && !Rails.env.development?
|
64
|
+
|
65
|
+
template_globs.each do |template_glob|
|
66
|
+
compile_templates_in(template_glob)
|
67
|
+
end
|
68
|
+
|
69
|
+
@compiled = true
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def template_globs
|
75
|
+
@template_globs ||= []
|
76
|
+
end
|
77
|
+
|
78
|
+
def compile_templates_in(template_glob)
|
79
|
+
pattern = if Pathname(template_glob.glob_pattern).absolute?
|
80
|
+
template_glob.glob_pattern
|
81
|
+
else
|
82
|
+
# skip compilation for anonymous form classes, as in tests
|
83
|
+
return unless template_root_path
|
84
|
+
|
85
|
+
File.join(template_root_path, template_glob.glob_pattern)
|
86
|
+
end
|
87
|
+
|
88
|
+
template_paths = Dir.glob(pattern)
|
89
|
+
|
90
|
+
raise "Cannot compile multiple templates with the same method name." if template_paths.size > 1 && template_glob.method_name
|
91
|
+
|
92
|
+
template_paths.each do |template_path|
|
93
|
+
method_name = template_glob.method_name
|
94
|
+
method_name ||= "render_#{File.basename(template_path).chomp('.html.erb')}"
|
95
|
+
define_template_method(template_path, method_name)
|
96
|
+
template_glob&.on_compile_callback&.call(template_path)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def define_template_method(template_path, method_name)
|
101
|
+
# rubocop:disable Style/DocumentDynamicEvalDefinition
|
102
|
+
# rubocop:disable Style/EvalWithLocation
|
103
|
+
class_eval <<-RUBY, template_path, 0
|
104
|
+
private def #{method_name}
|
105
|
+
capture { #{compile_template(template_path)} }
|
106
|
+
end
|
107
|
+
RUBY
|
108
|
+
# rubocop:enable Style/EvalWithLocation
|
109
|
+
# rubocop:enable Style/DocumentDynamicEvalDefinition
|
110
|
+
end
|
111
|
+
|
112
|
+
def compile_template(path)
|
113
|
+
handler = ActionView::Template.handler_for_extension("erb")
|
114
|
+
template = File.read(path)
|
115
|
+
template_params = TemplateParams.new({
|
116
|
+
source: template,
|
117
|
+
identifier: __FILE__,
|
118
|
+
type: "text/html",
|
119
|
+
format: "text/html"
|
120
|
+
})
|
121
|
+
|
122
|
+
# change @output_buffer ivar to output_buffer method call
|
123
|
+
BufferRewriter.rewrite(
|
124
|
+
handler.call(template_params, template)
|
125
|
+
)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|