Skip to content

Commit 8e3a500

Browse files
committed
Style buttons and dropdowns more consistently
1 parent ce23afc commit 8e3a500

File tree

3 files changed

+56
-73
lines changed

3 files changed

+56
-73
lines changed

ui/src/components/Button.tsx

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,38 @@ import { forwardRef, ButtonHTMLAttributes } from "react";
22

33
interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
44
variant?: "primary" | "secondary" | "danger";
5-
size?: "sm" | "md";
65
}
76

8-
export const Button = forwardRef<HTMLButtonElement, ButtonProps>(({
9-
children,
10-
className = "",
11-
variant = "secondary",
12-
size = "md",
13-
disabled,
14-
...props
15-
}, ref) => {
16-
const baseStyles = "rounded-md font-medium transition-all duration-150 active:scale-95 focus:outline-none focus:ring-2 focus:ring-offset-2";
17-
18-
const variantStyles = {
19-
primary: "bg-blue-600 hover:bg-blue-700 active:bg-blue-800 text-white focus:ring-blue-500 disabled:bg-gray-300 disabled:text-gray-500",
20-
secondary: "bg-gray-600 hover:bg-gray-700 active:bg-gray-800 text-white focus:ring-gray-500 disabled:bg-gray-300 disabled:text-gray-500",
21-
danger: "bg-red-600 hover:bg-red-700 active:bg-red-800 text-white focus:ring-red-500 disabled:bg-gray-300 disabled:text-gray-500"
22-
};
23-
24-
const sizeStyles = {
25-
sm: "px-2 py-1 text-sm",
26-
md: "px-4 py-2 text-sm"
27-
};
28-
29-
const disabledStyles = disabled ? "cursor-not-allowed" : "cursor-pointer";
30-
31-
return (
32-
<button
33-
ref={ref}
34-
className={`${baseStyles} ${variantStyles[variant]} ${sizeStyles[size]} ${disabledStyles} ${className}`}
35-
disabled={disabled}
36-
{...props}
37-
>
38-
{children}
39-
</button>
40-
);
41-
});
7+
export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
8+
(
9+
{ children, className = "", variant = "secondary", disabled, ...props },
10+
ref,
11+
) => {
12+
const baseStyles =
13+
"px-3 py-2 text-sm rounded-md font-medium transition-all duration-150 active:scale-95 focus:outline-none focus:ring-2 focus:ring-offset-2";
4214

43-
Button.displayName = "Button";
15+
const variantStyles = {
16+
primary:
17+
"bg-blue-600 hover:bg-blue-700 active:bg-blue-800 text-white focus:ring-blue-500 disabled:bg-gray-300 disabled:text-gray-500",
18+
secondary:
19+
"bg-gray-600 hover:bg-gray-700 active:bg-gray-800 text-white focus:ring-gray-500 disabled:bg-gray-300 disabled:text-gray-500",
20+
danger:
21+
"bg-red-600 hover:bg-red-700 active:bg-red-800 text-white focus:ring-red-500 disabled:bg-gray-300 disabled:text-gray-500",
22+
};
23+
24+
const disabledStyles = disabled ? "cursor-not-allowed" : "cursor-pointer";
25+
26+
return (
27+
<button
28+
ref={ref}
29+
className={`${baseStyles} ${variantStyles[variant]} ${disabledStyles} ${className}`}
30+
disabled={disabled}
31+
{...props}
32+
>
33+
{children}
34+
</button>
35+
);
36+
},
37+
);
38+
39+
Button.displayName = "Button";

ui/src/components/Sim/modules/Playback.tsx

