@primer/react 38.37.0-rc.5b155816b → 38.37.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.
- package/CHANGELOG.md +4 -0
- package/dist/ActionBar/index.d.ts +2 -0
- package/dist/Button/ButtonBase-b44e29d1.css +2 -0
- package/dist/Button/ButtonBase-b44e29d1.css.map +1 -0
- package/dist/Button/ButtonBase.d.ts +5 -2
- package/dist/Button/ButtonBase.js +4 -2
- package/dist/Button/ButtonBase.module.css.js +3 -2
- package/dist/Button/types.d.ts +15 -1
- package/dist/FeatureFlags/DefaultFeatureFlags.js +2 -1
- package/dist/SelectPanel/SelectPanel.d.ts +1 -0
- package/dist/experimental/SelectPanel2/SelectPanel.d.ts +1 -0
- package/dist/experimental/Tabs/Tabs.js +33 -19
- package/dist/experimental/Tabs/types.d.ts +6 -0
- package/dist/experimental/Tabs/useTab.js +6 -1
- package/dist/experimental/Tabs/useTabList.js +29 -22
- package/dist/experimental/UnderlinePanels/UnderlinePanels.d.ts +38 -1
- package/dist/experimental/UnderlinePanels/UnderlinePanels.js +69 -18
- package/generated/components.json +55 -2
- package/package.json +1 -1
- package/dist/Button/ButtonBase-311501b9.css +0 -2
- package/dist/Button/ButtonBase-311501b9.css.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,10 +4,14 @@
|
|
|
4
4
|
|
|
5
5
|
### Minor Changes
|
|
6
6
|
|
|
7
|
+
- [#8311](https://github.com/primer/react/pull/8311) [`b111781`](https://github.com/primer/react/commit/b1117811cebfb9463f20fe76f77cdf13917ae6b2) Thanks [@liuliu-dev](https://github.com/liuliu-dev)! - Button: Add configurable notification indicators to Button and IconButton
|
|
8
|
+
|
|
7
9
|
- [#8306](https://github.com/primer/react/pull/8306) [`a3afd7b`](https://github.com/primer/react/commit/a3afd7baf05ea6c4a272a40ccb636f20a48f87dc) Thanks [@llastflowers](https://github.com/llastflowers)! - Deprecate the `Flash` component and move to `@primer/react/deprecated`
|
|
8
10
|
|
|
9
11
|
- [#8295](https://github.com/primer/react/pull/8295) [`bfebb8a`](https://github.com/primer/react/commit/bfebb8a538e6f068a457722b154799876bda3ab4) Thanks [@copilot-swe-agent](https://github.com/apps/copilot-swe-agent)! - Textarea: Add an `autoSize` option that allows the field to grow with its content
|
|
10
12
|
|
|
13
|
+
- [#8233](https://github.com/primer/react/pull/8233) [`80a68cf`](https://github.com/primer/react/commit/80a68cf05226323ad8cbc0531f244d60ea6747e3) Thanks [@rickyzhangca](https://github.com/rickyzhangca)! - UnderlinePanels: add controlled `value`/`defaultValue`/`onChange` and `activationMode` props, keyed to a per-`Tab`/`Panel` `value`, for data-driven tabs. Behind the `primer_react_underline_panels_controlled` feature flag; the existing `aria-selected`/`onSelect` API is unchanged.
|
|
14
|
+
|
|
11
15
|
### Patch Changes
|
|
12
16
|
|
|
13
17
|
- [#8304](https://github.com/primer/react/pull/8304) [`88feb65`](https://github.com/primer/react/commit/88feb658c13fec154da1a8aa199250514f4fdba3) Thanks [@iansan5653](https://github.com/iansan5653)! - Animate `SegmentedControl` when switching between items
|
|
@@ -14,6 +14,7 @@ declare const ActionBar: import("react").FC<import("react").PropsWithChildren<Ac
|
|
|
14
14
|
trailingAction?: React.ElementType | null;
|
|
15
15
|
children?: React.ReactNode;
|
|
16
16
|
count?: number | string;
|
|
17
|
+
notificationIndicator?: "button" | "leadingVisual";
|
|
17
18
|
} & {
|
|
18
19
|
variant?: VariantType;
|
|
19
20
|
size?: Size;
|
|
@@ -39,6 +40,7 @@ declare const ActionBar: import("react").FC<import("react").PropsWithChildren<Ac
|
|
|
39
40
|
'aria-labelledby'?: undefined;
|
|
40
41
|
} & {
|
|
41
42
|
icon: React.ElementType;
|
|
43
|
+
notificationIndicator?: "button" | "icon";
|
|
42
44
|
unsafeDisableTooltip?: boolean;
|
|
43
45
|
description?: string;
|
|
44
46
|
tooltipDirection?: TooltipDirection;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
.prc-Button-ButtonBase-9n-Xk{align-items:center;appearance:none;background-color:transparent;border:var(--borderWidth-thin,.0625rem) solid;border-color:var(--button-default-borderColor-rest,#d1d9e0);border-radius:var(--borderRadius-medium,.375rem);color:var(--button-default-fgColor-rest,#25292e);cursor:pointer;display:flex;font-family:inherit;font-size:var(--text-body-size-medium,.875rem);font-weight:var(--base-text-weight-medium,500);gap:var(--base-size-8,.5rem);height:var(--control-medium-size,2rem);justify-content:space-between;min-width:max-content;padding:0 var(--control-medium-paddingInline-normal,.75rem);text-align:center;-webkit-text-decoration:none;text-decoration:none;transition:80ms cubic-bezier(.65,0,.35,1);transition-property:color,fill,background-color,border-color;-webkit-user-select:none;user-select:none}.prc-Button-ButtonBase-9n-Xk:has([data-kbd-chord]){padding-inline-end:var(--base-size-6,.375rem)}.prc-Button-ButtonBase-9n-Xk:hover{transition-duration:80ms}.prc-Button-ButtonBase-9n-Xk:focus-visible{box-shadow:none;outline:2px solid var(--focus-outline-color,var(--focus-outlineColor,#0969da));outline-offset:-2px}.prc-Button-ButtonBase-9n-Xk:active{transition:none}.prc-Button-ButtonBase-9n-Xk:where([data-notification-indicator=button],[data-notification-indicator=icon].prc-Button-IconButton-fyge7){position:relative}.prc-Button-ButtonBase-9n-Xk:where([data-notification-indicator=leadingVisual]) .prc-Button-LeadingVisual-UySKu{position:relative}.prc-Button-ButtonBase-9n-Xk:where([data-notification-indicator=button]):before,.prc-Button-ButtonBase-9n-Xk:where([data-notification-indicator=icon].prc-Button-IconButton-fyge7):before,.prc-Button-ButtonBase-9n-Xk:where([data-notification-indicator=leadingVisual]) .prc-Button-LeadingVisual-UySKu:before{background-color:var(--fgColor-accent,#0969da);border-radius:var(--borderRadius-full,624.9375rem);box-shadow:0 0 0 calc(var(--base-size-4,.25rem)/2) var(--bgColor-inset,#f6f8fa);content:"";display:block;height:var(--base-size-8,.5rem);position:absolute;width:var(--base-size-8,.5rem)}.prc-Button-ButtonBase-9n-Xk:where([data-notification-indicator=button]):before{right:calc(var(--base-size-4,.25rem)/-2);top:calc(var(--base-size-4,.25rem)/-2)}.prc-Button-ButtonBase-9n-Xk:where([data-notification-indicator=icon].prc-Button-IconButton-fyge7):before{right:calc(50% - var(--base-size-12,.75rem));top:calc(50% - var(--base-size-12,.75rem))}.prc-Button-ButtonBase-9n-Xk:where([data-notification-indicator=leadingVisual]) .prc-Button-LeadingVisual-UySKu:before{right:calc(var(--base-size-4,.25rem)*-1);top:calc(var(--base-size-4,.25rem)*-1)}.prc-Button-ButtonBase-9n-Xk:disabled,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:not([data-loading=true]){box-shadow:none;cursor:not-allowed}.prc-Button-ButtonBase-9n-Xk:disabled:not(.prc-Button-does-not-exist-3ns8K) .prc-Button-CounterLabel-5hAs4,.prc-Button-ButtonBase-9n-Xk:disabled:not(.prc-Button-does-not-exist-3ns8K) .prc-Button-Visual-YNt2F,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:not([data-loading=true]) .prc-Button-CounterLabel-5hAs4,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:not([data-loading=true]) .prc-Button-Visual-YNt2F{color:inherit}@media (forced-colors:active){.prc-Button-ButtonBase-9n-Xk:focus{outline:1px solid transparent}}.prc-Button-ButtonBase-9n-Xk :where(.prc-Button-Visual-YNt2F){color:var(--fgColor-muted,#59636e);display:flex;pointer-events:none}.prc-Button-ButtonBase-9n-Xk :where(.prc-Button-VisualWrap-E4cnq){display:flex;pointer-events:none}.prc-Button-ButtonBase-9n-Xk:where(.prc-Button-IconButton-fyge7){display:inline-grid;flex-shrink:0;min-width:unset;padding:unset;place-content:center;width:var(--control-medium-size,2rem)}.prc-Button-ButtonBase-9n-Xk:where(.prc-Button-IconButton-fyge7):where([data-size=small]){width:var(--control-small-size,1.75rem)}.prc-Button-ButtonBase-9n-Xk:where(.prc-Button-IconButton-fyge7):where([data-size=large]){width:var(--control-large-size,2.5rem)}.prc-Button-ButtonBase-9n-Xk:where([href]){display:inline-flex}.prc-Button-ButtonBase-9n-Xk:where([href]):hover{-webkit-text-decoration:none;text-decoration:none}.prc-Button-ButtonBase-9n-Xk :where(.prc-Button-ButtonContent-Iohp5){align-content:center;align-items:center;display:grid;flex:1 0 auto;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content}.prc-Button-ButtonBase-9n-Xk :where(.prc-Button-ButtonContent-Iohp5)>:not(:last-child){margin-right:var(--base-size-8,.5rem)}.prc-Button-ButtonBase-9n-Xk :where(.prc-Button-ButtonContent-Iohp5):where([data-align=center]){justify-content:center}.prc-Button-ButtonBase-9n-Xk :where(.prc-Button-ButtonContent-Iohp5):where([data-align=start]){justify-content:flex-start}.prc-Button-ButtonBase-9n-Xk :where([data-component=leadingVisual]){grid-area:leadingVisual}.prc-Button-ButtonBase-9n-Xk :where(.prc-Button-Label-FWkx3){grid-area:text;line-height:var(--text-body-lineHeight-medium,1.5);white-space:nowrap}.prc-Button-ButtonBase-9n-Xk :where([data-component=trailingVisual]){grid-area:trailingVisual}.prc-Button-ButtonBase-9n-Xk :where([data-component=trailingAction]){margin-right:calc(var(--base-size-4,.25rem)*-1)}.prc-Button-ButtonBase-9n-Xk:where([data-size=small]){font-size:var(--text-body-size-small,.75rem);gap:var(--control-small-gap,.25rem);height:var(--control-small-size,1.75rem);padding:0 var(--control-small-paddingInline-condensed,.5rem)}.prc-Button-ButtonBase-9n-Xk:where([data-size=small]) .prc-Button-ButtonContent-Iohp5>:not(:last-child){margin-right:var(--control-small-gap,.25rem)}.prc-Button-ButtonBase-9n-Xk:where([data-size=small]) .prc-Button-Label-FWkx3{line-height:var(--text-body-lineHeight-small,1.625)}.prc-Button-ButtonBase-9n-Xk:where([data-size=large]){gap:var(--control-large-gap,.5rem);height:var(--control-large-size,2.5rem);padding:0 var(--control-large-paddingInline-spacious,1rem)}.prc-Button-ButtonBase-9n-Xk:where([data-size=large]) .prc-Button-ButtonContent-Iohp5>:not(:last-child){margin-right:var(--control-large-gap,.5rem)}.prc-Button-ButtonBase-9n-Xk:where([data-size=large]):has([data-kbd-chord]){padding-inline-end:var(--base-size-8,.5rem)}.prc-Button-ButtonBase-9n-Xk:where([data-block=block]){width:100%}.prc-Button-ButtonBase-9n-Xk:where([data-label-wrap=true]){height:unset;min-height:var(--control-medium-size,2rem);min-width:-moz-fit-content;min-width:fit-content}.prc-Button-ButtonBase-9n-Xk:where([data-label-wrap=true]) .prc-Button-ButtonContent-Iohp5{align-self:stretch;flex:1 1 auto;padding-block:calc(var(--control-medium-paddingBlock,.375rem) - var(--base-size-2,.125rem))}.prc-Button-ButtonBase-9n-Xk:where([data-label-wrap=true]) .prc-Button-Label-FWkx3{white-space:unset;word-break:break-word}.prc-Button-ButtonBase-9n-Xk:where([data-label-wrap=true]):where([data-size=small]){height:unset;min-height:var(--control-small-size,1.75rem)}.prc-Button-ButtonBase-9n-Xk:where([data-label-wrap=true]):where([data-size=small]) .prc-Button-ButtonContent-Iohp5{padding-block:calc(var(--control-small-paddingBlock,.25rem) - var(--base-size-2,.125rem))}.prc-Button-ButtonBase-9n-Xk:where([data-label-wrap=true]):where([data-size=large]){height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem)}.prc-Button-ButtonBase-9n-Xk:where([data-label-wrap=true]):where([data-size=large]) .prc-Button-ButtonContent-Iohp5{padding-block:calc(var(--control-large-paddingBlock,.625rem) - var(--base-size-2,.125rem))}.prc-Button-ButtonBase-9n-Xk:where([data-loading=true]) .prc-Button-LoadingSpinner-6KfaT:not([data-component=leadingVisual],[data-component=trailingVisual],[data-component=trailingAction]){grid-area:text;margin-right:0!important;place-self:center}.prc-Button-ButtonBase-9n-Xk:where([data-loading=true]) .prc-Button-LoadingSpinner-6KfaT:not([data-component=leadingVisual],[data-component=trailingVisual],[data-component=trailingAction])+.prc-Button-Label-FWkx3{visibility:hidden}.prc-Button-ButtonBase-9n-Xk .prc-Button-LoadingSpinner-6KfaT{align-items:center;display:flex;justify-content:center}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]){background-color:var(--button-default-bgColor-rest,#f6f8fa);box-shadow:var(--button-default-shadow-resting,0 1px 0 0 #1f23280a);color:var(--button-default-fgColor-rest,#25292e)}.prc-Button-ButtonBase-9n-Xk[aria-expanded=true]:where([data-variant=default]){background-color:var(--button-default-bgColor-active,#e6eaef);border-color:var(--button-default-borderColor-active,#d1d9e0)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]):hover{background-color:var(--button-default-bgColor-hover,#eff2f5);border-color:var(--button-default-borderColor-hover,#d1d9e0)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]):active{background-color:var(--button-default-bgColor-active,#e6eaef);border-color:var(--button-default-borderColor-active,#d1d9e0)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]):disabled,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=default]):not([data-loading=true]){background-color:var(--button-default-bgColor-disabled,#eff2f5);border-color:var(--button-default-borderColor-disabled,#818b981a);box-shadow:none;color:var(--control-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]):disabled:not(.prc-Button-does-not-exist-3ns8K) [data-kbd-chord]{background:var(--buttonKeybindingHint-default-bgColor-disabled,#eff2f5);border-color:var(--buttonKeybindingHint-default-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-default-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=default]):not([data-loading=true]) [data-kbd-chord]{background:var(--buttonKeybindingHint-default-bgColor-disabled,#eff2f5);border-color:var(--buttonKeybindingHint-default-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-default-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]) .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-default-bgColor-rest,#818b981f)!important}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]) [data-kbd-chord]{background:var(--buttonKeybindingHint-default-bgColor-rest,#eff2f5);border-color:var(--buttonKeybindingHint-default-borderColor-rest,#d1d9e0b3);color:var(--buttonKeybindingHint-default-fgColor-rest,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]):where(.prc-Button-IconButton-fyge7){color:var(--fgColor-muted,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]){background-color:var(--button-primary-bgColor-rest,#1f883d);border-color:var(--button-primary-borderColor-rest,#1f232826);box-shadow:var(--shadow-resting-small,0 1px 1px 0 #1f23280a,0 1px 2px 0 #1f232808);color:var(--button-primary-fgColor-rest,#fff)}.prc-Button-ButtonBase-9n-Xk[aria-expanded=true]:where([data-variant=primary]){background-color:var(--button-primary-bgColor-active,#197935);box-shadow:var(--button-primary-shadow-selected,inset 0 1px 0 0 #002d114d)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]):hover{background-color:var(--button-primary-bgColor-hover,#1c8139);border-color:var(--button-primary-borderColor-hover,#1f232826)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]):focus-visible{box-shadow:inset 0 0 0 3px var(--fgColor-onEmphasis,#fff);outline:2px solid var(--focus-outline-color,var(--focus-outlineColor,#0969da));outline-offset:-2px}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]):active{background-color:var(--button-primary-bgColor-active,#197935);box-shadow:var(--button-primary-shadow-selected,inset 0 1px 0 0 #002d114d)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]):disabled,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=primary]):not([data-loading=true]){background-color:var(--button-primary-bgColor-disabled,#95d8a6);border-color:var(--button-primary-borderColor-disabled,#95d8a6);box-shadow:none;color:var(--button-primary-fgColor-disabled,#ffffffcc)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]):disabled:not(.prc-Button-does-not-exist-3ns8K) [data-kbd-chord]{background:var(--buttonKeybindingHint-primary-bgColor-disabled,#002d111a);border-color:var(--buttonKeybindingHint-primary-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-primary-fgColor-disabled,#ffffffcc)}.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=primary]):not([data-loading=true]) [data-kbd-chord]{background:var(--buttonKeybindingHint-primary-bgColor-disabled,#002d111a);border-color:var(--buttonKeybindingHint-primary-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-primary-fgColor-disabled,#ffffffcc)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]) .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-primary-bgColor-rest,#002d1133)!important;color:var(--button-primary-fgColor-rest,#fff)!important}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]) [data-kbd-chord]{background:var(--buttonKeybindingHint-primary-bgColor-rest,#002d1133);border-color:var(--buttonKeybindingHint-primary-borderColor-rest,#1f232826);color:var(--buttonKeybindingHint-primary-fgColor-rest,#fff)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]) .prc-Button-Visual-YNt2F{color:var(--button-primary-fgColor-rest,#fff)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]){background-color:var(--button-danger-bgColor-rest,#f6f8fa);box-shadow:var(--button-default-shadow-resting,0 1px 0 0 #1f23280a);color:var(--button-danger-fgColor-rest,#d1242f)}.prc-Button-ButtonBase-9n-Xk[aria-expanded=true]:where([data-variant=danger]){background-color:var(--button-danger-bgColor-active,#a40e26);border-color:var(--button-danger-borderColor-active,#1f232826);box-shadow:var(--button-danger-shadow-selected,inset 0 1px 0 0 #4c001433);color:var(--button-danger-fgColor-active,#fff)}.prc-Button-ButtonBase-9n-Xk[aria-expanded=true]:where([data-variant=danger]) .prc-Button-Visual-YNt2F{color:var(--button-danger-iconColor-hover,#fff)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):hover{background-color:var(--button-danger-bgColor-hover,#cf222e);border-color:var(--button-danger-borderColor-hover,#1f232826);box-shadow:var(--shadow-resting-small,0 1px 1px 0 #1f23280a,0 1px 2px 0 #1f232808);color:var(--button-danger-fgColor-hover,#fff)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):hover .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-danger-bgColor-hover,#ffffff33)!important;color:var(--buttonCounter-danger-fgColor-hover,#fff)!important}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):hover [data-kbd-chord]{background:var(--buttonKeybindingHint-danger-bgColor-hover,#1f232833);border-color:var(--buttonKeybindingHint-danger-borderColor-hover,#1f232826);color:var(--buttonKeybindingHint-danger-fgColor-hover,#fff);transition:80ms ease-out}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):hover .prc-Button-Visual-YNt2F{color:var(--button-danger-iconColor-hover,#fff)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):active{background-color:var(--button-danger-bgColor-active,#a40e26);border-color:var(--button-danger-borderColor-active,#1f232826);box-shadow:var(--button-danger-shadow-selected,inset 0 1px 0 0 #4c001433);color:var(--button-danger-fgColor-active,#fff)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):active .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-danger-bgColor-hover,#ffffff33)!important;color:var(--buttonCounter-danger-fgColor-hover,#fff)!important}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):active [data-kbd-chord]{background:var(--buttonKeybindingHint-danger-bgColor-active,#1f232866);border-color:var(--buttonKeybindingHint-danger-borderColor-active,#1f232826);color:var(--buttonKeybindingHint-danger-fgColor-active,#fff);transition:80ms ease-out}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):active .prc-Button-Visual-YNt2F{color:var(--button-danger-iconColor-hover,#fff)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):disabled,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=danger]):not([data-loading=true]){background-color:var(--button-danger-bgColor-disabled,#eff2f5);border-color:var(--button-default-borderColor-disabled,#818b981a);box-shadow:none;color:var(--button-danger-fgColor-disabled,#d1242f80)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):disabled:not(.prc-Button-does-not-exist-3ns8K) .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-danger-bgColor-disabled,#cf222e0d)!important;color:var(--buttonCounter-danger-fgColor-disabled,#d1242f80)!important}.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=danger]):not([data-loading=true]) .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-danger-bgColor-disabled,#cf222e0d)!important;color:var(--buttonCounter-danger-fgColor-disabled,#d1242f80)!important}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):disabled:not(.prc-Button-does-not-exist-3ns8K) [data-kbd-chord]{background:var(--buttonKeybindingHint-danger-bgColor-disabled,#eff2f5);border-color:var(--buttonKeybindingHint-danger-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-danger-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=danger]):not([data-loading=true]) [data-kbd-chord]{background:var(--buttonKeybindingHint-danger-bgColor-disabled,#eff2f5);border-color:var(--buttonKeybindingHint-danger-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-danger-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]) .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-danger-bgColor-rest,#cf222e1a)!important;color:var(--buttonCounter-danger-fgColor-rest,#c21c2c)!important}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]) [data-kbd-chord]{background:var(--buttonKeybindingHint-danger-bgColor-rest,#eff2f5);border-color:var(--buttonKeybindingHint-danger-borderColor-rest,#d1d9e0b3);color:var(--buttonKeybindingHint-danger-fgColor-rest,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]) .prc-Button-Visual-YNt2F{color:var(--button-danger-iconColor-rest,#d1242f)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]){border-color:var(--button-invisible-borderColor-rest,#ffffff00);box-shadow:none;color:var(--button-default-fgColor-rest,#25292e)}.prc-Button-ButtonBase-9n-Xk[aria-expanded=true]:where([data-variant=invisible]){background-color:var(--button-invisible-bgColor-active,#818b9826)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):hover{background-color:var(--button-invisible-bgColor-hover,#818b981a);border-color:var(--button-invisible-borderColor-hover,#ffffff00)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):hover .prc-Button-Visual-YNt2F{color:var(--button-invisible-iconColor-hover,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):hover [data-kbd-chord]{background:var(--buttonKeybindingHint-invisible-bgColor-hover,#818b981a);transition:80ms ease-out}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):active{background-color:var(--button-invisible-bgColor-active,#818b9826)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):active .prc-Button-Visual-YNt2F{color:var(--button-invisible-iconColor-hover,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):active [data-kbd-chord]{background:var(--buttonKeybindingHint-invisible-bgColor-active,#818b9826);transition:80ms ease-out}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):disabled,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=invisible]):not([data-loading=true]){background-color:var(--button-invisible-bgColor-disabled,#ffffff00);border-color:var(--button-invisible-borderColor-disabled,#ffffff00);box-shadow:none;color:var(--button-invisible-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):disabled:not(.prc-Button-does-not-exist-3ns8K) [data-kbd-chord]{background:var(--buttonKeybindingHint-invisible-bgColor-disabled,#ffffff00);border-color:var(--buttonKeybindingHint-invisible-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-invisible-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=invisible]):not([data-loading=true]) [data-kbd-chord]{background:var(--buttonKeybindingHint-invisible-bgColor-disabled,#ffffff00);border-color:var(--buttonKeybindingHint-invisible-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-invisible-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]) .prc-Button-Visual-YNt2F{color:var(--button-invisible-iconColor-rest,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]) .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-invisible-bgColor-rest,#818b981f)!important}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]) [data-kbd-chord]{background:var(--buttonKeybindingHint-invisible-bgColor-rest,#eff2f5);border-color:var(--buttonKeybindingHint-invisible-borderColor-rest,#ffffff00);color:var(--buttonKeybindingHint-invisible-fgColor-rest,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):where(.prc-Button-IconButton-fyge7){color:var(--button-invisible-iconColor-rest,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]){border:unset;border-radius:0;color:var(--fgColor-link,#0969da);display:inline-flex;font-size:inherit;height:unset;min-width:-moz-fit-content;min-width:fit-content;padding:0;text-align:left}.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):hover:not(:disabled,[data-inactive]){-webkit-text-decoration:underline;text-decoration:underline}.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):focus,.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):focus-visible{outline-offset:2px}.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):disabled,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=link]):not([data-loading=true]){background-color:transparent;border-color:transparent;color:var(--control-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]) .prc-Button-Label-FWkx3{white-space:unset}.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):where([data-inactive]){background:transparent!important;color:var(--button-inactive-fgColor,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]) .prc-Button-Visual-YNt2F{color:var(--fgColor-link,#0969da)}[data-a11y-link-underlines=true] .prc-Button-ButtonBase-9n-Xk[data-no-visuals]:where([data-variant=link]){-webkit-text-decoration:underline;text-decoration:underline}[data-a11y-link-underlines=true] .prc-Button-ButtonBase-9n-Xk[data-no-visuals]:where([data-variant=link]):hover{-webkit-text-decoration:none;text-decoration:none}[data-a11y-link-underlines=true] .prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):not([data-no-visuals]){background-image:linear-gradient(90deg,currentColor,currentColor);background-position:0 calc(100% - 2px);background-repeat:no-repeat;background-size:100% 1.5px}[data-a11y-link-underlines=true] .prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):not([data-no-visuals]):hover{-webkit-text-decoration:none;text-decoration:none}[data-a11y-link-underlines=false] .prc-Button-ButtonBase-9n-Xk[data-no-visuals]:where([data-variant=link]){background-image:none;-webkit-text-decoration:none;text-decoration:none}[data-a11y-link-underlines=false] .prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):not([data-no-visuals]){background-image:none}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]),.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):active,.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):hover{background-color:var(--button-inactive-bgColor,#e6eaef);border-color:var(--button-inactive-bgColor,#e6eaef);box-shadow:none;color:var(--button-inactive-fgColor,#59636e);cursor:auto}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):not(.prc-Button-does-not-exist-3ns8K) .prc-Button-Visual-YNt2F{color:inherit!important}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):hover .prc-Button-Visual-YNt2F{color:inherit!important}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):active .prc-Button-Visual-YNt2F{color:inherit!important}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):not(.prc-Button-does-not-exist-3ns8K) .prc-Button-CounterLabel-5hAs4{color:inherit!important}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):hover .prc-Button-CounterLabel-5hAs4{color:inherit!important}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):active .prc-Button-CounterLabel-5hAs4{color:inherit!important}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):not(.prc-Button-does-not-exist-3ns8K) [data-kbd-chord]{background:var(--buttonKeybindingHint-inactive-bgColor,#eff2f5);border-color:var(--buttonKeybindingHint-inactive-borderColor,#d1d9e0b3);color:var(--buttonKeybindingHint-inactive-fgColor,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):hover [data-kbd-chord]{background:var(--buttonKeybindingHint-inactive-bgColor,#eff2f5);border-color:var(--buttonKeybindingHint-inactive-borderColor,#d1d9e0b3);color:var(--buttonKeybindingHint-inactive-fgColor,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):active [data-kbd-chord]{background:var(--buttonKeybindingHint-inactive-bgColor,#eff2f5);border-color:var(--buttonKeybindingHint-inactive-borderColor,#d1d9e0b3);color:var(--buttonKeybindingHint-inactive-fgColor,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-icon-only-counter]){padding-inline:var(--control-medium-paddingInline-condensed,.5rem)}.prc-Button-ButtonBase-9n-Xk:where([data-icon-only-counter]):where([data-size=small]){padding-inline:var(--control-xsmall-paddingInline-condensed,.25rem)}.prc-Button-ButtonBase-9n-Xk:where([data-icon-only-counter]):where([data-size=large]){padding-inline:var(--control-large-paddingInline-normal,.75rem)}.prc-Button-ConditionalWrapper-Rvbgb{display:block}.prc-Button-ConditionalWrapperLink-d0qv7{display:inline-flex}[data-kbd-chord]{transition:80ms ease-in;transition-property:color,background-color,border-color}
|
|
2
|
+
/*# sourceMappingURL=ButtonBase-b44e29d1.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Button/ButtonBase.module.css.js","../../postcss-preset-primer/src/mixins/focusOutline.css","../../postcss-preset-primer/src/mixins/focusOutlineOnEmphasis.css"],"names":[],"mappings":"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","file":"ButtonBase-b44e29d1.css","sourcesContent":["/* Base styles */\n.ButtonBase {\n display: flex;\n min-width: max-content;\n height: var(--control-medium-size);\n /* stylelint-disable-next-line primer/spacing */\n padding: 0 var(--control-medium-paddingInline-normal);\n font-family: inherit;\n font-size: var(--text-body-size-medium);\n font-weight: var(--base-text-weight-medium);\n color: var(--button-default-fgColor-rest);\n text-align: center;\n text-decoration: none;\n cursor: pointer;\n user-select: none;\n background-color: transparent;\n border: var(--borderWidth-thin) solid;\n border-color: var(--button-default-borderColor-rest);\n border-radius: var(--borderRadius-medium);\n transition: 80ms cubic-bezier(0.65, 0, 0.35, 1);\n transition-property: color, fill, background-color, border-color;\n appearance: none;\n align-items: center;\n justify-content: space-between;\n gap: var(--base-size-8);\n\n /* stylelint-disable-next-line selector-pseudo-class-disallowed-list -- scoped to CSS Module, audited (github/github-ui#17224) */\n &:has([data-kbd-chord]) {\n padding-inline-end: var(--base-size-6);\n }\n\n &:hover {\n transition-duration: 80ms;\n }\n\n &:focus-visible {\n @mixin focusOutline;\n }\n\n &:active {\n transition: none;\n }\n\n &:where([data-notification-indicator='button'], [data-notification-indicator='icon'].IconButton) {\n position: relative;\n }\n\n &:where([data-notification-indicator='leadingVisual']) .LeadingVisual {\n position: relative;\n }\n\n &:where([data-notification-indicator='button'])::before,\n &:where([data-notification-indicator='icon'].IconButton)::before,\n &:where([data-notification-indicator='leadingVisual']) .LeadingVisual::before {\n position: absolute;\n display: block;\n width: var(--base-size-8);\n height: var(--base-size-8);\n content: '';\n /* stylelint-disable-next-line primer/colors */\n background-color: var(--fgColor-accent);\n border-radius: var(--borderRadius-full);\n /* stylelint-disable-next-line primer/box-shadow */\n box-shadow: 0 0 0 calc(var(--base-size-4) / 2) var(--bgColor-inset);\n }\n\n &:where([data-notification-indicator='button'])::before {\n top: calc(var(--base-size-4) / -2);\n right: calc(var(--base-size-4) / -2);\n }\n\n &:where([data-notification-indicator='icon'].IconButton)::before {\n top: calc(50% - var(--base-size-12));\n right: calc(50% - var(--base-size-12));\n }\n\n &:where([data-notification-indicator='leadingVisual']) .LeadingVisual::before {\n top: calc(var(--base-size-4) * -1);\n right: calc(var(--base-size-4) * -1);\n }\n\n &:disabled,\n &[aria-disabled='true']:not([data-loading='true']) {\n cursor: not-allowed;\n box-shadow: none;\n\n & .Visual,\n & .CounterLabel {\n color: inherit;\n }\n }\n\n @media (forced-colors: active) {\n &:focus {\n outline: solid 1px transparent;\n }\n }\n\n /* Visuals */\n & :where(.Visual) {\n display: flex;\n color: var(--fgColor-muted);\n pointer-events: none;\n }\n\n /* mostly for CounterLabel */\n & :where(.VisualWrap) {\n display: flex;\n pointer-events: none;\n }\n\n /* IconButton */\n\n &:where(.IconButton) {\n display: inline-grid;\n width: var(--control-medium-size);\n min-width: unset;\n /* stylelint-disable-next-line primer/spacing */\n padding: unset;\n place-content: center;\n flex-shrink: 0;\n\n &:where([data-size='small']) {\n width: var(--control-small-size);\n }\n\n &:where([data-size='large']) {\n width: var(--control-large-size);\n }\n }\n\n /* LinkButton */\n\n &:where([href]) {\n display: inline-flex;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n /* Button layout */\n\n & :where(.ButtonContent) {\n flex: 1 0 auto;\n display: grid;\n grid-template-areas: 'leadingVisual text trailingVisual';\n grid-template-columns: min-content minmax(0, auto) min-content;\n align-items: center;\n align-content: center;\n\n & > :not(:last-child) {\n margin-right: var(--base-size-8);\n }\n\n /* Content alignment */\n\n &:where([data-align='center']) {\n justify-content: center;\n }\n\n &:where([data-align='start']) {\n justify-content: flex-start;\n }\n }\n\n & :where([data-component='leadingVisual']) {\n grid-area: leadingVisual;\n }\n\n & :where(.Label) {\n line-height: var(--text-body-lineHeight-medium);\n white-space: nowrap;\n grid-area: text;\n }\n\n & :where([data-component='trailingVisual']) {\n grid-area: trailingVisual;\n }\n\n & :where([data-component='trailingAction']) {\n margin-right: calc(var(--base-size-4) * -1);\n }\n\n /* Size */\n\n &:where([data-size='small']) {\n height: var(--control-small-size);\n /* stylelint-disable-next-line primer/spacing */\n padding: 0 var(--control-small-paddingInline-condensed);\n gap: var(--control-small-gap);\n font-size: var(--text-body-size-small);\n\n & .ButtonContent > :not(:last-child) {\n /* stylelint-disable-next-line primer/spacing */\n margin-right: var(--control-small-gap);\n }\n\n & .Label {\n line-height: var(--text-body-lineHeight-small);\n }\n }\n\n &:where([data-size='large']) {\n height: var(--control-large-size);\n /* stylelint-disable-next-line primer/spacing */\n padding: 0 var(--control-large-paddingInline-spacious);\n gap: var(--control-large-gap);\n\n & .ButtonContent > :not(:last-child) {\n /* stylelint-disable-next-line primer/spacing */\n margin-right: var(--control-large-gap);\n }\n\n /* stylelint-disable-next-line selector-pseudo-class-disallowed-list -- scoped to CSS Module, audited (github/github-ui#17224) */\n &:has([data-kbd-chord]) {\n padding-inline-end: var(--base-size-8);\n }\n }\n\n /* Full width */\n\n &:where([data-block='block']) {\n width: 100%;\n }\n\n /* Wrap label text */\n\n &:where([data-label-wrap='true']) {\n min-width: fit-content;\n height: unset;\n min-height: var(--control-medium-size);\n\n & .ButtonContent {\n flex: 1 1 auto;\n align-self: stretch;\n /* stylelint-disable-next-line primer/spacing */\n padding-block: calc(var(--control-medium-paddingBlock) - var(--base-size-2));\n }\n\n & .Label {\n /* stylelint-disable-next-line declaration-property-value-keyword-no-deprecated */\n word-break: break-word;\n white-space: unset;\n }\n\n &:where([data-size='small']) {\n height: unset;\n min-height: var(--control-small-size);\n\n & .ButtonContent {\n /* stylelint-disable-next-line primer/spacing */\n padding-block: calc(var(--control-small-paddingBlock) - var(--base-size-2));\n }\n }\n\n &:where([data-size='large']) {\n height: unset;\n min-height: var(--control-large-size);\n /* stylelint-disable-next-line primer/spacing */\n padding-inline: var(--control-large-paddingInline-spacious);\n\n & .ButtonContent {\n /* stylelint-disable-next-line primer/spacing */\n padding-block: calc(var(--control-large-paddingBlock) - var(--base-size-2));\n }\n }\n }\n\n /* Loading */\n\n /* only hide label if there's no leading/trailing visuals\n * move spinner to label spot if not leading/trailing visuals\n */\n\n &:where([data-loading='true']) {\n &\n .LoadingSpinner:not(\n [data-component='leadingVisual'],\n [data-component='trailingVisual'],\n [data-component='trailingAction']\n ) {\n grid-area: text;\n margin-right: 0 !important;\n place-self: center;\n\n & + .Label {\n visibility: hidden;\n }\n }\n }\n\n /* Styles for the spinner element displayed when the Button is in a loading state.\n * Ensures the spinner is centered within its container. */\n .LoadingSpinner {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Default Variant */\n\n &:where([data-variant='default']) {\n color: var(--button-default-fgColor-rest);\n background-color: var(--button-default-bgColor-rest);\n box-shadow: var(--button-default-shadow-resting);\n\n &[aria-expanded='true'] {\n background-color: var(--button-default-bgColor-active);\n border-color: var(--button-default-borderColor-active);\n }\n\n &:hover {\n background-color: var(--button-default-bgColor-hover);\n border-color: var(--button-default-borderColor-hover);\n }\n\n &:active {\n background-color: var(--button-default-bgColor-active);\n border-color: var(--button-default-borderColor-active);\n }\n\n &:disabled,\n &[aria-disabled='true']:not([data-loading='true']) {\n color: var(--control-fgColor-disabled);\n background-color: var(--button-default-bgColor-disabled);\n border-color: var(--button-default-borderColor-disabled);\n box-shadow: none;\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-default-bgColor-disabled);\n color: var(--buttonKeybindingHint-default-fgColor-disabled);\n border-color: var(--buttonKeybindingHint-default-borderColor-disabled);\n }\n }\n\n & .CounterLabel {\n background-color: var(--buttonCounter-default-bgColor-rest) !important; /* temporarily override our own sx prop */\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-default-bgColor-rest);\n color: var(--buttonKeybindingHint-default-fgColor-rest);\n border-color: var(--buttonKeybindingHint-default-borderColor-rest);\n }\n\n &:where(.IconButton) {\n color: var(--fgColor-muted);\n }\n }\n\n /* Primary variant */\n\n &:where([data-variant='primary']) {\n color: var(--button-primary-fgColor-rest);\n background-color: var(--button-primary-bgColor-rest);\n border-color: var(--button-primary-borderColor-rest);\n box-shadow: var(--shadow-resting-small);\n\n &[aria-expanded='true'] {\n background-color: var(--button-primary-bgColor-active);\n box-shadow: var(--button-primary-shadow-selected);\n }\n\n &:hover {\n background-color: var(--button-primary-bgColor-hover);\n border-color: var(--button-primary-borderColor-hover);\n }\n\n &:focus-visible {\n @mixin focusOutlineOnEmphasis;\n }\n\n &:active {\n background-color: var(--button-primary-bgColor-active);\n box-shadow: var(--button-primary-shadow-selected);\n }\n\n &:disabled,\n &[aria-disabled='true']:not([data-loading='true']) {\n color: var(--button-primary-fgColor-disabled);\n background-color: var(--button-primary-bgColor-disabled);\n border-color: var(--button-primary-borderColor-disabled);\n box-shadow: none;\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-primary-bgColor-disabled);\n color: var(--buttonKeybindingHint-primary-fgColor-disabled);\n border-color: var(--buttonKeybindingHint-primary-borderColor-disabled);\n }\n }\n\n & .CounterLabel {\n color: var(--button-primary-fgColor-rest) !important; /* temporarily override our own sx prop */\n background-color: var(--buttonCounter-primary-bgColor-rest) !important; /* temporarily override our own sx prop */\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-primary-bgColor-rest);\n color: var(--buttonKeybindingHint-primary-fgColor-rest);\n border-color: var(--buttonKeybindingHint-primary-borderColor-rest);\n }\n\n /* temporarily using the fgColor to match legacy and reduce visual changes- will eventually be iconColor */\n & .Visual {\n color: var(--button-primary-fgColor-rest);\n }\n }\n\n /* Danger variant */\n\n &:where([data-variant='danger']) {\n color: var(--button-danger-fgColor-rest);\n background-color: var(--button-danger-bgColor-rest);\n box-shadow: var(--button-default-shadow-resting);\n\n &[aria-expanded='true'] {\n color: var(--button-danger-fgColor-active);\n background-color: var(--button-danger-bgColor-active);\n border-color: var(--button-danger-borderColor-active);\n box-shadow: var(--button-danger-shadow-selected);\n\n & .Visual {\n color: var(--button-danger-iconColor-hover);\n }\n }\n\n &:hover {\n color: var(--button-danger-fgColor-hover);\n background-color: var(--button-danger-bgColor-hover);\n border-color: var(--button-danger-borderColor-hover);\n box-shadow: var(--shadow-resting-small);\n\n & .CounterLabel {\n color: var(--buttonCounter-danger-fgColor-hover) !important; /* temporarily override our own sx prop */\n background-color: var(--buttonCounter-danger-bgColor-hover) !important;\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-danger-bgColor-hover);\n color: var(--buttonKeybindingHint-danger-fgColor-hover);\n border-color: var(--buttonKeybindingHint-danger-borderColor-hover);\n transition: 80ms ease-out;\n }\n\n & .Visual {\n color: var(--button-danger-iconColor-hover);\n }\n }\n\n &:active {\n color: var(--button-danger-fgColor-active);\n background-color: var(--button-danger-bgColor-active);\n border-color: var(--button-danger-borderColor-active);\n box-shadow: var(--button-danger-shadow-selected);\n\n & .CounterLabel {\n color: var(--buttonCounter-danger-fgColor-hover) !important; /* temporarily override our own sx prop */\n background-color: var(--buttonCounter-danger-bgColor-hover) !important;\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-danger-bgColor-active);\n color: var(--buttonKeybindingHint-danger-fgColor-active);\n border-color: var(--buttonKeybindingHint-danger-borderColor-active);\n transition: 80ms ease-out;\n }\n\n & .Visual {\n color: var(--button-danger-iconColor-hover);\n }\n }\n\n &:disabled,\n &[aria-disabled='true']:not([data-loading='true']) {\n color: var(--button-danger-fgColor-disabled);\n background-color: var(--button-danger-bgColor-disabled);\n border-color: var(--button-default-borderColor-disabled);\n box-shadow: none;\n\n & .CounterLabel {\n color: var(--buttonCounter-danger-fgColor-disabled) !important; /* temporarily override our own sx prop */\n background-color: var(--buttonCounter-danger-bgColor-disabled) !important;\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-danger-bgColor-disabled);\n color: var(--buttonKeybindingHint-danger-fgColor-disabled);\n border-color: var(--buttonKeybindingHint-danger-borderColor-disabled);\n }\n }\n\n & .CounterLabel {\n color: var(--buttonCounter-danger-fgColor-rest) !important; /* temporarily override our own sx prop */\n background-color: var(--buttonCounter-danger-bgColor-rest) !important;\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-danger-bgColor-rest);\n color: var(--buttonKeybindingHint-danger-fgColor-rest);\n border-color: var(--buttonKeybindingHint-danger-borderColor-rest);\n }\n\n & .Visual {\n color: var(--button-danger-iconColor-rest);\n }\n }\n\n /* Invisible variant */\n\n &:where([data-variant='invisible']) {\n color: var(--button-default-fgColor-rest);\n border-color: var(--button-invisible-borderColor-rest);\n box-shadow: none;\n\n &[aria-expanded='true'] {\n background-color: var(--button-invisible-bgColor-active);\n }\n\n &:hover {\n background-color: var(--button-invisible-bgColor-hover);\n border-color: var(--button-invisible-borderColor-hover);\n\n & .Visual {\n color: var(--button-invisible-iconColor-hover);\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-invisible-bgColor-hover);\n transition: 80ms ease-out;\n }\n }\n\n &:active {\n background-color: var(--button-invisible-bgColor-active);\n\n & .Visual {\n color: var(--button-invisible-iconColor-hover);\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-invisible-bgColor-active);\n transition: 80ms ease-out;\n }\n }\n\n &:disabled,\n &[aria-disabled='true']:not([data-loading='true']) {\n color: var(--button-invisible-fgColor-disabled);\n background-color: var(--button-invisible-bgColor-disabled);\n border-color: var(--button-invisible-borderColor-disabled);\n box-shadow: none;\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-invisible-bgColor-disabled);\n color: var(--buttonKeybindingHint-invisible-fgColor-disabled);\n border-color: var(--buttonKeybindingHint-invisible-borderColor-disabled);\n }\n }\n\n & .Visual {\n color: var(--button-invisible-iconColor-rest);\n }\n\n & .CounterLabel {\n background-color: var(--buttonCounter-invisible-bgColor-rest) !important;\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-invisible-bgColor-rest);\n color: var(--buttonKeybindingHint-invisible-fgColor-rest);\n border-color: var(--buttonKeybindingHint-invisible-borderColor-rest);\n }\n\n &:where(.IconButton) {\n color: var(--button-invisible-iconColor-rest);\n }\n }\n\n /* Link variant */\n\n &:where([data-variant='link']) {\n display: inline-flex;\n min-width: fit-content;\n height: unset;\n padding: 0;\n font-size: inherit;\n color: var(--fgColor-link);\n text-align: left;\n border: unset;\n border-radius: 0;\n\n &:hover:not(:disabled, [data-inactive]) {\n text-decoration: underline;\n }\n\n &:focus-visible,\n &:focus {\n outline-offset: 2px;\n }\n\n &:disabled,\n &[aria-disabled='true']:not([data-loading='true']) {\n color: var(--control-fgColor-disabled);\n background-color: transparent;\n border-color: transparent;\n }\n\n & .Label {\n white-space: unset;\n }\n\n &:where([data-inactive]) {\n color: var(--button-inactive-fgColor);\n background: transparent !important;\n }\n\n & .Visual {\n color: var(--fgColor-link);\n }\n }\n\n [data-a11y-link-underlines='true'] &:where([data-variant='link']) {\n &[data-no-visuals] {\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n &:not([data-no-visuals]) {\n background-image: linear-gradient(to right, currentColor, currentColor);\n background-size: 100% 1.5px;\n background-position: 0 calc(100% - 2px);\n background-repeat: no-repeat;\n\n &:hover {\n text-decoration: none;\n }\n }\n }\n\n [data-a11y-link-underlines='false'] &:where([data-variant='link']) {\n &[data-no-visuals] {\n text-decoration: none;\n background-image: none;\n }\n\n &:not([data-no-visuals]) {\n background-image: none;\n }\n }\n\n /* Inactive */\n\n &:where([data-inactive]),\n &:where([data-inactive]):hover,\n &:where([data-inactive]):active {\n color: var(--button-inactive-fgColor);\n cursor: auto;\n background-color: var(--button-inactive-bgColor);\n /* stylelint-disable-next-line primer/colors */\n border-color: var(--button-inactive-bgColor);\n box-shadow: none;\n\n & .Visual,\n & .CounterLabel {\n color: inherit !important;\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-inactive-bgColor);\n color: var(--buttonKeybindingHint-inactive-fgColor);\n border-color: var(--buttonKeybindingHint-inactive-borderColor);\n }\n }\n\n /* Icon-only + Counter */\n\n &:where([data-icon-only-counter]) {\n /* stylelint-disable-next-line primer/spacing */\n padding-inline: var(--control-medium-paddingInline-condensed);\n\n &:where([data-size='small']) {\n /* stylelint-disable-next-line primer/spacing */\n padding-inline: var(--control-xsmall-paddingInline-condensed);\n }\n\n &:where([data-size='large']) {\n /* stylelint-disable-next-line primer/spacing */\n padding-inline: var(--control-large-paddingInline-normal);\n }\n }\n}\n\n.ConditionalWrapper {\n display: block;\n}\n\n.ConditionalWrapperLink {\n display: inline-flex;\n}\n\n[data-kbd-chord] {\n transition: 80ms ease-in;\n transition-property: color, background-color, border-color;\n}\n","@define-mixin focusOutline $outlineOffset: -2px, $outlineColor: var(--focus-outline-color, var(--focus-outlineColor)) {\n outline: 2px solid $outlineColor;\n outline-offset: $outlineOffset;\n box-shadow: none;\n}\n","/* outline with fg box-shadow for buttons */\n@define-mixin focusOutlineOnEmphasis $outlineOffset: -2px,\n $outlineColor: var(--focus-outline-color, var(--focus-outlineColor)) {\n outline: 2px solid $outlineColor;\n outline-offset: $outlineOffset;\n /* stylelint-disable-next-line primer/box-shadow */\n box-shadow: inset 0 0 0 3px var(--fgColor-onEmphasis);\n}\n"]}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { ForwardRefComponent } from "../utils/polymorphic.js";
|
|
2
|
-
import { ButtonProps } from "./types.js";
|
|
2
|
+
import { ButtonProps, NotificationIndicatorPlacement } from "./types.js";
|
|
3
3
|
|
|
4
4
|
//#region src/Button/ButtonBase.d.ts
|
|
5
|
-
|
|
5
|
+
type ButtonBaseComponentProps = Omit<ButtonProps, 'notificationIndicator'> & {
|
|
6
|
+
notificationIndicator?: NotificationIndicatorPlacement;
|
|
7
|
+
};
|
|
8
|
+
declare const ButtonBase: ForwardRefComponent<"button" | "a", ButtonBaseComponentProps>;
|
|
6
9
|
//#endregion
|
|
7
10
|
export { ButtonBase };
|
|
@@ -13,18 +13,19 @@ import { isElement } from "react-is";
|
|
|
13
13
|
//#region src/Button/ButtonBase.tsx
|
|
14
14
|
const renderModuleVisual = (Visual, loading, visualName, counterLabel) => /*#__PURE__*/ jsx("span", {
|
|
15
15
|
"data-component": visualName,
|
|
16
|
-
className: clsx(!counterLabel && ButtonBase_module_css_default.Visual, loading ? ButtonBase_module_css_default.LoadingSpinner : ButtonBase_module_css_default.VisualWrap),
|
|
16
|
+
className: clsx(!counterLabel && ButtonBase_module_css_default.Visual, visualName === "leadingVisual" && ButtonBase_module_css_default.LeadingVisual, loading ? ButtonBase_module_css_default.LoadingSpinner : ButtonBase_module_css_default.VisualWrap),
|
|
17
17
|
children: loading ? /*#__PURE__*/ jsx(Spinner, { size: "small" }) : isElement(Visual) ? Visual : /*#__PURE__*/ jsx(Visual, {})
|
|
18
18
|
});
|
|
19
19
|
renderModuleVisual.displayName = "renderModuleVisual";
|
|
20
20
|
const ButtonBase = /*#__PURE__*/ forwardRef(({ children, as: Component = "button", ...props }, forwardedRef) => {
|
|
21
|
-
const { leadingVisual: LeadingVisual, trailingVisual: TrailingVisual, trailingAction: TrailingAction, ["aria-describedby"]: ariaDescribedBy, ["aria-labelledby"]: ariaLabelledBy, count, icon: Icon, id, variant = "default", size = "medium", alignContent = "center", block = false, loading, loadingAnnouncement = "Loading", inactive, onClick, labelWrap, className, ...rest } = props;
|
|
21
|
+
const { leadingVisual: LeadingVisual, trailingVisual: TrailingVisual, trailingAction: TrailingAction, ["aria-describedby"]: ariaDescribedBy, ["aria-labelledby"]: ariaLabelledBy, count, icon: Icon, id, variant = "default", size = "medium", alignContent = "center", block = false, loading, loadingAnnouncement = "Loading", inactive, onClick, labelWrap, notificationIndicator, className, ...rest } = props;
|
|
22
22
|
const innerRef = React.useRef(null);
|
|
23
23
|
const mergedRef = useMergedRefs(forwardedRef, innerRef);
|
|
24
24
|
const uuid = useId$1(id);
|
|
25
25
|
const loadingAnnouncementID = `${uuid}-loading-announcement`;
|
|
26
26
|
const ariaDescribedByIds = loading ? [loadingAnnouncementID, ariaDescribedBy] : [ariaDescribedBy];
|
|
27
27
|
{
|
|
28
|
+
if (notificationIndicator === "leadingVisual" && !LeadingVisual) console.warn("Button: `notificationIndicator=\"leadingVisual\"` requires a `leadingVisual` prop.");
|
|
28
29
|
const el = innerRef.current;
|
|
29
30
|
if (el && !(el instanceof HTMLButtonElement) && !(el instanceof HTMLAnchorElement) && !(el.tagName === "SUMMARY")) console.warn("This component should be an instanceof a semantic button or anchor");
|
|
30
31
|
}
|
|
@@ -45,6 +46,7 @@ const ButtonBase = /*#__PURE__*/ forwardRef(({ children, as: Component = "button
|
|
|
45
46
|
"data-size": size,
|
|
46
47
|
"data-variant": variant,
|
|
47
48
|
"data-label-wrap": labelWrap,
|
|
49
|
+
"data-notification-indicator": notificationIndicator,
|
|
48
50
|
"data-has-count": count !== void 0 ? true : void 0,
|
|
49
51
|
"data-icon-only-counter": count !== void 0 && LeadingVisual && !children ? true : void 0,
|
|
50
52
|
"aria-describedby": ariaDescribedByIds.filter((descriptionID) => Boolean(descriptionID)).join(" ") || void 0,
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import "./ButtonBase-
|
|
1
|
+
import "./ButtonBase-b44e29d1.css";
|
|
2
2
|
//#region src/Button/ButtonBase.module.css.js
|
|
3
3
|
var ButtonBase_module_css_default = {
|
|
4
4
|
"ButtonBase": "prc-Button-ButtonBase-9n-Xk",
|
|
5
|
+
"IconButton": "prc-Button-IconButton-fyge7",
|
|
6
|
+
"LeadingVisual": "prc-Button-LeadingVisual-UySKu",
|
|
5
7
|
"does-not-exist": "prc-Button-does-not-exist-3ns8K",
|
|
6
8
|
"CounterLabel": "prc-Button-CounterLabel-5hAs4",
|
|
7
9
|
"Visual": "prc-Button-Visual-YNt2F",
|
|
8
10
|
"VisualWrap": "prc-Button-VisualWrap-E4cnq",
|
|
9
|
-
"IconButton": "prc-Button-IconButton-fyge7",
|
|
10
11
|
"ButtonContent": "prc-Button-ButtonContent-Iohp5",
|
|
11
12
|
"Label": "prc-Button-Label-FWkx3",
|
|
12
13
|
"LoadingSpinner": "prc-Button-LoadingSpinner-6KfaT",
|
package/dist/Button/types.d.ts
CHANGED
|
@@ -6,6 +6,9 @@ import { IconProps } from "@primer/octicons-react";
|
|
|
6
6
|
type VariantType = 'default' | 'primary' | 'invisible' | 'danger' | 'link';
|
|
7
7
|
type Size = 'small' | 'medium' | 'large';
|
|
8
8
|
type AlignContent = 'start' | 'center';
|
|
9
|
+
type NotificationIndicatorPlacement = 'button' | 'leadingVisual' | 'icon';
|
|
10
|
+
type ButtonNotificationIndicatorPlacement = Exclude<NotificationIndicatorPlacement, 'icon'>;
|
|
11
|
+
type IconButtonNotificationIndicatorPlacement = Exclude<NotificationIndicatorPlacement, 'leadingVisual'>;
|
|
9
12
|
type ButtonA11yProps = {
|
|
10
13
|
'aria-label': string;
|
|
11
14
|
'aria-labelledby'?: undefined;
|
|
@@ -69,9 +72,20 @@ type ButtonProps = {
|
|
|
69
72
|
trailingAction?: React.ElementType | null;
|
|
70
73
|
children?: React.ReactNode;
|
|
71
74
|
count?: number | string;
|
|
75
|
+
/**
|
|
76
|
+
* Displays a visual indicator for new activity on the button boundary or leading visual.
|
|
77
|
+
* The `leadingVisual` placement requires the `leadingVisual` prop. Consumers are responsible
|
|
78
|
+
* for communicating the indicator's meaning through an accessible label or description.
|
|
79
|
+
*/
|
|
80
|
+
notificationIndicator?: ButtonNotificationIndicatorPlacement;
|
|
72
81
|
} & ButtonBaseProps;
|
|
73
82
|
type IconButtonProps = ButtonA11yProps & {
|
|
74
83
|
icon: React.ElementType;
|
|
84
|
+
/**
|
|
85
|
+
* Displays a visual indicator for new activity on the button boundary or icon. Consumers are
|
|
86
|
+
* responsible for communicating the indicator's meaning through an accessible label or description.
|
|
87
|
+
*/
|
|
88
|
+
notificationIndicator?: IconButtonNotificationIndicatorPlacement;
|
|
75
89
|
unsafeDisableTooltip?: boolean;
|
|
76
90
|
description?: string;
|
|
77
91
|
tooltipDirection?: TooltipDirection; /** @deprecated Use `keybindingHint` instead. */
|
|
@@ -90,4 +104,4 @@ type LinkButtonProps = {
|
|
|
90
104
|
referrerPolicy?: React.AnchorHTMLAttributes<HTMLAnchorElement>['referrerPolicy'];
|
|
91
105
|
};
|
|
92
106
|
//#endregion
|
|
93
|
-
export { AlignContent, ButtonBaseProps, ButtonProps, IconButtonProps, LinkButtonProps, Size, VariantType };
|
|
107
|
+
export { AlignContent, ButtonBaseProps, ButtonProps, IconButtonProps, LinkButtonProps, NotificationIndicatorPlacement, Size, VariantType };
|
|
@@ -8,7 +8,8 @@ const DefaultFeatureFlags = FeatureFlagScope.create({
|
|
|
8
8
|
primer_react_action_list_group_heading_trailing_action: false,
|
|
9
9
|
primer_react_action_list_item_gap: false,
|
|
10
10
|
primer_react_timeline_list_semantics: false,
|
|
11
|
-
primer_react_merged_forwarded_refs: false
|
|
11
|
+
primer_react_merged_forwarded_refs: false,
|
|
12
|
+
primer_react_underline_panels_controlled: false
|
|
12
13
|
});
|
|
13
14
|
//#endregion
|
|
14
15
|
export { DefaultFeatureFlags };
|
|
@@ -118,6 +118,7 @@ declare const SelectPanel: typeof Panel & {
|
|
|
118
118
|
trailingAction?: React.ElementType | null;
|
|
119
119
|
children?: React.ReactNode;
|
|
120
120
|
count?: number | string;
|
|
121
|
+
notificationIndicator?: "button" | "leadingVisual";
|
|
121
122
|
} & {
|
|
122
123
|
variant?: VariantType;
|
|
123
124
|
size?: Size;
|
|
@@ -58,6 +58,7 @@ declare const SelectPanel: React.FC<SelectPanelProps> & {
|
|
|
58
58
|
trailingAction?: React.ElementType | null;
|
|
59
59
|
children?: React.ReactNode;
|
|
60
60
|
count?: number | string;
|
|
61
|
+
notificationIndicator?: "button" | "leadingVisual";
|
|
61
62
|
} & {
|
|
62
63
|
variant?: VariantType;
|
|
63
64
|
size?: Size;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import useIsomorphicLayoutEffect from "../../utils/useIsomorphicLayoutEffect.js";
|
|
2
|
+
import { useFeatureFlag } from "../../FeatureFlags/useFeatureFlag.js";
|
|
2
3
|
import { useControllableState } from "../../hooks/useControllableState.js";
|
|
3
4
|
import { TabsContext } from "./TabsContext.js";
|
|
4
5
|
import { c } from "react-compiler-runtime";
|
|
@@ -13,11 +14,13 @@ import React, { useId } from "react";
|
|
|
13
14
|
* The `Tab`, `TabList`, and `TabPanel` components are provided for convenience to showcase the API & implementation.
|
|
14
15
|
*/
|
|
15
16
|
function Tabs(props) {
|
|
16
|
-
var _props$id, _props$defaultValue;
|
|
17
|
-
const $ = c(
|
|
17
|
+
var _props$id, _props$activationMode, _props$defaultValue;
|
|
18
|
+
const $ = c(16);
|
|
18
19
|
const { children, onValueChange } = props;
|
|
19
20
|
const generatedId = useId();
|
|
20
21
|
const groupId = (_props$id = props.id) !== null && _props$id !== void 0 ? _props$id : generatedId;
|
|
22
|
+
const controlledApiEnabled = useFeatureFlag("primer_react_underline_panels_controlled");
|
|
23
|
+
const activationMode = controlledApiEnabled ? (_props$activationMode = props.activationMode) !== null && _props$activationMode !== void 0 ? _props$activationMode : "automatic" : "automatic";
|
|
21
24
|
const t0 = (_props$defaultValue = props.defaultValue) !== null && _props$defaultValue !== void 0 ? _props$defaultValue : props.value;
|
|
22
25
|
let t1;
|
|
23
26
|
if ($[0] !== props.value || $[1] !== t0) {
|
|
@@ -31,49 +34,60 @@ function Tabs(props) {
|
|
|
31
34
|
$[2] = t1;
|
|
32
35
|
} else t1 = $[2];
|
|
33
36
|
const [selectedValue, setSelectedValue] = useControllableState(t1);
|
|
37
|
+
const [focusedValue, setFocusedValue] = React.useState();
|
|
34
38
|
const savedOnValueChange = React.useRef(onValueChange);
|
|
35
39
|
let t2;
|
|
36
|
-
if ($[3] !==
|
|
40
|
+
if ($[3] !== activationMode || $[4] !== controlledApiEnabled || $[5] !== focusedValue || $[6] !== groupId || $[7] !== selectedValue || $[8] !== setSelectedValue) {
|
|
37
41
|
t2 = {
|
|
38
42
|
groupId,
|
|
39
43
|
selectedValue,
|
|
44
|
+
activationMode,
|
|
45
|
+
focusedValue,
|
|
40
46
|
selectTab(value) {
|
|
41
47
|
var _savedOnValueChange$c;
|
|
48
|
+
setFocusedValue(void 0);
|
|
49
|
+
if (controlledApiEnabled && value === selectedValue) return;
|
|
42
50
|
setSelectedValue(value);
|
|
43
51
|
(_savedOnValueChange$c = savedOnValueChange.current) === null || _savedOnValueChange$c === void 0 || _savedOnValueChange$c.call(savedOnValueChange, { value });
|
|
52
|
+
},
|
|
53
|
+
focusTab(value_0) {
|
|
54
|
+
setFocusedValue(value_0);
|
|
44
55
|
}
|
|
45
56
|
};
|
|
46
|
-
$[3] =
|
|
47
|
-
$[4] =
|
|
48
|
-
$[5] =
|
|
49
|
-
$[6] =
|
|
50
|
-
|
|
57
|
+
$[3] = activationMode;
|
|
58
|
+
$[4] = controlledApiEnabled;
|
|
59
|
+
$[5] = focusedValue;
|
|
60
|
+
$[6] = groupId;
|
|
61
|
+
$[7] = selectedValue;
|
|
62
|
+
$[8] = setSelectedValue;
|
|
63
|
+
$[9] = t2;
|
|
64
|
+
} else t2 = $[9];
|
|
51
65
|
const contextValue = t2;
|
|
52
66
|
let t3;
|
|
53
67
|
let t4;
|
|
54
|
-
if ($[
|
|
68
|
+
if ($[10] !== onValueChange) {
|
|
55
69
|
t3 = () => {
|
|
56
70
|
savedOnValueChange.current = onValueChange;
|
|
57
71
|
};
|
|
58
72
|
t4 = [onValueChange];
|
|
59
|
-
$[
|
|
60
|
-
$[
|
|
61
|
-
$[
|
|
73
|
+
$[10] = onValueChange;
|
|
74
|
+
$[11] = t3;
|
|
75
|
+
$[12] = t4;
|
|
62
76
|
} else {
|
|
63
|
-
t3 = $[
|
|
64
|
-
t4 = $[
|
|
77
|
+
t3 = $[11];
|
|
78
|
+
t4 = $[12];
|
|
65
79
|
}
|
|
66
80
|
useIsomorphicLayoutEffect(t3, t4);
|
|
67
81
|
let t5;
|
|
68
|
-
if ($[
|
|
82
|
+
if ($[13] !== children || $[14] !== contextValue) {
|
|
69
83
|
t5 = /*#__PURE__*/ jsx(TabsContext.Provider, {
|
|
70
84
|
value: contextValue,
|
|
71
85
|
children
|
|
72
86
|
});
|
|
73
|
-
$[
|
|
74
|
-
$[
|
|
75
|
-
$[
|
|
76
|
-
} else t5 = $[
|
|
87
|
+
$[13] = children;
|
|
88
|
+
$[14] = contextValue;
|
|
89
|
+
$[15] = t5;
|
|
90
|
+
} else t5 = $[15];
|
|
77
91
|
return t5;
|
|
78
92
|
}
|
|
79
93
|
//#endregion
|
|
@@ -51,6 +51,12 @@ type CommonTabsProps = {
|
|
|
51
51
|
* unique id is generated automatically.
|
|
52
52
|
*/
|
|
53
53
|
id?: string;
|
|
54
|
+
/**
|
|
55
|
+
* `'automatic'` (default) selects on focus, so Arrow/Home/End keys select immediately. `'manual'`
|
|
56
|
+
* only moves focus; selection commits on Enter/Space/click. Prefer `'manual'` when displaying a
|
|
57
|
+
* panel is not instant (e.g. it triggers a network request).
|
|
58
|
+
*/
|
|
59
|
+
activationMode?: 'automatic' | 'manual';
|
|
54
60
|
};
|
|
55
61
|
type TabsProps = PropsWithChildren<(ControlledTabsProps | UncontrolledTabsProps) & CommonTabsProps>;
|
|
56
62
|
type Label = {
|
|
@@ -12,6 +12,7 @@ function useTab(props) {
|
|
|
12
12
|
const selected = tabs.selectedValue === value;
|
|
13
13
|
const id = `${tabs.groupId}-tab-${value}`;
|
|
14
14
|
const panelId = `${tabs.groupId}-panel-${value}`;
|
|
15
|
+
const isTabStop = tabs.activationMode === "manual" && tabs.focusedValue !== void 0 ? tabs.focusedValue === value : selected;
|
|
15
16
|
let t0;
|
|
16
17
|
if ($[0] !== tabs || $[1] !== value) {
|
|
17
18
|
t0 = function onKeyDown(event) {
|
|
@@ -37,6 +38,10 @@ function useTab(props) {
|
|
|
37
38
|
let t2;
|
|
38
39
|
if ($[7] !== disabled || $[8] !== selected || $[9] !== tabs || $[10] !== value) {
|
|
39
40
|
t2 = function onFocus() {
|
|
41
|
+
if (tabs.activationMode === "manual") {
|
|
42
|
+
if (!disabled) tabs.focusTab(value);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
40
45
|
if (!selected && !disabled) tabs.selectTab(value);
|
|
41
46
|
};
|
|
42
47
|
$[7] = disabled;
|
|
@@ -47,7 +52,7 @@ function useTab(props) {
|
|
|
47
52
|
} else t2 = $[11];
|
|
48
53
|
const onFocus = t2;
|
|
49
54
|
const t3 = disabled ? true : void 0;
|
|
50
|
-
const t4 =
|
|
55
|
+
const t4 = isTabStop ? 0 : -1;
|
|
51
56
|
let t5;
|
|
52
57
|
if ($[12] !== id || $[13] !== onFocus || $[14] !== onKeyDown || $[15] !== onMouseDown || $[16] !== panelId || $[17] !== selected || $[18] !== t3 || $[19] !== t4) {
|
|
53
58
|
t5 = { tabProps: {
|
|
@@ -5,20 +5,29 @@ import { c } from "react-compiler-runtime";
|
|
|
5
5
|
import { useRef } from "react";
|
|
6
6
|
//#region src/experimental/Tabs/useTabList.ts
|
|
7
7
|
function useTabList(props) {
|
|
8
|
-
const $ = c(
|
|
8
|
+
const $ = c(10);
|
|
9
9
|
const { "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, "aria-orientation": ariaOrientation } = props;
|
|
10
10
|
const mergedRefEnabled = useFeatureFlag("primer_react_merged_forwarded_refs");
|
|
11
|
+
const controlledApiEnabled = useFeatureFlag("primer_react_underline_panels_controlled");
|
|
11
12
|
const tabListRef = useRef(null);
|
|
12
13
|
const mergedRef = useMergedRefs(tabListRef, props.ref);
|
|
13
14
|
const providedOrCreatedRef = useProvidedRefOrCreate(props.ref);
|
|
14
15
|
const readRef = mergedRefEnabled ? tabListRef : providedOrCreatedRef;
|
|
15
16
|
const appliedRef = mergedRefEnabled ? mergedRef : providedOrCreatedRef;
|
|
16
17
|
let t0;
|
|
17
|
-
if ($[0] !== ariaOrientation || $[1] !== readRef) {
|
|
18
|
+
if ($[0] !== ariaOrientation || $[1] !== controlledApiEnabled || $[2] !== readRef) {
|
|
18
19
|
t0 = (event) => {
|
|
19
20
|
const { current: tablist } = readRef;
|
|
20
21
|
if (tablist === null) return;
|
|
21
22
|
const tabs = getFocusableTabs(tablist);
|
|
23
|
+
const getCurrentIndex = () => {
|
|
24
|
+
if (controlledApiEnabled) {
|
|
25
|
+
const activeElement = tablist.ownerDocument.activeElement;
|
|
26
|
+
const focusedIndex = activeElement instanceof HTMLElement ? tabs.indexOf(activeElement) : -1;
|
|
27
|
+
if (focusedIndex !== -1) return focusedIndex;
|
|
28
|
+
}
|
|
29
|
+
return tabs.findIndex(_temp);
|
|
30
|
+
};
|
|
22
31
|
const isVertical = ariaOrientation === "vertical";
|
|
23
32
|
const nextKey = isVertical ? "ArrowDown" : "ArrowRight";
|
|
24
33
|
const prevKey = isVertical ? "ArrowUp" : "ArrowLeft";
|
|
@@ -27,13 +36,13 @@ function useTabList(props) {
|
|
|
27
36
|
event.stopPropagation();
|
|
28
37
|
}
|
|
29
38
|
if (event.key === nextKey) {
|
|
30
|
-
const
|
|
31
|
-
if (
|
|
32
|
-
tabs[(
|
|
39
|
+
const currentTabIndex = getCurrentIndex();
|
|
40
|
+
if (currentTabIndex === -1) return;
|
|
41
|
+
tabs[(currentTabIndex + 1) % tabs.length].focus();
|
|
33
42
|
} else if (event.key === prevKey) {
|
|
34
|
-
const
|
|
35
|
-
if (
|
|
36
|
-
tabs[(tabs.length +
|
|
43
|
+
const currentTabIndex_0 = getCurrentIndex();
|
|
44
|
+
if (currentTabIndex_0 === -1) return;
|
|
45
|
+
tabs[(tabs.length + currentTabIndex_0 - 1) % tabs.length].focus();
|
|
37
46
|
} else if (event.key === "Home") {
|
|
38
47
|
if (tabs[0]) tabs[0].focus();
|
|
39
48
|
} else if (event.key === "End") {
|
|
@@ -41,13 +50,14 @@ function useTabList(props) {
|
|
|
41
50
|
}
|
|
42
51
|
};
|
|
43
52
|
$[0] = ariaOrientation;
|
|
44
|
-
$[1] =
|
|
45
|
-
$[2] =
|
|
46
|
-
|
|
53
|
+
$[1] = controlledApiEnabled;
|
|
54
|
+
$[2] = readRef;
|
|
55
|
+
$[3] = t0;
|
|
56
|
+
} else t0 = $[3];
|
|
47
57
|
const onKeyDown = t0;
|
|
48
58
|
const t1 = ariaOrientation !== null && ariaOrientation !== void 0 ? ariaOrientation : "horizontal";
|
|
49
59
|
let t2;
|
|
50
|
-
if ($[
|
|
60
|
+
if ($[4] !== appliedRef || $[5] !== ariaLabel || $[6] !== ariaLabelledby || $[7] !== onKeyDown || $[8] !== t1) {
|
|
51
61
|
t2 = { tabListProps: {
|
|
52
62
|
ref: appliedRef,
|
|
53
63
|
"aria-label": ariaLabel,
|
|
@@ -56,18 +66,15 @@ function useTabList(props) {
|
|
|
56
66
|
role: "tablist",
|
|
57
67
|
onKeyDown
|
|
58
68
|
} };
|
|
59
|
-
$[
|
|
60
|
-
$[
|
|
61
|
-
$[
|
|
62
|
-
$[
|
|
63
|
-
$[
|
|
64
|
-
$[
|
|
65
|
-
} else t2 = $[
|
|
69
|
+
$[4] = appliedRef;
|
|
70
|
+
$[5] = ariaLabel;
|
|
71
|
+
$[6] = ariaLabelledby;
|
|
72
|
+
$[7] = onKeyDown;
|
|
73
|
+
$[8] = t1;
|
|
74
|
+
$[9] = t2;
|
|
75
|
+
} else t2 = $[9];
|
|
66
76
|
return t2;
|
|
67
77
|
}
|
|
68
|
-
function _temp2(tab_0) {
|
|
69
|
-
return tab_0.getAttribute("aria-selected") === "true";
|
|
70
|
-
}
|
|
71
78
|
function _temp(tab) {
|
|
72
79
|
return tab.getAttribute("aria-selected") === "true";
|
|
73
80
|
}
|
|
@@ -16,6 +16,31 @@ type UnderlinePanelsProps = {
|
|
|
16
16
|
* ID of the element containing the name for the tab list
|
|
17
17
|
*/
|
|
18
18
|
'aria-labelledby'?: React.AriaAttributes['aria-labelledby'];
|
|
19
|
+
/**
|
|
20
|
+
* The value of the selected tab, keyed to each `UnderlinePanels.Tab`/`UnderlinePanels.Panel`
|
|
21
|
+
* `value`. Provide this (with `onChange`) for a controlled component where the selected tab is
|
|
22
|
+
* the single source of truth.
|
|
23
|
+
*/
|
|
24
|
+
value?: string;
|
|
25
|
+
/**
|
|
26
|
+
* The value of the tab that should be selected by default, keyed to each tab's `value`. Use this
|
|
27
|
+
* for an uncontrolled component. Cannot be combined with `value`.
|
|
28
|
+
*/
|
|
29
|
+
defaultValue?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Fires whenever the selected tab changes, for every selection method including arrow keys.
|
|
32
|
+
* Unlike `UnderlinePanels.Tab`'s `onSelect`, which only fires on click and Enter/Space.
|
|
33
|
+
*/
|
|
34
|
+
onChange?: ({
|
|
35
|
+
value
|
|
36
|
+
}: {
|
|
37
|
+
value: string;
|
|
38
|
+
}) => void;
|
|
39
|
+
/**
|
|
40
|
+
* `'automatic'` (default) selects on focus/arrow keys; `'manual'` only moves focus until
|
|
41
|
+
* Enter/Space/click. Prefer `'manual'` when displaying a panel is not instant.
|
|
42
|
+
*/
|
|
43
|
+
activationMode?: 'automatic' | 'manual';
|
|
19
44
|
/**
|
|
20
45
|
* Custom string to use when generating the IDs of tabs and `aria-labelledby` for the panels
|
|
21
46
|
*/
|
|
@@ -34,6 +59,12 @@ type UnderlinePanelsProps = {
|
|
|
34
59
|
as?: React.ElementType;
|
|
35
60
|
};
|
|
36
61
|
type TabProps = PropsWithChildren<{
|
|
62
|
+
/**
|
|
63
|
+
* A value that uniquely identifies this tab, paired with the `UnderlinePanels.Panel` of the same
|
|
64
|
+
* `value`. Provide this to use domain values (e.g. `'branch'`) with the container's controlled
|
|
65
|
+
* `value`/`onChange` API. When omitted, tabs and panels are paired by their DOM order.
|
|
66
|
+
*/
|
|
67
|
+
value?: string;
|
|
37
68
|
/**
|
|
38
69
|
* Whether this is the selected tab
|
|
39
70
|
*/
|
|
@@ -51,7 +82,13 @@ type TabProps = PropsWithChildren<{
|
|
|
51
82
|
*/
|
|
52
83
|
icon?: FC<IconProps>;
|
|
53
84
|
}>;
|
|
54
|
-
type PanelProps = React.HTMLAttributes<HTMLDivElement
|
|
85
|
+
type PanelProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
86
|
+
/**
|
|
87
|
+
* A value that uniquely identifies this panel, paired with the `UnderlinePanels.Tab` of the same
|
|
88
|
+
* `value`. When omitted, tabs and panels are paired by their DOM order.
|
|
89
|
+
*/
|
|
90
|
+
value?: string;
|
|
91
|
+
};
|
|
55
92
|
declare const _default: React.FC<UnderlinePanelsProps> & SlotMarker & {
|
|
56
93
|
Panel: FCWithSlotMarker<PanelProps>;
|
|
57
94
|
Tab: FCWithSlotMarker<TabProps>;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import useIsomorphicLayoutEffect from "../../utils/useIsomorphicLayoutEffect.js";
|
|
2
2
|
import { useResizeObserver } from "../../hooks/useResizeObserver.js";
|
|
3
3
|
import { useId as useId$1 } from "../../hooks/useId.js";
|
|
4
|
+
import { warning } from "../../utils/warning.js";
|
|
4
5
|
import { isSlot } from "../../utils/is-slot.js";
|
|
6
|
+
import { useFeatureFlag } from "../../FeatureFlags/useFeatureFlag.js";
|
|
5
7
|
import { invariant } from "../../utils/invariant.js";
|
|
6
8
|
import { UnderlineItem, UnderlineItemList, UnderlineWrapper } from "../../internal/components/UnderlineTabbedInterface.js";
|
|
7
9
|
import UnderlinePanels_module_css_default from "./UnderlinePanels.module.css.js";
|
|
@@ -17,43 +19,78 @@ const UnderlinePanelsContext = /*#__PURE__*/ createContext({
|
|
|
17
19
|
iconsVisible: true,
|
|
18
20
|
loadingCounters: void 0
|
|
19
21
|
});
|
|
20
|
-
const UnderlinePanels = ({ "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, children, loadingCounters, className, ...props }) => {
|
|
22
|
+
const UnderlinePanels = ({ "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, children, loadingCounters, className, value: valueProp, defaultValue: defaultValueProp, onChange: onChangeProp, activationMode = "automatic", ...props }) => {
|
|
23
|
+
var _tabValues$;
|
|
24
|
+
const controlledApiEnabled = useFeatureFlag("primer_react_underline_panels_controlled");
|
|
25
|
+
const controlledValue = controlledApiEnabled ? valueProp : void 0;
|
|
26
|
+
const defaultValue = controlledApiEnabled ? defaultValueProp : void 0;
|
|
27
|
+
const onChange = controlledApiEnabled ? onChangeProp : void 0;
|
|
21
28
|
const [iconsVisible, setIconsVisible] = useState(true);
|
|
22
29
|
const wrapperRef = useRef(null);
|
|
23
30
|
const listRef = useRef(null);
|
|
24
31
|
const parentId = useId$1(props.id);
|
|
25
|
-
const [tabs, tabPanels, tabsHaveIcons, selectedFromProps] = useMemo(() => {
|
|
32
|
+
const [tabs, tabPanels, tabsHaveIcons, selectedFromProps, tabValues, panelValues] = useMemo(() => {
|
|
26
33
|
let tabIndex = 0;
|
|
27
34
|
let panelIndex = 0;
|
|
28
35
|
const childrenWithProps = Children.map(children, (child) => {
|
|
29
|
-
if (/*#__PURE__*/ isValidElement(child) && (child.type === Tab || isSlot(child, Tab)))
|
|
30
|
-
|
|
36
|
+
if (/*#__PURE__*/ isValidElement(child) && (child.type === Tab || isSlot(child, Tab))) {
|
|
37
|
+
var _ref;
|
|
38
|
+
const value = (_ref = controlledApiEnabled ? child.props.value : void 0) !== null && _ref !== void 0 ? _ref : `${tabIndex}`;
|
|
39
|
+
tabIndex++;
|
|
40
|
+
return /*#__PURE__*/ cloneElement(child, { value });
|
|
41
|
+
}
|
|
42
|
+
if (/*#__PURE__*/ isValidElement(child) && (child.type === Panel || isSlot(child, Panel))) {
|
|
43
|
+
var _ref2;
|
|
44
|
+
const value = (_ref2 = controlledApiEnabled ? child.props.value : void 0) !== null && _ref2 !== void 0 ? _ref2 : `${panelIndex}`;
|
|
45
|
+
panelIndex++;
|
|
46
|
+
return /*#__PURE__*/ cloneElement(child, { value });
|
|
47
|
+
}
|
|
31
48
|
return child;
|
|
32
49
|
});
|
|
33
50
|
const tabs = [];
|
|
34
51
|
const tabPanels = [];
|
|
52
|
+
const tabValues = [];
|
|
53
|
+
const panelValues = [];
|
|
35
54
|
let selectedFromProps;
|
|
36
55
|
for (const child of Children.toArray(childrenWithProps)) {
|
|
37
56
|
if (!/*#__PURE__*/ isValidElement(child)) continue;
|
|
38
57
|
if (child.type === Tab || isSlot(child, Tab)) {
|
|
58
|
+
const value = child.props.value;
|
|
59
|
+
if (value !== void 0) tabValues.push(value);
|
|
39
60
|
const ariaSelected = child.props["aria-selected"];
|
|
40
|
-
if (ariaSelected === true || ariaSelected === "true") selectedFromProps =
|
|
61
|
+
if (ariaSelected === true || ariaSelected === "true") selectedFromProps = value;
|
|
41
62
|
tabs.push(child);
|
|
42
|
-
} else if (child.type === Panel || isSlot(child, Panel))
|
|
63
|
+
} else if (child.type === Panel || isSlot(child, Panel)) {
|
|
64
|
+
const value = child.props.value;
|
|
65
|
+
if (value !== void 0) panelValues.push(value);
|
|
66
|
+
tabPanels.push(child);
|
|
67
|
+
}
|
|
43
68
|
}
|
|
44
69
|
return [
|
|
45
70
|
tabs,
|
|
46
71
|
tabPanels,
|
|
47
72
|
tabs.some((tab) => /*#__PURE__*/ React.isValidElement(tab) && tab.props.icon),
|
|
48
|
-
selectedFromProps
|
|
73
|
+
selectedFromProps,
|
|
74
|
+
tabValues,
|
|
75
|
+
panelValues
|
|
49
76
|
];
|
|
50
|
-
}, [children]);
|
|
51
|
-
const
|
|
77
|
+
}, [children, controlledApiEnabled]);
|
|
78
|
+
const isControlled = controlledValue !== void 0;
|
|
79
|
+
const [uncontrolledValue, setUncontrolledValue] = useState(() => {
|
|
80
|
+
var _ref3;
|
|
81
|
+
return (_ref3 = defaultValue !== null && defaultValue !== void 0 ? defaultValue : selectedFromProps) !== null && _ref3 !== void 0 ? _ref3 : "0";
|
|
82
|
+
});
|
|
52
83
|
const [prevSelectedFromProps, setPrevSelectedFromProps] = useState(selectedFromProps);
|
|
53
|
-
if (selectedFromProps !== prevSelectedFromProps) {
|
|
84
|
+
if (!isControlled && selectedFromProps !== prevSelectedFromProps) {
|
|
54
85
|
setPrevSelectedFromProps(selectedFromProps);
|
|
55
|
-
if (selectedFromProps !== void 0 && selectedFromProps !==
|
|
86
|
+
if (selectedFromProps !== void 0 && selectedFromProps !== uncontrolledValue) setUncontrolledValue(selectedFromProps);
|
|
56
87
|
}
|
|
88
|
+
const selectedValue = isControlled ? controlledValue : uncontrolledValue;
|
|
89
|
+
const effectiveValue = tabValues.includes(selectedValue) ? selectedValue : (_tabValues$ = tabValues[0]) !== null && _tabValues$ !== void 0 ? _tabValues$ : selectedValue;
|
|
90
|
+
const handleValueChange = (value) => {
|
|
91
|
+
if (!isControlled) setUncontrolledValue(value);
|
|
92
|
+
onChange === null || onChange === void 0 || onChange({ value });
|
|
93
|
+
};
|
|
57
94
|
const { tabListProps } = useTabList({
|
|
58
95
|
"aria-label": ariaLabel,
|
|
59
96
|
"aria-labelledby": ariaLabelledBy,
|
|
@@ -78,17 +115,31 @@ const UnderlinePanels = ({ "aria-label": ariaLabel, "aria-labelledby": ariaLabel
|
|
|
78
115
|
const wrapperWidth = resizeObserverEntries[0].contentRect.width;
|
|
79
116
|
setIconsVisible(wrapperWidth > listWidthRef.current);
|
|
80
117
|
}, wrapperRef, []);
|
|
81
|
-
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
118
|
+
{
|
|
119
|
+
const selectedTabs = tabs.filter((tab) => {
|
|
120
|
+
const ariaSelected = /*#__PURE__*/ React.isValidElement(tab) && tab.props["aria-selected"];
|
|
121
|
+
return ariaSelected === true || ariaSelected === "true";
|
|
122
|
+
});
|
|
123
|
+
!(selectedTabs.length <= 1) && invariant(false, "Only one tab can be selected at a time.");
|
|
124
|
+
!(tabs.length === tabPanels.length) && invariant(false, `The number of tabs and panels must be equal. Counted ${tabs.length} tabs and ${tabPanels.length} panels.`);
|
|
125
|
+
const duplicateTabValue = tabValues.find((value, index) => tabValues.indexOf(value) !== index);
|
|
126
|
+
!(duplicateTabValue === void 0) && invariant(false, `Every tab must have a unique \`value\`. Found duplicate "${duplicateTabValue}".`);
|
|
127
|
+
const duplicatePanelValue = panelValues.find((value, index) => panelValues.indexOf(value) !== index);
|
|
128
|
+
!(duplicatePanelValue === void 0) && invariant(false, `Every panel must have a unique \`value\`. Found duplicate "${duplicatePanelValue}".`);
|
|
129
|
+
const unmatchedTabValue = tabValues.find((value) => !panelValues.includes(value));
|
|
130
|
+
!(unmatchedTabValue === void 0) && invariant(false, `Tab with \`value\` "${unmatchedTabValue}" has no matching panel. Give a \`UnderlinePanels.Panel\` the same \`value\`.`);
|
|
131
|
+
warning(isControlled && selectedTabs.length > 0, "UnderlinePanels: do not combine the controlled `value` prop with `aria-selected` on a tab. `value` takes precedence; use `value`/`onChange` (or `defaultValue`) to drive selection.");
|
|
132
|
+
warning(controlledValue !== void 0 && defaultValue !== void 0, "UnderlinePanels: do not combine the controlled `value` prop with `defaultValue`. `value` takes precedence; use one or the other.");
|
|
133
|
+
const providedValue = controlledValue !== null && controlledValue !== void 0 ? controlledValue : defaultValue;
|
|
134
|
+
warning(providedValue !== void 0 && tabValues.length > 0 && !tabValues.includes(providedValue), `UnderlinePanels: the selected value "${providedValue}" does not match any tab, so the first tab is selected instead. Provide a \`value\`/\`defaultValue\` that matches a \`UnderlinePanels.Tab\` \`value\`.`);
|
|
135
|
+
}
|
|
86
136
|
return /*#__PURE__*/ jsx(UnderlinePanelsContext.Provider, {
|
|
87
137
|
value: contextValue,
|
|
88
138
|
children: /*#__PURE__*/ jsxs(Tabs, {
|
|
89
139
|
id: parentId,
|
|
90
|
-
value:
|
|
91
|
-
|
|
140
|
+
value: effectiveValue,
|
|
141
|
+
activationMode,
|
|
142
|
+
onValueChange: ({ value }) => handleValueChange(value),
|
|
92
143
|
children: [/*#__PURE__*/ jsx(UnderlineWrapper, {
|
|
93
144
|
ref: wrapperRef,
|
|
94
145
|
"data-icons-visible": iconsVisible,
|
|
@@ -9605,6 +9605,22 @@
|
|
|
9605
9605
|
{
|
|
9606
9606
|
"id": "experimental-components-underlinepanels-features--with-icons-hidden-on-narrow-screen",
|
|
9607
9607
|
"code": "() => (\n <UnderlinePanels aria-label=\"Tabs with icons\">\n <UnderlinePanels.Tab icon={CodeIcon}>Tab 1</UnderlinePanels.Tab>\n <UnderlinePanels.Tab icon={EyeIcon}>Tab 2</UnderlinePanels.Tab>\n <UnderlinePanels.Tab icon={GitPullRequestIcon}>Tab 3</UnderlinePanels.Tab>\n <UnderlinePanels.Tab icon={CommentDiscussionIcon}>\n Tab 4\n </UnderlinePanels.Tab>\n <UnderlinePanels.Tab icon={PlayIcon}>Tab 5</UnderlinePanels.Tab>\n <UnderlinePanels.Tab icon={ProjectIcon}>Tab 6</UnderlinePanels.Tab>\n <UnderlinePanels.Tab icon={GraphIcon}>Tab 7</UnderlinePanels.Tab>\n <UnderlinePanels.Tab icon={GearIcon}>Tab 8</UnderlinePanels.Tab>\n <UnderlinePanels.Tab icon={ShieldLockIcon}>Tab 9</UnderlinePanels.Tab>\n <UnderlinePanels.Panel>Panel 1</UnderlinePanels.Panel>\n <UnderlinePanels.Panel>Panel 2</UnderlinePanels.Panel>\n <UnderlinePanels.Panel>Panel 3</UnderlinePanels.Panel>\n <UnderlinePanels.Panel>Panel 4</UnderlinePanels.Panel>\n <UnderlinePanels.Panel>Panel 5</UnderlinePanels.Panel>\n <UnderlinePanels.Panel>Panel 6</UnderlinePanels.Panel>\n <UnderlinePanels.Panel>Panel 7</UnderlinePanels.Panel>\n <UnderlinePanels.Panel>Panel 8</UnderlinePanels.Panel>\n <UnderlinePanels.Panel>Panel 9</UnderlinePanels.Panel>\n </UnderlinePanels>\n)"
|
|
9608
|
+
},
|
|
9609
|
+
{
|
|
9610
|
+
"id": "experimental-components-underlinepanels-features--controlled",
|
|
9611
|
+
"code": "() => {\n const [refType, setRefType] = useState('branch')\n return (\n <>\n <FlagState />\n <UnderlinePanels\n aria-label=\"Ref type\"\n value={refType}\n onChange={({ value }) => {\n action('onChange')({\n value,\n })\n setRefType(value)\n }}\n >\n <UnderlinePanels.Tab value=\"branch\" icon={GitBranchIcon}>\n Branches\n </UnderlinePanels.Tab>\n <UnderlinePanels.Tab value=\"tag\" icon={TagIcon}>\n Tags\n </UnderlinePanels.Tab>\n <UnderlinePanels.Panel value=\"branch\">\n Find or create a branch…\n </UnderlinePanels.Panel>\n <UnderlinePanels.Panel value=\"tag\">\n Search or create a new tag…\n </UnderlinePanels.Panel>\n </UnderlinePanels>\n <p>\n Selected ref type: <strong>{refType}</strong>\n </p>\n </>\n )\n}"
|
|
9612
|
+
},
|
|
9613
|
+
{
|
|
9614
|
+
"id": "experimental-components-underlinepanels-features--uncontrolled",
|
|
9615
|
+
"code": "() => (\n <>\n <FlagState />\n <UnderlinePanels\n aria-label=\"Ref type\"\n defaultValue=\"tag\"\n onChange={({ value }) => {\n action('onChange')({\n value,\n })\n }}\n >\n <UnderlinePanels.Tab value=\"branch\">Branches</UnderlinePanels.Tab>\n <UnderlinePanels.Tab value=\"tag\">Tags</UnderlinePanels.Tab>\n <UnderlinePanels.Panel value=\"branch\">\n Find or create a branch…\n </UnderlinePanels.Panel>\n <UnderlinePanels.Panel value=\"tag\">\n Search or create a new tag…\n </UnderlinePanels.Panel>\n </UnderlinePanels>\n </>\n)"
|
|
9616
|
+
},
|
|
9617
|
+
{
|
|
9618
|
+
"id": "experimental-components-underlinepanels-features--manual-activation",
|
|
9619
|
+
"code": "() => {\n const [refType, setRefType] = useState('branch')\n return (\n <>\n <FlagState />\n <p>\n With <code>activationMode="manual"</code>, arrow keys only\n move focus; press Enter or Space (or click) to commit selection. Prefer\n this when switching tabs triggers async work like a fetch.\n </p>\n <UnderlinePanels\n aria-label=\"Ref type\"\n value={refType}\n activationMode=\"manual\"\n onChange={({ value }) => {\n action('onChange')({\n value,\n })\n setRefType(value)\n }}\n >\n <UnderlinePanels.Tab value=\"branch\">Branches</UnderlinePanels.Tab>\n <UnderlinePanels.Tab value=\"tag\">Tags</UnderlinePanels.Tab>\n <UnderlinePanels.Panel value=\"branch\">\n Find or create a branch…\n </UnderlinePanels.Panel>\n <UnderlinePanels.Panel value=\"tag\">\n Search or create a new tag…\n </UnderlinePanels.Panel>\n </UnderlinePanels>\n </>\n )\n}"
|
|
9620
|
+
},
|
|
9621
|
+
{
|
|
9622
|
+
"id": "experimental-components-underlinepanels-features--in-overlay",
|
|
9623
|
+
"code": "() => {\n const [open, setOpen] = useState(false)\n const [refType, setRefType] = useState('branch')\n return (\n <>\n <FlagState />\n <AnchoredOverlay\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n renderAnchor={(props) => <Button {...props}>Select ref type</Button>}\n overlayProps={{\n role: 'dialog',\n 'aria-modal': true,\n 'aria-label': 'Select a ref type',\n style: {\n width: '320px',\n },\n }}\n focusZoneSettings={{\n disabled: true,\n }}\n >\n <UnderlinePanels\n aria-label=\"Ref type\"\n value={refType}\n onChange={({ value }) => {\n action('onChange')({\n value,\n })\n setRefType(value)\n }}\n >\n <UnderlinePanels.Tab value=\"branch\">Branches</UnderlinePanels.Tab>\n <UnderlinePanels.Tab value=\"tag\">Tags</UnderlinePanels.Tab>\n <UnderlinePanels.Panel value=\"branch\">\n Find or create a branch…\n </UnderlinePanels.Panel>\n <UnderlinePanels.Panel value=\"tag\">\n Search or create a new tag…\n </UnderlinePanels.Panel>\n </UnderlinePanels>\n </AnchoredOverlay>\n </>\n )\n}"
|
|
9608
9624
|
}
|
|
9609
9625
|
],
|
|
9610
9626
|
"importPath": "@primer/react/experimental",
|
|
@@ -9621,6 +9637,30 @@
|
|
|
9621
9637
|
"defaultValue": "",
|
|
9622
9638
|
"description": "ID of the element containing the name for the tab list"
|
|
9623
9639
|
},
|
|
9640
|
+
{
|
|
9641
|
+
"name": "value",
|
|
9642
|
+
"type": "string",
|
|
9643
|
+
"defaultValue": "",
|
|
9644
|
+
"description": "The value of the selected tab, keyed to each `UnderlinePanels.Tab`/`UnderlinePanels.Panel` `value`. Provide this (with `onChange`) for a controlled component where the selected tab is the single source of truth. Requires the `primer_react_underline_panels_controlled` feature flag."
|
|
9645
|
+
},
|
|
9646
|
+
{
|
|
9647
|
+
"name": "defaultValue",
|
|
9648
|
+
"type": "string",
|
|
9649
|
+
"defaultValue": "",
|
|
9650
|
+
"description": "The value of the tab selected by default, for an uncontrolled component. Cannot be combined with `value`."
|
|
9651
|
+
},
|
|
9652
|
+
{
|
|
9653
|
+
"name": "onChange",
|
|
9654
|
+
"type": "({value}: {value: string}) => void",
|
|
9655
|
+
"defaultValue": "",
|
|
9656
|
+
"description": "Callback fired whenever the selected tab changes, for every selection method — pointer, Enter/Space, and Arrow/Home/End keys. Unlike `UnderlinePanels.Tab`'s `onSelect` (which only fires on click and Enter/Space), this makes the selected value usable as a single source of truth for data-driven tabs."
|
|
9657
|
+
},
|
|
9658
|
+
{
|
|
9659
|
+
"name": "activationMode",
|
|
9660
|
+
"type": "'automatic' | 'manual'",
|
|
9661
|
+
"defaultValue": "'automatic'",
|
|
9662
|
+
"description": "Controls how tabs are activated with the keyboard. `'automatic'` selects on focus (Arrow/Home/End select immediately); `'manual'` moves focus only and commits selection on Enter, Space, or click. Prefer `'manual'` when displaying a panel is not instant (e.g. it triggers a network request). Requires the `primer_react_underline_panels_controlled` feature flag."
|
|
9663
|
+
},
|
|
9624
9664
|
{
|
|
9625
9665
|
"name": "children",
|
|
9626
9666
|
"type": "Array<UnderlinePanels.Tab | UnderlinePanels.Panel>",
|
|
@@ -9651,6 +9691,12 @@
|
|
|
9651
9691
|
{
|
|
9652
9692
|
"name": "UnderlinePanels.Tab",
|
|
9653
9693
|
"props": [
|
|
9694
|
+
{
|
|
9695
|
+
"name": "value",
|
|
9696
|
+
"type": "string",
|
|
9697
|
+
"defaultValue": "",
|
|
9698
|
+
"description": "A value that uniquely identifies this tab, paired with the `UnderlinePanels.Panel` of the same `value`. Provide this to use domain values (e.g. `'branch'`) with the container's controlled `value`/`onChange` API. When omitted, tabs and panels are paired by DOM order."
|
|
9699
|
+
},
|
|
9654
9700
|
{
|
|
9655
9701
|
"name": "aria-selected",
|
|
9656
9702
|
"type": "| boolean | 'true' | 'false'",
|
|
@@ -9661,7 +9707,7 @@
|
|
|
9661
9707
|
"name": "onSelect",
|
|
9662
9708
|
"type": "(event) => void",
|
|
9663
9709
|
"defaultValue": "",
|
|
9664
|
-
"description": "The handler that gets called when the tab is selected"
|
|
9710
|
+
"description": "The handler that gets called when the tab is selected. Note: this fires only on click and Enter/Space — not on arrow-key navigation. For a callback that fires for every selection method, use the container's `onChange` prop instead."
|
|
9665
9711
|
},
|
|
9666
9712
|
{
|
|
9667
9713
|
"name": "counter",
|
|
@@ -9679,7 +9725,14 @@
|
|
|
9679
9725
|
},
|
|
9680
9726
|
{
|
|
9681
9727
|
"name": "UnderlinePanels.Panel",
|
|
9682
|
-
"props": [
|
|
9728
|
+
"props": [
|
|
9729
|
+
{
|
|
9730
|
+
"name": "value",
|
|
9731
|
+
"type": "string",
|
|
9732
|
+
"defaultValue": "",
|
|
9733
|
+
"description": "A value that uniquely identifies this panel, paired with the `UnderlinePanels.Tab` of the same `value`. When omitted, tabs and panels are paired by DOM order."
|
|
9734
|
+
}
|
|
9735
|
+
],
|
|
9683
9736
|
"passthrough": {
|
|
9684
9737
|
"element": "div",
|
|
9685
9738
|
"url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div#Attributes"
|
package/package.json
CHANGED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
.prc-Button-ButtonBase-9n-Xk{align-items:center;appearance:none;background-color:transparent;border:var(--borderWidth-thin,.0625rem) solid;border-color:var(--button-default-borderColor-rest,#d1d9e0);border-radius:var(--borderRadius-medium,.375rem);color:var(--button-default-fgColor-rest,#25292e);cursor:pointer;display:flex;font-family:inherit;font-size:var(--text-body-size-medium,.875rem);font-weight:var(--base-text-weight-medium,500);gap:var(--base-size-8,.5rem);height:var(--control-medium-size,2rem);justify-content:space-between;min-width:max-content;padding:0 var(--control-medium-paddingInline-normal,.75rem);text-align:center;-webkit-text-decoration:none;text-decoration:none;transition:80ms cubic-bezier(.65,0,.35,1);transition-property:color,fill,background-color,border-color;-webkit-user-select:none;user-select:none}.prc-Button-ButtonBase-9n-Xk:has([data-kbd-chord]){padding-inline-end:var(--base-size-6,.375rem)}.prc-Button-ButtonBase-9n-Xk:hover{transition-duration:80ms}.prc-Button-ButtonBase-9n-Xk:focus-visible{box-shadow:none;outline:2px solid var(--focus-outline-color,var(--focus-outlineColor,#0969da));outline-offset:-2px}.prc-Button-ButtonBase-9n-Xk:active{transition:none}.prc-Button-ButtonBase-9n-Xk:disabled,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:not([data-loading=true]){box-shadow:none;cursor:not-allowed}.prc-Button-ButtonBase-9n-Xk:disabled:not(.prc-Button-does-not-exist-3ns8K) .prc-Button-CounterLabel-5hAs4,.prc-Button-ButtonBase-9n-Xk:disabled:not(.prc-Button-does-not-exist-3ns8K) .prc-Button-Visual-YNt2F,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:not([data-loading=true]) .prc-Button-CounterLabel-5hAs4,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:not([data-loading=true]) .prc-Button-Visual-YNt2F{color:inherit}@media (forced-colors:active){.prc-Button-ButtonBase-9n-Xk:focus{outline:1px solid transparent}}.prc-Button-ButtonBase-9n-Xk :where(.prc-Button-Visual-YNt2F){color:var(--fgColor-muted,#59636e);display:flex;pointer-events:none}.prc-Button-ButtonBase-9n-Xk :where(.prc-Button-VisualWrap-E4cnq){display:flex;pointer-events:none}.prc-Button-ButtonBase-9n-Xk:where(.prc-Button-IconButton-fyge7){display:inline-grid;flex-shrink:0;min-width:unset;padding:unset;place-content:center;width:var(--control-medium-size,2rem)}.prc-Button-ButtonBase-9n-Xk:where(.prc-Button-IconButton-fyge7):where([data-size=small]){width:var(--control-small-size,1.75rem)}.prc-Button-ButtonBase-9n-Xk:where(.prc-Button-IconButton-fyge7):where([data-size=large]){width:var(--control-large-size,2.5rem)}.prc-Button-ButtonBase-9n-Xk:where([href]){display:inline-flex}.prc-Button-ButtonBase-9n-Xk:where([href]):hover{-webkit-text-decoration:none;text-decoration:none}.prc-Button-ButtonBase-9n-Xk :where(.prc-Button-ButtonContent-Iohp5){align-content:center;align-items:center;display:grid;flex:1 0 auto;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content}.prc-Button-ButtonBase-9n-Xk :where(.prc-Button-ButtonContent-Iohp5)>:not(:last-child){margin-right:var(--base-size-8,.5rem)}.prc-Button-ButtonBase-9n-Xk :where(.prc-Button-ButtonContent-Iohp5):where([data-align=center]){justify-content:center}.prc-Button-ButtonBase-9n-Xk :where(.prc-Button-ButtonContent-Iohp5):where([data-align=start]){justify-content:flex-start}.prc-Button-ButtonBase-9n-Xk :where([data-component=leadingVisual]){grid-area:leadingVisual}.prc-Button-ButtonBase-9n-Xk :where(.prc-Button-Label-FWkx3){grid-area:text;line-height:var(--text-body-lineHeight-medium,1.5);white-space:nowrap}.prc-Button-ButtonBase-9n-Xk :where([data-component=trailingVisual]){grid-area:trailingVisual}.prc-Button-ButtonBase-9n-Xk :where([data-component=trailingAction]){margin-right:calc(var(--base-size-4,.25rem)*-1)}.prc-Button-ButtonBase-9n-Xk:where([data-size=small]){font-size:var(--text-body-size-small,.75rem);gap:var(--control-small-gap,.25rem);height:var(--control-small-size,1.75rem);padding:0 var(--control-small-paddingInline-condensed,.5rem)}.prc-Button-ButtonBase-9n-Xk:where([data-size=small]) .prc-Button-ButtonContent-Iohp5>:not(:last-child){margin-right:var(--control-small-gap,.25rem)}.prc-Button-ButtonBase-9n-Xk:where([data-size=small]) .prc-Button-Label-FWkx3{line-height:var(--text-body-lineHeight-small,1.625)}.prc-Button-ButtonBase-9n-Xk:where([data-size=large]){gap:var(--control-large-gap,.5rem);height:var(--control-large-size,2.5rem);padding:0 var(--control-large-paddingInline-spacious,1rem)}.prc-Button-ButtonBase-9n-Xk:where([data-size=large]) .prc-Button-ButtonContent-Iohp5>:not(:last-child){margin-right:var(--control-large-gap,.5rem)}.prc-Button-ButtonBase-9n-Xk:where([data-size=large]):has([data-kbd-chord]){padding-inline-end:var(--base-size-8,.5rem)}.prc-Button-ButtonBase-9n-Xk:where([data-block=block]){width:100%}.prc-Button-ButtonBase-9n-Xk:where([data-label-wrap=true]){height:unset;min-height:var(--control-medium-size,2rem);min-width:-moz-fit-content;min-width:fit-content}.prc-Button-ButtonBase-9n-Xk:where([data-label-wrap=true]) .prc-Button-ButtonContent-Iohp5{align-self:stretch;flex:1 1 auto;padding-block:calc(var(--control-medium-paddingBlock,.375rem) - var(--base-size-2,.125rem))}.prc-Button-ButtonBase-9n-Xk:where([data-label-wrap=true]) .prc-Button-Label-FWkx3{white-space:unset;word-break:break-word}.prc-Button-ButtonBase-9n-Xk:where([data-label-wrap=true]):where([data-size=small]){height:unset;min-height:var(--control-small-size,1.75rem)}.prc-Button-ButtonBase-9n-Xk:where([data-label-wrap=true]):where([data-size=small]) .prc-Button-ButtonContent-Iohp5{padding-block:calc(var(--control-small-paddingBlock,.25rem) - var(--base-size-2,.125rem))}.prc-Button-ButtonBase-9n-Xk:where([data-label-wrap=true]):where([data-size=large]){height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem)}.prc-Button-ButtonBase-9n-Xk:where([data-label-wrap=true]):where([data-size=large]) .prc-Button-ButtonContent-Iohp5{padding-block:calc(var(--control-large-paddingBlock,.625rem) - var(--base-size-2,.125rem))}.prc-Button-ButtonBase-9n-Xk:where([data-loading=true]) .prc-Button-LoadingSpinner-6KfaT:not([data-component=leadingVisual],[data-component=trailingVisual],[data-component=trailingAction]){grid-area:text;margin-right:0!important;place-self:center}.prc-Button-ButtonBase-9n-Xk:where([data-loading=true]) .prc-Button-LoadingSpinner-6KfaT:not([data-component=leadingVisual],[data-component=trailingVisual],[data-component=trailingAction])+.prc-Button-Label-FWkx3{visibility:hidden}.prc-Button-ButtonBase-9n-Xk .prc-Button-LoadingSpinner-6KfaT{align-items:center;display:flex;justify-content:center}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]){background-color:var(--button-default-bgColor-rest,#f6f8fa);box-shadow:var(--button-default-shadow-resting,0 1px 0 0 #1f23280a);color:var(--button-default-fgColor-rest,#25292e)}.prc-Button-ButtonBase-9n-Xk[aria-expanded=true]:where([data-variant=default]){background-color:var(--button-default-bgColor-active,#e6eaef);border-color:var(--button-default-borderColor-active,#d1d9e0)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]):hover{background-color:var(--button-default-bgColor-hover,#eff2f5);border-color:var(--button-default-borderColor-hover,#d1d9e0)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]):active{background-color:var(--button-default-bgColor-active,#e6eaef);border-color:var(--button-default-borderColor-active,#d1d9e0)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]):disabled,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=default]):not([data-loading=true]){background-color:var(--button-default-bgColor-disabled,#eff2f5);border-color:var(--button-default-borderColor-disabled,#818b981a);box-shadow:none;color:var(--control-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]):disabled:not(.prc-Button-does-not-exist-3ns8K) [data-kbd-chord]{background:var(--buttonKeybindingHint-default-bgColor-disabled,#eff2f5);border-color:var(--buttonKeybindingHint-default-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-default-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=default]):not([data-loading=true]) [data-kbd-chord]{background:var(--buttonKeybindingHint-default-bgColor-disabled,#eff2f5);border-color:var(--buttonKeybindingHint-default-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-default-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]) .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-default-bgColor-rest,#818b981f)!important}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]) [data-kbd-chord]{background:var(--buttonKeybindingHint-default-bgColor-rest,#eff2f5);border-color:var(--buttonKeybindingHint-default-borderColor-rest,#d1d9e0b3);color:var(--buttonKeybindingHint-default-fgColor-rest,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=default]):where(.prc-Button-IconButton-fyge7){color:var(--fgColor-muted,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]){background-color:var(--button-primary-bgColor-rest,#1f883d);border-color:var(--button-primary-borderColor-rest,#1f232826);box-shadow:var(--shadow-resting-small,0 1px 1px 0 #1f23280a,0 1px 2px 0 #1f232808);color:var(--button-primary-fgColor-rest,#fff)}.prc-Button-ButtonBase-9n-Xk[aria-expanded=true]:where([data-variant=primary]){background-color:var(--button-primary-bgColor-active,#197935);box-shadow:var(--button-primary-shadow-selected,inset 0 1px 0 0 #002d114d)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]):hover{background-color:var(--button-primary-bgColor-hover,#1c8139);border-color:var(--button-primary-borderColor-hover,#1f232826)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]):focus-visible{box-shadow:inset 0 0 0 3px var(--fgColor-onEmphasis,#fff);outline:2px solid var(--focus-outline-color,var(--focus-outlineColor,#0969da));outline-offset:-2px}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]):active{background-color:var(--button-primary-bgColor-active,#197935);box-shadow:var(--button-primary-shadow-selected,inset 0 1px 0 0 #002d114d)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]):disabled,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=primary]):not([data-loading=true]){background-color:var(--button-primary-bgColor-disabled,#95d8a6);border-color:var(--button-primary-borderColor-disabled,#95d8a6);box-shadow:none;color:var(--button-primary-fgColor-disabled,#ffffffcc)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]):disabled:not(.prc-Button-does-not-exist-3ns8K) [data-kbd-chord]{background:var(--buttonKeybindingHint-primary-bgColor-disabled,#002d111a);border-color:var(--buttonKeybindingHint-primary-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-primary-fgColor-disabled,#ffffffcc)}.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=primary]):not([data-loading=true]) [data-kbd-chord]{background:var(--buttonKeybindingHint-primary-bgColor-disabled,#002d111a);border-color:var(--buttonKeybindingHint-primary-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-primary-fgColor-disabled,#ffffffcc)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]) .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-primary-bgColor-rest,#002d1133)!important;color:var(--button-primary-fgColor-rest,#fff)!important}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]) [data-kbd-chord]{background:var(--buttonKeybindingHint-primary-bgColor-rest,#002d1133);border-color:var(--buttonKeybindingHint-primary-borderColor-rest,#1f232826);color:var(--buttonKeybindingHint-primary-fgColor-rest,#fff)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=primary]) .prc-Button-Visual-YNt2F{color:var(--button-primary-fgColor-rest,#fff)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]){background-color:var(--button-danger-bgColor-rest,#f6f8fa);box-shadow:var(--button-default-shadow-resting,0 1px 0 0 #1f23280a);color:var(--button-danger-fgColor-rest,#d1242f)}.prc-Button-ButtonBase-9n-Xk[aria-expanded=true]:where([data-variant=danger]){background-color:var(--button-danger-bgColor-active,#a40e26);border-color:var(--button-danger-borderColor-active,#1f232826);box-shadow:var(--button-danger-shadow-selected,inset 0 1px 0 0 #4c001433);color:var(--button-danger-fgColor-active,#fff)}.prc-Button-ButtonBase-9n-Xk[aria-expanded=true]:where([data-variant=danger]) .prc-Button-Visual-YNt2F{color:var(--button-danger-iconColor-hover,#fff)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):hover{background-color:var(--button-danger-bgColor-hover,#cf222e);border-color:var(--button-danger-borderColor-hover,#1f232826);box-shadow:var(--shadow-resting-small,0 1px 1px 0 #1f23280a,0 1px 2px 0 #1f232808);color:var(--button-danger-fgColor-hover,#fff)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):hover .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-danger-bgColor-hover,#ffffff33)!important;color:var(--buttonCounter-danger-fgColor-hover,#fff)!important}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):hover [data-kbd-chord]{background:var(--buttonKeybindingHint-danger-bgColor-hover,#1f232833);border-color:var(--buttonKeybindingHint-danger-borderColor-hover,#1f232826);color:var(--buttonKeybindingHint-danger-fgColor-hover,#fff);transition:80ms ease-out}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):hover .prc-Button-Visual-YNt2F{color:var(--button-danger-iconColor-hover,#fff)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):active{background-color:var(--button-danger-bgColor-active,#a40e26);border-color:var(--button-danger-borderColor-active,#1f232826);box-shadow:var(--button-danger-shadow-selected,inset 0 1px 0 0 #4c001433);color:var(--button-danger-fgColor-active,#fff)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):active .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-danger-bgColor-hover,#ffffff33)!important;color:var(--buttonCounter-danger-fgColor-hover,#fff)!important}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):active [data-kbd-chord]{background:var(--buttonKeybindingHint-danger-bgColor-active,#1f232866);border-color:var(--buttonKeybindingHint-danger-borderColor-active,#1f232826);color:var(--buttonKeybindingHint-danger-fgColor-active,#fff);transition:80ms ease-out}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):active .prc-Button-Visual-YNt2F{color:var(--button-danger-iconColor-hover,#fff)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):disabled,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=danger]):not([data-loading=true]){background-color:var(--button-danger-bgColor-disabled,#eff2f5);border-color:var(--button-default-borderColor-disabled,#818b981a);box-shadow:none;color:var(--button-danger-fgColor-disabled,#d1242f80)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):disabled:not(.prc-Button-does-not-exist-3ns8K) .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-danger-bgColor-disabled,#cf222e0d)!important;color:var(--buttonCounter-danger-fgColor-disabled,#d1242f80)!important}.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=danger]):not([data-loading=true]) .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-danger-bgColor-disabled,#cf222e0d)!important;color:var(--buttonCounter-danger-fgColor-disabled,#d1242f80)!important}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]):disabled:not(.prc-Button-does-not-exist-3ns8K) [data-kbd-chord]{background:var(--buttonKeybindingHint-danger-bgColor-disabled,#eff2f5);border-color:var(--buttonKeybindingHint-danger-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-danger-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=danger]):not([data-loading=true]) [data-kbd-chord]{background:var(--buttonKeybindingHint-danger-bgColor-disabled,#eff2f5);border-color:var(--buttonKeybindingHint-danger-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-danger-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]) .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-danger-bgColor-rest,#cf222e1a)!important;color:var(--buttonCounter-danger-fgColor-rest,#c21c2c)!important}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]) [data-kbd-chord]{background:var(--buttonKeybindingHint-danger-bgColor-rest,#eff2f5);border-color:var(--buttonKeybindingHint-danger-borderColor-rest,#d1d9e0b3);color:var(--buttonKeybindingHint-danger-fgColor-rest,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=danger]) .prc-Button-Visual-YNt2F{color:var(--button-danger-iconColor-rest,#d1242f)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]){border-color:var(--button-invisible-borderColor-rest,#ffffff00);box-shadow:none;color:var(--button-default-fgColor-rest,#25292e)}.prc-Button-ButtonBase-9n-Xk[aria-expanded=true]:where([data-variant=invisible]){background-color:var(--button-invisible-bgColor-active,#818b9826)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):hover{background-color:var(--button-invisible-bgColor-hover,#818b981a);border-color:var(--button-invisible-borderColor-hover,#ffffff00)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):hover .prc-Button-Visual-YNt2F{color:var(--button-invisible-iconColor-hover,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):hover [data-kbd-chord]{background:var(--buttonKeybindingHint-invisible-bgColor-hover,#818b981a);transition:80ms ease-out}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):active{background-color:var(--button-invisible-bgColor-active,#818b9826)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):active .prc-Button-Visual-YNt2F{color:var(--button-invisible-iconColor-hover,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):active [data-kbd-chord]{background:var(--buttonKeybindingHint-invisible-bgColor-active,#818b9826);transition:80ms ease-out}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):disabled,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=invisible]):not([data-loading=true]){background-color:var(--button-invisible-bgColor-disabled,#ffffff00);border-color:var(--button-invisible-borderColor-disabled,#ffffff00);box-shadow:none;color:var(--button-invisible-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):disabled:not(.prc-Button-does-not-exist-3ns8K) [data-kbd-chord]{background:var(--buttonKeybindingHint-invisible-bgColor-disabled,#ffffff00);border-color:var(--buttonKeybindingHint-invisible-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-invisible-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=invisible]):not([data-loading=true]) [data-kbd-chord]{background:var(--buttonKeybindingHint-invisible-bgColor-disabled,#ffffff00);border-color:var(--buttonKeybindingHint-invisible-borderColor-disabled,#818b981a);color:var(--buttonKeybindingHint-invisible-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]) .prc-Button-Visual-YNt2F{color:var(--button-invisible-iconColor-rest,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]) .prc-Button-CounterLabel-5hAs4{background-color:var(--buttonCounter-invisible-bgColor-rest,#818b981f)!important}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]) [data-kbd-chord]{background:var(--buttonKeybindingHint-invisible-bgColor-rest,#eff2f5);border-color:var(--buttonKeybindingHint-invisible-borderColor-rest,#ffffff00);color:var(--buttonKeybindingHint-invisible-fgColor-rest,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=invisible]):where(.prc-Button-IconButton-fyge7){color:var(--button-invisible-iconColor-rest,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]){border:unset;border-radius:0;color:var(--fgColor-link,#0969da);display:inline-flex;font-size:inherit;height:unset;min-width:-moz-fit-content;min-width:fit-content;padding:0;text-align:left}.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):hover:not(:disabled,[data-inactive]){-webkit-text-decoration:underline;text-decoration:underline}.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):focus,.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):focus-visible{outline-offset:2px}.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):disabled,.prc-Button-ButtonBase-9n-Xk[aria-disabled=true]:where([data-variant=link]):not([data-loading=true]){background-color:transparent;border-color:transparent;color:var(--control-fgColor-disabled,#818b98)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]) .prc-Button-Label-FWkx3{white-space:unset}.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):where([data-inactive]){background:transparent!important;color:var(--button-inactive-fgColor,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-variant=link]) .prc-Button-Visual-YNt2F{color:var(--fgColor-link,#0969da)}[data-a11y-link-underlines=true] .prc-Button-ButtonBase-9n-Xk[data-no-visuals]:where([data-variant=link]){-webkit-text-decoration:underline;text-decoration:underline}[data-a11y-link-underlines=true] .prc-Button-ButtonBase-9n-Xk[data-no-visuals]:where([data-variant=link]):hover{-webkit-text-decoration:none;text-decoration:none}[data-a11y-link-underlines=true] .prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):not([data-no-visuals]){background-image:linear-gradient(90deg,currentColor,currentColor);background-position:0 calc(100% - 2px);background-repeat:no-repeat;background-size:100% 1.5px}[data-a11y-link-underlines=true] .prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):not([data-no-visuals]):hover{-webkit-text-decoration:none;text-decoration:none}[data-a11y-link-underlines=false] .prc-Button-ButtonBase-9n-Xk[data-no-visuals]:where([data-variant=link]){background-image:none;-webkit-text-decoration:none;text-decoration:none}[data-a11y-link-underlines=false] .prc-Button-ButtonBase-9n-Xk:where([data-variant=link]):not([data-no-visuals]){background-image:none}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]),.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):active,.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):hover{background-color:var(--button-inactive-bgColor,#e6eaef);border-color:var(--button-inactive-bgColor,#e6eaef);box-shadow:none;color:var(--button-inactive-fgColor,#59636e);cursor:auto}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):not(.prc-Button-does-not-exist-3ns8K) .prc-Button-Visual-YNt2F{color:inherit!important}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):hover .prc-Button-Visual-YNt2F{color:inherit!important}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):active .prc-Button-Visual-YNt2F{color:inherit!important}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):not(.prc-Button-does-not-exist-3ns8K) .prc-Button-CounterLabel-5hAs4{color:inherit!important}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):hover .prc-Button-CounterLabel-5hAs4{color:inherit!important}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):active .prc-Button-CounterLabel-5hAs4{color:inherit!important}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):not(.prc-Button-does-not-exist-3ns8K) [data-kbd-chord]{background:var(--buttonKeybindingHint-inactive-bgColor,#eff2f5);border-color:var(--buttonKeybindingHint-inactive-borderColor,#d1d9e0b3);color:var(--buttonKeybindingHint-inactive-fgColor,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):hover [data-kbd-chord]{background:var(--buttonKeybindingHint-inactive-bgColor,#eff2f5);border-color:var(--buttonKeybindingHint-inactive-borderColor,#d1d9e0b3);color:var(--buttonKeybindingHint-inactive-fgColor,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-inactive]):active [data-kbd-chord]{background:var(--buttonKeybindingHint-inactive-bgColor,#eff2f5);border-color:var(--buttonKeybindingHint-inactive-borderColor,#d1d9e0b3);color:var(--buttonKeybindingHint-inactive-fgColor,#59636e)}.prc-Button-ButtonBase-9n-Xk:where([data-icon-only-counter]){padding-inline:var(--control-medium-paddingInline-condensed,.5rem)}.prc-Button-ButtonBase-9n-Xk:where([data-icon-only-counter]):where([data-size=small]){padding-inline:var(--control-xsmall-paddingInline-condensed,.25rem)}.prc-Button-ButtonBase-9n-Xk:where([data-icon-only-counter]):where([data-size=large]){padding-inline:var(--control-large-paddingInline-normal,.75rem)}.prc-Button-ConditionalWrapper-Rvbgb{display:block}.prc-Button-ConditionalWrapperLink-d0qv7{display:inline-flex}[data-kbd-chord]{transition:80ms ease-in;transition-property:color,background-color,border-color}
|
|
2
|
-
/*# sourceMappingURL=ButtonBase-311501b9.css.map */
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Button/ButtonBase.module.css.js","../../postcss-preset-primer/src/mixins/focusOutline.css","../../postcss-preset-primer/src/mixins/focusOutlineOnEmphasis.css"],"names":[],"mappings":"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","file":"ButtonBase-311501b9.css","sourcesContent":["/* Base styles */\n.ButtonBase {\n display: flex;\n min-width: max-content;\n height: var(--control-medium-size);\n /* stylelint-disable-next-line primer/spacing */\n padding: 0 var(--control-medium-paddingInline-normal);\n font-family: inherit;\n font-size: var(--text-body-size-medium);\n font-weight: var(--base-text-weight-medium);\n color: var(--button-default-fgColor-rest);\n text-align: center;\n text-decoration: none;\n cursor: pointer;\n user-select: none;\n background-color: transparent;\n border: var(--borderWidth-thin) solid;\n border-color: var(--button-default-borderColor-rest);\n border-radius: var(--borderRadius-medium);\n transition: 80ms cubic-bezier(0.65, 0, 0.35, 1);\n transition-property: color, fill, background-color, border-color;\n appearance: none;\n align-items: center;\n justify-content: space-between;\n gap: var(--base-size-8);\n\n /* stylelint-disable-next-line selector-pseudo-class-disallowed-list -- scoped to CSS Module, audited (github/github-ui#17224) */\n &:has([data-kbd-chord]) {\n padding-inline-end: var(--base-size-6);\n }\n\n &:hover {\n transition-duration: 80ms;\n }\n\n &:focus-visible {\n @mixin focusOutline;\n }\n\n &:active {\n transition: none;\n }\n\n &:disabled,\n &[aria-disabled='true']:not([data-loading='true']) {\n cursor: not-allowed;\n box-shadow: none;\n\n & .Visual,\n & .CounterLabel {\n color: inherit;\n }\n }\n\n @media (forced-colors: active) {\n &:focus {\n outline: solid 1px transparent;\n }\n }\n\n /* Visuals */\n & :where(.Visual) {\n display: flex;\n color: var(--fgColor-muted);\n pointer-events: none;\n }\n\n /* mostly for CounterLabel */\n & :where(.VisualWrap) {\n display: flex;\n pointer-events: none;\n }\n\n /* IconButton */\n\n &:where(.IconButton) {\n display: inline-grid;\n width: var(--control-medium-size);\n min-width: unset;\n /* stylelint-disable-next-line primer/spacing */\n padding: unset;\n place-content: center;\n flex-shrink: 0;\n\n &:where([data-size='small']) {\n width: var(--control-small-size);\n }\n\n &:where([data-size='large']) {\n width: var(--control-large-size);\n }\n }\n\n /* LinkButton */\n\n &:where([href]) {\n display: inline-flex;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n /* Button layout */\n\n & :where(.ButtonContent) {\n flex: 1 0 auto;\n display: grid;\n grid-template-areas: 'leadingVisual text trailingVisual';\n grid-template-columns: min-content minmax(0, auto) min-content;\n align-items: center;\n align-content: center;\n\n & > :not(:last-child) {\n margin-right: var(--base-size-8);\n }\n\n /* Content alignment */\n\n &:where([data-align='center']) {\n justify-content: center;\n }\n\n &:where([data-align='start']) {\n justify-content: flex-start;\n }\n }\n\n & :where([data-component='leadingVisual']) {\n grid-area: leadingVisual;\n }\n\n & :where(.Label) {\n line-height: var(--text-body-lineHeight-medium);\n white-space: nowrap;\n grid-area: text;\n }\n\n & :where([data-component='trailingVisual']) {\n grid-area: trailingVisual;\n }\n\n & :where([data-component='trailingAction']) {\n margin-right: calc(var(--base-size-4) * -1);\n }\n\n /* Size */\n\n &:where([data-size='small']) {\n height: var(--control-small-size);\n /* stylelint-disable-next-line primer/spacing */\n padding: 0 var(--control-small-paddingInline-condensed);\n gap: var(--control-small-gap);\n font-size: var(--text-body-size-small);\n\n & .ButtonContent > :not(:last-child) {\n /* stylelint-disable-next-line primer/spacing */\n margin-right: var(--control-small-gap);\n }\n\n & .Label {\n line-height: var(--text-body-lineHeight-small);\n }\n }\n\n &:where([data-size='large']) {\n height: var(--control-large-size);\n /* stylelint-disable-next-line primer/spacing */\n padding: 0 var(--control-large-paddingInline-spacious);\n gap: var(--control-large-gap);\n\n & .ButtonContent > :not(:last-child) {\n /* stylelint-disable-next-line primer/spacing */\n margin-right: var(--control-large-gap);\n }\n\n /* stylelint-disable-next-line selector-pseudo-class-disallowed-list -- scoped to CSS Module, audited (github/github-ui#17224) */\n &:has([data-kbd-chord]) {\n padding-inline-end: var(--base-size-8);\n }\n }\n\n /* Full width */\n\n &:where([data-block='block']) {\n width: 100%;\n }\n\n /* Wrap label text */\n\n &:where([data-label-wrap='true']) {\n min-width: fit-content;\n height: unset;\n min-height: var(--control-medium-size);\n\n & .ButtonContent {\n flex: 1 1 auto;\n align-self: stretch;\n /* stylelint-disable-next-line primer/spacing */\n padding-block: calc(var(--control-medium-paddingBlock) - var(--base-size-2));\n }\n\n & .Label {\n /* stylelint-disable-next-line declaration-property-value-keyword-no-deprecated */\n word-break: break-word;\n white-space: unset;\n }\n\n &:where([data-size='small']) {\n height: unset;\n min-height: var(--control-small-size);\n\n & .ButtonContent {\n /* stylelint-disable-next-line primer/spacing */\n padding-block: calc(var(--control-small-paddingBlock) - var(--base-size-2));\n }\n }\n\n &:where([data-size='large']) {\n height: unset;\n min-height: var(--control-large-size);\n /* stylelint-disable-next-line primer/spacing */\n padding-inline: var(--control-large-paddingInline-spacious);\n\n & .ButtonContent {\n /* stylelint-disable-next-line primer/spacing */\n padding-block: calc(var(--control-large-paddingBlock) - var(--base-size-2));\n }\n }\n }\n\n /* Loading */\n\n /* only hide label if there's no leading/trailing visuals\n * move spinner to label spot if not leading/trailing visuals\n */\n\n &:where([data-loading='true']) {\n &\n .LoadingSpinner:not(\n [data-component='leadingVisual'],\n [data-component='trailingVisual'],\n [data-component='trailingAction']\n ) {\n grid-area: text;\n margin-right: 0 !important;\n place-self: center;\n\n & + .Label {\n visibility: hidden;\n }\n }\n }\n\n /* Styles for the spinner element displayed when the Button is in a loading state.\n * Ensures the spinner is centered within its container. */\n .LoadingSpinner {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Default Variant */\n\n &:where([data-variant='default']) {\n color: var(--button-default-fgColor-rest);\n background-color: var(--button-default-bgColor-rest);\n box-shadow: var(--button-default-shadow-resting);\n\n &[aria-expanded='true'] {\n background-color: var(--button-default-bgColor-active);\n border-color: var(--button-default-borderColor-active);\n }\n\n &:hover {\n background-color: var(--button-default-bgColor-hover);\n border-color: var(--button-default-borderColor-hover);\n }\n\n &:active {\n background-color: var(--button-default-bgColor-active);\n border-color: var(--button-default-borderColor-active);\n }\n\n &:disabled,\n &[aria-disabled='true']:not([data-loading='true']) {\n color: var(--control-fgColor-disabled);\n background-color: var(--button-default-bgColor-disabled);\n border-color: var(--button-default-borderColor-disabled);\n box-shadow: none;\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-default-bgColor-disabled);\n color: var(--buttonKeybindingHint-default-fgColor-disabled);\n border-color: var(--buttonKeybindingHint-default-borderColor-disabled);\n }\n }\n\n & .CounterLabel {\n background-color: var(--buttonCounter-default-bgColor-rest) !important; /* temporarily override our own sx prop */\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-default-bgColor-rest);\n color: var(--buttonKeybindingHint-default-fgColor-rest);\n border-color: var(--buttonKeybindingHint-default-borderColor-rest);\n }\n\n &:where(.IconButton) {\n color: var(--fgColor-muted);\n }\n }\n\n /* Primary variant */\n\n &:where([data-variant='primary']) {\n color: var(--button-primary-fgColor-rest);\n background-color: var(--button-primary-bgColor-rest);\n border-color: var(--button-primary-borderColor-rest);\n box-shadow: var(--shadow-resting-small);\n\n &[aria-expanded='true'] {\n background-color: var(--button-primary-bgColor-active);\n box-shadow: var(--button-primary-shadow-selected);\n }\n\n &:hover {\n background-color: var(--button-primary-bgColor-hover);\n border-color: var(--button-primary-borderColor-hover);\n }\n\n &:focus-visible {\n @mixin focusOutlineOnEmphasis;\n }\n\n &:active {\n background-color: var(--button-primary-bgColor-active);\n box-shadow: var(--button-primary-shadow-selected);\n }\n\n &:disabled,\n &[aria-disabled='true']:not([data-loading='true']) {\n color: var(--button-primary-fgColor-disabled);\n background-color: var(--button-primary-bgColor-disabled);\n border-color: var(--button-primary-borderColor-disabled);\n box-shadow: none;\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-primary-bgColor-disabled);\n color: var(--buttonKeybindingHint-primary-fgColor-disabled);\n border-color: var(--buttonKeybindingHint-primary-borderColor-disabled);\n }\n }\n\n & .CounterLabel {\n color: var(--button-primary-fgColor-rest) !important; /* temporarily override our own sx prop */\n background-color: var(--buttonCounter-primary-bgColor-rest) !important; /* temporarily override our own sx prop */\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-primary-bgColor-rest);\n color: var(--buttonKeybindingHint-primary-fgColor-rest);\n border-color: var(--buttonKeybindingHint-primary-borderColor-rest);\n }\n\n /* temporarily using the fgColor to match legacy and reduce visual changes- will eventually be iconColor */\n & .Visual {\n color: var(--button-primary-fgColor-rest);\n }\n }\n\n /* Danger variant */\n\n &:where([data-variant='danger']) {\n color: var(--button-danger-fgColor-rest);\n background-color: var(--button-danger-bgColor-rest);\n box-shadow: var(--button-default-shadow-resting);\n\n &[aria-expanded='true'] {\n color: var(--button-danger-fgColor-active);\n background-color: var(--button-danger-bgColor-active);\n border-color: var(--button-danger-borderColor-active);\n box-shadow: var(--button-danger-shadow-selected);\n\n & .Visual {\n color: var(--button-danger-iconColor-hover);\n }\n }\n\n &:hover {\n color: var(--button-danger-fgColor-hover);\n background-color: var(--button-danger-bgColor-hover);\n border-color: var(--button-danger-borderColor-hover);\n box-shadow: var(--shadow-resting-small);\n\n & .CounterLabel {\n color: var(--buttonCounter-danger-fgColor-hover) !important; /* temporarily override our own sx prop */\n background-color: var(--buttonCounter-danger-bgColor-hover) !important;\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-danger-bgColor-hover);\n color: var(--buttonKeybindingHint-danger-fgColor-hover);\n border-color: var(--buttonKeybindingHint-danger-borderColor-hover);\n transition: 80ms ease-out;\n }\n\n & .Visual {\n color: var(--button-danger-iconColor-hover);\n }\n }\n\n &:active {\n color: var(--button-danger-fgColor-active);\n background-color: var(--button-danger-bgColor-active);\n border-color: var(--button-danger-borderColor-active);\n box-shadow: var(--button-danger-shadow-selected);\n\n & .CounterLabel {\n color: var(--buttonCounter-danger-fgColor-hover) !important; /* temporarily override our own sx prop */\n background-color: var(--buttonCounter-danger-bgColor-hover) !important;\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-danger-bgColor-active);\n color: var(--buttonKeybindingHint-danger-fgColor-active);\n border-color: var(--buttonKeybindingHint-danger-borderColor-active);\n transition: 80ms ease-out;\n }\n\n & .Visual {\n color: var(--button-danger-iconColor-hover);\n }\n }\n\n &:disabled,\n &[aria-disabled='true']:not([data-loading='true']) {\n color: var(--button-danger-fgColor-disabled);\n background-color: var(--button-danger-bgColor-disabled);\n border-color: var(--button-default-borderColor-disabled);\n box-shadow: none;\n\n & .CounterLabel {\n color: var(--buttonCounter-danger-fgColor-disabled) !important; /* temporarily override our own sx prop */\n background-color: var(--buttonCounter-danger-bgColor-disabled) !important;\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-danger-bgColor-disabled);\n color: var(--buttonKeybindingHint-danger-fgColor-disabled);\n border-color: var(--buttonKeybindingHint-danger-borderColor-disabled);\n }\n }\n\n & .CounterLabel {\n color: var(--buttonCounter-danger-fgColor-rest) !important; /* temporarily override our own sx prop */\n background-color: var(--buttonCounter-danger-bgColor-rest) !important;\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-danger-bgColor-rest);\n color: var(--buttonKeybindingHint-danger-fgColor-rest);\n border-color: var(--buttonKeybindingHint-danger-borderColor-rest);\n }\n\n & .Visual {\n color: var(--button-danger-iconColor-rest);\n }\n }\n\n /* Invisible variant */\n\n &:where([data-variant='invisible']) {\n color: var(--button-default-fgColor-rest);\n border-color: var(--button-invisible-borderColor-rest);\n box-shadow: none;\n\n &[aria-expanded='true'] {\n background-color: var(--button-invisible-bgColor-active);\n }\n\n &:hover {\n background-color: var(--button-invisible-bgColor-hover);\n border-color: var(--button-invisible-borderColor-hover);\n\n & .Visual {\n color: var(--button-invisible-iconColor-hover);\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-invisible-bgColor-hover);\n transition: 80ms ease-out;\n }\n }\n\n &:active {\n background-color: var(--button-invisible-bgColor-active);\n\n & .Visual {\n color: var(--button-invisible-iconColor-hover);\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-invisible-bgColor-active);\n transition: 80ms ease-out;\n }\n }\n\n &:disabled,\n &[aria-disabled='true']:not([data-loading='true']) {\n color: var(--button-invisible-fgColor-disabled);\n background-color: var(--button-invisible-bgColor-disabled);\n border-color: var(--button-invisible-borderColor-disabled);\n box-shadow: none;\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-invisible-bgColor-disabled);\n color: var(--buttonKeybindingHint-invisible-fgColor-disabled);\n border-color: var(--buttonKeybindingHint-invisible-borderColor-disabled);\n }\n }\n\n & .Visual {\n color: var(--button-invisible-iconColor-rest);\n }\n\n & .CounterLabel {\n background-color: var(--buttonCounter-invisible-bgColor-rest) !important;\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-invisible-bgColor-rest);\n color: var(--buttonKeybindingHint-invisible-fgColor-rest);\n border-color: var(--buttonKeybindingHint-invisible-borderColor-rest);\n }\n\n &:where(.IconButton) {\n color: var(--button-invisible-iconColor-rest);\n }\n }\n\n /* Link variant */\n\n &:where([data-variant='link']) {\n display: inline-flex;\n min-width: fit-content;\n height: unset;\n padding: 0;\n font-size: inherit;\n color: var(--fgColor-link);\n text-align: left;\n border: unset;\n border-radius: 0;\n\n &:hover:not(:disabled, [data-inactive]) {\n text-decoration: underline;\n }\n\n &:focus-visible,\n &:focus {\n outline-offset: 2px;\n }\n\n &:disabled,\n &[aria-disabled='true']:not([data-loading='true']) {\n color: var(--control-fgColor-disabled);\n background-color: transparent;\n border-color: transparent;\n }\n\n & .Label {\n white-space: unset;\n }\n\n &:where([data-inactive]) {\n color: var(--button-inactive-fgColor);\n background: transparent !important;\n }\n\n & .Visual {\n color: var(--fgColor-link);\n }\n }\n\n [data-a11y-link-underlines='true'] &:where([data-variant='link']) {\n &[data-no-visuals] {\n text-decoration: underline;\n\n &:hover {\n text-decoration: none;\n }\n }\n\n &:not([data-no-visuals]) {\n background-image: linear-gradient(to right, currentColor, currentColor);\n background-size: 100% 1.5px;\n background-position: 0 calc(100% - 2px);\n background-repeat: no-repeat;\n\n &:hover {\n text-decoration: none;\n }\n }\n }\n\n [data-a11y-link-underlines='false'] &:where([data-variant='link']) {\n &[data-no-visuals] {\n text-decoration: none;\n background-image: none;\n }\n\n &:not([data-no-visuals]) {\n background-image: none;\n }\n }\n\n /* Inactive */\n\n &:where([data-inactive]),\n &:where([data-inactive]):hover,\n &:where([data-inactive]):active {\n color: var(--button-inactive-fgColor);\n cursor: auto;\n background-color: var(--button-inactive-bgColor);\n /* stylelint-disable-next-line primer/colors */\n border-color: var(--button-inactive-bgColor);\n box-shadow: none;\n\n & .Visual,\n & .CounterLabel {\n color: inherit !important;\n }\n\n & [data-kbd-chord] {\n background: var(--buttonKeybindingHint-inactive-bgColor);\n color: var(--buttonKeybindingHint-inactive-fgColor);\n border-color: var(--buttonKeybindingHint-inactive-borderColor);\n }\n }\n\n /* Icon-only + Counter */\n\n &:where([data-icon-only-counter]) {\n /* stylelint-disable-next-line primer/spacing */\n padding-inline: var(--control-medium-paddingInline-condensed);\n\n &:where([data-size='small']) {\n /* stylelint-disable-next-line primer/spacing */\n padding-inline: var(--control-xsmall-paddingInline-condensed);\n }\n\n &:where([data-size='large']) {\n /* stylelint-disable-next-line primer/spacing */\n padding-inline: var(--control-large-paddingInline-normal);\n }\n }\n}\n\n.ConditionalWrapper {\n display: block;\n}\n\n.ConditionalWrapperLink {\n display: inline-flex;\n}\n\n[data-kbd-chord] {\n transition: 80ms ease-in;\n transition-property: color, background-color, border-color;\n}\n","@define-mixin focusOutline $outlineOffset: -2px, $outlineColor: var(--focus-outline-color, var(--focus-outlineColor)) {\n outline: 2px solid $outlineColor;\n outline-offset: $outlineOffset;\n box-shadow: none;\n}\n","/* outline with fg box-shadow for buttons */\n@define-mixin focusOutlineOnEmphasis $outlineOffset: -2px,\n $outlineColor: var(--focus-outline-color, var(--focus-outlineColor)) {\n outline: 2px solid $outlineColor;\n outline-offset: $outlineOffset;\n /* stylelint-disable-next-line primer/box-shadow */\n box-shadow: inset 0 0 0 3px var(--fgColor-onEmphasis);\n}\n"]}
|