@mixtint/primer-view-components 0.72.0

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 (234) hide show
  1. package/LICENSE.txt +21 -0
  2. package/README.md +30 -0
  3. package/app/assets/images/loading_indicator.svg +1 -0
  4. package/app/assets/javascripts/components/primer/alpha/action_bar_element.d.ts +17 -0
  5. package/app/assets/javascripts/components/primer/alpha/action_list.d.ts +16 -0
  6. package/app/assets/javascripts/components/primer/alpha/action_menu/action_menu_element.d.ts +49 -0
  7. package/app/assets/javascripts/components/primer/alpha/action_menu/action_menu_focus_zone_stack.d.ts +17 -0
  8. package/app/assets/javascripts/components/primer/alpha/dropdown/menu.d.ts +1 -0
  9. package/app/assets/javascripts/components/primer/alpha/dropdown.d.ts +1 -0
  10. package/app/assets/javascripts/components/primer/alpha/modal_dialog.d.ts +18 -0
  11. package/app/assets/javascripts/components/primer/alpha/segmented_control.d.ts +12 -0
  12. package/app/assets/javascripts/components/primer/alpha/select_panel_element.d.ts +65 -0
  13. package/app/assets/javascripts/components/primer/alpha/tab_container.d.ts +1 -0
  14. package/app/assets/javascripts/components/primer/alpha/toggle_switch.d.ts +34 -0
  15. package/app/assets/javascripts/components/primer/alpha/tool_tip.d.ts +27 -0
  16. package/app/assets/javascripts/components/primer/alpha/tree_view/tree_view.d.ts +42 -0
  17. package/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_icon_pair_element.d.ts +15 -0
  18. package/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_include_fragment_element.d.ts +9 -0
  19. package/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_roving_tab_index.d.ts +3 -0
  20. package/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_sub_tree_node_element.d.ts +45 -0
  21. package/app/assets/javascripts/components/primer/alpha/x_banner.d.ts +18 -0
  22. package/app/assets/javascripts/components/primer/anchored_position.d.ts +27 -0
  23. package/app/assets/javascripts/components/primer/beta/auto_complete/auto_complete.d.ts +1 -0
  24. package/app/assets/javascripts/components/primer/beta/clipboard_copy.d.ts +1 -0
  25. package/app/assets/javascripts/components/primer/beta/details_toggle_element.d.ts +40 -0
  26. package/app/assets/javascripts/components/primer/beta/nav_list.d.ts +20 -0
  27. package/app/assets/javascripts/components/primer/beta/nav_list_group_element.d.ts +19 -0
  28. package/app/assets/javascripts/components/primer/beta/relative_time.d.ts +1 -0
  29. package/app/assets/javascripts/components/primer/dialog_helper.d.ts +15 -0
  30. package/app/assets/javascripts/components/primer/focus_group.d.ts +19 -0
  31. package/app/assets/javascripts/components/primer/open_project/border_box/collapsible_header.d.ts +11 -0
  32. package/app/assets/javascripts/components/primer/open_project/collapsible.d.ts +13 -0
  33. package/app/assets/javascripts/components/primer/open_project/collapsible_section.d.ts +10 -0
  34. package/app/assets/javascripts/components/primer/open_project/danger_dialog_form_helper.d.ts +14 -0
  35. package/app/assets/javascripts/components/primer/open_project/filterable_tree_view.d.ts +29 -0
  36. package/app/assets/javascripts/components/primer/open_project/page_header_element.d.ts +9 -0
  37. package/app/assets/javascripts/components/primer/open_project/sub_header_element.d.ts +17 -0
  38. package/app/assets/javascripts/components/primer/open_project/zen_mode_button.d.ts +18 -0
  39. package/app/assets/javascripts/components/primer/primer.d.ts +40 -0
  40. package/app/assets/javascripts/components/primer/scrollable_region.d.ts +13 -0
  41. package/app/assets/javascripts/components/primer/shared_events.d.ts +26 -0
  42. package/app/assets/javascripts/components/primer/utils.d.ts +1 -0
  43. package/app/assets/javascripts/lib/primer/forms/primer_multi_input.d.ts +10 -0
  44. package/app/assets/javascripts/lib/primer/forms/primer_text_field.d.ts +28 -0
  45. package/app/assets/javascripts/lib/primer/forms/toggle_switch_input.d.ts +5 -0
  46. package/app/assets/javascripts/primer_view_components.js +2 -0
  47. package/app/assets/javascripts/primer_view_components.js.map +1 -0
  48. package/app/assets/styles/primer_view_components.css +7336 -0
  49. package/app/assets/styles/primer_view_components.css.map +1 -0
  50. package/app/components/primer/alpha/action_bar.css +49 -0
  51. package/app/components/primer/alpha/action_bar.css.json +14 -0
  52. package/app/components/primer/alpha/action_bar_element.d.ts +17 -0
  53. package/app/components/primer/alpha/action_bar_element.js +170 -0
  54. package/app/components/primer/alpha/action_list.css +526 -0
  55. package/app/components/primer/alpha/action_list.css.json +117 -0
  56. package/app/components/primer/alpha/action_list.d.ts +16 -0
  57. package/app/components/primer/alpha/action_list.js +70 -0
  58. package/app/components/primer/alpha/action_menu/action_menu_element.d.ts +49 -0
  59. package/app/components/primer/alpha/action_menu/action_menu_element.js +591 -0
  60. package/app/components/primer/alpha/action_menu/action_menu_focus_zone_stack.d.ts +17 -0
  61. package/app/components/primer/alpha/action_menu/action_menu_focus_zone_stack.js +62 -0
  62. package/app/components/primer/alpha/auto_complete.css +131 -0
  63. package/app/components/primer/alpha/auto_complete.css.json +21 -0
  64. package/app/components/primer/alpha/banner.css +146 -0
  65. package/app/components/primer/alpha/banner.css.json +26 -0
  66. package/app/components/primer/alpha/button_marketing.css +183 -0
  67. package/app/components/primer/alpha/button_marketing.css.json +30 -0
  68. package/app/components/primer/alpha/dialog.css +377 -0
  69. package/app/components/primer/alpha/dialog.css.json +66 -0
  70. package/app/components/primer/alpha/dropdown/menu.d.ts +1 -0
  71. package/app/components/primer/alpha/dropdown/menu.js +1 -0
  72. package/app/components/primer/alpha/dropdown.css +296 -0
  73. package/app/components/primer/alpha/dropdown.css.json +40 -0
  74. package/app/components/primer/alpha/dropdown.d.ts +1 -0
  75. package/app/components/primer/alpha/dropdown.js +1 -0
  76. package/app/components/primer/alpha/layout.css +374 -0
  77. package/app/components/primer/alpha/layout.css.json +74 -0
  78. package/app/components/primer/alpha/menu.css +124 -0
  79. package/app/components/primer/alpha/menu.css.json +26 -0
  80. package/app/components/primer/alpha/modal_dialog.d.ts +18 -0
  81. package/app/components/primer/alpha/modal_dialog.js +187 -0
  82. package/app/components/primer/alpha/overlay.css +25 -0
  83. package/app/components/primer/alpha/overlay.css.json +12 -0
  84. package/app/components/primer/alpha/segmented_control.css +161 -0
  85. package/app/components/primer/alpha/segmented_control.css.json +31 -0
  86. package/app/components/primer/alpha/segmented_control.d.ts +12 -0
  87. package/app/components/primer/alpha/segmented_control.js +59 -0
  88. package/app/components/primer/alpha/select_panel.css +10 -0
  89. package/app/components/primer/alpha/select_panel.css.json +7 -0
  90. package/app/components/primer/alpha/select_panel_element.d.ts +65 -0
  91. package/app/components/primer/alpha/select_panel_element.js +988 -0
  92. package/app/components/primer/alpha/skeleton_box.css +36 -0
  93. package/app/components/primer/alpha/skeleton_box.css.json +6 -0
  94. package/app/components/primer/alpha/stack.css +266 -0
  95. package/app/components/primer/alpha/stack.css.json +94 -0
  96. package/app/components/primer/alpha/stack_item.css +27 -0
  97. package/app/components/primer/alpha/stack_item.css.json +12 -0
  98. package/app/components/primer/alpha/tab_container.d.ts +1 -0
  99. package/app/components/primer/alpha/tab_container.js +1 -0
  100. package/app/components/primer/alpha/tab_nav.css +112 -0
  101. package/app/components/primer/alpha/tab_nav.css.json +22 -0
  102. package/app/components/primer/alpha/text_field.css +838 -0
  103. package/app/components/primer/alpha/text_field.css.json +134 -0
  104. package/app/components/primer/alpha/toggle_switch.css +230 -0
  105. package/app/components/primer/alpha/toggle_switch.css.json +40 -0
  106. package/app/components/primer/alpha/toggle_switch.d.ts +34 -0
  107. package/app/components/primer/alpha/toggle_switch.js +179 -0
  108. package/app/components/primer/alpha/tool_tip.d.ts +27 -0
  109. package/app/components/primer/alpha/tool_tip.js +443 -0
  110. package/app/components/primer/alpha/tree_view/tree_view.d.ts +42 -0
  111. package/app/components/primer/alpha/tree_view/tree_view.js +391 -0
  112. package/app/components/primer/alpha/tree_view/tree_view_icon_pair_element.d.ts +15 -0
  113. package/app/components/primer/alpha/tree_view/tree_view_icon_pair_element.js +62 -0
  114. package/app/components/primer/alpha/tree_view/tree_view_include_fragment_element.d.ts +9 -0
  115. package/app/components/primer/alpha/tree_view/tree_view_include_fragment_element.js +28 -0
  116. package/app/components/primer/alpha/tree_view/tree_view_roving_tab_index.d.ts +3 -0
  117. package/app/components/primer/alpha/tree_view/tree_view_roving_tab_index.js +130 -0
  118. package/app/components/primer/alpha/tree_view/tree_view_sub_tree_node_element.d.ts +45 -0
  119. package/app/components/primer/alpha/tree_view/tree_view_sub_tree_node_element.js +429 -0
  120. package/app/components/primer/alpha/tree_view.css +396 -0
  121. package/app/components/primer/alpha/tree_view.css.json +52 -0
  122. package/app/components/primer/alpha/underline_nav.css +150 -0
  123. package/app/components/primer/alpha/underline_nav.css.json +26 -0
  124. package/app/components/primer/alpha/x_banner.d.ts +18 -0
  125. package/app/components/primer/alpha/x_banner.js +51 -0
  126. package/app/components/primer/anchored_position.d.ts +27 -0
  127. package/app/components/primer/anchored_position.js +159 -0
  128. package/app/components/primer/beta/auto_complete/auto_complete.d.ts +1 -0
  129. package/app/components/primer/beta/auto_complete/auto_complete.js +1 -0
  130. package/app/components/primer/beta/avatar.css +77 -0
  131. package/app/components/primer/beta/avatar.css.json +17 -0
  132. package/app/components/primer/beta/avatar_stack.css +145 -0
  133. package/app/components/primer/beta/avatar_stack.css.json +28 -0
  134. package/app/components/primer/beta/blankslate.css +168 -0
  135. package/app/components/primer/beta/blankslate.css.json +23 -0
  136. package/app/components/primer/beta/border_box.css +218 -0
  137. package/app/components/primer/beta/border_box.css.json +54 -0
  138. package/app/components/primer/beta/breadcrumbs.css +29 -0
  139. package/app/components/primer/beta/breadcrumbs.css.json +9 -0
  140. package/app/components/primer/beta/button.css +359 -0
  141. package/app/components/primer/beta/button.css.json +86 -0
  142. package/app/components/primer/beta/button_group.css +20 -0
  143. package/app/components/primer/beta/button_group.css.json +12 -0
  144. package/app/components/primer/beta/clipboard_copy.d.ts +1 -0
  145. package/app/components/primer/beta/clipboard_copy.js +58 -0
  146. package/app/components/primer/beta/counter.css +38 -0
  147. package/app/components/primer/beta/counter.css.json +10 -0
  148. package/app/components/primer/beta/details_toggle_element.d.ts +40 -0
  149. package/app/components/primer/beta/details_toggle_element.js +65 -0
  150. package/app/components/primer/beta/flash.css +152 -0
  151. package/app/components/primer/beta/flash.css.json +27 -0
  152. package/app/components/primer/beta/label.css +109 -0
  153. package/app/components/primer/beta/label.css.json +24 -0
  154. package/app/components/primer/beta/link.css +79 -0
  155. package/app/components/primer/beta/link.css.json +19 -0
  156. package/app/components/primer/beta/nav_list.d.ts +20 -0
  157. package/app/components/primer/beta/nav_list.js +192 -0
  158. package/app/components/primer/beta/nav_list_group_element.d.ts +19 -0
  159. package/app/components/primer/beta/nav_list_group_element.js +111 -0
  160. package/app/components/primer/beta/popover.css +215 -0
  161. package/app/components/primer/beta/popover.css.json +33 -0
  162. package/app/components/primer/beta/progress_bar.css +27 -0
  163. package/app/components/primer/beta/progress_bar.css.json +10 -0
  164. package/app/components/primer/beta/relative_time.d.ts +1 -0
  165. package/app/components/primer/beta/relative_time.js +1 -0
  166. package/app/components/primer/beta/state.css +59 -0
  167. package/app/components/primer/beta/state.css.json +13 -0
  168. package/app/components/primer/beta/subhead.css +64 -0
  169. package/app/components/primer/beta/subhead.css.json +14 -0
  170. package/app/components/primer/beta/timeline_item.css +106 -0
  171. package/app/components/primer/beta/timeline_item.css.json +16 -0
  172. package/app/components/primer/beta/truncate.css +30 -0
  173. package/app/components/primer/beta/truncate.css.json +12 -0
  174. package/app/components/primer/dialog_helper.d.ts +15 -0
  175. package/app/components/primer/dialog_helper.js +132 -0
  176. package/app/components/primer/focus_group.d.ts +19 -0
  177. package/app/components/primer/focus_group.js +163 -0
  178. package/app/components/primer/open_project/border_box/collapsible_header.css +21 -0
  179. package/app/components/primer/open_project/border_box/collapsible_header.css.json +11 -0
  180. package/app/components/primer/open_project/border_box/collapsible_header.d.ts +11 -0
  181. package/app/components/primer/open_project/border_box/collapsible_header.js +21 -0
  182. package/app/components/primer/open_project/border_grid.css +35 -0
  183. package/app/components/primer/open_project/border_grid.css.json +11 -0
  184. package/app/components/primer/open_project/collapsible.d.ts +13 -0
  185. package/app/components/primer/open_project/collapsible.js +67 -0
  186. package/app/components/primer/open_project/collapsible_section.css +5 -0
  187. package/app/components/primer/open_project/collapsible_section.css.json +6 -0
  188. package/app/components/primer/open_project/collapsible_section.d.ts +10 -0
  189. package/app/components/primer/open_project/collapsible_section.js +16 -0
  190. package/app/components/primer/open_project/danger_dialog_form_helper.d.ts +14 -0
  191. package/app/components/primer/open_project/danger_dialog_form_helper.js +54 -0
  192. package/app/components/primer/open_project/drag_handle.css +6 -0
  193. package/app/components/primer/open_project/drag_handle.css.json +6 -0
  194. package/app/components/primer/open_project/filterable_tree_view.d.ts +29 -0
  195. package/app/components/primer/open_project/filterable_tree_view.js +409 -0
  196. package/app/components/primer/open_project/input_group.css +22 -0
  197. package/app/components/primer/open_project/input_group.css.json +12 -0
  198. package/app/components/primer/open_project/page_header.css +87 -0
  199. package/app/components/primer/open_project/page_header.css.json +20 -0
  200. package/app/components/primer/open_project/page_header_element.d.ts +9 -0
  201. package/app/components/primer/open_project/page_header_element.js +23 -0
  202. package/app/components/primer/open_project/side_panel/section.css +27 -0
  203. package/app/components/primer/open_project/side_panel/section.css.json +11 -0
  204. package/app/components/primer/open_project/sub_header.css +80 -0
  205. package/app/components/primer/open_project/sub_header.css.json +17 -0
  206. package/app/components/primer/open_project/sub_header_element.d.ts +17 -0
  207. package/app/components/primer/open_project/sub_header_element.js +76 -0
  208. package/app/components/primer/open_project/zen_mode_button.d.ts +18 -0
  209. package/app/components/primer/open_project/zen_mode_button.js +64 -0
  210. package/app/components/primer/primer.d.ts +40 -0
  211. package/app/components/primer/primer.js +40 -0
  212. package/app/components/primer/scrollable_region.d.ts +13 -0
  213. package/app/components/primer/scrollable_region.js +52 -0
  214. package/app/components/primer/shared_events.d.ts +26 -0
  215. package/app/components/primer/shared_events.js +1 -0
  216. package/app/components/primer/truncate.css +23 -0
  217. package/app/components/primer/truncate.css.json +13 -0
  218. package/app/components/primer/utils.d.ts +1 -0
  219. package/app/components/primer/utils.js +16 -0
  220. package/app/lib/primer/forms/primer_multi_input.d.ts +10 -0
  221. package/app/lib/primer/forms/primer_multi_input.js +44 -0
  222. package/app/lib/primer/forms/primer_text_field.d.ts +28 -0
  223. package/app/lib/primer/forms/primer_text_field.js +119 -0
  224. package/app/lib/primer/forms/toggle_switch_input.d.ts +5 -0
  225. package/app/lib/primer/forms/toggle_switch_input.js +34 -0
  226. package/package.json +103 -0
  227. package/static/arguments.json +6472 -0
  228. package/static/audited_at.json +173 -0
  229. package/static/classes.json +781 -0
  230. package/static/constants.json +1972 -0
  231. package/static/form_previews.json +118 -0
  232. package/static/info_arch.json +21331 -0
  233. package/static/previews.json +9436 -0
  234. package/static/statuses.json +173 -0
