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,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module Alpha
|
5
|
+
RadioButtonGroup = Primer::FormComponents.from_input(Primer::Forms::Dsl::RadioButtonGroupInput)
|
6
|
+
|
7
|
+
# A group of mutually exclusive radio buttons.
|
8
|
+
#
|
9
|
+
# @form_usage
|
10
|
+
# class ExampleForm < ApplicationForm
|
11
|
+
# form do |example_form|
|
12
|
+
# example_form.radio_button_group(attributes) do |group|
|
13
|
+
# group.radio_button(radio_button_attributes)
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
class RadioButtonGroup < Primer::Component
|
18
|
+
status :alpha
|
19
|
+
|
20
|
+
# @!method initialize
|
21
|
+
#
|
22
|
+
# @param name [String] Value for the HTML name attribute.
|
23
|
+
# @param label [String] Label text displayed above the input.
|
24
|
+
# @param hidden [Boolean] When set to `true`, visually hides the group.
|
25
|
+
# @param caption [String] A string describing the field and what sorts of input it expects. Displayed below the group.
|
26
|
+
# @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.
|
27
|
+
|
28
|
+
# @!method radio_button
|
29
|
+
#
|
30
|
+
# Adds a radio button to the group.
|
31
|
+
#
|
32
|
+
# @param system_arguments [Hash] The arguments accepted by <%= link_to_component(Primer::Alpha::RadioButton) %>.
|
33
|
+
# @param block [Proc] The block accepted by <%= link_to_component(Primer::Alpha::RadioButton) %>.
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<li class="<%= class_names(
|
2
|
+
"SegmentedControl-item",
|
3
|
+
"SegmentedControl-item--selected": @selected
|
4
|
+
) %>" role="listitem" data-targets="segmented-control.items">
|
5
|
+
<% if @hide_labels %>
|
6
|
+
<%= render Primer::Beta::IconButton.new(icon: @icon, "aria-label": @label, **@system_arguments) %>
|
7
|
+
<% else %>
|
8
|
+
<%= render Primer::Beta::Button.new(**@system_arguments) do |button| %>
|
9
|
+
<% button.with_leading_visual_icon(icon: @icon) unless @icon.nil? %>
|
10
|
+
<%= @label %>
|
11
|
+
<% end %>
|
12
|
+
<% end %>
|
13
|
+
</li>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module Alpha
|
5
|
+
class SegmentedControl
|
6
|
+
# SegmentedControl::Item is a private component that is only used by SegmentedControl
|
7
|
+
# It wraps the Button and IconButton components to provide the correct styles
|
8
|
+
class Item < Primer::BaseComponent
|
9
|
+
status :alpha
|
10
|
+
audited_at "2023-02-01"
|
11
|
+
|
12
|
+
# @param label [String] The label to use
|
13
|
+
# @param selected [Boolean] Whether the item is selected
|
14
|
+
# @param icon [Symbol] The icon to use
|
15
|
+
# @param hide_labels [Symbol] Whether to only show the icon
|
16
|
+
def initialize(label:, selected: false, icon: nil, hide_labels: false, **system_arguments)
|
17
|
+
@icon = icon
|
18
|
+
@hide_labels = hide_labels
|
19
|
+
@label = label
|
20
|
+
@selected = selected
|
21
|
+
|
22
|
+
@system_arguments = system_arguments
|
23
|
+
@system_arguments[:"data-action"] = "click:segmented-control#select" if system_arguments[:href].nil?
|
24
|
+
@system_arguments[:"aria-current"] = selected
|
25
|
+
@system_arguments[:scheme] = :invisible
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
.SegmentedControl{background-color:var(--controlTrack-bgColor-rest,var(--color-segmented-control-bg));border-radius:var(--borderRadius-medium,6px);display:inline-flex;list-style:none}.SegmentedControl-item{border:var(--borderWidth-thin,max(1px,.0625rem)) solid #0000;border-radius:var(--borderRadius-medium,6px);display:inline-flex;padding:var(--control-xsmall-paddingInline-condensed,.25rem);position:relative}.SegmentedControl-item .Button--invisible:hover:not(:disabled){background-color:var(--controlTrack-bgColor-hover,var(--color-action-list-item-default-hover-bg))}.SegmentedControl-item .Button--invisible:active:not(:disabled){background-color:var(--controlTrack-bgColor-active,var(--color-action-list-item-default-active-bg))}.SegmentedControl-item.SegmentedControl-item--selected{background-color:var(--controlKnob-bgColor-rest,var(--color-segmented-control-button-bg));border-color:var(--controlKnob-borderColor-rest,var(--color-segmented-control-button-selected-border))}.SegmentedControl-item.SegmentedControl-item--selected .Button{font-weight:var(--base-text-weight-semibold,600)}.SegmentedControl-item.SegmentedControl-item--selected .Button:hover{background-color:initial}.SegmentedControl-item.SegmentedControl-item--selected:before{border-color:#0000!important}.SegmentedControl-item.SegmentedControl-item--selected+.SegmentedControl-item:before{border-color:#0000}.SegmentedControl-item .Button-label[data-content]:before{content:attr(data-content);display:block;font-weight:var(--base-text-weight-semibold,600);height:0;visibility:hidden}.SegmentedControl-item:not(:first-child):before{border-left:var(--borderWidth-thin,max(1px,.0625rem)) solid var(--borderColor-default,var(--color-border-default));content:"";inset:0 0 0 -1px;margin-bottom:var(--control-medium-paddingBlock,.375rem);margin-top:var(--control-medium-paddingBlock,.375rem);position:absolute}.SegmentedControl-item .Button{border:0;color:var(--button-default-fgColor-rest,var(--color-btn-text));font-weight:var(--base-text-weight-normal,400);transition:none}.SegmentedControl-item .Button:focus-visible{border-radius:calc(var(--borderRadius-medium,6px) - 5px);outline-offset:calc(var(--control-xsmall-paddingInline-condensed,.25rem) - var(--borderWidth-thin,max(1px, .0625rem)))}.SegmentedControl-item .Button--small{height:calc(var(--control-small-size,1.75rem) - var(--control-xsmall-paddingInline-condensed,.25rem)*2 - var(--borderWidth-thin,max(1px, .0625rem))*2);padding:0 calc(var(--control-small-paddingInline-condensed,.5rem) - var(--control-xsmall-paddingInline-condensed,.25rem))}.SegmentedControl-item .Button--small.Button--iconOnly{width:calc(var(--control-medium-size,2rem) - var(--control-xsmall-paddingInline-condensed,.25rem)*2 - var(--borderWidth-thin,max(1px, .0625rem))*2)}.SegmentedControl-item .Button--small.Button--iconOnly:before{content:"";height:100%;left:50%;min-height:var(--control-medium-size,2rem);min-width:var(--control-medium-size,2rem);position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:100%}.SegmentedControl-item .Button--medium{height:calc(var(--control-medium-size,2rem) - var(--control-xsmall-paddingInline-condensed,.25rem)*2 - var(--borderWidth-thin,max(1px, .0625rem))*2);padding:0 calc(var(--control-medium-paddingInline-normal,.75rem) - var(--control-xsmall-paddingInline-condensed,.25rem))}.SegmentedControl-item .Button--medium.Button--iconOnly{width:calc(var(--control-medium-size,2rem) - var(--control-xsmall-paddingInline-condensed,.25rem)*2 - var(--borderWidth-thin,max(1px, .0625rem))*2)}.SegmentedControl-item .Button--medium.Button--iconOnly:before{content:"";height:100%;left:50%;min-height:var(--control-medium-size,2rem);min-width:var(--control-medium-size,2rem);position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:100%}.SegmentedControl-item .Button--large{height:calc(var(--control-large-size,2.5rem) - var(--control-xsmall-paddingInline-condensed,.25rem)*2 - var(--borderWidth-thin,max(1px, .0625rem))*2);padding:0 calc(var(--control-large-paddingInline-spacious,1rem) - var(--control-xsmall-paddingInline-condensed,.25rem))}.SegmentedControl-item .Button--large.Button--iconOnly{width:calc(var(--control-large-size,2.5rem) - var(--control-xsmall-paddingInline-condensed,.25rem)*2 - var(--borderWidth-thin,max(1px, .0625rem))*2)}.SegmentedControl-item .Button--large.Button--iconOnly:before{content:"";height:100%;left:50%;min-height:var(--control-large-size,2.5rem);min-width:var(--control-large-size,2.5rem);position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:100%}.SegmentedControl-item .Button--iconOnly{padding:initial}.SegmentedControl-item .Button--invisible.Button--invisible-noVisuals .Button-label{color:var(--button-default-fgColor-rest,var(--color-btn-text))}.SegmentedControl--fullWidth{display:flex}.SegmentedControl--fullWidth .SegmentedControl-item{flex:1;justify-content:center}.SegmentedControl--fullWidth .Button--iconOnly,.SegmentedControl--fullWidth .Button-withTooltip{width:100%}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
{
|
2
|
+
"name": "alpha/segmented_control",
|
3
|
+
"selectors": [
|
4
|
+
".SegmentedControl",
|
5
|
+
".SegmentedControl-item",
|
6
|
+
".SegmentedControl-item .Button--invisible:hover:not(:disabled)",
|
7
|
+
".SegmentedControl-item .Button--invisible:active:not(:disabled)",
|
8
|
+
".SegmentedControl-item.SegmentedControl-item--selected",
|
9
|
+
".SegmentedControl-item.SegmentedControl-item--selected .Button",
|
10
|
+
".SegmentedControl-item.SegmentedControl-item--selected .Button:hover",
|
11
|
+
".SegmentedControl-item.SegmentedControl-item--selected:before",
|
12
|
+
".SegmentedControl-item.SegmentedControl-item--selected+.SegmentedControl-item:before",
|
13
|
+
".SegmentedControl-item .Button-label[data-content]:before",
|
14
|
+
".SegmentedControl-item:not(:first-child):before",
|
15
|
+
".SegmentedControl-item .Button",
|
16
|
+
".SegmentedControl-item .Button:focus-visible",
|
17
|
+
".SegmentedControl-item .Button--small",
|
18
|
+
".SegmentedControl-item .Button--small.Button--iconOnly",
|
19
|
+
".SegmentedControl-item .Button--small.Button--iconOnly:before",
|
20
|
+
".SegmentedControl-item .Button--medium",
|
21
|
+
".SegmentedControl-item .Button--medium.Button--iconOnly",
|
22
|
+
".SegmentedControl-item .Button--medium.Button--iconOnly:before",
|
23
|
+
".SegmentedControl-item .Button--large",
|
24
|
+
".SegmentedControl-item .Button--large.Button--iconOnly",
|
25
|
+
".SegmentedControl-item .Button--large.Button--iconOnly:before",
|
26
|
+
".SegmentedControl-item .Button--iconOnly",
|
27
|
+
".SegmentedControl-item .Button--invisible.Button--invisible-noVisuals .Button-label",
|
28
|
+
".SegmentedControl--fullWidth",
|
29
|
+
".SegmentedControl--fullWidth .SegmentedControl-item",
|
30
|
+
".SegmentedControl--fullWidth .Button--iconOnly",
|
31
|
+
".SegmentedControl--fullWidth .Button-withTooltip"
|
32
|
+
]
|
33
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["segmented_control.pcss","<no source>"],"names":[],"mappings":"AAEA,kBAGE,mFAAqF,CACrF,4CAAyC,CAHzC,mBAAoB,CACpB,eAGF,CAEA,uBAGE,4DAAiD,CACjD,4CAAyC,CAFzC,mBAAoB,CAGpB,4DAAsD,CAJtD,iBAkIF,CA3HI,+DACE,iGACF,CAEA,gEACE,mGACF,CAIF,uDACE,yFAA2F,CAC3F,sGAiBF,CAfE,+DACE,gDAKF,CAHE,qEACE,wBACF,CAGF,8DACE,4BACF,CAEA,qFACE,kBACF,CAIF,0DAKE,0BAA2B,CAJ3B,aAAc,CAEd,gDAA6C,CAD7C,QAAS,CAET,iBAEF,CAIE,gDAME,kHAAqE,CADrE,UAAW,CAHX,gBAAiB,CAEjB,wDAAiD,CADjD,qDAA8C,CAF9C,iBAMF,CAIF,+BACE,QAAS,CAGT,8DAAyC,CAFzC,8CAA2C,CAC3C,eAOF,CAJE,6CAEE,wDAAqD,CADrD,sHAEF,CAGF,sCACE,sJAEC,CACD,yHAWF,CATE,uDACE,mJAOF,CAFI,8DC9FR,WAAA,YAAA,SAAA,2CAAA,0CAAA,kBAAA,QAAA,4CAAA,UD8FoF,CAKlF,uCACE,oJAEC,CACD,wHAWF,CATE,wDACE,mJAOF,CAFI,+DC/GR,WAAA,YAAA,SAAA,2CAAA,0CAAA,kBAAA,QAAA,4CAAA,UD+GoF,CAKlF,sCACE,qJAEC,CACD,uHAWF,CATE,uDACE,oJAOF,CAFI,8DChIR,WAAA,YAAA,SAAA,4CAAA,2CAAA,kBAAA,QAAA,4CAAA,UDgIkF,CAKhF,yCACE,eACF,CAEA,oFACE,8DACF,CAIF,6BACE,YAYF,CAVE,oDACE,MAAO,CACP,sBACF,CAGA,gGAEE,UACF","file":"segmented_control.css","sourcesContent":["/* SegmentedControl */\n\n.SegmentedControl {\n display: inline-flex;\n list-style: none;\n background-color: var(--controlTrack-bgColor-rest, var(--color-segmented-control-bg));\n border-radius: var(--borderRadius-medium);\n}\n\n.SegmentedControl-item {\n position: relative;\n display: inline-flex;\n border: var(--borderWidth-thin) solid transparent;\n border-radius: var(--borderRadius-medium);\n padding: var(--control-xsmall-paddingInline-condensed);\n\n & .Button--invisible {\n &:hover:not(:disabled) {\n background-color: var(--controlTrack-bgColor-hover, var(--color-action-list-item-default-hover-bg));\n }\n\n &:active:not(:disabled) {\n background-color: var(--controlTrack-bgColor-active, var(--color-action-list-item-default-active-bg));\n }\n }\n\n /* Selected ---------------------------------------- */\n &.SegmentedControl-item--selected {\n background-color: var(--controlKnob-bgColor-rest, var(--color-segmented-control-button-bg));\n border-color: var(--controlKnob-borderColor-rest, var(--color-segmented-control-button-selected-border));\n\n & .Button {\n font-weight: var(--base-text-weight-semibold);\n\n &:hover {\n background-color: transparent;\n }\n }\n\n &::before {\n border-color: transparent !important;\n }\n\n & + .SegmentedControl-item::before {\n border-color: transparent;\n }\n }\n\n /* renders a visibly hidden \"copy\" of the text in bold, reserving box space for when text becomes bold on selected */\n & .Button-label[data-content]::before {\n display: block;\n height: 0;\n font-weight: var(--base-text-weight-semibold);\n visibility: hidden;\n content: attr(data-content);\n }\n\n /* Separator lines */\n &:not(:first-child) {\n &::before {\n position: absolute;\n inset: 0 0 0 -1px;\n margin-top: var(--control-medium-paddingBlock);\n margin-bottom: var(--control-medium-paddingBlock);\n content: '';\n border-left: var(--borderWidth-thin) solid var(--borderColor-default);\n }\n }\n\n /* Button ----------------------------------------- */\n & .Button {\n border: 0;\n font-weight: var(--base-text-weight-normal);\n transition: none;\n color: var(--button-default-fgColor-rest);\n\n &:focus-visible {\n outline-offset: calc(var(--control-xsmall-paddingInline-condensed) - var(--borderWidth-thin));\n border-radius: calc(var(--borderRadius-medium) - 5px);\n }\n }\n\n & .Button--small {\n height: calc(\n var(--control-small-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2\n );\n padding: 0 calc(var(--control-small-paddingInline-condensed) - var(--control-xsmall-paddingInline-condensed));\n\n &.Button--iconOnly {\n width: calc(\n var(--control-medium-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2\n );\n\n &::before {\n @mixin minTouchTarget var(--control-medium-size), var(--control-medium-size);\n }\n }\n }\n\n & .Button--medium {\n height: calc(\n var(--control-medium-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2\n );\n padding: 0 calc(var(--control-medium-paddingInline-normal) - var(--control-xsmall-paddingInline-condensed));\n\n &.Button--iconOnly {\n width: calc(\n var(--control-medium-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2\n );\n\n &::before {\n @mixin minTouchTarget var(--control-medium-size), var(--control-medium-size);\n }\n }\n }\n\n & .Button--large {\n height: calc(\n var(--control-large-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2\n );\n padding: 0 calc(var(--control-large-paddingInline-spacious) - var(--control-xsmall-paddingInline-condensed));\n\n &.Button--iconOnly {\n width: calc(\n var(--control-large-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2\n );\n\n &::before {\n @mixin minTouchTarget var(--control-large-size), var(--control-large-size);\n }\n }\n }\n\n & .Button--iconOnly {\n padding: initial;\n }\n\n & .Button--invisible.Button--invisible-noVisuals .Button-label {\n color: var(--button-default-fgColor-rest);\n }\n}\n\n/* fullWidth */\n.SegmentedControl--fullWidth {\n display: flex;\n\n & .SegmentedControl-item {\n flex: 1;\n justify-content: center;\n }\n\n /* is .Button-withTooltip used anywhere? can't find use of it */\n & .Button--iconOnly,\n & .Button-withTooltip {\n width: 100%;\n }\n}\n",null]}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
declare class SegmentedControlElement extends HTMLElement {
|
2
|
+
#private;
|
3
|
+
items: HTMLElement[];
|
4
|
+
connectedCallback(): void;
|
5
|
+
select(event: Event): void;
|
6
|
+
}
|
7
|
+
declare global {
|
8
|
+
interface Window {
|
9
|
+
SegmentedControlElement: typeof SegmentedControlElement;
|
10
|
+
}
|
11
|
+
}
|
12
|
+
export {};
|
@@ -0,0 +1,47 @@
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
6
|
+
};
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
11
|
+
};
|
12
|
+
var _SegmentedControlElement_instances, _SegmentedControlElement_updateButtonLabels;
|
13
|
+
import { controller, targets } from '@github/catalyst';
|
14
|
+
let SegmentedControlElement = class SegmentedControlElement extends HTMLElement {
|
15
|
+
constructor() {
|
16
|
+
super(...arguments);
|
17
|
+
_SegmentedControlElement_instances.add(this);
|
18
|
+
}
|
19
|
+
connectedCallback() {
|
20
|
+
__classPrivateFieldGet(this, _SegmentedControlElement_instances, "m", _SegmentedControlElement_updateButtonLabels).call(this);
|
21
|
+
}
|
22
|
+
select(event) {
|
23
|
+
var _a, _b;
|
24
|
+
const button = event.currentTarget;
|
25
|
+
for (const item of this.items) {
|
26
|
+
item.classList.remove('SegmentedControl-item--selected');
|
27
|
+
(_a = item.querySelector('[aria-current]')) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-current', 'false');
|
28
|
+
}
|
29
|
+
(_b = button.closest('li.SegmentedControl-item')) === null || _b === void 0 ? void 0 : _b.classList.add('SegmentedControl-item--selected');
|
30
|
+
button.setAttribute('aria-current', 'true');
|
31
|
+
}
|
32
|
+
};
|
33
|
+
_SegmentedControlElement_instances = new WeakSet(), _SegmentedControlElement_updateButtonLabels = function _SegmentedControlElement_updateButtonLabels() {
|
34
|
+
for (const label of this.querySelectorAll('.Button-label')) {
|
35
|
+
label.setAttribute('data-content', label.textContent || '');
|
36
|
+
}
|
37
|
+
};
|
38
|
+
__decorate([
|
39
|
+
targets
|
40
|
+
], SegmentedControlElement.prototype, "items", void 0);
|
41
|
+
SegmentedControlElement = __decorate([
|
42
|
+
controller
|
43
|
+
], SegmentedControlElement);
|
44
|
+
if (!window.customElements.get('segmented-control')) {
|
45
|
+
window.SegmentedControlElement = SegmentedControlElement;
|
46
|
+
window.customElements.define('segmented-control', SegmentedControlElement);
|
47
|
+
}
|
@@ -0,0 +1,157 @@
|
|
1
|
+
/* SegmentedControl */
|
2
|
+
|
3
|
+
.SegmentedControl {
|
4
|
+
display: inline-flex;
|
5
|
+
list-style: none;
|
6
|
+
background-color: var(--controlTrack-bgColor-rest, var(--color-segmented-control-bg));
|
7
|
+
border-radius: var(--borderRadius-medium);
|
8
|
+
}
|
9
|
+
|
10
|
+
.SegmentedControl-item {
|
11
|
+
position: relative;
|
12
|
+
display: inline-flex;
|
13
|
+
border: var(--borderWidth-thin) solid transparent;
|
14
|
+
border-radius: var(--borderRadius-medium);
|
15
|
+
padding: var(--control-xsmall-paddingInline-condensed);
|
16
|
+
|
17
|
+
& .Button--invisible {
|
18
|
+
&:hover:not(:disabled) {
|
19
|
+
background-color: var(--controlTrack-bgColor-hover, var(--color-action-list-item-default-hover-bg));
|
20
|
+
}
|
21
|
+
|
22
|
+
&:active:not(:disabled) {
|
23
|
+
background-color: var(--controlTrack-bgColor-active, var(--color-action-list-item-default-active-bg));
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
/* Selected ---------------------------------------- */
|
28
|
+
&.SegmentedControl-item--selected {
|
29
|
+
background-color: var(--controlKnob-bgColor-rest, var(--color-segmented-control-button-bg));
|
30
|
+
border-color: var(--controlKnob-borderColor-rest, var(--color-segmented-control-button-selected-border));
|
31
|
+
|
32
|
+
& .Button {
|
33
|
+
font-weight: var(--base-text-weight-semibold);
|
34
|
+
|
35
|
+
&:hover {
|
36
|
+
background-color: transparent;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
&::before {
|
41
|
+
border-color: transparent !important;
|
42
|
+
}
|
43
|
+
|
44
|
+
& + .SegmentedControl-item::before {
|
45
|
+
border-color: transparent;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
/* renders a visibly hidden "copy" of the text in bold, reserving box space for when text becomes bold on selected */
|
50
|
+
& .Button-label[data-content]::before {
|
51
|
+
display: block;
|
52
|
+
height: 0;
|
53
|
+
font-weight: var(--base-text-weight-semibold);
|
54
|
+
visibility: hidden;
|
55
|
+
content: attr(data-content);
|
56
|
+
}
|
57
|
+
|
58
|
+
/* Separator lines */
|
59
|
+
&:not(:first-child) {
|
60
|
+
&::before {
|
61
|
+
position: absolute;
|
62
|
+
inset: 0 0 0 -1px;
|
63
|
+
margin-top: var(--control-medium-paddingBlock);
|
64
|
+
margin-bottom: var(--control-medium-paddingBlock);
|
65
|
+
content: '';
|
66
|
+
border-left: var(--borderWidth-thin) solid var(--borderColor-default);
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
/* Button ----------------------------------------- */
|
71
|
+
& .Button {
|
72
|
+
border: 0;
|
73
|
+
font-weight: var(--base-text-weight-normal);
|
74
|
+
transition: none;
|
75
|
+
color: var(--button-default-fgColor-rest);
|
76
|
+
|
77
|
+
&:focus-visible {
|
78
|
+
outline-offset: calc(var(--control-xsmall-paddingInline-condensed) - var(--borderWidth-thin));
|
79
|
+
border-radius: calc(var(--borderRadius-medium) - 5px);
|
80
|
+
}
|
81
|
+
}
|
82
|
+
|
83
|
+
& .Button--small {
|
84
|
+
height: calc(
|
85
|
+
var(--control-small-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2
|
86
|
+
);
|
87
|
+
padding: 0 calc(var(--control-small-paddingInline-condensed) - var(--control-xsmall-paddingInline-condensed));
|
88
|
+
|
89
|
+
&.Button--iconOnly {
|
90
|
+
width: calc(
|
91
|
+
var(--control-medium-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2
|
92
|
+
);
|
93
|
+
|
94
|
+
&::before {
|
95
|
+
@mixin minTouchTarget var(--control-medium-size), var(--control-medium-size);
|
96
|
+
}
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
& .Button--medium {
|
101
|
+
height: calc(
|
102
|
+
var(--control-medium-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2
|
103
|
+
);
|
104
|
+
padding: 0 calc(var(--control-medium-paddingInline-normal) - var(--control-xsmall-paddingInline-condensed));
|
105
|
+
|
106
|
+
&.Button--iconOnly {
|
107
|
+
width: calc(
|
108
|
+
var(--control-medium-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2
|
109
|
+
);
|
110
|
+
|
111
|
+
&::before {
|
112
|
+
@mixin minTouchTarget var(--control-medium-size), var(--control-medium-size);
|
113
|
+
}
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
& .Button--large {
|
118
|
+
height: calc(
|
119
|
+
var(--control-large-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2
|
120
|
+
);
|
121
|
+
padding: 0 calc(var(--control-large-paddingInline-spacious) - var(--control-xsmall-paddingInline-condensed));
|
122
|
+
|
123
|
+
&.Button--iconOnly {
|
124
|
+
width: calc(
|
125
|
+
var(--control-large-size) - var(--control-xsmall-paddingInline-condensed) * 2 - var(--borderWidth-thin) * 2
|
126
|
+
);
|
127
|
+
|
128
|
+
&::before {
|
129
|
+
@mixin minTouchTarget var(--control-large-size), var(--control-large-size);
|
130
|
+
}
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
& .Button--iconOnly {
|
135
|
+
padding: initial;
|
136
|
+
}
|
137
|
+
|
138
|
+
& .Button--invisible.Button--invisible-noVisuals .Button-label {
|
139
|
+
color: var(--button-default-fgColor-rest);
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
/* fullWidth */
|
144
|
+
.SegmentedControl--fullWidth {
|
145
|
+
display: flex;
|
146
|
+
|
147
|
+
& .SegmentedControl-item {
|
148
|
+
flex: 1;
|
149
|
+
justify-content: center;
|
150
|
+
}
|
151
|
+
|
152
|
+
/* is .Button-withTooltip used anywhere? can't find use of it */
|
153
|
+
& .Button--iconOnly,
|
154
|
+
& .Button-withTooltip {
|
155
|
+
width: 100%;
|
156
|
+
}
|
157
|
+
}
|
@@ -0,0 +1,122 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module Alpha
|
5
|
+
# Use a segmented control to let users select an option from a short list and immediately apply the selection
|
6
|
+
# @accessibility
|
7
|
+
# A `SegmentedControl` should not be used in a form as a replacement for something like a radio group or select.
|
8
|
+
# See the [Accessibility section](https://primer.style/design/components/segmented-control#accessibility) of the SegmentedControl interface guidelines for more details.
|
9
|
+
class SegmentedControl < Primer::Component
|
10
|
+
status :alpha
|
11
|
+
audited_at "2023-02-01"
|
12
|
+
|
13
|
+
FULL_WIDTH_DEFAULT = false
|
14
|
+
HIDE_LABELS_DEFAULT = false
|
15
|
+
|
16
|
+
# Use to render an item in the segmented control
|
17
|
+
#
|
18
|
+
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
19
|
+
renders_many :items, lambda { |label:, selected: false, icon: nil, **system_arguments|
|
20
|
+
Primer::Alpha::SegmentedControl::Item.new(
|
21
|
+
label: label,
|
22
|
+
selected: selected,
|
23
|
+
icon: icon,
|
24
|
+
hide_labels: @hide_labels,
|
25
|
+
size: @size,
|
26
|
+
block: @full_width,
|
27
|
+
**system_arguments
|
28
|
+
)
|
29
|
+
}
|
30
|
+
|
31
|
+
# @example With a label above and caption below
|
32
|
+
# <%= render(Primer::Box.new(display: :flex, direction: :column)) do %>
|
33
|
+
# <%= render(Primer::BaseComponent.new(tag: "span", id: "scLabel-horiz")) { "File view" } %>
|
34
|
+
# <%= render(Primer::Alpha::SegmentedControl.new("aria-labelledby": "scLabel-horiz", "aria-describedby": "scCaption-horiz")) do |component| %>
|
35
|
+
# <% component.with_item(label: "Preview", selected: true) %>
|
36
|
+
# <% component.with_item(label: "Raw") %>
|
37
|
+
# <% component.with_item(label: "Blame") %>
|
38
|
+
# <% end %>
|
39
|
+
# <%= render(Primer::Beta::Text.new(font_size: :small, mt: 1, color: :muted, id: "scCaption-horiz")) { "Change the way the file is viewed" } %>
|
40
|
+
# <% end %>
|
41
|
+
#
|
42
|
+
# @example With a label and caption on the left
|
43
|
+
# <%= render(Primer::Beta::Subhead.new) do |component| %>
|
44
|
+
# <% component.with_heading(id: "scLabel-vert") { "File view" } %>
|
45
|
+
# <% component.with_description(id: "scCaption-vert") { "Change the way the file is viewed" } %>
|
46
|
+
# <% component.with_actions do %>
|
47
|
+
# <%= render(Primer::Alpha::SegmentedControl.new("aria-labelledby": "scLabel-vert", "aria-describedby": "scCaption-vert")) do |component| %>
|
48
|
+
# <% component.with_item(label: "Preview", selected: true) %>
|
49
|
+
# <% component.with_item(label: "Raw") %>
|
50
|
+
# <% component.with_item(label: "Blame") %>
|
51
|
+
# <% end %>
|
52
|
+
# <% end %>
|
53
|
+
# <% end %>
|
54
|
+
#
|
55
|
+
# @example Basic usage
|
56
|
+
#
|
57
|
+
# <%= render(Primer::Alpha::SegmentedControl.new("aria-label": "File view")) do |component| %>
|
58
|
+
# <%= component.with_item(label: "Preview", selected: true) %>
|
59
|
+
# <%= component.with_item(label: "Raw") %>
|
60
|
+
# <%= component.with_item(label: "Blame") %>
|
61
|
+
# <% end %>
|
62
|
+
#
|
63
|
+
# @example Small
|
64
|
+
#
|
65
|
+
# <%= render(Primer::Alpha::SegmentedControl.new("aria-label": "File view", size: :small)) do |component| %>
|
66
|
+
# <%= component.with_item(label: "Preview", selected: true) %>
|
67
|
+
# <%= component.with_item(label: "Raw") %>
|
68
|
+
# <%= component.with_item(label: "Blame") %>
|
69
|
+
# <% end %>
|
70
|
+
#
|
71
|
+
# @example With icons
|
72
|
+
# <%= render(Primer::Alpha::SegmentedControl.new("aria-label": "File view")) do |component| %>
|
73
|
+
# <%= component.with_item(label: "Preview", icon: :eye, selected: true) %>
|
74
|
+
# <%= component.with_item(label: "Raw", icon: :"file-code") %>
|
75
|
+
# <%= component.with_item(label: "Blame", icon: :people) %>
|
76
|
+
# <% end %>
|
77
|
+
#
|
78
|
+
# @example With icons only
|
79
|
+
# <%= render(Primer::Alpha::SegmentedControl.new("aria-label": "File view", hide_labels: true)) do |component| %>
|
80
|
+
# <%= component.with_item(label: "Preview", icon: :eye, selected: true) %>
|
81
|
+
# <%= component.with_item(label: "Raw", icon: :"file-code") %>
|
82
|
+
# <%= component.with_item(label: "Blame", icon: :people) %>
|
83
|
+
# <% end %>
|
84
|
+
#
|
85
|
+
# @example Fill width of parent
|
86
|
+
# <%= render(Primer::Alpha::SegmentedControl.new("aria-label": "File view", full_width: true)) do |component| %>
|
87
|
+
# <%= component.with_item(label: "Preview", icon: :eye, selected: true) %>
|
88
|
+
# <%= component.with_item(label: "Raw", icon: :"file-code") %>
|
89
|
+
# <%= component.with_item(label: "Blame", icon: :people) %>
|
90
|
+
# <% end %>
|
91
|
+
#
|
92
|
+
# @param hide_labels [Boolean] Whether to hide the labels and only show the icons
|
93
|
+
# @param full_width [Boolean] If the component should be full width
|
94
|
+
# @param size [Symbol] <%= one_of(Primer::Beta::Button::SIZE_OPTIONS) %>
|
95
|
+
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
96
|
+
def initialize(hide_labels: HIDE_LABELS_DEFAULT, full_width: FULL_WIDTH_DEFAULT, size: Primer::Beta::Button::DEFAULT_SIZE, **system_arguments)
|
97
|
+
@full_width = full_width
|
98
|
+
@size = size
|
99
|
+
@hide_labels = hide_labels
|
100
|
+
|
101
|
+
@system_arguments = system_arguments
|
102
|
+
@system_arguments[:tag] = :ul
|
103
|
+
@system_arguments[:role] = "list"
|
104
|
+
@system_arguments[:classes] = class_names(
|
105
|
+
system_arguments[:classes],
|
106
|
+
"SegmentedControl",
|
107
|
+
"SegmentedControl--iconOnly": hide_labels,
|
108
|
+
"SegmentedControl--fullWidth": full_width
|
109
|
+
)
|
110
|
+
|
111
|
+
validate_aria_label
|
112
|
+
end
|
113
|
+
|
114
|
+
def render?
|
115
|
+
valid_items_count = items.count <= (@hide_labels ? 6 : 5) && items.count >= 2
|
116
|
+
raise ArgumentError, "A segmented control should have 2–5 choices with text labels, or up to 6 icon-only buttons." if !valid_items_count && !Rails.env.production?
|
117
|
+
|
118
|
+
valid_items_count
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import {controller, targets} from '@github/catalyst'
|
2
|
+
|
3
|
+
@controller
|
4
|
+
class SegmentedControlElement extends HTMLElement {
|
5
|
+
@targets items: HTMLElement[]
|
6
|
+
|
7
|
+
connectedCallback() {
|
8
|
+
this.#updateButtonLabels()
|
9
|
+
}
|
10
|
+
|
11
|
+
select(event: Event) {
|
12
|
+
const button = event.currentTarget as HTMLButtonElement
|
13
|
+
for (const item of this.items) {
|
14
|
+
item.classList.remove('SegmentedControl-item--selected')
|
15
|
+
item.querySelector('[aria-current]')?.setAttribute('aria-current', 'false')
|
16
|
+
}
|
17
|
+
|
18
|
+
button.closest('li.SegmentedControl-item')?.classList.add('SegmentedControl-item--selected')
|
19
|
+
button.setAttribute('aria-current', 'true')
|
20
|
+
}
|
21
|
+
|
22
|
+
// Updates the button labels to have a data-content attribute with the text
|
23
|
+
// This is for selection styling to avoid the text jumping. It only needs to be
|
24
|
+
// setup when the component is first loaded.
|
25
|
+
#updateButtonLabels() {
|
26
|
+
for (const label of this.querySelectorAll('.Button-label')) {
|
27
|
+
label.setAttribute('data-content', label.textContent || '')
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
declare global {
|
33
|
+
interface Window {
|
34
|
+
SegmentedControlElement: typeof SegmentedControlElement
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
if (!window.customElements.get('segmented-control')) {
|
39
|
+
window.SegmentedControlElement = SegmentedControlElement
|
40
|
+
window.customElements.define('segmented-control', SegmentedControlElement)
|
41
|
+
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module Alpha
|
5
|
+
Select = Primer::FormComponents.from_input(Primer::Forms::Dsl::SelectInput)
|
6
|
+
|
7
|
+
# Select lists are single-line text inputs rendered as `<select>` tags in HTML.
|
8
|
+
#
|
9
|
+
# @form_usage
|
10
|
+
# class ExampleForm < ApplicationForm
|
11
|
+
# form do |example_form|
|
12
|
+
# example_form.select_list(attributes) do |list|
|
13
|
+
# list.option(option_attributes)
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
class Select < Primer::Component
|
18
|
+
status :alpha
|
19
|
+
|
20
|
+
# @!method initialize
|
21
|
+
#
|
22
|
+
# @macro form_size_arguments
|
23
|
+
# @macro form_input_arguments
|
24
|
+
#
|
25
|
+
# @param multiple [Boolean] If set to true, the selection will allow multiple choices.
|
26
|
+
# @param include_blank [Boolean, String] If set to true, an empty option will be created. If set to a string, the string will be used as the option's content and the value will be empty.
|
27
|
+
# @param prompt [String] Create a prompt option with blank value and the text asking user to select something.
|
28
|
+
|
29
|
+
# @!method option
|
30
|
+
#
|
31
|
+
# Adds an option to the list.
|
32
|
+
#
|
33
|
+
# @param label [String] The user-facing label for the option.
|
34
|
+
# @param value [String] The value sent to the server on form submission.
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module Alpha
|
5
|
+
SubmitButton = Primer::FormComponents.from_input(Primer::Forms::Dsl::SubmitButtonInput)
|
6
|
+
|
7
|
+
# A submit button input rendered using the HTML `<button type="submit">` tag.
|
8
|
+
#
|
9
|
+
# This component wraps the Primer button component and supports the same slots and arguments.
|
10
|
+
#
|
11
|
+
# @form_usage
|
12
|
+
# class ExampleForm < ApplicationForm
|
13
|
+
# form do |example_form|
|
14
|
+
# example_form.submit(attributes)
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
class SubmitButton < Primer::Component
|
18
|
+
status :alpha
|
19
|
+
|
20
|
+
# @!method initialize
|
21
|
+
#
|
22
|
+
# @param name [String] Value for the HTML name attribute.
|
23
|
+
# @param id [String] Value for the HTML id attribute.
|
24
|
+
# @param class [String] CSS classes to include in the input's HTML `class` attribute. Exists for compatibility with Rails form builders.
|
25
|
+
# @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).
|
26
|
+
# @param label [String] Label text displayed above the input.
|
27
|
+
# @param aria [Hash] Key/value pairs that represent Aria attributes and their values. Eg. `aria: { current: true }` becomes `aria-current="true"`.
|
28
|
+
# @param data [Hash] Key/value pairs that represent data attributes and their values. Eg. `data: { foo: "bar" }` becomes `data-foo="bar"`.
|
29
|
+
# @macro form_system_arguments
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
import '@github/tab-container-element';
|
@@ -0,0 +1 @@
|
|
1
|
+
import '@github/tab-container-element';
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module Alpha
|
5
|
+
# Use `TabContainer` to create tabbed content with keyboard support. This component does not add any styles.
|
6
|
+
# It only provides the tab functionality. If you want styled Tabs you can look at <%= link_to_component(Primer::Alpha::TabNav) %>.
|
7
|
+
#
|
8
|
+
# This component requires javascript.
|
9
|
+
class TabContainer < Primer::Component
|
10
|
+
# @example Default
|
11
|
+
# <%= render(Primer::Alpha::TabContainer.new) do %>
|
12
|
+
# <div role="tablist">
|
13
|
+
# <button type="button" role="tab" aria-selected="true">Tab one</button>
|
14
|
+
# <button type="button" role="tab" tabindex="-1">Tab two</button>
|
15
|
+
# <button type="button" role="tab" tabindex="-1">Tab three</button>
|
16
|
+
# </div>
|
17
|
+
# <div role="tabpanel">
|
18
|
+
# Panel 1
|
19
|
+
# </div>
|
20
|
+
# <div role="tabpanel" hidden>
|
21
|
+
# Panel 2
|
22
|
+
# </div>
|
23
|
+
# <div role="tabpanel" hidden>
|
24
|
+
# Panel 3
|
25
|
+
# </div>
|
26
|
+
# <% end %>
|
27
|
+
#
|
28
|
+
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
29
|
+
def initialize(**system_arguments)
|
30
|
+
@system_arguments = deny_tag_argument(**system_arguments)
|
31
|
+
@system_arguments[:tag] = "tab-container"
|
32
|
+
end
|
33
|
+
|
34
|
+
def call
|
35
|
+
render(Primer::BaseComponent.new(**@system_arguments)) { content }
|
36
|
+
end
|
37
|
+
|
38
|
+
def render?
|
39
|
+
content.present?
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
import '@github/tab-container-element'
|