openproject-primer_view_components 0.89.1 → 0.90.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -0
  3. data/app/assets/javascripts/primer_view_components.js +1 -1
  4. data/app/assets/javascripts/primer_view_components.js.map +1 -1
  5. data/app/assets/styles/primer_view_components.css +1 -1
  6. data/app/assets/styles/primer_view_components.css.map +1 -1
  7. data/app/components/primer/alpha/action_bar.css +1 -1
  8. data/app/components/primer/alpha/action_bar.css.map +1 -1
  9. data/app/components/primer/alpha/action_bar.pcss +0 -3
  10. data/app/components/primer/alpha/action_list.css +1 -1
  11. data/app/components/primer/alpha/action_list.css.json +4 -10
  12. data/app/components/primer/alpha/action_list.css.map +1 -1
  13. data/app/components/primer/alpha/action_list.pcss +0 -2
  14. data/app/components/primer/alpha/auto_complete.css +1 -1
  15. data/app/components/primer/alpha/auto_complete.css.json +2 -4
  16. data/app/components/primer/alpha/auto_complete.css.map +1 -1
  17. data/app/components/primer/alpha/auto_complete.pcss +3 -10
  18. data/app/components/primer/alpha/banner.css +1 -1
  19. data/app/components/primer/alpha/banner.css.map +1 -1
  20. data/app/components/primer/alpha/banner.pcss +0 -1
  21. data/app/components/primer/alpha/button_marketing.css +1 -1
  22. data/app/components/primer/alpha/button_marketing.css.map +1 -1
  23. data/app/components/primer/alpha/button_marketing.pcss +4 -4
  24. data/app/components/primer/alpha/dialog.css +1 -1
  25. data/app/components/primer/alpha/dialog.css.json +2 -1
  26. data/app/components/primer/alpha/dialog.css.map +1 -1
  27. data/app/components/primer/alpha/dialog.pcss +4 -1
  28. data/app/components/primer/alpha/dropdown.css +1 -1
  29. data/app/components/primer/alpha/dropdown.css.map +1 -1
  30. data/app/components/primer/alpha/layout.css +1 -1
  31. data/app/components/primer/alpha/layout.css.json +10 -14
  32. data/app/components/primer/alpha/layout.css.map +1 -1
  33. data/app/components/primer/alpha/layout.pcss +3 -1
  34. data/app/components/primer/alpha/menu.css +1 -1
  35. data/app/components/primer/alpha/menu.css.map +1 -1
  36. data/app/components/primer/alpha/menu.pcss +0 -6
  37. data/app/components/primer/alpha/overlay.css +1 -1
  38. data/app/components/primer/alpha/overlay.css.map +1 -1
  39. data/app/components/primer/alpha/segmented_control.css +1 -1
  40. data/app/components/primer/alpha/segmented_control.css.json +1 -2
  41. data/app/components/primer/alpha/segmented_control.css.map +1 -1
  42. data/app/components/primer/alpha/segmented_control.pcss +0 -2
  43. data/app/components/primer/alpha/select_panel.css +1 -1
  44. data/app/components/primer/alpha/select_panel.css.map +1 -1
  45. data/app/components/primer/alpha/select_panel_element.ts +1 -1
  46. data/app/components/primer/alpha/skeleton_box.css +1 -1
  47. data/app/components/primer/alpha/skeleton_box.css.map +1 -1
  48. data/app/components/primer/alpha/stack.css +1 -1
  49. data/app/components/primer/alpha/stack.css.map +1 -1
  50. data/app/components/primer/alpha/tab_nav.css +1 -1
  51. data/app/components/primer/alpha/tab_nav.css.map +1 -1
  52. data/app/components/primer/alpha/tab_nav.pcss +0 -5
  53. data/app/components/primer/alpha/text_field.css +1 -1
  54. data/app/components/primer/alpha/text_field.css.json +2 -2
  55. data/app/components/primer/alpha/text_field.css.map +1 -1
  56. data/app/components/primer/alpha/text_field.pcss +14 -7
  57. data/app/components/primer/alpha/toggle_switch.css +1 -1
  58. data/app/components/primer/alpha/toggle_switch.css.map +1 -1
  59. data/app/components/primer/alpha/toggle_switch.pcss +8 -6
  60. data/app/components/primer/alpha/tree_view/sub_tree_node.rb +1 -1
  61. data/app/components/primer/alpha/tree_view/tree_view_icon_pair_element.js +1 -1
  62. data/app/components/primer/alpha/tree_view/tree_view_icon_pair_element.ts +1 -1
  63. data/app/components/primer/alpha/tree_view/visual.rb +1 -1
  64. data/app/components/primer/alpha/tree_view.css +1 -1
  65. data/app/components/primer/alpha/tree_view.css.json +2 -2
  66. data/app/components/primer/alpha/tree_view.css.map +1 -1
  67. data/app/components/primer/alpha/tree_view.pcss +1 -0
  68. data/app/components/primer/alpha/underline_nav.css +1 -1
  69. data/app/components/primer/alpha/underline_nav.css.map +1 -1
  70. data/app/components/primer/alpha/underline_nav.pcss +0 -3
  71. data/app/components/primer/base_component.rb +1 -0
  72. data/app/components/primer/beta/avatar.css +1 -1
  73. data/app/components/primer/beta/avatar.css.map +1 -1
  74. data/app/components/primer/beta/avatar_stack.css +1 -1
  75. data/app/components/primer/beta/avatar_stack.css.map +1 -1
  76. data/app/components/primer/beta/blankslate.css +1 -1
  77. data/app/components/primer/beta/blankslate.css.map +1 -1
  78. data/app/components/primer/beta/blankslate.pcss +2 -53
  79. data/app/components/primer/beta/border_box.css +1 -1
  80. data/app/components/primer/beta/border_box.css.map +1 -1
  81. data/app/components/primer/beta/border_box.rb +18 -7
  82. data/app/components/primer/beta/breadcrumbs.css +1 -1
  83. data/app/components/primer/beta/breadcrumbs.css.json +2 -1
  84. data/app/components/primer/beta/breadcrumbs.css.map +1 -1
  85. data/app/components/primer/beta/breadcrumbs.pcss +6 -5
  86. data/app/components/primer/beta/button.css +1 -1
  87. data/app/components/primer/beta/button.css.map +1 -1
  88. data/app/components/primer/beta/button.pcss +0 -1
  89. data/app/components/primer/beta/button_group.css +1 -1
  90. data/app/components/primer/beta/button_group.css.map +1 -1
  91. data/app/components/primer/beta/button_group.rb +1 -1
  92. data/app/components/primer/beta/counter.css +1 -1
  93. data/app/components/primer/beta/counter.css.map +1 -1
  94. data/app/components/primer/beta/flash.css +1 -1
  95. data/app/components/primer/beta/flash.css.map +1 -1
  96. data/app/components/primer/beta/label.css +1 -1
  97. data/app/components/primer/beta/label.css.map +1 -1
  98. data/app/components/primer/beta/link.css +1 -1
  99. data/app/components/primer/beta/link.css.map +1 -1
  100. data/app/components/primer/beta/popover.css +1 -1
  101. data/app/components/primer/beta/popover.css.json +22 -16
  102. data/app/components/primer/beta/popover.css.map +1 -1
  103. data/app/components/primer/beta/popover.pcss +132 -101
  104. data/app/components/primer/beta/progress_bar.css +1 -1
  105. data/app/components/primer/beta/progress_bar.css.map +1 -1
  106. data/app/components/primer/beta/state.css +1 -1
  107. data/app/components/primer/beta/state.css.map +1 -1
  108. data/app/components/primer/beta/state.pcss +0 -1
  109. data/app/components/primer/beta/subhead.css +1 -1
  110. data/app/components/primer/beta/subhead.css.map +1 -1
  111. data/app/components/primer/beta/subhead.pcss +0 -2
  112. data/app/components/primer/beta/timeline_item.css +1 -1
  113. data/app/components/primer/beta/timeline_item.css.map +1 -1
  114. data/app/components/primer/beta/timeline_item.pcss +0 -5
  115. data/app/components/primer/beta/truncate.css +1 -1
  116. data/app/components/primer/beta/truncate.css.map +1 -1
  117. data/app/components/primer/beta/truncate.pcss +0 -1
  118. data/app/components/primer/component.rb +16 -0
  119. data/app/components/primer/dialog_helper.js +10 -1
  120. data/app/components/primer/dialog_helper.ts +16 -1
  121. data/app/components/primer/open_project/border_box/collapsible_header.css +1 -1
  122. data/app/components/primer/open_project/border_box/collapsible_header.css.json +1 -3
  123. data/app/components/primer/open_project/border_box/collapsible_header.css.map +1 -1
  124. data/app/components/primer/open_project/border_box/collapsible_header.html.erb +1 -1
  125. data/app/components/primer/open_project/border_box/collapsible_header.pcss +3 -1
  126. data/app/components/primer/open_project/border_box/collapsible_header.rb +10 -9
  127. data/app/components/primer/open_project/border_grid.css +1 -1
  128. data/app/components/primer/open_project/border_grid.css.map +1 -1
  129. data/app/components/primer/open_project/border_grid.pcss +11 -9
  130. data/app/components/primer/open_project/collapsible.d.ts +1 -1
  131. data/app/components/primer/open_project/collapsible.js +8 -4
  132. data/app/components/primer/open_project/collapsible.ts +10 -4
  133. data/app/components/primer/open_project/collapsible_section.html.erb +6 -10
  134. data/app/components/primer/open_project/collapsible_section.rb +8 -0
  135. data/app/components/primer/open_project/drag_handle.css +1 -1
  136. data/app/components/primer/open_project/drag_handle.css.map +1 -1
  137. data/app/components/primer/open_project/filterable_tree_view.css +1 -1
  138. data/app/components/primer/open_project/filterable_tree_view.css.map +1 -1
  139. data/app/components/primer/open_project/filterable_tree_view.html.erb +9 -5
  140. data/app/components/primer/open_project/filterable_tree_view.pcss +2 -0
  141. data/app/components/primer/open_project/filterable_tree_view.rb +9 -1
  142. data/app/components/primer/open_project/inline_message.css +1 -1
  143. data/app/components/primer/open_project/inline_message.css.map +1 -1
  144. data/app/components/primer/open_project/page_header/dialog.rb +1 -1
  145. data/app/components/primer/open_project/page_header/menu.rb +1 -1
  146. data/app/components/primer/open_project/page_header.css +1 -1
  147. data/app/components/primer/open_project/page_header.css.map +1 -1
  148. data/app/components/primer/open_project/page_header.pcss +2 -0
  149. data/app/components/primer/open_project/pagination.css +1 -1
  150. data/app/components/primer/open_project/pagination.css.map +1 -1
  151. data/app/components/primer/open_project/pagination.pcss +4 -1
  152. data/app/components/primer/open_project/side_panel/section.css +1 -1
  153. data/app/components/primer/open_project/side_panel/section.css.map +1 -1
  154. data/app/components/primer/open_project/side_panel/section.pcss +3 -3
  155. data/app/components/primer/open_project/sub_header.css +1 -1
  156. data/app/components/primer/open_project/sub_header.css.map +1 -1
  157. data/app/lib/primer/forms/acts_as_component.rb +1 -1
  158. data/app/lib/primer/forms/dsl/input.rb +5 -1
  159. data/app/lib/primer/forms/toggle_switch_form.rb +1 -1
  160. data/app/lib/primer/safe_href_helper.rb +36 -0
  161. data/lib/primer/form_components.rb +1 -1
  162. data/lib/primer/static/generate_previews.rb +1 -1
  163. data/lib/primer/view_components/version.rb +1 -1
  164. data/previews/primer/beta/border_box_preview.rb +3 -3
  165. data/previews/primer/open_project/collapsible_section_preview/with_link_in_title.html.erb +6 -0
  166. data/previews/primer/open_project/collapsible_section_preview.rb +9 -0
  167. data/previews/primer/open_project/filterable_tree_view_preview/async_custom_loading_indicator.html.erb +9 -0
  168. data/previews/primer/open_project/filterable_tree_view_preview.rb +7 -0
  169. data/static/arguments.json +12 -0
  170. data/static/classes.json +21 -0
  171. data/static/classnames.cjs +507 -0
  172. data/static/classnames.d.ts +2 -0
  173. data/static/classnames.js +509 -0
  174. data/static/info_arch.json +46 -2
  175. data/static/previews.json +2394 -2368
  176. metadata +9 -48
  177. data/app/assets/javascripts/components/primer/alpha/action_bar_element.d.ts +0 -17
  178. data/app/assets/javascripts/components/primer/alpha/action_list.d.ts +0 -16
  179. data/app/assets/javascripts/components/primer/alpha/action_menu/action_menu_element.d.ts +0 -49
  180. data/app/assets/javascripts/components/primer/alpha/action_menu/action_menu_focus_zone_stack.d.ts +0 -17
  181. data/app/assets/javascripts/components/primer/alpha/dropdown/menu.d.ts +0 -1
  182. data/app/assets/javascripts/components/primer/alpha/dropdown.d.ts +0 -1
  183. data/app/assets/javascripts/components/primer/alpha/modal_dialog.d.ts +0 -18
  184. data/app/assets/javascripts/components/primer/alpha/segmented_control.d.ts +0 -12
  185. data/app/assets/javascripts/components/primer/alpha/select_panel_element.d.ts +0 -65
  186. data/app/assets/javascripts/components/primer/alpha/tab_container.d.ts +0 -1
  187. data/app/assets/javascripts/components/primer/alpha/toggle_switch.d.ts +0 -34
  188. data/app/assets/javascripts/components/primer/alpha/tool_tip.d.ts +0 -27
  189. data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view.d.ts +0 -47
  190. data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_icon_pair_element.d.ts +0 -15
  191. data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_include_fragment_element.d.ts +0 -9
  192. data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_roving_tab_index.d.ts +0 -3
  193. data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_sub_tree_node_element.d.ts +0 -47
  194. data/app/assets/javascripts/components/primer/alpha/x_banner.d.ts +0 -18
  195. data/app/assets/javascripts/components/primer/anchored_position.d.ts +0 -27
  196. data/app/assets/javascripts/components/primer/beta/auto_complete/auto_complete.d.ts +0 -1
  197. data/app/assets/javascripts/components/primer/beta/clipboard_copy.d.ts +0 -1
  198. data/app/assets/javascripts/components/primer/beta/details_toggle_element.d.ts +0 -40
  199. data/app/assets/javascripts/components/primer/beta/nav_list.d.ts +0 -20
  200. data/app/assets/javascripts/components/primer/beta/nav_list_group_element.d.ts +0 -19
  201. data/app/assets/javascripts/components/primer/beta/relative_time.d.ts +0 -1
  202. data/app/assets/javascripts/components/primer/dialog_helper.d.ts +0 -15
  203. data/app/assets/javascripts/components/primer/focus_group.d.ts +0 -19
  204. data/app/assets/javascripts/components/primer/open_project/avatar_fallback.d.ts +0 -28
  205. data/app/assets/javascripts/components/primer/open_project/border_box/collapsible_header.d.ts +0 -11
  206. data/app/assets/javascripts/components/primer/open_project/collapsible.d.ts +0 -13
  207. data/app/assets/javascripts/components/primer/open_project/collapsible_section.d.ts +0 -10
  208. data/app/assets/javascripts/components/primer/open_project/danger_dialog_form_helper.d.ts +0 -18
  209. data/app/assets/javascripts/components/primer/open_project/filterable_tree_view.d.ts +0 -29
  210. data/app/assets/javascripts/components/primer/open_project/page_header_element.d.ts +0 -9
  211. data/app/assets/javascripts/components/primer/open_project/sub_header_element.d.ts +0 -17
  212. data/app/assets/javascripts/components/primer/open_project/zen_mode_button.d.ts +0 -18
  213. data/app/assets/javascripts/components/primer/primer.d.ts +0 -42
  214. data/app/assets/javascripts/components/primer/scrollable_region.d.ts +0 -13
  215. data/app/assets/javascripts/components/primer/shared_events.d.ts +0 -26
  216. data/app/assets/javascripts/components/primer/utils.d.ts +0 -1
  217. data/app/assets/javascripts/lib/primer/forms/character_counter.d.ts +0 -41
  218. data/app/assets/javascripts/lib/primer/forms/primer_multi_input.d.ts +0 -10
  219. data/app/assets/javascripts/lib/primer/forms/primer_text_area.d.ts +0 -13
  220. data/app/assets/javascripts/lib/primer/forms/primer_text_field.d.ts +0 -30
  221. data/app/assets/javascripts/lib/primer/forms/toggle_switch_input.d.ts +0 -5
