Skip to content

Commit d30bcba

Browse files
authored
Improve Button and ButtonGroup styling (#3540)
1 parent fb858a1 commit d30bcba

File tree

12 files changed

+102
-86
lines changed

12 files changed

+102
-86
lines changed

.changeset/big-rockets-sniff.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"gitbook": patch
3+
---
4+
5+
Improve `Button` and `ButtonGroup` styling

packages/gitbook/src/components/AIActions/AIActions.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,13 +231,15 @@ function AIActionWrapper(props: {
231231
}
232232
size="xsmall"
233233
variant="secondary"
234-
label={shortLabel || label}
234+
label={label ?? shortLabel}
235235
className="bg-tint-base text-sm"
236236
onClick={onClick}
237237
href={href}
238238
target={href ? '_blank' : undefined}
239239
disabled={disabled || loading}
240-
/>
240+
>
241+
{shortLabel}
242+
</Button>
241243
);
242244
}
243245

packages/gitbook/src/components/AIActions/AIActionsDropdown.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
} from '@/components/AIActions/AIActions';
99
import { Button, ButtonGroup } from '@/components/primitives/Button';
1010
import { DropdownMenu, DropdownMenuSeparator } from '@/components/primitives/DropdownMenu';
11+
import { tString, useLanguage } from '@/intl/client';
1112
import type { SiteCustomizationSettings } from '@gitbook/api';
1213

