openproject-primer_view_components 0.6.3

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 (733) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +2931 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +17 -0
  5. data/app/assets/javascripts/app/components/primer/alpha/action_bar_element.d.ts +16 -0
  6. data/app/assets/javascripts/app/components/primer/alpha/action_menu/action_menu_element.d.ts +31 -0
  7. data/app/assets/javascripts/app/components/primer/alpha/dropdown/menu.d.ts +1 -0
  8. data/app/assets/javascripts/app/components/primer/alpha/dropdown.d.ts +1 -0
  9. data/app/assets/javascripts/app/components/primer/alpha/image_crop.d.ts +1 -0
  10. data/app/assets/javascripts/app/components/primer/alpha/modal_dialog.d.ts +18 -0
  11. data/app/assets/javascripts/app/components/primer/alpha/nav_list.d.ts +28 -0
  12. data/app/assets/javascripts/app/components/primer/alpha/segmented_control.d.ts +12 -0
  13. data/app/assets/javascripts/app/components/primer/alpha/tab_container.d.ts +1 -0
  14. data/app/assets/javascripts/app/components/primer/alpha/toggle_switch.d.ts +30 -0
  15. data/app/assets/javascripts/app/components/primer/alpha/tool_tip.d.ts +26 -0
  16. data/app/assets/javascripts/app/components/primer/alpha/x_banner.d.ts +13 -0
  17. data/app/assets/javascripts/app/components/primer/anchored_position.d.ts +27 -0
  18. data/app/assets/javascripts/app/components/primer/beta/auto_complete/auto_complete.d.ts +1 -0
  19. data/app/assets/javascripts/app/components/primer/beta/clipboard_copy.d.ts +1 -0
  20. data/app/assets/javascripts/app/components/primer/beta/relative_time.d.ts +1 -0
  21. data/app/assets/javascripts/app/components/primer/focus_group.d.ts +19 -0
  22. data/app/assets/javascripts/app/components/primer/primer.d.ts +21 -0
  23. data/app/assets/javascripts/lib/primer/forms/primer_multi_input.d.ts +10 -0
  24. data/app/assets/javascripts/lib/primer/forms/primer_text_field.d.ts +1 -0
  25. data/app/assets/javascripts/lib/primer/forms/toggle_switch_input.d.ts +5 -0
  26. data/app/assets/javascripts/primer_view_components.js +2 -0
  27. data/app/assets/javascripts/primer_view_components.js.map +1 -0
  28. data/app/assets/styles/primer_view_components.css +1 -0
  29. data/app/assets/styles/primer_view_components.css.map +1 -0
  30. data/app/components/primer/alpha/action_bar/divider.rb +30 -0
  31. data/app/components/primer/alpha/action_bar/item.rb +26 -0
  32. data/app/components/primer/alpha/action_bar.css +1 -0
  33. data/app/components/primer/alpha/action_bar.css.json +17 -0
  34. data/app/components/primer/alpha/action_bar.css.map +1 -0
  35. data/app/components/primer/alpha/action_bar.html.erb +12 -0
  36. data/app/components/primer/alpha/action_bar.pcss +69 -0
  37. data/app/components/primer/alpha/action_bar.rb +109 -0
  38. data/app/components/primer/alpha/action_bar_element.d.ts +16 -0
  39. data/app/components/primer/alpha/action_bar_element.js +172 -0
  40. data/app/components/primer/alpha/action_bar_element.ts +175 -0
  41. data/app/components/primer/alpha/action_list/divider.rb +35 -0
  42. data/app/components/primer/alpha/action_list/form_wrapper.html.erb +10 -0
  43. data/app/components/primer/alpha/action_list/form_wrapper.rb +61 -0
  44. data/app/components/primer/alpha/action_list/heading.html.erb +8 -0
  45. data/app/components/primer/alpha/action_list/heading.rb +50 -0
  46. data/app/components/primer/alpha/action_list/item.html.erb +53 -0
  47. data/app/components/primer/alpha/action_list/item.rb +301 -0
  48. data/app/components/primer/alpha/action_list.css +1 -0
  49. data/app/components/primer/alpha/action_list.css.json +134 -0
  50. data/app/components/primer/alpha/action_list.css.map +1 -0
  51. data/app/components/primer/alpha/action_list.html.erb +20 -0
  52. data/app/components/primer/alpha/action_list.pcss +697 -0
  53. data/app/components/primer/alpha/action_list.rb +256 -0
  54. data/app/components/primer/alpha/action_menu/action_menu_element.d.ts +31 -0
  55. data/app/components/primer/alpha/action_menu/action_menu_element.js +241 -0
  56. data/app/components/primer/alpha/action_menu/action_menu_element.ts +252 -0
  57. data/app/components/primer/alpha/action_menu/list.rb +123 -0
  58. data/app/components/primer/alpha/action_menu.html.erb +26 -0
  59. data/app/components/primer/alpha/action_menu.rb +411 -0
  60. data/app/components/primer/alpha/auto_complete/auto_complete.html.erb +24 -0
  61. data/app/components/primer/alpha/auto_complete/item.rb +46 -0
  62. data/app/components/primer/alpha/auto_complete.css +1 -0
  63. data/app/components/primer/alpha/auto_complete.css.json +23 -0
  64. data/app/components/primer/alpha/auto_complete.css.map +1 -0
  65. data/app/components/primer/alpha/auto_complete.pcss +118 -0
  66. data/app/components/primer/alpha/auto_complete.rb +158 -0
  67. data/app/components/primer/alpha/banner.css +1 -0
  68. data/app/components/primer/alpha/banner.css.json +24 -0
  69. data/app/components/primer/alpha/banner.css.map +1 -0
  70. data/app/components/primer/alpha/banner.html.erb +33 -0
  71. data/app/components/primer/alpha/banner.pcss +126 -0
  72. data/app/components/primer/alpha/banner.rb +141 -0
  73. data/app/components/primer/alpha/button_marketing.css +1 -0
  74. data/app/components/primer/alpha/button_marketing.css.json +33 -0
  75. data/app/components/primer/alpha/button_marketing.css.map +1 -0
  76. data/app/components/primer/alpha/button_marketing.pcss +168 -0
  77. data/app/components/primer/alpha/button_marketing.rb +73 -0
  78. data/app/components/primer/alpha/check_box.rb +74 -0
  79. data/app/components/primer/alpha/check_box_group.rb +36 -0
  80. data/app/components/primer/alpha/dialog/body.rb +28 -0
  81. data/app/components/primer/alpha/dialog/footer.rb +34 -0
  82. data/app/components/primer/alpha/dialog/header.html.erb +17 -0
  83. data/app/components/primer/alpha/dialog/header.rb +40 -0
  84. data/app/components/primer/alpha/dialog.css +1 -0
  85. data/app/components/primer/alpha/dialog.css.json +80 -0
  86. data/app/components/primer/alpha/dialog.css.map +1 -0
  87. data/app/components/primer/alpha/dialog.html.erb +12 -0
  88. data/app/components/primer/alpha/dialog.pcss +482 -0
  89. data/app/components/primer/alpha/dialog.rb +176 -0
  90. data/app/components/primer/alpha/dropdown/menu.d.ts +1 -0
  91. data/app/components/primer/alpha/dropdown/menu.html.erb +25 -0
  92. data/app/components/primer/alpha/dropdown/menu.js +1 -0
  93. data/app/components/primer/alpha/dropdown/menu.rb +107 -0
  94. data/app/components/primer/alpha/dropdown/menu.ts +1 -0
  95. data/app/components/primer/alpha/dropdown.css +1 -0
  96. data/app/components/primer/alpha/dropdown.css.json +40 -0
  97. data/app/components/primer/alpha/dropdown.css.map +1 -0
  98. data/app/components/primer/alpha/dropdown.d.ts +1 -0
  99. data/app/components/primer/alpha/dropdown.html.erb +9 -0
  100. data/app/components/primer/alpha/dropdown.js +1 -0
  101. data/app/components/primer/alpha/dropdown.pcss +261 -0
  102. data/app/components/primer/alpha/dropdown.rb +154 -0
  103. data/app/components/primer/alpha/dropdown.ts +1 -0
  104. data/app/components/primer/alpha/form_button.rb +32 -0
  105. data/app/components/primer/alpha/form_control.html.erb +26 -0
  106. data/app/components/primer/alpha/form_control.rb +105 -0
  107. data/app/components/primer/alpha/hellip_button.rb +43 -0
  108. data/app/components/primer/alpha/hidden_text_expander.rb +57 -0
  109. data/app/components/primer/alpha/image.rb +50 -0
  110. data/app/components/primer/alpha/image_crop.d.ts +1 -0
  111. data/app/components/primer/alpha/image_crop.html.erb +12 -0
  112. data/app/components/primer/alpha/image_crop.js +1 -0
  113. data/app/components/primer/alpha/image_crop.rb +39 -0
  114. data/app/components/primer/alpha/image_crop.ts +1 -0
  115. data/app/components/primer/alpha/layout.css +1 -0
  116. data/app/components/primer/alpha/layout.css.json +80 -0
  117. data/app/components/primer/alpha/layout.css.map +1 -0
  118. data/app/components/primer/alpha/layout.html.erb +5 -0
  119. data/app/components/primer/alpha/layout.pcss +268 -0
  120. data/app/components/primer/alpha/layout.rb +278 -0
  121. data/app/components/primer/alpha/menu.css +1 -0
  122. data/app/components/primer/alpha/menu.css.json +28 -0
  123. data/app/components/primer/alpha/menu.css.map +1 -0
  124. data/app/components/primer/alpha/menu.html.erb +6 -0
  125. data/app/components/primer/alpha/menu.pcss +119 -0
  126. data/app/components/primer/alpha/menu.rb +76 -0
  127. data/app/components/primer/alpha/modal_dialog.d.ts +18 -0
  128. data/app/components/primer/alpha/modal_dialog.js +189 -0
  129. data/app/components/primer/alpha/modal_dialog.ts +202 -0
  130. data/app/components/primer/alpha/multi_input.rb +81 -0
  131. data/app/components/primer/alpha/nav_list/divider.rb +14 -0
  132. data/app/components/primer/alpha/nav_list/group.html.erb +7 -0
  133. data/app/components/primer/alpha/nav_list/group.rb +107 -0
  134. data/app/components/primer/alpha/nav_list/heading.rb +36 -0
  135. data/app/components/primer/alpha/nav_list/item.html.erb +13 -0
  136. data/app/components/primer/alpha/nav_list/item.rb +156 -0
  137. data/app/components/primer/alpha/nav_list.d.ts +28 -0
  138. data/app/components/primer/alpha/nav_list.html.erb +15 -0
  139. data/app/components/primer/alpha/nav_list.js +248 -0
  140. data/app/components/primer/alpha/nav_list.rb +281 -0
  141. data/app/components/primer/alpha/nav_list.ts +267 -0
  142. data/app/components/primer/alpha/navigation/tab.html.erb +11 -0
  143. data/app/components/primer/alpha/navigation/tab.rb +168 -0
  144. data/app/components/primer/alpha/octicon_symbols.html.erb +3 -0
  145. data/app/components/primer/alpha/octicon_symbols.rb +59 -0
  146. data/app/components/primer/alpha/overlay/body.rb +26 -0
  147. data/app/components/primer/alpha/overlay/footer.rb +41 -0
  148. data/app/components/primer/alpha/overlay/header.html.erb +17 -0
  149. data/app/components/primer/alpha/overlay/header.rb +50 -0
  150. data/app/components/primer/alpha/overlay.css +1 -0
  151. data/app/components/primer/alpha/overlay.css.json +8 -0
  152. data/app/components/primer/alpha/overlay.css.map +1 -0
  153. data/app/components/primer/alpha/overlay.html.erb +13 -0
  154. data/app/components/primer/alpha/overlay.pcss +30 -0
  155. data/app/components/primer/alpha/overlay.rb +214 -0
  156. data/app/components/primer/alpha/radio_button.rb +25 -0
  157. data/app/components/primer/alpha/radio_button_group.rb +36 -0
  158. data/app/components/primer/alpha/segmented_control/item.html.erb +13 -0
  159. data/app/components/primer/alpha/segmented_control/item.rb +30 -0
  160. data/app/components/primer/alpha/segmented_control.css +1 -0
  161. data/app/components/primer/alpha/segmented_control.css.json +33 -0
  162. data/app/components/primer/alpha/segmented_control.css.map +1 -0
  163. data/app/components/primer/alpha/segmented_control.d.ts +12 -0
  164. data/app/components/primer/alpha/segmented_control.html.erb +7 -0
  165. data/app/components/primer/alpha/segmented_control.js +47 -0
  166. data/app/components/primer/alpha/segmented_control.pcss +157 -0
  167. data/app/components/primer/alpha/segmented_control.rb +122 -0
  168. data/app/components/primer/alpha/segmented_control.ts +41 -0
  169. data/app/components/primer/alpha/select.rb +37 -0
  170. data/app/components/primer/alpha/submit_button.rb +32 -0
  171. data/app/components/primer/alpha/tab_container.d.ts +1 -0
  172. data/app/components/primer/alpha/tab_container.js +1 -0
  173. data/app/components/primer/alpha/tab_container.rb +43 -0
  174. data/app/components/primer/alpha/tab_container.ts +1 -0
  175. data/app/components/primer/alpha/tab_nav.css +1 -0
  176. data/app/components/primer/alpha/tab_nav.css.json +24 -0
  177. data/app/components/primer/alpha/tab_nav.css.map +1 -0
  178. data/app/components/primer/alpha/tab_nav.html.erb +11 -0
  179. data/app/components/primer/alpha/tab_nav.pcss +100 -0
  180. data/app/components/primer/alpha/tab_nav.rb +136 -0
  181. data/app/components/primer/alpha/tab_panels.html.erb +14 -0
  182. data/app/components/primer/alpha/tab_panels.rb +89 -0
  183. data/app/components/primer/alpha/text_area.rb +24 -0
  184. data/app/components/primer/alpha/text_field.css +1 -0
  185. data/app/components/primer/alpha/text_field.css.json +135 -0
  186. data/app/components/primer/alpha/text_field.css.map +1 -0
  187. data/app/components/primer/alpha/text_field.pcss +706 -0
  188. data/app/components/primer/alpha/text_field.rb +101 -0
  189. data/app/components/primer/alpha/toggle_switch.css +1 -0
  190. data/app/components/primer/alpha/toggle_switch.css.json +40 -0
  191. data/app/components/primer/alpha/toggle_switch.css.map +1 -0
  192. data/app/components/primer/alpha/toggle_switch.d.ts +30 -0
  193. data/app/components/primer/alpha/toggle_switch.html.erb +46 -0
  194. data/app/components/primer/alpha/toggle_switch.js +165 -0
  195. data/app/components/primer/alpha/toggle_switch.pcss +220 -0
  196. data/app/components/primer/alpha/toggle_switch.rb +96 -0
  197. data/app/components/primer/alpha/toggle_switch.ts +189 -0
  198. data/app/components/primer/alpha/tool_tip.d.ts +26 -0
  199. data/app/components/primer/alpha/tool_tip.js +427 -0
  200. data/app/components/primer/alpha/tool_tip.ts +430 -0
  201. data/app/components/primer/alpha/tooltip.rb +128 -0
  202. data/app/components/primer/alpha/underline_nav.css +1 -0
  203. data/app/components/primer/alpha/underline_nav.css.json +28 -0
  204. data/app/components/primer/alpha/underline_nav.css.map +1 -0
  205. data/app/components/primer/alpha/underline_nav.html.erb +15 -0
  206. data/app/components/primer/alpha/underline_nav.pcss +134 -0
  207. data/app/components/primer/alpha/underline_nav.rb +138 -0
  208. data/app/components/primer/alpha/underline_panels.html.erb +18 -0
  209. data/app/components/primer/alpha/underline_panels.rb +86 -0
  210. data/app/components/primer/alpha/x_banner.d.ts +13 -0
  211. data/app/components/primer/alpha/x_banner.js +49 -0
  212. data/app/components/primer/alpha/x_banner.ts +40 -0
  213. data/app/components/primer/anchored_position.d.ts +27 -0
  214. data/app/components/primer/anchored_position.js +147 -0
  215. data/app/components/primer/anchored_position.ts +153 -0
  216. data/app/components/primer/base_component.rb +172 -0
  217. data/app/components/primer/beta/auto_complete/auto_complete.d.ts +1 -0
  218. data/app/components/primer/beta/auto_complete/auto_complete.html.erb +28 -0
  219. data/app/components/primer/beta/auto_complete/auto_complete.js +1 -0
  220. data/app/components/primer/beta/auto_complete/auto_complete.ts +1 -0
  221. data/app/components/primer/beta/auto_complete/item.html.erb +21 -0
  222. data/app/components/primer/beta/auto_complete/item.rb +84 -0
  223. data/app/components/primer/beta/auto_complete.rb +218 -0
  224. data/app/components/primer/beta/avatar.css +1 -0
  225. data/app/components/primer/beta/avatar.css.json +17 -0
  226. data/app/components/primer/beta/avatar.css.map +1 -0
  227. data/app/components/primer/beta/avatar.pcss +73 -0
  228. data/app/components/primer/beta/avatar.rb +84 -0
  229. data/app/components/primer/beta/avatar_stack.css +1 -0
  230. data/app/components/primer/beta/avatar_stack.css.json +28 -0
  231. data/app/components/primer/beta/avatar_stack.css.map +1 -0
  232. data/app/components/primer/beta/avatar_stack.html.erb +10 -0
  233. data/app/components/primer/beta/avatar_stack.pcss +141 -0
  234. data/app/components/primer/beta/avatar_stack.rb +92 -0
  235. data/app/components/primer/beta/base_button.rb +56 -0
  236. data/app/components/primer/beta/blankslate.css +1 -0
  237. data/app/components/primer/beta/blankslate.css.json +22 -0
  238. data/app/components/primer/beta/blankslate.css.map +1 -0
  239. data/app/components/primer/beta/blankslate.html.erb +19 -0
  240. data/app/components/primer/beta/blankslate.pcss +90 -0
  241. data/app/components/primer/beta/blankslate.rb +238 -0
  242. data/app/components/primer/beta/border_box/header.html.erb +4 -0
  243. data/app/components/primer/beta/border_box/header.rb +52 -0
  244. data/app/components/primer/beta/border_box.css +1 -0
  245. data/app/components/primer/beta/border_box.css.json +54 -0
  246. data/app/components/primer/beta/border_box.css.map +1 -0
  247. data/app/components/primer/beta/border_box.html.erb +12 -0
  248. data/app/components/primer/beta/border_box.pcss +284 -0
  249. data/app/components/primer/beta/border_box.rb +147 -0
  250. data/app/components/primer/beta/breadcrumbs.css +1 -0
  251. data/app/components/primer/beta/breadcrumbs.css.json +11 -0
  252. data/app/components/primer/beta/breadcrumbs.css.map +1 -0
  253. data/app/components/primer/beta/breadcrumbs.html.erb +8 -0
  254. data/app/components/primer/beta/breadcrumbs.pcss +30 -0
  255. data/app/components/primer/beta/breadcrumbs.rb +82 -0
  256. data/app/components/primer/beta/button.css +1 -0
  257. data/app/components/primer/beta/button.css.json +75 -0
  258. data/app/components/primer/beta/button.css.map +1 -0
  259. data/app/components/primer/beta/button.html.erb +23 -0
  260. data/app/components/primer/beta/button.pcss +366 -0
  261. data/app/components/primer/beta/button.rb +197 -0
  262. data/app/components/primer/beta/button_group.css +1 -0
  263. data/app/components/primer/beta/button_group.css.json +14 -0
  264. data/app/components/primer/beta/button_group.css.map +1 -0
  265. data/app/components/primer/beta/button_group.html.erb +5 -0
  266. data/app/components/primer/beta/button_group.pcss +27 -0
  267. data/app/components/primer/beta/button_group.rb +59 -0
  268. data/app/components/primer/beta/clipboard_copy.d.ts +1 -0
  269. data/app/components/primer/beta/clipboard_copy.html.erb +8 -0
  270. data/app/components/primer/beta/clipboard_copy.js +43 -0
  271. data/app/components/primer/beta/clipboard_copy.rb +50 -0
  272. data/app/components/primer/beta/clipboard_copy.ts +55 -0
  273. data/app/components/primer/beta/close_button.rb +43 -0
  274. data/app/components/primer/beta/counter.css +1 -0
  275. data/app/components/primer/beta/counter.css.json +10 -0
  276. data/app/components/primer/beta/counter.css.map +1 -0
  277. data/app/components/primer/beta/counter.pcss +35 -0
  278. data/app/components/primer/beta/counter.rb +113 -0
  279. data/app/components/primer/beta/details.html.erb +8 -0
  280. data/app/components/primer/beta/details.rb +80 -0
  281. data/app/components/primer/beta/flash.css +1 -0
  282. data/app/components/primer/beta/flash.css.json +27 -0
  283. data/app/components/primer/beta/flash.css.map +1 -0
  284. data/app/components/primer/beta/flash.html.erb +10 -0
  285. data/app/components/primer/beta/flash.pcss +142 -0
  286. data/app/components/primer/beta/flash.rb +71 -0
  287. data/app/components/primer/beta/heading.rb +46 -0
  288. data/app/components/primer/beta/icon_button.html.erb +6 -0
  289. data/app/components/primer/beta/icon_button.rb +112 -0
  290. data/app/components/primer/beta/label.css +1 -0
  291. data/app/components/primer/beta/label.css.json +25 -0
  292. data/app/components/primer/beta/label.css.map +1 -0
  293. data/app/components/primer/beta/label.pcss +103 -0
  294. data/app/components/primer/beta/label.rb +100 -0
  295. data/app/components/primer/beta/link.css +1 -0
  296. data/app/components/primer/beta/link.css.json +19 -0
  297. data/app/components/primer/beta/link.css.map +1 -0
  298. data/app/components/primer/beta/link.pcss +64 -0
  299. data/app/components/primer/beta/link.rb +95 -0
  300. data/app/components/primer/beta/markdown.rb +290 -0
  301. data/app/components/primer/beta/octicon.html.erb +7 -0
  302. data/app/components/primer/beta/octicon.rb +88 -0
  303. data/app/components/primer/beta/popover.css +1 -0
  304. data/app/components/primer/beta/popover.css.json +39 -0
  305. data/app/components/primer/beta/popover.css.map +1 -0
  306. data/app/components/primer/beta/popover.html.erb +6 -0
  307. data/app/components/primer/beta/popover.pcss +225 -0
  308. data/app/components/primer/beta/popover.rb +127 -0
  309. data/app/components/primer/beta/progress_bar.css +1 -0
  310. data/app/components/primer/beta/progress_bar.css.json +10 -0
  311. data/app/components/primer/beta/progress_bar.css.map +1 -0
  312. data/app/components/primer/beta/progress_bar.html.erb +5 -0
  313. data/app/components/primer/beta/progress_bar.pcss +26 -0
  314. data/app/components/primer/beta/progress_bar.rb +72 -0
  315. data/app/components/primer/beta/relative_time.d.ts +1 -0
  316. data/app/components/primer/beta/relative_time.js +1 -0
  317. data/app/components/primer/beta/relative_time.rb +166 -0
  318. data/app/components/primer/beta/relative_time.ts +1 -0
  319. data/app/components/primer/beta/spinner.html.erb +4 -0
  320. data/app/components/primer/beta/spinner.rb +45 -0
  321. data/app/components/primer/beta/state.css +1 -0
  322. data/app/components/primer/beta/state.css.json +13 -0
  323. data/app/components/primer/beta/state.css.map +1 -0
  324. data/app/components/primer/beta/state.pcss +50 -0
  325. data/app/components/primer/beta/state.rb +76 -0
  326. data/app/components/primer/beta/subhead.css +1 -0
  327. data/app/components/primer/beta/subhead.css.json +12 -0
  328. data/app/components/primer/beta/subhead.css.map +1 -0
  329. data/app/components/primer/beta/subhead.html.erb +5 -0
  330. data/app/components/primer/beta/subhead.pcss +49 -0
  331. data/app/components/primer/beta/subhead.rb +135 -0
  332. data/app/components/primer/beta/text.rb +27 -0
  333. data/app/components/primer/beta/timeline_item.css +1 -0
  334. data/app/components/primer/beta/timeline_item.css.json +16 -0
  335. data/app/components/primer/beta/timeline_item.css.map +1 -0
  336. data/app/components/primer/beta/timeline_item.html.erb +5 -0
  337. data/app/components/primer/beta/timeline_item.pcss +93 -0
  338. data/app/components/primer/beta/timeline_item.rb +90 -0
  339. data/app/components/primer/beta/truncate.css +1 -0
  340. data/app/components/primer/beta/truncate.css.json +12 -0
  341. data/app/components/primer/beta/truncate.css.map +1 -0
  342. data/app/components/primer/beta/truncate.html.erb +5 -0
  343. data/app/components/primer/beta/truncate.pcss +31 -0
  344. data/app/components/primer/beta/truncate.rb +111 -0
  345. data/app/components/primer/blankslate_component.html.erb +25 -0
  346. data/app/components/primer/blankslate_component.rb +156 -0
  347. data/app/components/primer/box.rb +25 -0
  348. data/app/components/primer/button_component.html.erb +12 -0
  349. data/app/components/primer/button_component.rb +175 -0
  350. data/app/components/primer/component.rb +145 -0
  351. data/app/components/primer/conditional_wrapper.rb +36 -0
  352. data/app/components/primer/content.rb +12 -0
  353. data/app/components/primer/focus_group.d.ts +19 -0
  354. data/app/components/primer/focus_group.js +139 -0
  355. data/app/components/primer/focus_group.ts +133 -0
  356. data/app/components/primer/icon_button.html.erb +12 -0
  357. data/app/components/primer/icon_button.rb +108 -0
  358. data/app/components/primer/layout_component.html.erb +11 -0
  359. data/app/components/primer/layout_component.rb +73 -0
  360. data/app/components/primer/navigation/tab_component.rb +10 -0
  361. data/app/components/primer/primer.d.ts +21 -0
  362. data/app/components/primer/primer.js +21 -0
  363. data/app/components/primer/primer.pcss +42 -0
  364. data/app/components/primer/primer.ts +21 -0
  365. data/app/components/primer/tooltip.rb +91 -0
  366. data/app/components/primer/truncate.css +1 -0
  367. data/app/components/primer/truncate.css.json +13 -0
  368. data/app/components/primer/truncate.css.map +1 -0
  369. data/app/components/primer/truncate.pcss +30 -0
  370. data/app/components/primer/truncate.rb +52 -0
  371. data/app/forms/after_content_form/after_content.html.erb +1 -0
  372. data/app/forms/after_content_form.rb +13 -0
  373. data/app/forms/application_form.rb +5 -0
  374. data/app/forms/array_check_box_group_form/places_lopez_caption.html.erb +1 -0
  375. data/app/forms/array_check_box_group_form.rb +15 -0
  376. data/app/forms/both_types_of_caption_form/first_name_caption.html.erb +1 -0
  377. data/app/forms/both_types_of_caption_form.rb +13 -0
  378. data/app/forms/caption_template_form/age_middle_aged_caption.html.erb +1 -0
  379. data/app/forms/caption_template_form/age_young_caption.html.erb +1 -0
  380. data/app/forms/caption_template_form/cool_caption.html.erb +1 -0
  381. data/app/forms/caption_template_form/first_name_caption.html.erb +1 -0
  382. data/app/forms/caption_template_form.rb +22 -0
  383. data/app/forms/check_box_group_form.rb +28 -0
  384. data/app/forms/check_box_with_nested_form.rb +39 -0
  385. data/app/forms/composed_form.rb +14 -0
  386. data/app/forms/example_toggle_switch_form/example_field_caption.html.erb +1 -0
  387. data/app/forms/example_toggle_switch_form.rb +8 -0
  388. data/app/forms/first_name_form.rb +13 -0
  389. data/app/forms/horizontal_form.rb +34 -0
  390. data/app/forms/immediate_validation_form.rb +29 -0
  391. data/app/forms/invalid_form.rb +21 -0
  392. data/app/forms/last_name_form.rb +13 -0
  393. data/app/forms/multi_input_form.rb +27 -0
  394. data/app/forms/multi_text_field_form.rb +27 -0
  395. data/app/forms/name_with_question_mark_form/enabled_caption.html.erb +1 -0
  396. data/app/forms/name_with_question_mark_form.rb +11 -0
  397. data/app/forms/radio_button_group_form.rb +12 -0
  398. data/app/forms/radio_button_with_nested_form.rb +39 -0
  399. data/app/forms/select_form.rb +12 -0
  400. data/app/forms/single_text_field_form.rb +13 -0
  401. data/app/forms/submit_button_form.rb +26 -0
  402. data/app/forms/text_field_and_checkbox_form.rb +19 -0
  403. data/app/helpers/primer/form_helper.rb +23 -0
  404. data/app/lib/primer/attributes_helper.rb +105 -0
  405. data/app/lib/primer/audited/dsl.rb +32 -0
  406. data/app/lib/primer/class_name_helper.rb +29 -0
  407. data/app/lib/primer/css/layout.css +1541 -0
  408. data/app/lib/primer/css/layout.css.json +316 -0
  409. data/app/lib/primer/css/utilities.css +7304 -0
  410. data/app/lib/primer/css/utilities.css.json +1659 -0
  411. data/app/lib/primer/fetch_or_fallback_helper.rb +65 -0
  412. data/app/lib/primer/join_style_arguments_helper.rb +14 -0
  413. data/app/lib/primer/octicon/cache.rb +44 -0
  414. data/app/lib/primer/status/dsl.rb +44 -0
  415. data/app/lib/primer/tab_nav_helper.rb +35 -0
  416. data/app/lib/primer/tabbed_component_helper.rb +39 -0
  417. data/app/lib/primer/test_selector_helper.rb +20 -0
  418. data/app/lib/primer/underline_nav_helper.rb +44 -0
  419. data/app/lib/primer/view_helper.rb +21 -0
  420. data/lib/postcss_mixins/activeIndicatorLine.pcss +11 -0
  421. data/lib/postcss_mixins/clearfix.pcss +12 -0
  422. data/lib/postcss_mixins/focusBoxShadowInset.pcss +6 -0
  423. data/lib/postcss_mixins/focusOutline.pcss +5 -0
  424. data/lib/postcss_mixins/focusOutlineOnEmphasis.pcss +6 -0
  425. data/lib/postcss_mixins/minTouchTarget.js +20 -0
  426. data/lib/postcss_mixins/targetBoxShadow.pcss +6 -0
  427. data/lib/primer/accessibility.rb +74 -0
  428. data/lib/primer/classify/utilities.rb +201 -0
  429. data/lib/primer/classify/utilities.yml +1879 -0
  430. data/lib/primer/classify/validation.rb +18 -0
  431. data/lib/primer/classify.rb +135 -0
  432. data/lib/primer/deprecations.rb +99 -0
  433. data/lib/primer/deprecations.yml +45 -0
  434. data/lib/primer/example_image.rb +8 -0
  435. data/lib/primer/form_components.rb +57 -0
  436. data/lib/primer/forms/acts_as_component.rb +129 -0
  437. data/lib/primer/forms/base.html.erb +8 -0
  438. data/lib/primer/forms/base.rb +133 -0
  439. data/lib/primer/forms/base_component.rb +76 -0
  440. data/lib/primer/forms/buffer_rewriter.rb +51 -0
  441. data/lib/primer/forms/builder.rb +71 -0
  442. data/lib/primer/forms/button.html.erb +4 -0
  443. data/lib/primer/forms/button.rb +66 -0
  444. data/lib/primer/forms/caption.html.erb +10 -0
  445. data/lib/primer/forms/caption.rb +29 -0
  446. data/lib/primer/forms/check_box.html.erb +16 -0
  447. data/lib/primer/forms/check_box.rb +46 -0
  448. data/lib/primer/forms/check_box_group.html.erb +17 -0
  449. data/lib/primer/forms/check_box_group.rb +19 -0
  450. data/lib/primer/forms/dsl/button_input.rb +29 -0
  451. data/lib/primer/forms/dsl/check_box_group_input.rb +53 -0
  452. data/lib/primer/forms/dsl/check_box_input.rb +54 -0
  453. data/lib/primer/forms/dsl/form_object.rb +25 -0
  454. data/lib/primer/forms/dsl/form_reference_input.rb +59 -0
  455. data/lib/primer/forms/dsl/hidden_input.rb +29 -0
  456. data/lib/primer/forms/dsl/input.rb +315 -0
  457. data/lib/primer/forms/dsl/input_group.rb +34 -0
  458. data/lib/primer/forms/dsl/input_methods.rb +139 -0
  459. data/lib/primer/forms/dsl/multi_input.rb +55 -0
  460. data/lib/primer/forms/dsl/radio_button_group_input.rb +37 -0
  461. data/lib/primer/forms/dsl/radio_button_input.rb +37 -0
  462. data/lib/primer/forms/dsl/select_input.rb +61 -0
  463. data/lib/primer/forms/dsl/submit_button_input.rb +29 -0
  464. data/lib/primer/forms/dsl/text_area_input.rb +33 -0
  465. data/lib/primer/forms/dsl/text_field_input.rb +86 -0
  466. data/lib/primer/forms/dsl/toggle_switch_input.rb +39 -0
  467. data/lib/primer/forms/form_control.html.erb +20 -0
  468. data/lib/primer/forms/form_control.rb +28 -0
  469. data/lib/primer/forms/form_list.html.erb +5 -0
  470. data/lib/primer/forms/form_list.rb +21 -0
  471. data/lib/primer/forms/form_reference.html.erb +3 -0
  472. data/lib/primer/forms/form_reference.rb +18 -0
  473. data/lib/primer/forms/group.html.erb +5 -0
  474. data/lib/primer/forms/group.rb +27 -0
  475. data/lib/primer/forms/hidden_field.html.erb +1 -0
  476. data/lib/primer/forms/hidden_field.rb +15 -0
  477. data/lib/primer/forms/multi.html.erb +7 -0
  478. data/lib/primer/forms/multi.rb +16 -0
  479. data/lib/primer/forms/primer_base_component_wrapper.html.erb +3 -0
  480. data/lib/primer/forms/primer_base_component_wrapper.rb +24 -0
  481. data/lib/primer/forms/primer_multi_input.d.ts +10 -0
  482. data/lib/primer/forms/primer_multi_input.js +45 -0
  483. data/lib/primer/forms/primer_multi_input.ts +46 -0
  484. data/lib/primer/forms/primer_text_field.d.ts +1 -0
  485. data/lib/primer/forms/primer_text_field.js +73 -0
  486. data/lib/primer/forms/primer_text_field.ts +56 -0
  487. data/lib/primer/forms/radio_button.html.erb +16 -0
  488. data/lib/primer/forms/radio_button.rb +29 -0
  489. data/lib/primer/forms/radio_button_group.html.erb +17 -0
  490. data/lib/primer/forms/radio_button_group.rb +19 -0
  491. data/lib/primer/forms/select.html.erb +5 -0
  492. data/lib/primer/forms/select.rb +29 -0
  493. data/lib/primer/forms/separator.html.erb +1 -0
  494. data/lib/primer/forms/separator.rb +8 -0
  495. data/lib/primer/forms/spacing_wrapper.html.erb +3 -0
  496. data/lib/primer/forms/spacing_wrapper.rb +8 -0
  497. data/lib/primer/forms/submit_button.html.erb +1 -0
  498. data/lib/primer/forms/submit_button.rb +14 -0
  499. data/lib/primer/forms/text_area.html.erb +5 -0
  500. data/lib/primer/forms/text_area.rb +20 -0
  501. data/lib/primer/forms/text_field.html.erb +17 -0
  502. data/lib/primer/forms/text_field.rb +46 -0
  503. data/lib/primer/forms/toggle_switch.html.erb +22 -0
  504. data/lib/primer/forms/toggle_switch.rb +21 -0
  505. data/lib/primer/forms/toggle_switch_form.rb +81 -0
  506. data/lib/primer/forms/toggle_switch_input.d.ts +5 -0
  507. data/lib/primer/forms/toggle_switch_input.js +34 -0
  508. data/lib/primer/forms/toggle_switch_input.ts +26 -0
  509. data/lib/primer/forms/utils.rb +48 -0
  510. data/lib/primer/static/generate_arguments.rb +55 -0
  511. data/lib/primer/static/generate_audited_at.rb +17 -0
  512. data/lib/primer/static/generate_constants.rb +19 -0
  513. data/lib/primer/static/generate_info_arch.rb +160 -0
  514. data/lib/primer/static/generate_previews.rb +61 -0
  515. data/lib/primer/static/generate_statuses.rb +17 -0
  516. data/lib/primer/static.rb +72 -0
  517. data/lib/primer/view_components/audited.rb +14 -0
  518. data/lib/primer/view_components/constants.rb +55 -0
  519. data/lib/primer/view_components/engine.rb +69 -0
  520. data/lib/primer/view_components/linters/accessibility.yml +9 -0
  521. data/lib/primer/view_components/linters/argument_mappers/base.rb +100 -0
  522. data/lib/primer/view_components/linters/argument_mappers/button.rb +72 -0
  523. data/lib/primer/view_components/linters/argument_mappers/clipboard_copy.rb +21 -0
  524. data/lib/primer/view_components/linters/argument_mappers/close_button.rb +43 -0
  525. data/lib/primer/view_components/linters/argument_mappers/conversion_error.rb +10 -0
  526. data/lib/primer/view_components/linters/argument_mappers/flash.rb +32 -0
  527. data/lib/primer/view_components/linters/argument_mappers/helpers/erb_block.rb +67 -0
  528. data/lib/primer/view_components/linters/argument_mappers/label.rb +56 -0
  529. data/lib/primer/view_components/linters/argument_mappers/system_arguments.rb +48 -0
  530. data/lib/primer/view_components/linters/autocorrectable.rb +32 -0
  531. data/lib/primer/view_components/linters/base_linter.rb +190 -0
  532. data/lib/primer/view_components/linters/blankslate_api_migration.rb +152 -0
  533. data/lib/primer/view_components/linters/blankslate_component_migration_counter.rb +14 -0
  534. data/lib/primer/view_components/linters/breadcrumbs_component_migration_counter.rb +14 -0
  535. data/lib/primer/view_components/linters/button_component_migration_counter.rb +26 -0
  536. data/lib/primer/view_components/linters/clipboard_copy_component_migration_counter.rb +20 -0
  537. data/lib/primer/view_components/linters/close_button_component_migration_counter.rb +121 -0
  538. data/lib/primer/view_components/linters/deprecated_components_counter.rb +84 -0
  539. data/lib/primer/view_components/linters/details_menu_migration.rb +35 -0
  540. data/lib/primer/view_components/linters/disallow_action_list.rb +73 -0
  541. data/lib/primer/view_components/linters/disallow_component_css_counter.rb +69 -0
  542. data/lib/primer/view_components/linters/flash_migration_counter.rb +36 -0
  543. data/lib/primer/view_components/linters/helpers/deprecated_components_helpers.rb +20 -0
  544. data/lib/primer/view_components/linters/helpers/rubocop_helpers.rb +14 -0
  545. data/lib/primer/view_components/linters/helpers/rule_helpers.rb +39 -0
  546. data/lib/primer/view_components/linters/label_component_migration_counter.rb +24 -0
  547. data/lib/primer/view_components/linters/migrate_deprecated_flash_arguments.rb +140 -0
  548. data/lib/primer/view_components/linters/severity_schema.rb +14 -0
  549. data/lib/primer/view_components/linters/subhead_component_migration_counter.rb +14 -0
  550. data/lib/primer/view_components/linters/super_in_component_templates.rb +65 -0
  551. data/lib/primer/view_components/linters/tag_tree_helpers.rb +61 -0
  552. data/lib/primer/view_components/linters/tooltipped_migration.rb +35 -0
  553. data/lib/primer/view_components/linters/two_column_layout_migration_counter.rb +158 -0
  554. data/lib/primer/view_components/linters.rb +3 -0
  555. data/lib/primer/view_components/statuses.rb +14 -0
  556. data/lib/primer/view_components/version.rb +18 -0
  557. data/lib/primer/view_components.rb +15 -0
  558. data/lib/primer/yard/backend.rb +24 -0
  559. data/lib/primer/yard/component_manifest.rb +144 -0
  560. data/lib/primer/yard/component_ref.rb +54 -0
  561. data/lib/primer/yard/docs_helper.rb +98 -0
  562. data/lib/primer/yard/info_arch_docs_helper.rb +31 -0
  563. data/lib/primer/yard/legacy_gatsby_backend.rb +233 -0
  564. data/lib/primer/yard/lookbook_docs_helper.rb +32 -0
  565. data/lib/primer/yard/lookbook_pages_backend.rb +231 -0
  566. data/lib/primer/yard/registry.rb +136 -0
  567. data/lib/primer/yard/renders_many_handler.rb +23 -0
  568. data/lib/primer/yard/renders_one_handler.rb +23 -0
  569. data/lib/primer/yard.rb +20 -0
  570. data/lib/rubocop/config/default.yml +20 -0
  571. data/lib/rubocop/cop/primer/base_cop.rb +28 -0
  572. data/lib/rubocop/cop/primer/component_name_migration.rb +37 -0
  573. data/lib/rubocop/cop/primer/deprecated_arguments.rb +317 -0
  574. data/lib/rubocop/cop/primer/deprecated_button_arguments.rb +51 -0
  575. data/lib/rubocop/cop/primer/deprecated_components.rb +49 -0
  576. data/lib/rubocop/cop/primer/deprecated_label_schemes.rb +68 -0
  577. data/lib/rubocop/cop/primer/deprecated_label_variants.rb +71 -0
  578. data/lib/rubocop/cop/primer/deprecated_layout_component.rb +30 -0
  579. data/lib/rubocop/cop/primer/no_tag_memoize.rb +43 -0
  580. data/lib/rubocop/cop/primer/primer_octicon.rb +217 -0
  581. data/lib/rubocop/cop/primer/system_argument_instead_of_class.rb +57 -0
  582. data/lib/rubocop/cop/primer/test_selector.rb +48 -0
  583. data/lib/rubocop/cop/primer.rb +3 -0
  584. data/lib/tasks/custom_utilities.yml +372 -0
  585. data/previews/pages/forms/01_introduction.md.erb +44 -0
  586. data/previews/pages/forms/02_getting_started.md.erb +125 -0
  587. data/previews/pages/forms/03_caption_templates.md.erb +30 -0
  588. data/previews/pages/forms/04_after_content.md.erb +39 -0
  589. data/previews/pages/forms/05_groups_layouts.md.erb +22 -0
  590. data/previews/pages/forms/06_miscellaneous_inputs.md.erb +43 -0
  591. data/previews/pages/forms/07_toggle_switch_forms.md.erb +58 -0
  592. data/previews/pages/forms/08_validations.md.erb +28 -0
  593. data/previews/pages/forms/09_compound_forms.md.erb +97 -0
  594. data/previews/primer/alpha/action_bar_preview/inline.html.erb +16 -0
  595. data/previews/primer/alpha/action_bar_preview.rb +77 -0
  596. data/previews/primer/alpha/action_list_preview.rb +464 -0
  597. data/previews/primer/alpha/action_menu_preview/align_end.html.erb +6 -0
  598. data/previews/primer/alpha/action_menu_preview/content_labels.html.erb +9 -0
  599. data/previews/primer/alpha/action_menu_preview/multiple_select_form.html.erb +13 -0
  600. data/previews/primer/alpha/action_menu_preview/opens_dialog.html.erb +21 -0
  601. data/previews/primer/alpha/action_menu_preview/single_select_form.html.erb +13 -0
  602. data/previews/primer/alpha/action_menu_preview/submitting_forms.html.erb +15 -0
  603. data/previews/primer/alpha/action_menu_preview/two_menus.html.erb +13 -0
  604. data/previews/primer/alpha/action_menu_preview/with_actions.html.erb +21 -0
  605. data/previews/primer/alpha/action_menu_preview.rb +328 -0
  606. data/previews/primer/alpha/auto_complete_preview.rb +121 -0
  607. data/previews/primer/alpha/banner_preview/with_action_button.html.erb +4 -0
  608. data/previews/primer/alpha/banner_preview/with_action_content.html.erb +6 -0
  609. data/previews/primer/alpha/banner_preview.rb +102 -0
  610. data/previews/primer/alpha/button_marketing_preview.rb +65 -0
  611. data/previews/primer/alpha/check_box_group_preview.rb +90 -0
  612. data/previews/primer/alpha/check_box_preview.rb +68 -0
  613. data/previews/primer/alpha/dialog_preview/body_has_scrollbar_overflow.html.erb +9 -0
  614. data/previews/primer/alpha/dialog_preview/custom_header.html.erb +7 -0
  615. data/previews/primer/alpha/dialog_preview/nested_dialog.html.erb +14 -0
  616. data/previews/primer/alpha/dialog_preview/test.html.erb +7 -0
  617. data/previews/primer/alpha/dialog_preview/with_footer.html.erb +8 -0
  618. data/previews/primer/alpha/dialog_preview/with_form.html.erb +12 -0
  619. data/previews/primer/alpha/dialog_preview/with_text_input.html.erb +10 -0
  620. data/previews/primer/alpha/dialog_preview.rb +154 -0
  621. data/previews/primer/alpha/dropdown_preview.rb +211 -0
  622. data/previews/primer/alpha/form_control_preview/playground.html.erb +9 -0
  623. data/previews/primer/alpha/form_control_preview.rb +106 -0
  624. data/previews/primer/alpha/hellip_button_preview.rb +26 -0
  625. data/previews/primer/alpha/hidden_text_expander_preview.rb +23 -0
  626. data/previews/primer/alpha/image_crop_preview.rb +31 -0
  627. data/previews/primer/alpha/layout_preview.rb +215 -0
  628. data/previews/primer/alpha/menu_preview/default.html.erb +17 -0
  629. data/previews/primer/alpha/menu_preview/playground.html.erb +17 -0
  630. data/previews/primer/alpha/menu_preview.rb +15 -0
  631. data/previews/primer/alpha/multi_input_preview/playground.html.erb +41 -0
  632. data/previews/primer/alpha/multi_input_preview.rb +84 -0
  633. data/previews/primer/alpha/nav_list_preview/trailing_action.html.erb +19 -0
  634. data/previews/primer/alpha/nav_list_preview.rb +125 -0
  635. data/previews/primer/alpha/overlay_preview/middle_of_page.html.erb +17 -0
  636. data/previews/primer/alpha/overlay_preview/middle_of_page_with_relative_container.html.erb +19 -0
  637. data/previews/primer/alpha/overlay_preview.rb +179 -0
  638. data/previews/primer/alpha/radio_button_group_preview.rb +85 -0
  639. data/previews/primer/alpha/radio_button_preview.rb +72 -0
  640. data/previews/primer/alpha/segmented_control_preview/with_label_and_caption.html.erb +9 -0
  641. data/previews/primer/alpha/segmented_control_preview/with_subhead_actions.html.erb +11 -0
  642. data/previews/primer/alpha/segmented_control_preview.rb +183 -0
  643. data/previews/primer/alpha/select_preview.rb +136 -0
  644. data/previews/primer/alpha/tab_nav_preview/with_extra.html.erb +8 -0
  645. data/previews/primer/alpha/tab_nav_preview.rb +63 -0
  646. data/previews/primer/alpha/tab_panels_preview/with_extra.html.erb +17 -0
  647. data/previews/primer/alpha/tab_panels_preview.rb +44 -0
  648. data/previews/primer/alpha/text_area_preview.rb +94 -0
  649. data/previews/primer/alpha/text_field_preview.rb +194 -0
  650. data/previews/primer/alpha/toggle_switch_preview.rb +63 -0
  651. data/previews/primer/alpha/tooltip_preview/tooltip_inside_primer_overlay.html.erb +20 -0
  652. data/previews/primer/alpha/tooltip_preview/with_multiple_on_a_page.html.erb +14 -0
  653. data/previews/primer/alpha/tooltip_preview/with_right_most_position.html.erb +7 -0
  654. data/previews/primer/alpha/tooltip_preview.rb +88 -0
  655. data/previews/primer/alpha/underline_nav_preview/default.html.erb +8 -0
  656. data/previews/primer/alpha/underline_nav_preview/playground.html.erb +8 -0
  657. data/previews/primer/alpha/underline_nav_preview.rb +58 -0
  658. data/previews/primer/alpha/underline_panels_preview.rb +38 -0
  659. data/previews/primer/beta/auto_complete_item_preview/default.html.erb +9 -0
  660. data/previews/primer/beta/auto_complete_item_preview/playground.html.erb +9 -0
  661. data/previews/primer/beta/auto_complete_item_preview/with_description.html.erb +11 -0
  662. data/previews/primer/beta/auto_complete_item_preview.rb +57 -0
  663. data/previews/primer/beta/auto_complete_preview/with_submit_button.html.erb +20 -0
  664. data/previews/primer/beta/auto_complete_preview.rb +287 -0
  665. data/previews/primer/beta/avatar_preview.rb +92 -0
  666. data/previews/primer/beta/avatar_stack_preview.rb +104 -0
  667. data/previews/primer/beta/base_button_preview.rb +33 -0
  668. data/previews/primer/beta/blankslate_preview.rb +139 -0
  669. data/previews/primer/beta/border_box_preview.rb +102 -0
  670. data/previews/primer/beta/breadcrumbs_preview.rb +31 -0
  671. data/previews/primer/beta/button_group_preview/action_menus.html.erb +8 -0
  672. data/previews/primer/beta/button_group_preview.rb +74 -0
  673. data/previews/primer/beta/button_preview/all_schemes.html.erb +30 -0
  674. data/previews/primer/beta/button_preview/invisible_all_visuals.html.erb +54 -0
  675. data/previews/primer/beta/button_preview/leading_visual.html.erb +10 -0
  676. data/previews/primer/beta/button_preview/trailing_action.html.erb +10 -0
  677. data/previews/primer/beta/button_preview/trailing_counter.html.erb +11 -0
  678. data/previews/primer/beta/button_preview/trailing_visual.html.erb +11 -0
  679. data/previews/primer/beta/button_preview/with_tooltip.html.erb +10 -0
  680. data/previews/primer/beta/button_preview.rb +324 -0
  681. data/previews/primer/beta/clipboard_copy_preview/element.html.erb +2 -0
  682. data/previews/primer/beta/clipboard_copy_preview.rb +41 -0
  683. data/previews/primer/beta/close_button_preview.rb +24 -0
  684. data/previews/primer/beta/counter_preview.rb +93 -0
  685. data/previews/primer/beta/details_preview.rb +63 -0
  686. data/previews/primer/beta/flash_preview.rb +77 -0
  687. data/previews/primer/beta/heading_preview.rb +25 -0
  688. data/previews/primer/beta/icon_button_preview.rb +113 -0
  689. data/previews/primer/beta/label_preview.rb +117 -0
  690. data/previews/primer/beta/link_preview.rb +71 -0
  691. data/previews/primer/beta/markdown_preview.rb +294 -0
  692. data/previews/primer/beta/octicon_preview.rb +25 -0
  693. data/previews/primer/beta/popover_preview.rb +85 -0
  694. data/previews/primer/beta/progress_bar_preview.rb +64 -0
  695. data/previews/primer/beta/relative_time_preview.rb +286 -0
  696. data/previews/primer/beta/spinner_preview.rb +23 -0
  697. data/previews/primer/beta/state_preview.rb +72 -0
  698. data/previews/primer/beta/subhead_preview/actions.html.erb +14 -0
  699. data/previews/primer/beta/subhead_preview.rb +103 -0
  700. data/previews/primer/beta/text_preview.rb +25 -0
  701. data/previews/primer/beta/timeline_item_preview.rb +31 -0
  702. data/previews/primer/beta/truncate_preview.rb +55 -0
  703. data/previews/primer/box_preview.rb +30 -0
  704. data/previews/primer/forms_preview/after_content_form.html.erb +3 -0
  705. data/previews/primer/forms_preview/array_check_box_group_form.html.erb +3 -0
  706. data/previews/primer/forms_preview/caption_template_form.html.erb +3 -0
  707. data/previews/primer/forms_preview/check_box_group_form.html.erb +3 -0
  708. data/previews/primer/forms_preview/check_box_with_nested_form.html.erb +3 -0
  709. data/previews/primer/forms_preview/composed_form.html.erb +4 -0
  710. data/previews/primer/forms_preview/example_toggle_switch_form.html.erb +3 -0
  711. data/previews/primer/forms_preview/horizontal_form.html.erb +3 -0
  712. data/previews/primer/forms_preview/immediate_validation_form.html.erb +3 -0
  713. data/previews/primer/forms_preview/invalid_form.html.erb +3 -0
  714. data/previews/primer/forms_preview/multi_input_form.html.erb +14 -0
  715. data/previews/primer/forms_preview/multi_text_field_form.html.erb +3 -0
  716. data/previews/primer/forms_preview/name_with_question_mark_form.html.erb +3 -0
  717. data/previews/primer/forms_preview/radio_button_group_form.html.erb +3 -0
  718. data/previews/primer/forms_preview/radio_button_with_nested_form.html.erb +3 -0
  719. data/previews/primer/forms_preview/select_form.html.erb +3 -0
  720. data/previews/primer/forms_preview/single_text_field_form.html.erb +3 -0
  721. data/previews/primer/forms_preview/submit_button_form.html.erb +3 -0
  722. data/previews/primer/forms_preview/text_field_and_checkbox_form.html.erb +3 -0
  723. data/previews/primer/forms_preview.rb +44 -0
  724. data/previews/primer/url_helpers.rb +15 -0
  725. data/static/arguments.json +4501 -0
  726. data/static/assets/view-components.svg +18 -0
  727. data/static/audited_at.json +107 -0
  728. data/static/classes.json +606 -0
  729. data/static/constants.json +1335 -0
  730. data/static/info_arch.json +14465 -0
  731. data/static/previews.json +6408 -0
  732. data/static/statuses.json +107 -0
  733. metadata +1145 -0
