primer_view_components 0.0.111 → 0.0.113

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 (175) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +68 -0
  3. data/app/assets/javascripts/primer_view_components.js +1 -1
  4. data/app/assets/javascripts/primer_view_components.js.map +1 -1
  5. data/app/assets/styles/primer_view_components.css +3 -1
  6. data/app/assets/styles/primer_view_components.css.map +1 -1
  7. data/app/components/primer/alpha/action_list.css +1 -1
  8. data/app/components/primer/alpha/action_list.css.json +1 -1
  9. data/app/components/primer/alpha/action_list.css.map +1 -1
  10. data/app/components/primer/alpha/action_list.pcss +0 -15
  11. data/app/components/primer/alpha/auto_complete.css +1 -0
  12. data/app/components/primer/alpha/auto_complete.css.json +1 -0
  13. data/app/components/primer/alpha/auto_complete.css.map +1 -0
  14. data/app/components/primer/alpha/auto_complete.pcss +118 -0
  15. data/app/components/primer/alpha/banner.css +1 -1
  16. data/app/components/primer/alpha/banner.css.map +1 -1
  17. data/app/components/primer/alpha/banner.pcss +0 -1
  18. data/app/components/primer/alpha/button_marketing.css +1 -0
  19. data/app/components/primer/alpha/button_marketing.css.json +1 -0
  20. data/app/components/primer/alpha/button_marketing.css.map +1 -0
  21. data/app/components/primer/alpha/button_marketing.pcss +175 -0
  22. data/app/components/primer/alpha/dialog/body.rb +3 -0
  23. data/app/components/primer/alpha/dialog/footer.rb +3 -0
  24. data/app/components/primer/alpha/dialog/header.rb +3 -0
  25. data/app/components/primer/alpha/dialog.css +1 -0
  26. data/app/components/primer/alpha/dialog.css.json +1 -0
  27. data/app/components/primer/alpha/dialog.css.map +1 -0
  28. data/app/components/primer/alpha/dialog.pcss +484 -0
  29. data/app/components/primer/alpha/dialog.rb +3 -0
  30. data/app/components/primer/{dropdown → alpha/dropdown}/menu.d.ts +0 -0
  31. data/app/components/primer/{dropdown → alpha/dropdown}/menu.html.erb +0 -0
  32. data/app/components/primer/{dropdown → alpha/dropdown}/menu.js +0 -0
  33. data/app/components/primer/alpha/dropdown/menu.rb +105 -0
  34. data/app/components/primer/{dropdown → alpha/dropdown}/menu.ts +0 -0
  35. data/app/components/primer/alpha/dropdown.css +1 -0
  36. data/app/components/primer/alpha/dropdown.css.json +1 -0
  37. data/app/components/primer/{dropdown.css.map → alpha/dropdown.css.map} +1 -1
  38. data/app/components/primer/{dropdown.d.ts → alpha/dropdown.d.ts} +0 -0
  39. data/app/components/primer/{dropdown.html.erb → alpha/dropdown.html.erb} +0 -0
  40. data/app/components/primer/{dropdown.js → alpha/dropdown.js} +0 -0
  41. data/app/components/primer/{dropdown.pcss → alpha/dropdown.pcss} +1 -1
  42. data/app/components/primer/alpha/dropdown.rb +154 -0
  43. data/app/components/primer/{dropdown.ts → alpha/dropdown.ts} +0 -0
  44. data/app/components/primer/alpha/segmented_control.css +1 -1
  45. data/app/components/primer/alpha/segmented_control.css.map +1 -1
  46. data/app/components/primer/alpha/tab_nav.css +1 -0
  47. data/app/components/primer/alpha/tab_nav.css.json +1 -0
  48. data/app/components/primer/alpha/tab_nav.css.map +1 -0
  49. data/app/components/primer/alpha/tab_nav.pcss +100 -0
  50. data/app/components/primer/alpha/text_field.css +3 -0
  51. data/app/components/primer/alpha/text_field.css.json +1 -0
  52. data/app/components/primer/alpha/text_field.css.map +1 -0
  53. data/app/components/primer/alpha/text_field.pcss +683 -0
  54. data/app/components/primer/alpha/toggle_switch.d.ts +1 -1
  55. data/app/components/primer/alpha/toggle_switch.js +7 -4
  56. data/app/components/primer/alpha/toggle_switch.ts +7 -3
  57. data/app/components/primer/alpha/underline_nav.css +1 -0
  58. data/app/components/primer/alpha/underline_nav.css.json +1 -0
  59. data/app/components/primer/alpha/underline_nav.css.map +1 -0
  60. data/app/components/primer/alpha/underline_nav.pcss +133 -0
  61. data/app/components/primer/beta/border_box.css +1 -0
  62. data/app/components/primer/beta/border_box.css.json +1 -0
  63. data/app/components/primer/beta/border_box.css.map +1 -0
  64. data/app/components/primer/beta/border_box.pcss +284 -0
  65. data/app/components/primer/beta/button_group.css +1 -0
  66. data/app/components/primer/beta/button_group.css.json +1 -0
  67. data/app/components/primer/beta/button_group.css.map +1 -0
  68. data/app/components/primer/beta/button_group.pcss +92 -0
  69. data/app/components/primer/{clipboard_copy.d.ts → beta/clipboard_copy.d.ts} +0 -0
  70. data/app/components/primer/{clipboard_copy.html.erb → beta/clipboard_copy.html.erb} +0 -0
  71. data/app/components/primer/{clipboard_copy.js → beta/clipboard_copy.js} +0 -0
  72. data/app/components/primer/beta/clipboard_copy.rb +50 -0
  73. data/app/components/primer/{clipboard_copy.ts → beta/clipboard_copy.ts} +0 -0
  74. data/app/components/primer/beta/link.css +1 -0
  75. data/app/components/primer/beta/link.css.json +1 -0
  76. data/app/components/primer/beta/link.css.map +1 -0
  77. data/app/components/primer/beta/link.pcss +60 -0
  78. data/app/components/primer/{popover_component.css → beta/popover.css} +0 -0
  79. data/app/components/primer/beta/popover.css.json +1 -0
  80. data/app/components/primer/beta/popover.css.map +1 -0
  81. data/app/components/primer/{popover_component.html.erb → beta/popover.html.erb} +0 -0
  82. data/app/components/primer/{popover_component.pcss → beta/popover.pcss} +5 -5
  83. data/app/components/primer/beta/popover.rb +127 -0
  84. data/app/components/primer/beta/relative_time.rb +160 -0
  85. data/app/components/primer/button_component.css +1 -0
  86. data/app/components/primer/button_component.css.json +1 -0
  87. data/app/components/primer/button_component.css.map +1 -0
  88. data/app/components/primer/button_component.pcss +557 -0
  89. data/app/components/primer/button_component.rb +1 -1
  90. data/app/components/primer/clipboard_copy.rb +2 -43
  91. data/app/components/primer/component.rb +6 -2
  92. data/app/components/primer/dropdown/menu.rb +5 -90
  93. data/app/components/primer/dropdown.rb +2 -145
  94. data/app/components/primer/local_time.d.ts +1 -1
  95. data/app/components/primer/local_time.js +1 -1
  96. data/app/components/primer/local_time.rb +3 -1
  97. data/app/components/primer/local_time.ts +1 -1
  98. data/app/components/primer/menu_component.css +1 -0
  99. data/app/components/primer/menu_component.css.json +1 -0
  100. data/app/components/primer/menu_component.css.map +1 -0
  101. data/app/components/primer/menu_component.pcss +119 -0
  102. data/app/components/primer/popover_component.rb +3 -120
  103. data/app/components/primer/primer.d.ts +2 -2
  104. data/app/components/primer/primer.js +2 -2
  105. data/app/components/primer/primer.pcss +20 -3
  106. data/app/components/primer/primer.ts +2 -2
  107. data/app/components/primer/time_ago_component.d.ts +1 -1
  108. data/app/components/primer/time_ago_component.js +1 -1
  109. data/app/components/primer/time_ago_component.rb +2 -1
  110. data/app/components/primer/time_ago_component.ts +1 -1
  111. data/app/forms/submit_button_form.rb +8 -2
  112. data/app/helpers/primer/form_helper.rb +12 -0
  113. data/lib/postcss_mixins/clearfix.pcss +12 -0
  114. data/lib/primer/deprecations.rb +96 -24
  115. data/lib/primer/deprecations.yml +68 -0
  116. data/lib/primer/forms/base.rb +7 -20
  117. data/lib/primer/forms/base_component.rb +15 -1
  118. data/lib/primer/forms/button.html.erb +4 -0
  119. data/lib/primer/forms/button.rb +68 -0
  120. data/lib/primer/forms/check_box.html.erb +2 -2
  121. data/lib/primer/forms/check_box.rb +1 -1
  122. data/lib/primer/forms/check_box_group.html.erb +2 -2
  123. data/lib/primer/forms/dsl/button_input.rb +29 -0
  124. data/lib/primer/forms/dsl/input_methods.rb +7 -2
  125. data/lib/primer/forms/dsl/submit_button_input.rb +1 -0
  126. data/lib/primer/forms/dsl/text_field_input.rb +0 -7
  127. data/lib/primer/forms/radio_button.html.erb +2 -2
  128. data/lib/primer/forms/radio_button.rb +1 -1
  129. data/lib/primer/forms/radio_button_group.html.erb +2 -2
  130. data/lib/primer/forms/select_list.html.erb +1 -1
  131. data/lib/primer/forms/select_list.rb +4 -1
  132. data/lib/primer/forms/submit_button.html.erb +1 -4
  133. data/lib/primer/forms/submit_button.rb +1 -37
  134. data/lib/primer/forms/text_area.html.erb +1 -1
  135. data/lib/primer/forms/text_area.rb +5 -1
  136. data/lib/primer/forms/text_field.html.erb +1 -1
  137. data/lib/primer/forms/text_field.rb +11 -0
  138. data/lib/primer/forms/utils.rb +28 -0
  139. data/lib/primer/view_components/audited.rb +14 -0
  140. data/lib/primer/view_components/engine.rb +1 -0
  141. data/lib/primer/view_components/linters/clipboard_copy_component_migration_counter.rb +2 -2
  142. data/lib/primer/view_components/linters/deprecated_components_counter.rb +15 -4
  143. data/lib/primer/view_components/linters/helpers/deprecated_components_helpers.rb +3 -18
  144. data/lib/primer/view_components/linters/severity_schema.rb +14 -0
  145. data/lib/primer/view_components/version.rb +1 -1
  146. data/lib/rubocop/cop/primer/component_name_migration.rb +2 -2
  147. data/lib/tasks/docs.rake +6 -5
  148. data/previews/primer/alpha/auto_complete_preview.rb +12 -0
  149. data/previews/primer/alpha/button_marketing_preview.rb +36 -0
  150. data/previews/primer/alpha/dropdown_preview.rb +210 -0
  151. data/previews/primer/alpha/segmented_control_preview.rb +9 -6
  152. data/previews/primer/alpha/tab_nav_preview.rb +55 -0
  153. data/previews/primer/alpha/text_field_preview.rb +77 -52
  154. data/previews/primer/beta/border_box_preview.rb +65 -13
  155. data/previews/primer/beta/clipboard_copy_preview/element.html.erb +2 -0
  156. data/previews/primer/beta/clipboard_copy_preview.rb +39 -0
  157. data/previews/primer/beta/link_preview.rb +28 -0
  158. data/previews/primer/beta/popover_preview.rb +79 -0
  159. data/previews/primer/beta/relative_time_preview.rb +271 -0
  160. data/previews/primer/forms/forms_preview.rb +1 -0
  161. data/static/arguments.json +183 -73
  162. data/static/audited_at.json +10 -6
  163. data/static/constants.json +180 -50
  164. data/static/statuses.json +12 -8
  165. metadata +86 -29
  166. data/app/components/primer/dropdown.css +0 -1
  167. data/app/components/primer/dropdown.css.json +0 -1
  168. data/app/components/primer/image.rb +0 -7
  169. data/app/components/primer/popover_component.css.json +0 -1
  170. data/app/components/primer/popover_component.css.map +0 -1
  171. data/app/components/primer/progress_bar_component.rb +0 -7
  172. data/previews/primer/clipboard_copy_preview/element.html.erb +0 -2
  173. data/previews/primer/clipboard_copy_preview.rb +0 -37
  174. data/previews/primer/dropdown_preview.rb +0 -208
  175. data/previews/primer/popover_component_preview.rb +0 -34
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Beta
5
+ # Use `ClipboardCopy` to copy element text content or input values to the clipboard.
6
+ #
7
+ # @accessibility
8
+ # Always set an accessible label to help the user interact with the component.
9
+ class ClipboardCopy < Primer::Component
10
+ status :beta
11
+
12
+ # @example Default
13
+ # <%= render(Primer::Beta::ClipboardCopy.new(value: "Text to copy", "aria-label": "Copy text to the system clipboard")) %>
14
+ #
15
+ # @example With text instead of icons
16
+ # <%= render(Primer::Beta::ClipboardCopy.new(value: "Text to copy")) do %>
17
+ # Click to copy!
18
+ # <% end %>
19
+ #
20
+ # @example Copying from an element
21
+ # <%= render(Primer::Beta::ClipboardCopy.new(for: "blob-path", "aria-label": "Copy text to the system clipboard")) %>
22
+ # <div id="blob-path">src/index.js</div>
23
+ #
24
+ # @param aria-label [String] String that will be read to screenreaders when the component is focused
25
+ # @param value [String] Text to copy into the users clipboard when they click the component.
26
+ # @param for [String] Element id from where to get the copied value.
27
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
28
+ def initialize(value: nil, **system_arguments)
29
+ @system_arguments = deny_tag_argument(**system_arguments)
30
+ @value = value
31
+
32
+ validate!
33
+
34
+ @system_arguments[:tag] = "clipboard-copy"
35
+ @system_arguments[:value] = value if value.present?
36
+ end
37
+
38
+ # :nodoc:
39
+ def before_render
40
+ validate_aria_label if content.blank?
41
+ end
42
+
43
+ private
44
+
45
+ def validate!
46
+ raise ArgumentError, "Must provide either `value` or `for`" if @value.nil? && @system_arguments[:for].nil?
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1 @@
1
+ .Link{color:var(--color-accent-fg)}.Link:hover{cursor:pointer;text-decoration:underline}.Link:focus,.Link:focus-visible{outline-offset:0}.Link--primary{color:var(--color-fg-default)!important}.Link--primary:hover{color:var(--color-accent-fg)!important}.Link--secondary{color:var(--color-fg-muted)!important}.Link--secondary:hover{color:var(--color-accent-fg)!important}.Link--muted{color:var(--color-fg-muted)!important}.Link--muted:hover{text-decoration:none}.Link--muted:hover,.Link--onHover:hover{color:var(--color-accent-fg)!important}.Link--onHover:hover{cursor:pointer;text-decoration:underline}.Link--muted:hover [class*=color-fg],.Link--primary:hover [class*=color-fg],.Link--secondary:hover [class*=color-fg]{color:inherit!important}
@@ -0,0 +1 @@
1
+ {"name":"beta/link","selectors":[".Link",".Link:hover",".Link:focus",".Link:focus-visible",".Link--primary",".Link--primary:hover",".Link--secondary",".Link--secondary:hover",".Link--muted",".Link--muted:hover",".Link--onHover:hover",".Link--muted:hover [class*=color-fg]",".Link--primary:hover [class*=color-fg]",".Link--secondary:hover [class*=color-fg]"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["link.pcss"],"names":[],"mappings":"AAEA,MACE,4BAWF,CATE,YAEE,cAAe,CADf,yBAEF,CAEA,gCAEE,gBACF,CAGF,eACE,uCAKF,CAHE,qBACE,sCACF,CAGF,iBACE,qCAKF,CAHE,uBACE,sCACF,CAGF,aACE,qCAMF,CAJE,mBAEE,oBACF,CAMA,wCARE,sCAYF,CAJA,qBAGE,cAAe,CADf,yBAEF,CAQA,qHACE,uBACF","file":"link.css","sourcesContent":["/* Links */\n\n.Link {\n color: var(--color-accent-fg);\n\n &:hover {\n text-decoration: underline;\n cursor: pointer;\n }\n\n &:focus,\n &:focus-visible {\n outline-offset: 0;\n }\n}\n\n.Link--primary {\n color: var(--color-fg-default) !important;\n\n &:hover {\n color: var(--color-accent-fg) !important;\n }\n}\n\n.Link--secondary {\n color: var(--color-fg-muted) !important;\n\n &:hover {\n color: var(--color-accent-fg) !important;\n }\n}\n\n.Link--muted {\n color: var(--color-fg-muted) !important;\n\n &:hover {\n color: var(--color-accent-fg) !important;\n text-decoration: none;\n }\n}\n\n/* Set the link color only on hover\n Useful when you want only part of a link to turn blue on hover */\n.Link--onHover {\n &:hover {\n color: var(--color-accent-fg) !important;\n text-decoration: underline;\n cursor: pointer;\n }\n}\n\n/* When using a color utility class inside of a link class\n color should change with link on hover. */\n.Link--secondary,\n.Link--primary,\n.Link--muted {\n &:hover [class*='color-fg'] {\n color: inherit !important;\n }\n}\n"]}
@@ -0,0 +1,60 @@
1
+ /* Links */
2
+
3
+ .Link {
4
+ color: var(--color-accent-fg);
5
+
6
+ &:hover {
7
+ text-decoration: underline;
8
+ cursor: pointer;
9
+ }
10
+
11
+ &:focus,
12
+ &:focus-visible {
13
+ outline-offset: 0;
14
+ }
15
+ }
16
+
17
+ .Link--primary {
18
+ color: var(--color-fg-default) !important;
19
+
20
+ &:hover {
21
+ color: var(--color-accent-fg) !important;
22
+ }
23
+ }
24
+
25
+ .Link--secondary {
26
+ color: var(--color-fg-muted) !important;
27
+
28
+ &:hover {
29
+ color: var(--color-accent-fg) !important;
30
+ }
31
+ }
32
+
33
+ .Link--muted {
34
+ color: var(--color-fg-muted) !important;
35
+
36
+ &:hover {
37
+ color: var(--color-accent-fg) !important;
38
+ text-decoration: none;
39
+ }
40
+ }
41
+
42
+ /* Set the link color only on hover
43
+ Useful when you want only part of a link to turn blue on hover */
44
+ .Link--onHover {
45
+ &:hover {
46
+ color: var(--color-accent-fg) !important;
47
+ text-decoration: underline;
48
+ cursor: pointer;
49
+ }
50
+ }
51
+
52
+ /* When using a color utility class inside of a link class
53
+ color should change with link on hover. */
54
+ .Link--secondary,
55
+ .Link--primary,
56
+ .Link--muted {
57
+ &:hover [class*='color-fg'] {
58
+ color: inherit !important;
59
+ }
60
+ }
@@ -0,0 +1 @@
1
+ {"name":"beta/popover","selectors":[".Popover",".Popover-message",".Popover-message:after",".Popover-message:before",".Popover-message--no-caret:after",".Popover-message--no-caret:before",".Popover-message--bottom-left:after",".Popover-message--bottom-left:before",".Popover-message--bottom-right:after",".Popover-message--bottom-right:before",".Popover-message--bottom:after",".Popover-message--bottom:before",".Popover-message--bottom-right",".Popover-message--top-right",".Popover-message--top-right:after",".Popover-message--top-right:before",".Popover-message--bottom-left",".Popover-message--top-left",".Popover-message--top-left:after",".Popover-message--top-left:before",".Popover-message--left-bottom:after",".Popover-message--left-bottom:before",".Popover-message--left-top:after",".Popover-message--left-top:before",".Popover-message--left:after",".Popover-message--left:before",".Popover-message--right-bottom:after",".Popover-message--right-bottom:before",".Popover-message--right-top:after",".Popover-message--right-top:before",".Popover-message--right:after",".Popover-message--right:before",".Popover-message--large",".Popover-message>.btn-octicon"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["popover.pcss"],"names":[],"mappings":"AAEA,SACE,iBAAkB,CAClB,WACF,CAEA,iBAKE,4CAA6C,CAC7C,2EAA6E,CAC7E,mDAAqD,CAHrD,gBAAiB,CADjB,iBAAkB,CAFlB,iBAAkB,CAClB,WA6BF,CArBE,+CAKE,UAAW,CADX,oBAAqB,CADrB,QAAS,CADT,iBAIF,CAEA,wBAIE,sBAAgD,CAAhD,mDAAgD,CAFhD,gBAAiB,CADjB,SAIF,CAEA,uBAIE,sBAAgD,CAAhD,mDAAgD,CAFhD,gBAAiB,CADjB,SAIF,CAKA,mEAEE,YACF,CAOA,mNAGE,yBAAgC,CADhC,QAEF,CAEA,2GAEE,4CAA6C,CAD7C,YAEF,CAEA,wGAEE,4CAA6C,CAD7C,YAEF,CAIF,2DAGE,cAAe,CADf,UAgBF,CAbE,gJAEE,SAAU,CACV,aACF,CAEA,yEACE,UACF,CAEA,uEACE,UACF,CAIF,yDAEE,SAAU,CACV,aAWF,CATE,4IAEE,SAAU,CACV,aACF,CAEA,qEACE,SACF,CAUA,oZAKE,yBAAgC,CAFhC,SAAU,CACV,aAAc,CAFd,OAIF,CAEA,6MACE,eACF,CAEA,uMACE,eACF,CAOA,wGAEE,6CAA8C,CAD9C,WAEF,CAEA,qGAEE,6CAA8C,CAD9C,WAEF,CAOA,qGAEE,8CAA+C,CAD/C,UAEF,CAEA,kGAEE,8CAA+C,CAD/C,UAEF,CAMA,wIAEE,QACF,CAMA,oJAEE,QACF,CAEA,2EACE,WACF,CAEA,yEACE,WACF,CAGF,yBACE,wBACE,eACF,CACF,CAKA,4BACE,SAIE,kBAAoB,CACpB,gBAAkB,CAJlB,cAAe,CAEf,iBAAmB,CADnB,kBAIF,CAEA,iBAGE,WAAY,CACZ,SAAU,CAEV,4CAA8C,CAJ9C,UAAW,CADX,QAAS,CAIT,oBAEF,CAGA,8BACE,wEACF,CAGA,+CAEE,YACF,CACF","file":"popover.css","sourcesContent":["/* Popover */\n\n.Popover {\n position: absolute;\n z-index: 100;\n}\n\n.Popover-message {\n position: relative;\n width: 232px;\n margin-right: auto;\n margin-left: auto;\n background-color: var(--color-canvas-overlay);\n border: var(--primer-borderWidth-thin, 1px) solid var(--color-border-default);\n border-radius: var(--primer-borderRadius-medium, 6px);\n\n /* Carets */\n &::before,\n &::after {\n position: absolute;\n left: 50%;\n display: inline-block;\n content: '';\n }\n\n &::before {\n top: -16px;\n margin-left: -9px;\n border: 8px solid transparent;\n border-bottom-color: var(--color-border-default);\n }\n\n &::after {\n top: -14px;\n margin-left: -8px;\n border: 7px solid transparent;\n border-bottom-color: var(--color-canvas-overlay);\n }\n}\n\n/* No caret */\n.Popover-message--no-caret {\n &::before,\n &::after {\n display: none;\n }\n}\n\n/* Bottom-oriented carets */\n.Popover-message--bottom,\n.Popover-message--bottom-right,\n.Popover-message--bottom-left {\n &::before,\n &::after {\n top: auto;\n border-bottom-color: transparent;\n }\n\n &::before {\n bottom: -16px;\n border-top-color: var(--color-border-default);\n }\n\n &::after {\n bottom: -14px;\n border-top-color: var(--color-canvas-overlay);\n }\n}\n\n/* Top and Bottom: Right-oriented carets */\n.Popover-message--top-right,\n.Popover-message--bottom-right {\n right: -9px;\n margin-right: 0;\n\n &::before,\n &::after {\n left: auto;\n margin-left: 0;\n }\n\n &::before {\n right: 20px;\n }\n\n &::after {\n right: 21px;\n }\n}\n\n/* Top and Bottom: Left-oriented carets */\n.Popover-message--top-left,\n.Popover-message--bottom-left {\n left: -9px;\n margin-left: 0;\n\n &::before,\n &::after {\n left: 24px;\n margin-left: 0;\n }\n\n &::after {\n left: 25px;\n }\n}\n\n/* Right- and Left-oriented carets */\n.Popover-message--right,\n.Popover-message--right-top,\n.Popover-message--right-bottom,\n.Popover-message--left,\n.Popover-message--left-top,\n.Popover-message--left-bottom {\n &::before,\n &::after {\n top: 50%;\n left: auto;\n margin-left: 0;\n border-bottom-color: transparent;\n }\n\n &::before {\n margin-top: -9px;\n }\n\n &::after {\n margin-top: -8px;\n }\n}\n\n/* Right-oriented carets */\n.Popover-message--right,\n.Popover-message--right-top,\n.Popover-message--right-bottom {\n &::before {\n right: -16px;\n border-left-color: var(--color-border-default);\n }\n\n &::after {\n right: -14px;\n border-left-color: var(--color-canvas-overlay);\n }\n}\n\n/* Left-oriented carets */\n.Popover-message--left,\n.Popover-message--left-top,\n.Popover-message--left-bottom {\n &::before {\n left: -16px;\n border-right-color: var(--color-border-default);\n }\n\n &::after {\n left: -14px;\n border-right-color: var(--color-canvas-overlay);\n }\n}\n\n/* Right and Left: Top-oriented carets */\n.Popover-message--right-top,\n.Popover-message--left-top {\n &::before,\n &::after {\n top: 24px;\n }\n}\n\n/* Right and Left: Bottom-oriented carets */\n.Popover-message--right-bottom,\n.Popover-message--left-bottom {\n &::before,\n &::after {\n top: auto;\n }\n\n &::before {\n bottom: 16px;\n }\n\n &::after {\n bottom: 17px;\n }\n}\n\n@media (min-width: 544px) {\n .Popover-message--large {\n min-width: 320px;\n }\n}\n\n/* Responsive Popover\n** For < md it will show full-width anchored to the bottom */\n\n@media (max-width: 767.98px) {\n .Popover {\n position: fixed;\n top: auto !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n }\n\n .Popover-message {\n top: auto;\n right: auto;\n bottom: auto;\n left: auto;\n width: auto !important;\n margin: var(--primer-stack-gap-condensed, 8px);\n }\n\n /* Increase tap area for touch input */\n .Popover-message > .btn-octicon {\n padding: var(--primer-control-medium-paddingInline-normal, 12px) !important;\n }\n\n /* Remove caret */\n .Popover-message::after,\n .Popover-message::before {\n display: none;\n }\n}\n"]}
@@ -67,7 +67,7 @@
67
67
  }
68
68
  }