1314
import { Icon } from '@gitbook/icons';
@@ -25,6 +26,7 @@ interface AIActionsDropdownProps {
2526
*/
2627
export function AIActionsDropdown(props: AIActionsDropdownProps) {
2728
const ref = useRef<HTMLDivElement>(null);
29+
const language = useLanguage();
2830

2931
return (
3032
<ButtonGroup ref={ref}>
@@ -41,6 +43,7 @@ export function AIActionsDropdown(props: AIActionsDropdownProps) {
4143
className="size-3 transition-transform group-data-[state=open]/button:rotate-180"
4244
/>
4345
}
46+
label={tString(language, 'more')}
4447
iconOnly
4548
size="xsmall"
4649
variant="secondary"

packages/gitbook/src/components/AIChat/AIChatButton.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@ import { AIChatIcon } from './AIChatIcon';
1111
/**
1212
* Button to open/close the AI chat.
1313
*/
14-
export function AIChatButton(props: { trademark: boolean }) {
15-
const { trademark } = props;
14+
export function AIChatButton(props: { trademark: boolean; withLabel: boolean }) {
15+
const { trademark, withLabel } = props;
1616
const chatController = useAIChatController();
1717
const language = useLanguage();
1818

1919
return (
2020
<Button
2121
icon={<AIChatIcon trademark={trademark} />}
2222
data-testid="ai-chat-button"
23-
iconOnly
24-
size="default"
23+
iconOnly={!withLabel}
24+
size="medium"
2525
variant="header"
2626
className={tcls('h-9 px-2.5')}
2727
label={
@@ -33,6 +33,8 @@ export function AIChatButton(props: { trademark: boolean }) {
3333
onClick={() => {
3434
chatController.open();
3535
}}
36-
/>
36+
>
37+
{withLabel ? <span className="max-md:hidden">{t(language, 'ask')}</span> : null}
38+
</Button>
3739
);
3840
}

packages/gitbook/src/components/AIChat/AIChatSuggestedQuestions.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ export default function AIChatSuggestedQuestions(props: { chatController: AIChat
1717
{DEFAULT_SUGGESTED_QUESTIONS.map((question, index) => (
1818
<Button
1919
key={question}
20-
label={question}
2120
variant="secondary"
2221
size="medium"
2322
className="max-w-full animate-[present_500ms_both] whitespace-normal"

packages/gitbook/src/components/DocumentView/CodeBlock/CodeBlockRenderer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export const CodeBlockRenderer = forwardRef(function CodeBlockRenderer(
4343
</div>
4444
<CopyCodeButton
4545
codeId={id}
46-
style="z-2 mt-2 mr-2 self-start justify-self-end rounded-md bg-transparent p-1 text-tint text-xs leading-none opacity-0 ring-1 ring-tint backdrop-blur-md transition-opacity duration-75 [grid-area:2/1] hover:ring-tint-hover group-hover/codeblock:opacity-11"
46+
style="z-2 mt-2 mr-2 self-start justify-self-end leading-none opacity-0 backdrop-blur-md [grid-area:2/1] group-hover/codeblock:opacity-11"
4747
/>
4848
<pre
4949
className={tcls(

packages/gitbook/src/components/DocumentView/CodeBlock/CopyCodeButton.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import React from 'react';
44

5+
import { Button } from '@/components/primitives';
56
import { t, useLanguage } from '@/intl/client';
67
import { type ClassValue, tcls } from '@/lib/tailwind';
78

@@ -41,9 +42,14 @@ export function CopyCodeButton(props: { codeId: string; style: ClassValue }) {
4142
};
4243

4344
return (
44-
<button onClick={onClick} className={tcls(style, 'print:hidden')}>
45+
<Button
46+
size="xsmall"
47+
variant="secondary"
48+
onClick={onClick}
49+
className={tcls(style, 'translate-y-0!', 'print:hidden')}
50+
>
4551
{t(language, copied ? 'code_copied' : 'code_copy')}
46-
</button>
52+
</Button>
4753
);
4854
}
4955

packages/gitbook/src/components/PageFeedback/PageFeedbackForm.tsx

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { t, tString } from '@/intl/translate';
88
import { tcls } from '@/lib/tailwind';
99

1010
import { useTrackEvent } from '../Insights';
11-
import { Button } from '../primitives';
11+
import { Button, ButtonGroup } from '../primitives';
1212

1313
const MAX_COMMENT_LENGTH = 512;
1414

@@ -61,31 +61,29 @@ export function PageFeedbackForm(props: {
6161
<div className={tcls('flex flex-col gap-3 text-sm', className)}>
6262
<div className="flex flex-wrap items-center gap-2">
6363
<p>{t(languages, 'was_this_helpful')}</p>
64-
<div className="rounded-full border border-tint-subtle bg-tint-base contrast-more:border-tint-12">
65-
<div className="flex">
66-
<RatingButton
67-
rating={PageFeedbackRating.Good}
68-
label={tString(languages, 'was_this_helpful_positive')}
69-
onClick={() => onSubmitRating(PageFeedbackRating.Good)}
70-
active={rating === PageFeedbackRating.Good}
71-
disabled={rating !== undefined}
72-
/>
73-
<RatingButton
74-
rating={PageFeedbackRating.Ok}
75-
label={tString(languages, 'was_this_helpful_neutral')}
76-
onClick={() => onSubmitRating(PageFeedbackRating.Ok)}
77-
active={rating === PageFeedbackRating.Ok}
78-
disabled={rating !== undefined}
79-
/>
80-
<RatingButton
81-
rating={PageFeedbackRating.Bad}
82-
label={tString(languages, 'was_this_helpful_negative')}
83-
onClick={() => onSubmitRating(PageFeedbackRating.Bad)}
84-
active={rating === PageFeedbackRating.Bad}
85-
disabled={rating !== undefined}
86-
/>
87-
</div>
88-
</div>
64+
<ButtonGroup>
65+
<RatingButton
66+
rating={PageFeedbackRating.Good}
67+
label={tString(languages, 'was_this_helpful_positive')}
68+
onClick={() => onSubmitRating(PageFeedbackRating.Good)}
69+
active={rating === PageFeedbackRating.Good}
70+
disabled={rating !== undefined}
71+
/>
72+
<RatingButton
73+
rating={PageFeedbackRating.Ok}
74+
label={tString(languages, 'was_this_helpful_neutral')}
75+
onClick={() => onSubmitRating(PageFeedbackRating.Ok)}
76+
active={rating === PageFeedbackRating.Ok}
77+
disabled={rating !== undefined}
78+
/>
79+
<RatingButton
80+
rating={PageFeedbackRating.Bad}
81+
label={tString(languages, 'was_this_helpful_negative')}
82+
onClick={() => onSubmitRating(PageFeedbackRating.Bad)}
83+
active={rating === PageFeedbackRating.Bad}
84+
disabled={rating !== undefined}
85+
/>
86+
</ButtonGroup>
8987
</div>
9088
{rating ? (
9189
<div className="flex flex-col gap-2">
@@ -148,23 +146,23 @@ function RatingButton(
148146
}[rating] ?? null;
149147

150148
return (
151-
<button
149+
<Button
152150
className={tcls(
153-
'p-2 first:rounded-l-full first:pl-2.5 last:rounded-r-full last:pr-2.5 hover:bg-primary-hover hover:text-primary-strong',
151+
'border-x-0 bg-tint-base p-2 first:rounded-l-full first:border-l-1 first:pl-2.5 last:rounded-r-full last:border-r-1 last:pr-2.5 hover:bg-primary-hover hover:text-primary-strong',
154152
'disabled:cursor-not-allowed disabled:hover:bg-inherit disabled:hover:text-inherit dark:disabled:hover:text-inherit',
155153
'ring-tint contrast-more:hover:ring-1',
156154
active
157155
? 'bg-primary-active text-primary-strong disabled:hover:bg-primary-active disabled:hover:text-primary-strong contrast-more:ring-2 contrast-more:hover:ring-2'
158156
: 'disabled:opacity-7 contrast-more:disabled:ring-0'
159157
)}
160158
type="button"
161-
{...attr}
162-
aria-label={label}
163-
title={label}
159+
variant="secondary"
160+
label={label}
164161
onClick={onClick}
165-
>
166-
{ratingIcon}
167-
</button>
162+
iconOnly
163+
{...attr}
164+
icon={ratingIcon}
165+
/>
168166
);
169167
}
170168

packages/gitbook/src/components/SpaceLayout/SpaceLayout.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import type { GitBookSiteContext } from '@/lib/context';
2-
import { CustomizationAIMode, CustomizationHeaderPreset } from '@gitbook/api';
2+
import {
3+
CustomizationAIMode,
4+
CustomizationHeaderPreset,
5+
CustomizationSearchStyle,
6+
} from '@gitbook/api';
37
import React from 'react';
48

59
import { Footer } from '@/components/Footer';
@@ -62,7 +66,13 @@ export function SpaceLayout(props: {
6266
/>
6367
</React.Suspense>
6468
{aiMode === CustomizationAIMode.Assistant ? (
65-
<AIChatButton trademark={customization.trademark.enabled} />
69+
<AIChatButton
70+
withLabel={
71+
withTopHeader &&
72+
customization.styling.search === CustomizationSearchStyle.Prominent
73+
}
74+
trademark={customization.trademark.enabled}
75+
/>
6676
) : null}
6777
</div>
6878
);
Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
'use client';
22

3-
import { Icon, type IconName } from '@gitbook/icons';
3+
import type { IconName } from '@gitbook/icons';
44
import { useTheme } from 'next-themes';
55
import React from 'react';
66

77
import { tString, useLanguage } from '@/intl/client';
8-
import { tcls } from '@/lib/tailwind';
8+
import { Button, ButtonGroup } from '../primitives';
99

1010
type ThemeMode = 'light' | 'system' | 'dark';
1111

@@ -27,7 +27,7 @@ export function ThemeToggler() {
2727
};
2828

2929
return (
30-
<div role="radiogroup" className="flex flex-row gap-2">
30+
<ButtonGroup role="radiogroup" className="gap-2" combinedShape={false}>
3131
<ThemeButton
3232
active={mounted && theme === 'light'}
3333
icon="sun-bright"
@@ -46,7 +46,7 @@ export function ThemeToggler() {
4646
onClick={() => onSwitchMode('dark')}
4747
title={tString(language, 'switch_to_dark_theme')}
4848
/>
49-
</div>
49+
</ButtonGroup>
5050
);
5151
}
5252

@@ -58,38 +58,21 @@ function ThemeButton(props: {
5858
}) {
5959
const { icon, onClick, title, active } = props;
6060
return (
61-
<button
61+
<Button
6262
type="button"
6363
role="radio"
6464
onClick={onClick}
65-
aria-label={title}
66-
title={title}
65+
label={title}
6766
aria-checked={active}
68-
className={tcls(
69-
'p-2',
70-
'rounded-sm',
71-
'straight-corners:rounded-none',
72-
'circular-corners:rounded-full',
73-
'transition-all',
74-
'text-tint',
75-
'contrast-more:text-tint-strong',
76-
'hover:bg-tint-hover',
77-
'contrast-more:hover:ring-2',
78-
'contrast-more:focus:ring-2',
79-
'ring-tint',
80-
active && [
81-
'bg-primary',
82-
'theme-muted:bg-primary-hover',
83-
'[html.sidebar-filled.theme-bold.tint_&]:bg-primary-hover',
84-
'hover:bg-primary',
85-
'text-primary-strong',
86-
'contrast-more:text-primary-strong',
87-
'contrast-more:ring-1',
88-
'ring-primary',
89-
]
90-
)}
91-
>
92-
<Icon icon={icon} className={tcls('size-4')} />
93-
</button>
67+
variant="blank"
68+
size="default"
69+
className={
70+
active
71+
? 'bg-primary theme-muted:bg-primary-hover text-primary-strong ring-primary hover:bg-primary contrast-more:text-primary-strong contrast-more:ring-1 [html.sidebar-filled.theme-bold.tint_&]:bg-primary-hover'
72+
: ''
73+
}
74+
icon={icon}
75+
iconOnly
76+
/>
9477
);
9578
}

0 commit comments

Comments
 (0)