Lines changed: 19 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -257,11 +257,9 @@ export const Playback: FC = () => {
257257
onMouseLeave={stopSeeking}
258258
disabled={disabled}
259259
variant="secondary"
260-
size="sm"
261-
className="px-2"
262260
title={`Step backward ${1.0 * speedMultiplier}s (Ctrl + ←)`}
263261
>
264-
&lt;&lt;
262+
◀◀
265263
</Button>
266264

267265
<Button
@@ -278,11 +276,9 @@ export const Playback: FC = () => {
278276
onMouseLeave={stopSeeking}
279277
disabled={disabled}
280278
variant="secondary"
281-
size="sm"
282-
className="px-2"
283279
title={`Step backward ${0.1 * speedMultiplier}s (←)`}
284280
>
285-
&lt;
281+
286282
</Button>
287283

288284
<Button
@@ -299,11 +295,9 @@ export const Playback: FC = () => {
299295
onMouseLeave={stopSeeking}
300296
disabled={disabled}
301297
variant="secondary"
302-
size="sm"
303-
className="px-2"
304298
title={`Step forward ${0.1 * speedMultiplier}s (→)`}
305299
>
306-
&gt;
300+
307301
</Button>
308302

309303
<Button
@@ -320,33 +314,26 @@ export const Playback: FC = () => {
320314
onMouseLeave={stopSeeking}
321315
disabled={disabled}
322316
variant="secondary"
323-
size="sm"
324-
className="px-2"
325317
title={`Step forward ${1.0 * speedMultiplier}s (Ctrl + →)`}
326318
>
327-
&gt;&gt;
319+
▶▶
328320
</Button>
329321

330-
<div className="min-w-16">
331-
<label htmlFor="timelineSpeed" className="block text-xs text-gray-600">
332-
Speed
333-
</label>
334-
<select
335-
ref={speedSelectRef}
336-
name="timelineSpeed"
337-
className="mt-1 w-full text-sm"
338-
value={speedMultiplier}
339-
onChange={handleSpeedChange}
340-
disabled={disabled}
341-
title="Change speed (↑ / ↓)"
342-
>
343-
{SPEED_OPTIONS.map((speed) => (
344-
<option key={speed} value={speed}>
345-
{speed}x
346-
</option>
347-
))}
348-
</select>
349-
</div>
322+
<select
323+
ref={speedSelectRef}
324+
name="timelineSpeed"
325+
className="min-w-16 rounded-md transition-all duration-150 bg-gray-600 hover:bg-gray-700 text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500 disabled:bg-gray-300 disabled:text-gray-500 px-2 py-2 cursor-pointer disabled:cursor-not-allowed"
326+
value={speedMultiplier}
327+
onChange={handleSpeedChange}
328+
disabled={disabled}
329+
title="Change speed (↑ / ↓)"
330+
>
331+
{SPEED_OPTIONS.map((speed) => (
332+
<option key={speed} value={speed}>
333+
{speed}x
334+
</option>
335+
))}
336+
</select>
350337
</div>
351338
);
352339
};

ui/src/components/Sim/modules/Scenario.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export const Scenario: FC = () => {
1313
dispatch,
1414
} = useSimContext();
1515
const { startStream, streaming, stopStream } = useStreamMessagesHandler();
16-
const [includeTransactions, setIncludeTransactions] = useState(false);
16+
const [includeTransactions, setIncludeTransactions] = useState(true);
1717

1818
useEffect(() => {
1919
(async () => {
@@ -57,13 +57,13 @@ export const Scenario: FC = () => {
5757

5858
return (
5959
<div className="flex items-center justify-start gap-4 border-2 rounded-md p-4 border-gray-200 bg-white/80 backdrop-blur-xs">
60-
<div className="min-w-32">
61-
<label htmlFor="scenario" className="block text-xs text-gray-600">
60+
<div className="flex items-center gap-3">
61+
<label htmlFor="scenario" className="text-gray-900">
6262
Scenario
6363
</label>
6464
<select
6565
id="scenario"
66-
className="mt-1 w-full text-lg"
66+
className="text-lg rounded-md font-medium transition-all duration-150 bg-transparent border border-gray-300 hover:border-gray-400 text-gray-900 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:bg-gray-100 disabled:text-gray-500 disabled:border-gray-200 px-3 py-2 cursor-pointer disabled:cursor-not-allowed"
6767
value={activeScenario}
6868
onChange={chooseScenario}
6969
>
@@ -74,7 +74,7 @@ export const Scenario: FC = () => {
7474
</div>
7575

7676
<div className="flex flex-col gap-1">
77-
<label className="flex items-center gap-2 text-sm">
77+
<label className="flex items-center gap-2">
7878
<input
7979
type="checkbox"
8080
checked={includeTransactions}

0 commit comments

Comments
 (0)