@@ -1 +1 @@
1
- {"version":3,"sources":["collapsible_header.pcss"],"names":[],"mappings":"AAEA,mBAEE,2CAA4C,CAC5C,0BAA2B,CAF3B,aAGF,CAEA,wCACE,2BAA4B,CAC5B,4BAA6B,CAC7B,8CAOF,CALE,wJAGE,YACF,CAGF,+BAKE,kBAAmB,CACnB,kCAAmC,CALnC,cAAe,CAEf,YAAa,CACb,gBAAiB,CAIjB,eAAgB,CADhB,0BAA2B,CAL3B,wBAAiB,CAAjB,gBAWF,CAHE,kDACE,MACF,CAGF,wDACE,+BAEE,sBAAuB,CADvB,qBAEF,CAEA,kEACE,YACF,CAEA,+BACE,UACF,CACF,CAGE,8DAEE,sBAAuB,CADvB,qBAEF,CAEA,gGACE,YACF,CAEA,8DACE,gBAAiB,CACjB,kBAAsB,CACtB,kBAAmB,CACnB,UACF,CAGF,8BAGE,kBAAmB,CADnB,YAAa,CADb,cAAe,CAGf,8BAA+B,CAE/B,cAAe,CADf,eAEF,CAEA,+BACE,MAAO,CACP,WAAY,CACZ,eAAgB,CAChB,sBAAuB,CAEvB,wBAAiB,CAAjB,gBAAiB,CADjB,kBAEF","file":"collapsible_header.css","sourcesContent":["/* CSS for BorderBox::CollapsibleHeader */\n\n.CollapsibleHeader {\n display: block;\n container-name: collapsible-header-container;\n container-type: inline-size;\n}\n\n.Box:has(.CollapsibleHeader--collapsed) {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n border-bottom-width: var(--borderWidth-thicker);\n\n & .Box-list,\n & .Box-body,\n & .Box-footer {\n display: none;\n }\n}\n\n.CollapsibleHeader-triggerArea {\n cursor: pointer;\n user-select: none;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n column-gap: var(--stack-gap-normal);\n row-gap: var(--base-size-4);\n overflow: hidden;\n\n .CollapsibleHeader > & {\n flex: 1;\n }\n}\n\n@container collapsible-header-container (width < 544px) {\n .CollapsibleHeader-triggerArea {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .CollapsibleHeader[data-collapsed] .CollapsibleHeader-description {\n display: none;\n }\n\n .CollapsibleHeader-description {\n width: 100%;\n }\n}\n\n.CollapsibleHeader--multi-line {\n .CollapsibleHeader-triggerArea {\n flex-direction: column;\n align-items: flex-start;\n }\n\n &.CollapsibleHeader[data-collapsed] .CollapsibleHeader-description {\n display: none;\n }\n\n .CollapsibleHeader-description {\n overflow: visible;\n text-overflow: initial;\n white-space: normal;\n width: 100%;\n }\n}\n\n.CollapsibleHeader-title-line {\n flex-basis: 66%;\n display: flex;\n align-items: center;\n gap: var(--stack-gap-condensed);\n overflow: hidden;\n max-width: 100%;\n}\n\n.CollapsibleHeader-description {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n user-select: text;\n}\n"]}
1
+ {"version":3,"sources":["collapsible_header.pcss"],"names":[],"mappings":"AAIA,mBACE,aAAc,CACd,2CAA4C,CAC5C,0BACF,CAEA,wCACE,2BAA4B,CAC5B,4BAA6B,CAC7B,8CAOF,CALE,6EAGE,YACF,CAGF,+BACE,cAAe,CACf,wBAAiB,CAAjB,gBAAiB,CACjB,YAAa,CACb,gBAAiB,CACjB,kBAAmB,CACnB,kCAAmC,CACnC,0BAA2B,CAC3B,eAKF,CAHE,kDACE,MACF,CAGF,wDACE,+BACE,qBAAsB,CACtB,sBACF,CAEA,kEACE,YACF,CAEA,+BACE,UACF,CACF,CAGE,8DACE,qBAAsB,CACtB,sBACF,CAEA,gGACE,YACF,CAEA,8DACE,gBAAiB,CACjB,kBAAmB,CACnB,kBAAmB,CACnB,UACF,CAGF,8BACE,cAAe,CACf,YAAa,CACb,kBAAmB,CACnB,8BAA+B,CAC/B,eAAgB,CAChB,cACF,CAEA,+BACE,MAAO,CACP,WAAY,CACZ,eAAgB,CAChB,sBAAuB,CACvB,kBAAmB,CACnB,wBAAiB,CAAjB,gBACF","file":"collapsible_header.css","sourcesContent":["/* CSS for BorderBox::CollapsibleHeader */\n\n/* stylelint-disable selector-nested-pattern -- component nests descendant class selectors (and `.X > &`) inside container queries, not &-prefixed selectors */\n\n.CollapsibleHeader {\n display: block;\n container-name: collapsible-header-container;\n container-type: inline-size;\n}\n\n.Box:has(.CollapsibleHeader--collapsed) {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n border-bottom-width: var(--borderWidth-thicker);\n\n & .Box-list,\n & .Box-body,\n & .Box-footer {\n display: none;\n }\n}\n\n.CollapsibleHeader-triggerArea {\n cursor: pointer;\n user-select: none;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n column-gap: var(--stack-gap-normal);\n row-gap: var(--base-size-4);\n overflow: hidden;\n\n .CollapsibleHeader > & {\n flex: 1;\n }\n}\n\n@container collapsible-header-container (width < 544px) {\n .CollapsibleHeader-triggerArea {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .CollapsibleHeader[data-collapsed] .CollapsibleHeader-description {\n display: none;\n }\n\n .CollapsibleHeader-description {\n width: 100%;\n }\n}\n\n.CollapsibleHeader--multi-line {\n .CollapsibleHeader-triggerArea {\n flex-direction: column;\n align-items: flex-start;\n }\n\n &.CollapsibleHeader[data-collapsed] .CollapsibleHeader-description {\n display: none;\n }\n\n .CollapsibleHeader-description {\n overflow: visible;\n text-overflow: clip;\n white-space: normal;\n width: 100%;\n }\n}\n\n.CollapsibleHeader-title-line {\n flex-basis: 66%;\n display: flex;\n align-items: center;\n gap: var(--stack-gap-condensed);\n overflow: hidden;\n max-width: 100%;\n}\n\n.CollapsibleHeader-description {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n user-select: text;\n}\n"]}
@@ -5,7 +5,7 @@
5
5
  <% if count? %>
6
6
  <%= count %>
7
7
  <% end %>
8
- <%= render(Primer::BaseComponent.new(tag: :div)) do %>
8
+ <%= render(Primer::Beta::Button.new(**@toggle_button_arguments)) do %>
9
9
  <%= render(Primer::Beta::Octicon.new(icon: "chevron-up", hidden: @collapsed, data: { target: "collapsible-header.arrowUp" })) %>
10
10
  <%= render(Primer::Beta::Octicon.new(icon: "chevron-down", hidden: !@collapsed, data: { target: "collapsible-header.arrowDown" })) %>
11
11
  <% end %>
@@ -1,5 +1,7 @@
1
1
  /* CSS for BorderBox::CollapsibleHeader */
2
2
 
