mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-04-13 00:28:45 -05:00
* Initial * Saves preferences * Include TW * mapModePreferencesToModeList * mapPoolFromPreferences initial * Preference to map pool * Adjust seed * q.looking tests * adds about created map preferences to memento in the correct spot (two preferrers) * Failing test about modes * Mode preferences to memento * Remove old Plus Voting code * Fix seeding * find match by id via kysely * View map memento * Fix up map list generation logic * Mode memento info * Future match modes * Add TODO * Migration number * Migrate test DB * Remove old map pool code * createGroupFromPrevious new * Settings styling * VC to settings * Weapon pool * Add TODOs * Progress * Adjust mode exclusion policy * Progress * Progress * Progress * Notes in progress * Note feedback after submit * Textarea styling * Unskip tests * Note sorting failing test * Private note in Q * Ownerpicksmaps later * New bottom section * Mobile layout initial * Add basic match meta * Tabs initial * Sticky tab * Unseen messages in match page * Front page i18n * Settings i18n * Looking 18n * Chat i18n * Progress * Tranfer weapon pools script * Sticky on match page * Match page translations * i18n - tiers page * Preparing page i18n * Icon * Show add note right after report
129 lines
2.6 KiB
TypeScript
129 lines
2.6 KiB
TypeScript
import { Link } from "@remix-run/react";
|
|
import type { LinkProps } from "@remix-run/react";
|
|
import clsx from "clsx";
|
|
import * as React from "react";
|
|
|
|
export interface ButtonProps
|
|
extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
variant?:
|
|
| "success"
|
|
| "outlined"
|
|
| "outlined-success"
|
|
| "destructive"
|
|
| "minimal"
|
|
| "minimal-success"
|
|
| "minimal-destructive";
|
|
size?: "miniscule" | "tiny" | "big";
|
|
loading?: boolean;
|
|
loadingText?: string;
|
|
icon?: JSX.Element;
|
|
testId?: string;
|
|
}
|
|
|
|
export function Button(props: ButtonProps) {
|
|
const {
|
|
variant,
|
|
loading,
|
|
children,
|
|
loadingText,
|
|
size,
|
|
className,
|
|
icon,
|
|
type = "button",
|
|
testId,
|
|
...rest
|
|
} = props;
|
|
return (
|
|
<button
|
|
className={clsx(
|
|
variant,
|
|
{
|
|
"disabled-opaque": props.disabled,
|
|
loading,
|
|
tiny: size === "tiny",
|
|
big: size === "big",
|
|
miniscule: size === "miniscule",
|
|
},
|
|
className,
|
|
)}
|
|
disabled={props.disabled || loading}
|
|
type={type}
|
|
data-testid={testId}
|
|
{...rest}
|
|
>
|
|
{icon &&
|
|
React.cloneElement(icon, {
|
|
className: clsx("button-icon", { lonely: !children }),
|
|
})}
|
|
{loading && loadingText ? loadingText : children}
|
|
</button>
|
|
);
|
|
}
|
|
|
|
type LinkButtonProps = Pick<
|
|
ButtonProps,
|
|
"variant" | "children" | "className" | "size" | "testId" | "icon"
|
|
> &
|
|
Pick<LinkProps, "to" | "prefetch" | "state"> & { "data-cy"?: string } & {
|
|
isExternal?: boolean;
|
|
};
|
|
|
|
export function LinkButton({
|
|
variant,
|
|
children,
|
|
size,
|
|
className,
|
|
to,
|
|
prefetch,
|
|
isExternal,
|
|
state,
|
|
testId,
|
|
icon,
|
|
}: LinkButtonProps) {
|
|
if (isExternal) {
|
|
return (
|
|
<a
|
|
className={clsx(
|
|
"button",
|
|
variant,
|
|
{ tiny: size === "tiny", big: size === "big" },
|
|
className,
|
|
)}
|
|
href={to as string}
|
|
data-testid={testId}
|
|
target="_blank"
|
|
rel="noreferrer"
|
|
>
|
|
{icon &&
|
|
React.cloneElement(icon, {
|
|
className: clsx("button-icon", {
|
|
lonely: !children,
|
|
}),
|
|
})}
|
|
{children}
|
|
</a>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<Link
|
|
className={clsx(
|
|
"button",
|
|
variant,
|
|
{ tiny: size === "tiny", big: size === "big" },
|
|
className,
|
|
)}
|
|
to={to}
|
|
data-testid={testId}
|
|
prefetch={prefetch}
|
|
state={state}
|
|
>
|
|
{icon &&
|
|
React.cloneElement(icon, {
|
|
className: clsx("button-icon", { lonely: !children }),
|
|
})}
|
|
{children}
|
|
</Link>
|
|
);
|
|
}
|