@@ -0,0 +1,838 @@
1
+ /* stylelint-disable selector-max-type */
2
+ /* stylelint-disable max-nesting-depth */
3
+ /* stylelint-disable selector-max-specificity */
4
+ /* stylelint-disable primer/spacing */
5
+ /* FormControl */
6
+ /* groups label, field, caption and inline error message */
7
+ .FormControl {
8
+ display: inline-flex;
9
+ flex-direction: column;
10
+ gap: var(--base-size-4);
11
+ }
12
+ /* fill container */
13
+ .FormControl--fullWidth {
14
+ display: flex;
15
+ }
16
+ /* <label> */
17
+ .FormControl-label {
18
+ font-size: var(--text-body-size-medium);
19
+ font-weight: var(--base-text-weight-semibold);
20
+ line-height: var(--text-body-lineHeight-medium);
21
+ color: var(--fgColor-default);
22
+ }
23
+ /* optional caption */
24
+ .FormControl-caption {
25
+ margin-bottom: 0;
26
+ font-size: var(--text-caption-size);
27
+ font-weight: var(--text-caption-weight);
28
+ line-height: var(--text-caption-lineHeight);
29
+ color: var(--fgColor-muted);
30
+ }
31
+ .FormControl-caption a {
32
+ -webkit-text-decoration: underline;
33
+ text-decoration: underline;
34
+ }
35
+ /* inline validation message */
36
+ .FormControl-inlineValidation {
37
+ display: flex;
38
+ font-size: var(--text-caption-size);
39
+ font-weight: var(--base-text-weight-semibold);
40
+ line-height: var(--text-caption-lineHeight);
41
+ color: var(--control-danger-fgColor-rest);
42
+ fill: var(--control-danger-fgColor-rest);
43
+ flex-direction: row;
44
+ align-items: flex-start;
45
+ gap: var(--base-size-4);
46
+ }
47
+ .FormControl-inlineValidation p {
48
+ margin-bottom: 0;
49
+ }
50
+ .FormControl-inlineValidation--success {
51
+ color: var(--fgColor-success);
52
+ fill: var(--fgColor-success);
53
+ }
54
+ .FormControl-inlineValidation--visual {
55
+ align-items: center;
56
+ display: flex;
57
+ min-height: var(--base-size-16);
58
+ }
59
+ .FormControl-spacingWrapper {
60
+ display: flex;
61
+ flex-direction: column;
62
+ row-gap: var(--stack-gap-normal);
63
+ }
64
+ .FormControl-horizontalGroup {
65
+ display: flex;
66
+ column-gap: 0.5rem;
67
+ }
68
+ /* shared among all form control components (input, select, textarea, checkbox, radio) */
69
+ /* TextInput structure
70
+ ** ===================
71
+ **
72
+ ** .FormControl
73
+ ** ├─ .FormControl-label
74
+ ** │ ├─ .FormControl-input-wrap
75
+ ** │ │ ├─ .FormControl-input-trailingVisualWrap
76
+ ** │ │ │ ├─ .FormControl-input-trailingVisual
77
+ ** │ │ ├─ .FormControl-input-leadingVisualWrap
78
+ ** │ │ │ ├─ .FormControl-input-leadingVisual
79
+ ** │ │ ├─ .FormControl-input
80
+ ** │ │ ├─ .FormControl-input-trailingAction
81
+ ** ├─ .FormControl-inlineValidation
82
+ ** ├─ .FormControl-caption */
83
+ /* // Select structure
84
+ ** ===================
85
+ **
86
+ ** .FormControl
87
+ ** ├─ .FormControl-label
88
+ ** │ ├─ .FormControl-select-wrap
89
+ ** │ │ ├─ .FormControl-select
90
+ ** ├─ .FormControl-inlineValidation
91
+ ** ├─ .FormControl-caption */
92
+ /* // Textarea structure
93
+ ** ===================
94
+ **
95
+ ** .FormControl
96
+ ** ├─ .FormControl-label
97
+ ** ├─ .FormControl-textarea
98
+ ** ├─ .FormControl-inlineValidation
99
+ ** ├─ .FormControl-caption */
100
+ .FormControl-input,
101
+ .FormControl-select,
102
+ .FormControl-textarea {
103
+ color: var(--fgColor-default);
104
+ background-color: var(--bgColor-default);
105
+ border: var(--borderWidth-thin) solid var(--control-borderColor-rest, var(--color-border-default));
106
+ box-shadow: var(--shadow-inset);
107
+ }
108
+ [disabled]:is(.FormControl-input,.FormControl-select,.FormControl-textarea) {
109
+ color: var(--control-fgColor-disabled);
110
+ cursor: not-allowed;
111
+ background-color: var(--control-bgColor-disabled);
112
+ border-color: var(--control-borderColor-disabled);
113
+ box-shadow: none;
114
+ opacity: 1;
115
+ -webkit-text-fill-color: var(--control-fgColor-disabled);
116
+ }
117
+ [invalid='true']:is(.FormControl-input,.FormControl-select,.FormControl-textarea):not(:focus) {
118
+ border-color: var(--control-borderColor-danger);
119
+ }
120
+ [invalid='false']:is(.FormControl-input,.FormControl-select,.FormControl-textarea):not(:focus) {
121
+ border-color: var(--control-borderColor-success);
122
+ }
123
+ :is(.FormControl-input,.FormControl-select,.FormControl-textarea):not([type='checkbox'],[type='radio']):focus {
124
+ border-color: var(--focus-outlineColor);
125
+ outline: none;
126
+ box-shadow: inset 0 0 0 1px var(--focus-outlineColor);
127
+
128
+ /* remove fallback :focus if :focus-visible is supported */
129
+ }
130
+ :is(.FormControl-input,.FormControl-select,.FormControl-textarea):not([type='checkbox'],[type='radio']):focus:not(:focus-visible) {
131
+ border-color: transparent;
132
+
133
+ border-color: var(--focus-outlineColor);
134
+
135
+ outline: none;
136
+
137
+ box-shadow: inset 0 0 0 1px transparent var(--focus-outlineColor);
138
+ }
139
+ /* default focus state */
140
+ :is(.FormControl-input,.FormControl-select,.FormControl-textarea):not([type='checkbox'],[type='radio']):focus-visible {
141
+ border-color: var(--focus-outlineColor);
142
+ outline: none;
143
+ box-shadow: inset 0 0 0 1px var(--focus-outlineColor);
144
+ }
145
+ .FormControl-input,
146
+ .FormControl-select,
147
+ .FormControl-textarea {
148
+
149
+ width: 100%;
150
+ font-size: var(--text-body-size-medium);
151
+ line-height: var(--text-body-lineHeight-medium);
152
+ border-radius: var(--borderRadius-medium);
153
+ transition: 80ms cubic-bezier(0.33, 1, 0.68, 1);
154
+ transition-property: color, background-color, box-shadow, border-color;
155
+ padding-inline: var(--control-medium-paddingInline-condensed);
156
+ padding-block: calc(var(--control-medium-paddingBlock) - var(--borderWidth-thin));
157
+ }
158
+ [disabled]:is(.FormControl-input,.FormControl-select,.FormControl-textarea)::placeholder {
159
+ color: var(--control-fgColor-disabled);
160
+ }
161
+ [readonly]:is(.FormControl-input,.FormControl-select,.FormControl-textarea) {
162
+ background-color: var(--control-bgColor-disabled);
163
+ }
164
+ :is(.FormControl-input,.FormControl-select,.FormControl-textarea)::placeholder {
165
+ color: var(--control-fgColor-placeholder);
166
+ opacity: 1;
167
+ }
168
+ /* sizes */
169
+ .FormControl-small:is(.FormControl-input,.FormControl-select,.FormControl-textarea) {
170
+ height: var(--control-small-size);
171
+ padding-inline: var(--control-small-paddingInline-normal);
172
+ padding-block: var(--control-small-paddingBlock);
173
+ font-size: var(--text-body-size-small);
174
+ }
175
+ .FormControl-medium:is(.FormControl-input,.FormControl-select,.FormControl-textarea) {
176
+ height: var(--control-medium-size);
177
+ }
178
+ .FormControl-large:is(.FormControl-input,.FormControl-select,.FormControl-textarea) {
179
+ height: var(--control-large-size);
180
+ padding-inline: var(--control-large-paddingInline-normal);
181
+ padding-block: var(--control-large-paddingBlock);
182
+ }
183
+ /* variants */
184
+ .FormControl-inset:is(.FormControl-input,.FormControl-select,.FormControl-textarea) {
185
+ background-color: var(--bgColor-muted);
186
+ }
187
+ .FormControl-inset:is(.FormControl-input,.FormControl-select,.FormControl-textarea):focus-visible,.FormControl-inset:is(.FormControl-input,.FormControl-select,.FormControl-textarea):focus {
188
+ background-color: var(--bgColor-default);
189
+ }
190
+ .FormControl-monospace:is(.FormControl-input,.FormControl-select,.FormControl-textarea) {
191
+ font-family: var(--fontStack-monospace);
192
+ }
193
+ /* validation states */
194
+ .FormControl-error:is(.FormControl-input,.FormControl-select,.FormControl-textarea) {
195
+ border-color: var(--control-borderColor-danger);
196
+ }
197
+ .FormControl-success:is(.FormControl-input,.FormControl-select,.FormControl-textarea) {
198
+ border-color: var(--control-borderColor-success);
199
+ }
200
+ .FormControl-warning:is(.FormControl-input,.FormControl-select,.FormControl-textarea) {
201
+ border-color: var(--control-borderColor-warning);
202
+ }
203
+ .FormControl-toggleSwitchInput {
204
+ display: flex;
205
+ align-items: flex-start;
206
+ gap: var(--base-size-16);
207
+ }
208
+ /* widths */
209
+ /* positioning for leading/trailing items for TextInput */
210
+ .FormControl-input-wrap {
211
+ position: relative;
212
+ display: grid;
213
+ }
214
+ .FormControl-input-wrap.FormControl-input-width--auto {
215
+ width: auto;
216
+ }
217
+ .FormControl-input-wrap.FormControl-input-width--xsmall {
218
+ max-width: min(144px, 100vw - 2rem);
219
+ }
220
+ .FormControl-input-wrap.FormControl-input-width--small {
221
+ max-width: min(256px, 100vw - 2rem);
222
+ }
223
+ .FormControl-input-wrap.FormControl-input-width--medium {
224
+ max-width: min(320px, 100vw - 2rem);
225
+ }
226
+ .FormControl-input-wrap.FormControl-input-width--large {
227
+ max-width: min(480px, 100vw - 2rem);
228
+ }
229
+ .FormControl-input-wrap.FormControl-input-width--xlarge {
230
+ max-width: min(680px, 100vw - 2rem);
231
+ }
232
+ .FormControl-input-wrap.FormControl-input-width--xxlarge {
233
+ max-width: min(960px, 100vw - 2rem);
234
+ }
235
+ .FormControl-input-wrap .FormControl-input-leadingVisualWrap {
236
+ position: absolute;
237
+ top: var(--base-size-8);
238
+ left: var(--base-size-8);
239
+ display: block;
240
+ width: var(--base-size-16);
241
+ height: var(--base-size-16);
242
+ color: var(--fgColor-muted);
243
+ pointer-events: none;
244
+
245
+ /* octicon */
246
+ }
247
+ :is(.FormControl-input-wrap .FormControl-input-leadingVisualWrap) .FormControl-input-leadingVisual {
248
+ display: block;
249
+ -webkit-user-select: none;
250
+ user-select: none;
251
+ }
252
+ .FormControl-input-wrap .FormControl-input-trailingVisualWrap {
253
+ position: absolute;
254
+ top: var(--base-size-8);
255
+ right: var(--base-size-8);
256
+ display: flex;
257
+ height: var(--base-size-16);
258
+ align-items: center;
259
+ gap: var(--base-size-4);
260
+ color: var(--fgColor-muted);
261
+ pointer-events: none;
262
+ }
263
+ :is(.FormControl-input-wrap .FormControl-input-trailingVisualWrap):has(.FormControl-input-trailingVisualText) {
264
+ max-width: 25%;
265
+ padding-left: var(--base-size-8);
266
+ }
267
+ :is(.FormControl-input-wrap .FormControl-input-trailingVisualWrap):has(.FormControl-input-trailingVisualLabel) {
268
+ max-width: 25%;
269
+ padding-left: var(--base-size-8);
270
+ }
271
+ :is(.FormControl-input-wrap .FormControl-input-trailingVisualWrap) .FormControl-input-trailingVisualLabel {
272
+ overflow: hidden;
273
+ text-overflow: ellipsis;
274
+ }
275
+ /* TODO: replace with new Button component */
276
+ .FormControl-input-wrap .FormControl-input-trailingAction {
277
+ position: absolute;
278
+ top: var(--base-size-4);
279
+ right: var(--base-size-4);
280
+ z-index: 4;
281
+ display: grid;
282
+ width: var(--control-xsmall-size);
283
+ height: var(--control-xsmall-size);
284
+ padding: 0;
285
+ color: var(--fgColor-muted);
286
+ cursor: pointer;
287
+ background: transparent;
288
+ border: 0;
289
+ border-radius: var(--borderRadius-small);
290
+ transition: 0.2s cubic-bezier(0.3, 0, 0.5, 1);
291
+ transition-property: color, background-color, border-color;
292
+ align-items: center;
293
+ justify-content: center;
294
+ }
295
+ :is(.FormControl-input-wrap .FormControl-input-trailingAction) svg {
296
+ -webkit-user-select: none;
297
+ user-select: none;
298
+ }
299
+ [disabled]:is(.FormControl-input-wrap .FormControl-input-trailingAction) {
300
+ color: var(--control-fgColor-disabled);
301
+ pointer-events: none;
302
+ }
303
+ :is(.FormControl-input-wrap .FormControl-input-trailingAction):hover {
304
+ background: var(--control-transparent-bgColor-hover);
305
+ }
306
+ :is(.FormControl-input-wrap .FormControl-input-trailingAction):active {
307
+ background: var(--control-transparent-bgColor-active);
308
+ }
309
+ /* show vertical divider line between field and button */
310
+ .FormControl-input-trailingAction--divider:is(.FormControl-input-wrap .FormControl-input-trailingAction)::before {
311
+ position: absolute;
312
+ top: calc((var(--control-xsmall-size) - var(--base-size-16)) / 2);
313
+ left: calc(var(--base-size-4) * -1);
314
+ display: block;
315
+ width: var(--borderWidth-thin);
316
+ height: var(--base-size-16);
317
+ content: '';
318
+ /* stylelint-disable-next-line primer/colors */
319
+ background: var(--borderColor-default);
320
+ }
321
+ :is(:is(.FormControl-input-wrap .FormControl-input-trailingAction)::after) {
322
+ position: absolute;
323
+ top: 50%;
324
+ left: 50%;
325
+ width: 100%;
326
+ height: 100%;
327
+ min-height: var(--control-medium-size) var(--control-medium-size);
328
+ content: "";
329
+ transform: translateX(-50%) translateY(-50%);
330
+ }
331
+ @media (pointer: coarse) {
332
+ :is(.FormControl-input-wrap .FormControl-input-trailingAction)::after {
333
+ min-width: var(--control-minTarget-coarse);
334
+ min-height: var(--control-minTarget-coarse);
335
+ }
336
+ }
337
+ /* if leadingVisual is present */
338
+ /*
339
+ ┌──32px──┬────────────────────┐
340
+ ╎ ┌───┐ ┌────────────────┐ ╎
341
+ ╎ 16px 16px ╎
342
+ ╎ └───┘ └────────────────┘ ╎
343
+ └───────8px───────────────────┘
344
+ */
345
+ .FormControl-input-wrap.FormControl-input-wrap--leadingVisual .FormControl-input {
346
+ padding-inline-start: calc(
347
+ var(--control-medium-paddingInline-condensed) + var(--base-size-16) + var(--control-medium-gap)
348
+ ); /* 32px */
349
+ }
350
+ /* if trailingVisual is present */
351
+ /*
352
+ ┌──────────────────┬──32px──┐
353
+ ╎ ┌──────────────┐ ┌────┐ ╎
354
+ ╎ 24px 24px ╎
355
+ ╎ └──────────────┘ └────┘ ╎
356
+ └──────────────────┴────────┘
357
+ */
358
+ .FormControl-input-wrap.FormControl-input-wrap--trailingVisual .FormControl-input {
359
+ padding-inline-end: calc(var(--control-medium-paddingInline-condensed) + var(--base-size-16) + var(--control-medium-gap));
360
+ }
361
+ .FormControl-input-wrap.FormControl-input-wrap--trailingVisual:has(.FormControl-input-trailingVisualText) .FormControl-input {
362
+ padding-inline-end: 25%
363
+ }
364
+ .FormControl-input-wrap.FormControl-input-wrap--trailingVisual:has(.FormControl-input-trailingVisualLabel) .FormControl-input {
365
+ padding-inline-end: 25%
366
+ }
367
+ /*
368
+ ┌──────────────────┬──32px──┐
369
+ ╎ ┌──────────────┐ ┌────┐ ╎
370
+ ╎ 24px 24px ╎
371
+ ╎ └──────────────┘ └────┘ ╎
372
+ └──────────────────┴────────┘
373
+ */
374
+ /* if trailingAction is present */
375
+ .FormControl-input-wrap.FormControl-input-wrap--trailingAction .FormControl-input {
376
+ padding-inline-end: calc(
377
+ var(--control-medium-paddingInline-condensed) + var(--base-size-16) + var(--control-medium-gap)
378
+ ); /* 32px */
379
+ }
380
+ /*
381
+ 32px + 1px border
382
+ ┌──────────────────┬──33px──┐
383
+ ╎ ┌──────────────┐ ┌────┐ ╎
384
+ ╎ 24px 24px ╎
385
+ ╎ └──────────────┘ └────┘ ╎
386
+ └──────────────────┴────────┘
387
+ */
388
+ /* if trailingAction divider is present, add 1px padding to accomodate input field text
389
+ ** can be refactored to has(.FormControl-input-trailingAction--divider) */
390
+ .FormControl-input-wrap.FormControl-input-wrap--trailingAction.FormControl-input-wrap-trailingAction--divider .FormControl-input {
391
+ padding-inline-end: calc(
392
+ var(--control-medium-paddingInline-condensed) + var(--base-size-16) + var(--control-medium-gap) +
393
+ var(--borderWidth-thin)
394
+ ); /* 33px */
395
+ }
396
+ /* size modifications can be refactored with :has() - FormControl-input-wrap:has(.FormControl-large)
397
+ // sizes */
398
+ .FormControl-input-wrap.FormControl-input-wrap--small .FormControl-input-leadingVisualWrap {
399
+ top: calc(var(--control-medium-paddingInline-condensed) - var(--base-size-2)); /* 6px */
400
+ left: calc(var(--control-medium-paddingInline-condensed) - var(--base-size-2)); /* 6px */
401
+ }
402
+ .FormControl-input-wrap.FormControl-input-wrap--small .FormControl-input-trailingVisualWrap {
403
+ top: calc(var(--control-medium-paddingInline-condensed) - var(--base-size-2)); /* 6px */
404
+ right: calc(var(--control-medium-paddingInline-condensed) - var(--base-size-2)); /* 6px */
405
+ }
406
+ /*
407
+ ┌──────────────────┬──28px──┐
408
+ ╎ ┌──────────────┐ ┌────┐ ╎
409
+ ╎ 20px 20px ╎
410
+ ╎ └──────────────┘ └────┘ ╎
411
+ └──────────────────┴────────┘
412
+ */
413
+ .FormControl-input-wrap.FormControl-input-wrap--small.FormControl-input-wrap--trailingAction .FormControl-input.FormControl-small {
414
+ padding-inline-end: calc(
415
+ var(--control-small-paddingInline-condensed) + var(--base-size-16) + var(--control-small-gap)
416
+ ); /* 28px */
417
+ }
418
+ /*
419
+ 28px + 1px border
420
+ ┌──────────────────┬──29px──┐
421
+ ╎ ┌──────────────┐ ┌────┐ ╎
422
+ ╎ 20px 20px ╎
423
+ ╎ └──────────────┘ └────┘ ╎
424
+ └──────────────────┴────────┘
425
+ */
426
+ .FormControl-input-wrap.FormControl-input-wrap--small.FormControl-input-wrap--trailingAction.FormControl-input-wrap-trailingAction--divider .FormControl-input.FormControl-small {
427
+ padding-inline-end: calc(
428
+ var(--control-small-paddingInline-condensed) + var(--base-size-16) + var(--control-small-gap) +
429
+ var(--borderWidth-thin)
430
+ ); /* 29px */
431
+ }
432
+ .FormControl-input-wrap.FormControl-input-wrap--small .FormControl-input-trailingAction {
433
+ width: calc(var(--control-small-size) - var(--base-size-8));
434
+ height: calc(var(--control-small-size) - var(--base-size-8));
435
+ }
436
+ :is(.FormControl-input-wrap.FormControl-input-wrap--small .FormControl-input-trailingAction)::before {
437
+ top: calc((var(--control-xsmall-size) - var(--base-size-16)) / 4); /* 2px */
438
+ }
439
+ .FormControl-input-wrap.FormControl-input-wrap--large .FormControl-input-leadingVisualWrap {
440
+ top: var(--control-medium-paddingInline-normal);
441
+ left: var(--control-medium-paddingInline-normal);
442
+ }
443
+ .FormControl-input-wrap.FormControl-input-wrap--large .FormControl-input-trailingVisualWrap {
444
+ top: var(--control-medium-paddingInline-normal);
445
+ right: var(--control-medium-paddingInline-normal);
446
+ }
447
+ /*
448
+ ┌──36px──┬───12px padding──────┐
449
+ ╎ ┌───┐ ┌────────────────┐ ╎
450
+ ╎ 16px 16px ╎
451
+ ╎ └───┘ └────────────────┘ ╎
452
+ └12px───8px───────────────────┘
453
+ */
454
+ .FormControl-input-wrap.FormControl-input-wrap--large.FormControl-input-wrap--leadingVisual .FormControl-input.FormControl-large {
455
+ padding-inline-start: calc(
456
+ var(--control-large-paddingInline-normal) + var(--base-size-16) + var(--control-large-gap)
457
+ ); /* 36px */
458
+ }
459
+ .FormControl-input-wrap.FormControl-input-wrap--large.FormControl-input-wrap--trailingVisual .FormControl-input {
460
+ padding-inline-end: calc(var(--control-large-paddingInline-normal) + var(--base-size-16) + var(--control-large-gap));
461
+ }
462
+ .FormControl-input-wrap.FormControl-input-wrap--large.FormControl-input-wrap--trailingVisual:has(.FormControl-input-trailingVisualText) .FormControl-input {
463
+ padding-inline-end: 25%
464
+ }
465
+ .FormControl-input-wrap.FormControl-input-wrap--large.FormControl-input-wrap--trailingVisual:has(.FormControl-input-trailingVisualLabel) .FormControl-input {
466
+ padding-inline-end: 25%
467
+ }
468
+ .FormControl-input-wrap.FormControl-input-wrap--large.FormControl-input-wrap--trailingText .FormControl-input.FormControl-large {
469
+ padding-inline-end: 25%;
470
+ }
471
+ .FormControl-input-wrap.FormControl-input-wrap--large.FormControl-input-wrap--trailingLabel .FormControl-input.FormControl-large {
472
+ padding-inline-end: 25%;
473
+ }
474
+ /*
475
+ ┌──────────────────┬──36px──┐
476
+ ╎ ┌──────────────┐ ┌────┐ ╎
477
+ ╎ 28px 28px ╎
478
+ ╎ └──────────────┘ └────┘ ╎
479
+ └──────────────────┴────────┘
480
+ */
481
+ .FormControl-input-wrap.FormControl-input-wrap--large.FormControl-input-wrap--trailingAction .FormControl-input.FormControl-large {
482
+ padding-inline-end: calc(
483
+ var(--control-large-paddingInline-normal) + var(--base-size-16) + var(--control-large-gap)
484
+ ); /* 36px */
485
+ }
486
+ /*
487
+ ┌──────────────────┬──37px──┐
488
+ ╎ ┌──────────────┐ ┌────┐ ╎
489
+ ╎ 28px 28px ╎
490
+ ╎ └──────────────┘ └────┘ ╎
491
+ └──────────────────┴────────┘
492
+ */
493
+ .FormControl-input-wrap.FormControl-input-wrap--large.FormControl-input-wrap--trailingAction.FormControl-input-wrap-trailingAction--divider .FormControl-input.FormControl-large {
494
+ padding-inline-end: calc(
495
+ var(--control-large-paddingInline-normal) + var(--base-size-16) + var(--control-large-gap) +
496
+ var(--borderWidth-thin)
497
+ ); /* 37px */
498
+ }
499
+ .FormControl-input-wrap.FormControl-input-wrap--large .FormControl-input-trailingAction {
500
+ top: calc(var(--control-medium-paddingInline-condensed) - var(--base-size-2)); /* 6px */
501
+ right: calc(var(--control-medium-paddingInline-condensed) - var(--base-size-2)); /* 6px */
502
+ width: var(--control-small-size);
503
+ height: var(--control-small-size);
504
+ }
505
+ :is(.FormControl-input-wrap.FormControl-input-wrap--large .FormControl-input-trailingAction)::before {
506
+ top: unset;
507
+ height: var(--base-size-20);
508
+ }
509
+ .FormControl-select-wrap {
510
+ display: grid;
511
+ grid-template-columns: minmax(0, auto) var(--base-size-16);
512
+ }
513
+ .FormControl-select-wrap.FormControl-input-width--auto {
514
+ width: auto;
515
+ }
516
+ .FormControl-select-wrap.FormControl-input-width--xsmall {
517
+ max-width: min(144px, 100vw - 2rem);
518
+ }
519
+ .FormControl-select-wrap.FormControl-input-width--small {
520
+ max-width: min(256px, 100vw - 2rem);
521
+ }
522
+ .FormControl-select-wrap.FormControl-input-width--medium {
523
+ max-width: min(320px, 100vw - 2rem);
524
+ }
525
+ .FormControl-select-wrap.FormControl-input-width--large {
526
+ max-width: min(480px, 100vw - 2rem);
527
+ }
528
+ .FormControl-select-wrap.FormControl-input-width--xlarge {
529
+ max-width: min(680px, 100vw - 2rem);
530
+ }
531
+ .FormControl-select-wrap.FormControl-input-width--xxlarge {
532
+ max-width: min(960px, 100vw - 2rem);
533
+ }
534
+ /* mask allows for background-color to respect themes */
535
+ .FormControl-select-wrap::after {
536
+ width: var(--base-size-16);
537
+ height: var(--base-size-16);
538
+ padding-right: var(--base-size-4);
539
+ pointer-events: none;
540
+ content: '';
541
+ background-color: var(--bgColor-neutral-emphasis);
542
+ mask: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0iIzU4NjA2OSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNC40MjcgOS40MjdsMy4zOTYgMy4zOTZhLjI1MS4yNTEgMCAwMC4zNTQgMGwzLjM5Ni0zLjM5NkEuMjUuMjUgMCAwMDExLjM5NiA5SDQuNjA0YS4yNS4yNSAwIDAwLS4xNzcuNDI3ek00LjQyMyA2LjQ3TDcuODIgMy4wNzJhLjI1LjI1IDAgMDEuMzU0IDBMMTEuNTcgNi40N2EuMjUuMjUgMCAwMS0uMTc3LjQyN0g0LjZhLjI1LjI1IDAgMDEtLjE3Ny0uNDI3eiIgLz48L3N2Zz4=');
543
+ mask-size: contain;
544
+ mask-repeat: no-repeat;
545
+ grid-column: 2;
546
+ grid-row: 1;
547
+ place-self: center end;
548
+ }
549
+ /* spans entire grid below mask */
550
+ .FormControl-select-wrap .FormControl-select {
551
+ grid-column: 1/-1;
552
+ grid-row: 1;
553
+ appearance: none;
554
+ padding-right: var(--base-size-20);
555
+ }
556
+ .FormControl-select-wrap[data-multiple]::after {
557
+ content: none;
558
+ }
559
+ .FormControl-select-wrap[data-multiple] .FormControl-select {
560
+ padding-right: var(--base-size-8);
561
+ }
562
+ /* checkbox + radio specific styles */
563
+ /* // Checkbox + Radio structure
564
+ ** ===================
565
+ **
566
+ ** .FormControl-radio-wrap
567
+ ** ├─ .FormControl-radio
568
+ ** ├─ .FormControl-radio-labelWrap
569
+ ** │ ├─ .FormControl-label
570
+ ** │ ├─ .FormControl-caption */
571
+ .FormControl-checkbox-wrap,
572
+ .FormControl-radio-wrap {
573
+ display: inline-grid;
574
+ grid-template-columns: min-content auto;
575
+ gap: var(--base-size-8);
576
+ }
577
+ :is(.FormControl-checkbox-wrap,.FormControl-radio-wrap) .FormControl-checkbox-labelWrap,:is(.FormControl-checkbox-wrap,.FormControl-radio-wrap) .FormControl-radio-labelWrap {
578
+ display: flex;
579
+ flex-direction: column;
580
+ gap: var(--base-size-4);
581
+ }
582
+ :is(.FormControl-checkbox-wrap,.FormControl-radio-wrap) .FormControl-label {
583
+ cursor: pointer;
584
+ }
585
+ .FormControl-radio-group-wrap fieldset {
586
+ padding: 0;
587
+ margin: 0;
588
+ border: 0;
589
+ }
590
+ .FormControl-check-group-wrap fieldset {
591
+ padding: 0;
592
+ margin: 0;
593
+ border: 0;
594
+ }
595
+ /* these selectors are temporary to override base.scss
596
+ ** once Field styles are widely adopted, we can adjust this and the global base styles */
597
+ .FormControl-checkbox {
598
+ color: var(--fgColor-default);
599
+ background-color: var(--bgColor-default);
600
+ border: var(--borderWidth-thin) solid var(--control-borderColor-rest, var(--color-border-default));
601
+ box-shadow: var(--shadow-inset);
602
+ }
603
+ .FormControl-checkbox[disabled] {
604
+ color: var(--control-fgColor-disabled);
605
+ cursor: not-allowed;
606
+ background-color: var(--control-bgColor-disabled);
607
+ border-color: var(--control-borderColor-disabled);
608
+ box-shadow: none;
609
+ opacity: 1;
610
+ -webkit-text-fill-color: var(--control-fgColor-disabled);
611
+ }
612
+ .FormControl-checkbox[invalid='true']:not(:focus) {
613
+ border-color: var(--control-borderColor-danger);
614
+ }
615
+ .FormControl-checkbox[invalid='false']:not(:focus) {
616
+ border-color: var(--control-borderColor-success);
617
+ }
618
+ .FormControl-checkbox:not([type='checkbox'],[type='radio']):focus {
619
+ border-color: var(--focus-outlineColor);
620
+ outline: none;
621
+ box-shadow: inset 0 0 0 1px var(--focus-outlineColor);
622
+
623
+ /* remove fallback :focus if :focus-visible is supported */
624
+ }
625
+ .FormControl-checkbox:not([type='checkbox'],[type='radio']):focus:not(:focus-visible) {
626
+ border-color: transparent;
627
+
628
+ border-color: var(--focus-outlineColor);
629
+
630
+ outline: none;
631
+
632
+ box-shadow: inset 0 0 0 1px transparent var(--focus-outlineColor);
633
+ }
634
+ /* default focus state */
635
+ .FormControl-checkbox:not([type='checkbox'],[type='radio']):focus-visible {
636
+ border-color: var(--focus-outlineColor);
637
+ outline: none;
638
+ box-shadow: inset 0 0 0 1px var(--focus-outlineColor);
639
+ }
640
+ .FormControl-checkbox {
641
+
642
+ position: relative;
643
+ display: grid;
644
+ width: var(--base-size-16);
645
+ height: var(--base-size-16);
646
+ margin: 0;
647
+ margin-top: var(--base-size-2); /* 2px to center align with label (20px line-height) */
648
+ cursor: pointer;
649
+ border-color: var(--control-borderColor-emphasis);
650
+ border-radius: var(--borderRadius-small);
651
+ transition: background-color, border-color 80ms cubic-bezier(0.33, 1, 0.68, 1); /* checked -> unchecked - add 120ms delay to fully see animation-out */
652
+ appearance: none;
653
+ place-content: center;
654
+ }
655
+ .FormControl-checkbox::before {
656
+ width: var(--base-size-16);
657
+ height: var(--base-size-16);
658
+ visibility: hidden;
659
+ content: '';
660
+ /* stylelint-disable-next-line primer/colors */
661
+ background-color: var(--control-checked-fgColor-rest);
662
+ transition: visibility 0s linear 230ms;
663
+ clip-path: inset(var(--base-size-16) 0 0 0);
664
+
665
+ /* octicon checkmark image */
666
+ mask-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEyIDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTEuNzgwMyAwLjIxOTYyNUMxMS45MjEgMC4zNjA0MjcgMTIgMC41NTEzMDUgMTIgMC43NTAzMTNDMTIgMC45NDkzMjEgMTEuOTIxIDEuMTQwMTkgMTEuNzgwMyAxLjI4MUw0LjUxODYgOC41NDA0MkM0LjM3Nzc1IDguNjgxIDQuMTg2ODIgOC43NiAzLjk4Nzc0IDguNzZDMy43ODg2NyA4Ljc2IDMuNTk3NzMgOC42ODEgMy40NTY4OSA4LjU0MDQyTDAuMjAxNjIyIDUuMjg2MkMwLjA2ODkyNzcgNS4xNDM4MyAtMC4wMDMzMDkwNSA0Ljk1NTU1IDAuMDAwMTE2NDkzIDQuNzYwOThDMC4wMDM1NTIwNSA0LjU2NjQzIDAuMDgyMzg5NCA0LjM4MDgxIDAuMjIwMDMyIDQuMjQzMjFDMC4zNTc2NjUgNC4xMDU2MiAwLjU0MzM1NSA0LjAyNjgxIDAuNzM3OTcgNC4wMjMzOEMwLjkzMjU4NCA0LjAxOTk0IDEuMTIwOTMgNC4wOTIxNyAxLjI2MzM0IDQuMjI0ODJMMy45ODc3NCA2Ljk0ODM1TDEwLjcxODYgMC4yMTk2MjVDMTAuODU5NSAwLjA3ODk5MjMgMTEuMDUwNCAwIDExLjI0OTUgMEMxMS40NDg1IDAgMTEuNjM5NSAwLjA3ODk5MjMgMTEuNzgwMyAwLjIxOTYyNVoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=');
667
+ mask-size: 75%;
668
+ mask-repeat: no-repeat;
669
+ mask-position: center;
670
+ animation: checkmarkOut 80ms cubic-bezier(0.65, 0, 0.35, 1) forwards; /* slightly snappier animation out */
671
+ }
672
+ /* extend touch target */
673
+ :is(.FormControl-checkbox::after) {
674
+ position: absolute;
675
+ top: 50%;
676
+ left: 50%;
677
+ width: 100%;
678
+ height: 100%;
679
+ min-height: var(--control-medium-size) var(--control-medium-size);
680
+ content: "";
681
+ transform: translateX(-50%) translateY(-50%);
682
+ }
683
+ :is(.FormControl-checkbox[disabled] ~ .FormControl-checkbox-labelWrap) .FormControl-label {
684
+ color: var(--control-fgColor-disabled);
685
+ cursor: not-allowed;
686
+ }
687
+ .FormControl-checkbox:checked {
688
+ background: var(--control-checked-bgColor-rest, var(--color-accent-fg));
689
+ border-color: var(--control-checked-borderColor-rest, var(--color-accent-fg));
690
+ transition: background-color, border-color 80ms cubic-bezier(0.32, 0, 0.67, 0) 0ms; /* unchecked -> checked */
691
+ }
692
+ .FormControl-checkbox:checked::before {
693
+ visibility: visible;
694
+ transition: visibility 0s linear 0s;
695
+ animation: checkmarkIn 80ms cubic-bezier(0.65, 0, 0.35, 1) forwards 80ms;
696
+ }
697
+ .FormControl-checkbox:checked:disabled {
698
+ cursor: not-allowed;
699
+ /* stylelint-disable-next-line primer/colors */
700
+ background-color: var(--control-fgColor-disabled);
701
+ /* stylelint-disable-next-line primer/colors */
702
+ border-color: var(--control-fgColor-disabled);
703
+ opacity: 1;
704
+ }
705
+ .FormControl-checkbox:checked:disabled::before {
706
+ /* stylelint-disable-next-line primer/colors */
707
+ background-color: var(--control-checked-fgColor-rest);
708
+ }
709
+ /* Windows High Contrast mode */
710
+ @media (forced-colors: active) {
711
+ .FormControl-checkbox:checked {
712
+ background-color: canvastext;
713
+ border-color: canvastext;
714
+ }
715
+ }
716
+ .FormControl-checkbox:focus-visible {
717
+ outline: 2px solid var(--focus-outlineColor);
718
+ outline-offset: 2px;
719
+ box-shadow: none;
720
+ }
721
+ .FormControl-checkbox:indeterminate::before {
722
+ mask-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMiIgdmlld0JveD0iMCAwIDEwIDIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMCAxQzAgMC40NDc3MTUgMC40NDc3MTUgMCAxIDBIOUM5LjU1MjI5IDAgMTAgMC40NDc3MTUgMTAgMUMxMCAxLjU1MjI4IDkuNTUyMjkgMiA5IDJIMUMwLjQ0NzcxNSAyIDAgMS41NTIyOCAwIDFaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K');
723
+ visibility: visible;
724
+ }
725
+ .FormControl-radio {
726
+ color: var(--fgColor-default);
727
+ background-color: var(--bgColor-default);
728
+ border: var(--borderWidth-thin) solid var(--control-borderColor-rest, var(--color-border-default));
729
+ box-shadow: var(--shadow-inset);
730
+ }
731
+ .FormControl-radio[disabled] {
732
+ color: var(--control-fgColor-disabled);
733
+ cursor: not-allowed;
734
+ background-color: var(--control-bgColor-disabled);
735
+ border-color: var(--control-borderColor-disabled);
736
+ box-shadow: none;
737
+ opacity: 1;
738
+ -webkit-text-fill-color: var(--control-fgColor-disabled);
739
+ }
740
+ .FormControl-radio[invalid='true']:not(:focus) {
741
+ border-color: var(--control-borderColor-danger);
742
+ }
743
+ .FormControl-radio[invalid='false']:not(:focus) {
744
+ border-color: var(--control-borderColor-success);
745
+ }
746
+ .FormControl-radio:not([type='checkbox'],[type='radio']):focus {
747
+ border-color: var(--focus-outlineColor);
748
+ outline: none;
749
+ box-shadow: inset 0 0 0 1px var(--focus-outlineColor);
750
+
751
+ /* remove fallback :focus if :focus-visible is supported */
752
+ }
753
+ .FormControl-radio:not([type='checkbox'],[type='radio']):focus:not(:focus-visible) {
754
+ border-color: transparent;
755
+
756
+ border-color: var(--focus-outlineColor);
757
+
758
+ outline: none;
759
+
760
+ box-shadow: inset 0 0 0 1px transparent var(--focus-outlineColor);
761
+ }
762
+ /* default focus state */
763
+ .FormControl-radio:not([type='checkbox'],[type='radio']):focus-visible {
764
+ border-color: var(--focus-outlineColor);
765
+ outline: none;
766
+ box-shadow: inset 0 0 0 1px var(--focus-outlineColor);
767
+ }
768
+ .FormControl-radio {
769
+
770
+ position: relative;
771
+ width: var(--base-size-16);
772
+ height: var(--base-size-16);
773
+ margin: 0;
774
+ margin-top: var(--base-size-2); /* 2px to center align with label (20px line-height) */
775
+ cursor: pointer;
776
+ border-color: var(--control-borderColor-emphasis);
777
+ border-radius: var(--borderRadius-full);
778
+ transition: background-color, border-color 80ms cubic-bezier(0.33, 1, 0.68, 1); /* checked -> unchecked - add 120ms delay to fully see animation-out */
779
+ appearance: none;
780
+ }
781
+ :is(.FormControl-radio::after) {
782
+ position: absolute;
783
+ top: 50%;
784
+ left: 50%;
785
+ width: 100%;
786
+ height: 100%;
787
+ min-height: var(--control-medium-size) var(--control-medium-size);
788
+ content: "";
789
+ transform: translateX(-50%) translateY(-50%);
790
+ }
791
+ :is(.FormControl-radio[disabled] ~ .FormControl-radio-labelWrap) .FormControl-label {
792
+ color: var(--control-fgColor-disabled);
793
+ cursor: not-allowed;
794
+ }
795
+ .FormControl-radio:checked {
796
+ border-color: var(--control-checked-borderColor-rest, var(--color-accent-fg));
797
+ /* stylelint-disable-next-line primer/borders */
798
+ border-width: var(--base-size-4);
799
+ }
800
+ .FormControl-radio[disabled]:checked,.FormControl-radio:checked:disabled {
801
+ cursor: not-allowed;
802
+ /* stylelint-disable-next-line primer/colors */
803
+ border-color: var(--control-fgColor-disabled);
804
+ }
805
+ :is(:is(.FormControl-radio[disabled]:checked,.FormControl-radio:checked:disabled) ~ .FormControl-radio-labelWrap) .FormControl-label {
806
+ color: var(--control-fgColor-disabled);
807
+ cursor: not-allowed;
808
+ }
809
+ .FormControl-radio:focus-visible {
810
+ outline: 2px solid var(--focus-outlineColor);
811
+ outline-offset: 2px;
812
+ box-shadow: none;
813
+ }
814
+ /* Windows High Contrast mode */
815
+ @media (forced-colors: active) {
816
+ .FormControl-radio {
817
+ background-color: canvastext;
818
+ border-color: canvastext;
819
+ }
820
+ }
821
+ @keyframes checkmarkIn {
822
+ from {
823
+ clip-path: inset(var(--base-size-16) 0 0 0);
824
+ }
825
+
826
+ to {
827
+ clip-path: inset(0 0 0 0);
828
+ }
829
+ }
830
+ @keyframes checkmarkOut {
831
+ from {
832
+ clip-path: inset(0 0 0 0);
833
+ }
834
+
835
+ to {
836
+ clip-path: inset(var(--base-size-16) 0 0 0);
837
+ }
838
+ }