69
69
 
70
- /* Top & Bottom: Right-oriented carets */
70
+ /* Top and Bottom: Right-oriented carets */
71
71
  .Popover-message--top-right,
72
72
  .Popover-message--bottom-right {
73
73
  right: -9px;
@@ -88,7 +88,7 @@
88
88
  }
89
89
  }
90
90
 
91
- /* Top & Bottom: Left-oriented carets */
91
+ /* Top and Bottom: Left-oriented carets */
92
92
  .Popover-message--top-left,
93
93
  .Popover-message--bottom-left {
94
94
  left: -9px;
@@ -105,7 +105,7 @@
105
105
  }
106
106
  }
107
107
 
108
- /* Right- & Left-oriented carets */
108
+ /* Right- and Left-oriented carets */
109
109
  .Popover-message--right,
110
110
  .Popover-message--right-top,
111
111
  .Popover-message--right-bottom,
@@ -159,7 +159,7 @@
159
159
  }
160
160
  }
161
161
 
162
- /* Right & Left: Top-oriented carets */
162
+ /* Right and Left: Top-oriented carets */
163
163
  .Popover-message--right-top,
164
164
  .Popover-message--left-top {
165
165
  &::before,
@@ -168,7 +168,7 @@
168
168
  }
169
169
  }
170
170
 