3
+ /* stylelint-disable selector-nested-pattern -- component nests descendant class selectors (and `.X > &`) inside container queries, not &-prefixed selectors */
4
+
3
5
  .CollapsibleHeader {
4
6
  display: block;
5
7
  container-name: collapsible-header-container;
@@ -60,7 +62,7 @@
60
62
 
61
63
  .CollapsibleHeader-description {
62
64
  overflow: visible;
63
- text-overflow: initial;
65
+ text-overflow: clip;
64
66
  white-space: normal;
65
67
  width: 100%;
66
68
  }
@@ -16,6 +16,7 @@ module Primer
16
16
  # @param tag [Symbol] <%= one_of(Primer::OpenProject::BorderBox::CollapsibleHeader::TITLE_TAG_OPTIONS) %>
17
17
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
18
18
  renders_one :title, lambda { |tag: TITLE_TAG_DEFAULT, **system_arguments|
19
+ system_arguments[:id] ||= @heading_id
19
20
  system_arguments[:classes] = class_names(
20
21
  system_arguments[:classes],
21
22
  "CollapsibleHeader-title",
@@ -29,7 +30,6 @@ module Primer
29
30
  #
30
31
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
31
32
  renders_one :count, lambda { |**system_arguments|
32
- system_arguments[:mr] ||= 2
33
33
  system_arguments[:scheme] ||= :primary
34
34
  system_arguments[:classes] = class_names(
35
35
  system_arguments[:classes],
@@ -65,6 +65,7 @@ module Primer
65
65
 
66
66
  @collapsed = collapsed
67
67
  @collapsible_id = collapsible_id
68
+ @heading_id = "#{id}-heading"
68
69
 
69
70
  @system_arguments = deny_tag_argument(**system_arguments)
70
71
  @system_arguments[:tag] = :"collapsible-header"
@@ -87,16 +88,16 @@ module Primer
87
88
  end
88
89
 
89
90
  @trigger_area_arguments = { tag: :div }
90
- @trigger_area_arguments[:role] = "button"
91
- @trigger_area_arguments[:tabindex] = 0
92
91
  @trigger_area_arguments[:classes] = "CollapsibleHeader-triggerArea"
93
- @trigger_area_arguments[:aria] = {
94
- controls: @collapsible_id,
95
- expanded: !@collapsed
96
- }
97
92
  @trigger_area_arguments[:data] = {
98
- target: "collapsible-header.triggerElement",
99
- action: "click:collapsible-header#toggle keydown:collapsible-header#toggleViaKeyboard"
93
+ action: "click:collapsible-header#toggle"
94
+ }
95
+
96
+ @toggle_button_arguments = {
97
+ scheme: :invisible,
98
+ type: :button,
99
+ data: { target: "collapsible-header.triggerElement", "collapsible-toggle": "" },
100
+ aria: { expanded: !@collapsed, controls: @collapsible_id, labelledby: @heading_id }
100
101
  }
101
102
  end
102
103
 
@@ -1 +1 @@
1
- .BorderGrid{border-collapse:collapse;border-style:hidden;display:table;margin-bottom:-16px;margin-top:-16px;table-layout:fixed;width:100%}.BorderGrid .BorderGrid-cell{padding-bottom:16px;padding-top:16px}.BorderGrid--spacious{margin-bottom:-24px;margin-top:-24px}.BorderGrid--spacious .BorderGrid-cell{padding-bottom:24px;padding-top:24px}.BorderGrid-row{display:table-row}.BorderGrid-cell{border:1px solid var(--borderColor-muted);display:table-cell}
1
+ .BorderGrid{display:table;width:100%;margin-top:calc(var(--base-size-16)*-1);margin-bottom:calc(var(--base-size-16)*-1);table-layout:fixed;border-collapse:collapse;border-style:hidden}.BorderGrid .BorderGrid-cell{padding-top:var(--base-size-16);padding-bottom:var(--base-size-16)}.BorderGrid--spacious{margin-top:calc(var(--base-size-24)*-1);margin-bottom:calc(var(--base-size-24)*-1)}.BorderGrid--spacious .BorderGrid-cell{padding-top:var(--base-size-24);padding-bottom:var(--base-size-24)}.BorderGrid-row{display:table-row}.BorderGrid-cell{display:table-cell;border:var(--borderWidth-thin) solid var(--borderColor-muted)}
@@ -1 +1 @@
1
- {"version":3,"sources":["border_grid.pcss"],"names":[],"mappings":"AAEA,YAMI,wBAAyB,CACzB,mBAAmB,CANnB,aAAc,CAGd,mBAAoB,CADpB,gBAAiB,CAEjB,kBAAmB,CAHnB,UAMJ,CAEA,6BAEI,mBAAmB,CADnB,gBAEJ,CAEA,sBAEI,mBAAmB,CADnB,gBAEJ,CAEA,uCAEI,mBAAmB,CADnB,gBAEJ,CAEA,gBACI,iBACJ,CAEA,iBAEI,yCAAyC,CADzC,kBAEJ","file":"border_grid.css","sourcesContent":["/* CSS for BorderGrid */\n\n.BorderGrid {\n display: table;\n width: 100%;\n margin-top: -16px;\n margin-bottom: -16px;\n table-layout: fixed;\n border-collapse: collapse;\n border-style: hidden\n}\n\n.BorderGrid .BorderGrid-cell {\n padding-top: 16px;\n padding-bottom: 16px\n}\n\n.BorderGrid--spacious {\n margin-top: -24px;\n margin-bottom: -24px\n}\n\n.BorderGrid--spacious .BorderGrid-cell {\n padding-top: 24px;\n padding-bottom: 24px\n}\n\n.BorderGrid-row {\n display: table-row\n}\n\n.BorderGrid-cell {\n display: table-cell;\n border: 1px solid var(--borderColor-muted)\n}\n"]}
1
+ {"version":3,"sources":["border_grid.pcss"],"names":[],"mappings":"AAEA,YACI,aAAc,CACd,UAAW,CACX,uCAA0C,CAC1C,0CAA6C,CAC7C,kBAAmB,CAEnB,wBAAyB,CAEzB,mBACJ,CAEA,6BACI,+BAAgC,CAChC,kCACJ,CAEA,sBACI,uCAA0C,CAC1C,0CACJ,CAEA,uCACI,+BAAgC,CAChC,kCACJ,CAEA,gBACI,iBACJ,CAEA,iBACI,kBAAmB,CACnB,6DACJ","file":"border_grid.css","sourcesContent":["/* CSS for BorderGrid */\n\n.BorderGrid {\n display: table;\n width: 100%;\n margin-top: calc(-1 * var(--base-size-16));\n margin-bottom: calc(-1 * var(--base-size-16));\n table-layout: fixed;\n /* stylelint-disable-next-line primer/borders -- table border-collapse keyword, not a border size */\n border-collapse: collapse;\n /* stylelint-disable-next-line primer/borders -- table border-style keyword, not a border size */\n border-style: hidden\n}\n\n.BorderGrid .BorderGrid-cell {\n padding-top: var(--base-size-16);\n padding-bottom: var(--base-size-16)\n}\n\n.BorderGrid--spacious {\n margin-top: calc(-1 * var(--base-size-24));\n margin-bottom: calc(-1 * var(--base-size-24))\n}\n\n.BorderGrid--spacious .BorderGrid-cell {\n padding-top: var(--base-size-24);\n padding-bottom: var(--base-size-24)\n}\n\n.BorderGrid-row {\n display: table-row\n}\n\n.BorderGrid-cell {\n display: table-cell;\n border: var(--borderWidth-thin) solid var(--borderColor-muted)\n}\n"]}
@@ -3,26 +3,28 @@
3
3
  .BorderGrid {
4
4
  display: table;
5
5
  width: 100%;
6
- margin-top: -16px;
7
- margin-bottom: -16px;
6
+ margin-top: calc(-1 * var(--base-size-16));
7
+ margin-bottom: calc(-1 * var(--base-size-16));
8
8
  table-layout: fixed;
9
+ /* stylelint-disable-next-line primer/borders -- table border-collapse keyword, not a border size */
9
10
  border-collapse: collapse;
11
+ /* stylelint-disable-next-line primer/borders -- table border-style keyword, not a border size */
10
12
  border-style: hidden
11
13
  }
12
14
 
13
15
  .BorderGrid .BorderGrid-cell {
14
- padding-top: 16px;
15
- padding-bottom: 16px
16
+ padding-top: var(--base-size-16);
17
+ padding-bottom: var(--base-size-16)
16
18
  }
17
19
 
18
20
  .BorderGrid--spacious {
19
- margin-top: -24px;
20
- margin-bottom: -24px
21
+ margin-top: calc(-1 * var(--base-size-24));
22
+ margin-bottom: calc(-1 * var(--base-size-24))
21
23
  }
22
24
 
23
25
  .BorderGrid--spacious .BorderGrid-cell {
24
- padding-top: 24px;
25
- padding-bottom: 24px
26
+ padding-top: var(--base-size-24);
27
+ padding-bottom: var(--base-size-24)
26
28
  }
27
29
 
28
30
  .BorderGrid-row {
@@ -31,5 +33,5 @@
31
33
 
32
34
  .BorderGrid-cell {
33
35
  display: table-cell;
34
- border: 1px solid var(--borderColor-muted)
36
+ border: var(--borderWidth-thin) solid var(--borderColor-muted)
35
37
  }
@@ -5,7 +5,7 @@ export declare abstract class CollapsibleElement extends HTMLElement {
5
5
  collapsibleElements: HTMLElement[];
6
6
  collapsed: boolean;
7
7
  toggleViaKeyboard(event: KeyboardEvent): void;
8
- toggle(): void;
8
+ toggle(event?: Event): void;
9
9
  attributeChangedCallback(name: string): void;
10
10
  hideAll(): void;
11
11
  expandAll(): void;
@@ -5,7 +5,6 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { attr, target, targets } from '@github/catalyst';
8
- // eslint-disable-next-line custom-elements/expose-class-on-global
9
8
  export class CollapsibleElement extends HTMLElement {
10
9
  constructor() {
11
10
  super(...arguments);
@@ -13,11 +12,16 @@ export class CollapsibleElement extends HTMLElement {
13
12
  }
14
13
  toggleViaKeyboard(event) {
15
14
  if (event.code === 'Enter' || event.code === 'Space') {
16
- event.preventDefault();
17
- this.toggle();
15
+ this.toggle(event);
18
16
  }
19
17
  }
20
- toggle() {
18
+ toggle(event) {
19
+ if (event &&
20
+ event.target instanceof Element &&
21
+ !event.target.closest('[data-collapsible-toggle]') &&
22
+ event.target.closest('a, button'))
23
+ return;
24
+ event?.preventDefault();
21
25
  this.collapsed = !this.collapsed;
22
26
  }
23
27
  attributeChangedCallback(name) {
@@ -1,6 +1,5 @@
1
1
  import {attr, target, targets} from '@github/catalyst'
2
2
 
3
- // eslint-disable-next-line custom-elements/expose-class-on-global
4
3
  export abstract class CollapsibleElement extends HTMLElement {
5
4
  @target arrowDown: Element
6
5
  @target arrowUp: Element
@@ -11,12 +10,19 @@ export abstract class CollapsibleElement extends HTMLElement {
11
10
 
12
11
  toggleViaKeyboard(event: KeyboardEvent) {
13
12
  if (event.code === 'Enter' || event.code === 'Space') {
14
- event.preventDefault()
15
- this.toggle()
13
+ this.toggle(event)
16
14
  }
17
15
  }
18
16
 
19
- toggle() {
17
+ toggle(event?: Event) {
18
+ if (
19
+ event &&
20
+ event.target instanceof Element &&
21
+ !event.target.closest('[data-collapsible-toggle]') &&
22
+ event.target.closest('a, button')
23
+ )
24
+ return
25
+ event?.preventDefault()
20
26
  this.collapsed = !this.collapsed
21
27
  }
22
28
 
@@ -2,23 +2,19 @@
2
2
  <%= render(Primer::OpenProject::FlexLayout.new) do |flex| %>
3
3
  <%= flex.with_row(classes: "CollapsibleSection--triggerArea",
4
4
  id: @title_id,
5
- tabindex: 0,
6
- role: "button",
7
- data: {
8
- action: "click:collapsible-section#toggle keydown:collapsible-section#toggleViaKeyboard",
9
- target: "collapsible-section.triggerElement"
10
- },
11
- aria: { expanded: !@collapsed, controls: @content_id }) do %>
5
+ data: { action: "click:collapsible-section#toggle" }) do %>
12
6
  <%= render(Primer::OpenProject::FlexLayout.new(display: :flex, align_items: :center)) do |header| %>
13
- <%= header.with_column do %>
7
+ <%= header.with_column(id: @heading_id) do %>
14
8
  <%= title %>
15
9
  <% end %>
16
10
  <%= header.with_column do %>
17
11
  <%= caption %>
18
12
  <% end %>
19
13
  <%= header.with_column do %>
20
- <%= render(Primer::Beta::Octicon.new(icon: "chevron-up", hidden: @collapsed, data: { target: "collapsible-section.arrowUp" })) %>
21
- <%= render(Primer::Beta::Octicon.new(icon: "chevron-down", hidden: !@collapsed, data: { target: "collapsible-section.arrowDown" })) %>
14
+ <%= render(Primer::Beta::Button.new(**@toggle_button_arguments)) do %>
15
+ <%= render(Primer::Beta::Octicon.new(icon: "chevron-up", hidden: @collapsed, data: { target: "collapsible-section.arrowUp" })) %>
16
+ <%= render(Primer::Beta::Octicon.new(icon: "chevron-down", hidden: !@collapsed, data: { target: "collapsible-section.arrowDown" })) %>
17
+ <% end %>
22
18
  <% end %>
23
19
  <%= header.with_column(flex: 1, text_align: :right) do %>
24
20
  <%= additional_information %>
@@ -53,6 +53,7 @@ module Primer
53
53
  def initialize(id: self.class.generate_id, collapsed: false, **system_arguments)
54
54
  @title_id = "#{id}-title"
55
55
  @content_id = "#{id}-content"
56
+ @heading_id = "#{id}-heading"
56
57
  @collapsed = collapsed
57
58
 
58
59
  @system_arguments = deny_tag_argument(**system_arguments)
@@ -66,6 +67,13 @@ module Primer
66
67
 
67
68
  @system_arguments[:data] ||= {}
68
69
  @system_arguments[:data][:collapsed] = true if @collapsed
70
+
71
+ @toggle_button_arguments = {
72
+ scheme: :invisible,
73
+ type: :button,
74
+ data: { target: "collapsible-section.triggerElement", "collapsible-toggle": "" },
75
+ aria: { expanded: !@collapsed, controls: @content_id, labelledby: @heading_id }
76
+ }
69
77
  end
70
78
 
71
79
  private
@@ -1 +1 @@
1
- .DragHandle{color:var(--fgColor-muted);cursor:move}
1
+ .DragHandle{cursor:move;color:var(--fgColor-muted)}
@@ -1 +1 @@
1
- {"version":3,"sources":["drag_handle.pcss"],"names":[],"mappings":"AAEA,YAEI,0BAA2B,CAD3B,WAEJ","file":"drag_handle.css","sourcesContent":["/* CSS for DragHandle */\n\n.DragHandle {\n cursor: move;\n color: var(--fgColor-muted);\n}\n"]}
1
+ {"version":3,"sources":["drag_handle.pcss"],"names":[],"mappings":"AAEA,YACI,WAAY,CACZ,0BACJ","file":"drag_handle.css","sourcesContent":["/* CSS for DragHandle */\n\n.DragHandle {\n cursor: move;\n color: var(--fgColor-muted);\n}\n"]}
@@ -1 +1 @@
1
- filterable-tree-view{display:flex;flex-direction:column;max-height:inherit;overflow:hidden}.FilterableTreeViewLayout{flex:1;min-height:0}.FilterableTreeViewTreeContainer{flex:1;min-height:0;overflow-y:auto}::highlight(primer-filterable-tree-view-search-results){background-color:var(--display-yellow-scale-2)}filterable-tree-view mark{background-color:var(--display-yellow-scale-2);color:inherit}.FilterableTreeViewLoadingSkeleton{display:none}filterable-tree-view[data-loading] .FilterableTreeViewLoadingSkeleton{display:block}filterable-tree-view[data-loading] [data-target~="filterable-tree-view.noResultsMessage"],filterable-tree-view[data-loading] tree-view{display:none}
1
+ filterable-tree-view{display:flex;flex-direction:column;overflow:hidden;max-height:inherit}.FilterableTreeViewLayout{flex:1;min-height:0}.FilterableTreeViewTreeContainer{flex:1;min-height:0;overflow-y:auto}::highlight(primer-filterable-tree-view-search-results){background-color:var(--display-yellow-scale-2)}filterable-tree-view mark{background-color:var(--display-yellow-scale-2);color:inherit}.FilterableTreeViewLoadingSkeleton{display:none}filterable-tree-view[data-loading] .FilterableTreeViewLoadingSkeleton{display:block}filterable-tree-view[data-loading] [data-target~="filterable-tree-view.noResultsMessage"],filterable-tree-view[data-loading] tree-view{display:none}
@@ -1 +1 @@
1
- {"version":3,"sources":["filterable_tree_view.pcss"],"names":[],"mappings":"AAYA,qBACE,YAAa,CACb,qBAAsB,CAEtB,kBAAmB,CADnB,eAEF,CAEA,0BACE,MAAO,CACP,YACF,CAEA,iCACE,MAAO,CACP,YAAa,CACb,eACF,CAGA,wDACE,8CACF,CAIA,0BACE,8CAA+C,CAC/C,aACF,CAGA,mCACE,YACF,CAIA,sEACE,aACF,CAEA,uIAEE,YACF","file":"filterable_tree_view.css","sourcesContent":["/* CSS for FilterableTreeView */\n\n/* Scroll layout\n *\n * The filterable-tree-view element itself acts as a flex column container.\n * The toolbar (input, segmented control, checkbox) is fixed at the top.\n * Only the tree area scrolls. The consumer is responsible for setting a\n * height or max-height on the filterable-tree-view element (or its parent)\n * to activate scrolling.\n */\n\n/* stylelint-disable-next-line selector-max-type */\nfilterable-tree-view {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n max-height: inherit;\n}\n\n.FilterableTreeViewLayout {\n flex: 1;\n min-height: 0;\n}\n\n.FilterableTreeViewTreeContainer {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Highlight style for CSS Custom Highlight API */\n::highlight(primer-filterable-tree-view-search-results) {\n background-color: var(--display-yellow-scale-2);\n}\n\n/* Fallback: <mark> elements used when CSS Custom Highlight API is unavailable */\n/* stylelint-disable-next-line selector-max-type */\nfilterable-tree-view mark {\n background-color: var(--display-yellow-scale-2);\n color: inherit;\n}\n\n/* Loading skeleton */\n.FilterableTreeViewLoadingSkeleton {\n display: none;\n}\n\n/* stylelint-disable selector-no-qualifying-type */\n/* stylelint-disable selector-max-type */\nfilterable-tree-view[data-loading] .FilterableTreeViewLoadingSkeleton {\n display: block;\n}\n\nfilterable-tree-view[data-loading] tree-view,\nfilterable-tree-view[data-loading] [data-target~=\"filterable-tree-view.noResultsMessage\"] {\n display: none;\n}\n"]}
1
+ {"version":3,"sources":["filterable_tree_view.pcss"],"names":[],"mappings":"AAYA,qBACE,YAAa,CACb,qBAAsB,CACtB,eAAgB,CAChB,kBACF,CAEA,0BACE,MAAO,CACP,YACF,CAEA,iCACE,MAAO,CACP,YAAa,CACb,eACF,CAGA,wDAEE,8CACF,CAIA,0BAEE,8CAA+C,CAC/C,aACF,CAGA,mCACE,YACF,CAIA,sEACE,aACF,CAEA,uIAEE,YACF","file":"filterable_tree_view.css","sourcesContent":["/* CSS for FilterableTreeView */\n\n/* Scroll layout\n *\n * The filterable-tree-view element itself acts as a flex column container.\n * The toolbar (input, segmented control, checkbox) is fixed at the top.\n * Only the tree area scrolls. The consumer is responsible for setting a\n * height or max-height on the filterable-tree-view element (or its parent)\n * to activate scrolling.\n */\n\n/* stylelint-disable-next-line selector-max-type */\nfilterable-tree-view {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n max-height: inherit;\n}\n\n.FilterableTreeViewLayout {\n flex: 1;\n min-height: 0;\n}\n\n.FilterableTreeViewTreeContainer {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Highlight style for CSS Custom Highlight API */\n::highlight(primer-filterable-tree-view-search-results) {\n /* stylelint-disable-next-line primer/no-display-colors, primer/colors -- intentional yellow search-match highlight; no Primer semantic token exists for this */\n background-color: var(--display-yellow-scale-2);\n}\n\n/* Fallback: <mark> elements used when CSS Custom Highlight API is unavailable */\n/* stylelint-disable-next-line selector-max-type */\nfilterable-tree-view mark {\n /* stylelint-disable-next-line primer/no-display-colors, primer/colors -- intentional yellow search-match highlight; no Primer semantic token exists for this */\n background-color: var(--display-yellow-scale-2);\n color: inherit;\n}\n\n/* Loading skeleton */\n.FilterableTreeViewLoadingSkeleton {\n display: none;\n}\n\n/* stylelint-disable selector-no-qualifying-type */\n/* stylelint-disable selector-max-type */\nfilterable-tree-view[data-loading] .FilterableTreeViewLoadingSkeleton {\n display: block;\n}\n\nfilterable-tree-view[data-loading] tree-view,\nfilterable-tree-view[data-loading] [data-target~=\"filterable-tree-view.noResultsMessage\"] {\n display: none;\n}\n"]}
@@ -28,11 +28,15 @@
28
28
  <% end %>
29
29
  <% end %>
30
30
  <div class="FilterableTreeViewLoadingSkeleton" aria-hidden="true">
31
- <% [0, 8, 8, 16, 8, 0, 8, 8].each do |indent| %>
32
- <span class="TreeViewSkeletonItemContainerStyle" style="padding-left: <%= indent %>px">
33
- <%= render(Primer::Alpha::SkeletonBox.new(width: "16px")) %>
34
- <%= render(Primer::Alpha::SkeletonBox.new(classes: "TreeItemSkeletonTextStyles")) %>
35
- </span>
31
+ <% if loading_indicator? %>
32
+ <%= loading_indicator %>
33
+ <% else %>
34
+ <% [0, 8, 8, 16, 8, 0, 8, 8].each do |indent| %>
35
+ <span class="TreeViewSkeletonItemContainerStyle" style="padding-left: <%= indent %>px">
36
+ <%= render(Primer::Alpha::SkeletonBox.new(width: "16px")) %>
37
+ <%= render(Primer::Alpha::SkeletonBox.new(classes: "TreeItemSkeletonTextStyles")) %>
38
+ </span>
39
+ <% end %>
36
40
  <% end %>
37
41
  </div>
38
42
  <%= render(@tree_view) %>
@@ -30,12 +30,14 @@ filterable-tree-view {
30
30
 
31
31
  /* Highlight style for CSS Custom Highlight API */
32
32
  ::highlight(primer-filterable-tree-view-search-results) {
33
+ /* stylelint-disable-next-line primer/no-display-colors, primer/colors -- intentional yellow search-match highlight; no Primer semantic token exists for this */
33
34
  background-color: var(--display-yellow-scale-2);
34
35
  }
35
36
 
36
37
  /* Fallback: <mark> elements used when CSS Custom Highlight API is unavailable */
37
38
  /* stylelint-disable-next-line selector-max-type */
38
39
  filterable-tree-view mark {
40
+ /* stylelint-disable-next-line primer/no-display-colors, primer/colors -- intentional yellow search-match highlight; no Primer semantic token exists for this */
39
41
  background-color: var(--display-yellow-scale-2);
40
42
  color: inherit;
41
43
  }
@@ -133,11 +133,19 @@ module Primer
133
133
  # ```erb
134
134
  # <%= render(Primer::OpenProject::FilterableTreeView.new(
135
135
  # src: my_path
136
- # )) %>
136
+ # )) do |tree_view| %>
137
+ # <% tree_view.with_loading_indicator do %>
138
+ # <%= render(Primer::Beta::Spinner.new) %>
139
+ # <% end %>
140
+ # <% end %>
137
141
  # ```
138
142
  class FilterableTreeView < Primer::Component
139
143
  delegate :with_leaf, :with_sub_tree, to: :@tree_view
140
144
 
145
+ # An optional loading indicator shown while an async filter request is in progress. When omitted, a skeleton
146
+ # loader is rendered. This slot is only used when `src` is set.
147
+ renders_one :loading_indicator
148
+
141
149
  SUPPORTED_SELECT_VARIANTS = %i[multiple single none].freeze
142
150
 
143
151
  DEFAULT_FILTER_INPUT_ARGUMENTS = {
@@ -1 +1 @@
1
- .InlineMessage{align-items:start;color:var(--inline-message-fgColor);column-gap:.5rem;display:grid;font-size:var(--inline-message-fontSize);grid-template-columns:auto 1fr;line-height:var(--inline-message-lineHeight)}.InlineMessage[data-size=small]{--inline-message-fontSize:var(--text-body-size-small);--inline-message-lineHeight:var(--text-body-lineHeight-small,1.6666)}.InlineMessage[data-size=medium]{--inline-message-fontSize:var(--text-body-size-medium);--inline-message-lineHeight:var(--text-body-lineHeight-medium,1.4285)}.InlineMessage[data-variant=warning]{--inline-message-fgColor:var(--fgColor-attention)}.InlineMessage[data-variant=critical]{--inline-message-fgColor:var(--fgColor-danger)}.InlineMessage[data-variant=success]{--inline-message-fgColor:var(--fgColor-success)}.InlineMessage[data-variant=unavailable]{--inline-message-fgColor:var(--fgColor-muted)}.InlineMessageIcon{min-height:calc(var(--inline-message-lineHeight)*var(--inline-message-fontSize))}
1
+ .InlineMessage{display:grid;font-size:var(--inline-message-fontSize);line-height:var(--inline-message-lineHeight);color:var(--inline-message-fgColor);column-gap:.5rem;grid-template-columns:auto 1fr;align-items:start}.InlineMessage[data-size=small]{--inline-message-fontSize:var(--text-body-size-small);--inline-message-lineHeight:var(--text-body-lineHeight-small,1.6666)}.InlineMessage[data-size=medium]{--inline-message-fontSize:var(--text-body-size-medium);--inline-message-lineHeight:var(--text-body-lineHeight-medium,1.4285)}.InlineMessage[data-variant=warning]{--inline-message-fgColor:var(--fgColor-attention)}.InlineMessage[data-variant=critical]{--inline-message-fgColor:var(--fgColor-danger)}.InlineMessage[data-variant=success]{--inline-message-fgColor:var(--fgColor-success)}.InlineMessage[data-variant=unavailable]{--inline-message-fgColor:var(--fgColor-muted)}.InlineMessageIcon{min-height:calc(var(--inline-message-lineHeight)*var(--inline-message-fontSize))}
@@ -1 +1 @@
1
- {"version":3,"sources":["inline_message.pcss"],"names":[],"mappings":"AAAA,eAUE,iBAAkB,CAHlB,mCAAoC,CACpC,gBAAkB,CAPlB,YAAa,CAEb,wCAAyC,CAMzC,8BAA+B,CAJ/B,4CAgCF,CAzBE,gCACE,qDAAsD,CACtD,oEACF,CAEA,iCACE,sDAAuD,CACvD,qEACF,CAEA,qCACE,iDACF,CAEA,sCACE,8CACF,CAEA,qCACE,+CACF,CAEA,yCACE,6CACF,CAGF,mBACE,gFACF","file":"inline_message.css","sourcesContent":[".InlineMessage {\n display: grid;\n /* stylelint-disable-next-line primer/typography */\n font-size: var(--inline-message-fontSize);\n /* stylelint-disable-next-line primer/typography */\n line-height: var(--inline-message-lineHeight);\n /* stylelint-disable-next-line primer/colors */\n color: var(--inline-message-fgColor);\n column-gap: 0.5rem;\n grid-template-columns: auto 1fr;\n align-items: start;\n\n &[data-size='small'] {\n --inline-message-fontSize: var(--text-body-size-small);\n --inline-message-lineHeight: var(--text-body-lineHeight-small, 1.6666);\n }\n\n &[data-size='medium'] {\n --inline-message-fontSize: var(--text-body-size-medium);\n --inline-message-lineHeight: var(--text-body-lineHeight-medium, 1.4285);\n }\n\n &[data-variant='warning'] {\n --inline-message-fgColor: var(--fgColor-attention);\n }\n\n &[data-variant='critical'] {\n --inline-message-fgColor: var(--fgColor-danger);\n }\n\n &[data-variant='success'] {\n --inline-message-fgColor: var(--fgColor-success);\n }\n\n &[data-variant='unavailable'] {\n --inline-message-fgColor: var(--fgColor-muted);\n }\n}\n\n.InlineMessageIcon {\n min-height: calc(var(--inline-message-lineHeight) * var(--inline-message-fontSize));\n}"]}
1
+ {"version":3,"sources":["inline_message.pcss"],"names":[],"mappings":"AAAA,eACE,YAAa,CAEb,wCAAyC,CAEzC,4CAA6C,CAE7C,mCAAoC,CACpC,gBAAkB,CAClB,8BAA+B,CAC/B,iBA2BF,CAzBE,gCACE,qDAAsD,CACtD,oEACF,CAEA,iCACE,sDAAuD,CACvD,qEACF,CAEA,qCACE,iDACF,CAEA,sCACE,8CACF,CAEA,qCACE,+CACF,CAEA,yCACE,6CACF,CAGF,mBACE,gFACF","file":"inline_message.css","sourcesContent":[".InlineMessage {\n display: grid;\n /* stylelint-disable-next-line primer/typography */\n font-size: var(--inline-message-fontSize);\n /* stylelint-disable-next-line primer/typography */\n line-height: var(--inline-message-lineHeight);\n /* stylelint-disable-next-line primer/colors */\n color: var(--inline-message-fgColor);\n column-gap: 0.5rem;\n grid-template-columns: auto 1fr;\n align-items: start;\n\n &[data-size='small'] {\n --inline-message-fontSize: var(--text-body-size-small);\n --inline-message-lineHeight: var(--text-body-lineHeight-small, 1.6666);\n }\n\n &[data-size='medium'] {\n --inline-message-fontSize: var(--text-body-size-medium);\n --inline-message-lineHeight: var(--text-body-lineHeight-medium, 1.4285);\n }\n\n &[data-variant='warning'] {\n --inline-message-fgColor: var(--fgColor-attention);\n }\n\n &[data-variant='critical'] {\n --inline-message-fgColor: var(--fgColor-danger);\n }\n\n &[data-variant='success'] {\n --inline-message-fgColor: var(--fgColor-success);\n }\n\n &[data-variant='unavailable'] {\n --inline-message-fgColor: var(--fgColor-muted);\n }\n}\n\n.InlineMessageIcon {\n min-height: calc(var(--inline-message-lineHeight) * var(--inline-message-fontSize));\n}"]}
@@ -19,7 +19,7 @@ module Primer
19
19
  end
20
20
  end
21
21
 
22
- def render_in(view_context, &block)
22
+ def render_in(view_context, **_kwargs, &block)
23
23
  super(view_context) do
24
24
  block&.call(@dialog, @button)
25
25
  end
@@ -19,7 +19,7 @@ module Primer
19
19
  end
20
20
  end
21
21
 
22
- def render_in(view_context, &block)
22
+ def render_in(view_context, **_kwargs, &block)
23
23
  super(view_context) do
24
24
  block&.call(@menu, @button)
25
25
  end
@@ -1 +1 @@
1
- .PageHeader{border-bottom:var(--borderWidth-thin) solid var(--borderColor-muted);display:flex;flex-flow:column;margin-bottom:var(--base-size-16);padding-bottom:var(--base-size-8)}.PageHeader--withTabNav{border-bottom:none;margin-bottom:0;padding-bottom:0}.PageHeader-contextBar{height:var(--control-small-size)}.PageHeader-contextBar,.PageHeader-titleBar{align-items:center;display:flex;flex-flow:row;justify-content:flex-end;margin-bottom:var(--base-size-8)}.PageHeader-title{flex:1 1 auto;font-size:var(--text-title-size-medium)}.PageHeader-title--large{font-size:var(--text-title-size-large)}.PageHeader-description{color:var(--fgColor-muted);flex:1 auto;font-size:var(--text-body-size-medium)}.PageHeader-description--underlined-links a{-webkit-text-decoration:underline;text-decoration:underline}.PageHeader-tabNavBar{overflow:auto}.PageHeader-tabNavBar .PageHeader-tabNav{min-width:max-content}.PageHeader--withTabNav .PageHeader-description{margin-bottom:var(--base-size-16)}.PageHeader-actions{align-items:center;display:flex;justify-content:flex-end}.PageHeader-breadcrumbs{display:block;width:100%}.PageHeader-leadingAction{margin-right:var(--base-size-4);margin-top:var(--base-size-2)}.PageHeader-parentLink{flex:1 1 auto}@media screen and (min-width:543.98px){.PageHeader--noBreadcrumb .PageHeader-contextBar{display:none}}.PageHeader--noBreadcrumb .PageHeader-titleBar{line-height:var(--control-small-size)}.PageHeader--noBreadcrumb .PageHeader-actions{height:var(--control-small-size)}
1
+ .PageHeader{display:flex;padding-bottom:var(--base-size-8);margin-bottom:var(--base-size-16);border-bottom:var(--borderWidth-thin) solid var(--borderColor-muted);flex-flow:column}.PageHeader--withTabNav{border-bottom:none;padding-bottom:0;margin-bottom:0}.PageHeader-contextBar{height:var(--control-small-size)}.PageHeader-contextBar,.PageHeader-titleBar{display:flex;flex-flow:row;justify-content:flex-end;align-items:center;margin-bottom:var(--base-size-8)}.PageHeader-title{font-size:var(--text-title-size-medium);flex:1 1 auto}.PageHeader-title--large{font-size:var(--text-title-size-large)}.PageHeader-description{font-size:var(--text-body-size-medium);color:var(--fgColor-muted);flex:1 auto}.PageHeader-description--underlined-links a{-webkit-text-decoration:underline;text-decoration:underline}.PageHeader-tabNavBar{overflow:auto}.PageHeader-tabNavBar .PageHeader-tabNav{min-width:max-content}.PageHeader--withTabNav .PageHeader-description{margin-bottom:var(--base-size-16)}.PageHeader-actions{justify-content:flex-end;display:flex;align-items:center}.PageHeader-breadcrumbs{display:block;width:100%}.PageHeader-leadingAction{margin-top:var(--base-size-2);margin-right:var(--base-size-4)}.PageHeader-parentLink{flex:1 1 auto}@media screen and (min-width:543.98px){.PageHeader--noBreadcrumb .PageHeader-contextBar{display:none}}.PageHeader--noBreadcrumb .PageHeader-titleBar{line-height:var(--control-small-size)}.PageHeader--noBreadcrumb .PageHeader-actions{height:var(--control-small-size)}
@@ -1 +1 @@
1
- {"version":3,"sources":["page_header.pcss"],"names":[],"mappings":"AAEA,YAIE,oEAAqE,CAHrE,YAAa,CAIb,gBAAiB,CAFjB,iCAAkC,CADlC,iCAIF,CAEA,wBACE,kBAAmB,CAEnB,eAAgB,CADhB,gBAEF,CAEA,uBAME,gCACF,CAEA,4CALE,kBAAmB,CAHnB,YAAa,CACb,aAAc,CACd,wBAAyB,CAEzB,gCAUF,CAEA,kBAEE,aAAc,CADd,uCAEF,CAEA,yBACE,sCACF,CAGA,wBAEE,0BAA2B,CAC3B,WAAY,CAFZ,sCAGF,CAEA,4CAEE,iCAA0B,CAA1B,yBACF,CAEA,sBACE,aACF,CAEA,yCACE,qBACF,CAEA,gDACE,iCACF,CAEA,oBAGE,kBAAmB,CADnB,YAAa,CADb,wBAGF,CAEA,wBACE,aAAc,CACd,UACF,CAEA,0BAEE,+BAAgC,CADhC,6BAEF,CAEA,uBACE,aACF,CAGA,uCACE,iDACE,YACF,CACF,CAIE,+CACE,qCACF,CAEA,8CACE,gCACF","file":"page_header.css","sourcesContent":["/* OP PageHeader */\n\n.PageHeader {\n display: flex;\n padding-bottom: var(--base-size-8);\n margin-bottom: var(--base-size-16);\n border-bottom: var(--borderWidth-thin) solid var(--borderColor-muted);\n flex-flow: column;\n}\n\n.PageHeader--withTabNav {\n border-bottom: none;\n padding-bottom: 0;\n margin-bottom: 0;\n}\n\n.PageHeader-contextBar {\n display: flex;\n flex-flow: row;\n justify-content: flex-end;\n align-items: center;\n margin-bottom: var(--base-size-8);\n height: var(--control-small-size);\n}\n\n.PageHeader-titleBar {\n display: flex;\n flex-flow: row;\n justify-content: flex-end;\n align-items: center; /* Keep back button vertically aligned. */\n margin-bottom: var(--base-size-8);\n}\n\n.PageHeader-title {\n font-size: var(--text-title-size-medium);\n flex: 1 1 auto;\n}\n\n.PageHeader-title--large {\n font-size: var(--text-title-size-large);\n}\n\n/* One-liner of supporting text */\n.PageHeader-description {\n font-size: var(--text-body-size-medium);\n color: var(--fgColor-muted);\n flex: 1 auto;\n}\n\n.PageHeader-description--underlined-links a {\n /* Ensure the accessibility is met, given that the description is written in light grey */\n text-decoration: underline;\n}\n\n.PageHeader-tabNavBar {\n overflow: auto;\n}\n\n.PageHeader-tabNavBar .PageHeader-tabNav {\n min-width: max-content;\n}\n\n.PageHeader--withTabNav .PageHeader-description {\n margin-bottom: var(--base-size-16);\n}\n\n.PageHeader-actions {\n justify-content: flex-end;\n display: flex;\n align-items: center;\n}\n\n.PageHeader-breadcrumbs {\n display: block;\n width: 100%;\n}\n\n.PageHeader-leadingAction {\n margin-top: var(--base-size-2); /* to center align with label */\n margin-right: var(--base-size-4);\n}\n\n.PageHeader-parentLink {\n flex: 1 1 auto;\n}\n\n/* Hide the context bar on desktop when no breadcrumb is visible */\n@media screen and (min-width: 543.98px) {\n .PageHeader--noBreadcrumb .PageHeader-contextBar {\n display: none;\n }\n}\n\n/* Match the title bar and actions height with the toggle menu button for proper vertical alignment */\n.PageHeader--noBreadcrumb {\n & .PageHeader-titleBar {\n line-height: var(--control-small-size);\n }\n\n & .PageHeader-actions {\n height: var(--control-small-size);\n }\n}"]}
1
+ {"version":3,"sources":["page_header.pcss"],"names":[],"mappings":"AAEA,YACE,YAAa,CACb,iCAAkC,CAClC,iCAAkC,CAClC,oEAAqE,CACrE,gBACF,CAEA,wBACE,kBAAmB,CACnB,gBAAiB,CACjB,eACF,CAEA,uBAME,gCACF,CAEA,4CARE,YAAa,CACb,aAAc,CACd,wBAAyB,CACzB,kBAAmB,CACnB,gCAUF,CAEA,kBACE,uCAAwC,CACxC,aACF,CAEA,yBACE,sCACF,CAGA,wBACE,sCAAuC,CACvC,0BAA2B,CAC3B,WACF,CAGA,4CAEE,iCAA0B,CAA1B,yBACF,CAEA,sBACE,aACF,CAEA,yCACE,qBACF,CAEA,gDACE,iCACF,CAEA,oBACE,wBAAyB,CACzB,YAAa,CACb,kBACF,CAEA,wBACE,aAAc,CACd,UACF,CAEA,0BACE,6BAA8B,CAC9B,+BACF,CAEA,uBACE,aACF,CAGA,uCACE,iDACE,YACF,CACF,CAIE,+CAEE,qCACF,CAEA,8CACE,gCACF","file":"page_header.css","sourcesContent":["/* OP PageHeader */\n\n.PageHeader {\n display: flex;\n padding-bottom: var(--base-size-8);\n margin-bottom: var(--base-size-16);\n border-bottom: var(--borderWidth-thin) solid var(--borderColor-muted);\n flex-flow: column;\n}\n\n.PageHeader--withTabNav {\n border-bottom: none;\n padding-bottom: 0;\n margin-bottom: 0;\n}\n\n.PageHeader-contextBar {\n display: flex;\n flex-flow: row;\n justify-content: flex-end;\n align-items: center;\n margin-bottom: var(--base-size-8);\n height: var(--control-small-size);\n}\n\n.PageHeader-titleBar {\n display: flex;\n flex-flow: row;\n justify-content: flex-end;\n align-items: center; /* Keep back button vertically aligned. */\n margin-bottom: var(--base-size-8);\n}\n\n.PageHeader-title {\n font-size: var(--text-title-size-medium);\n flex: 1 1 auto;\n}\n\n.PageHeader-title--large {\n font-size: var(--text-title-size-large);\n}\n\n/* One-liner of supporting text */\n.PageHeader-description {\n font-size: var(--text-body-size-medium);\n color: var(--fgColor-muted);\n flex: 1 auto;\n}\n\n/* stylelint-disable-next-line selector-max-type -- description holds rich text; links can only be targeted by the `a` type selector */\n.PageHeader-description--underlined-links a {\n /* Ensure the accessibility is met, given that the description is written in light grey */\n text-decoration: underline;\n}\n\n.PageHeader-tabNavBar {\n overflow: auto;\n}\n\n.PageHeader-tabNavBar .PageHeader-tabNav {\n min-width: max-content;\n}\n\n.PageHeader--withTabNav .PageHeader-description {\n margin-bottom: var(--base-size-16);\n}\n\n.PageHeader-actions {\n justify-content: flex-end;\n display: flex;\n align-items: center;\n}\n\n.PageHeader-breadcrumbs {\n display: block;\n width: 100%;\n}\n\n.PageHeader-leadingAction {\n margin-top: var(--base-size-2); /* to center align with label */\n margin-right: var(--base-size-4);\n}\n\n.PageHeader-parentLink {\n flex: 1 1 auto;\n}\n\n/* Hide the context bar on desktop when no breadcrumb is visible */\n@media screen and (min-width: 543.98px) {\n .PageHeader--noBreadcrumb .PageHeader-contextBar {\n display: none;\n }\n}\n\n/* Match the title bar and actions height with the toggle menu button for proper vertical alignment */\n.PageHeader--noBreadcrumb {\n & .PageHeader-titleBar {\n /* stylelint-disable-next-line primer/typography -- control size var intentionally matches the toggle-menu button height for vertical alignment */\n line-height: var(--control-small-size);\n }\n\n & .PageHeader-actions {\n height: var(--control-small-size);\n }\n}"]}
@@ -47,6 +47,7 @@
47
47
  flex: 1 auto;
48
48
  }
49
49
 
50
+ /* stylelint-disable-next-line selector-max-type -- description holds rich text; links can only be targeted by the `a` type selector */
50
51
  .PageHeader-description--underlined-links a {
51
52
  /* Ensure the accessibility is met, given that the description is written in light grey */
52
53
  text-decoration: underline;
@@ -94,6 +95,7 @@
94
95
  /* Match the title bar and actions height with the toggle menu button for proper vertical alignment */
95
96
  .PageHeader--noBreadcrumb {
96
97
  & .PageHeader-titleBar {
98
+ /* stylelint-disable-next-line primer/typography -- control size var intentionally matches the toggle-menu button height for vertical alignment */
97
99
  line-height: var(--control-small-size);
98
100
  }
99
101
 
@@ -1 +1 @@
1
- .Page{align-items:center;border-radius:var(--borderRadius-medium,.375rem);color:var(--fgColor-default);cursor:pointer;display:inline-flex;height:var(--base-size-32);justify-content:center;margin-right:var(--base-size-4);min-width:var(--base-size-32);padding:var(--base-size-8) var(--base-size-6);transition:background-color .2s cubic-bezier(.3,0,.5,1);vertical-align:middle;white-space:nowrap}.Page[rel=next]>svg,.Page[rel=prev]>svg{height:var(--base-size-16);width:var(--base-size-16)}.Page[rel=prev]>svg{margin-inline-end:var(--base-size-4)}.Page[rel=next]>svg{margin-inline-start:var(--base-size-4)}.Page:last-child{margin-right:0}.Page:focus,.Page:hover{background-color:var(--control-transparent-bgColor-hover);outline:0;-webkit-text-decoration:none;text-decoration:none;transition-duration:.1s}.Page:focus-visible{outline:2px solid var(--bgColor-accent-emphasis)}.Page:active{border-color:var(--borderColor-muted)}.Page[rel=next],.Page[rel=prev]{color:var(--fgColor-accent)}.Page[aria-current],.Page[aria-current]:hover{background-color:var(--bgColor-accent-emphasis);border-color:#0000;color:var(--fgColor-onEmphasis)}.Page[aria-current]:focus-visible{box-shadow:inset 0 0 0 var(--base-size-2) var(--fgColor-onEmphasis);outline:2px solid var(--bgColor-accent-emphasis)}.Page[aria-hidden],.Page[aria-hidden]:hover,.Page[role=presentation],.Page[role=presentation]:hover{background-color:initial;color:var(--fgColor-disabled);cursor:default}.PaginationContainer{margin:var(--base-size-16) 0;text-align:center}@media (max-width:543.98px){.Page:not([rel=prev]):not([rel=next]){display:none}}
1
+ .Page{min-width:var(--base-size-32);height:var(--base-size-32);padding:var(--base-size-8) var(--base-size-6);margin-right:var(--base-size-4);color:var(--fgColor-default);white-space:nowrap;vertical-align:middle;cursor:pointer;border-radius:var(--borderRadius-medium);transition:background-color .2s cubic-bezier(.3,0,.5,1);display:inline-flex;align-items:center;justify-content:center}.Page[rel=next]>svg,.Page[rel=prev]>svg{height:var(--base-size-16);width:var(--base-size-16)}.Page[rel=prev]>svg{margin-inline-end:var(--base-size-4)}.Page[rel=next]>svg{margin-inline-start:var(--base-size-4)}.Page:last-child{margin-right:0}.Page:focus,.Page:hover{-webkit-text-decoration:none;text-decoration:none;background-color:var(--control-transparent-bgColor-hover);outline:0;transition-duration:.1s}.Page:focus-visible{outline:2px solid var(--bgColor-accent-emphasis)}.Page:active{border-color:var(--borderColor-muted)}.Page[rel=next],.Page[rel=prev]{color:var(--fgColor-accent)}.Page[aria-current],.Page[aria-current]:hover{color:var(--fgColor-onEmphasis);background-color:var(--bgColor-accent-emphasis);border-color:#0000}.Page[aria-current]:focus-visible{outline:2px solid var(--bgColor-accent-emphasis);box-shadow:inset 0 0 0 var(--base-size-2) var(--fgColor-onEmphasis)}.Page[aria-hidden],.Page[aria-hidden]:hover,.Page[role=presentation],.Page[role=presentation]:hover{color:var(--fgColor-disabled);cursor:default;background-color:initial}.PaginationContainer{margin:var(--base-size-16) 0;text-align:center}@media (max-width:543.98px){.Page:not([rel=prev]):not([rel=next]){display:none}}
@@ -1 +1 @@
1
- {"version":3,"sources":["pagination.pcss"],"names":[],"mappings":"AAAA,MAYE,kBAAmB,CAHnB,gDAAiD,CAJjD,4BAA6B,CAG7B,cAAe,CAGf,mBAAoB,CATpB,0BAA2B,CAW3B,sBAAuB,CATvB,+BAAgC,CAHhC,6BAA8B,CAE9B,6CAA8C,CAO9C,uDAA8D,CAH9D,qBAAsB,CADtB,kBAQF,CAEA,wCAEE,0BAA2B,CAC3B,yBACF,CAEA,oBACE,oCACF,CAEA,oBACE,sCACF,CAEA,iBACE,cACF,CAEA,wBAGE,yDAA0D,CAC1D,SAAU,CAFV,4BAAqB,CAArB,oBAAqB,CAGrB,uBACF,CAEA,oBACE,gDACF,CAEA,aACE,qCACF,CAEA,gCAEE,2BACF,CAEA,8CAGE,+CAAgD,CAChD,kBAAyB,CAFzB,+BAGF,CAEA,kCAEE,mEAAoE,CADpE,gDAEF,CAEA,oGAME,wBAA6B,CAF7B,6BAA8B,CAC9B,cAEF,CAEA,qBACE,4BAA6B,CAC7B,iBACF,CAEA,4BACE,sCACE,YACF,CACF","file":"pagination.css","sourcesContent":[".Page {\n min-width: var(--base-size-32);\n height: var(--base-size-32);\n padding: var(--base-size-8) var(--base-size-6);\n margin-right: var(--base-size-4);\n color: var(--fgColor-default);\n white-space: nowrap;\n vertical-align: middle;\n cursor: pointer;\n border-radius: var(--borderRadius-medium,.375rem);\n transition: background-color 0.2s cubic-bezier(0.3, 0, 0.5, 1);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.Page[rel='prev'] > svg,\n.Page[rel='next'] > svg {\n height: var(--base-size-16);\n width: var(--base-size-16);\n}\n\n.Page[rel='prev'] > svg {\n margin-inline-end: var(--base-size-4);\n}\n\n.Page[rel='next'] > svg {\n margin-inline-start: var(--base-size-4);\n}\n\n.Page:last-child {\n margin-right: 0;\n}\n\n.Page:hover,\n.Page:focus {\n text-decoration: none;\n background-color: var(--control-transparent-bgColor-hover);\n outline: 0;\n transition-duration: 0.1s;\n}\n\n.Page:focus-visible {\n outline: 2px solid var(--bgColor-accent-emphasis);\n}\n\n.Page:active {\n border-color: var(--borderColor-muted);\n}\n\n.Page[rel='prev'],\n.Page[rel='next'] {\n color: var(--fgColor-accent);\n}\n\n.Page[aria-current],\n.Page[aria-current]:hover {\n color: var(--fgColor-onEmphasis);\n background-color: var(--bgColor-accent-emphasis);\n border-color: transparent;\n}\n\n.Page[aria-current]:focus-visible {\n outline: 2px solid var(--bgColor-accent-emphasis);\n box-shadow: inset 0 0 0 var(--base-size-2) var(--fgColor-onEmphasis);\n}\n\n.Page[aria-hidden],\n.Page[aria-hidden]:hover,\n.Page[role='presentation'],\n.Page[role='presentation']:hover {\n color: var(--fgColor-disabled);\n cursor: default;\n background-color: transparent;\n}\n\n.PaginationContainer {\n margin: var(--base-size-16) 0;\n text-align: center;\n}\n\n@media (max-width: 543.98px){\n .Page:not([rel='prev']):not([rel='next']) {\n display: none;\n }\n}\n"]}
1
+ {"version":3,"sources":["pagination.pcss"],"names":[],"mappings":"AAEA,MACE,6BAA8B,CAC9B,0BAA2B,CAC3B,6CAA8C,CAC9C,+BAAgC,CAChC,4BAA6B,CAC7B,kBAAmB,CACnB,qBAAsB,CACtB,cAAe,CACf,wCAAyC,CACzC,uDAA8D,CAC9D,mBAAoB,CACpB,kBAAmB,CACnB,sBACF,CAEA,wCAEE,0BAA2B,CAC3B,yBACF,CAEA,oBACE,oCACF,CAEA,oBACE,sCACF,CAEA,iBACE,cACF,CAEA,wBAEE,4BAAqB,CAArB,oBAAqB,CACrB,yDAA0D,CAC1D,SAAU,CACV,uBACF,CAEA,oBACE,gDACF,CAEA,aACE,qCACF,CAEA,gCAEE,2BACF,CAEA,8CAEE,+BAAgC,CAChC,+CAAgD,CAChD,kBACF,CAEA,kCACE,gDAAiD,CAEjD,mEACF,CAEA,oGAIE,6BAA8B,CAC9B,cAAe,CACf,wBACF,CAEA,qBACE,4BAA6B,CAC7B,iBACF,CAEA,4BACE,sCACE,YACF,CACF","file":"pagination.css","sourcesContent":["/* stylelint-disable selector-max-type -- pagination arrows are styled via `.Page[rel] > svg`; the svg icon can only be targeted by its type selector */\n\n.Page {\n min-width: var(--base-size-32);\n height: var(--base-size-32);\n padding: var(--base-size-8) var(--base-size-6);\n margin-right: var(--base-size-4);\n color: var(--fgColor-default);\n white-space: nowrap;\n vertical-align: middle;\n cursor: pointer;\n border-radius: var(--borderRadius-medium);\n transition: background-color 0.2s cubic-bezier(0.3, 0, 0.5, 1);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.Page[rel='prev'] > svg,\n.Page[rel='next'] > svg {\n height: var(--base-size-16);\n width: var(--base-size-16);\n}\n\n.Page[rel='prev'] > svg {\n margin-inline-end: var(--base-size-4);\n}\n\n.Page[rel='next'] > svg {\n margin-inline-start: var(--base-size-4);\n}\n\n.Page:last-child {\n margin-right: 0;\n}\n\n.Page:hover,\n.Page:focus {\n text-decoration: none;\n background-color: var(--control-transparent-bgColor-hover);\n outline: 0;\n transition-duration: 0.1s;\n}\n\n.Page:focus-visible {\n outline: 2px solid var(--bgColor-accent-emphasis);\n}\n\n.Page:active {\n border-color: var(--borderColor-muted);\n}\n\n.Page[rel='prev'],\n.Page[rel='next'] {\n color: var(--fgColor-accent);\n}\n\n.Page[aria-current],\n.Page[aria-current]:hover {\n color: var(--fgColor-onEmphasis);\n background-color: var(--bgColor-accent-emphasis);\n border-color: transparent;\n}\n\n.Page[aria-current]:focus-visible {\n outline: 2px solid var(--bgColor-accent-emphasis);\n /* stylelint-disable-next-line primer/box-shadow -- custom focus-ring built from Primer size/color primitives; no single Primer box-shadow token matches */\n box-shadow: inset 0 0 0 var(--base-size-2) var(--fgColor-onEmphasis);\n}\n\n.Page[aria-hidden],\n.Page[aria-hidden]:hover,\n.Page[role='presentation'],\n.Page[role='presentation']:hover {\n color: var(--fgColor-disabled);\n cursor: default;\n background-color: transparent;\n}\n\n.PaginationContainer {\n margin: var(--base-size-16) 0;\n text-align: center;\n}\n\n@media (max-width: 543.98px){\n .Page:not([rel='prev']):not([rel='next']) {\n display: none;\n }\n}\n"]}
@@ -1,3 +1,5 @@
1
+ /* stylelint-disable selector-max-type -- pagination arrows are styled via `.Page[rel] > svg`; the svg icon can only be targeted by its type selector */
2
+
1
3
  .Page {
2
4
  min-width: var(--base-size-32);
3
5
  height: var(--base-size-32);
@@ -7,7 +9,7 @@
7
9
  white-space: nowrap;
8
10
  vertical-align: middle;
9
11
  cursor: pointer;
10
- border-radius: var(--borderRadius-medium,.375rem);
12
+ border-radius: var(--borderRadius-medium);
11
13
  transition: background-color 0.2s cubic-bezier(0.3, 0, 0.5, 1);
12
14
  display: inline-flex;
13
15
  align-items: center;
@@ -62,6 +64,7 @@
62
64
 
63
65
  .Page[aria-current]:focus-visible {
64
66
  outline: 2px solid var(--bgColor-accent-emphasis);
67
+ /* stylelint-disable-next-line primer/box-shadow -- custom focus-ring built from Primer size/color primitives; no single Primer box-shadow token matches */
65
68
  box-shadow: inset 0 0 0 var(--base-size-2) var(--fgColor-onEmphasis);
66
69
  }
67
70
 
@@ -1 +1 @@
1
- .SidePanel-sectionHeader{align-items:center;display:flex;height:32px;margin-bottom:8px}.SidePanel-sectionCounter{margin-left:8px}.SidePanel-sectionAction{display:flex;flex:1;justify-content:right}.SidePanel-sectionContent,.SidePanel-sectionDescription{margin-top:0}:is(.SidePanel-sectionContent,.SidePanel-sectionDescription):not(:last-child){margin-bottom:16px}
1
+ .SidePanel-sectionHeader{display:flex;align-items:center;height:32px;margin-bottom:var(--base-size-8)}.SidePanel-sectionCounter{margin-left:var(--base-size-8)}.SidePanel-sectionAction{justify-content:right;flex:1;display:flex}.SidePanel-sectionContent,.SidePanel-sectionDescription{margin-top:0}:is(.SidePanel-sectionContent,.SidePanel-sectionDescription):not(:last-child){margin-bottom:var(--base-size-16)}
@@ -1 +1 @@
1
- {"version":3,"sources":["section.pcss"],"names":[],"mappings":"AAEA,yBAEE,kBAAmB,CADnB,YAAa,CAEb,WAAY,CACZ,iBACF,CAEA,0BACE,eACF,CAEA,yBAGE,YAAa,CADb,MAAO,CADP,qBAGF,CAEA,wDAEE,YAKF,CAHE,8EACE,kBACF","file":"section.css","sourcesContent":["/* CSS for OpenProject::SidePanel::Section */\n\n.SidePanel-sectionHeader {\n display: flex;\n align-items: center;\n height: 32px;\n margin-bottom: 8px;\n}\n\n.SidePanel-sectionCounter {\n margin-left: 8px;\n}\n\n.SidePanel-sectionAction {\n justify-content: right;\n flex: 1;\n display: flex;\n}\n\n.SidePanel-sectionContent,\n.SidePanel-sectionDescription {\n margin-top: 0;\n\n &:not(:last-child) {\n margin-bottom: 16px;\n }\n}\n"]}
1
+ {"version":3,"sources":["section.pcss"],"names":[],"mappings":"AAEA,yBACE,YAAa,CACb,kBAAmB,CACnB,WAAY,CACZ,gCACF,CAEA,0BACE,8BACF,CAEA,yBACE,qBAAsB,CACtB,MAAO,CACP,YACF,CAEA,wDAEE,YAKF,CAHE,8EACE,iCACF","file":"section.css","sourcesContent":["/* CSS for OpenProject::SidePanel::Section */\n\n.SidePanel-sectionHeader {\n display: flex;\n align-items: center;\n height: 32px;\n margin-bottom: var(--base-size-8);\n}\n\n.SidePanel-sectionCounter {\n margin-left: var(--base-size-8);\n}\n\n.SidePanel-sectionAction {\n justify-content: right;\n flex: 1;\n display: flex;\n}\n\n.SidePanel-sectionContent,\n.SidePanel-sectionDescription {\n margin-top: 0;\n\n &:not(:last-child) {\n margin-bottom: var(--base-size-16);\n }\n}\n"]}
@@ -4,11 +4,11 @@
4
4
  display: flex;
5
5
  align-items: center;
6
6
  height: 32px;
7
- margin-bottom: 8px;
7
+ margin-bottom: var(--base-size-8);
8
8
  }
9
9
 
10
10
  .SidePanel-sectionCounter {
11
- margin-left: 8px;
11
+ margin-left: var(--base-size-8);
12
12
  }
13
13
 
14
14
  .SidePanel-sectionAction {
@@ -22,6 +22,6 @@
22
22
  margin-top: 0;
23
23
 
24
24
  &:not(:last-child) {
25
- margin-bottom: 16px;
25
+ margin-bottom: var(--base-size-16);
26
26
  }
27
27
  }
@@ -1 +1 @@
1
- .SubHeader{align-items:baseline;display:grid;grid-template-areas:"left middle right" "bottom bottom bottom";grid-template-columns:auto 1fr auto;margin-bottom:var(--base-size-16)}.SubHeader-rightPane{align-items:center;column-gap:12px;display:flex;grid-area:right}.SubHeader-middlePane{grid-area:middle;text-align:center;white-space:nowrap}.SubHeader-bottomPane{grid-area:bottom}.SubHeader-leftPane{align-items:center;display:flex;flex-wrap:wrap;grid-area:left;row-gap:var(--base-size-16);width:100%}:is(.SubHeader-leftPane [class*=FormControl-input-width--]):not(.FormControl-input-width--auto){width:100vw}.SubHeader-filterContainer{display:flex;flex-basis:max-content;gap:8px;width:100%}.SubHeader-filterInput_hiddenClearButton+.FormControl-input-trailingAction{display:none}@media (max-width:767.98px){.SubHeader{grid-template-areas:"left right" "middle middle" "bottom bottom";grid-template-columns:1fr auto}.SubHeader--expandedSearch{grid-template-areas:"left left" "middle middle" "bottom bottom"}.SubHeader--expandedSearch .SubHeader-hiddenOnExpand{display:none!important}.SubHeader--emptyLeftPane{grid-template-areas:"middle middle right" "bottom bottom bottom";grid-template-columns:auto 1fr auto}.SubHeader--emptyLeftPane .SubHeader-middlePane{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.SubHeader-middlePane{text-align:left}.SubHeader-middlePane:has(>*){margin-top:var(--base-size-16)}}
1
+ .SubHeader{display:grid;grid-template-areas:"left middle right" "bottom bottom bottom";grid-template-columns:auto 1fr auto;align-items:baseline;margin-bottom:var(--base-size-16)}.SubHeader-rightPane{grid-area:right;display:flex;align-items:center;column-gap:12px}.SubHeader-middlePane{grid-area:middle;text-align:center;white-space:nowrap}.SubHeader-bottomPane{grid-area:bottom}.SubHeader-leftPane{grid-area:left;display:flex;align-items:center;flex-wrap:wrap;row-gap:var(--base-size-16);width:100%}:is(.SubHeader-leftPane [class*=FormControl-input-width--]):not(.FormControl-input-width--auto){width:100vw}.SubHeader-filterContainer{display:flex;flex-basis:max-content;width:100%;gap:8px}.SubHeader-filterInput_hiddenClearButton+.FormControl-input-trailingAction{display:none}@media (max-width:767.98px){.SubHeader{grid-template-areas:"left right" "middle middle" "bottom bottom";grid-template-columns:1fr auto}.SubHeader--expandedSearch{grid-template-areas:"left left" "middle middle" "bottom bottom"}.SubHeader--expandedSearch .SubHeader-hiddenOnExpand{display:none!important}.SubHeader--emptyLeftPane{grid-template-areas:"middle middle right" "bottom bottom bottom";grid-template-columns:auto 1fr auto}.SubHeader--emptyLeftPane .SubHeader-middlePane{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.SubHeader-middlePane{text-align:left}.SubHeader-middlePane:has(>*){margin-top:var(--base-size-16)}}
@@ -1 +1 @@
1
- {"version":3,"sources":["sub_header.pcss"],"names":[],"mappings":"AAEA,WAII,oBAAqB,CAHrB,YAAa,CACb,8DAA+D,CAC/D,mCAAoC,CAEpC,iCACJ,CAEA,qBAGI,kBAAmB,CACnB,eAAgB,CAFhB,YAAa,CADb,eAIJ,CAEA,sBACI,gBAAiB,CACjB,iBAAkB,CAClB,kBACJ,CAEA,sBACI,gBACJ,CAEA,oBAGI,kBAAmB,CADnB,YAAa,CAEb,cAAe,CAHf,cAAe,CAIf,2BAA4B,CAC5B,UASJ,CAJQ,gGACI,WACJ,CAIR,2BACI,YAAa,CACb,sBAAuB,CAEvB,OAAQ,CADR,UAEJ,CAEA,2EACE,YACF,CAEA,4BACI,WACI,gEAAiE,CACjE,8BACJ,CAEA,2BACI,+DACJ,CAEA,qDACI,sBACJ,CAEA,0BACI,gEAAiE,CACjE,mCACJ,CAEA,gDAGI,eAAgB,CADhB,sBAAuB,CADvB,kBAGJ,CAEA,sBACI,eACJ,CAEA,8BACI,8BACJ,CACJ","file":"sub_header.css","sourcesContent":["/* CSS for SubHeader */\n\n.SubHeader {\n display: grid;\n grid-template-areas: \"left middle right\" \"bottom bottom bottom\";\n grid-template-columns: auto 1fr auto;\n align-items: baseline;\n margin-bottom: var(--base-size-16);\n}\n\n.SubHeader-rightPane {\n grid-area: right;\n display: flex;\n align-items: center;\n column-gap: 12px;\n}\n\n.SubHeader-middlePane {\n grid-area: middle;\n text-align: center;\n white-space: nowrap;\n}\n\n.SubHeader-bottomPane {\n grid-area: bottom;\n}\n\n.SubHeader-leftPane {\n grid-area: left;\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n row-gap: var(--base-size-16);\n width: 100%;\n\n /* Since the container is not full width (due to the grid around it)\n we want it to grow, and then be limited by the max-width of the \"FormControl-input-width--xy\" class */\n & [class*='FormControl-input-width--'] {\n &:not(.FormControl-input-width--auto) {\n width: 100vw;\n }\n }\n}\n\n.SubHeader-filterContainer {\n display: flex;\n flex-basis: max-content;\n width: 100%;\n gap: 8px;\n}\n\n.SubHeader-filterInput_hiddenClearButton + .FormControl-input-trailingAction {\n display: none;\n}\n\n@media (max-width: 767.98px) {\n .SubHeader {\n grid-template-areas: \"left right\" \"middle middle\" \"bottom bottom\";\n grid-template-columns: 1fr auto;\n }\n\n .SubHeader--expandedSearch {\n grid-template-areas: \"left left\" \"middle middle\" \"bottom bottom\";\n }\n\n .SubHeader--expandedSearch .SubHeader-hiddenOnExpand {\n display: none !important;\n }\n\n .SubHeader--emptyLeftPane {\n grid-template-areas: \"middle middle right\" \"bottom bottom bottom\";\n grid-template-columns: auto 1fr auto;\n }\n\n .SubHeader--emptyLeftPane .SubHeader-middlePane {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .SubHeader-middlePane {\n text-align: left;\n }\n\n .SubHeader-middlePane:has(> *) {\n margin-top: var(--base-size-16);\n }\n}\n"]}
1
+ {"version":3,"sources":["sub_header.pcss"],"names":[],"mappings":"AAEA,WACI,YAAa,CACb,8DAA+D,CAC/D,mCAAoC,CACpC,oBAAqB,CACrB,iCACJ,CAEA,qBACI,eAAgB,CAChB,YAAa,CACb,kBAAmB,CACnB,eACJ,CAEA,sBACI,gBAAiB,CACjB,iBAAkB,CAClB,kBACJ,CAEA,sBACI,gBACJ,CAEA,oBACI,cAAe,CACf,YAAa,CACb,kBAAmB,CACnB,cAAe,CACf,2BAA4B,CAC5B,UASJ,CAJQ,gGACI,WACJ,CAIR,2BACI,YAAa,CACb,sBAAuB,CACvB,UAAW,CACX,OACJ,CAEA,2EACE,YACF,CAEA,4BACI,WACI,gEAAiE,CACjE,8BACJ,CAEA,2BACI,+DACJ,CAEA,qDACI,sBACJ,CAEA,0BACI,gEAAiE,CACjE,mCACJ,CAEA,gDACI,kBAAmB,CACnB,sBAAuB,CACvB,eACJ,CAEA,sBACI,eACJ,CAEA,8BACI,8BACJ,CACJ","file":"sub_header.css","sourcesContent":["/* CSS for SubHeader */\n\n.SubHeader {\n display: grid;\n grid-template-areas: \"left middle right\" \"bottom bottom bottom\";\n grid-template-columns: auto 1fr auto;\n align-items: baseline;\n margin-bottom: var(--base-size-16);\n}\n\n.SubHeader-rightPane {\n grid-area: right;\n display: flex;\n align-items: center;\n column-gap: 12px;\n}\n\n.SubHeader-middlePane {\n grid-area: middle;\n text-align: center;\n white-space: nowrap;\n}\n\n.SubHeader-bottomPane {\n grid-area: bottom;\n}\n\n.SubHeader-leftPane {\n grid-area: left;\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n row-gap: var(--base-size-16);\n width: 100%;\n\n /* Since the container is not full width (due to the grid around it)\n we want it to grow, and then be limited by the max-width of the \"FormControl-input-width--xy\" class */\n & [class*='FormControl-input-width--'] {\n &:not(.FormControl-input-width--auto) {\n width: 100vw;\n }\n }\n}\n\n.SubHeader-filterContainer {\n display: flex;\n flex-basis: max-content;\n width: 100%;\n gap: 8px;\n}\n\n.SubHeader-filterInput_hiddenClearButton + .FormControl-input-trailingAction {\n display: none;\n}\n\n@media (max-width: 767.98px) {\n .SubHeader {\n grid-template-areas: \"left right\" \"middle middle\" \"bottom bottom\";\n grid-template-columns: 1fr auto;\n }\n\n .SubHeader--expandedSearch {\n grid-template-areas: \"left left\" \"middle middle\" \"bottom bottom\";\n }\n\n .SubHeader--expandedSearch .SubHeader-hiddenOnExpand {\n display: none !important;\n }\n\n .SubHeader--emptyLeftPane {\n grid-template-areas: \"middle middle right\" \"bottom bottom bottom\";\n grid-template-columns: auto 1fr auto;\n }\n\n .SubHeader--emptyLeftPane .SubHeader-middlePane {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .SubHeader-middlePane {\n text-align: left;\n }\n\n .SubHeader-middlePane:has(> *) {\n margin-top: var(--base-size-16);\n }\n}\n"]}
@@ -10,7 +10,7 @@ module Primer
10
10
  module InstanceMethods
11
11
  delegate :render, :content_tag, :output_buffer, :capture, to: :@view_context
12
12
 
13
- def render_in(view_context, &block)
13
+ def render_in(view_context, **_kwargs, &block)
14
14
  @view_context = view_context
15
15
  before_render
16
16
  perform_render(&block)
@@ -76,7 +76,6 @@ module Primer
76
76
  @input_arguments = system_arguments
77
77
  @input_arguments.delete(:id) unless @input_arguments[:id].present?
78
78
  @label_arguments = @input_arguments.delete(:label_arguments) || {}
79
- @label_arguments[:for] = id if id.present?
80
79
 
81
80
  @label_arguments[:class] = class_names(
82
81
  @label_arguments[:class],
@@ -121,6 +120,11 @@ module Primer
121
120
  end
122
121
  # rubocop:enable Style/IfUnlessModifier
123
122
 
123
+ # Only set `for` when the id is known. Otherwise leave it unset so
124
+ # Rails generates the scoped id for both label and input; passing
125
+ # `for: nil` would suppress that and drop the association.
126
+ @label_arguments[:for] = @input_arguments[:id] if @input_arguments[:id].present?
127
+
124
128
  # Whether or not to wrap the component in a FormControl, which renders a
125
129
  # label above and validation message beneath the input.
126
130
  @form_control = @input_arguments.delete(:form_control) { true }
@@ -69,7 +69,7 @@ module Primer
69
69
  # assumes the presence of a builder so we create our own here. A builder
70
70
  # cannot be constructed without a corresponding view context, which is why
71
71
  # we have to override render_in and can't create it in the initializer.
72
- def render_in(view_context, &block)
72
+ def render_in(view_context, **_kwargs, &block)
73
73
  @builder = Primer::Forms::Builder.new(
74
74
  nil, nil, view_context, {}
75
75
  )