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,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module Forms
|
5
|
+
module Dsl
|
6
|
+
# :nodoc:
|
7
|
+
class FormObject
|
8
|
+
include InputMethods
|
9
|
+
|
10
|
+
attr_reader :builder, :form
|
11
|
+
|
12
|
+
def initialize(builder:, form:)
|
13
|
+
@builder = builder
|
14
|
+
@form = form
|
15
|
+
|
16
|
+
yield(self) if block_given?
|
17
|
+
end
|
18
|
+
|
19
|
+
def group(**options, &block)
|
20
|
+
add_input InputGroup.new(builder: @builder, form: @form, **options, &block)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module Forms
|
5
|
+
module Dsl
|
6
|
+
# :nodoc:
|
7
|
+
class FormReferenceInput < Input
|
8
|
+
attr_reader :ref_block, :fields_for_args, :fields_for_kwargs, :nested
|
9
|
+
alias nested? nested
|
10
|
+
|
11
|
+
# Pass `nested: false` to prevent the referenced form fields from being treated as nested
|
12
|
+
# under the parent form's model. For example, consider these models:
|
13
|
+
|
14
|
+
# class User < ActiveRecord::Base
|
15
|
+
# has_many :addresses
|
16
|
+
# end
|
17
|
+
|
18
|
+
# class Address < ActiveRecord::Base
|
19
|
+
# belongs_to :user
|
20
|
+
# end
|
21
|
+
|
22
|
+
# A sign-up form might include fields from `User` as well as `Address`. Since addresses are
|
23
|
+
# associated with users, it's perfectly natural to accept the address fields as nested
|
24
|
+
# attributes. Rails will name each field accordingly. For example, the `street` field on
|
25
|
+
# `Address` will be named `user[address][street]`.
|
26
|
+
|
27
|
+
# For situations like this where an association exists between two models, the nested
|
28
|
+
# attributes approach works great. However sometimes all you want is to compose two forms
|
29
|
+
# together that aren't connected by an association. In such cases the fields will still
|
30
|
+
# include the name of the parent model, eg. `user[address][street]` instead of what we want,
|
31
|
+
# `address[street]`. To render the form independent of the parent, pass `nested: false`.
|
32
|
+
def initialize(*fields_for_args, builder:, form:, nested: true, **fields_for_kwargs, &block)
|
33
|
+
@fields_for_args = fields_for_args
|
34
|
+
@fields_for_kwargs = fields_for_kwargs
|
35
|
+
@nested = nested
|
36
|
+
@ref_block = block
|
37
|
+
|
38
|
+
super(builder: builder, form: form, **fields_for_kwargs)
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_component
|
42
|
+
FormReference.new(input: self)
|
43
|
+
end
|
44
|
+
|
45
|
+
def name
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
def label
|
50
|
+
nil
|
51
|
+
end
|
52
|
+
|
53
|
+
def type
|
54
|
+
:form
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module Forms
|
5
|
+
module Dsl
|
6
|
+
# :nodoc:
|
7
|
+
class HiddenInput < Input
|
8
|
+
attr_reader :name
|
9
|
+
|
10
|
+
def initialize(name:, **system_arguments)
|
11
|
+
@name = name
|
12
|
+
super(**system_arguments)
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_component
|
16
|
+
HiddenField.new(input: self)
|
17
|
+
end
|
18
|
+
|
19
|
+
def label
|
20
|
+
nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def type
|
24
|
+
:hidden
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,315 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module Forms
|
5
|
+
module Dsl
|
6
|
+
# :nodoc:
|
7
|
+
class Input
|
8
|
+
# Use this macro anywhere you want to include the various params all inputs can receive.
|
9
|
+
#
|
10
|
+
# @!macro [new] form_input_arguments
|
11
|
+
# @param name [String] Value for the HTML name attribute.
|
12
|
+
# @param id [String] Value for the HTML id attribute.
|
13
|
+
# @param class [String] CSS classes to include in the input's HTML `class` attribute. Exists for compatibility with Rails form builders.
|
14
|
+
# @param classes [Array] CSS classes to include in the input's HTML `class` attribute. Combined with the `:class` argument. The list may contain strings, hashes, or `nil` values, and is automatically cleaned up by Primer's [`class_name` helper](https://github.com/primer/view_components/blob/c9cb95c98fee3e2e27f4a10683f555e22285e7f1/app/lib/primer/class_name_helper.rb) (`nils`, falsy entries, and blank strings are ignored).
|
15
|
+
# @param caption [String] A string describing the field and what sorts of input it expects. Displayed below the input.
|
16
|
+
# @param label [String] Label text displayed above the input.
|
17
|
+
# @param visually_hide_label [Boolean] When set to `true`, hides the label. Although the label will be hidden visually, it will still be visible to screen readers.
|
18
|
+
# @param disabled [Boolean] When set to `true`, the input will not accept keyboard or mouse input.
|
19
|
+
# @param hidden [Boolean] When set to `true`, visually hides the field.
|
20
|
+
# @param invalid [Boolean] If set to `true`, the input will be rendered with a red border. Implied if `validation_message` is truthy. This option is set to `true` automatically if the model object associated with the form reports that the input is invalid via Rails validations. It is provided for cases where the form does not have an associated model. If the input is invalid as determined by Rails validations, setting `invalid` to `false` will have no effect.
|
21
|
+
# @param validation_message [String] A string displayed between the caption and the input indicating the input's contents are invalid. This option is, by default, set to the first Rails validation message for the input (assuming the form is associated with a model object). Use `validation_message` to override the default or to provide a validation message in case there is no associated model object.
|
22
|
+
# @param label_arguments [Hash] Attributes that will be passed to Rails' `builder.label` method. These can be HTML attributes or any of the other label options Rails supports. They will appear as HTML attributes on the `<label>` tag.
|
23
|
+
# @param scope_name_to_model [Boolean] Default `true`. When set to `false`, prevents the model name from prefixing the field name. For example, if the field name is `my_field`, Rails will normally emit an HTML name attribute of `model[my_field]`. Setting `scope_name_to_model` to `false` will cause Rails to emit `my_field` instead.
|
24
|
+
# @param scope_id_to_model [Boolean] Default `true`. When set to `false`, prevents the model name from prefixing the field ID. For example, if the field name is `my_field`, Rails will normally emit an HTML ID attribute of `model_my_field`. Setting `scope_id_to_model` to `false` will cause Rails to emit `my_field` instead.
|
25
|
+
# @param required [Boolean] Default `false`. When set to `true`, causes an asterisk (*) to appear next to the field's label indicating it is a required field. Note that this option explicitly does _not_ add a `required` HTML attribute. Doing so would enable native browser validations, which are inaccessible and inconsistent with the Primer design system.
|
26
|
+
# @param aria [Hash] Key/value pairs that represent Aria attributes and their values. Eg. `aria: { current: true }` becomes `aria-current="true"`.
|
27
|
+
# @param data [Hash] Key/value pairs that represent data attributes and their values. Eg. `data: { foo: "bar" }` becomes `data-foo="bar"`.
|
28
|
+
# @macro form_system_arguments
|
29
|
+
|
30
|
+
# @!macro [new] form_size_arguments
|
31
|
+
# @param size [Symbol] The size of the field. <%= one_of(Primer::Forms::Dsl::Input::SIZE_OPTIONS) %>
|
32
|
+
|
33
|
+
# @!macro [new] form_full_width_arguments
|
34
|
+
# @param full_width [Boolean] When set to `true`, the field will take up all the horizontal space allowed by its container.
|
35
|
+
|
36
|
+
# @!macro [new] form_system_arguments
|
37
|
+
# @param system_arguments [Hash] A hash of attributes passed to the underlying Rails builder methods. These options may mean something special depending on the type of input, otherwise they are emitted as HTML attributes. See the [Rails documentation](https://guides.rubyonrails.org/form_helpers.html) for more information. In addition, the usual Primer utility arguments are accepted in system arguments. For example, passing `mt: 2` will add the `mt-2` class to the input. See the Primer system arguments docs for details.
|
38
|
+
|
39
|
+
SPACE_DELIMITED_ARIA_ATTRIBUTES = %i[describedby].freeze
|
40
|
+
DEFAULT_SIZE = :medium
|
41
|
+
SIZE_MAPPINGS = {
|
42
|
+
:small => "FormControl-small",
|
43
|
+
DEFAULT_SIZE => "FormControl-medium",
|
44
|
+
:large => "FormControl-large"
|
45
|
+
}.freeze
|
46
|
+
SIZE_OPTIONS = SIZE_MAPPINGS.keys
|
47
|
+
|
48
|
+
include Primer::ClassNameHelper
|
49
|
+
|
50
|
+
attr_reader :builder, :form, :input_arguments, :label_arguments, :caption, :validation_message, :ids, :form_control, :base_id
|
51
|
+
|
52
|
+
alias form_control? form_control
|
53
|
+
|
54
|
+
def initialize(builder:, form:, **system_arguments)
|
55
|
+
@builder = builder
|
56
|
+
@form = form
|
57
|
+
|
58
|
+
@input_arguments = system_arguments
|
59
|
+
@label_arguments = @input_arguments.delete(:label_arguments) || {}
|
60
|
+
|
61
|
+
@label_arguments[:class] = class_names(
|
62
|
+
@label_arguments[:class],
|
63
|
+
@input_arguments.fetch(:visually_hide_label, false) ? "sr-only" : nil
|
64
|
+
)
|
65
|
+
|
66
|
+
@input_arguments.delete(:visually_hide_label)
|
67
|
+
|
68
|
+
@input_arguments.delete(:class) if @input_arguments[:class].blank?
|
69
|
+
@label_arguments.delete(:class) if @label_arguments[:class].blank?
|
70
|
+
|
71
|
+
@caption = @input_arguments.delete(:caption)
|
72
|
+
@validation_message = @input_arguments.delete(:validation_message)
|
73
|
+
@invalid = @input_arguments.delete(:invalid)
|
74
|
+
@full_width = @input_arguments.delete(:full_width)
|
75
|
+
@size = @input_arguments.delete(:size)
|
76
|
+
|
77
|
+
# If scope_name_to_model is false, the name of the input for eg. `my_field`
|
78
|
+
# will be `my_field` instead of the Rails default of `model[my_field]`.
|
79
|
+
#
|
80
|
+
# We achieve this by passing the `name` option to Rails form builder
|
81
|
+
# methods. These methods will use the passed name if provided instead
|
82
|
+
# of generating a scoped one.
|
83
|
+
#
|
84
|
+
# rubocop:disable Style/IfUnlessModifier
|
85
|
+
unless @input_arguments.delete(:scope_name_to_model) { true }
|
86
|
+
@input_arguments[:name] = name
|
87
|
+
end
|
88
|
+
# rubocop:enable Style/IfUnlessModifier
|
89
|
+
|
90
|
+
# If scope_id_to_model is false, the name of the input for eg. `my_field`
|
91
|
+
# will be `my_field` instead of the Rails default of `model_my_field`.
|
92
|
+
#
|
93
|
+
# We achieve this by passing the `id` option to Rails form builder
|
94
|
+
# methods. These methods will use the passed id if provided instead
|
95
|
+
# of generating a scoped one. The id is the name of the field unless
|
96
|
+
# explicitly provided in system_arguments.
|
97
|
+
#
|
98
|
+
# rubocop:disable Style/IfUnlessModifier
|
99
|
+
unless @input_arguments.delete(:scope_id_to_model) { true }
|
100
|
+
@input_arguments[:id] = @input_arguments.delete(:id) { name }
|
101
|
+
end
|
102
|
+
# rubocop:enable Style/IfUnlessModifier
|
103
|
+
|
104
|
+
# Whether or not to wrap the component in a FormControl, which renders a
|
105
|
+
# label above and validation message beneath the input.
|
106
|
+
@form_control = @input_arguments.delete(:form_control) { true }
|
107
|
+
|
108
|
+
@input_arguments[:invalid] = "true" if invalid?
|
109
|
+
|
110
|
+
@base_id = SecureRandom.uuid
|
111
|
+
|
112
|
+
@ids = {}.tap do |id_map|
|
113
|
+
id_map[:validation] = "validation-#{@base_id}"
|
114
|
+
id_map[:caption] = "caption-#{@base_id}" if caption? || caption_template?
|
115
|
+
end
|
116
|
+
|
117
|
+
add_input_aria(:required, true) if required?
|
118
|
+
add_input_aria(:describedby, ids.values) if ids.any?
|
119
|
+
|
120
|
+
# avoid browser-native validation, which doesn't match Primer's style
|
121
|
+
input_arguments.delete(:required)
|
122
|
+
end
|
123
|
+
|
124
|
+
def add_input_classes(*class_names)
|
125
|
+
input_arguments[:class] = class_names(
|
126
|
+
input_arguments[:class], *class_names
|
127
|
+
)
|
128
|
+
end
|
129
|
+
|
130
|
+
def add_label_classes(*class_names)
|
131
|
+
label_arguments[:class] = class_names(
|
132
|
+
label_arguments[:class], *class_names
|
133
|
+
)
|
134
|
+
end
|
135
|
+
|
136
|
+
def add_input_aria(key, value)
|
137
|
+
@input_arguments[:aria] ||= {}
|
138
|
+
|
139
|
+
@input_arguments[:aria][key] = if space_delimited_aria_attribute?(key)
|
140
|
+
aria_join(@input_arguments[:aria][key], *Array(value))
|
141
|
+
else
|
142
|
+
value
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def add_input_data(key, value)
|
147
|
+
input_data[key] = value
|
148
|
+
end
|
149
|
+
|
150
|
+
# :nocov:
|
151
|
+
def remove_input_data(key)
|
152
|
+
input_data.delete(key)
|
153
|
+
end
|
154
|
+
# :nocov:
|
155
|
+
|
156
|
+
def merge_input_arguments!(arguments)
|
157
|
+
arguments.each do |k, v|
|
158
|
+
case k
|
159
|
+
when :class, :classes, "class", "classes"
|
160
|
+
add_input_classes(v)
|
161
|
+
when :aria, "aria"
|
162
|
+
v.each do |aria_k, aria_v|
|
163
|
+
add_input_aria(aria_k, aria_v)
|
164
|
+
end
|
165
|
+
when :data, "data"
|
166
|
+
v.each do |data_k, data_v|
|
167
|
+
add_input_data(data_k, data_v)
|
168
|
+
end
|
169
|
+
else
|
170
|
+
@input_arguments[k] = v
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def validation_id
|
176
|
+
ids[:validation]
|
177
|
+
end
|
178
|
+
|
179
|
+
def caption_id
|
180
|
+
ids[:caption]
|
181
|
+
end
|
182
|
+
|
183
|
+
def caption?
|
184
|
+
caption.present?
|
185
|
+
end
|
186
|
+
|
187
|
+
def caption_template?
|
188
|
+
return false unless form
|
189
|
+
|
190
|
+
form.caption_template?(caption_template_name)
|
191
|
+
end
|
192
|
+
|
193
|
+
def render_caption_template
|
194
|
+
form.render_caption_template(caption_template_name)
|
195
|
+
end
|
196
|
+
|
197
|
+
def valid?
|
198
|
+
validation_messages.empty? && !@invalid
|
199
|
+
end
|
200
|
+
|
201
|
+
def invalid?
|
202
|
+
!valid?
|
203
|
+
end
|
204
|
+
|
205
|
+
def hidden?
|
206
|
+
!!input_arguments[:hidden]
|
207
|
+
end
|
208
|
+
|
209
|
+
def required?
|
210
|
+
input_arguments[:required] ||
|
211
|
+
input_arguments[:aria_required] ||
|
212
|
+
input_arguments[:"aria-required"] ||
|
213
|
+
input_arguments.dig(:aria, :required)
|
214
|
+
end
|
215
|
+
|
216
|
+
def disabled?
|
217
|
+
!!input_arguments[:disabled]
|
218
|
+
end
|
219
|
+
|
220
|
+
def full_width?
|
221
|
+
@full_width
|
222
|
+
end
|
223
|
+
|
224
|
+
def size
|
225
|
+
@size ||= SIZE_MAPPINGS.include?(@size) ? @size : DEFAULT_SIZE
|
226
|
+
end
|
227
|
+
|
228
|
+
def validation_messages
|
229
|
+
@validation_messages ||=
|
230
|
+
if validation_message
|
231
|
+
[validation_message]
|
232
|
+
elsif builder.object.respond_to?(:errors)
|
233
|
+
name ? builder.object.errors.full_messages_for(name) : []
|
234
|
+
else
|
235
|
+
[]
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
def autofocus!
|
240
|
+
input_arguments[:autofocus] = true
|
241
|
+
end
|
242
|
+
|
243
|
+
# :nocov:
|
244
|
+
def name
|
245
|
+
raise_for_abstract_method!(__method__)
|
246
|
+
end
|
247
|
+
|
248
|
+
def label
|
249
|
+
raise_for_abstract_method!(__method__)
|
250
|
+
end
|
251
|
+
|
252
|
+
def type
|
253
|
+
raise_for_abstract_method!(__method__)
|
254
|
+
end
|
255
|
+
|
256
|
+
def to_component
|
257
|
+
raise_for_abstract_method!(__method__)
|
258
|
+
end
|
259
|
+
# :nocov:
|
260
|
+
|
261
|
+
def focusable?
|
262
|
+
false
|
263
|
+
end
|
264
|
+
|
265
|
+
def input?
|
266
|
+
true
|
267
|
+
end
|
268
|
+
|
269
|
+
def validation_arguments
|
270
|
+
{
|
271
|
+
class: "FormControl-inlineValidation",
|
272
|
+
id: validation_id,
|
273
|
+
hidden: valid? || validation_messages.empty?
|
274
|
+
}
|
275
|
+
end
|
276
|
+
|
277
|
+
def validation_message_arguments
|
278
|
+
{}
|
279
|
+
end
|
280
|
+
|
281
|
+
private
|
282
|
+
|
283
|
+
def input_data
|
284
|
+
@input_arguments[:data] ||= {}
|
285
|
+
end
|
286
|
+
|
287
|
+
def caption_template_name
|
288
|
+
return nil unless name
|
289
|
+
|
290
|
+
@caption_template_name ||= if respond_to?(:value)
|
291
|
+
:"#{name}_#{value}"
|
292
|
+
else
|
293
|
+
name.to_sym
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
def space_delimited_aria_attribute?(attrib)
|
298
|
+
SPACE_DELIMITED_ARIA_ATTRIBUTES.include?(attrib)
|
299
|
+
end
|
300
|
+
|
301
|
+
def aria_join(*values)
|
302
|
+
values = values.flat_map { |v| v.to_s.split }
|
303
|
+
values.reject!(&:empty?)
|
304
|
+
values.join(" ")
|
305
|
+
end
|
306
|
+
|
307
|
+
# :nocov:
|
308
|
+
def raise_for_abstract_method!(method_name)
|
309
|
+
raise NotImplementedError, "subclasses must implement ##{method_name}."
|
310
|
+
end
|
311
|
+
# :nocov:
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
315
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module Forms
|
5
|
+
module Dsl
|
6
|
+
# :nodoc:
|
7
|
+
class InputGroup
|
8
|
+
include InputMethods
|
9
|
+
|
10
|
+
attr_reader :builder, :form, :system_arguments
|
11
|
+
|
12
|
+
def initialize(builder:, form:, **system_arguments)
|
13
|
+
@builder = builder
|
14
|
+
@form = form
|
15
|
+
@system_arguments = system_arguments
|
16
|
+
|
17
|
+
yield(self) if block_given?
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_component
|
21
|
+
Group.new(inputs: inputs, builder: builder, form: form, **@system_arguments)
|
22
|
+
end
|
23
|
+
|
24
|
+
def type
|
25
|
+
:group
|
26
|
+
end
|
27
|
+
|
28
|
+
def input?
|
29
|
+
true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module Forms
|
5
|
+
module Dsl
|
6
|
+
# :nodoc:
|
7
|
+
module InputMethods
|
8
|
+
# Used to render another form object.
|
9
|
+
#
|
10
|
+
# @param args [Array] Positional arguments passed to Rails' [`fields_for` helper](https://api.rubyonrails.org/v7.0.4/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for).
|
11
|
+
# @param kwargs [Hash] The options accepted by the form reference input (see forms docs). Includes keyword arguments passed to Rails' [`fields_for` helper](https://api.rubyonrails.org/v7.0.4/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for).
|
12
|
+
def fields_for(*args, **kwargs, &block)
|
13
|
+
add_input FormReferenceInput.new(*args, builder: builder, form: form, **kwargs, &block)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Adds a multi input to this form.
|
17
|
+
#
|
18
|
+
# @param options [Hash] The options accepted by the multi input (see forms docs).
|
19
|
+
# @param block [Proc] A block that will be yielded a reference to the input object so it can be customized.
|
20
|
+
def multi(**options, &block)
|
21
|
+
add_input MultiInput.new(builder: builder, form: form, **options, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Adds a hidden input to this form.
|
25
|
+
#
|
26
|
+
# @param options [Hash] The options accepted by the hidden input (see forms docs).
|
27
|
+
def hidden(**options)
|
28
|
+
add_input HiddenInput.new(builder: builder, form: form, **options)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Adds a check box to this form.
|
32
|
+
#
|
33
|
+
# @param options [Hash] The options accepted by the check box input (see forms docs).
|
34
|
+
# @param block [Proc] A block that will be yielded a reference to the input object so it can be customized.
|
35
|
+
def check_box(**options, &block)
|
36
|
+
add_input CheckBoxInput.new(builder: builder, form: form, **options, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Adds a radio button group to this form.
|
40
|
+
#
|
41
|
+
# @param options [Hash] The options accepted by the radio button group input (see forms docs).
|
42
|
+
# @param block [Proc] A block that will be yielded a reference to the input object so it can be customized.
|
43
|
+
def radio_button_group(**options, &block)
|
44
|
+
add_input RadioButtonGroupInput.new(builder: builder, form: form, **options, &block)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Adds a check box group to this form.
|
48
|
+
#
|
49
|
+
# @param options [Hash] The options accepted by the check box group input (see forms docs).
|
50
|
+
# @param block [Proc] A block that will be yielded a reference to the input object so it can be customized.
|
51
|
+
def check_box_group(**options, &block)
|
52
|
+
add_input CheckBoxGroupInput.new(builder: builder, form: form, **options, &block)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Adds a horizontal separator to the form.
|
56
|
+
def separator
|
57
|
+
add_input Separator.new
|
58
|
+
end
|
59
|
+
|
60
|
+
# START text input methods
|
61
|
+
|
62
|
+
# Adds a text field to this form.
|
63
|
+
#
|
64
|
+
# @param options [Hash] The options accepted by the text field input (see forms docs).
|
65
|
+
# @param block [Proc] A block that will be yielded a reference to the input object so it can be customized.
|
66
|
+
def text_field(**options, &block)
|
67
|
+
options = decorate_options(**options)
|
68
|
+
add_input TextFieldInput.new(builder: builder, form: form, **options, &block)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Adds a text area to this form.
|
72
|
+
#
|
73
|
+
# @param options [Hash] The options accepted by the text area input (see forms docs).
|
74
|
+
# @param block [Proc] A block that will be yielded a reference to the input object so it can be customized.
|
75
|
+
def text_area(**options, &block)
|
76
|
+
options = decorate_options(**options)
|
77
|
+
add_input TextAreaInput.new(builder: builder, form: form, **options, &block)
|
78
|
+
end
|
79
|
+
|
80
|
+
# END text input methods
|
81
|
+
|
82
|
+
# START select input methods
|
83
|
+
|
84
|
+
# Adds a select list to this form.
|
85
|
+
#
|
86
|
+
# @param options [Hash] The options accepted by the select list input (see forms docs).
|
87
|
+
# @param block [Proc] A block that will be yielded a reference to the input object so it can be customized.
|
88
|
+
def select_list(**options, &block)
|
89
|
+
options = decorate_options(**options)
|
90
|
+
add_input SelectInput.new(builder: builder, form: form, **options, &block)
|
91
|
+
end
|
92
|
+
|
93
|
+
# END select input methods
|
94
|
+
|
95
|
+
# START button input methods
|
96
|
+
|
97
|
+
# Adds a submit button to this form.
|
98
|
+
#
|
99
|
+
# @param options [Hash] The options accepted by the submit button input (see forms docs).
|
100
|
+
# @param block [Proc] A block that will be yielded a reference to the input object so it can be customized.
|
101
|
+
def submit(**options, &block)
|
102
|
+
options = decorate_options(**options)
|
103
|
+
add_input SubmitButtonInput.new(builder: builder, form: form, **options, &block)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Adds a (non-submit) button to this form.
|
107
|
+
#
|
108
|
+
# @param options [Hash] The options accepted by the button input (see forms docs).
|
109
|
+
# @param block [Proc] A block that will be yielded a reference to the input object so it can be customized.
|
110
|
+
def button(**options, &block)
|
111
|
+
options = decorate_options(**options)
|
112
|
+
add_input ButtonInput.new(builder: builder, form: form, **options, &block)
|
113
|
+
end
|
114
|
+
|
115
|
+
# END button input methods
|
116
|
+
|
117
|
+
# @private
|
118
|
+
def inputs
|
119
|
+
@inputs ||= []
|
120
|
+
end
|
121
|
+
|
122
|
+
private
|
123
|
+
|
124
|
+
# @private
|
125
|
+
def add_input(input)
|
126
|
+
inputs << input
|
127
|
+
end
|
128
|
+
|
129
|
+
# @private
|
130
|
+
#
|
131
|
+
# Called before the corresponding Input class is instantiated. The return value of this method is passed
|
132
|
+
# to the Input class's constructor.
|
133
|
+
def decorate_options(**options)
|
134
|
+
options
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module Forms
|
5
|
+
module Dsl
|
6
|
+
# :nodoc:
|
7
|
+
class MultiInput < Input
|
8
|
+
include InputMethods
|
9
|
+
|
10
|
+
attr_reader :name, :label
|
11
|
+
|
12
|
+
def initialize(name:, label:, **system_arguments)
|
13
|
+
@name = name
|
14
|
+
@label = label
|
15
|
+
|
16
|
+
super(**system_arguments)
|
17
|
+
|
18
|
+
yield(self) if block_given?
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_component
|
22
|
+
Multi.new(input: self)
|
23
|
+
end
|
24
|
+
|
25
|
+
def type
|
26
|
+
:multi
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def add_input(input)
|
32
|
+
super
|
33
|
+
|
34
|
+
check_one_input_visible!
|
35
|
+
end
|
36
|
+
|
37
|
+
def decorate_options(name:, **options)
|
38
|
+
new_options = { name: @name, label: nil, form_control: false, **options }
|
39
|
+
new_options[:data] ||= {}
|
40
|
+
new_options[:data][:name] = name
|
41
|
+
new_options[:data][:targets] = "primer-multi-input.fields"
|
42
|
+
new_options[:id] = nil if options[:hidden]
|
43
|
+
new_options[:disabled] = true if options[:hidden] # disable to avoid submitting to server
|
44
|
+
new_options
|
45
|
+
end
|
46
|
+
|
47
|
+
def check_one_input_visible!
|
48
|
+
return if inputs.count { |input| !input.hidden? } <= 1
|
49
|
+
|
50
|
+
raise ArgumentError, "Only one input can be visible at a time in a `multi' block."
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module Forms
|
5
|
+
module Dsl
|
6
|
+
# :nodoc:
|
7
|
+
class RadioButtonGroupInput < Input
|
8
|
+
attr_reader :name, :label, :radio_buttons
|
9
|
+
|
10
|
+
def initialize(name:, label: nil, **system_arguments)
|
11
|
+
@name = name
|
12
|
+
@label = label
|
13
|
+
@radio_buttons = []
|
14
|
+
|
15
|
+
super(**system_arguments)
|
16
|
+
|
17
|
+
yield(self) if block_given?
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_component
|
21
|
+
RadioButtonGroup.new(input: self)
|
22
|
+
end
|
23
|
+
|
24
|
+
def type
|
25
|
+
:radio_button_group
|
26
|
+
end
|
27
|
+
|
28
|
+
def radio_button(**system_arguments, &block)
|
29
|
+
@radio_buttons << RadioButtonInput.new(
|
30
|
+
builder: @builder, form: @form, name: @name, disabled: disabled?,
|
31
|
+
**system_arguments, &block
|
32
|
+
)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|