171
- /* Right & Left: Bottom-oriented carets */
171
+ /* Right and Left: Bottom-oriented carets */
172
172
  .Popover-message--right-bottom,
173
173
  .Popover-message--left-bottom {
174
174
  &::before,
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Beta
5
+ # Use `Popover` to bring attention to specific user interface elements, typically to suggest an action or to guide users through a new experience.
6
+ #
7
+ # By default, the popover renders with absolute positioning, meaning it should usually be wrapped in an element with a relative position in order to be positioned properly. To render the popover with relative positioning, use the relative property.
8
+ class Popover < Primer::Component
9
+ status :beta
10
+
11
+ CARET_DEFAULT = :top
12
+ CARET_MAPPINGS = {
13
+ CARET_DEFAULT => "",
14
+ :bottom => "Popover-message--bottom",
15
+ :bottom_right => "Popover-message--bottom-right",
16
+ :bottom_left => "Popover-message--bottom-left",
17
+ :left => "Popover-message--left",
18
+ :left_bottom => "Popover-message--left-bottom",
19
+ :left_top => "Popover-message--left-top",
20
+ :right => "Popover-message--right",
21
+ :right_bottom => "Popover-message--right-bottom",
22
+ :right_top => "Popover-message--right-top",
23
+ :top_left => "Popover-message--top-left",
24
+ :top_right => "Popover-message--top-right"
25
+ }.freeze
26
+
27
+ DEFAULT_HEADING_TAG = :h4
28
+
29
+ # The heading
30
+ #
31
+ # @param tag [Symbol] (Primer::Beta::Popover::DEFAULT_HEADING_TAG) <%= one_of(Primer::Beta::Heading::TAG_OPTIONS) %>
32
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
33
+ renders_one :heading, lambda { |tag: DEFAULT_HEADING_TAG, **system_arguments|
34
+ system_arguments[:tag] = tag
35
+ system_arguments[:mb] ||= 2
36
+
37
+ Primer::Beta::Heading.new(**system_arguments)
38
+ }
39
+
40
+ # The body
41
+ #
42
+ # @param caret [Symbol] <%= one_of(Primer::Beta::Popover::CARET_MAPPINGS.keys) %>
43
+ # @param large [Boolean] Whether to use the large version of the component.
44
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
45
+ renders_one :body, lambda { |caret: CARET_DEFAULT, large: false, **system_arguments|
46
+ @body_arguments = system_arguments
47
+ @body_arguments[:classes] = class_names(
48
+ @body_arguments[:classes],
49
+ "Popover-message Box",
50
+ CARET_MAPPINGS[fetch_or_fallback(CARET_MAPPINGS.keys, caret, CARET_DEFAULT)],
51
+ "Popover-message--large" => large
52
+ )
53
+ @body_arguments[:p] ||= 4
54
+ @body_arguments[:mt] ||= 2
55
+ @body_arguments[:mx] ||= :auto
56
+ @body_arguments[:text_align] ||= :left
57
+ @body_arguments[:box_shadow] ||= :large
58
+
59
+ Primer::Content.new
60
+ }
61
+
62
+ # @example Default
63
+ # <%= render Primer::Beta::Popover.new do |component| %>
64
+ # <% component.with_heading do %>
65
+ # Activity feed
66
+ # <% end %>
67
+ # <% component.with_body do %>
68
+ # This is the Popover body.
69
+ # <% end %>
70
+ # <% end %>
71
+ #
72
+ # @example Large
73
+ # <%= render Primer::Beta::Popover.new do |component| %>
74
+ # <% component.with_heading do %>
75
+ # Activity feed
76
+ # <% end %>
77
+ # <% component.with_body(large: true) do %>
78
+ # This is the large Popover body.
79
+ # <% end %>
80
+ # <% end %>
81
+ #
82
+ # @example Caret position
83
+ # <%= render Primer::Beta::Popover.new do |component| %>
84
+ # <% component.with_heading do %>
85
+ # Activity feed
86
+ # <% end %>
87
+ # <% component.with_body(caret: :left) do %>
88
+ # This is the Popover body.
89
+ # <% end %>
90
+ # <% end %>
91
+ #
92
+ # @example With multiple elements in the body
93
+ # <%= render Primer::Beta::Popover.new do |component| %>
94
+ # <% component.with_heading do %>
95
+ # Activity feed
96
+ # <% end %>
97
+ # <% component.with_body(caret: :left) do %>
98
+ # <p>This is the Popover body.</p>
99
+ # <%= render Primer::ButtonComponent.new(type: :submit) do %>
100
+ # Got it!
101
+ # <% end %>
102
+ # <% end %>
103
+ # <% end %>
104
+ #
105
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
106
+ def initialize(**system_arguments)
107
+ @system_arguments = deny_tag_argument(**system_arguments)
108
+ @system_arguments[:tag] = :div
109
+ @system_arguments[:classes] = class_names(
110
+ system_arguments[:classes],
111
+ "Popover"
112
+ )
113
+ @system_arguments[:position] ||= :relative
114
+ @system_arguments[:right] = false unless @system_arguments.delete(:right)
115
+ @system_arguments[:left] = false unless @system_arguments.delete(:left)
116
+ end
117
+
118
+ def render?
119
+ body.present?
120
+ end
121
+
122
+ def body_component
123
+ Primer::Box.new(**@body_arguments)
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Beta
5
+ # Formats a timestamp as a localized string or as relative text that auto-updates in the user's browser.
6
+ class RelativeTime < Primer::Component
7
+ status :beta
8
+
9
+ TENSE_DEFAULT = :auto
10
+ TENSE_OPTIONS = [TENSE_DEFAULT, :past, :future].freeze
11
+
12
+ FORMAT_DEFAULT = :auto
13
+ FORMAT_OPTIONS = [FORMAT_DEFAULT, :micro, :elapsed].freeze
14
+
15
+ SECOND_DEFAULT = nil
16
+ SECOND_MAPPINGS = {
17
+ SECOND_DEFAULT => nil,
18
+ :numeric => "numeric",
19
+ :two_digit => "2-digit"
20
+ }.freeze
21
+ SECOND_OPTIONS = SECOND_MAPPINGS.keys
22
+
23
+ MINUTE_DEFAULT = nil
24
+ MINUTE_MAPPINGS = {
25
+ MINUTE_DEFAULT => nil,
26
+ :numeric => "numeric",
27
+ :two_digit => "2-digit"
28
+ }.freeze
29
+ MINUTE_OPTIONS = MINUTE_MAPPINGS.keys
30
+
31
+ HOUR_DEFAULT = nil
32
+ HOUR_MAPPINGS = {
33
+ HOUR_DEFAULT => nil,
34
+ :numeric => "numeric",
35
+ :two_digit => "2-digit"
36
+ }.freeze
37
+ HOUR_OPTIONS = HOUR_MAPPINGS.keys
38
+
39
+ WEEKDAY_DEFAULT = nil
40
+ WEEKDAY_OPTIONS = [WEEKDAY_DEFAULT, :long, :short, :narrow].freeze
41
+
42
+ DAY_DEFAULT = nil
43
+ DAY_MAPPINGS = {
44
+ DAY_DEFAULT => nil,
45
+ :numeric => "numeric",
46
+ :two_digit => "2-digit"
47
+ }.freeze
48
+ DAY_OPTIONS = DAY_MAPPINGS.keys
49
+
50
+ MONTH_DEFAULT = nil
51
+ MONTH_MAPPINGS = {
52
+ DAY_DEFAULT => nil,
53
+ :numeric => "numeric",
54
+ :two_digit => "2-digit",
55
+ :short => "short",
56
+ :long => "long",
57
+ :narrow => "narrow"
58
+ }.freeze
59
+ MONTH_OPTIONS = MONTH_MAPPINGS.keys
60
+
61
+ YEAR_DEFAULT = nil
62
+ YEAR_MAPPINGS = {
63
+ DAY_DEFAULT => nil,
64
+ :numeric => "numeric",
65
+ :two_digit => "2-digit"
66
+ }.freeze
67
+ YEAR_OPTIONS = YEAR_MAPPINGS.keys
68
+
69
+ TIMEZONENAME_DEFAULT = nil
70
+ TIMEZONE_MAPPINGS = {
71
+ DAY_DEFAULT => nil,
72
+ :long => "long",
73
+ :short => "short",
74
+ :short_offset => "shortOffset",
75
+ :long_offset => "longOffset",
76
+ :short_generic => "shortGeneric",
77
+ :long_generic => "longGeneric"
78
+ }.freeze
79
+ TIMEZONENAME_OPTIONS = TIMEZONE_MAPPINGS.keys
80
+
81
+ PRECISION_DEFAULT = nil
82
+ PRECISION_OPTIONS = [PRECISION_DEFAULT, :second, :minute, :hour, :day, :month, :year].freeze
83
+
84
+ # @example Default
85
+ # <%= render(Primer::Beta::RelativeTime.new(datetime: Time.at(628232400))) %>
86
+ #
87
+ # @example Past Time
88
+ # <%= render(Primer::Beta::RelativeTime.new(datetime: Time.at(628232400), tense: :past)) %>
89
+ #
90
+ # @example Elapsed Time
91
+ # <%= render(Primer::Beta::RelativeTime.new(datetime: Time.at(628232400), format: :elapsed)) %>
92
+ #
93
+ # @param datetime [Time] The time to be formatted.
94
+ # @param tense [Symbol] Which tense to use. <%= one_of(Primer::Beta::RelativeTime::TENSE_OPTIONS) %>
95
+ # @param prefix [sring] What to prefix the relative ime display with.
96
+ # @param second [Symbol] What format seconds should take. <%= one_of(Primer::Beta::RelativeTime::SECOND_OPTIONS) %>
97
+ # @param minute [Symbol] What format minues should take. <%= one_of(Primer::Beta::RelativeTime::MINUTE_OPTIONS) %>
98
+ # @param hour [Symbol] What format hours should take. <%= one_of(Primer::Beta::RelativeTime::HOUR_OPTIONS) %>
99
+ # @param weekday [Symbol] What format weekdays should take. <%= one_of(Primer::Beta::RelativeTime::WEEKDAY_OPTIONS) %>
100
+ # @param day [Symbol] What format days should take. <%= one_of(Primer::Beta::RelativeTime::DAY_OPTIONS) %>
101
+ # @param month [Symbol] What format months should take. <%= one_of(Primer::Beta::RelativeTime::MONTH_OPTIONS) %>
102
+ # @param year [Symbol] What format years should take. <%= one_of(Primer::Beta::RelativeTime::YEAR_OPTIONS) %>
103
+ # @param time_zone_name [Symbol] What format the time zone should take. <%= one_of(Primer::Beta::RelativeTime::TIMEZONENAME_OPTIONS) %>
104
+ # @param threshold [string] The threshold at which relative time displays become absolute.
105
+ # @param precision [Symbol] The precision elapsed time should display. <%= one_of(Primer::Beta::RelativeTime::PRECISION_OPTIONS) %>
106
+ # @param format [Symbol] The format the display should take. <%= one_of(Primer::Beta::RelativeTime::FORMAT_OPTIONS) %>
107
+ # @param lang [string] The language to use.
108
+ # @param title [string] Provide a custom title to the element.
109
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
110
+ def initialize(
111
+ datetime:,
112
+ tense: TENSE_DEFAULT,
113
+ prefix: nil,
114
+ second: SECOND_DEFAULT,
115
+ minute: MINUTE_DEFAULT,
116
+ hour: HOUR_DEFAULT,
117
+ weekday: WEEKDAY_DEFAULT,
118
+ day: DAY_DEFAULT,
119
+ month: MONTH_DEFAULT,
120
+ year: YEAR_DEFAULT,
121
+ time_zone_name: TIMEZONENAME_DEFAULT,
122
+ threshold: nil,
123
+ precision: PRECISION_DEFAULT,
124
+ format: nil,
125
+ lang: nil,
126
+ title: nil,
127
+ **system_arguments
128
+ )
129
+ @system_arguments = deny_tag_argument(**system_arguments)
130
+ @system_arguments[:tag] = "relative-time"
131
+ @system_arguments[:tense] = tense if tense.present?
132
+ @system_arguments[:prefix] = prefix if prefix.present?
133
+ @system_arguments[:second] = fetch_or_fallback(SECOND_OPTIONS, second, SECOND_DEFAULT) if second.present?
134
+ @system_arguments[:minute] = fetch_or_fallback(MINUTE_OPTIONS, minute, MINUTE_DEFAULT) if minute.present?
135
+ @system_arguments[:hour] = fetch_or_fallback(HOUR_OPTIONS, hour, HOUR_DEFAULT) if hour.present?
136
+ @system_arguments[:weekday] = fetch_or_fallback(WEEKDAY_OPTIONS, weekday, WEEKDAY_DEFAULT) if weekday.present?
137
+ @system_arguments[:day] = fetch_or_fallback(DAY_OPTIONS, day, DAY_DEFAULT) if day.present?
138
+ @system_arguments[:month] = fetch_or_fallback(MONTH_DEFAULT, month, MONTH_DEFAULT) if month.present?
139
+ @system_arguments[:year] = fetch_or_fallback(YEAR_OPTIONS, year, YEAR_DEFAULT) if year.present?
140
+ @system_arguments[:"time-zone-name"] = fetch_or_fallback(TIMEZONENAME_OPTIONS, time_zone_name, TIMEZONENAME_DEFAULT) if time_zone_name.present?
141
+ @system_arguments[:threshold] = threshold if threshold.present?
142
+ @system_arguments[:precision] = precision if precision.present?
143
+ @system_arguments[:title] = title if title.present?
144
+ @system_arguments[:lang] = lang if lang.present?
145
+ @system_arguments[:format] = fetch_or_fallback(FORMAT_OPTIONS, format, FORMAT_DEFAULT) if format.present?
146
+ if datetime.present? && datetime.respond_to?(:iso8601)
147
+ @datetime = datetime
148
+ @system_arguments[:datetime] = datetime.iso8601
149
+ elsif datetime.present?
150
+ @datetime = Time.iso8601 datetime
151
+ @system_arguments[:datetime] = @datetime
152
+ end
153
+ end
154
+
155
+ def call
156
+ render(Primer::BaseComponent.new(**@system_arguments).with_content(@datetime.strftime("%B %-d, %Y %H:%M")))
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1 @@
1
+ .btn{-webkit-appearance:none;appearance:none;border:var(--primer-borderWidth-thin,1px) solid;border-radius:var(--primer-borderRadius-medium,6px);cursor:pointer;display:inline-block;font-size:var(--primer-text-body-size-medium,14px);font-weight:var(--base-text-weight-medium,500);line-height:20px;padding:5px var(--primer-control-medium-paddingInline-spacious,16px);position:relative;-webkit-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.btn:hover{text-decoration:none}.btn.disabled,.btn:disabled,.btn[aria-disabled=true]{cursor:default}.btn i{font-style:normal;font-weight:var(--base-text-weight-medium,500);opacity:.75}.btn .octicon{color:var(--color-fg-muted);margin-right:var(--primer-control-small-gap,4px);vertical-align:text-bottom}.btn .octicon:only-child{margin-right:0}.btn .Counter{background-color:var(--color-btn-counter-bg);color:inherit;margin-left:2px;text-shadow:none;vertical-align:top}.btn .dropdown-caret{margin-left:var(--primer-control-small-gap,4px);opacity:.8}.btn{background-color:var(--color-btn-bg);border-color:var(--color-btn-border);box-shadow:var(--color-btn-shadow),var(--color-btn-inset-shadow);color:var(--color-btn-text);transition:80ms cubic-bezier(.33,1,.68,1);transition-property:color,background-color,box-shadow,border-color}.btn [open]>.btn,.btn.hover,.btn:hover{background-color:var(--color-btn-hover-bg);border-color:var(--color-btn-hover-border);transition-duration:.1s}.btn:active{background-color:var(--color-btn-active-bg);border-color:var(--color-btn-active-border);transition:none}.btn.selected,.btn[aria-selected=true]{background-color:var(--color-btn-selected-bg);box-shadow:var(--color-primer-shadow-inset)}.btn.disabled,.btn[aria-disabled=true]{background-color:var(--color-btn-bg);border-color:var(--color-btn-border);color:var(--color-primer-fg-disabled)}.btn.disabled .octicon,.btn[aria-disabled=true] .octicon{color:var(--color-primer-fg-disabled)}.btn-primary{background-color:var(--color-btn-primary-bg);border-color:var(--color-btn-primary-border);box-shadow:var(--color-btn-primary-shadow),var(--color-btn-primary-inset-shadow);color:var(--color-btn-primary-text)}.btn-primary [open]>.btn-primary,.btn-primary.hover,.btn-primary:hover{background-color:var(--color-btn-primary-hover-bg);border-color:var(--color-btn-primary-hover-border)}.btn-primary:focus{box-shadow:inset 0 0 0 3px var(--color-fg-on-emphasis);outline:2px solid var(--color-accent-fg);outline-offset:-2px}.btn-primary:focus:not(:focus-visible){box-shadow:none;outline:1px solid #0000}.btn-primary:focus-visible{box-shadow:inset 0 0 0 3px var(--color-fg-on-emphasis);outline:2px solid var(--color-accent-fg);outline-offset:-2px}.btn-primary.selected,.btn-primary:active,.btn-primary[aria-selected=true]{background-color:var(--color-btn-primary-selected-bg);box-shadow:var(--color-btn-primary-selected-shadow)}.btn-primary.disabled,.btn-primary:disabled,.btn-primary[aria-disabled=true]{background-color:var(--color-btn-primary-disabled-bg);border-color:var(--color-btn-primary-disabled-border);color:var(--color-btn-primary-disabled-text)}.btn-primary.disabled .octicon,.btn-primary:disabled .octicon,.btn-primary[aria-disabled=true] .octicon{color:var(--color-btn-primary-disabled-text)}.btn-primary .Counter{background-color:var(--color-btn-primary-counter-bg);color:inherit}.btn-primary .octicon{color:var(--color-btn-primary-icon)}a.btn-primary:focus{box-shadow:inset 0 0 0 3px var(--color-fg-on-emphasis);outline:2px solid var(--color-accent-fg);outline-offset:-2px}a.btn-primary:focus:not(:focus-visible){box-shadow:none;outline:1px solid #0000}a.btn-primary:focus-visible{box-shadow:inset 0 0 0 3px var(--color-fg-on-emphasis);outline:2px solid var(--color-accent-fg);outline-offset:-2px}.btn-outline{color:var(--color-btn-outline-text)}.btn-outline [open]>.btn-outline,.btn-outline:hover{background-color:var(--color-btn-outline-hover-bg);border-color:var(--color-btn-outline-hover-border);box-shadow:var(--color-btn-outline-hover-shadow),var(--color-btn-outline-hover-inset-shadow);color:var(--color-btn-outline-hover-text)}:is(.btn-outline:hover,.btn-outline [open]>.btn-outline) .Counter{background-color:var(--color-btn-outline-hover-counter-bg)}:is(.btn-outline:hover,.btn-outline [open]>.btn-outline) .octicon{color:inherit}.btn-outline.selected,.btn-outline:active,.btn-outline[aria-selected=true]{background-color:var(--color-btn-outline-selected-bg);border-color:var(--color-btn-outline-selected-border);box-shadow:var(--color-btn-outline-selected-shadow);color:var(--color-btn-outline-selected-text)}.btn-outline.selected:focus,.btn-outline:active:focus,.btn-outline[aria-selected=true]:focus{box-shadow:inset 0 0 0 3px var(--color-fg-on-emphasis);outline:2px solid var(--color-accent-fg);outline-offset:-2px}.btn-outline.selected:focus:not(:focus-visible),.btn-outline:active:focus:not(:focus-visible),.btn-outline[aria-selected=true]:focus:not(:focus-visible){box-shadow:none;outline:1px solid #0000}.btn-outline.selected:focus-visible,.btn-outline:active:focus-visible,.btn-outline[aria-selected=true]:focus-visible{box-shadow:inset 0 0 0 3px var(--color-fg-on-emphasis);outline:2px solid var(--color-accent-fg);outline-offset:-2px}.btn-outline.disabled,.btn-outline:disabled,.btn-outline[aria-disabled=true]{background-color:var(--color-btn-outline-disabled-bg);border-color:var(--color-btn-border);box-shadow:none;color:var(--color-btn-outline-disabled-text)}.btn-outline.disabled .Counter,.btn-outline:disabled .Counter,.btn-outline[aria-disabled=true] .Counter{background-color:var(--color-btn-outline-disabled-counter-bg)}.btn-outline .Counter{background-color:var(--color-btn-outline-counter-bg);color:inherit}.btn-danger{color:var(--color-btn-danger-text)}.btn-danger .octicon{color:var(--color-btn-danger-icon)}.btn-danger [open]>.btn-danger,.btn-danger:hover{background-color:var(--color-btn-danger-hover-bg);border-color:var(--color-btn-danger-hover-border);box-shadow:var(--color-btn-danger-hover-shadow),var(--color-btn-danger-hover-inset-shadow);color:var(--color-btn-danger-hover-text)}:is(.btn-danger:hover,.btn-danger [open]>.btn-danger) .Counter{background-color:var(--color-btn-danger-hover-counter-bg)}:is(.btn-danger:hover,.btn-danger [open]>.btn-danger) .octicon{color:var(--color-btn-danger-hover-icon)}.btn-danger.selected,.btn-danger:active,.btn-danger[aria-selected=true]{background-color:var(--color-btn-danger-selected-bg);border-color:var(--color-btn-danger-selected-border);box-shadow:var(--color-btn-danger-selected-shadow);color:var(--color-btn-danger-selected-text)}.btn-danger.disabled,.btn-danger:disabled,.btn-danger[aria-disabled=true]{background-color:var(--color-btn-danger-disabled-bg);border-color:var(--color-btn-border);box-shadow:none;color:var(--color-btn-danger-disabled-text)}.btn-danger.disabled .Counter,.btn-danger:disabled .Counter,.btn-danger[aria-disabled=true] .Counter{background-color:var(--color-btn-danger-disabled-counter-bg)}.btn-danger.disabled .octicon,.btn-danger:disabled .octicon,.btn-danger[aria-disabled=true] .octicon{color:var(--color-btn-danger-disabled-text)}.btn-danger .Counter{background-color:var(--color-btn-danger-counter-bg);color:inherit}.btn-sm{font-size:var(--primer-text-body-size-small,12px);line-height:20px;padding:3px 12px}.btn-sm .octicon{vertical-align:text-top}.btn-large{border-radius:.5em;font-size:inherit;line-height:1.5;padding:.75em 1.5em}.btn-block{display:block;text-align:center;width:100%}.btn-link{-webkit-appearance:none;appearance:none;background-color:initial;border:0;color:var(--color-accent-fg);cursor:pointer;display:inline-block;font-size:inherit;padding:0;text-decoration:none;-webkit-user-select:none;user-select:none;white-space:nowrap}.btn-link:hover{text-decoration:underline}.btn-link:disabled,.btn-link:disabled:hover,.btn-link[aria-disabled=true],.btn-link[aria-disabled=true]:hover{color:var(--color-primer-fg-disabled);cursor:default}.btn-link:not(.dropdown-item):focus,.btn-link:not(.dropdown-item):focus-visible{border-radius:var(--primer-borderRadius-medium,6px);outline-offset:0}.btn-invisible{background-color:initial;border:0;border-radius:var(--primer-borderRadius-medium,6px);box-shadow:none;color:var(--color-accent-fg)}.btn-invisible.zeroclipboard-is-hover,.btn-invisible:hover{background-color:var(--color-btn-hover-bg);box-shadow:none;color:var(--color-accent-fg);outline:none}.btn-invisible.selected,.btn-invisible.zeroclipboard-is-active,.btn-invisible:active,.btn-invisible[aria-selected=true]{background:none;border-color:var(--color-btn-active-border);box-shadow:none;color:var(--color-accent-fg);outline:2px solid var(--color-accent-fg);outline-offset:-2px}.btn-invisible:active .btn-invisible.zeroclipboard-is-active{background-color:var(--color-btn-selected-bg)}.btn-invisible.disabled,.btn-invisible:disabled,.btn-invisible[aria-disabled=true]{background-color:initial;color:var(--color-primer-fg-disabled)}.btn-octicon{background:#0000;border:0;box-shadow:none;color:var(--color-fg-muted);display:inline-block;line-height:1;margin-left:5px;padding:5px;vertical-align:middle}.btn-octicon:hover{color:var(--color-accent-fg)}.btn-octicon:focus,.btn-octicon:focus-visible{border-radius:var(--primer-borderRadius-medium,6px)}.btn-octicon.disabled,.btn-octicon[aria-disabled=true]{color:var(--color-primer-fg-disabled);cursor:default}.btn-octicon.disabled:hover,.btn-octicon[aria-disabled=true]:hover{color:var(--color-primer-fg-disabled)}.btn-octicon-danger:hover{color:var(--color-danger-fg)}.close-button{background:#0000;border:0;color:var(--color-fg-muted);padding:0}.close-button:hover{color:var(--color-fg-default)}.close-button:active{box-shadow:none;outline:2px solid var(--color-accent-fg);outline-offset:-2px}.hidden-text-expander{display:block}.hidden-text-expander.inline{display:inline-block;line-height:0;margin-left:5px;position:relative;top:-1px}.ellipsis-expander,.hidden-text-expander a{background:var(--color-neutral-muted);border:0;border-radius:1px;color:var(--color-fg-default);display:inline-block;font-size:var(--primer-text-body-size-small,12px);font-weight:var(--base-text-weight-semibold,600);height:12px;line-height:6px;padding:0 5px 5px;text-decoration:none;vertical-align:middle}:is(.hidden-text-expander a,.ellipsis-expander):hover{background-color:var(--color-accent-muted);text-decoration:none}:is(.hidden-text-expander a,.ellipsis-expander):active{background-color:var(--color-accent-emphasis);color:var(--color-fg-on-emphasis)}.btn-with-count{border-bottom-right-radius:0;border-top-right-radius:0;float:left}.btn-with-count:focus{z-index:1}.social-count{background-color:var(--color-canvas-default);border:var(--primer-borderWidth-thin,1px) solid var(--color-btn-border);border-bottom-right-radius:var(--primer-borderRadius-medium,6px);border-left:0;border-top-right-radius:var(--primer-borderRadius-medium,6px);box-shadow:var(--color-shadow-small),var(--color-primer-shadow-highlight);color:var(--color-fg-default);float:left;font-size:var(--primer-text-body-size-small,12px);font-weight:var(--base-text-weight-semibold,600);line-height:20px;padding:3px 12px;position:relative;vertical-align:middle}.social-count:active,.social-count:hover{text-decoration:none}.social-count:hover{color:var(--color-accent-fg);cursor:pointer}
@@ -0,0 +1 @@
1
+ {"name":"button_component","selectors":[".btn",".btn:hover",".btn.disabled",".btn:disabled",".btn[aria-disabled=true]",".btn i",".btn .octicon",".btn .octicon:only-child",".btn .Counter",".btn .dropdown-caret",".btn [open]>.btn",".btn.hover",".btn:active",".btn.selected",".btn[aria-selected=true]",".btn.disabled .octicon",".btn[aria-disabled=true] .octicon",".btn-primary",".btn-primary [open]>.btn-primary",".btn-primary.hover",".btn-primary:hover",".btn-primary:focus",".btn-primary:focus:not(:focus-visible)",".btn-primary:focus-visible",".btn-primary.selected",".btn-primary:active",".btn-primary[aria-selected=true]",".btn-primary.disabled",".btn-primary:disabled",".btn-primary[aria-disabled=true]",".btn-primary.disabled .octicon",".btn-primary:disabled .octicon",".btn-primary[aria-disabled=true] .octicon",".btn-primary .Counter",".btn-primary .octicon","a.btn-primary:focus","a.btn-primary:focus:not(:focus-visible)","a.btn-primary:focus-visible",".btn-outline",".btn-outline [open]>.btn-outline",".btn-outline:hover",":is(.btn-outline:hover",".btn-outline [open]>.btn-outline) .Counter",".btn-outline [open]>.btn-outline) .octicon",".btn-outline.selected",".btn-outline:active",".btn-outline[aria-selected=true]",".btn-outline.selected:focus",".btn-outline:active:focus",".btn-outline[aria-selected=true]:focus",".btn-outline.selected:focus:not(:focus-visible)",".btn-outline:active:focus:not(:focus-visible)",".btn-outline[aria-selected=true]:focus:not(:focus-visible)",".btn-outline.selected:focus-visible",".btn-outline:active:focus-visible",".btn-outline[aria-selected=true]:focus-visible",".btn-outline.disabled",".btn-outline:disabled",".btn-outline[aria-disabled=true]",".btn-outline.disabled .Counter",".btn-outline:disabled .Counter",".btn-outline[aria-disabled=true] .Counter",".btn-outline .Counter",".btn-danger",".btn-danger .octicon",".btn-danger [open]>.btn-danger",".btn-danger:hover",":is(.btn-danger:hover",".btn-danger [open]>.btn-danger) .Counter",".btn-danger [open]>.btn-danger) .octicon",".btn-danger.selected",".btn-danger:active",".btn-danger[aria-selected=true]",".btn-danger.disabled",".btn-danger:disabled",".btn-danger[aria-disabled=true]",".btn-danger.disabled .Counter",".btn-danger:disabled .Counter",".btn-danger[aria-disabled=true] .Counter",".btn-danger.disabled .octicon",".btn-danger:disabled .octicon",".btn-danger[aria-disabled=true] .octicon",".btn-danger .Counter",".btn-sm",".btn-sm .octicon",".btn-large",".btn-block",".btn-link",".btn-link:hover",".btn-link:disabled",".btn-link:disabled:hover",".btn-link[aria-disabled=true]",".btn-link[aria-disabled=true]:hover",".btn-link:not(.dropdown-item):focus",".btn-link:not(.dropdown-item):focus-visible",".btn-invisible",".btn-invisible.zeroclipboard-is-hover",".btn-invisible:hover",".btn-invisible.selected",".btn-invisible.zeroclipboard-is-active",".btn-invisible:active",".btn-invisible[aria-selected=true]",".btn-invisible:active .btn-invisible.zeroclipboard-is-active",".btn-invisible.disabled",".btn-invisible:disabled",".btn-invisible[aria-disabled=true]",".btn-octicon",".btn-octicon:hover",".btn-octicon:focus",".btn-octicon:focus-visible",".btn-octicon.disabled",".btn-octicon[aria-disabled=true]",".btn-octicon.disabled:hover",".btn-octicon[aria-disabled=true]:hover",".btn-octicon-danger:hover",".close-button",".close-button:hover",".close-button:active",".hidden-text-expander",".hidden-text-expander.inline",".ellipsis-expander",".hidden-text-expander a",":is(.hidden-text-expander a",".ellipsis-expander):hover",".ellipsis-expander):active",".btn-with-count",".btn-with-count:focus",".social-count",".social-count:active",".social-count:hover"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["button_component.pcss","../../../lib/postcss_mixins/focusOutlineOnEmphasis.pcss","../../../lib/postcss_mixins/focusOutline.pcss"],"names":[],"mappings":"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","file":"button_component.css","sourcesContent":["/* btn */\n\n/* Base button styles */\n.btn {\n position: relative;\n display: inline-block;\n padding: 5px var(--primer-control-medium-paddingInline-spacious, 16px);\n font-size: var(--primer-text-body-size-medium, 14px);\n font-weight: var(--base-text-weight-medium, 500);\n line-height: 20px; /* Specifically not inherit our `<body>` default */\n white-space: nowrap;\n vertical-align: middle;\n cursor: pointer;\n user-select: none;\n border: var(--primer-borderWidth-thin, 1px) solid;\n border-radius: var(--primer-borderRadius-medium, 6px);\n appearance: none; /* Corrects inability to style clickable `input` types in iOS. */\n\n &:hover {\n text-decoration: none;\n }\n\n &:disabled,\n &.disabled,\n &[aria-disabled='true'] {\n cursor: default;\n }\n\n & i {\n font-style: normal;\n font-weight: var(--base-text-weight-medium, 500);\n opacity: 0.75;\n }\n\n & .octicon {\n margin-right: var(--primer-control-small-gap, 4px);\n color: var(--color-fg-muted);\n vertical-align: text-bottom;\n\n &:only-child {\n margin-right: 0;\n }\n }\n\n & .Counter {\n margin-left: 2px;\n color: inherit;\n text-shadow: none;\n vertical-align: top;\n background-color: var(--color-btn-counter-bg);\n }\n\n & .dropdown-caret {\n margin-left: var(--primer-control-small-gap, 4px);\n opacity: 0.8;\n }\n\n /* Default button */\n\n color: var(--color-btn-text);\n background-color: var(--color-btn-bg);\n border-color: var(--color-btn-border);\n box-shadow: var(--color-btn-shadow), var(--color-btn-inset-shadow);\n transition: 80ms cubic-bezier(0.33, 1, 0.68, 1);\n transition-property: color, background-color, box-shadow, border-color;\n\n &:hover,\n &.hover,\n & [open] > & {\n background-color: var(--color-btn-hover-bg);\n border-color: var(--color-btn-hover-border);\n transition-duration: 0.1s;\n }\n\n &:active {\n background-color: var(--color-btn-active-bg);\n border-color: var(--color-btn-active-border);\n transition: none;\n }\n\n &.selected,\n &[aria-selected='true'] {\n background-color: var(--color-btn-selected-bg);\n box-shadow: var(--color-primer-shadow-inset);\n }\n\n &.disabled,\n &[aria-disabled='true'] {\n color: var(--color-primer-fg-disabled);\n background-color: var(--color-btn-bg);\n border-color: var(--color-btn-border);\n\n & .octicon {\n color: var(--color-primer-fg-disabled);\n }\n }\n}\n\n/* Primary button */\n\n.btn-primary {\n color: var(--color-btn-primary-text);\n background-color: var(--color-btn-primary-bg);\n border-color: var(--color-btn-primary-border);\n box-shadow: var(--color-btn-primary-shadow), var(--color-btn-primary-inset-shadow);\n\n &:hover,\n &.hover,\n & [open] > & {\n background-color: var(--color-btn-primary-hover-bg);\n border-color: var(--color-btn-primary-hover-border);\n }\n\n /* fallback :focus state */\n &:focus {\n @mixin focusOutlineOnEmphasis;\n\n /* remove fallback :focus if :focus-visible is supported */\n &:not(:focus-visible) {\n outline: solid 1px transparent;\n box-shadow: none;\n }\n }\n\n /* default focus state */\n &:focus-visible {\n @mixin focusOutlineOnEmphasis;\n }\n\n &:active,\n &.selected,\n &[aria-selected='true'] {\n background-color: var(--color-btn-primary-selected-bg);\n box-shadow: var(--color-btn-primary-selected-shadow);\n }\n\n &:disabled,\n &.disabled,\n &[aria-disabled='true'] {\n color: var(--color-btn-primary-disabled-text);\n background-color: var(--color-btn-primary-disabled-bg);\n border-color: var(--color-btn-primary-disabled-border);\n\n & .octicon {\n color: var(--color-btn-primary-disabled-text);\n }\n }\n\n & .Counter {\n color: inherit;\n background-color: var(--color-btn-primary-counter-bg);\n }\n\n & .octicon {\n color: var(--color-btn-primary-icon);\n }\n}\n\n/* ensure links styled as button primary gets proper focus style */\na.btn-primary {\n /* fallback :focus state */\n &:focus {\n @mixin focusOutlineOnEmphasis;\n\n /* remove fallback :focus if :focus-visible is supported */\n &:not(:focus-visible) {\n outline: solid 1px transparent;\n box-shadow: none;\n }\n }\n\n /* default focus state */\n &:focus-visible {\n @mixin focusOutlineOnEmphasis;\n }\n}\n\n/* Outline button */\n\n.btn-outline {\n color: var(--color-btn-outline-text);\n\n &:hover,\n & [open] > & {\n color: var(--color-btn-outline-hover-text);\n background-color: var(--color-btn-outline-hover-bg);\n border-color: var(--color-btn-outline-hover-border);\n box-shadow: var(--color-btn-outline-hover-shadow), var(--color-btn-outline-hover-inset-shadow);\n\n & .Counter {\n background-color: var(--color-btn-outline-hover-counter-bg);\n }\n\n & .octicon {\n color: inherit;\n }\n }\n\n &:active,\n &.selected,\n &[aria-selected='true'] {\n color: var(--color-btn-outline-selected-text);\n background-color: var(--color-btn-outline-selected-bg);\n border-color: var(--color-btn-outline-selected-border);\n box-shadow: var(--color-btn-outline-selected-shadow);\n\n /* fallback :focus state */\n &:focus {\n @mixin focusOutlineOnEmphasis;\n\n /* remove fallback :focus if :focus-visible is supported */\n &:not(:focus-visible) {\n outline: solid 1px transparent;\n box-shadow: none;\n }\n }\n\n /* default focus state */\n &:focus-visible {\n @mixin focusOutlineOnEmphasis;\n }\n }\n\n &:disabled,\n &.disabled,\n &[aria-disabled='true'] {\n color: var(--color-btn-outline-disabled-text);\n background-color: var(--color-btn-outline-disabled-bg);\n border-color: var(--color-btn-border);\n box-shadow: none;\n\n & .Counter {\n background-color: var(--color-btn-outline-disabled-counter-bg);\n }\n }\n\n & .Counter {\n color: inherit;\n background-color: var(--color-btn-outline-counter-bg);\n }\n}\n\n/* Danger button */\n\n.btn-danger {\n color: var(--color-btn-danger-text);\n\n & .octicon {\n color: var(--color-btn-danger-icon);\n }\n\n &:hover,\n & [open] > & {\n color: var(--color-btn-danger-hover-text);\n background-color: var(--color-btn-danger-hover-bg);\n border-color: var(--color-btn-danger-hover-border);\n box-shadow: var(--color-btn-danger-hover-shadow), var(--color-btn-danger-hover-inset-shadow);\n\n & .Counter {\n background-color: var(--color-btn-danger-hover-counter-bg);\n }\n\n & .octicon {\n color: var(--color-btn-danger-hover-icon);\n }\n }\n\n &:active,\n &.selected,\n &[aria-selected='true'] {\n color: var(--color-btn-danger-selected-text);\n background-color: var(--color-btn-danger-selected-bg);\n border-color: var(--color-btn-danger-selected-border);\n box-shadow: var(--color-btn-danger-selected-shadow);\n }\n\n &:disabled,\n &.disabled,\n &[aria-disabled='true'] {\n color: var(--color-btn-danger-disabled-text);\n background-color: var(--color-btn-danger-disabled-bg);\n border-color: var(--color-btn-border);\n box-shadow: none;\n\n & .Counter {\n background-color: var(--color-btn-danger-disabled-counter-bg);\n }\n\n & .octicon {\n color: var(--color-btn-danger-disabled-text);\n }\n }\n\n & .Counter {\n color: inherit;\n background-color: var(--color-btn-danger-counter-bg);\n }\n}\n\n/* Sizes\n**\n** Tweak `line-height` to make them smaller. */\n.btn-sm {\n padding: 3px 12px;\n font-size: var(--primer-text-body-size-small, 12px);\n line-height: 20px;\n\n & .octicon {\n vertical-align: text-top;\n }\n}\n\n/* Large button adds more padding around text. Use font-size utils to increase font-size..\n** e.g, <p class=\"text-gamma\"><button class=\"btn btn-large btn-primary\" type=\"button\">Big green button</button></p> */\n.btn-large {\n padding: 0.75em 1.5em;\n font-size: inherit;\n line-height: 1.5;\n border-radius: 0.5em;\n}\n\n/* Full-width button\n**\n** These buttons expand to the full width of their parent container */\n.btn-block {\n display: block;\n width: 100%;\n text-align: center;\n}\n\n\n/* Link-like buttons\n**\n** This class is for styling <button> and <input> elements to look like links */\n\n.btn-link {\n display: inline-block;\n padding: 0;\n font-size: inherit;\n color: var(--color-accent-fg);\n text-decoration: none;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n background-color: transparent;\n border: 0;\n appearance: none; /* Corrects inability to style clickable `input` types in iOS. */\n\n &:hover {\n text-decoration: underline;\n }\n\n &:disabled,\n &[aria-disabled='true'] {\n &,\n &:hover {\n color: var(--color-primer-fg-disabled);\n cursor: default;\n }\n }\n\n &:not(.dropdown-item) {\n &:focus,\n &:focus-visible {\n border-radius: var(--primer-borderRadius-medium, 6px);\n outline-offset: 0;\n }\n }\n}\n\n/* Invisible button\n**\n** Typically used as a \"cancel\" button next to a .btn */\n\n.btn-invisible {\n color: var(--color-accent-fg);\n background-color: transparent; /* Reset default gradient backgrounds and colors */\n border: 0;\n border-radius: var(--primer-borderRadius-medium, 6px);\n box-shadow: none;\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: var(--color-accent-fg);\n background-color: var(--color-btn-hover-bg);\n outline: none;\n box-shadow: none;\n }\n\n &:active,\n &.selected,\n &[aria-selected='true'],\n &.zeroclipboard-is-active {\n color: var(--color-accent-fg);\n background: none;\n border-color: var(--color-btn-active-border);\n\n @mixin focusOutline;\n }\n\n &:active &.zeroclipboard-is-active {\n background-color: var(--color-btn-selected-bg);\n }\n\n &:disabled,\n &.disabled,\n &[aria-disabled='true'] {\n color: var(--color-primer-fg-disabled);\n background-color: transparent;\n }\n}\n\n/* Octicon button\n**\n** Icon-only buttons */\n\n.btn-octicon {\n display: inline-block;\n padding: 5px;\n margin-left: 5px;\n line-height: 1;\n color: var(--color-fg-muted);\n vertical-align: middle;\n\n /* For `<button>` elements */\n background: transparent;\n border: 0;\n box-shadow: none;\n\n &:hover {\n color: var(--color-accent-fg);\n }\n\n &:focus,\n &:focus-visible {\n border-radius: var(--primer-borderRadius-medium, 6px);\n }\n\n &.disabled,\n &[aria-disabled='true'] {\n color: var(--color-primer-fg-disabled);\n cursor: default;\n\n &:hover {\n color: var(--color-primer-fg-disabled);\n }\n }\n}\n\n.btn-octicon-danger:hover {\n color: var(--color-danger-fg);\n}\n\n/* Close button\n**\n** Typically used with an octicon-x */\n\n.close-button {\n padding: 0;\n color: var(--color-fg-muted);\n background: transparent;\n border: 0;\n\n &:hover {\n color: var(--color-fg-default);\n }\n\n &:active {\n @mixin focusOutline;\n }\n}\n\n/* Hidden text button\n**\n** Use `.hidden-text-expander` to indicate and expand hidden text. */\n\n.hidden-text-expander {\n display: block;\n\n &.inline {\n position: relative;\n top: -1px;\n display: inline-block;\n margin-left: 5px;\n line-height: 0;\n }\n}\n\n.hidden-text-expander a,\n.ellipsis-expander {\n display: inline-block;\n height: 12px;\n padding: 0 5px 5px;\n font-size: var(--primer-text-body-size-small, 12px);\n font-weight: var(--base-text-weight-semibold, 600);\n line-height: 6px;\n color: var(--color-fg-default);\n text-decoration: none;\n vertical-align: middle;\n background: var(--color-neutral-muted);\n border: 0;\n border-radius: 1px;\n\n &:hover {\n text-decoration: none;\n background-color: var(--color-accent-muted);\n }\n\n &:active {\n color: var(--color-fg-on-emphasis);\n background-color: var(--color-accent-emphasis);\n }\n}\n\n/* Social button count\n** TODO: Deprecate? Use BtnGroup instead? */\n\n.btn-with-count {\n float: left;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n\n &:focus {\n z-index: 1;\n }\n}\n\n/* Social count bubble\n**\n** A container that is used for social bubbles counts. */\n\n.social-count {\n position: relative;\n float: left;\n padding: 3px 12px;\n font-size: var(--primer-text-body-size-small, 12px);\n font-weight: var(--base-text-weight-semibold, 600);\n line-height: 20px;\n color: var(--color-fg-default);\n vertical-align: middle;\n background-color: var(--color-canvas-default);\n border: var(--primer-borderWidth-thin, 1px) solid var(--color-btn-border);\n border-left: 0;\n border-top-right-radius: var(--primer-borderRadius-medium, 6px);\n border-bottom-right-radius: var(--primer-borderRadius-medium, 6px);\n box-shadow: var(--color-shadow-small), var(--color-primer-shadow-highlight);\n\n &:hover,\n &:active {\n text-decoration: none;\n }\n\n &:hover {\n color: var(--color-accent-fg);\n cursor: pointer;\n }\n}\n","/* outline with fg box-shadow for buttons */\n@define-mixin focusOutlineOnEmphasis $outlineOffset: -2px, $outlineColor: var(--color-accent-fg) {\n outline: 2px solid $outlineColor;\n outline-offset: $outlineOffset;\n box-shadow: inset 0 0 0 3px var(--color-fg-on-emphasis);\n}\n","@define-mixin focusOutline $outlineOffset: -2px, $outlineColor: var(--color-accent-fg) {\n outline: 2px solid $outlineColor;\n outline-offset: $outlineOffset;\n box-shadow: none;\n}\n"]}