primer_view_components 0.5.1 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +90 -0
- data/app/assets/javascripts/app/components/primer/alpha/action_menu/action_menu_element.d.ts +3 -2
- data/app/assets/javascripts/app/components/primer/alpha/x_banner.d.ts +3 -1
- data/app/assets/javascripts/primer_view_components.js +1 -1
- data/app/assets/javascripts/primer_view_components.js.map +1 -1
- data/app/assets/styles/primer_view_components.css +1 -1
- data/app/assets/styles/primer_view_components.css.map +1 -1
- data/app/components/primer/alpha/action_bar.rb +0 -8
- data/app/components/primer/alpha/action_list/item.rb +17 -6
- data/app/components/primer/alpha/action_list.css +1 -1
- data/app/components/primer/alpha/action_list.css.json +2 -0
- data/app/components/primer/alpha/action_list.css.map +1 -1
- data/app/components/primer/alpha/action_list.pcss +4 -2
- data/app/components/primer/alpha/action_list.rb +61 -6
- data/app/components/primer/alpha/action_menu/action_menu_element.d.ts +3 -2
- data/app/components/primer/alpha/action_menu/action_menu_element.js +17 -3
- data/app/components/primer/alpha/action_menu/action_menu_element.ts +20 -6
- data/app/components/primer/alpha/action_menu/list.rb +63 -34
- data/app/components/primer/alpha/action_menu.rb +12 -269
- data/app/components/primer/alpha/auto_complete/item.rb +0 -12
- data/app/components/primer/alpha/auto_complete.css +1 -1
- data/app/components/primer/alpha/auto_complete.css.map +1 -1
- data/app/components/primer/alpha/auto_complete.rb +0 -47
- data/app/components/primer/alpha/banner.css +1 -1
- data/app/components/primer/alpha/banner.css.map +1 -1
- data/app/components/primer/alpha/banner.html.erb +1 -1
- data/app/components/primer/alpha/banner.rb +12 -39
- data/app/components/primer/alpha/button_marketing.rb +0 -12
- data/app/components/primer/alpha/dialog.css +1 -1
- data/app/components/primer/alpha/dialog.css.map +1 -1
- data/app/components/primer/alpha/dialog.pcss +1 -1
- data/app/components/primer/alpha/dialog.rb +2 -18
- data/app/components/primer/alpha/dropdown.css +1 -1
- data/app/components/primer/alpha/dropdown.css.map +1 -1
- data/app/components/primer/alpha/dropdown.rb +0 -105
- data/app/components/primer/alpha/form_control.rb +0 -11
- data/app/components/primer/alpha/hellip_button.rb +0 -9
- data/app/components/primer/alpha/hidden_text_expander.rb +0 -9
- data/app/components/primer/alpha/image.rb +0 -16
- data/app/components/primer/alpha/image_crop.rb +0 -11
- data/app/components/primer/alpha/layout.css +1 -1
- data/app/components/primer/alpha/layout.css.map +1 -1
- data/app/components/primer/alpha/layout.pcss +1 -1
- data/app/components/primer/alpha/layout.rb +0 -118
- data/app/components/primer/alpha/menu.css +1 -1
- data/app/components/primer/alpha/menu.css.map +1 -1
- data/app/components/primer/alpha/menu.rb +0 -19
- data/app/components/primer/alpha/multi_input.rb +0 -33
- data/app/components/primer/alpha/nav_list/group.rb +12 -3
- data/app/components/primer/alpha/nav_list.rb +79 -84
- data/app/components/primer/alpha/navigation/tab.rb +0 -35
- data/app/components/primer/alpha/octicon_symbols.rb +0 -6
- data/app/components/primer/alpha/overlay.rb +0 -14
- data/app/components/primer/alpha/segmented_control.css +1 -1
- data/app/components/primer/alpha/segmented_control.css.map +1 -1
- data/app/components/primer/alpha/segmented_control.rb +0 -61
- data/app/components/primer/alpha/tab_container.rb +0 -18
- data/app/components/primer/alpha/tab_nav.css +1 -1
- data/app/components/primer/alpha/tab_nav.css.map +1 -1
- data/app/components/primer/alpha/tab_nav.rb +0 -63
- data/app/components/primer/alpha/tab_panels.rb +0 -16
- data/app/components/primer/alpha/text_field.css +1 -1
- data/app/components/primer/alpha/text_field.css.map +1 -1
- data/app/components/primer/alpha/text_field.rb +0 -68
- data/app/components/primer/alpha/toggle_switch.css +1 -1
- data/app/components/primer/alpha/toggle_switch.css.map +1 -1
- data/app/components/primer/alpha/toggle_switch.rb +0 -18
- data/app/components/primer/alpha/tool_tip.js +3 -3
- data/app/components/primer/alpha/tool_tip.ts +3 -3
- data/app/components/primer/alpha/tooltip.rb +1 -69
- data/app/components/primer/alpha/underline_nav.css +1 -1
- data/app/components/primer/alpha/underline_nav.css.map +1 -1
- data/app/components/primer/alpha/underline_nav.rb +0 -61
- data/app/components/primer/alpha/underline_panels.rb +0 -19
- data/app/components/primer/alpha/x_banner.d.ts +3 -1
- data/app/components/primer/alpha/x_banner.js +24 -10
- data/app/components/primer/alpha/x_banner.ts +14 -12
- data/app/components/primer/base_component.rb +1 -1
- data/app/components/primer/beta/auto_complete/item.rb +0 -8
- data/app/components/primer/beta/auto_complete.rb +0 -56
- data/app/components/primer/beta/avatar.css +1 -1
- data/app/components/primer/beta/avatar.css.map +1 -1
- data/app/components/primer/beta/avatar.rb +1 -19
- data/app/components/primer/beta/avatar_stack.css +1 -1
- data/app/components/primer/beta/avatar_stack.css.map +1 -1
- data/app/components/primer/beta/avatar_stack.rb +0 -21
- data/app/components/primer/beta/base_button.rb +0 -4
- data/app/components/primer/beta/blankslate.css +1 -1
- data/app/components/primer/beta/blankslate.css.map +1 -1
- data/app/components/primer/beta/blankslate.rb +0 -104
- data/app/components/primer/beta/border_box/header.rb +4 -11
- data/app/components/primer/beta/border_box.css +1 -1
- data/app/components/primer/beta/border_box.css.map +1 -1
- data/app/components/primer/beta/border_box.html.erb +2 -2
- data/app/components/primer/beta/border_box.rb +11 -55
- data/app/components/primer/beta/breadcrumbs.rb +0 -7
- data/app/components/primer/beta/button.css +1 -1
- data/app/components/primer/beta/button.css.map +1 -1
- data/app/components/primer/beta/button.pcss +3 -3
- data/app/components/primer/beta/button.rb +2 -43
- data/app/components/primer/beta/button_group.css +1 -1
- data/app/components/primer/beta/button_group.css.map +1 -1
- data/app/components/primer/beta/button_group.rb +0 -16
- data/app/components/primer/beta/clipboard_copy.rb +0 -12
- data/app/components/primer/beta/close_button.rb +0 -3
- data/app/components/primer/beta/counter.rb +0 -8
- data/app/components/primer/beta/details.rb +0 -11
- data/app/components/primer/beta/flash.css +1 -1
- data/app/components/primer/beta/flash.css.map +1 -1
- data/app/components/primer/beta/flash.rb +1 -23
- data/app/components/primer/beta/heading.rb +0 -8
- data/app/components/primer/beta/icon_button.rb +0 -21
- data/app/components/primer/beta/label.css +1 -1
- data/app/components/primer/beta/label.css.map +1 -1
- data/app/components/primer/beta/label.rb +0 -20
- data/app/components/primer/beta/link.rb +0 -22
- data/app/components/primer/beta/markdown.rb +1 -262
- data/app/components/primer/beta/octicon.rb +0 -10
- data/app/components/primer/beta/popover.css +1 -1
- data/app/components/primer/beta/popover.css.map +1 -1
- data/app/components/primer/beta/popover.rb +0 -43
- data/app/components/primer/beta/progress_bar.rb +1 -22
- data/app/components/primer/beta/relative_time.rb +0 -9
- data/app/components/primer/beta/spinner.rb +2 -10
- data/app/components/primer/beta/state.rb +0 -13
- data/app/components/primer/beta/subhead.rb +0 -55
- data/app/components/primer/beta/text.rb +0 -4
- data/app/components/primer/beta/timeline_item.css +1 -1
- data/app/components/primer/beta/timeline_item.css.map +1 -1
- data/app/components/primer/beta/timeline_item.rb +0 -9
- data/app/components/primer/beta/truncate.rb +0 -50
- data/app/components/primer/blankslate_component.rb +0 -76
- data/app/components/primer/box.rb +0 -6
- data/app/components/primer/button_component.rb +0 -49
- data/app/components/primer/conditional_wrapper.rb +2 -17
- data/app/components/primer/icon_button.rb +0 -30
- data/app/components/primer/layout_component.rb +0 -12
- data/app/components/primer/tooltip.rb +0 -27
- data/app/components/primer/truncate.rb +0 -19
- data/app/forms/submit_button_form.rb +1 -1
- data/lib/primer/accessibility.rb +1 -1
- data/lib/primer/classify/utilities.yml +2 -0
- data/lib/primer/deprecations.yml +3 -3
- data/lib/primer/forms/button.rb +0 -5
- data/lib/primer/forms/dsl/input.rb +3 -0
- data/lib/primer/static/generate_info_arch.rb +1 -0
- data/lib/primer/view_components/linters/details_menu_migration.rb +1 -1
- data/lib/primer/view_components/linters/migrations/truncate_component.rb +45 -0
- data/lib/primer/view_components/linters/tooltipped_migration.rb +1 -1
- data/lib/primer/view_components/linters.rb +1 -0
- data/lib/primer/view_components/version.rb +2 -2
- data/lib/primer/yard/lookbook_pages_backend.rb +31 -0
- data/lib/primer/yard.rb +8 -9
- data/lib/tasks/custom_utilities.yml +2 -0
- data/previews/primer/alpha/action_list_preview.rb +89 -17
- data/previews/primer/alpha/action_menu_preview.rb +79 -37
- data/previews/primer/alpha/banner_preview/with_action_button.html.erb +1 -1
- data/previews/primer/alpha/banner_preview/with_action_content.html.erb +1 -1
- data/previews/primer/alpha/banner_preview.rb +11 -14
- data/previews/primer/alpha/nav_list_preview.rb +17 -0
- data/previews/primer/alpha/tooltip_preview/with_multiple_on_a_page.html.erb +3 -3
- data/previews/primer/alpha/tooltip_preview.rb +11 -23
- data/static/arguments.json +18 -13
- data/static/constants.json +6 -0
- data/static/info_arch.json +493 -36
- data/static/previews.json +15 -15
- metadata +3 -3
- data/lib/primer/yard/legacy_gatsby_backend.rb +0 -233
@@ -79,124 +79,6 @@ module Primer
|
|
79
79
|
Primer::Alpha::Layout::Sidebar.new(**system_arguments)
|
80
80
|
}
|
81
81
|
|
82
|
-
# @example Default
|
83
|
-
#
|
84
|
-
# <%= render(Primer::Alpha::Layout.new) do |component| %>
|
85
|
-
# <% component.with_main(border: true) { "Main" } %>
|
86
|
-
# <% component.with_sidebar(border: true) { "Sidebar" } %>
|
87
|
-
# <% end %>
|
88
|
-
#
|
89
|
-
# @example Main widths
|
90
|
-
#
|
91
|
-
# @description
|
92
|
-
# When `full`, the main column will stretch to cover all the available width.
|
93
|
-
# Otherwise, the main column will try to be centered in the screen; it may appear aligned to the left when there isn't enough space.
|
94
|
-
#
|
95
|
-
# Use smaller maximum widths in the main column to facilitate interface scanning and reading.
|
96
|
-
#
|
97
|
-
# When flowing as a row, `Main` takes the full width.
|
98
|
-
#
|
99
|
-
# @code
|
100
|
-
# <%= render(Primer::Alpha::Layout.new) do |component| %>
|
101
|
-
# <% component.with_main(width: :full, border: true) { "Main" } %>
|
102
|
-
# <% component.with_sidebar(border: true) { "Sidebar" } %>
|
103
|
-
# <% end %>
|
104
|
-
# <%= render(Primer::Alpha::Layout.new(mt: 5)) do |component| %>
|
105
|
-
# <% component.with_main(width: :md, border: true) { "Main" } %>
|
106
|
-
# <% component.with_sidebar(border: true) { "Sidebar" } %>
|
107
|
-
# <% end %>
|
108
|
-
# <%= render(Primer::Alpha::Layout.new(mt: 5)) do |component| %>
|
109
|
-
# <% component.with_main(width: :lg, border: true) { "Main" } %>
|
110
|
-
# <% component.with_sidebar(border: true) { "Sidebar" } %>
|
111
|
-
# <% end %>
|
112
|
-
# <%= render(Primer::Alpha::Layout.new(mt: 5)) do |component| %>
|
113
|
-
# <% component.with_main(width: :xl, border: true) { "Main" } %>
|
114
|
-
# <% component.with_sidebar(border: true) { "Sidebar" } %>
|
115
|
-
# <% end %>
|
116
|
-
#
|
117
|
-
# @example Sidebar widths
|
118
|
-
#
|
119
|
-
# @description
|
120
|
-
# Sets the sidebar width. The width is predetermined according to the breakpoint instead of it being percentage-based.
|
121
|
-
#
|
122
|
-
# - `default`: [md: 256px, lg: 296px, xl: 320px]
|
123
|
-
# - `narrow`: [md: 240px, lg: 256px, xl: 296px]
|
124
|
-
# - `wide`: [md: 296px, lg: 320px, xl: 344px]
|
125
|
-
#
|
126
|
-
# When flowing as a row, `Sidebar` takes the full width.
|
127
|
-
#
|
128
|
-
# @code
|
129
|
-
# <%= render(Primer::Alpha::Layout.new) do |component| %>
|
130
|
-
# <% component.with_main(border: true) { "Main" } %>
|
131
|
-
# <% component.with_sidebar(width: :default, border: true) { "Sidebar" } %>
|
132
|
-
# <% end %>
|
133
|
-
# <%= render(Primer::Alpha::Layout.new(mt: 5)) do |component| %>
|
134
|
-
# <% component.with_main(border: true) { "Main" } %>
|
135
|
-
# <% component.with_sidebar(width: :narrow, border: true) { "Sidebar" } %>
|
136
|
-
# <% end %>
|
137
|
-
# <%= render(Primer::Alpha::Layout.new(mt: 5)) do |component| %>
|
138
|
-
# <% component.with_main(border: true) { "Main" } %>
|
139
|
-
# <% component.with_sidebar(width: :wide, border: true) { "Sidebar" } %>
|
140
|
-
# <% end %>
|
141
|
-
#
|
142
|
-
# @example Sidebar placement
|
143
|
-
#
|
144
|
-
# @description
|
145
|
-
# Use `start` for sidebars that manipulate local navigation, while right-aligned `end` is useful for metadata and other auxiliary information.
|
146
|
-
#
|
147
|
-
# @code
|
148
|
-
# <%= render(Primer::Alpha::Layout.new) do |component| %>
|
149
|
-
# <% component.with_main(border: true) { "Main" } %>
|
150
|
-
# <% component.with_sidebar(col_placement: :start, border: true) { "Sidebar" } %>
|
151
|
-
# <% end %>
|
152
|
-
# <%= render(Primer::Alpha::Layout.new( mt: 5)) do |component| %>
|
153
|
-
# <% component.with_main(border: true) { "Main" } %>
|
154
|
-
# <% component.with_sidebar(col_placement: :end, border: true) { "Sidebar" } %>
|
155
|
-
# <% end %>
|
156
|
-
#
|
157
|
-
# @example Sidebar placement as row
|
158
|
-
#
|
159
|
-
# @description
|
160
|
-
# When flowing as a row, whether the sidebar is rendered first or last in the layout, or, if it's entirely hidden from the user.
|
161
|
-
#
|
162
|
-
# When `hidden`, make sure the experience is not degraded on smaller screens, and the user can still access the sidebar content somehow.
|
163
|
-
# For instance, the user may not see a Settings navigation sidebar when drilled down on a page, but they can still navigate to the Settings
|
164
|
-
# landing page to interact with the local navigation.
|
165
|
-
#
|
166
|
-
# @code
|
167
|
-
# <%= render(Primer::Alpha::Layout.new) do |component| %>
|
168
|
-
# <% component.with_main(border: true) { "Main" } %>
|
169
|
-
# <% component.with_sidebar(row_placement: :start, border: true) { "Sidebar" } %>
|
170
|
-
# <% end %>
|
171
|
-
# <%= render(Primer::Alpha::Layout.new(mt: 5)) do |component| %>
|
172
|
-
# <% component.with_main(border: true) { "Main" } %>
|
173
|
-
# <% component.with_sidebar(row_placement: :end, border: true) { "Sidebar" } %>
|
174
|
-
# <% end %>
|
175
|
-
# <%= render(Primer::Alpha::Layout.new(mt: 5)) do |component| %>
|
176
|
-
# <% component.with_main(border: true) { "Main" } %>
|
177
|
-
# <% component.with_sidebar(row_placement: :none, border: true) { "Sidebar" } %>
|
178
|
-
# <% end %>
|
179
|
-
#
|
180
|
-
# @example Changing when to render `Layout` as columns
|
181
|
-
#
|
182
|
-
# @description
|
183
|
-
# You can specify when the `Layout` should change from rows into columns.
|
184
|
-
# Any screen size before this breakpoint will render the `Layout` in stacked rows.
|
185
|
-
#
|
186
|
-
# @code
|
187
|
-
# <%= render(Primer::Alpha::Layout.new(stacking_breakpoint: :sm)) do |component| %>
|
188
|
-
# <% component.with_main(border: true) { "Main" } %>
|
189
|
-
# <% component.with_sidebar(border: true) { "Sidebar" } %>
|
190
|
-
# <% end %>
|
191
|
-
# <%= render(Primer::Alpha::Layout.new(stacking_breakpoint: :md, mt: 5)) do |component| %>
|
192
|
-
# <% component.with_main(border: true) { "Main" } %>
|
193
|
-
# <% component.with_sidebar(border: true) { "Sidebar" } %>
|
194
|
-
# <% end %>
|
195
|
-
# <%= render(Primer::Alpha::Layout.new(stacking_breakpoint: :lg, mt: 5)) do |component| %>
|
196
|
-
# <% component.with_main(border: true) { "Main" } %>
|
197
|
-
# <% component.with_sidebar(border: true) { "Sidebar" } %>
|
198
|
-
# <% end %>
|
199
|
-
#
|
200
82
|
# @param stacking_breakpoint [Symbol] When the `Layout` should change from rows into columns. <%= one_of(Primer::Alpha::Layout::STACKING_BREAKPOINT_OPTIONS) %>
|
201
83
|
# @param first_in_source [Symbol] Which element to render first in the HTML. This will change the keyboard navigation order. <%= one_of(Primer::Alpha::Layout::FIRST_IN_SOURCE_OPTIONS) %>
|
202
84
|
# @param gutter [Symbol] The amount of space between the main section and the sidebar. <%= one_of(Primer::Alpha::Layout::GUTTER_OPTIONS) %>
|
@@ -1 +1 @@
|
|
1
|
-
.menu{background-color:var(--bgColor-default,var(--color-canvas-default));border:var(--borderWidth-thin,max(1px,.0625rem)) solid var(--borderColor-default,var(--color-border-default));border-radius:var(--borderRadius-medium
|
1
|
+
.menu{background-color:var(--bgColor-default,var(--color-canvas-default));border:var(--borderWidth-thin,max(1px,.0625rem)) solid var(--borderColor-default,var(--color-border-default));border-radius:var(--borderRadius-medium,.375rem);list-style:none;margin-bottom:var(--stack-gap-normal,1rem)}.menu-item{border-bottom:var(--borderWidth-thin,max(1px,.0625rem)) solid var(--borderColor-default,var(--color-border-default));color:var(--fgColor-default,var(--color-fg-default));display:block;padding:var(--control-medium-paddingInline-condensed,.5rem) var(--control-medium-paddingInline-spacious,1rem);position:relative}.menu-item:first-child{border-top:0;border-top-right-radius:var(--borderRadius-medium,.375rem)}.menu-item:first-child,.menu-item:first-child:before{border-top-left-radius:var(--borderRadius-medium,.375rem)}.menu-item:last-child{border-bottom:0;border-bottom-right-radius:var(--borderRadius-medium,.375rem)}.menu-item:last-child,.menu-item:last-child:before{border-bottom-left-radius:var(--borderRadius-medium,.375rem)}.menu-item:hover{background-color:var(--bgColor-neutral-muted,var(--color-neutral-subtle));text-decoration:none}.menu-item:active{background-color:var(--bgColor-muted,var(--color-canvas-subtle))}.menu-item.selected,.menu-item[aria-current]:not([aria-current=false]),.menu-item[aria-selected=true]{background-color:var(--menu-bgColor-active,var(--color-menu-bg-active));cursor:default}.menu-item.selected:before,.menu-item[aria-current]:not([aria-current=false]):before,.menu-item[aria-selected=true]:before{background-color:var(--underlineNav-borderColor-active,var(--color-primer-border-active));bottom:0;content:"";left:0;position:absolute;top:0;width:2px}.menu-item .octicon{color:var(--fgColor-muted,var(--color-fg-muted));margin-right:var(--control-medium-gap,.5rem);text-align:center;width:16px}.menu-item .Counter{float:right;margin-left:var(--control-small-gap,.25rem)}.menu-item .menu-warning{color:var(--fgColor-attention,var(--color-attention-fg));float:right}.menu-item .avatar{float:left;margin-right:var(--control-small-gap,.25rem)}.menu-item.alert .Counter{color:var(--fgColor-danger,var(--color-danger-fg))}.menu-heading{border-bottom:var(--borderWidth-thin,max(1px,.0625rem)) solid var(--borderColor-default,var(--color-border-default));color:var(--fgColor-default,var(--color-fg-default));display:block;font-size:inherit;font-weight:var(--base-text-weight-semibold,600);margin-bottom:0;margin-top:0;padding:var(--control-medium-paddingInline-condensed,.5rem) var(--control-medium-paddingInline-spacious,1rem)}.menu-heading:hover{text-decoration:none}.menu-heading:first-child{border-top-left-radius:var(--borderRadius-medium,.375rem);border-top-right-radius:var(--borderRadius-medium,.375rem)}.menu-heading:last-child{border-bottom:0;border-bottom-left-radius:var(--borderRadius-medium,.375rem);border-bottom-right-radius:var(--borderRadius-medium,.375rem)}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["menu.pcss"],"names":[],"mappings":"AAIA,MAGE,mEAAwC,CACxC,6GAAgE,CAChE,
|
1
|
+
{"version":3,"sources":["menu.pcss"],"names":[],"mappings":"AAIA,MAGE,mEAAwC,CACxC,6GAAgE,CAChE,gDAAyC,CAHzC,eAAgB,CADhB,0CAKF,CAEA,WAKE,oHAAuE,CADvE,oDAA6B,CAF7B,aAAc,CACd,6GAAmG,CAFnG,iBA+EF,CAzEE,uBACE,YAAa,CAEb,0DAKF,CAHE,qDAHA,yDAKA,CAGF,sBACE,eAAgB,CAChB,6DAMF,CAHE,mDAFA,4DAIA,CAGF,iBAEE,yEAA8C,CAD9C,oBAEF,CAEA,kBACE,gEACF,CAEA,sGAIE,uEAA4C,CAD5C,cAYF,CATE,2HAOE,yFAAwD,CAJxD,QAAS,CAGT,UAAW,CAFX,MAAO,CAHP,iBAAkB,CAClB,KAAM,CAGN,SAGF,CAGF,oBAGE,gDAA2B,CAD3B,4CAAuC,CAEvC,iBAAkB,CAHlB,UAIF,CAEA,oBACE,WAAY,CACZ,2CACF,CAEA,yBAEE,wDAA+B,CAD/B,WAEF,CAEA,mBACE,UAAW,CACX,4CACF,CAGE,0BACE,kDACF,CAIJ,cAQE,oHAAuE,CADvE,oDAA6B,CAN7B,aAAc,CAId,iBAAkB,CAClB,gDAA6C,CAF7C,eAAgB,CADhB,YAAa,CADb,6GAsBF,CAdE,oBACE,oBACF,CAEA,0BACE,yDAAkD,CAClD,0DACF,CAEA,yBACE,eAAgB,CAEhB,4DAAqD,CADrD,6DAEF","file":"menu.css","sourcesContent":["/* menu */\n\n/* A menu on the side of a page, defaults to left side. e.g. github.com/about */\n\n.menu {\n margin-bottom: var(--stack-gap-normal);\n list-style: none;\n background-color: var(--bgColor-default);\n border: var(--borderWidth-thin) solid var(--borderColor-default);\n border-radius: var(--borderRadius-medium);\n}\n\n.menu-item {\n position: relative;\n display: block;\n padding: var(--control-medium-paddingInline-condensed) var(--control-medium-paddingInline-spacious);\n color: var(--fgColor-default);\n border-bottom: var(--borderWidth-thin) solid var(--borderColor-default);\n\n &:first-child {\n border-top: 0;\n border-top-left-radius: var(--borderRadius-medium);\n border-top-right-radius: var(--borderRadius-medium);\n\n &::before {\n border-top-left-radius: var(--borderRadius-medium);\n }\n }\n\n &:last-child {\n border-bottom: 0;\n border-bottom-right-radius: var(--borderRadius-medium);\n border-bottom-left-radius: var(--borderRadius-medium);\n\n &::before {\n border-bottom-left-radius: var(--borderRadius-medium);\n }\n }\n\n &:hover {\n text-decoration: none;\n background-color: var(--bgColor-neutral-muted);\n }\n\n &:active {\n background-color: var(--bgColor-muted);\n }\n\n &.selected,\n &[aria-selected='true'],\n &[aria-current]:not([aria-current='false']) {\n cursor: default;\n background-color: var(--menu-bgColor-active);\n\n &::before {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 2px;\n content: '';\n background-color: var(--underlineNav-borderColor-active);\n }\n }\n\n & .octicon {\n width: 16px;\n margin-right: var(--control-medium-gap);\n color: var(--fgColor-muted);\n text-align: center;\n }\n\n & .Counter {\n float: right;\n margin-left: var(--control-small-gap);\n }\n\n & .menu-warning {\n float: right;\n color: var(--fgColor-attention);\n }\n\n & .avatar {\n float: left;\n margin-right: var(--control-small-gap);\n }\n\n &.alert {\n & .Counter {\n color: var(--fgColor-danger);\n }\n }\n}\n\n.menu-heading {\n display: block;\n padding: var(--control-medium-paddingInline-condensed) var(--control-medium-paddingInline-spacious);\n margin-top: 0;\n margin-bottom: 0;\n font-size: inherit;\n font-weight: var(--base-text-weight-semibold);\n color: var(--fgColor-default);\n border-bottom: var(--borderWidth-thin) solid var(--borderColor-default);\n\n &:hover {\n text-decoration: none;\n }\n\n &:first-child {\n border-top-left-radius: var(--borderRadius-medium);\n border-top-right-radius: var(--borderRadius-medium);\n }\n\n &:last-child {\n border-bottom: 0;\n border-bottom-right-radius: var(--borderRadius-medium);\n border-bottom-left-radius: var(--borderRadius-medium);\n }\n}\n"]}
|
@@ -39,25 +39,6 @@ module Primer
|
|
39
39
|
Primer::BaseComponent.new(**system_arguments)
|
40
40
|
}
|
41
41
|
|
42
|
-
# @example Default
|
43
|
-
# <%= render(Primer::Alpha::Menu.new) do |component| %>
|
44
|
-
# <% component.with_heading(tag: :h2) do %>
|
45
|
-
# Heading
|
46
|
-
# <% end %>
|
47
|
-
# <% component.with_item(selected: true, href: "#url") do %>
|
48
|
-
# Item 1
|
49
|
-
# <% end %>
|
50
|
-
# <% component.with_item(href: "#url") do %>
|
51
|
-
# <%= render(Primer::Beta::Octicon.new("check")) %>
|
52
|
-
# With Icon
|
53
|
-
# <% end %>
|
54
|
-
# <% component.with_item(href: "#url") do %>
|
55
|
-
# <%= render(Primer::Beta::Octicon.new("check")) %>
|
56
|
-
# With Icon and Counter
|
57
|
-
# <%= render(Primer::Beta::Counter.new(count: 25)) %>
|
58
|
-
# <% end %>
|
59
|
-
# <% end %>
|
60
|
-
#
|
61
42
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
62
43
|
def initialize(**system_arguments)
|
63
44
|
@system_arguments = deny_tag_argument(**system_arguments)
|
@@ -42,39 +42,6 @@ module Primer
|
|
42
42
|
|
43
43
|
# @!method initialize
|
44
44
|
#
|
45
|
-
# @example Default
|
46
|
-
# <%= render(Primer::Alpha::Select.new(name: :dietary_pref, label: "Dietary preference")) do |c| %>
|
47
|
-
# <% c.option(label: "Meatatarian", value: "meatatarian") %>
|
48
|
-
# <% c.option(label: "Vegetarian", value: "vegetarian") %>
|
49
|
-
# <% end %>
|
50
|
-
#
|
51
|
-
# <%= render(Primer::Alpha::MultiInput.new(name: :dish, label: "Select dish")) do |c| %>
|
52
|
-
# <% c.select_list(name: :meatatarian) do |list| %>
|
53
|
-
# <% list.option(label: "Steak", value: "steak") %>
|
54
|
-
# <% list.option(label: "Salmon", value: "salmon") %>
|
55
|
-
# <% end %>
|
56
|
-
# <% c.select_list(name: :vegetarian, hidden: true) do |list| %>
|
57
|
-
# <% list.option(label: "Portobello mushroom", value: "portobello") %>
|
58
|
-
# <% list.option(label: "Tofu curry", value: "tofu") %>
|
59
|
-
# <% end %>
|
60
|
-
# <% end %>
|
61
|
-
#
|
62
|
-
# <script type="text/javascript" data-eval="true">
|
63
|
-
# const dietaryPrefList = document.querySelector("[name=dietary_pref]");
|
64
|
-
# const dishMulti = document.querySelector("[data-name=dish]");
|
65
|
-
#
|
66
|
-
# dietaryPrefList.onchange = (evt) => {
|
67
|
-
# switch (evt.target.value) {
|
68
|
-
# case 'meatatarian':
|
69
|
-
# dishMulti.activateField('meatatarian');
|
70
|
-
# break;
|
71
|
-
# case 'vegetarian':
|
72
|
-
# dishMulti.activateField('vegetarian');
|
73
|
-
# break;
|
74
|
-
# }
|
75
|
-
# };
|
76
|
-
# </script>
|
77
|
-
#
|
78
45
|
# @macro form_input_arguments
|
79
46
|
end
|
80
47
|
end
|
@@ -76,10 +76,19 @@ module Primer
|
|
76
76
|
|
77
77
|
# @private
|
78
78
|
def build_item(component_klass: NavList::Item, **system_arguments)
|
79
|
-
|
80
|
-
|
79
|
+
super(
|
80
|
+
component_klass: component_klass,
|
81
81
|
selected_item_id: @selected_item_id,
|
82
|
-
|
82
|
+
**system_arguments
|
83
|
+
)
|
84
|
+
end
|
85
|
+
|
86
|
+
# @private
|
87
|
+
def build_avatar_item(component_klass: NavList::Item, **system_arguments)
|
88
|
+
super(
|
89
|
+
component_klass: component_klass,
|
90
|
+
selected_item_id: @selected_item_id,
|
91
|
+
**system_arguments
|
83
92
|
)
|
84
93
|
end
|
85
94
|
|
@@ -30,8 +30,22 @@ module Primer
|
|
30
30
|
# @!parse
|
31
31
|
# # Adds an item to the list.
|
32
32
|
# #
|
33
|
-
# # @param
|
34
|
-
#
|
33
|
+
# # @param component_klass [Class] The class to use instead of the default <%= link_to_component(Primer::Alpha::NavList::Item) %>
|
34
|
+
# # @param system_arguments [Hash] These arguments are forwarded to <%= link_to_component(Primer::Alpha::NavList::Item) %>, or whatever class is passed as the `component_klass` argument.
|
35
|
+
# def with_item(component_klass: Primer::Alpha::NavList::Item, **system_arguments, &block)
|
36
|
+
# end
|
37
|
+
|
38
|
+
# @!parse
|
39
|
+
# # Adds an avatar item to the list. Avatar items are a convenient way to accessibly add an item with a leading avatar image.
|
40
|
+
# #
|
41
|
+
# # @param src [String] The source url of the avatar image.
|
42
|
+
# # @param username [String] The username associated with the avatar.
|
43
|
+
# # @param full_name [String] Optional. The user's full name.
|
44
|
+
# # @param full_name_scheme [Symbol] Optional. How to display the user's full name. <%= one_of(Primer::Alpha::ActionList::Item::DESCRIPTION_SCHEME_OPTIONS) %>
|
45
|
+
# # @param component_klass [Class] The class to use instead of the default <%= link_to_component(Primer::Alpha::NavList::Item) %>
|
46
|
+
# # @param avatar_arguments [Hash] Optional. The arguments accepted by <%= link_to_component(Primer::Beta::Avatar) %>
|
47
|
+
# # @param system_arguments [Hash] These arguments are forwarded to <%= link_to_component(Primer::Alpha::NavList::Item) %>, or whatever class is passed as the `component_klass` argument.
|
48
|
+
# def with_avatar_item(src:, username:, full_name: nil, full_name_scheme: Primer::Alpha::ActionList::Item::DEFAULT_DESCRIPTION_SCHEME, component_klass: Primer::Alpha::NavList::Item, avatar_arguments: {}, **system_arguments, &block)
|
35
49
|
# end
|
36
50
|
|
37
51
|
# @!parse
|
@@ -44,7 +58,7 @@ module Primer
|
|
44
58
|
# @!parse
|
45
59
|
# # Adds a divider to the list. Dividers visually separate items and groups.
|
46
60
|
# #
|
47
|
-
# # @param system_arguments [Hash] The arguments accepted by <%= link_to_component(Primer::Alpha::
|
61
|
+
# # @param system_arguments [Hash] The arguments accepted by <%= link_to_component(Primer::Alpha::NavList::Divider) %>.
|
48
62
|
# def with_divider(**system_arguments, &block)
|
49
63
|
# end
|
50
64
|
|
@@ -52,21 +66,21 @@ module Primer
|
|
52
66
|
#
|
53
67
|
renders_many :items, types: {
|
54
68
|
item: {
|
55
|
-
renders: lambda {
|
56
|
-
|
57
|
-
@top_level_group ||= Primer::Alpha::NavList::Group.new(selected_item_id: @selected_item_id)
|
58
|
-
|
59
|
-
component_klass.new(
|
60
|
-
list: @top_level_group,
|
61
|
-
selected_item_id: @selected_item_id,
|
62
|
-
**system_arguments,
|
63
|
-
&block
|
64
|
-
)
|
69
|
+
renders: lambda { |**system_arguments, &block|
|
70
|
+
build_item(**system_arguments, &block)
|
65
71
|
},
|
66
72
|
|
67
73
|
as: :item
|
68
74
|
},
|
69
75
|
|
76
|
+
avatar_item: {
|
77
|
+
renders: lambda { |**system_arguments|
|
78
|
+
build_avatar_item(**system_arguments)
|
79
|
+
},
|
80
|
+
|
81
|
+
as: :avatar_item
|
82
|
+
},
|
83
|
+
|
70
84
|
divider: {
|
71
85
|
renders: Primer::Alpha::NavList::Divider,
|
72
86
|
as: :divider
|
@@ -85,77 +99,6 @@ module Primer
|
|
85
99
|
}
|
86
100
|
}
|
87
101
|
|
88
|
-
# @example Items and headings
|
89
|
-
#
|
90
|
-
# <%= render(Primer::Alpha::NavList.new(aria: { label: "Settings" }, selected_item_id: :personal_info)) do |component| %>
|
91
|
-
# <% component.with_item(label: "General", selected_by_ids: :general, href: "/settings/general") %>
|
92
|
-
# <% component.with_group do |group| %>
|
93
|
-
# <% group.with_heading(title: "Account Settings") %>
|
94
|
-
# <% group.with_item(label: "Personal Information", selected_by_ids: :personal_info, href: "/account/info") %>
|
95
|
-
# <% group.with_item(label: "Password", selected_by_ids: :password, href: "/account/password") %>
|
96
|
-
# <% group.with_item(label: "Billing info", selected_by_ids: :billing, href: "/account/billing") %>
|
97
|
-
# <% end %>
|
98
|
-
# <% end %>
|
99
|
-
#
|
100
|
-
# @example Leading and trailing visuals
|
101
|
-
#
|
102
|
-
# <%= render(Primer::Alpha::NavList.new(aria: { label: "Settings" }, selected_item_id: :personal_info)) do |component| %>
|
103
|
-
# <% component.with_group do |group| %>
|
104
|
-
# <% group.with_heading(title: "Account Settings") %>
|
105
|
-
# <% group.with_item(label: "Personal Information", selected_by_ids: :personal_info, href: "/account/info") do |item| %>
|
106
|
-
# <% item.with_leading_visual_avatar(src: "https://github.com/github.png", alt: "GitHub") %>
|
107
|
-
# <% end %>
|
108
|
-
# <% group.with_item(label: "Notifications", selected_by_ids: :notifications, href: "/account/notifications") do |item| %>
|
109
|
-
# <% item.with_leading_visual_icon(icon: :bell) %>
|
110
|
-
# <% item.with_trailing_visual_counter(count: 15) %>
|
111
|
-
# <% end %>
|
112
|
-
# <% group.with_item(label: "Billing info", selected_by_ids: :billing, href: "/account/billing") do |item| %>
|
113
|
-
# <% item.with_leading_visual_icon(icon: :package) %>
|
114
|
-
# <% item.with_trailing_visual_icon(icon: :"dot-fill", color: :attention) %>
|
115
|
-
# <% end %>
|
116
|
-
# <% end %>
|
117
|
-
# <% end %>
|
118
|
-
#
|
119
|
-
# @example Expandable sub items
|
120
|
-
#
|
121
|
-
# <%= render(Primer::Alpha::NavList.new(aria: { label: "Settings" }, selected_item_id: :email_notifications)) do |component| %>
|
122
|
-
# <% component.with_group do |group| %>
|
123
|
-
# <% group.with_heading(title: "Account Settings") %>
|
124
|
-
# <% group.with_item(label: "Notification settings") do |item| %>
|
125
|
-
# <% item.with_leading_visual_icon(icon: :bell) %>
|
126
|
-
# <% item.with_item(label: "Email", selected_by_ids: :email_notifications, href: "/account/notifications/email") do |subitem| %>
|
127
|
-
# <% subitem.with_trailing_visual_icon(icon: :mail) %>
|
128
|
-
# <% end %>
|
129
|
-
# <% item.with_item(label: "SMS", selected_by_ids: :sms_notifications, href: "/account/notifications/sms") do |subitem| %>
|
130
|
-
# <% subitem.with_trailing_visual_icon(icon: :"device-mobile") %>
|
131
|
-
# <% end %>
|
132
|
-
# <% end %>
|
133
|
-
# <% group.with_item(label: "Messages") do |item| %>
|
134
|
-
# <% item.with_leading_visual_icon(icon: :bookmark) %>
|
135
|
-
# <% item.with_item(label: "Inbox", href: "/account/messages/inbox") do |subitem| %>
|
136
|
-
# <% subitem.with_trailing_visual_counter(count: 10) %>
|
137
|
-
# <% end %>
|
138
|
-
# <% item.with_item(label: "Organizer", href: "/account/messages/organizer") do |subitem| %>
|
139
|
-
# <% subitem.with_trailing_visual_label(scheme: :primary) { "New" } %>
|
140
|
-
# <% end %>
|
141
|
-
# <% end %>
|
142
|
-
# <% end %>
|
143
|
-
# <% end %>
|
144
|
-
#
|
145
|
-
# @example Trailing action
|
146
|
-
#
|
147
|
-
# <%= render(Primer::Alpha::NavList.new(aria: { label: "Foods" })) do |component| %>
|
148
|
-
# <% component.with_group do |group| %>
|
149
|
-
# <% group.with_heading(title: "My Favorite Foods") %>
|
150
|
-
# <% group.with_item(label: "Popplers", selected_by_ids: :popplers, href: "/foods/popplers") do |item| %>
|
151
|
-
# <% item.with_trailing_action(icon: "plus", "aria-label": "Add new food", size: :medium) %>
|
152
|
-
# <% end %>
|
153
|
-
# <% group.with_item(label: "Slurm", selected_by_ids: :slurm, href: "/foods/slurm") do |item| %>
|
154
|
-
# <% item.with_trailing_action(icon: "plus", "aria-label": "Add new food", size: :medium) %>
|
155
|
-
# <% end %>
|
156
|
-
# <% end %>
|
157
|
-
# <% end %>
|
158
|
-
#
|
159
102
|
# @param selected_item_id [Symbol] The ID of the currently selected item. The default is `nil`, meaning no item is selected.
|
160
103
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
161
104
|
def initialize(selected_item_id: nil, **system_arguments)
|
@@ -163,6 +106,53 @@ module Primer
|
|
163
106
|
@selected_item_id = selected_item_id
|
164
107
|
end
|
165
108
|
|
109
|
+
# Builds a new item but does not add it to the list. Use this method
|
110
|
+
# instead of the `#with_item` slot if you need to render an item outside
|
111
|
+
# the context of a list, eg. if rendering additional items to append to
|
112
|
+
# an existing list, perhaps via a separate HTTP request.
|
113
|
+
#
|
114
|
+
# @param component_klass [Class] The class to use instead of the default <%= link_to_component(Primer::Alpha::NavList::Item) %>
|
115
|
+
# @param system_arguments [Hash] These arguments are forwarded to <%= link_to_component(Primer::Alpha::NavList::Item) %>, or whatever class is passed as the `component_klass` argument.
|
116
|
+
def build_item(component_klass: Primer::Alpha::NavList::Item, **system_arguments, &block)
|
117
|
+
component_klass.new(
|
118
|
+
list: top_level_group,
|
119
|
+
selected_item_id: @selected_item_id,
|
120
|
+
**system_arguments,
|
121
|
+
&block
|
122
|
+
)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Builds a new avatar item but does not add it to the list. Avatar items
|
126
|
+
# are a convenient way to accessibly add an item with a leading avatar
|
127
|
+
# image. Use this method instead of the `#with_avatar_item` slot if you
|
128
|
+
# need to render an avatar item outside the context of a list, eg. if
|
129
|
+
# rendering additional items to append to an existing list, perhaps via
|
130
|
+
# a separate HTTP request.
|
131
|
+
#
|
132
|
+
# @param src [String] The source url of the avatar image.
|
133
|
+
# @param username [String] The username associated with the avatar.
|
134
|
+
# @param full_name [String] Optional. The user's full name.
|
135
|
+
# @param full_name_scheme [Symbol] Optional. How to display the user's full name. <%= one_of(Primer::Alpha::ActionList::Item::DESCRIPTION_SCHEME_OPTIONS) %>
|
136
|
+
# @param component_klass [Class] The class to use instead of the default <%= link_to_component(Primer::Alpha::NavList::Item) %>
|
137
|
+
# @param avatar_arguments [Hash] Optional. The arguments accepted by <%= link_to_component(Primer::Beta::Avatar) %>
|
138
|
+
# @param system_arguments [Hash] These arguments are forwarded to <%= link_to_component(Primer::Alpha::NavList::Item) %>, or whatever class is passed as the `component_klass` argument.
|
139
|
+
def build_avatar_item(src:, username:, full_name: nil, full_name_scheme: Primer::Alpha::ActionList::Item::DEFAULT_DESCRIPTION_SCHEME, component_klass: Primer::Alpha::NavList::Item, avatar_arguments: {}, **system_arguments)
|
140
|
+
component_klass.new(
|
141
|
+
list: top_level_group,
|
142
|
+
selected_item_id: @selected_item_id,
|
143
|
+
label: username,
|
144
|
+
description_scheme: full_name_scheme,
|
145
|
+
**system_arguments
|
146
|
+
).tap do |item|
|
147
|
+
item.with_leading_visual_raw_content do
|
148
|
+
# no alt text necessary
|
149
|
+
item.render(Primer::Beta::Avatar.new(src: src, **avatar_arguments, role: :presentation, size: 16))
|
150
|
+
end
|
151
|
+
|
152
|
+
item.with_description_content(full_name) if full_name
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
166
156
|
private
|
167
157
|
|
168
158
|
def before_render
|
@@ -212,6 +202,11 @@ module Primer
|
|
212
202
|
def kind(item)
|
213
203
|
item.respond_to?(:kind) ? item.kind : :item
|
214
204
|
end
|
205
|
+
|
206
|
+
def top_level_group
|
207
|
+
# dummy group for the list: argument in the item slot above
|
208
|
+
@top_level_group ||= Primer::Alpha::NavList::Group.new(selected_item_id: @selected_item_id)
|
209
|
+
end
|
215
210
|
end
|
216
211
|
end
|
217
212
|
end
|
@@ -65,41 +65,6 @@ module Primer
|
|
65
65
|
|
66
66
|
attr_reader :selected
|
67
67
|
|
68
|
-
# @example Default
|
69
|
-
# <%= render(Primer::Alpha::Navigation::Tab.new(selected: true)) do |component| %>
|
70
|
-
# <% component.with_text { "Selected" } %>
|
71
|
-
# <% end %>
|
72
|
-
# <%= render(Primer::Alpha::Navigation::Tab.new) do |component| %>
|
73
|
-
# <% component.with_text { "Not selected" } %>
|
74
|
-
# <% end %>
|
75
|
-
#
|
76
|
-
# @example With icons and counters
|
77
|
-
# <%= render(Primer::Alpha::Navigation::Tab.new) do |component| %>
|
78
|
-
# <% component.with_icon(:star) %>
|
79
|
-
# <% component.with_text { "Tab" } %>
|
80
|
-
# <% end %>
|
81
|
-
# <%= render(Primer::Alpha::Navigation::Tab.new) do |component| %>
|
82
|
-
# <% component.with_icon(:star) %>
|
83
|
-
# <% component.with_text { "Tab" } %>
|
84
|
-
# <% component.with_counter(count: 10) %>
|
85
|
-
# <% end %>
|
86
|
-
# <%= render(Primer::Alpha::Navigation::Tab.new) do |component| %>
|
87
|
-
# <% component.with_text { "Tab" } %>
|
88
|
-
# <% component.with_counter(count: 10) %>
|
89
|
-
# <% end %>
|
90
|
-
#
|
91
|
-
# @example Inside a list
|
92
|
-
# <%= render(Primer::Alpha::Navigation::Tab.new(list: true)) do |component| %>
|
93
|
-
# <% component.with_text { "Tab" } %>
|
94
|
-
# <% end %>
|
95
|
-
#
|
96
|
-
# @example With custom HTML
|
97
|
-
# <%= render(Primer::Alpha::Navigation::Tab.new) do %>
|
98
|
-
# <div>
|
99
|
-
# This is my <strong>custom HTML</strong>
|
100
|
-
# </div>
|
101
|
-
# <% end %>
|
102
|
-
#
|
103
68
|
# @param list [Boolean] Whether the Tab is an item in a `<ul>` list.
|
104
69
|
# @param selected [Boolean] Whether the Tab is selected or not.
|
105
70
|
# @param with_panel [Boolean] Whether the Tab has an associated panel.
|
@@ -6,12 +6,6 @@ module Primer
|
|
6
6
|
module Alpha
|
7
7
|
# OcticonSymbols renders a symbol dictionary using a list of <%= link_to_octicons %>.
|
8
8
|
class OcticonSymbols < Primer::Component
|
9
|
-
# @example Symbol dictionary
|
10
|
-
# <%= render(Primer::Beta::Octicon.new(icon: :check, use_symbol: true, color: :success)) %>
|
11
|
-
# <%= render(Primer::Beta::Octicon.new(icon: :check, use_symbol: true, color: :danger)) %>
|
12
|
-
# <%= render(Primer::Beta::Octicon.new(icon: :check, use_symbol: true, size: :medium)) %>
|
13
|
-
# <%= render(Primer::Alpha::OcticonSymbols.new(icons: [{ symbol: :check }, { symbol: :check, size: :medium }])) %>
|
14
|
-
#
|
15
9
|
# @param icons [Array<Hash>] List of icons to render, in the format { symbol: :icon_name, size: :small }
|
16
10
|
def initialize(icons: [])
|
17
11
|
@icons = {}
|
@@ -122,20 +122,6 @@ module Primer
|
|
122
122
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
123
123
|
renders_one :footer, "Footer"
|
124
124
|
|
125
|
-
# @example Overlay with Cancel and Submit buttons
|
126
|
-
# @description
|
127
|
-
# An ID is provided which enables wiring of the open and close buttons to the Overlay.
|
128
|
-
# @code
|
129
|
-
# <%= render(Primer::Alpha::Overlay.new(
|
130
|
-
# title: "Overlay Example",
|
131
|
-
# id: "my-Overlay",
|
132
|
-
# role: :dialog,
|
133
|
-
# )) do |d| %>
|
134
|
-
# <% d.with_show_button { "Show Overlay" } %>
|
135
|
-
# <% d.with_body do %>
|
136
|
-
# <p>Some content</p>
|
137
|
-
# <% end %>
|
138
|
-
# <% end %>
|
139
125
|
# @param id [String] The id of the Overlay.
|
140
126
|
# @param title [String] Describes the content of the Overlay.
|
141
127
|
# @param subtitle [String] Provides dditional context for the Overlay, also setting the `aria-describedby` attribute.
|
@@ -1 +1 @@
|
|
1
|
-
.SegmentedControl{background-color:var(--controlTrack-bgColor-rest,var(--color-segmented-control-bg));border-radius:var(--borderRadius-medium
|
1
|
+
.SegmentedControl{background-color:var(--controlTrack-bgColor-rest,var(--color-segmented-control-bg));border-radius:var(--borderRadius-medium,.375rem);display:inline-flex;list-style:none}.SegmentedControl-item{border:var(--borderWidth-thin,max(1px,.0625rem)) solid #0000;border-radius:var(--borderRadius-medium,.375rem);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,.375rem) - 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%}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["segmented_control.pcss","<no source>"],"names":[],"mappings":"AAEA,kBAGE,mFAAqF,CACrF,
|
1
|
+
{"version":3,"sources":["segmented_control.pcss","<no source>"],"names":[],"mappings":"AAEA,kBAGE,mFAAqF,CACrF,gDAAyC,CAHzC,mBAAoB,CACpB,eAGF,CAEA,uBAGE,4DAAiD,CACjD,gDAAyC,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,4DAAqD,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]}
|