mirror of
https://github.com/steveiliop56/tinyauth.git
synced 2025-10-28 12:45:47 +00:00
feat: add some default icons
This commit is contained in:
18
frontend/src/components/icons/microsoft.tsx
Normal file
18
frontend/src/components/icons/microsoft.tsx
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import type { SVGProps } from "react";
|
||||||
|
|
||||||
|
export function MicrosoftIcon(props: SVGProps<SVGSVGElement>) {
|
||||||
|
return (
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="2em"
|
||||||
|
height="2em"
|
||||||
|
viewBox="0 0 256 256"
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
<path fill="#f1511b" d="M121.666 121.666H0V0h121.666z"></path>
|
||||||
|
<path fill="#80cc28" d="M256 121.666H134.335V0H256z"></path>
|
||||||
|
<path fill="#00adef" d="M121.663 256.002H0V134.336h121.663z"></path>
|
||||||
|
<path fill="#fbbc09" d="M256 256.002H134.335V134.336H256z"></path>
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
}
|
||||||
20
frontend/src/components/icons/pocket-id.tsx
Normal file
20
frontend/src/components/icons/pocket-id.tsx
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import type { SVGProps } from "react";
|
||||||
|
|
||||||
|
export function PocketIDIcon(props: SVGProps<SVGSVGElement>) {
|
||||||
|
return (
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlSpace="preserve"
|
||||||
|
width={512}
|
||||||
|
height={512}
|
||||||
|
viewBox="0 0 512 512"
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
<circle cx="256" cy="256" r="256" />
|
||||||
|
<path
|
||||||
|
d="M268.6 102.4c64.4 0 116.8 52.4 116.8 116.7 0 25.3-8 49.4-23 69.6-14.8 19.9-35 34.3-58.4 41.7l-6.5 2-15.5-76.2 4.3-2c14-6.7 23-21.1 23-36.6 0-22.4-18.2-40.6-40.6-40.6S228 195.2 228 217.6c0 15.5 9 29.8 23 36.6l4.2 2-25 153.4h-69.5V102.4z"
|
||||||
|
className="fill-white"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
}
|
||||||
24
frontend/src/components/icons/tailscale.tsx
Normal file
24
frontend/src/components/icons/tailscale.tsx
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import type { SVGProps } from "react";
|
||||||
|
|
||||||
|
export function TailscaleIcon(props: SVGProps<SVGSVGElement>) {
|
||||||
|
return (
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlSpace="preserve"
|
||||||
|
width={512}
|
||||||
|
height={512}
|
||||||
|
viewBox="0 0 512 512"
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
className="opacity-80 fill-white"
|
||||||
|
d="M65.6 318.1c35.3 0 63.9-28.6 63.9-63.9s-28.6-63.9-63.9-63.9S1.8 219 1.8 254.2s28.6 63.9 63.8 63.9m191.6 0c35.3 0 63.9-28.6 63.9-63.9s-28.6-63.9-63.9-63.9-63.9 28.6-63.9 63.9 28.6 63.9 63.9 63.9m0 193.9c35.3 0 63.9-28.6 63.9-63.9s-28.6-63.9-63.9-63.9-63.9 28.6-63.9 63.9 28.6 63.9 63.9 63.9m189.2-193.9c35.3 0 63.9-28.6 63.9-63.9s-28.6-63.9-63.9-63.9-63.9 28.6-63.9 63.9 28.6 63.9 63.9 63.9"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<path
|
||||||
|
d="M65.6 127.7c35.3 0 63.9-28.6 63.9-63.9S100.9 0 65.6 0 1.8 28.6 1.8 63.9s28.6 63.8 63.8 63.8m0 384.3c35.3 0 63.9-28.6 63.9-63.9s-28.6-63.9-63.9-63.9-63.8 28.7-63.8 63.9S30.4 512 65.6 512m191.6-384.3c35.3 0 63.9-28.6 63.9-63.9S292.5 0 257.2 0s-63.9 28.6-63.9 63.9 28.6 63.8 63.9 63.8m189.2 0c35.3 0 63.9-28.6 63.9-63.9S481.6 0 446.4 0c-35.3 0-63.9 28.6-63.9 63.9s28.6 63.8 63.9 63.8m0 384.3c35.3 0 63.9-28.6 63.9-63.9s-28.6-63.9-63.9-63.9-63.9 28.6-63.9 63.9 28.6 63.9 63.9 63.9"
|
||||||
|
className="opacity-20 fill-white"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,5 +1,10 @@
|
|||||||
import { LoginForm } from "@/components/auth/login-form";
|
import { LoginForm } from "@/components/auth/login-form";
|
||||||
|
import { GithubIcon } from "@/components/icons/github";
|
||||||
|
import { GoogleIcon } from "@/components/icons/google";
|
||||||
|
import { MicrosoftIcon } from "@/components/icons/microsoft";
|
||||||
import { OAuthIcon } from "@/components/icons/oauth";
|
import { OAuthIcon } from "@/components/icons/oauth";
|
||||||
|
import { PocketIDIcon } from "@/components/icons/pocket-id";
|
||||||
|
import { TailscaleIcon } from "@/components/icons/tailscale";
|
||||||
import {
|
import {
|
||||||
Card,
|
Card,
|
||||||
CardHeader,
|
CardHeader,
|
||||||
@@ -20,6 +25,14 @@ import { useTranslation } from "react-i18next";
|
|||||||
import { Navigate, useLocation } from "react-router";
|
import { Navigate, useLocation } from "react-router";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
|
|
||||||
|
const iconMap: Record<string, React.ReactNode> = {
|
||||||
|
google: <GoogleIcon />,
|
||||||
|
github: <GithubIcon />,
|
||||||
|
tailscale: <TailscaleIcon />,
|
||||||
|
microsoft: <MicrosoftIcon />,
|
||||||
|
pocketid: <PocketIDIcon />,
|
||||||
|
};
|
||||||
|
|
||||||
export const LoginPage = () => {
|
export const LoginPage = () => {
|
||||||
const { isLoggedIn } = useUserContext();
|
const { isLoggedIn } = useUserContext();
|
||||||
const { providers, title, oauthAutoRedirect } = useAppContext();
|
const { providers, title, oauthAutoRedirect } = useAppContext();
|
||||||
@@ -141,8 +154,9 @@ export const LoginPage = () => {
|
|||||||
<div className="flex flex-col gap-2 items-center justify-center">
|
<div className="flex flex-col gap-2 items-center justify-center">
|
||||||
{oauthProviders.map((provider) => (
|
{oauthProviders.map((provider) => (
|
||||||
<OAuthButton
|
<OAuthButton
|
||||||
|
key={provider.id}
|
||||||
title={provider.name}
|
title={provider.name}
|
||||||
icon={<OAuthIcon />}
|
icon={iconMap[provider.id] ?? <OAuthIcon />}
|
||||||
className="w-full"
|
className="w-full"
|
||||||
onClick={() => oauthMutation.mutate(provider.id)}
|
onClick={() => oauthMutation.mutate(provider.id)}
|
||||||
loading={
|
loading={
|
||||||
|
|||||||
Reference in New Issue
Block a user