@@ -0,0 +1,168 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Alpha
5
+ module Navigation
6
+ # This component is part of navigation components such as `Primer::Alpha::TabNav`
7
+ # and `Primer::Alpha::UnderlineNav` and should not be used by itself.
8
+ #
9
+ # @accessibility
10
+ # `Tab` renders the selected anchor tab with `aria-current="page"` by default.
11
+ # When the selected tab does not correspond to the current page, such as in a nested inner tab, make sure to use aria-current="true"
12
+ class Tab < Primer::Component
13
+ status :alpha
14
+
15
+ DEFAULT_ARIA_CURRENT_FOR_ANCHOR = :page
16
+ ARIA_CURRENT_OPTIONS_FOR_ANCHOR = [true, DEFAULT_ARIA_CURRENT_FOR_ANCHOR].freeze
17
+ # Panel controlled by the Tab. This will not render anything in the tab itself.
18
+ # It will provide a accessor for the Tab's parent to call and render the panel
19
+ # content in the appropriate place.
20
+ # Refer to `UnderlineNav` and `TabNav` implementations for examples.
21
+ #
22
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
23
+ renders_one :panel, lambda { |**system_arguments|
24
+ return unless @with_panel
25
+
26
+ deny_tag_argument(**system_arguments)
27
+ system_arguments[:id] = @panel_id
28
+ system_arguments[:tag] = :div
29
+ system_arguments[:role] ||= :tabpanel
30
+ system_arguments[:tabindex] = 0
31
+ system_arguments[:hidden] = true unless @selected
32
+
33
+ label_present = aria("label", system_arguments) || aria("labelledby", system_arguments)
34
+ unless label_present
35
+ if @id.present?
36
+ system_arguments[:"aria-labelledby"] = @id
37
+ elsif !Rails.env.production?
38
+ raise ArgumentError, "Panels must be labelled. Either set a unique `id` on the tab, or set an `aria-label` directly on the panel"
39
+ end
40
+ end
41
+
42
+ Primer::BaseComponent.new(**system_arguments)
43
+ }
44
+
45
+ # Icon to be rendered in the Tab left.
46
+ #
47
+ # @param kwargs [Hash] The same arguments as <%= link_to_component(Primer::Beta::Octicon) %>.
48
+ renders_one :icon, lambda { |icon = nil, **system_arguments|
49
+ system_arguments[:classes] = class_names(
50
+ @icon_classes,
51
+ system_arguments[:classes]
52
+ )
53
+ Primer::Beta::Octicon.new(icon, **system_arguments)
54
+ }
55
+
56
+ # The Tab's text.
57
+ #
58
+ # @param kwargs [Hash] The same arguments as <%= link_to_component(Primer::Beta::Text) %>.
59
+ renders_one :text, Primer::Beta::Text
60
+
61
+ # Counter to be rendered in the Tab right.
62
+ #
63
+ # @param kwargs [Hash] The same arguments as <%= link_to_component(Primer::Beta::Counter) %>.
64
+ renders_one :counter, Primer::Beta::Counter
65
+
66
+ attr_reader :selected
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
+ # @param list [Boolean] Whether the Tab is an item in a `<ul>` list.
104
+ # @param selected [Boolean] Whether the Tab is selected or not.
105
+ # @param with_panel [Boolean] Whether the Tab has an associated panel.
106
+ # @param panel_id [String] Only applies if `with_panel` is `true`. Unique id of panel.
107
+ # @param icon_classes [Boolean] Classes that must always be applied to icons.
108
+ # @param wrapper_arguments [Hash] <%= link_to_system_arguments_docs %> to be used in the `<li>` wrapper when the tab is an item in a list.
109
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
110
+ def initialize(list: false, selected: false, with_panel: false, panel_id: "", icon_classes: "", wrapper_arguments: {}, **system_arguments)
111
+ @selected = selected
112
+ @icon_classes = icon_classes
113
+ @list = list
114
+ @with_panel = with_panel
115
+
116
+ @system_arguments = system_arguments
117
+ @id = @system_arguments[:id]
118
+ @wrapper_arguments = wrapper_arguments
119
+
120
+ if with_panel || @system_arguments[:tag] == :button
121
+ @system_arguments[:tag] = :button
122
+ @system_arguments[:type] = :button
123
+ @system_arguments[:role] = :tab
124
+ panel_id(panel_id)
125
+ # https://www.w3.org/TR/wai-aria-practices/#presentation_role
126
+ @wrapper_arguments[:role] = :presentation
127
+ else
128
+ @system_arguments[:tag] = :a
129
+ end
130
+
131
+ @wrapper_arguments[:tag] = :li
132
+ @wrapper_arguments[:display] ||= :inline_flex
133
+
134
+ return unless @selected
135
+
136
+ if @system_arguments[:tag] == :a
137
+ aria_current = aria("current", system_arguments) || DEFAULT_ARIA_CURRENT_FOR_ANCHOR
138
+ @system_arguments[:"aria-current"] = fetch_or_fallback(ARIA_CURRENT_OPTIONS_FOR_ANCHOR, aria_current, DEFAULT_ARIA_CURRENT_FOR_ANCHOR)
139
+ else
140
+ @system_arguments[:"aria-selected"] = true
141
+ end
142
+ end
143
+
144
+ def wrapper
145
+ unless @list
146
+ yield
147
+ return # returning `yield` caused a double render
148
+ end
149
+
150
+ render(Primer::BaseComponent.new(**@wrapper_arguments)) do
151
+ yield if block_given?
152
+ end
153
+ end
154
+
155
+ private
156
+
157
+ def panel_id(panel_id)
158
+ if panel_id.blank?
159
+ raise ArgumentError, "`panel_id` is required" unless Rails.env.production?
160
+ else
161
+ @panel_id = panel_id
162
+ @system_arguments[:"aria-controls"] = @panel_id
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" hidden> <%# erblint:disable GitHub::Accessibility::SvgHasAccessibleText %>
2
+ <%= symbol_tags %>
3
+ </svg>
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "octicons"
4
+
5
+ module Primer
6
+ module Alpha
7
+ # OcticonSymbols renders a symbol dictionary using a list of <%= link_to_octicons %>.
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
+ # @param icons [Array<Hash>] List of icons to render, in the format { symbol: :icon_name, size: :small }
16
+ def initialize(icons: [])
17
+ @icons = {}
18
+ icons.each do |icon|
19
+ symbol = icon[:symbol]
20
+ size = Primer::Beta::Octicon::SIZE_MAPPINGS[
21
+ fetch_or_fallback(Primer::Beta::Octicon::SIZE_OPTIONS, icon[:size] || Primer::Beta::Octicon::SIZE_DEFAULT, Primer::Beta::Octicon::SIZE_DEFAULT)
22
+ ]
23
+
24
+ cache_key = Primer::Octicon::Cache.get_key(symbol: symbol, size: size)
25
+
26
+ if (cache_icon = Primer::Octicon::Cache.read(cache_key))
27
+ icon_instance = cache_icon
28
+ else
29
+ icon_instance = Octicons::Octicon.new(symbol, height: size)
30
+
31
+ Primer::Octicon::Cache.set(cache_key, icon_instance)
32
+ end
33
+
34
+ # Don't put the same icon twice
35
+ @icons[[symbol, icon_instance.height]] = icon_instance if @icons[[symbol, icon_instance.height]].nil?
36
+ end
37
+ end
38
+
39
+ def render?
40
+ @icons.any?
41
+ end
42
+
43
+ def symbol_tags
44
+ safe_join(
45
+ @icons.values.map do |icon|
46
+ content_tag(
47
+ :symbol,
48
+ icon.path.html_safe, # rubocop:disable Rails/OutputSafety
49
+ id: "octicon_#{icon.symbol}_#{icon.height}",
50
+ viewBox: icon.options[:viewBox],
51
+ width: icon.width,
52
+ height: icon.height
53
+ )
54
+ end
55
+ )
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Alpha
5
+ class Overlay
6
+ # A `Overlay::Body` is a compositional component, used to render the
7
+ # Body of an overlay. See <%= link_to_component(Primer::Alpha::Overlay) %>.
8
+ class Body < Primer::Component
9
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
10
+ def initialize(padding: DEFAULT_PADDING, **system_arguments)
11
+ @system_arguments = deny_tag_argument(**system_arguments)
12
+ @system_arguments[:tag] = :div
13
+ @system_arguments[:classes] = class_names(
14
+ "Overlay-body",
15
+ PADDING_MAPPINGS[fetch_or_fallback(PADDING_OPTIONS, padding, DEFAULT_PADDING)],
16
+ system_arguments[:classes]
17
+ )
18
+ end
19
+
20
+ def call
21
+ render(Primer::BaseComponent.new(**@system_arguments)) { content }
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Alpha
5
+ class Overlay
6
+ DEFAULT_ALIGN_CONTENT = :end
7
+ ALIGN_CONTENT_MAPPINGS = {
8
+ :start => "Overlay-footer--alignStart",
9
+ :center => "Overlay-footer--alignCenter",
10
+ DEFAULT_ALIGN_CONTENT => "Overlay-footer--alignEnd"
11
+ }.freeze
12
+ ALIGN_CONTENT_OPTIONS = ALIGN_CONTENT_MAPPINGS.keys
13
+
14
+ # A `Overlay::Footer` is a compositional component, used to render the
15
+ # Footer of an overlay. See <%= link_to_component(Primer::Alpha::Overlay) %>.
16
+ class Footer < Primer::Component
17
+ # @param show_divider [Boolean] Show a divider between the footer and body.
18
+ # @param align_content [Symbol] The alginment of contents. <%= one_of(Primer::Alpha::Overlay::ALIGN_CONTENT_OPTIONS) %>
19
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
20
+ def initialize(
21
+ show_divider: false,
22
+ align_content: DEFAULT_ALIGN_CONTENT,
23
+ **system_arguments
24
+ )
25
+ @system_arguments = deny_tag_argument(**system_arguments)
26
+ @system_arguments[:tag] = :div
27
+ @system_arguments[:classes] = class_names(
28
+ "Overlay-footer",
29
+ ALIGN_CONTENT_MAPPINGS[fetch_or_fallback(ALIGN_CONTENT_OPTIONS, align_content, DEFAULT_ALIGN_CONTENT)],
30
+ { "Overlay-footer--divided": show_divider },
31
+ system_arguments[:classes]
32
+ )
33
+ end
34
+
35
+ def call
36
+ render(Primer::BaseComponent.new(**@system_arguments)) { content }
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,17 @@
1
+ <%= render Primer::BaseComponent.new(**@system_arguments) do %>
2
+ <div class="Overlay-headerContentWrap">
3
+ <div class="Overlay-titleWrap">
4
+ <h1 id="<%= @id %>" class="Overlay-title <% if @visually_hide_title || content.present? %>sr-only<% end %>"><%= @title %></h1>
5
+ <% if content.present? %>
6
+ <%= content %>
7
+ <% elsif @subtitle.present? %>
8
+ <h2 class="Overlay-description"><%= @subtitle %></h2>
9
+ <% end %>
10
+ </div>
11
+ <% if @overlay_id %>
12
+ <div class="Overlay-actionWrap">
13
+ <%= render Primer::Beta::CloseButton.new(classes: "Overlay-closeButton", "popovertarget": @overlay_id, "popovertargetaction": "hide") %>
14
+ </div>
15
+ <% end %>
16
+ </div>
17
+ <% end %>
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Alpha
5
+ class Overlay
6
+ # A `Overlay::Header` is a compositional component, used to render the
7
+ # Header of an overlay. See <%= link_to_component(Primer::Alpha::Overlay) %>.
8
+ class Header < Primer::Component
9
+ DEFAULT_SIZE = :medium
10
+ SIZE_MAPPINGS = {
11
+ DEFAULT_SIZE => nil,
12
+ :large => "Overlay-header--large"
13
+ }.freeze
14
+ SIZE_OPTIONS = SIZE_MAPPINGS.keys
15
+
16
+ # @param title [String] Describes the content of the Overlay.
17
+ # @param subtitle [String] Provides additional context for the Overlay, also setting the `aria-describedby` attribute.
18
+ # @param overlay_id [String] Provides the id of the overlay element so the close button can close it
19
+ # @param size [Symbol] The size of the Header. <%= one_of(Primer::Alpha::Overlay::Header::SIZE_OPTIONS) %>
20
+ # @param divider [Boolean] Show a divider between the header and body.
21
+ # @param visually_hide_title [Boolean] Visually hide the `title` while maintaining a label for assistive technologies.
22
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
23
+ def initialize(
24
+ id:,
25
+ title:,
26
+ overlay_id: nil,
27
+ subtitle: nil,
28
+ size: DEFAULT_SIZE,
29
+ divider: false,
30
+ visually_hide_title: false,
31
+ **system_arguments
32
+ )
33
+ @overlay_id = overlay_id
34
+ @id = id
35
+ @title = title
36
+ @subtitle = subtitle
37
+ @visually_hide_title = visually_hide_title
38
+ @system_arguments = deny_tag_argument(**system_arguments)
39
+ @system_arguments[:tag] = :header
40
+ @system_arguments[:classes] = class_names(
41
+ "Overlay-header",
42
+ { "Overlay-header--divided": divider },
43
+ SIZE_MAPPINGS[fetch_or_fallback(SIZE_OPTIONS, size, DEFAULT_SIZE)],
44
+ system_arguments[:classes]
45
+ )
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1 @@
1
+ anchored-position[popover]{border-width:0;inset:auto;min-width:192px;overflow:visible;padding:0;position:absolute}.Overlay{display:flex}anchored-position[popover]:not(.\:popover-open){display:none}@supports selector(:popover-open){anchored-position[popover]:not(.\:popover-open){display:revert}}@supports selector(:open){anchored-position[popover]:not(.\:popover-open){display:revert}}
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "alpha/overlay",
3
+ "selectors": [
4
+ "anchored-position[popover]",
5
+ ".Overlay",
6
+ "anchored-position[popover]:not(.\\:popover-open)"
7
+ ]
8
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["overlay.pcss"],"names":[],"mappings":"AAAA,2BACE,cAAe,CAIf,UAAW,CADX,eAAgB,CAEhB,gBAAiB,CAJjB,SAAU,CACV,iBAIF,CAEA,SACE,YACF,CAEA,gDACE,YACF,CAGA,kCACE,gDACE,cACF,CACF,CAGA,0BACE,gDACI,cACJ,CACF","file":"overlay.css","sourcesContent":["anchored-position[popover] {\n border-width: 0;\n padding: 0;\n position: absolute;\n min-width: 192px;\n inset: auto;\n overflow: visible;\n}\n\n.Overlay {\n display: flex;\n}\n\nanchored-position[popover]:not(.\\:popover-open) {\n display: none;\n}\n\n/* This reverts the declaration above for native popover, where `:popover-open` is supported */\n@supports selector(:popover-open) {\n anchored-position[popover]:not(.\\:popover-open) {\n display: revert;\n }\n}\n\n/* This reverts the declaration above for native popover, where `:open` is supported (Chrome 113, Safari TP) */\n@supports selector(:open) {\n anchored-position[popover]:not(.\\:popover-open) {\n display: revert;\n }\n}\n"]}
@@ -0,0 +1,13 @@
1
+ <%= show_button %>
2
+
3
+ <%= render Primer::BaseComponent.new(**@system_arguments) do %>
4
+ <%= render Primer::BaseComponent.new(tag: :div, classes: @wrapper_classes) do %>
5
+ <%= header %>
6
+ <% if content.present? %>
7
+ <%= content %>
8
+ <% else %>
9
+ <%= body %>
10
+ <%= footer %>
11
+ <% end %>
12
+ <% end %>
13
+ <% end %>
@@ -0,0 +1,30 @@
1
+ anchored-position[popover] {
2
+ border-width: 0;
3
+ padding: 0;
4
+ position: absolute;
5
+ min-width: 192px;
6
+ inset: auto;
7
+ overflow: visible;
8
+ }
9
+
10
+ .Overlay {
11
+ display: flex;
12
+ }
13
+
14
+ anchored-position[popover]:not(.\:popover-open) {
15
+ display: none;
16
+ }
17
+
18
+ /* This reverts the declaration above for native popover, where `:popover-open` is supported */
19
+ @supports selector(:popover-open) {
20
+ anchored-position[popover]:not(.\:popover-open) {
21
+ display: revert;
22
+ }
23
+ }
24
+
25
+ /* This reverts the declaration above for native popover, where `:open` is supported (Chrome 113, Safari TP) */
26
+ @supports selector(:open) {
27
+ anchored-position[popover]:not(.\:popover-open) {
28
+ display: revert;
29
+ }
30
+ }
@@ -0,0 +1,214 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Alpha
5
+ # Overlay components codify design patterns related to floating surfaces such
6
+ # as dialogs and menus. They are private components intended to be used by
7
+ # specialized components, and mostly contain presentational logic and
8
+ # behavior.
9
+ #
10
+ # @accessibility
11
+ # - **Overlay Accessible Name**: An overlay should have an accessible name,
12
+ # so screen readers are aware of the purpose of the Overlay when it opens.
13
+ # Give an accessible name setting `:title`. The accessible name will be
14
+ # used as the main heading inside the Overlay.
15
+ # - **Overlay unique id**: A Overlay should be unique. Give a unique id
16
+ # setting `:id`. If no `:id` is given, a default randomize hex id is
17
+ # generated.
18
+ #
19
+ # The combination of both `:title` and `:id` establishes an
20
+ # `aria-labelledby` relationship between the title and the unique id
21
+ # of the Overlay.
22
+ class Overlay < Primer::Component
23
+ DEFAULT_PADDING = :normal
24
+ PADDING_MAPPINGS = {
25
+ DEFAULT_PADDING => nil,
26
+ :condensed => "Overlay-body--paddingCondensed",
27
+ :none => "Overlay-body--paddingNone"
28
+ }.freeze
29
+
30
+ PADDING_OPTIONS = PADDING_MAPPINGS.keys
31
+
32
+ DEFAULT_SIZE = :auto
33
+ SIZE_MAPPINGS = {
34
+ DEFAULT_SIZE => "Overlay--size-auto",
35
+ :small => "Overlay--size-small",
36
+ :medium => "Overlay--size-medium",
37
+ :medium_portrait => "Overlay--size-medium-portrait",
38
+ :large => "Overlay--size-large",
39
+ :xlarge => "Overlay--size-xlarge"
40
+ }.freeze
41
+ SIZE_OPTIONS = SIZE_MAPPINGS.keys
42
+
43
+ DEFAULT_ANCHOR_ALIGN = :start
44
+ ANCHOR_ALIGN_OPTIONS = [DEFAULT_ANCHOR_ALIGN, :center, :end].freeze
45
+
46
+ DEFAULT_ANCHOR_OFFSET = :normal
47
+ ANCHOR_OFFSET_OPTIONS = [DEFAULT_ANCHOR_OFFSET, :spacious].freeze
48
+
49
+ DEFAULT_ANCHOR_SIDE = :outside_bottom
50
+ ANCHOR_SIDE_MAPPINGS = {
51
+ :inside_top => "inside-top",
52
+ :inside_bottom => "inside-bottom",
53
+ :inside_left => "inside-left",
54
+ :inside_right => "inside-right",
55
+ :inside_center => "inside-center",
56
+ :outside_top => "outside-top",
57
+ DEFAULT_ANCHOR_SIDE => "outside-bottom",
58
+ :outside_left => "outside-left",
59
+ :outside_right => "outside-right"
60
+ }.freeze
61
+ ANCHOR_SIDE_OPTIONS = ANCHOR_SIDE_MAPPINGS.keys
62
+
63
+ DEFAULT_POPOVER = :auto
64
+ POPOVER_OPTIONS = [DEFAULT_POPOVER, :manual].freeze
65
+
66
+ ROLE_OPTIONS = [:dialog, :menu, nil].freeze
67
+
68
+ # Optional button to open the Overlay.
69
+ #
70
+ # @param icon [String] Name of <%= link_to_octicons %> to use instead of text. If provided, a <%= link_to_component(Primer::Beta::IconButton) %> will be rendered. Otherwise a <%= link_to_component(Primer::Beta::Button) %> will be rendered.
71
+ # @param controls [String] The ID of the menu this button controls. Used internally.
72
+ # @param button_arguments [Hash] The arguments accepted by <%= link_to_component(Primer::Beta::Button) %> or <%= link_to_component(Primer::Beta::IconButton) %> depending on the presence of the `icon:` argument.
73
+ renders_one :show_button, lambda { |icon: nil, controls: nil, **button_arguments|
74
+ button_arguments[:id] ||= show_button_id
75
+ @system_arguments[:anchor] = button_arguments[:id]
76
+ button_arguments["popovertarget"] = @id
77
+ button_arguments[:aria] = merge_aria(
78
+ button_arguments,
79
+ { aria: { controls: controls, haspopup: "true" } }
80
+ )
81
+
82
+ if icon.present?
83
+ Primer::Beta::IconButton.new(icon: icon, **button_arguments)
84
+ else
85
+ Primer::Beta::Button.new(**button_arguments)
86
+ end
87
+ }
88
+
89
+ # Header content.
90
+ #
91
+ # @param divider [Boolean] Show a divider between the header and body.
92
+ # @param size [Symbol] One of <%= one_of(Primer::Alpha::Overlay::SIZE_OPTIONS) %>.
93
+ # @param visually_hide_title [Boolean] Visually hide the `title` while maintaining a label for assistive technologies.
94
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
95
+ renders_one :header, lambda { |divider: false, size: :medium, visually_hide_title: @visually_hide_title, **system_arguments|
96
+ Primer::Alpha::Overlay::Header.new(
97
+ overlay_id: @id,
98
+ id: title_id,
99
+ title: @title,
100
+ subtitle: @subtitle,
101
+ size: size,
102
+ divider: divider,
103
+ visually_hide_title: visually_hide_title,
104
+ **system_arguments
105
+ )
106
+ }
107
+
108
+ # Required body content.
109
+ #
110
+ # @param padding [Symbol] The padding. <%= one_of(Primer::Alpha::Overlay::PADDING_OPTIONS) %>
111
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
112
+ renders_one :body, lambda { |padding: @padding, **system_arguments|
113
+ Primer::Alpha::Overlay::Body.new(
114
+ padding: padding,
115
+ **system_arguments
116
+ )
117
+ }
118
+
119
+ # Footer content.
120
+ #
121
+ # @param show_divider [Boolean] Show a divider between the footer and body.
122
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
123
+ renders_one :footer, "Footer"
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
+ # @param id [String] The id of the Overlay.
140
+ # @param title [String] Describes the content of the Overlay.
141
+ # @param subtitle [String] Provides dditional context for the Overlay, also setting the `aria-describedby` attribute.
142
+ # @param popover [Symbol] The popover behaviour. <%= one_of(Primer::Alpha::Overlay::POPOVER_OPTIONS) %>
143
+ # @param size [Symbol] The size of the Overlay. <%= one_of(Primer::Alpha::Overlay::SIZE_OPTIONS) %>
144
+ # @param padding [Symbol] The padding given to the Overlay body. <%= one_of(Primer::Alpha::Overlay::PADDING_OPTIONS) %>
145
+ # @param anchor [String] An ID of the element to anchor onto. Defaults to the `show_button`.
146
+ # @param anchor_align [Symbol] The anchor alignment of the Overlay. <%= one_of(Primer::Alpha::Overlay::ANCHOR_ALIGN_OPTIONS) %>
147
+ # @param anchor_side [Symbol] The side to anchor the Overlay to. <%= one_of(Primer::Alpha::Overlay::ANCHOR_SIDE_OPTIONS) %>
148
+ # @param anchor_offset [Symbol] The anchor offset to give the Overlay. <%= one_of(Primer::Alpha::Overlay::ANCHOR_OFFSET_OPTIONS) %>
149
+ # @param allow_out_of_bounds [Boolean] Allow the Overlay to overflow its container.
150
+ # @param visually_hide_title [Boolean] If true will hide the heading title, while still making it available to Screen Readers.
151
+ # @param role [String] The ARIA role. <%= one_of(Primer::Alpha::Overlay::ROLE_OPTIONS) %>
152
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
153
+ def initialize(
154
+ title:,
155
+ role: nil,
156
+ subtitle: nil,
157
+ popover: DEFAULT_POPOVER,
158
+ size: DEFAULT_SIZE,
159
+ padding: DEFAULT_PADDING,
160
+ anchor: nil,
161
+ anchor_align: DEFAULT_ANCHOR_ALIGN,
162
+ anchor_offset: DEFAULT_ANCHOR_OFFSET,
163
+ anchor_side: DEFAULT_ANCHOR_SIDE,
164
+ allow_out_of_bounds: false,
165
+ visually_hide_title: false,
166
+ id: self.class.generate_id,
167
+ **system_arguments
168
+ )
169
+ @system_arguments = deny_tag_argument(**system_arguments)
170
+
171
+ @system_arguments[:role] = fetch_or_fallback(ROLE_OPTIONS, role) if role.present?
172
+
173
+ @system_arguments[:id] = id.to_s
174
+ @wrapper_classes = class_names(
175
+ "Overlay",
176
+ SIZE_MAPPINGS[fetch_or_fallback(SIZE_OPTIONS, size, DEFAULT_SIZE)]
177
+ )
178
+ @system_arguments[:tag] = "anchored-position"
179
+ @system_arguments[:anchor] = anchor || "overlay-show-#{@system_arguments[:id]}"
180
+ @system_arguments[:align] = fetch_or_fallback(ANCHOR_ALIGN_OPTIONS, anchor_align, DEFAULT_ANCHOR_ALIGN)
181
+ @system_arguments[:side] = ANCHOR_SIDE_MAPPINGS[fetch_or_fallback(ANCHOR_SIDE_OPTIONS, anchor_side, DEFAULT_ANCHOR_SIDE)]
182
+ @system_arguments["anchor-offset"] = fetch_or_fallback(ANCHOR_OFFSET_OPTIONS, anchor_offset, DEFAULT_ANCHOR_OFFSET)
183
+ @system_arguments["allow-out-of-bounds"] = true if allow_out_of_bounds
184
+ @id = id.to_s
185
+ @title = title
186
+ @subtitle = subtitle
187
+ @visually_hide_title = visually_hide_title
188
+ @padding = padding
189
+
190
+ @system_arguments[:popover] = popover
191
+ @system_arguments[:aria] ||= {}
192
+ end
193
+
194
+ def before_render
195
+ if header?
196
+ @system_arguments[:aria][:labelledby] ||= title_id
197
+ else
198
+ @system_arguments[:aria][:label] = @title
199
+ end
200
+ with_body unless body?
201
+ end
202
+
203
+ private
204
+
205
+ def title_id
206
+ "overlay-title-#{@id}"
207
+ end
208
+
209
+ def show_button_id
210
+ "overlay-show-#{@id}"
211
+ end
212
+ end
213
+ end
214
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Alpha
5
+ RadioButton = Primer::FormComponents.from_input(Primer::Forms::Dsl::RadioButtonInput)
6
+
7
+ # Radio buttons represent one of a set of options and are rendered as `<input type="radio">` in HTML.
8
+ # **NOTE**: You probably want to use the <%= link_to_component(Primer::Alpha::RadioButtonGroup) %>
9
+ # component instead, as it allows rendering a group of options.
10
+ #
11
+ # @form_usage
12
+ # class ExampleForm < ApplicationForm
13
+ # form do |example_form|
14
+ # example_form.radio_button(attributes)
15
+ # end
16
+ # end
17
+ class RadioButton < Primer::Component
18
+ status :alpha
19
+
20
+ # @!method initialize
21
+ #
22
+ # @!macro form_input_arguments
23
+ end
24
+ end
25
+ end