51 | {prefix}
52 | {newValueFormatted}
53 | {suffix}
54 |
55 | );
56 | };
57 |
58 | export default NumberDynamic;
59 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | # This is a basic workflow to help you get started with Actions
2 | name: Build
3 |
4 | # Controls when the workflow will run
5 | on:
6 | # Triggers the workflow on push or pull request events but only for the master branch
7 | push:
8 | branches: [ master ]
9 |
10 | # Allows you to run this workflow manually from the Actions tab
11 | workflow_dispatch:
12 |
13 | env:
14 | IS_OUTPUT_EXPORT: true
15 |
16 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel
17 | jobs:
18 | # This workflow contains a single job called "build"
19 | build:
20 | # The type of runner that the job will run on
21 | runs-on: ubuntu-latest
22 |
23 | # Steps represent a sequence of tasks that will be executed as part of the job
24 | steps:
25 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
26 | - name: Checkout
27 | uses: actions/checkout@v2
28 | - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'dist' folder
29 | run: |
30 | npm install
31 | npm run build
32 | touch out/.nojekyll
33 | - name: Deploy 🚀
34 | uses: JamesIves/github-pages-deploy-action@v4
35 | with:
36 | branch: gh-pages # The branch the action should deploy to.
37 | folder: out # The folder the action should deploy.
38 |
--------------------------------------------------------------------------------
/app/page.tsx:
--------------------------------------------------------------------------------
1 | import SectionMain from "./_components/Section/Main";
2 | import { gradientBgPurplePink } from "./_lib/colors";
3 | import { appTitle } from "./_lib/config";
4 | import { Metadata } from "next";
5 | import StylePickBox from "./_components/StyleSelect/StylePickBox";
6 | import { Suspense } from "react";
7 | import { OnVisit } from "./_components/StyleSelect/OnVisit";
8 |
9 | export const metadata: Metadata = {
10 | title: appTitle,
11 | };
12 |
13 | export default function StyleSelectPage() {
14 | const styles = ["white", "basic"];
15 |
16 | return (
17 | (null);
17 |
18 | const handleFileChange = (event) => {
19 | setFile(event.currentTarget.files[0]);
20 | };
21 |
22 | const showFilename = !isRoundIcon && file;
23 |
24 | return (
25 |
26 |
27 |
36 |
42 |
43 | {showFilename && (
44 |
45 | {file.name}
46 |
47 | )}
48 |
49 | );
50 | };
51 |
52 | export default FormFilePicker;
53 |
--------------------------------------------------------------------------------
/app/_components/FormField/index.tsx:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 | import Icon from "../Icon";
3 | import { FormFieldData } from "./interface";
4 | import FieldLabel from "./FieldLabel";
5 |
6 | type Props = {
7 | label?: string;
8 | labelFor?: string;
9 | help?: string;
10 | icon?: string;
11 | isBorderless?: boolean;
12 | isTransparent?: boolean;
13 | hasTextareaHeight?: boolean;
14 | children: (fieldData: FormFieldData) => ReactNode;
15 | };
16 |
17 | const FormField = ({ children, ...props }: Props) => {
18 | const fieldData: FormFieldData = {
19 | className: [
20 | "px-3 py-2 max-w-full border-gray-700 rounded-sm w-full dark:placeholder-gray-400",
21 | "focus:ring-3 focus:ring-blue-600 focus:border-blue-600 focus:outline-hidden",
22 | props.hasTextareaHeight ? "h-24" : "h-12",
23 | props.isBorderless ? "border-0" : "border",
24 | props.isTransparent ? "bg-transparent" : "bg-white dark:bg-slate-800",
25 | props.icon ? "pl-10" : "",
26 | ].join(" "),
27 | };
28 |
29 | return (
30 |
31 | {props.label &&
{props.label} }
32 |
33 | {children(fieldData)}
34 | {props.icon && (
35 |
41 | )}
42 |
43 | {props.help && (
44 |
{props.help}
45 | )}
46 |
47 | );
48 | };
49 |
50 | export default FormField;
51 |
--------------------------------------------------------------------------------
/app/login/_components/LoginForm.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { Formik, Form, Field } from "formik";
4 | import { useRouter } from "next/navigation";
5 | import Button from "../../_components/Button";
6 | import Buttons from "../../_components/Buttons";
7 | import Divider from "../../_components/Divider";
8 | import FormField from "../../_components/FormField";
9 | import FormCheckRadio from "../../_components/FormField/CheckRadio";
10 |
11 | type LoginForm = {
12 | login: string;
13 | password: string;
14 | remember: boolean;
15 | };
16 |
17 | export default function LoginForm() {
18 | const router = useRouter();
19 |
20 | const handleSubmit = (formValues: LoginForm) => {
21 | router.push("/dashboard");
22 | console.log("Form values", formValues);
23 | };
24 |
25 | const initialValues: LoginForm = {
26 | login: "john.doe",
27 | password: "bG1sL9eQ1uD2sK3b",
28 | remember: true,
29 | };
30 | return (
31 |
32 |
52 |
53 | );
54 | }
55 |
--------------------------------------------------------------------------------
/app/_components/CardBox/Modal.tsx:
--------------------------------------------------------------------------------
1 | import { mdiClose } from "@mdi/js";
2 | import { ReactNode } from "react";
3 | import type { ColorButtonKey } from "../../_interfaces";
4 | import Button from "../Button";
5 | import Buttons from "../Buttons";
6 | import CardBox from ".";
7 | import CardBoxComponentTitle from "./Component/Title";
8 | import OverlayLayer from "../OverlayLayer";
9 |
10 | type Props = {
11 | title: string;
12 | buttonColor: ColorButtonKey;
13 | buttonLabel: string;
14 | isActive: boolean;
15 | children: ReactNode;
16 | onConfirm: () => void;
17 | onCancel?: () => void;
18 | };
19 |
20 | const CardBoxModal = ({
21 | title,
22 | buttonColor,
23 | buttonLabel,
24 | isActive,
25 | children,
26 | onConfirm,
27 | onCancel,
28 | }: Props) => {
29 | if (!isActive) {
30 | return null;
31 | }
32 |
33 | const footer = (
34 |
35 |
36 | {!!onCancel && (
37 |
38 | )}
39 |
40 | );
41 |
42 | return (
43 |
44 |
49 |
50 | {!!onCancel && (
51 |
52 | )}
53 |
54 |
55 | {children}
56 |
57 |
58 | );
59 | };
60 |
61 | export default CardBoxModal;
62 |
--------------------------------------------------------------------------------
/app/_components/CardBox/Widget.tsx:
--------------------------------------------------------------------------------
1 | import { mdiCog } from "@mdi/js";
2 | import React from "react";
3 | import { ColorKey, TrendType } from "../../_interfaces";
4 | import { colorsText } from "../../_lib/colors";
5 | import Button from "../Button";
6 | import Icon from "../Icon";
7 | import CardBox from ".";
8 | import NumberDynamic from "../NumberDynamic";
9 | import PillTagTrend from "../PillTag/Trend";
10 |
11 | type Props = {
12 | number: number;
13 | numberPrefix?: string;
14 | numberSuffix?: string;
15 | icon: string;
16 | iconColor: ColorKey;
17 | label: string;
18 | trendLabel?: string;
19 | trendType?: TrendType;
20 | trendColor?: ColorKey;
21 | };
22 |
23 | const CardBoxWidget = (props: Props) => {
24 | return (
25 |
26 | {props.trendLabel && props.trendType && props.trendColor && (
27 |
36 | )}
37 |
38 |
39 |
{props.label}
40 |
41 |
46 |
47 |
48 | {props.icon && (
49 |
50 | )}
51 |
52 |
53 | );
54 | };
55 |
56 | export default CardBoxWidget;
57 |
--------------------------------------------------------------------------------
/app/dashboard/_lib/menuAside.ts:
--------------------------------------------------------------------------------
1 | import {
2 | mdiAccountCircle,
3 | mdiMonitor,
4 | mdiGithub,
5 | mdiLock,
6 | mdiAlertCircle,
7 | mdiSquareEditOutline,
8 | mdiTable,
9 | mdiViewList,
10 | mdiTelevisionGuide,
11 | mdiResponsive,
12 | mdiPalette,
13 | mdiVuejs,
14 | } from "@mdi/js";
15 | import { MenuAsideItem } from "../../_interfaces";
16 |
17 | const menuAside: MenuAsideItem[] = [
18 | {
19 | href: "/dashboard",
20 | icon: mdiMonitor,
21 | label: "Dashboard",
22 | },
23 | {
24 | href: "/dashboard/tables",
25 | label: "Tables",
26 | icon: mdiTable,
27 | },
28 | {
29 | href: "/dashboard/forms",
30 | label: "Forms",
31 | icon: mdiSquareEditOutline,
32 | },
33 | {
34 | href: "/dashboard/ui",
35 | label: "UI",
36 | icon: mdiTelevisionGuide,
37 | },
38 | {
39 | href: "/dashboard/responsive",
40 | label: "Responsive",
41 | icon: mdiResponsive,
42 | },
43 | {
44 | href: "/",
45 | label: "Styles",
46 | icon: mdiPalette,
47 | },
48 | {
49 | href: "/dashboard/profile",
50 | label: "Profile",
51 | icon: mdiAccountCircle,
52 | },
53 | {
54 | href: "/login",
55 | label: "Login",
56 | icon: mdiLock,
57 | },
58 | {
59 | href: "/error",
60 | label: "Error",
61 | icon: mdiAlertCircle,
62 | },
63 | {
64 | label: "Dropdown",
65 | icon: mdiViewList,
66 | menu: [
67 | {
68 | label: "Item One",
69 | },
70 | {
71 | label: "Item Two",
72 | },
73 | ],
74 | },
75 | {
76 | href: "https://github.com/justboil/admin-one-react-tailwind",
77 | label: "GitHub",
78 | icon: mdiGithub,
79 | target: "_blank",
80 | },
81 | {
82 | href: "https://github.com/justboil/admin-one-vue-tailwind",
83 | label: "Vue version",
84 | icon: mdiVuejs,
85 | target: "_blank",
86 | },
87 | ];
88 |
89 | export default menuAside;
90 |
--------------------------------------------------------------------------------
/app/_components/CardBox/User.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { mdiCheckDecagram } from "@mdi/js";
4 | import { Field, Form, Formik } from "formik";
5 | import { useAppSelector } from "../../_stores/hooks";
6 | import CardBox from ".";
7 | import FormCheckRadio from "../FormField/CheckRadio";
8 | import PillTag from "../PillTag";
9 | import UserAvatarCurrentUser from "../../dashboard/_components/UserAvatar/CurrentUser";
10 |
11 | type Props = {
12 | className?: string;
13 | };
14 |
15 | const CardBoxUser = ({ className }: Props) => {
16 | const userName = useAppSelector((state) => state.main.userName);
17 |
18 | return (
19 |
20 |
21 |
22 |
23 |
24 | alert(JSON.stringify(values, null, 2))}
29 | >
30 |
35 |
36 |
37 |
38 | Howdy, {userName} !
39 |
40 |
41 | Last login 12 mins ago from 127.0.0.1
42 |
43 |
46 |
47 |
48 |
49 | );
50 | };
51 |
52 | export default CardBoxUser;
53 |
--------------------------------------------------------------------------------
/app/dashboard/tables/page.tsx:
--------------------------------------------------------------------------------
1 | import { mdiGithub, mdiMonitorCellphone, mdiTableBorder, mdiTableOff } from "@mdi/js";
2 | import Button from "../../_components/Button";
3 | import CardBox from "../../_components/CardBox";
4 | import CardBoxComponentEmpty from "../../_components/CardBox/Component/Empty";
5 | import NotificationBar from "../../_components/NotificationBar";
6 | import SectionMain from "../../_components/Section/Main";
7 | import SectionTitleLineWithButton from "../../_components/Section/TitleLineWithButton";
8 | import TableSampleClients from "../_components/Table/SampleClients";
9 | import { getPageTitle } from "../../_lib/config";
10 | import { clients } from "../_lib/sampleData";
11 | import { Metadata } from "next";
12 |
13 | export const metadata: Metadata = {
14 | title: getPageTitle("Tables"),
15 | };
16 |
17 | export default function TablesPage() {
18 | return (
19 |
20 |
21 |
30 |
31 |
32 |
33 | Responsive table. Collapses on mobile
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 | Empty card. When there's nothing to show
44 |
45 |
46 |
47 |
48 |
49 |
50 | );
51 | }
52 |
--------------------------------------------------------------------------------
/app/dashboard/_components/NavBar/index.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import React, { ReactNode, useState } from "react";
4 | import { mdiClose, mdiDotsVertical } from "@mdi/js";
5 | import { containerMaxW } from "../../../_lib/config";
6 | import Icon from "../../../_components/Icon";
7 | import NavBarItemPlain from "./Item/Plain";
8 | import NavBarMenuList from "./MenuList";
9 | import { MenuNavBarItem } from "../../../_interfaces";
10 |
11 | type Props = {
12 | menu: MenuNavBarItem[];
13 | className: string;
14 | children: ReactNode;
15 | };
16 |
17 | export default function NavBar({ menu, className = "", children }: Props) {
18 | const [isMenuNavBarActive, setIsMenuNavBarActive] = useState(false);
19 |
20 | const handleMenuNavBarToggleClick = () => {
21 | setIsMenuNavBarActive(!isMenuNavBarActive);
22 | };
23 |
24 | const handleRouteChange = () => {
25 | setIsMenuNavBarActive(false);
26 | };
27 |
28 | return (
29 |
32 |
33 |
{children}
34 |
35 |
36 |
37 |
38 |
39 |
44 |
45 |
46 |
47 |
48 | );
49 | }
50 |
--------------------------------------------------------------------------------
/app/_components/CardBox/Transaction.tsx:
--------------------------------------------------------------------------------
1 | import { mdiCashMinus, mdiCashPlus, mdiCreditCard, mdiReceipt } from "@mdi/js";
2 | import React from "react";
3 | import { Transaction } from "../../_interfaces";
4 | import CardBox from ".";
5 | import IconRounded from "../Icon/Rounded";
6 | import PillTag from "../PillTag";
7 |
8 | type Props = {
9 | transaction: Transaction;
10 | };
11 |
12 | const CardBoxTransaction = (props: Props) => {
13 | const icon = {
14 | withdraw: mdiCashMinus,
15 | deposit: mdiCashPlus,
16 | invoice: mdiReceipt,
17 | payment: mdiCreditCard,
18 | }[props.transaction.type];
19 |
20 | const typeColor = () => {
21 | switch (props.transaction.type) {
22 | case "withdraw":
23 | return "danger";
24 | case "deposit":
25 | return "success";
26 | case "invoice":
27 | return "warning";
28 | case "payment":
29 | return "info";
30 | }
31 | };
32 |
33 | return (
34 |
35 |
36 |
37 |
38 |
39 |
${props.transaction.amount}
40 |
41 | {props.transaction.date} via {props.transaction.business}
42 |
43 |
44 |
45 |
46 |
{props.transaction.name}
47 |
50 |
51 |
52 |
53 | );
54 | };
55 |
56 | export default CardBoxTransaction;
57 |
--------------------------------------------------------------------------------
/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { Metadata } from "next";
2 | import "../css/main.css";
3 | import StoreProvider from "./_stores/StoreProvider";
4 | import Script from "next/script";
5 |
6 | const title = `Admin One React Tailwind free`;
7 |
8 | const description = "Admin One - free React Next Tailwind dashboard with TypeScript and dark mode";
9 |
10 | const url = "https://justboil.github.io/admin-one-react-tailwind/";
11 |
12 | const image = `https://static.justboil.me/templates/one/repo-tailwind-react.png`;
13 |
14 | const imageWidth = "1920";
15 |
16 | const imageHeight = "960";
17 |
18 | export const metadata: Metadata = {
19 | title,
20 | description,
21 | icons: "/admin-one-react-tailwind/favicon.png",
22 | twitter: {
23 | card: "summary_large_image",
24 | title,
25 | description,
26 | images: {
27 | url: image,
28 | width: imageWidth,
29 | height: imageHeight,
30 | },
31 | },
32 | openGraph: {
33 | url,
34 | title,
35 | images: {
36 | url: image,
37 | width: imageWidth,
38 | height: imageHeight,
39 | },
40 | },
41 | };
42 |
43 | export default function RootLayout({
44 | children,
45 | }: Readonly<{
46 | children: React.ReactNode;
47 | }>) {
48 | return (
49 |
50 |
51 |
55 |
56 |
64 |
65 | {children}
66 |
67 |
68 |
69 | );
70 | }
71 |
--------------------------------------------------------------------------------
/app/dashboard/_lib/menuNavBar.ts:
--------------------------------------------------------------------------------
1 | import {
2 | mdiMenu,
3 | mdiClockOutline,
4 | mdiCloud,
5 | mdiCrop,
6 | mdiAccount,
7 | mdiCogOutline,
8 | mdiEmail,
9 | mdiLogout,
10 | mdiThemeLightDark,
11 | mdiGithub,
12 | mdiVuejs,
13 | } from "@mdi/js";
14 | import { MenuNavBarItem } from "../../_interfaces";
15 |
16 | const menuNavBar: MenuNavBarItem[] = [
17 | {
18 | icon: mdiMenu,
19 | label: "Sample menu",
20 | menu: [
21 | {
22 | icon: mdiClockOutline,
23 | label: "Item One",
24 | },
25 | {
26 | icon: mdiCloud,
27 | label: "Item Two",
28 | },
29 | {
30 | isDivider: true,
31 | },
32 | {
33 | icon: mdiCrop,
34 | label: "Item Last",
35 | },
36 | ],
37 | },
38 | {
39 | isCurrentUser: true,
40 | menu: [
41 | {
42 | icon: mdiAccount,
43 | label: "My Profile",
44 | href: "/dashboard/profile",
45 | },
46 | {
47 | icon: mdiCogOutline,
48 | label: "Settings",
49 | },
50 | {
51 | icon: mdiEmail,
52 | label: "Messages",
53 | },
54 | {
55 | isDivider: true,
56 | },
57 | {
58 | icon: mdiLogout,
59 | label: "Log Out",
60 | isLogout: true,
61 | },
62 | ],
63 | },
64 | {
65 | icon: mdiThemeLightDark,
66 | label: "Light/Dark",
67 | isDesktopNoLabel: true,
68 | isToggleLightDark: true,
69 | },
70 | {
71 | icon: mdiGithub,
72 | label: "GitHub",
73 | isDesktopNoLabel: true,
74 | href: "https://github.com/justboil/admin-one-react-tailwind",
75 | target: "_blank",
76 | },
77 | {
78 | icon: mdiVuejs,
79 | label: "Vue version",
80 | isDesktopNoLabel: true,
81 | href: "https://github.com/justboil/admin-one-vue-tailwind",
82 | target: "_blank",
83 | },
84 | {
85 | icon: mdiLogout,
86 | label: "Log out",
87 | isDesktopNoLabel: true,
88 | isLogout: true,
89 | },
90 | ];
91 |
92 | export default menuNavBar;
93 |
--------------------------------------------------------------------------------
/app/dashboard/_components/AsideMenu/Layer.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { mdiLogout, mdiClose } from "@mdi/js";
3 | import Icon from "../../../_components/Icon";
4 | import AsideMenuItem from "./Item";
5 | import AsideMenuList from "./List";
6 | import { MenuAsideItem } from "../../../_interfaces";
7 |
8 | type Props = {
9 | menu: MenuAsideItem[];
10 | className?: string;
11 | onAsideLgCloseClick: () => void;
12 | onRouteChange: () => void;
13 | };
14 |
15 | export default function AsideMenuLayer({ menu, className = "", ...props }: Props) {
16 | const logoutItem: MenuAsideItem = {
17 | label: "Logout",
18 | icon: mdiLogout,
19 | color: "info",
20 | isLogout: true,
21 | };
22 |
23 | const handleAsideLgCloseClick = (e: React.MouseEvent) => {
24 | e.preventDefault();
25 | props.onAsideLgCloseClick();
26 | };
27 |
28 | return (
29 |
32 |
35 |
38 |
39 | One
40 |
41 |
45 |
46 |
47 |
48 |
53 |
56 |
57 |
58 | );
59 | }
60 |
--------------------------------------------------------------------------------
/css/_checkbox-radio-switch.css:
--------------------------------------------------------------------------------
1 | @theme {
2 | --checkbox-checked: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1 1'%3E%3Cpath style='fill:%23fff' d='M 0.04038059,0.6267767 0.14644661,0.52071068 0.42928932,0.80355339 0.3232233,0.90961941 z M 0.21715729,0.80355339 0.85355339,0.16715729 0.95961941,0.2732233 0.3232233,0.90961941 z'%3E%3C/path%3E%3C/svg%3E");
3 | --radio-checked: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z' /%3E%3C/svg%3E");
4 | --switch-checked: translate3d(110%, 0, 0);
5 | }
6 |
7 | @utility jb-custom-check {
8 | & {
9 | @apply inline-flex items-center cursor-pointer relative;
10 | }
11 |
12 | &.disabled {
13 | @apply cursor-not-allowed opacity-50;
14 | }
15 |
16 | & input {
17 | @apply absolute left-0 opacity-0 -z-1;
18 | }
19 |
20 | & input + .jb-check {
21 | @apply border-gray-700 border transition-colors duration-200 dark:bg-slate-800;
22 | }
23 |
24 | & input:focus + .jb-check {
25 | @apply ring-3 ring-blue-700;
26 | }
27 |
28 | &.checkbox input + .jb-check,
29 | &.radio input + .jb-check {
30 | @apply block w-5 h-5;
31 | }
32 |
33 | &.checkbox input + .jb-check {
34 | @apply rounded-sm;
35 | }
36 |
37 | &.switch input + .jb-check {
38 | @apply flex items-center shrink-0 w-12 h-6 p-0.5 bg-gray-200;
39 | }
40 |
41 | &.radio input + .jb-check,
42 | &.switch input + .jb-check,
43 | &.switch input + .jb-check:before {
44 | @apply rounded-full;
45 | }
46 |
47 | &.checkbox input:checked + .jb-check,
48 | &.radio input:checked + .jb-check {
49 | @apply bg-no-repeat bg-center border-4;
50 | }
51 |
52 | &.checkbox input:checked + .jb-check {
53 | background-image: var(--checkbox-checked);
54 | }
55 |
56 | &.radio input:checked + .jb-check {
57 | background-image: var(--radio-checked);
58 | }
59 |
60 | &.switch input:checked + .jb-check,
61 | &.checkbox input:checked + .jb-check,
62 | &.radio input:checked + .jb-check {
63 | @apply bg-blue-600 border-blue-600;
64 | }
65 |
66 | &.switch input + .jb-check:before {
67 | content: '';
68 | @apply block w-5 h-5 bg-white border border-gray-700;
69 | }
70 |
71 | &.switch input:checked + .jb-check:before {
72 | transform: var(--switch-checked);
73 | @apply border-blue-600;
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/app/dashboard/responsive/page.tsx:
--------------------------------------------------------------------------------
1 | import Image from "next/image";
2 | import SectionMain from "../../_components/Section/Main";
3 | import SectionTitle from "../../_components/Section/Title";
4 | import { appTitle, getPageTitle } from "../../_lib/config";
5 | import { Metadata } from "next";
6 |
7 | export const metadata: Metadata = {
8 | title: getPageTitle("Responsive"),
9 | };
10 |
11 | export default function ResponsivePage() {
12 | return (
13 | <>
14 | Mobile & Tablet
15 |
16 |
17 |
18 |
25 |
26 |
27 |
28 | Small laptop 1024px
29 |
30 |
31 |
32 |
39 |
40 |
41 |
42 |
43 |
44 |
51 |
52 |
53 |
54 | Laptop & desktop
55 |
56 |
57 |
58 |
65 |
66 |
67 | >
68 | );
69 | }
70 |
--------------------------------------------------------------------------------
/app/dashboard/ui/page.tsx:
--------------------------------------------------------------------------------
1 | import { mdiAlertCircle, mdiReload } from "@mdi/js";
2 | import Button from "../../_components/Button";
3 | import Buttons from "../../_components/Buttons";
4 | import CardBox from "../../_components/CardBox";
5 | import CardBoxComponentEmpty from "../../_components/CardBox/Component/Empty";
6 | import CardBoxComponentTitle from "../../_components/CardBox/Component/Title";
7 | import SectionMain from "../../_components/Section/Main";
8 | import SectionTitle from "../../_components/Section/Title";
9 | import SectionTitleLineWithButton from "../../_components/Section/TitleLineWithButton";
10 | import { getPageTitle } from "../../_lib/config";
11 | import { Metadata } from "next";
12 | import DarkModeExample from "./_components/DarkModeExample";
13 | import ModalExamples from "./_components/ModalExamples";
14 | import NotificationsExample from "./_components/NotificationsExample";
15 | import ButtonsExample from "./_components/ButtonsExample";
16 | import PillsExample from "./_components/PillsExample";
17 |
18 | export const metadata: Metadata = {
19 | title: getPageTitle("UI"),
20 | };
21 |
22 | export default function UiPage() {
23 | const CardSamplesFooter = (
24 |
25 |
26 |
27 |
28 | );
29 |
30 | return (
31 | <>
32 | Dark mode
33 |
34 |
35 |
36 | Modal examples
37 |
38 |
39 |
40 |
41 |
42 | Buttons
43 |
44 |
45 |
46 | Pills
47 |
48 |
49 |
50 | Cards
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
Card with title, icon & footer
60 |
61 |
62 |
63 |
Just body & footer
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 | >
73 | );
74 | }
75 |
--------------------------------------------------------------------------------
/app/dashboard/profile/_components/ProfileForm.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { mdiUpload, mdiAccount, mdiMail } from "@mdi/js";
4 | import { Formik, Form, Field } from "formik";
5 | import Button from "../../../_components/Button";
6 | import Buttons from "../../../_components/Buttons";
7 | import CardBox from "../../../_components/CardBox";
8 | import CardBoxComponentBody from "../../../_components/CardBox/Component/Body";
9 | import CardBoxComponentFooter from "../../../_components/CardBox/Component/Footer";
10 | import FormField from "../../../_components/FormField";
11 | import FormFilePicker from "../../../_components/FormField/FilePicker";
12 | import { UserForm } from "../../../_interfaces";
13 | import { useAppSelector } from "../../../_stores/hooks";
14 |
15 | export default function ProfileForm() {
16 | const userName = useAppSelector((state) => state.main.userName);
17 | const userEmail = useAppSelector((state) => state.main.userEmail);
18 |
19 | const userForm: UserForm = {
20 | name: userName,
21 | email: userEmail,
22 | };
23 |
24 | return (
25 |
26 |
27 |
28 | {() => }
29 |
30 |
31 |
32 |
33 | alert(JSON.stringify(values, null, 2))}
36 | >
37 |
62 |
63 |
64 |
65 | );
66 | }
67 |
--------------------------------------------------------------------------------
/app/_components/Button.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Link from "next/link";
3 | import { getButtonColor } from "../_lib/colors";
4 | import Icon from "./Icon";
5 | import type { ColorButtonKey } from "../_interfaces";
6 |
7 | type Props = {
8 | label?: string | null;
9 | icon?: string;
10 | iconSize?: string | number;
11 | href?: string;
12 | target?: string;
13 | type?: string;
14 | color?: ColorButtonKey;
15 | className?: string;
16 | asAnchor?: boolean;
17 | small?: boolean;
18 | outline?: boolean;
19 | active?: boolean;
20 | disabled?: boolean;
21 | roundedFull?: boolean;
22 | isGrouped?: boolean;
23 | onClick?: (e: React.MouseEvent) => void;
24 | };
25 |
26 | export default function Button({
27 | label,
28 | icon,
29 | iconSize,
30 | href,
31 | target,
32 | type,
33 | color = "white",
34 | className = "",
35 | asAnchor = false,
36 | small = false,
37 | outline = false,
38 | active = false,
39 | disabled = false,
40 | roundedFull = false,
41 | onClick,
42 | ...props
43 | }: Props) {
44 | const componentClass = [
45 | "inline-flex",
46 | "justify-center",
47 | "items-center",
48 | "whitespace-nowrap",
49 | "focus:outline-hidden",
50 | "transition-colors",
51 | "focus:ring-3",
52 | "duration-150",
53 | "border",
54 | disabled ? "cursor-not-allowed" : "cursor-pointer",
55 | roundedFull ? "rounded-full" : "rounded-sm",
56 | getButtonColor(color, outline, !disabled, active),
57 | className,
58 | ];
59 |
60 | if (props.isGrouped) {
61 | componentClass.push("mr-3 last:mr-0 mb-3");
62 | }
63 |
64 | if (!label && icon) {
65 | componentClass.push("p-1");
66 | } else if (small) {
67 | componentClass.push("text-sm", roundedFull ? "px-3 py-1" : "p-1");
68 | } else {
69 | componentClass.push("py-2", roundedFull ? "px-6" : "px-3");
70 | }
71 |
72 | if (disabled) {
73 | componentClass.push(outline ? "opacity-50" : "opacity-70");
74 | }
75 |
76 | const componentClassString = componentClass.join(" ");
77 |
78 | const componentChildren = (
79 | <>
80 | {icon && }
81 | {label && {label} }
82 | >
83 | );
84 |
85 | if (href && !disabled) {
86 | return (
87 |
88 | {componentChildren}
89 |
90 | );
91 | }
92 |
93 | return React.createElement(
94 | asAnchor ? "a" : "button",
95 | {
96 | className: componentClassString,
97 | type: type ?? "button",
98 | target,
99 | disabled,
100 | onClick,
101 | },
102 | componentChildren,
103 | );
104 | }
105 |
--------------------------------------------------------------------------------
/app/dashboard/_components/AsideMenu/Item.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import React, { useEffect, useState } from "react";
4 | import { mdiMinus, mdiPlus } from "@mdi/js";
5 | import Icon from "../../../_components/Icon";
6 | import Link from "next/link";
7 | import { getButtonColor } from "../../../_lib/colors";
8 | import AsideMenuList from "./List";
9 | import { MenuAsideItem } from "../../../_interfaces";
10 | import { usePathname } from "next/navigation";
11 |
12 | type Props = {
13 | item: MenuAsideItem;
14 | onRouteChange: () => void;
15 | isDropdownList?: boolean;
16 | };
17 |
18 | const AsideMenuItem = ({ item, isDropdownList = false, ...props }: Props) => {
19 | const [isLinkActive, setIsLinkActive] = useState(false);
20 | const [isDropdownActive, setIsDropdownActive] = useState(false);
21 |
22 | const activeClassAddon = !item.color && isLinkActive ? "aside-menu-item-active font-bold" : "";
23 |
24 | const pathname = usePathname();
25 |
26 | useEffect(() => {
27 | setIsLinkActive(item.href === pathname);
28 | }, [item.href, pathname]);
29 |
30 | const asideMenuItemInnerContents = (
31 | <>
32 | {item.icon && (
33 |
34 | )}
35 |
40 | {item.label}
41 |
42 | {item.menu && (
43 |
48 | )}
49 | >
50 | );
51 |
52 | const componentClass = [
53 | "flex cursor-pointer",
54 | isDropdownList ? "py-3 px-6 text-sm" : "py-3",
55 | item.color
56 | ? getButtonColor(item.color, false, true)
57 | : `aside-menu-item dark:text-slate-300 dark:hover:text-white`,
58 | ].join(" ");
59 |
60 | return (
61 |
62 | {item.href && (
63 |
69 | {asideMenuItemInnerContents}
70 |
71 | )}
72 | {!item.href && (
73 | setIsDropdownActive(!isDropdownActive)}>
74 | {asideMenuItemInnerContents}
75 |
76 | )}
77 | {item.menu && (
78 |
86 | )}
87 |
88 | );
89 | };
90 |
91 | export default AsideMenuItem;
92 |
--------------------------------------------------------------------------------
/app/dashboard/ui/_components/PillsExample.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { mdiTrendingUp } from "@mdi/js";
4 | import { Formik, Field } from "formik";
5 | import Buttons from "../../../_components/Buttons";
6 | import CardBox from "../../../_components/CardBox";
7 | import Divider from "../../../_components/Divider";
8 | import FormCheckRadio from "../../../_components/FormField/CheckRadio";
9 | import FormCheckRadioGroup from "../../../_components/FormField/CheckRadioGroup";
10 | import PillTag from "../../../_components/PillTag";
11 | import SectionMain from "../../../_components/Section/Main";
12 |
13 | export default function PillsExample() {
14 | return (
15 |
16 |
17 | {}}>
18 | {({ values }) => (
19 | <>
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
41 |
49 |
57 |
65 |
73 |
74 | >
75 | )}
76 |
77 |
78 |
79 | );
80 | }
81 |
--------------------------------------------------------------------------------
/app/dashboard/profile/_components/PasswordForm.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { mdiAsterisk, mdiFormTextboxPassword } from "@mdi/js";
4 | import { Formik, Form, Field } from "formik";
5 | import Button from "../../../_components/Button";
6 | import Buttons from "../../../_components/Buttons";
7 | import CardBox from "../../../_components/CardBox";
8 | import CardBoxComponentBody from "../../../_components/CardBox/Component/Body";
9 | import CardBoxComponentFooter from "../../../_components/CardBox/Component/Footer";
10 | import Divider from "../../../_components/Divider";
11 | import FormField from "../../../_components/FormField";
12 |
13 | export default function PasswordForm() {
14 | return (
15 |
16 | alert(JSON.stringify(values, null, 2))}
23 | >
24 |
87 |
88 |
89 | );
90 | }
91 |
--------------------------------------------------------------------------------
/app/dashboard/layout.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import React, { ReactNode } from "react";
4 | import { useState } from "react";
5 | import { mdiForwardburger, mdiBackburger, mdiMenu } from "@mdi/js";
6 | import menuAside from "./_lib/menuAside";
7 | import menuNavBar from "./_lib/menuNavBar";
8 | import Icon from "../_components/Icon";
9 | import NavBar from "./_components/NavBar";
10 | import NavBarItemPlain from "./_components/NavBar/Item/Plain";
11 | import AsideMenu from "./_components/AsideMenu";
12 | import FooterBar from "./_components/FooterBar";
13 | import FormField from "../_components/FormField";
14 | import { Field, Form, Formik } from "formik";
15 |
16 | type Props = {
17 | children: ReactNode;
18 | };
19 |
20 | export default function LayoutAuthenticated({ children }: Props) {
21 | const [isAsideMobileExpanded, setIsAsideMobileExpanded] = useState(false);
22 | const [isAsideLgActive, setIsAsideLgActive] = useState(false);
23 |
24 | const handleRouteChange = () => {
25 | setIsAsideMobileExpanded(false);
26 | setIsAsideLgActive(false);
27 | };
28 |
29 | const layoutAsidePadding = "xl:pl-60";
30 |
31 | return (
32 |
33 |
38 |
42 | setIsAsideMobileExpanded(!isAsideMobileExpanded)}
45 | >
46 |
47 |
48 | setIsAsideLgActive(true)}
51 | >
52 |
53 |
54 |
55 | alert(JSON.stringify(values, null, 2))}
60 | >
61 |
68 |
69 |
70 |
71 |
setIsAsideLgActive(false)}
76 | onRouteChange={handleRouteChange}
77 | />
78 | {children}
79 |
80 | Get more with{` `}
81 |
87 | Premium version
88 |
89 |
90 |
91 |
92 | );
93 | }
94 |
--------------------------------------------------------------------------------
/app/dashboard/_components/NavBar/Item/index.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import React from "react";
4 | import Link from "next/link";
5 | import { useState } from "react";
6 | import { mdiChevronUp, mdiChevronDown } from "@mdi/js";
7 | import Divider from "../../../../_components/Divider";
8 | import Icon from "../../../../_components/Icon";
9 | import UserAvatarCurrentUser from "../../UserAvatar/CurrentUser";
10 | import NavBarMenuList from "../MenuList";
11 | import { useAppDispatch, useAppSelector } from "../../../../_stores/hooks";
12 | import { MenuNavBarItem } from "../../../../_interfaces";
13 | import { setDarkMode } from "../../../../_stores/darkModeSlice";
14 |
15 | type Props = {
16 | item: MenuNavBarItem;
17 | onRouteChange: () => void;
18 | };
19 |
20 | export default function NavBarItem({ item, ...props }: Props) {
21 | const dispatch = useAppDispatch();
22 |
23 | const userName = useAppSelector((state) => state.main.userName);
24 |
25 | const [isDropdownActive, setIsDropdownActive] = useState(false);
26 |
27 | const componentClass = [
28 | "block lg:flex items-center relative cursor-pointer",
29 | isDropdownActive
30 | ? `navbar-item-label-active dark:text-slate-400`
31 | : `navbar-item-label dark:text-white dark:hover:text-slate-400`,
32 | item.menu ? "lg:py-2 lg:px-3" : "py-2 px-3",
33 | item.isDesktopNoLabel ? "lg:w-16 lg:justify-center" : "",
34 | ].join(" ");
35 |
36 | const itemLabel = item.isCurrentUser ? userName : item.label;
37 |
38 | const handleMenuClick = () => {
39 | if (item.menu) {
40 | setIsDropdownActive(!isDropdownActive);
41 | }
42 |
43 | if (item.isToggleLightDark) {
44 | dispatch(setDarkMode(null));
45 | }
46 | };
47 |
48 | const NavBarItemComponentContents = (
49 | <>
50 |
58 | {item.isCurrentUser && }
59 | {item.icon && }
60 |
65 | {itemLabel}
66 |
67 | {item.menu && (
68 |
72 | )}
73 |
74 | {item.menu && (
75 |
80 |
81 |
82 | )}
83 | >
84 | );
85 |
86 | if (item.isDivider) {
87 | return ;
88 | }
89 |
90 | if (item.href) {
91 | return (
92 |
98 | {NavBarItemComponentContents}
99 |
100 | );
101 | }
102 |
103 | return {NavBarItemComponentContents}
;
104 | }
105 |
--------------------------------------------------------------------------------
/app/dashboard/ui/_components/NotificationsExample.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import {
4 | mdiInformation,
5 | mdiCheckCircle,
6 | mdiAlert,
7 | mdiAlertCircle,
8 | mdiContrastCircle,
9 | } from "@mdi/js";
10 | import { Formik, Field } from "formik";
11 | import Button from "../../../_components/Button";
12 | import FormCheckRadio from "../../../_components/FormField/CheckRadio";
13 | import NotificationBar from "../../../_components/NotificationBar";
14 | import SectionMain from "../../../_components/Section/Main";
15 | import SectionTitle from "../../../_components/Section/Title";
16 |
17 | export default function NotificationsExample() {
18 | return (
19 | {}}>
20 | {({ values }) => (
21 | <>
22 |
23 | Notifications
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
43 | }
44 | outline={values.outline}
45 | >
46 | Info state . NotificationBar
47 |
48 |
49 |
60 | }
61 | outline={values.outline}
62 | >
63 | Success state . NotificationBar
64 |
65 |
66 |
77 | }
78 | outline={values.outline}
79 | >
80 | Warning state . NotificationBar
81 |
82 |
83 |
94 | }
95 | outline={values.outline}
96 | >
97 | Danger state . NotificationBar
98 |
99 |
100 |
101 | Contrast . NotificationBar
102 |
103 |
104 | >
105 | )}
106 |
107 | );
108 | }
109 |
--------------------------------------------------------------------------------
/app/dashboard/page.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | mdiAccountMultiple,
3 | mdiCartOutline,
4 | mdiChartTimelineVariant,
5 | mdiGithub,
6 | mdiMonitorCellphone,
7 | } from "@mdi/js";
8 | import Button from "../_components/Button";
9 | import SectionMain from "../_components/Section/Main";
10 | import SectionTitleLineWithButton from "../_components/Section/TitleLineWithButton";
11 | import CardBoxWidget from "../_components/CardBox/Widget";
12 | import CardBoxTransaction from "../_components/CardBox/Transaction";
13 | import { Client, Transaction } from "../_interfaces";
14 | import CardBoxClient from "../_components/CardBox/Client";
15 | import SectionBannerStarOnGitHub from "../_components/Section/Banner/StarOnGitHub";
16 | import CardBox from "../_components/CardBox";
17 | import NotificationBar from "../_components/NotificationBar";
18 | import TableSampleClients from "./_components/Table/SampleClients";
19 | import { getPageTitle } from "../_lib/config";
20 | import { clients, transactions } from "./_lib/sampleData";
21 | import ChartLineSampleComponentBlock from "./_components/ChartLineSample/ComponentBlock";
22 | import { Metadata } from "next";
23 |
24 | export const metadata: Metadata = {
25 | title: getPageTitle("Dashboard"),
26 | };
27 |
28 | export default function DashboardPage() {
29 | const clientsListed = clients.slice(0, 4);
30 |
31 | return (
32 |
33 |
34 |
43 |
44 |
45 |
46 |
55 |
65 |
75 |
76 |
77 |
78 |
79 | {transactions.map((transaction: Transaction) => (
80 |
81 | ))}
82 |
83 |
84 | {clientsListed.map((client: Client) => (
85 |
86 | ))}
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 | Responsive table. Collapses on mobile
100 |
101 |
102 |
103 |
104 |
105 |
106 | );
107 | }
108 |
--------------------------------------------------------------------------------
/app/dashboard/ui/_components/ModalExamples.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { mdiClose } from "@mdi/js";
4 | import { useState } from "react";
5 | import Button from "../../../_components/Button";
6 | import Buttons from "../../../_components/Buttons";
7 | import CardBox from "../../../_components/CardBox";
8 | import CardBoxComponentTitle from "../../../_components/CardBox/Component/Title";
9 | import CardBoxModal from "../../../_components/CardBox/Modal";
10 | import SectionMain from "../../../_components/Section/Main";
11 |
12 | export default function ModalExamples() {
13 | const modalSampleCardClassName = "cursor-pointer md:w-7/12 lg:w-5/12 shadow-2xl md:mx-auto";
14 |
15 | const modalSampleContents = (
16 | <>
17 |
18 | Lorem ipsum dolor sit amet adipiscing elit
19 |
20 | This is sample modal
21 | >
22 | );
23 |
24 | const modalFooterInfo = (
25 |
26 |
27 |
28 |
29 | );
30 |
31 | const modalFooterDanger = (
32 |
33 |
34 |
35 | );
36 |
37 | const modalFooterSuccess = (
38 |
39 |
40 |
41 | );
42 |
43 | const handleModalAction = () => {
44 | setIsModalInfoActive(false);
45 | setIsModalDangerActive(false);
46 | setIsModalSuccessActive(false);
47 | };
48 |
49 | const [isModalInfoActive, setIsModalInfoActive] = useState(false);
50 | const [isModalDangerActive, setIsModalDangerActive] = useState(false);
51 | const [isModalSuccessActive, setIsModalSuccessActive] = useState(false);
52 |
53 | return (
54 | <>
55 |
63 | {modalSampleContents}
64 |
65 |
66 |
73 | {modalSampleContents}
74 |
75 |
76 |
83 | {modalSampleContents}
84 |
85 |
86 |
87 |
88 |
setIsModalInfoActive(true)}
92 | isHoverable
93 | >
94 |
95 |
96 |
97 |
98 |
Click to see in action
99 |
100 |
101 |
102 |
setIsModalDangerActive(true)}
106 | isHoverable
107 | >
108 |
109 |
110 |
111 |
Click to see in action
112 |
113 |
114 |
115 |
setIsModalSuccessActive(true)}
119 | isHoverable
120 | >
121 |
122 |
123 |
124 |
Click to see in action
125 |
126 |
127 |
128 |
129 | >
130 | );
131 | }
132 |
--------------------------------------------------------------------------------
/app/dashboard/_components/Table/SampleClients.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { mdiEye, mdiTrashCan } from "@mdi/js";
4 | import React, { useState } from "react";
5 | import { Client } from "../../../_interfaces";
6 | import Button from "../../../_components/Button";
7 | import Buttons from "../../../_components/Buttons";
8 | import CardBoxModal from "../../../_components/CardBox/Modal";
9 | import UserAvatar from "../UserAvatar";
10 |
11 | type Props = {
12 | clients: Client[];
13 | };
14 |
15 | const TableSampleClients = ({ clients }: Props) => {
16 | const perPage = 5;
17 |
18 | const numPages = clients.length / perPage;
19 |
20 | const pagesList: number[] = [];
21 |
22 | for (let i = 0; i < numPages; i++) {
23 | pagesList.push(i);
24 | }
25 |
26 | const [currentPage, setCurrentPage] = useState(0);
27 | const clientsPaginated = clients.slice(perPage * currentPage, perPage * (currentPage + 1));
28 |
29 | const [isModalInfoActive, setIsModalInfoActive] = useState(false);
30 | const [isModalTrashActive, setIsModalTrashActive] = useState(false);
31 |
32 | const handleModalAction = () => {
33 | setIsModalInfoActive(false);
34 | setIsModalTrashActive(false);
35 | };
36 |
37 | return (
38 | <>
39 |
47 |
48 | Lorem ipsum dolor sit amet adipiscing elit
49 |
50 | This is sample modal
51 |
52 |
53 |
61 |
62 | Lorem ipsum dolor sit amet adipiscing elit
63 |
64 | This is sample modal
65 |
66 |
67 |
68 |
69 |
70 |
71 | Name
72 | Company
73 | City
74 | Progress
75 | Created
76 |
77 |
78 |
79 |
80 | {clientsPaginated.map((client: Client) => (
81 |
82 |
83 |
84 |
85 | {client.name}
86 | {client.company}
87 | {client.city}
88 |
89 |
94 | {client.progress}
95 |
96 |
97 |
98 | {client.created}
99 |
100 |
101 |
102 | setIsModalInfoActive(true)}
106 | small
107 | isGrouped
108 | />
109 | setIsModalTrashActive(true)}
113 | small
114 | isGrouped
115 | />
116 |
117 |
118 |
119 | ))}
120 |
121 |
122 |
123 |
124 |
125 | {pagesList.map((page) => (
126 | setCurrentPage(page)}
133 | isGrouped
134 | />
135 | ))}
136 |
137 |
138 | Page {currentPage + 1} of {numPages}
139 |
140 |
141 |
142 | >
143 | );
144 | };
145 |
146 | export default TableSampleClients;
147 |
--------------------------------------------------------------------------------
/app/_lib/colors.ts:
--------------------------------------------------------------------------------
1 | import type { ColorButtonKey } from "../_interfaces";
2 |
3 | export const gradientBgBase = "bg-linear-to-tr";
4 | export const gradientBgPurplePink = `${gradientBgBase} from-purple-400 via-pink-500 to-red-500`;
5 | export const gradientBgDark = `${gradientBgBase} from-slate-700 via-slate-900 to-slate-800`;
6 | export const gradientBgPinkRed = `${gradientBgBase} from-pink-400 via-red-500 to-yellow-500`;
7 |
8 | export const colorsBgLight = {
9 | white: "bg-white text-black",
10 | light: "bg-white text-black dark:bg-slate-900/70 dark:text-white",
11 | contrast: "bg-gray-800 text-white dark:bg-white dark:text-black",
12 | success: "bg-emerald-500 border-emerald-500 text-white",
13 | danger: "bg-red-500 border-red-500 text-white",
14 | warning: "bg-yellow-500 border-yellow-500 text-white",
15 | info: "bg-blue-500 border-blue-500 text-white",
16 | };
17 |
18 | export const colorsText = {
19 | white: "text-black dark:text-slate-100",
20 | light: "text-gray-700 dark:text-slate-400",
21 | contrast: "dark:text-white",
22 | success: "text-emerald-500",
23 | danger: "text-red-500",
24 | warning: "text-yellow-500",
25 | info: "text-blue-500",
26 | };
27 |
28 | export const colorsOutline = {
29 | white: [colorsText.white, "border-gray-100"].join(" "),
30 | light: [colorsText.light, "border-gray-100"].join(" "),
31 | contrast: [colorsText.contrast, "border-gray-900 dark:border-slate-100"].join(" "),
32 | success: [colorsText.success, "border-emerald-500"].join(" "),
33 | danger: [colorsText.danger, "border-red-500"].join(" "),
34 | warning: [colorsText.warning, "border-yellow-500"].join(" "),
35 | info: [colorsText.info, "border-blue-500"].join(" "),
36 | };
37 |
38 | export const getButtonColor = (
39 | color: ColorButtonKey,
40 | isOutlined: boolean,
41 | hasHover: boolean,
42 | isActive = false,
43 | ) => {
44 | if (color === "void") {
45 | return "";
46 | }
47 |
48 | const colors = {
49 | ring: {
50 | white: "ring-gray-200 dark:ring-gray-500",
51 | whiteDark: "ring-gray-200 dark:ring-gray-500",
52 | lightDark: "ring-gray-200 dark:ring-gray-500",
53 | contrast: "ring-gray-300 dark:ring-gray-400",
54 | success: "ring-emerald-300 dark:ring-emerald-700",
55 | danger: "ring-red-300 dark:ring-red-700",
56 | warning: "ring-yellow-300 dark:ring-yellow-700",
57 | info: "ring-blue-300 dark:ring-blue-700",
58 | },
59 | active: {
60 | white: "bg-gray-100",
61 | whiteDark: "bg-gray-100 dark:bg-slate-800",
62 | lightDark: "bg-gray-200 dark:bg-slate-700",
63 | contrast: "bg-gray-700 dark:bg-slate-100",
64 | success: "bg-emerald-700 dark:bg-emerald-600",
65 | danger: "bg-red-700 dark:bg-red-600",
66 | warning: "bg-yellow-700 dark:bg-yellow-600",
67 | info: "bg-blue-700 dark:bg-blue-600",
68 | },
69 | bg: {
70 | white: "bg-white text-black",
71 | whiteDark: "bg-white text-black dark:bg-slate-900 dark:text-white",
72 | lightDark: "bg-gray-100 text-black dark:bg-slate-800 dark:text-white",
73 | contrast: "bg-gray-800 text-white dark:bg-white dark:text-black",
74 | success: "bg-emerald-600 dark:bg-emerald-500 text-white",
75 | danger: "bg-red-600 dark:bg-red-500 text-white",
76 | warning: "bg-yellow-600 dark:bg-yellow-500 text-white",
77 | info: "bg-blue-600 dark:bg-blue-500 text-white",
78 | },
79 | bgHover: {
80 | white: "hover:bg-gray-100",
81 | whiteDark: "hover:bg-gray-100 dark:hover:bg-slate-800",
82 | lightDark: "hover:bg-gray-200 dark:hover:bg-slate-700",
83 | contrast: "hover:bg-gray-700 dark:hover:bg-slate-100",
84 | success:
85 | "hover:bg-emerald-700 hover:border-emerald-700 dark:hover:bg-emerald-600 dark:hover:border-emerald-600",
86 | danger:
87 | "hover:bg-red-700 hover:border-red-700 dark:hover:bg-red-600 dark:hover:border-red-600",
88 | warning:
89 | "hover:bg-yellow-700 hover:border-yellow-700 dark:hover:bg-yellow-600 dark:hover:border-yellow-600",
90 | info: "hover:bg-blue-700 hover:border-blue-700 dark:hover:bg-blue-600 dark:hover:border-blue-600",
91 | },
92 | borders: {
93 | white: "border-white",
94 | whiteDark: "border-white dark:border-slate-900",
95 | lightDark: "border-gray-100 dark:border-slate-800",
96 | contrast: "border-gray-800 dark:border-white",
97 | success: "border-emerald-600 dark:border-emerald-500",
98 | danger: "border-red-600 dark:border-red-500",
99 | warning: "border-yellow-600 dark:border-yellow-500",
100 | info: "border-blue-600 dark:border-blue-500",
101 | },
102 | text: {
103 | contrast: "dark:text-slate-100",
104 | success: "text-emerald-600 dark:text-emerald-500",
105 | danger: "text-red-600 dark:text-red-500",
106 | warning: "text-yellow-600 dark:text-yellow-500",
107 | info: "text-blue-600 dark:text-blue-500",
108 | },
109 | outlineHover: {
110 | contrast:
111 | "hover:bg-gray-800 hover:text-gray-100 dark:hover:bg-slate-100 dark:hover:text-black",
112 | success:
113 | "hover:bg-emerald-600 hover:text-white hover:text-white dark:hover:text-white dark:hover:border-emerald-600",
114 | danger:
115 | "hover:bg-red-600 hover:text-white hover:text-white dark:hover:text-white dark:hover:border-red-600",
116 | warning:
117 | "hover:bg-yellow-600 hover:text-white hover:text-white dark:hover:text-white dark:hover:border-yellow-600",
118 | info: "hover:bg-blue-600 hover:text-white dark:hover:text-white dark:hover:border-blue-600",
119 | },
120 | };
121 |
122 | const isOutlinedProcessed = isOutlined && ["white", "whiteDark", "lightDark"].indexOf(color) < 0;
123 |
124 | const base = [colors.borders[color], colors.ring[color]];
125 |
126 | if (isActive) {
127 | base.push(colors.active[color]);
128 | } else {
129 | base.push(isOutlinedProcessed ? colors.text[color] : colors.bg[color]);
130 | }
131 |
132 | if (hasHover) {
133 | base.push(isOutlinedProcessed ? colors.outlineHover[color] : colors.bgHover[color]);
134 | }
135 |
136 | return base.join(" ");
137 | };
138 |
--------------------------------------------------------------------------------
/app/dashboard/_lib/sampleData.ts:
--------------------------------------------------------------------------------
1 | import { Client, Transaction } from "../../_interfaces";
2 |
3 | export const transactions: Transaction[] = [
4 | {
5 | id: 1,
6 | amount: 375.53,
7 | account: "45721474",
8 | name: "Home Loan Account",
9 | date: "3 days ago",
10 | type: "deposit",
11 | business: "Turcotte",
12 | },
13 | {
14 | id: 2,
15 | amount: 470.26,
16 | account: "94486537",
17 | name: "Savings Account",
18 | date: "3 days ago",
19 | type: "payment",
20 | business: "Murazik - Graham",
21 | },
22 | {
23 | id: 3,
24 | amount: 971.34,
25 | account: "63189893",
26 | name: "Checking Account",
27 | date: "5 days ago",
28 | type: "invoice",
29 | business: "Fahey - Keebler",
30 | },
31 | {
32 | id: 4,
33 | amount: 374.63,
34 | account: "74828780",
35 | name: "Auto Loan Account",
36 | date: "7 days ago",
37 | type: "withdraw",
38 | business: "Collier - Hintz",
39 | },
40 | ];
41 |
42 | export const clients: Client[] = [
43 | {
44 | id: 19,
45 | login: "percy64",
46 | name: "Howell Hand",
47 | company: "Kiehn-Green",
48 | city: "Emelyside",
49 | progress: 70,
50 | created: "Mar 3, 2025",
51 | created_mm_dd_yyyy: "03-03-2025",
52 | },
53 | {
54 | id: 11,
55 | login: "dare.concepcion",
56 | name: "Hope Howe",
57 | company: "Nolan Inc",
58 | city: "Paristown",
59 | progress: 68,
60 | created: "Dec 1, 2025",
61 | created_mm_dd_yyyy: "12-01-2025",
62 | },
63 | {
64 | id: 32,
65 | login: "geovanni.kessler",
66 | name: "Nelson Jerde",
67 | company: "Nitzsche LLC",
68 | city: "Jailynbury",
69 | progress: 49,
70 | created: "May 18, 2025",
71 | created_mm_dd_yyyy: "05-18-2025",
72 | },
73 | {
74 | id: 22,
75 | login: "macejkovic.dashawn",
76 | name: "Kim Weimann",
77 | company: "Brown-Lueilwitz",
78 | city: "New Emie",
79 | progress: 38,
80 | created: "May 4, 2025",
81 | created_mm_dd_yyyy: "05-04-2025",
82 | },
83 | {
84 | id: 34,
85 | login: "hilpert.leora",
86 | name: "Justice O'Reilly",
87 | company: "Lakin-Muller",
88 | city: "New Kacie",
89 | progress: 38,
90 | created: "Mar 27, 2025",
91 | created_mm_dd_yyyy: "03-27-2025",
92 | },
93 | {
94 | id: 48,
95 | login: "ferry.sophia",
96 | name: "Adrienne Mayer III",
97 | company: "Kozey, McLaughlin and Kuhn",
98 | city: "Howardbury",
99 | progress: 39,
100 | created: "Mar 29, 2025",
101 | created_mm_dd_yyyy: "03-29-2025",
102 | },
103 | {
104 | id: 20,
105 | login: "gokuneva",
106 | name: "Mr. Julien Ebert",
107 | company: "Cormier LLC",
108 | city: "South Serenaburgh",
109 | progress: 29,
110 | created: "Jun 25, 2025",
111 | created_mm_dd_yyyy: "06-25-2025",
112 | },
113 | {
114 | id: 47,
115 | login: "paolo.walter",
116 | name: "Lenna Smitham",
117 | company: "King Inc",
118 | city: "McCulloughfort",
119 | progress: 59,
120 | created: "Oct 8, 2025",
121 | created_mm_dd_yyyy: "10-08-2025",
122 | },
123 | {
124 | id: 24,
125 | login: "lkessler",
126 | name: "Travis Davis",
127 | company: "Leannon and Sons",
128 | city: "West Frankton",
129 | progress: 52,
130 | created: "Oct 20, 2025",
131 | created_mm_dd_yyyy: "10-20-2025",
132 | },
133 | {
134 | id: 49,
135 | login: "shana.lang",
136 | name: "Prof. Esteban Steuber",
137 | company: "Langosh-Ernser",
138 | city: "East Sedrick",
139 | progress: 34,
140 | created: "May 16, 2025",
141 | created_mm_dd_yyyy: "05-16-2025",
142 | },
143 | {
144 | id: 36,
145 | login: "jewel07",
146 | name: "Russell Goodwin V",
147 | company: "Nolan-Stracke",
148 | city: "Williamsonmouth",
149 | progress: 55,
150 | created: "Apr 22, 2025",
151 | created_mm_dd_yyyy: "04-22-2025",
152 | },
153 | {
154 | id: 33,
155 | login: "burnice.okuneva",
156 | name: "Ms. Cassidy Wiegand DVM",
157 | company: "Kuhlman-Hahn",
158 | city: "New Ruthiehaven",
159 | progress: 76,
160 | created: "Sep 16, 2025",
161 | created_mm_dd_yyyy: "09-16-2025",
162 | },
163 | {
164 | id: 44,
165 | login: "oconnell.juanita",
166 | name: "Mr. Watson Brakus PhD",
167 | company: "Osinski, Bins and Kuhn",
168 | city: "Lake Gloria",
169 | progress: 58,
170 | created: "Jun 22, 2025",
171 | created_mm_dd_yyyy: "06-22-2025",
172 | },
173 | {
174 | id: 46,
175 | login: "vgutmann",
176 | name: "Mr. Garrison Friesen V",
177 | company: "VonRueden, Rippin and Pfeffer",
178 | city: "Port Cieloport",
179 | progress: 39,
180 | created: "Oct 19, 2025",
181 | created_mm_dd_yyyy: "10-19-2025",
182 | },
183 | {
184 | id: 14,
185 | login: "veum.lucio",
186 | name: "Ms. Sister Morar",
187 | company: "Gusikowski, Altenwerth and Abbott",
188 | city: "Lake Macville",
189 | progress: 34,
190 | created: "Jun 11, 2025",
191 | created_mm_dd_yyyy: "06-11-2025",
192 | },
193 | {
194 | id: 40,
195 | login: "edietrich",
196 | name: "Ms. Laisha Reinger",
197 | company: "Boehm PLC",
198 | city: "West Alexiemouth",
199 | progress: 73,
200 | created: "Nov 2, 2025",
201 | created_mm_dd_yyyy: "11-02-2025",
202 | },
203 | {
204 | id: 5,
205 | login: "mose44",
206 | name: "Cameron Lind",
207 | company: "Tremblay, Padberg and Pouros",
208 | city: "Naderview",
209 | progress: 59,
210 | created: "Sep 14, 2025",
211 | created_mm_dd_yyyy: "09-14-2025",
212 | },
213 | {
214 | id: 43,
215 | login: "rau.abelardo",
216 | name: "Sarai Little",
217 | company: "Deckow LLC",
218 | city: "Jeanieborough",
219 | progress: 49,
220 | created: "Jun 13, 2025",
221 | created_mm_dd_yyyy: "06-13-2025",
222 | },
223 | {
224 | id: 2,
225 | login: "imurazik",
226 | name: "Shyann Kautzer",
227 | company: "Osinski, Boehm and Kihn",
228 | city: "New Alvera",
229 | progress: 41,
230 | created: "Feb 15, 2025",
231 | created_mm_dd_yyyy: "02-15-2025",
232 | },
233 | {
234 | id: 15,
235 | login: "annalise97",
236 | name: "Lorna Christiansen",
237 | company: "Altenwerth-Friesen",
238 | city: "Port Elbertland",
239 | progress: 36,
240 | created: "Mar 9, 2025",
241 | created_mm_dd_yyyy: "03-09-2025",
242 | },
243 | ];
244 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # [Admin One — Free React Tailwind 4.x Admin Dashboard with dark mode](https://justboil.me/tailwind-admin-templates/free-react-dashboard/)
2 |
3 | [](https://justboil.me/tailwind-admin-templates/free-react-dashboard/) [](https://justboil.me/tailwind-admin-templates/free-react-dashboard/)
4 |
5 | ### Tailwind 4.x React with Next.js and TypeScript
6 |
7 | [](https://justboil.github.io/admin-one-react-tailwind/)
8 |
9 | [](https://justboil.github.io/admin-one-react-tailwind/)
10 |
11 | ### Tailwind 4.x React with Next.js and TypeScript
12 |
13 | **Admin One** is fast, beautiful and free React Next Tailwind CSS 4.x admin dashboard with TypeScript.
14 |
15 | * Built with **TypeScript**, **React**, **Tailwind CSS 4** framework & **Next.js** with **app router**
16 | * **React Redux** state library — [Info](https://react-redux.js.org/)
17 | * **Dark mode**
18 | * **Production CSS** is only **≈38kb**
19 | * Reusable components
20 | * Free under MIT License
21 | * [Premium version](https://justboil.me/tailwind-admin-templates/react-dashboard/) available
22 |
23 | ## Table of Contents
24 |
25 | * [Vue version](#looking-for-vue-version)
26 | * [Responsive layout](#responsive-layout)
27 | * [Mobile & tablet](#mobile--tablet)
28 | * [Small laptops](#small-laptops-1024px)
29 | * [Laptops & desktops](#laptops--desktops)
30 | * [Demo](#demo)
31 | * [Free dashboard demo](#free-dashboard-demo)
32 | * [Premium dashboard demo](#premium-dashboard-demo)
33 | * [Quick Start](#quick-start)
34 | * [Get code & install](#get-code--install)
35 | * [Builds](#builds)
36 | * [Linting and formatting](#linting-and-formatting)
37 | * [Docs](#docs)
38 | * [Browser Support](#browser-support)
39 | * [Reporting Issues](#reporting-issues)
40 | * [Licensing](#licensing)
41 | * [Useful Links](#useful-links)
42 |
43 | ## Looking for Vue version?
44 |
45 | This is **Tailwind React TypeScript** version
46 |
47 | Looking for **Tailwind Vue**? Check [Admin One - Vue Tailwind dashboard](https://github.com/justboil/admin-one-vue-tailwind) version
48 |
49 | ## Responsive layout
50 |
51 | ### Mobile & tablet
52 |
53 | Mobile layout with hidden aside menu and collapsable cards & tables
54 |
55 | [](https://justboil.github.io/admin-one-react-tailwind/)
56 |
57 | ### Small laptops 1024px
58 |
59 | Small laptop layout with show/hide aside menu option
60 |
61 | [](https://justboil.github.io/admin-one-react-tailwind/)
62 |
63 | [](https://justboil.github.io/admin-one-react-tailwind/)
64 |
65 | ### Laptops & desktops
66 |
67 | Classic layout with aside menus on the left
68 |
69 | [](https://justboil.github.io/admin-one-react-tailwind/)
70 |
71 | ## Demo
72 |
73 | ### Free Dashboard Demo
74 |
75 | https://justboil.github.io/admin-one-react-tailwind/
76 |
77 | ### Premium Dashboard Demo
78 |
79 | Premium version is coming soon
80 |
81 | ## Quick Start
82 |
83 | Get code & install. Then `dev` or `build`
84 |
85 | * [Get code & install](#get-code--install)
86 | * [Builds](#builds)
87 | * [Linting and formatting](#linting-and-formatting)
88 |
89 | ### Get code & install
90 |
91 | #### Get the repo
92 |
93 | * [Create new repo](https://github.com/justboil/admin-one-react-tailwind/generate) with this template
94 | * … or clone this repo on GitHub
95 | * … or [download .zip](https://github.com/justboil/admin-one-react-tailwind/archive/master.zip) from GitHub
96 |
97 | #### Install
98 |
99 | `cd` to project's dir and run `npm install`
100 |
101 | ### Builds
102 |
103 | Build are handled by Next.js CLI — [Info](https://nextjs.org/docs/app/api-reference/cli/next)
104 |
105 | #### Hot-reloads for development
106 |
107 | ```
108 | npm run dev
109 | ```
110 |
111 | #### Builds and minifies for production
112 |
113 | ```
114 | npm run build
115 | ```
116 |
117 | #### Exports build for static hosts
118 |
119 | Set `IS_OUTPUT_EXPORT` environment variable to `true` (or set `output` in next.config.ts)
120 |
121 | ### Linting & Formatting
122 |
123 | #### Lint
124 |
125 | ```
126 | npm run lint
127 | ```
128 |
129 | #### Format with prettier
130 |
131 | ```
132 | npm run format
133 | ```
134 |
135 | ## Docs
136 |
137 | Docs are coming soon
138 |
139 | ## Browser Support
140 |
141 | We try to make sure Dashboard works well in the latest versions of all major browsers
142 |
143 |
144 |
145 | ## Reporting Issues
146 |
147 | JustBoil's free items are limited to community support on GitHub.
148 |
149 | The issue list is reserved exclusively for bug reports and feature requests. That means we do not accept usage questions. If you open an issue that does not conform to the requirements, it will be closed.
150 |
151 | 1. Make sure that you are using the latest version of the Dashboard. Issues for outdated versions are irrelevant
152 | 2. Provide steps to reproduce
153 | 3. Provide an expected behavior
154 | 4. Describe what is actually happening
155 | 5. Platform, Browser & version as some issues may be browser specific
156 |
157 | ## Licensing
158 |
159 | - Copyright © 2019-2025 JustBoil.me (https://justboil.me)
160 | - Licensed under MIT
161 |
162 | ## Useful Links
163 |
164 | - [JustBoil.me](https://justboil.me/)
165 | - [Tailwind CSS](https://tailwindcss.com/)
166 | - [Next.js Docs](https://nextjs.org/docs/app/getting-started)
167 | - [React.js Docs](https://react.dev/learn)
168 | - [Redux Docs](https://redux.js.org/introduction/getting-started) & [React-Redux Docs](https://react-redux.js.org/introduction/getting-started)
169 | - [TypeScript Docs](https://www.typescriptlang.org/docs/)
170 | - [TypeScript ESLint Docs](https://typescript-eslint.io/docs/)
171 |
--------------------------------------------------------------------------------
/app/dashboard/forms/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { mdiAccount, mdiBallotOutline, mdiGithub, mdiMail, mdiUpload } from "@mdi/js";
4 | import { Field, Form, Formik } from "formik";
5 | import Head from "next/head";
6 | import Button from "../../_components/Button";
7 | import Buttons from "../../_components/Buttons";
8 | import Divider from "../../_components/Divider";
9 | import CardBox from "../../_components/CardBox";
10 | import FormCheckRadio from "../../_components/FormField/CheckRadio";
11 | import FormCheckRadioGroup from "../../_components/FormField/CheckRadioGroup";
12 | import FormField from "../../_components/FormField";
13 | import FormFilePicker from "../../_components/FormField/FilePicker";
14 | import SectionMain from "../../_components/Section/Main";
15 | import SectionTitle from "../../_components/Section/Title";
16 | import SectionTitleLineWithButton from "../../_components/Section/TitleLineWithButton";
17 | import { getPageTitle } from "../../_lib/config";
18 | import FieldLabel from "../../_components/FormField/FieldLabel";
19 |
20 | export default function FormsPage() {
21 | return (
22 | <>
23 |
24 | {getPageTitle("Forms")}
25 |
26 |
27 |
28 |
29 |
38 |
39 |
40 |
41 | alert(JSON.stringify(values, null, 2))}
50 | >
51 |
121 |
122 |
123 |
124 |
125 | Custom elements
126 |
127 |
128 |
129 | alert(JSON.stringify(values, null, 2))}
136 | >
137 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 | >
194 | );
195 | }
196 |
--------------------------------------------------------------------------------
/app/dashboard/ui/_components/ButtonsExample.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { mdiOpenInNew } from "@mdi/js";
4 | import { Formik, Field } from "formik";
5 | import Button from "../../../_components/Button";
6 | import Buttons from "../../../_components/Buttons";
7 | import CardBox from "../../../_components/CardBox";
8 | import Divider from "../../../_components/Divider";
9 | import FormCheckRadio from "../../../_components/FormField/CheckRadio";
10 | import FormCheckRadioGroup from "../../../_components/FormField/CheckRadioGroup";
11 | import SectionMain from "../../../_components/Section/Main";
12 |
13 | export default function ButtonsExample() {
14 | return (
15 |
16 |
17 | {}}
25 | >
26 | {({ values }) => (
27 | <>
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
55 |
64 |
73 |
82 |
91 |
100 |
101 |
102 |
103 |
104 |
105 |
115 |
125 |
135 |
145 |
155 |
165 |
166 |
167 |
168 |
169 |
170 |
179 |
188 |
197 |
206 |
215 |
224 |
225 | >
226 | )}
227 |
228 |
229 |
230 | );
231 | }
232 |
--------------------------------------------------------------------------------
/app/_components/JustboilLogo/logoPath.js:
--------------------------------------------------------------------------------
1 | const justboilLogoPath =
2 | "M1.157,85.323a16.088,16.088,0,0,0-.865,4.431,7.265,7.265,0,0,0,.432,2.594,10.327,10.327,0,0,0,3.242,5.62,15.634,15.634,0,0,0,2.7,1.189,9.272,9.272,0,0,0,2.378.216,12.225,12.225,0,0,0,7.241-2.486,20.191,20.191,0,0,0,5.188-4.431A34.34,34.34,0,0,0,26.014,85c1.081-2.053,1.837-4,2.81-5.728,0.756-2.162,1.729-4.107,2.378-6.052q1.135-2.918,1.945-5.512a5.088,5.088,0,0,1,.324-0.973,36.294,36.294,0,0,0,1.837-5.079L36.714,56.9c0.216-1.081.864-2.269,1.081-3.458,0.432-1.945.216-1.621,2.486-3.026a4.822,4.822,0,0,0,.865-0.54,23.217,23.217,0,0,0,2.81-1.513,76.926,76.926,0,0,1,13.077-5.62,21.183,21.183,0,0,1,5.836-.865,11.968,11.968,0,0,1,4.755.865,0.65,0.65,0,0,1,.432.108,1.372,1.372,0,0,0,.648.108,0.988,0.988,0,0,0,.757-0.324V42.418a1.742,1.742,0,0,0-.432-0.756,4.576,4.576,0,0,1-.757-0.54,8.575,8.575,0,0,1-1.729-.865,21.494,21.494,0,0,0-5.187-.757c-0.432,0-.973.108-1.405,0.108a28.926,28.926,0,0,0-6.593,1.081A74.714,74.714,0,0,0,43.63,44.8l-2.053.865-1.189.648H40.172a0.271,0.271,0,0,1-.324-0.216V45.984a1.839,1.839,0,0,1,.108-0.756c0.324-.865.432-1.945,0.756-3.026,0.432-1.4.757-3.026,1.081-4.539a14.662,14.662,0,0,1,.648-3.134c0.757-3.783,1.405-7.241,2.378-10.807a0.817,0.817,0,0,0-.108-0.432c0.108-2.486,1.081-4.755,1.189-7.241L46.981,10V9.563a0.65,0.65,0,0,1,.108-0.432c0.216-.648.108-1.3,0.324-1.945a0.837,0.837,0,0,1,.865-0.757h0.54a0.817,0.817,0,0,0,.432-0.108c2.594-.54,5.079-0.973,7.673-1.4a39.862,39.862,0,0,1,4-.54,1.371,1.371,0,0,1,.648-0.108,1.388,1.388,0,0,1,1.081.432H63.3a1.1,1.1,0,0,0,.973-0.648V3.619A2.055,2.055,0,0,0,63.192,1.89,5.67,5.67,0,0,0,62,1.133,3.05,3.05,0,0,0,60.382.7c-0.216,0-.432.108-0.756,0.108-1.837.324-3.458,0.54-5.4,0.757-1.4.216-2.81,0.54-4.647,0.757-0.216,0-.324.108-0.54,0.108a1.743,1.743,0,0,1-.973-0.324,4.314,4.314,0,0,0-1.405-.757H46.332a0.594,0.594,0,0,0-.54.324,2.05,2.05,0,0,0-.756.865,6.3,6.3,0,0,1-1.621,1.189L37.9,4.808c-3.458.648-6.7,1.621-10.375,2.27a93.654,93.654,0,0,0-14.049,4.971,5.662,5.662,0,0,1-2.81,1.081H10.56c-0.108,0-.108.108-0.216,0.324l0.324,0.865a1.891,1.891,0,0,0,1.513.756,2.109,2.109,0,0,0,.757-0.108c0.432,0,.649-0.108,1.081-0.108a7.346,7.346,0,0,0,1.837-.865c2.594-1.081,5.3-1.729,7.673-2.486,6.16-1.729,12.428-2.7,18.48-4.107,0,0.108.108,0.108,0.216,0.108A0.817,0.817,0,0,0,42.658,7.4a0.582,0.582,0,0,1,.432.432,0.974,0.974,0,0,1,.108.54c-0.757,1.945-.865,4.215-1.621,6.16a13.36,13.36,0,0,0-.216,1.945,4.644,4.644,0,0,0-.216,1.3L37.9,30.746c-0.648,3.891-1.837,7.781-2.594,11.672a54.359,54.359,0,0,0-2.053,6.809,5.5,5.5,0,0,1-2.27,2.81,84.863,84.863,0,0,0-7.133,5.079,28.533,28.533,0,0,0-3.134,2.27l-7.781,6.7a34.571,34.571,0,0,0-6.484,7.889A32.361,32.361,0,0,0,3.1,80.243,17.466,17.466,0,0,0,1.157,85.323ZM30.121,59.277a28.267,28.267,0,0,1-2.27,6.052,0.914,0.914,0,0,0-.216.648,53.766,53.766,0,0,1-2.161,5.836c-0.54,1.405-.973,2.81-1.513,4.107a2.055,2.055,0,0,1-.756,1.189,32.565,32.565,0,0,1-2.27,5.3,51.775,51.775,0,0,1-3.566,6.268,16.461,16.461,0,0,1-3.242,4,16.635,16.635,0,0,1-5.187,3.134,12.189,12.189,0,0,1-1.945.324c-0.216,0-.432.108-0.648,0.108a1.733,1.733,0,0,1-1.729-.865,7.489,7.489,0,0,1-.324-2.162V92.78A22.312,22.312,0,0,1,5.156,86.3a36.044,36.044,0,0,1,5.512-10.7,52.582,52.582,0,0,1,11.024-12,67.218,67.218,0,0,1,7.457-5.62,1.466,1.466,0,0,1,1.189-.648h0.216a3.884,3.884,0,0,0-.216,1.189C30.337,58.737,30.121,59.061,30.121,59.277ZM16.612,92.455l0.432-.648a1.37,1.37,0,0,1-.108.648,11.506,11.506,0,0,1,1.189-.973,0.582,0.582,0,0,1,.54-0.432,0.682,0.682,0,0,1-.54.54v0.432a11.246,11.246,0,0,1-3.35,2.918,1.942,1.942,0,0,0,.432-0.973,1.521,1.521,0,0,0,.756-0.648H15.639a2.956,2.956,0,0,0,.432-0.54ZM10.344,71.6A4.4,4.4,0,0,1,12.4,69.22a7.442,7.442,0,0,1-2.053,2.486,0.738,0.738,0,0,1-.324.54,25.146,25.146,0,0,0-1.837,2.81l-0.757.54A9.592,9.592,0,0,1,10.344,71.6ZM6.237,77.866A3.849,3.849,0,0,1,7.426,75.6,3.849,3.849,0,0,1,6.237,77.866ZM17.044,94.617a1.674,1.674,0,0,1,1.3-1.081A2.1,2.1,0,0,1,17.044,94.617Zm-1.3,1.189c0-.54.756-0.865,1.3-1.189A4.326,4.326,0,0,1,15.747,95.806ZM5.7,78.946a0.892,0.892,0,0,1,.54-1.081A2.545,2.545,0,0,1,5.7,78.946Zm-0.757.973a1.011,1.011,0,0,1,.54-0.756l-0.216.865H5.048ZM8.723,75.7a1.293,1.293,0,0,1,.757-0.756A1.048,1.048,0,0,1,8.723,75.7Zm4.107-5.3c0-.324.108-0.432,0.648-0.648A1.261,1.261,0,0,1,12.829,70.409ZM9.587,74.731a0.691,0.691,0,0,1,.54-0.756A1.378,1.378,0,0,1,9.587,74.731Zm1.621-2.378a0.8,0.8,0,0,1,.54-0.649A0.8,0.8,0,0,1,11.208,72.354Zm0.54-.649a0.971,0.971,0,0,1,.54-0.648A0.8,0.8,0,0,1,11.749,71.705ZM10.56,73.326a1.342,1.342,0,0,1,.649-0.865A3.543,3.543,0,0,1,10.56,73.326Zm2.27-2.918a0.8,0.8,0,0,1-.54.648A1.051,1.051,0,0,1,12.829,70.409Zm-2.7,3.566a0.889,0.889,0,0,1,.432-0.648A1.378,1.378,0,0,1,10.128,73.975Zm4.107-5.3a0.5,0.5,0,0,1-.324.54Zm-1.837.54a1.251,1.251,0,0,1,.54-0.757A2.5,2.5,0,0,0,12.4,69.22Zm1.4,0.108a0.378,0.378,0,0,1-.324.432A0.734,0.734,0,0,0,13.8,69.328Zm4.863,21.723a0.82,0.82,0,0,0,.216-0.432,0.106,0.106,0,0,0,.108.108ZM8.615,75.812c0-.108.108,0,0.108-0.108a1.089,1.089,0,0,0-.108.324V75.812Zm8.97,15.13a0.106,0.106,0,0,1,.108-0.108v0.108H17.585Zm74.9-43.121a0.993,0.993,0,0,1-.973,1.081l0.108-.108a0.65,0.65,0,0,1,.108-0.432l-2.486,2.162-4,5.079c-1.621,2.378-4.107,3.891-5.836,6.917a19.106,19.106,0,0,1-1.837,2.594,0.573,0.573,0,0,1-.324.216H77.134A0.579,0.579,0,0,1,76.81,64.9a1.37,1.37,0,0,1-.108-0.648c0-1.3,0-2.486.108-3.783a26.766,26.766,0,0,1,.324-2.918c0.216-1.729.648-3.566,0.973-5.3a8.931,8.931,0,0,1,.865-2.378,55.3,55.3,0,0,1,1.621-6.052c0.432-1.189.973-.648,1.189-1.837,0-.756-0.216-3.35-0.973-3.783a0.408,0.408,0,0,1-.216-0.216,1.116,1.116,0,0,0-.865-0.432H79.3c-0.108,0-.324-0.216-0.432-0.216a0.409,0.409,0,0,0-.216.216L78,37.23a0.4,0.4,0,0,0-.324-0.108,0.594,0.594,0,0,0-.54.324,0.981,0.981,0,0,0-.324.756,10.262,10.262,0,0,0-.973,2.27A14.922,14.922,0,0,1,74,43.606a64.6,64.6,0,0,1-4.215,5.728L66,55.278l-3.35,4.215c-0.54.757-1.189,1.3-1.621,1.945a0.365,0.365,0,0,1-.324.216,0.4,0.4,0,0,1-.324-0.108c0-.108-0.108-0.216-0.108-0.324V60.358c0.108-.756.324-1.621,0.54-2.486A46.539,46.539,0,0,1,62.544,51.5c0.54-1.837,1.3-3.675,1.945-5.4a12.714,12.714,0,0,0,.757-2.161,5.428,5.428,0,0,0,.216-1.3V42.526a0.465,0.465,0,0,0-.432-0.432,0.888,0.888,0,0,1-.648-0.432,0.573,0.573,0,0,0-.324-0.216,0.377,0.377,0,0,0-.216.108,0.4,0.4,0,0,1-.324.108,0.453,0.453,0,0,1-.432-0.324A5.829,5.829,0,0,0,62,41.013a1.225,1.225,0,0,0-.973.756,2.267,2.267,0,0,1-.648.865c-0.649,1.189-1.405,2.378-2.053,3.675a48.59,48.59,0,0,0-2.7,7.565,11.244,11.244,0,0,1-.648,2.378,15.617,15.617,0,0,0-.432,3.134c0,1.189.216,2.486,0.324,3.675A2.271,2.271,0,0,0,56.06,64.9a10.34,10.34,0,0,0,3.674,2.053,1.081,1.081,0,0,0,1.3,0,4.973,4.973,0,0,0,2.162-1.729,29.415,29.415,0,0,0,3.134-4.107c0.648-1.3,1.513-2.594,2.27-4a53.181,53.181,0,0,1,2.81-4.647,7.089,7.089,0,0,1,1.837-2.7c-0.108-.108.108-0.108,0.216-0.108,0,0,.216.216,0.108,0.216a9.151,9.151,0,0,1-.432,1.837,32.831,32.831,0,0,0-.648,7.241,38.578,38.578,0,0,0,.432,4.971,8.11,8.11,0,0,0,.973,2.7,2.551,2.551,0,0,0,.648.973,6.808,6.808,0,0,1,1.945.648,3.207,3.207,0,0,0,1.189.432,2.522,2.522,0,0,0,1.513-.757l0.756-.973c1.081-1.4,2.27-2.81,3.35-4,1.621-2.161,3.242-4.107,4.647-6.268,2.053-2.7,3.891-5.4,5.836-8l0.54-.648a7.434,7.434,0,0,0,.648-2.27c0-.324-0.108-0.54-0.324-0.54-0.54,0-1.621,1.189-2.053,2.269v0.216C92.589,47.821,92.589,47.821,92.481,47.821ZM57.573,57.764a8.528,8.528,0,0,0-.324,1.4l-0.108.108a0.216,0.216,0,0,1-.108-0.216V58.953a42.724,42.724,0,0,1,.757-4.971,40.971,40.971,0,0,1,2.486-6.592c0.756-1.513,1.4-3.134,2.27-4.755l0.324-.216s0.108-.108.108,0a0.377,0.377,0,0,1,.108.216,2.748,2.748,0,0,1-.216.756A67.442,67.442,0,0,0,57.573,57.764Zm17.508-4.647a2.107,2.107,0,0,1,.108-0.865,29.934,29.934,0,0,1,1.189-5.187c0.432-1.189.648-2.378,0.973-3.566a1.654,1.654,0,0,1,.54-0.756,3.777,3.777,0,0,1-.324,1.3c-0.756,2.594-1.513,5.3-2.053,7.889A1.625,1.625,0,0,1,75.081,53.117ZM63.733,43.39a0.408,0.408,0,0,0,.216-0.216h0.324v0.108l-0.432.864c-0.54,1.405-1.189,2.81-1.729,4.323-0.432.865-.54,1.729-0.865,2.486a2.864,2.864,0,0,1-.54.648l0.216-.757C61.68,48.362,62.761,45.768,63.733,43.39ZM56.492,57.332V56.467a31.437,31.437,0,0,1,2.27-7.241,0.916,0.916,0,0,1,.324-0.324,2.685,2.685,0,0,0-.108.865,48.5,48.5,0,0,0-2.27,7.025Zm4.323-5.3a1.1,1.1,0,0,1-.54.865,1.39,1.39,0,0,1,.432-1.3A0.817,0.817,0,0,1,60.815,52.036Zm28.1,0.865a1.415,1.415,0,0,1-.865.648A0.7,0.7,0,0,1,88.914,52.9Zm0.973-1.621a0.789,0.789,0,0,1,.648-0.756A0.789,0.789,0,0,1,89.887,51.28ZM72.811,46.632c0,0.108.108,0.324,0.108,0.432a0.453,0.453,0,0,1-.324.432c0-.108-0.108-0.324-0.108-0.432A0.453,0.453,0,0,1,72.811,46.632Zm-1.081,2.053a0.789,0.789,0,0,1-.648.757A0.927,0.927,0,0,1,71.731,48.686Zm-3.783,5.728a1.018,1.018,0,0,1-.432.973A0.873,0.873,0,0,1,67.948,54.414Zm7.025-.216a0.562,0.562,0,0,1-.216-0.432,0.988,0.988,0,0,1,.324-0.54v0.54A0.522,0.522,0,0,1,74.973,54.2Zm8.322,6.052a0.463,0.463,0,0,1-.54.54l-0.108-.108A0.992,0.992,0,0,1,83.295,60.25ZM73.244,46.416a0.962,0.962,0,0,1,.54-0.865A0.963,0.963,0,0,1,73.244,46.416ZM69.677,51.6v0.324a0.652,0.652,0,0,1-.432.54V52.252A0.888,0.888,0,0,1,69.677,51.6Zm20.75,0.54a0.59,0.59,0,0,1-.54.648A0.589,0.589,0,0,1,90.427,52.144ZM87.4,54.738a0.605,0.605,0,0,1-.54.648A0.654,0.654,0,0,1,87.4,54.738ZM70.974,49.767a0.724,0.724,0,0,1-.432.757A0.723,0.723,0,0,1,70.974,49.767Zm-1.729,2.7a0.813,0.813,0,0,1-.54.757A0.813,0.813,0,0,1,69.245,52.468Zm-1.081,3.566a0.724,0.724,0,0,1,.432-0.757A0.724,0.724,0,0,1,68.164,56.035Zm18.373-.108a0.816,0.816,0,0,1-.432.757V56.467A0.582,0.582,0,0,1,86.537,55.927ZM90.968,50.2a0.4,0.4,0,0,1-.108-0.324,0.583,0.583,0,0,1,.432-0.432A1.612,1.612,0,0,1,90.968,50.2Zm-1.4,1.405a0.4,0.4,0,0,1,.108.324,0.453,0.453,0,0,1-.324.432A0.912,0.912,0,0,1,89.563,51.6ZM69.677,53.549a0.65,0.65,0,0,1,.432-0.757A0.816,0.816,0,0,1,69.677,53.549Zm-1.945,3.458a0.817,0.817,0,0,1,.324-0.865v0.216A0.934,0.934,0,0,1,67.732,57.007Zm2.486-4.323a0.659,0.659,0,0,1,.324-0.756v0.216A0.594,0.594,0,0,1,70.218,52.684ZM56.492,57.332c0,0.216.108,0.324,0.108,0.54a0.825,0.825,0,0,1-.216.54v-0.54A0.974,0.974,0,0,1,56.492,57.332Zm18.7-8.214a0.817,0.817,0,0,1,.108.432,0.4,0.4,0,0,1-.108.324,1.825,1.825,0,0,1-.216-0.54C74.973,49.226,74.973,49.226,75.189,49.118Zm-0.108.865a0.8,0.8,0,0,1-.324.757A0.659,0.659,0,0,1,75.081,49.983Zm10.051,7.889c0,0.216-.108.324-0.54,0.54A0.579,0.579,0,0,1,85.132,57.872ZM59.626,47.713a0.653,0.653,0,0,1-.324.648A0.77,0.77,0,0,1,59.626,47.713Zm0.432,6.052a1.164,1.164,0,0,1,.216-0.865A1.164,1.164,0,0,1,60.059,53.765ZM76.27,45.011a1.029,1.029,0,0,1-.216.756A0.809,0.809,0,0,1,76.27,45.011ZM89.347,52.36a0.718,0.718,0,0,1-.432.54A0.652,0.652,0,0,1,89.347,52.36Zm-30.044-4a0.514,0.514,0,0,1-.216.54A0.514,0.514,0,0,1,59.3,48.362Zm15.887,0.324,0.108-.108c0.108,0,.108.108,0.108,0.216l-0.216.324V48.686Zm-15.563-1.3a0.216,0.216,0,0,1,.108-0.216c0,0.108.108,0.108,0.108,0.216a0.573,0.573,0,0,1-.216.324V47.389Zm15.995-.432V46.849l0.324,0.216-0.216.324A0.522,0.522,0,0,0,75.621,46.957Zm8.862,11.456v0.216c0,0.108,0,.108-0.216.216A0.432,0.432,0,0,1,84.483,58.412Zm-12.212-10.7a0.913,0.913,0,0,1-.216.648A0.914,0.914,0,0,1,72.271,47.713ZM59.735,55.6a0.106,0.106,0,0,0-.108.108c-0.108,0-.108-0.108-0.108-0.216a0.409,0.409,0,0,1,.216-0.216V55.6Zm26.8,0.216a0.65,0.65,0,0,1,.108-0.432c0,0.108.108,0.216,0.108,0.324S86.645,55.819,86.537,55.819ZM70.218,50.847a0.826,0.826,0,0,1-.216.54A0.514,0.514,0,0,1,70.218,50.847Zm4.539-.108v0.324c0,0.108-.108.108-0.108,0.216a0.106,0.106,0,0,1-.108-0.108Zm12.969,3.566a0.422,0.422,0,0,1-.216.432A0.432,0.432,0,0,1,87.726,54.306ZM59.735,46.957a0.573,0.573,0,0,1,.216-0.324,0.825,0.825,0,0,1-.216.54V46.957Zm8.97,8.322V54.954a0.4,0.4,0,0,1,.108-0.324v0.216A0.522,0.522,0,0,1,68.7,55.278Zm6.052-.973v0.648a0.377,0.377,0,0,1-.108-0.216V54.63A1.089,1.089,0,0,1,74.757,54.306Zm18.481-5.944a0.671,0.671,0,0,1-.324.432A0.453,0.453,0,0,1,93.237,48.362Zm-4.215,5.62a0.365,0.365,0,0,0,.216-0.324V53.549a0.377,0.377,0,0,1,.108.216A0.271,0.271,0,0,1,89.022,53.981Zm2.269-4.539a0.635,0.635,0,0,1,.216-0.54A0.825,0.825,0,0,1,91.292,49.442ZM68.38,53.549a0.81,0.81,0,0,1-.108.54V53.873A0.4,0.4,0,0,1,68.38,53.549Zm24.1-5.728a0.106,0.106,0,0,0-.108-0.108l-0.324.324Zm-32.422,6.16a0.106,0.106,0,0,0-.108.108c0-.108-0.108-0.108-0.108-0.216,0.108,0,.108-0.108.216-0.108v0.216Zm-3.675,4.971a0.106,0.106,0,0,1-.108-0.108V58.737a0.377,0.377,0,0,1,.108-0.216v0.432Zm31.666-5.4v0.216a0.4,0.4,0,0,1-.108.324A1.447,1.447,0,0,1,88.05,53.549ZM86.1,56.683a0.917,0.917,0,0,0-.324.324A0.278,0.278,0,0,1,86.1,56.683ZM75.729,47.389v0.216l-0.108.108V47.5A0.106,0.106,0,0,1,75.729,47.389Zm16.319,0.648a0.462,0.462,0,0,0-.324.324ZM89.887,51.28a0.573,0.573,0,0,1-.216.324A0.3,0.3,0,0,1,89.887,51.28ZM85.24,57.764c0-.108-0.108-0.108-0.108-0.216s0.108-.108.108-0.216v0.432Zm7.241-8.646a0.365,0.365,0,0,1-.216.324A0.573,0.573,0,0,1,92.481,49.118ZM69.137,54.306a0.65,0.65,0,0,1,.108-0.432A0.65,0.65,0,0,1,69.137,54.306Zm21.4-3.782a0.271,0.271,0,0,1,.324-0.216Zm-6.7,8.97V59.385a0.216,0.216,0,0,1,.108-0.216A0.4,0.4,0,0,1,83.835,59.493Zm-2.053,1.621a1.555,1.555,0,0,0-.216.324A0.3,0.3,0,0,1,81.782,61.114ZM91.832,50.2a0.365,0.365,0,0,1-.324.216A1.558,1.558,0,0,0,91.832,50.2Zm-5.187,6.917a1.555,1.555,0,0,0-.216.324A0.3,0.3,0,0,1,86.645,57.115ZM59.735,55.17V54.954a0.106,0.106,0,0,1,.108.108Zm16.319-9.4a0.4,0.4,0,0,0-.108.324,0.106,0.106,0,0,0-.108-0.108Zm1.837-3.242L78,42.634l-0.108.108C77.891,42.634,77.783,42.526,77.891,42.526ZM87.726,55.6a0.573,0.573,0,0,1,.216-0.324A0.573,0.573,0,0,1,87.726,55.6Zm3.026-4.323a0.3,0.3,0,0,1-.216.324A0.573,0.573,0,0,0,90.752,51.28Zm-24.1,5.188a1.089,1.089,0,0,1-.108.324A0.4,0.4,0,0,1,66.651,56.467Zm26.8-8.646a1.089,1.089,0,0,1-.108.324A0.4,0.4,0,0,1,93.453,47.821Zm-4.431,6.268c0,0.108-.108.216-0.108,0.324A0.4,0.4,0,0,1,89.022,54.089Zm-14.806-.756,0.108-.108v0.108H74.216ZM92.589,48.9c0,0.108,0,.108-0.108.108Zm-19.345-.865a0.533,0.533,0,0,1,.108-0.324Zm15.022,6.7c0,0.108-.108.216-0.108,0.324A0.4,0.4,0,0,1,88.266,54.738ZM92.589,47.5a0.335,0.335,0,0,1-.216.108ZM99.83,43.39c2.162-3.026,4.54-4.323,6.377-4.323a2.407,2.407,0,0,1,2.594,2.053,0.255,0.255,0,0,0,.324.216h0.108v0.108c-0.649,1.621-1.189,1.837-1.3,3.026a0.4,0.4,0,0,0-.108.324c0,0.108,0,.216.108,0.216a0.216,0.216,0,0,1,.108.216,2.773,2.773,0,0,1-.216.54c0,0.108.108,0.216,0.432,0.216a3.414,3.414,0,0,0,2.918-1.3,14.53,14.53,0,0,0,1.513-4.647V39.716c0-2.7-4.107-4.215-6.268-4.539h-2.486c-2.918.324-5.3,1.837-7.889,4A21.573,21.573,0,0,0,91.4,45.552c-0.324.757-.432,1.4-0.757,2.161l-0.324,1.081a1.839,1.839,0,0,0,.108.757v0.865a6.294,6.294,0,0,0,.324,2.053,8.479,8.479,0,0,0,1.189,1.945,14.445,14.445,0,0,0,2.81,3.35c2.27,2.27,2.918,4.323,2.918,7.565v1.729c-0.216.865-1.3,1.081-1.837,1.837-0.973.973-3.891,1.945-4.863,2.918a15.6,15.6,0,0,0-2.053,4A2.89,2.89,0,0,0,92.048,78.3a7.345,7.345,0,0,0,2.053-.324c0.216,0,.432.108,0.648,0.108a1.054,1.054,0,0,0,.973-0.432,11.365,11.365,0,0,0,4.431-4.323,11.49,11.49,0,0,0,1.945-3.783l0.108-.865a1.975,1.975,0,0,1,.216-0.973c0.216-.756,1.189-0.756,1.837-1.3a0.462,0.462,0,0,0,.325-0.324V65.977c0-.108-0.108,0,0-0.108,2.269-1.837,4.215-2.378,6.484-4.215a22.97,22.97,0,0,1,5.836-4.107c0.432-.108.432-0.432,0.865-0.54a0.671,0.671,0,0,0,.324-0.432,4.683,4.683,0,0,1-.108-0.54,2.023,2.023,0,0,0-1.513-.54,2.381,2.381,0,0,0-.865.108,16,16,0,0,0-5.3,3.134c-2.162,1.513-4.323,2.27-6.161,4.107a4.723,4.723,0,0,0-.864.757c-0.108,0-.216.108-0.324,0.108-0.217,0-.217-0.108-0.325-0.432,0-.108-0.108-0.324-0.108-0.432a23.553,23.553,0,0,0-3.134-5.62,9.522,9.522,0,0,1-2.378-2.7c-0.432-.432-0.432-0.973-0.865-1.513a3.327,3.327,0,0,1-.324-1.4V51.171c0-.324.216-0.648,0.216-0.973A16.29,16.29,0,0,1,99.83,43.39Zm-3.566-.324c-0.432,1.405-1.513,2.378-2.486,3.891l0.108-.973c0.54-.865,1.4-1.513,1.837-2.378A2.545,2.545,0,0,1,96.263,43.066Zm0.865,30.585c-0.108,0-.216.324-0.324,0.324a0.335,0.335,0,0,1-.216.108H96.479l0.216-.108a1.292,1.292,0,0,1,.432-0.865,0.378,0.378,0,0,1,.108-0.216,0.807,0.807,0,0,1,.324.324C97.128,73.543,97.128,73.543,97.128,73.651Zm-0.865-28.1a4.259,4.259,0,0,1,.973-1.189,4.539,4.539,0,0,1-.756,1.3A0.334,0.334,0,0,1,96.263,45.552ZM91.724,73.11V73H92.8a5.74,5.74,0,0,0,1.513-.108,4.238,4.238,0,0,1-1.837.216H91.724Zm5.62-29.18c0,0.108.108,0.216,0.108,0.324a0.106,0.106,0,0,1-.108.108H97.236C97.236,44.039,97.236,43.931,97.344,43.931Zm-4.215,1.837a0.106,0.106,0,0,1,.108-0.108Zm53.712-23.992a1.051,1.051,0,0,1-.648-0.54,93.777,93.777,0,0,0-14.806,2.378,6.651,6.651,0,0,1-1.405.108h-0.216a0.287,0.287,0,0,1-.325-0.324V23.072c0.541-1.3.649-1.945,1.081-3.242l2.378-7.349a12.439,12.439,0,0,0,.648-1.837V10.32a0.176,0.176,0,0,0-.216-0.216,1.439,1.439,0,0,1-.324-0.54,0.271,0.271,0,0,0-.216-0.324,0.572,0.572,0,0,0-.324.216,1.284,1.284,0,0,1-.541.54,1.439,1.439,0,0,1-.54.324,7.571,7.571,0,0,1,.864-1.081,0.377,0.377,0,0,1,.108-0.216l-0.108-.108c-0.108,0-.108.108-0.216,0.108h-0.216V9.131a0.572,0.572,0,0,0-.324.216,0.917,0.917,0,0,1,.324-0.324,1.166,1.166,0,0,0-.756-0.324h-0.217a1.438,1.438,0,0,0-.972.648,8.951,8.951,0,0,0-1.189,1.621,25.118,25.118,0,0,0-2.053,4.215c-1.405,3.026-1.946,5.62-3.135,8.538-0.648,1.945-5.619,2.486-7.565,3.026a18.5,18.5,0,0,0-2.918.973,1.133,1.133,0,0,0-.324.432,0.562,0.562,0,0,0-.216.432V28.8a1.827,1.827,0,0,1,.324.648,1.636,1.636,0,0,0,1.513.757h0.432l6.809-1.189h0.108c0.216,0,.324.108,0.324,0.432v0.216a44.291,44.291,0,0,1-1.08,5.188c0,0.54-.433,1.729-0.433,2.27a2.66,2.66,0,0,1-.432,1.189,3.52,3.52,0,0,1-.432,1.513v0.324a10.159,10.159,0,0,1-.865,3.458v0.108a0.378,0.378,0,0,1-.108.216,0.409,0.409,0,0,1,.216.216L118.2,49.01v0.108l-0.541,2.81c-0.216,2.161-1.3,7.781-1.837,10.159,0,0.324-.108.757-0.108,1.189l-0.756,5.3a4.057,4.057,0,0,0-.108,1.081v1.3a26.545,26.545,0,0,0-.325,2.918v0.216c0,1.081-.324,4.647-0.324,6.917a3.277,3.277,0,0,0,.216,1.837,1.374,1.374,0,0,1,.757.432,1.132,1.132,0,0,0,.432.324,4.517,4.517,0,0,1,1.081.432c0.108,0.324,1.3-6.809,1.513-7.025a1.227,1.227,0,0,0,.324-0.865V75.92c0-1.189.649-2.378,0.865-3.566a23.153,23.153,0,0,0,.432-3.458V68.679a1.537,1.537,0,0,1,.216-0.648,6.65,6.65,0,0,0,.108-1.513c0-.324.216-0.648,0.216-0.973,0.433-2.81,1.729-8.862,2.162-11.564,0.324-1.621.54-3.134,0.972-4.755,0.541-1.945.757-3.891,1.3-5.836a1.84,1.84,0,0,1,.108-0.756l1.3-5.3c0.433-1.513,1.405-6.917,1.729-8.43a2.766,2.766,0,0,0,.541-1.3,1.047,1.047,0,0,1,.864-0.756,3.892,3.892,0,0,1,1.189-.216l7.673-1.945c0.865-.216,8-1.729,8.538-2.27a0.579,0.579,0,0,0,.324-0.432A0.232,0.232,0,0,0,146.841,21.776Zm-11.564,28.1c-0.216,1.189-.865,2.486-0.973,3.458a15.642,15.642,0,0,1-.54,3.242,28.989,28.989,0,0,0-.757,2.918,8.74,8.74,0,0,1-.432,2.7,17.011,17.011,0,0,1-.757,2.161c0,0.216.108,0.432,0.108,0.648a7.774,7.774,0,0,1-.432,2.053,6.166,6.166,0,0,1-.108,1.4,6.652,6.652,0,0,0-.108,1.405v0.54a52.5,52.5,0,0,0-1.189,5.3,0.818,0.818,0,0,0-.108.432l-0.864,5.079a8.663,8.663,0,0,0-.109,1.729,1.069,1.069,0,0,0,1.081.865h0.216a0.771,0.771,0,0,1,.649.324c0,0.324.108,0.54,0.324,0.54,0.108,0,.216-0.108.324-0.108s0.216,0,.216.108a1.651,1.651,0,0,0,.649.432h0.108a1.079,1.079,0,0,0,.432-0.54,5.19,5.19,0,0,0,.541-1.189,3.437,3.437,0,0,0,.216-1.405c0.432-1.945.648-3.783,1.188-5.728V76.028a16.728,16.728,0,0,1,.649-3.35c0-.432.324-0.973,0.324-1.405V71.057a18.892,18.892,0,0,1,1.081-4.755l0.648-2.7a9.464,9.464,0,0,0,.216-1.729c0.973-2.918,1.622-5.944,2.486-9.186a3.648,3.648,0,0,0,.432-1.3,9.649,9.649,0,0,1,.325-2.378l2.161-8c0.216-.865.649-1.945,0.865-2.918,0.108-.973.324-1.945,0.54-3.026,0.108-1.081.865-1.837,1.3-2.81a60.218,60.218,0,0,1,5.3-6.484,11.7,11.7,0,0,1,2.269-2.378,31.3,31.3,0,0,1,5.4-5.3c0.972-.973,2.161-1.729,3.35-2.7a28.726,28.726,0,0,1,6.484-3.458,14.224,14.224,0,0,1,2.486-.54h0.216a0.755,0.755,0,0,1,.865.649l-0.216,2.378a17.965,17.965,0,0,1-1.729,4,42.279,42.279,0,0,1-5.4,8.322c-2.918,3.35-5.62,6.7-8.862,9.835a22,22,0,0,0-2.7,2.81c-1.837,1.729-3.458,3.566-5.3,5.3l-1.405,1.729a1.19,1.19,0,0,0-.324.648,1.143,1.143,0,0,0,.433.648,1.334,1.334,0,0,1,.864,1.189,0.843,0.843,0,0,1,.432.432,0.773,0.773,0,0,0,.649.324,3.336,3.336,0,0,0,.864-0.216c0.541-.108.865-0.54,1.622-0.757a24.679,24.679,0,0,1,7.889-3.566,12.214,12.214,0,0,1,4.863-.973,11.1,11.1,0,0,1,1.837.108c2.054,0.432,2.378.973,3.027,3.026a25.658,25.658,0,0,1,.324,5.079,10.308,10.308,0,0,1-.973,3.891,0.817,0.817,0,0,0-.108.432,22.28,22.28,0,0,1-3.026,6.484,26.208,26.208,0,0,1-2.7,3.35A43.759,43.759,0,0,1,156.243,73c-1.189.973-2.594,1.837-3.891,2.918a21.589,21.589,0,0,1-4.863,2.162h-0.432a1.259,1.259,0,0,1-.757-0.216,4.244,4.244,0,0,1-1.081-1.729,12.083,12.083,0,0,1-.972-4.755,18.557,18.557,0,0,1,1.3-6.268,10.626,10.626,0,0,1,.54-1.729,37.143,37.143,0,0,1,3.134-4.431,20.678,20.678,0,0,1,3.459-2.918,0.682,0.682,0,0,0,.54-0.54,0.216,0.216,0,0,0-.108-0.216,0.335,0.335,0,0,0,.108-0.216,1.33,1.33,0,0,0-.54-0.216,0.571,0.571,0,0,1-.325-0.216c0-.216,0-0.324-0.432-0.432a4.674,4.674,0,0,1-.54-0.108,3.352,3.352,0,0,0-.865-0.216,1.44,1.44,0,0,0-.865.324,21.843,21.843,0,0,0-4.971,4.107,24.5,24.5,0,0,0-3.891,7.673c-0.216,1.189-.648,2.7-0.864,4.215a31.014,31.014,0,0,0,.432,4.215,12.38,12.38,0,0,0,6.16,6.7A6.7,6.7,0,0,0,149,81.54a19.428,19.428,0,0,0,2.378-.216l4.755-1.945a29.8,29.8,0,0,0,6.16-4.863,43.052,43.052,0,0,0,6.268-6.917,31.593,31.593,0,0,0,3.567-6.16,25.49,25.49,0,0,0,1.513-7.673c0-.432.108-0.865,0.108-1.3a15.789,15.789,0,0,0-.757-4.215,8.71,8.71,0,0,0-4.106-5.62,13.815,13.815,0,0,0-6.377-1.945h-2.918a5.416,5.416,0,0,1-1.3.216h-0.108c-0.108,0-.108-0.108-0.108-0.216a2.337,2.337,0,0,1,.865-0.973,29.876,29.876,0,0,1,2.594-2.7,110.27,110.27,0,0,0,8.537-10.267,31.253,31.253,0,0,0,5.512-11.456c0-.432.108-0.865,0.108-1.3a6.316,6.316,0,0,0-1.405-4.107,5.982,5.982,0,0,0-4.323-1.945,5.266,5.266,0,0,0-1.3.108,16.691,16.691,0,0,0-2.485.648c-1.081.54-1.838,1.081-2.81,1.513a38.68,38.68,0,0,0-4.864,2.918,62.415,62.415,0,0,0-6.16,5.728c-1.189,1.189-2.269,2.053-3.35,3.35l-0.865.973a0.255,0.255,0,0,1-.324.216,1.09,1.09,0,0,1-.108-0.324V22.316c0.973-3.242,1.513-6.268,2.378-9.294a2.139,2.139,0,0,1,.216-1.081V11.292a2.112,2.112,0,0,1,.108-0.757c-0.216-.756-0.432-1.729-1.621-1.945a0.431,0.431,0,0,1-.432-0.216,1.475,1.475,0,0,0-1.189.432c-0.865,2.378-1.513,4.431-2.378,6.592a13.081,13.081,0,0,1-1.189,3.458v0.324a0.794,0.794,0,0,1-.216.648c-0.432,1.081-.54,2.27-1.081,3.566a50.254,50.254,0,0,0-1.513,5.188l-1.621,5.62c-0.432,1.837-.864,3.783-1.513,5.728a50.632,50.632,0,0,1-1.3,5.512V45.66C136.249,47.281,135.493,48.686,135.277,49.875ZM159.7,34.96a3.672,3.672,0,0,0,.649-0.648,6.623,6.623,0,0,1,.432-0.648,1.132,1.132,0,0,0,.324-0.432,3.156,3.156,0,0,0,.865-0.432,0.365,0.365,0,0,0,.216-0.324,2.7,2.7,0,0,1,1.189-1.081,1.229,1.229,0,0,1-1.081,1.081l-0.216.648a27.052,27.052,0,0,1-3.458,3.566,5.357,5.357,0,0,1-1.946,1.837,4.913,4.913,0,0,1-1.729,1.945,15.365,15.365,0,0,1-2.269,2.378H152.46c-0.108,0-.108,0-0.108-0.108V42.418a1.135,1.135,0,0,1,.433-0.324,3.149,3.149,0,0,0,1.405-1.513,1.157,1.157,0,0,1,.648-0.216l0.648-1.189H155.27l0.216-.432v0.432l0.541-.432h0.108l0.54-.324a11.4,11.4,0,0,1,.757-1.189h-0.324a0.958,0.958,0,0,0,.432-0.54,0.975,0.975,0,0,1-.108.54l0.54-.432c0.108-.108.432-0.108,0.54-0.216,0.109-.432.649-0.756,0.757-1.189a0.533,0.533,0,0,1-.324-0.108,0.958,0.958,0,0,0,.54-0.432,1.537,1.537,0,0,0-.216.648ZM149.434,23.829a0.76,0.76,0,0,1,.541-0.432,0.573,0.573,0,0,0-.216-0.324l0.324-.432a0.993,0.993,0,0,1-.108.648,0.924,0.924,0,0,0,.324-0.648,1.154,1.154,0,0,1,.54-0.324h0.108a0.106,0.106,0,0,1,.108-0.108l0.649-.973a1.225,1.225,0,0,0,.648-0.648L153,20.371a0.811,0.811,0,0,1,.108-0.54h-0.216a0.4,0.4,0,0,1,.324-0.108c0.108,0,0,0,0,.108a1.654,1.654,0,0,0,.54-0.757,1.816,1.816,0,0,0,.865-0.756H154.19c0.108,0,.216-0.108.324-0.108a0.106,0.106,0,0,1,.108.108,0.913,0.913,0,0,0,.648-0.216,1.372,1.372,0,0,0,.108-0.648l0.757-.216a1.44,1.44,0,0,0,.324-0.54,1.306,1.306,0,0,0,.973-0.757,3.064,3.064,0,0,1,.972-0.648,0.819,0.819,0,0,0,.433-0.108,3.82,3.82,0,0,1,1.729-1.4v0.108a2.835,2.835,0,0,1-1.729,1.4,1.118,1.118,0,0,1-.433.108,5.243,5.243,0,0,1-2.161,1.945,1.03,1.03,0,0,1-.865.864,6.2,6.2,0,0,1-2.269,2.162,1.44,1.44,0,0,0-.324.54L149.11,24.8l-0.324.54A2.037,2.037,0,0,1,149,24.477,0.992,0.992,0,0,1,149.434,23.829Zm13.4,46.147c-0.432.324-.648,0.324-0.864,0.54a3.238,3.238,0,0,1,.432-0.865,39.919,39.919,0,0,0,5.4-7.133,1.706,1.706,0,0,0,.54-0.648h0.324l-0.108.108a4.508,4.508,0,0,1-.216.648,33.471,33.471,0,0,1-3.891,5.728A7.7,7.7,0,0,0,162.835,69.976Zm0.649,1.3a0.592,0.592,0,0,1-.541.432,4.563,4.563,0,0,1,.649-0.865,34.5,34.5,0,0,0,4.215-5.4,0.106,0.106,0,0,0,.108-0.108,0.377,0.377,0,0,0,.216-0.108,0.106,0.106,0,0,0,.108.108v0.108a0.357,0.357,0,0,1-.324.432A23.161,23.161,0,0,1,163.484,71.273ZM145.76,59.493a3.422,3.422,0,0,1,.648-0.54l-0.432.865a34.468,34.468,0,0,0-2.053,3.35,0.338,0.338,0,0,1-.217.108H143.6V62.951a0.915,0.915,0,0,1,.325-0.54C144.463,61.438,145.111,60.466,145.76,59.493ZM160.782,13.67a4.456,4.456,0,0,1,2.594-1.621,5.82,5.82,0,0,1-2.486,1.621,0.216,0.216,0,0,1-.216.108A0.106,0.106,0,0,0,160.782,13.67ZM147.273,26.315a2.216,2.216,0,0,0,.973-0.54,2.7,2.7,0,0,1-1.189,1.513A1.778,1.778,0,0,0,147.273,26.315Zm11.023-9.4a2.061,2.061,0,0,1,1.405-.973A1.665,1.665,0,0,1,158.3,16.912Zm2.27-1.4a1.185,1.185,0,0,1,1.189-.973A2.1,2.1,0,0,1,160.566,15.507ZM146.841,60.25a2.5,2.5,0,0,1,.864-1.189A2.031,2.031,0,0,1,146.841,60.25Zm11.131-21.182a1.572,1.572,0,0,1-.973.648,0.929,0.929,0,0,1,.757-0.648h0.216Zm7.349,26.37a1.254,1.254,0,0,1,.649-0.865A1.077,1.077,0,0,1,165.321,65.437Zm-19.237-4.215a1.365,1.365,0,0,1,.648-0.865A1.342,1.342,0,0,1,146.084,61.222Zm19.237-32.1a0.579,0.579,0,0,1-.54.54A0.579,0.579,0,0,1,165.321,29.125Zm-27.559,21.4a0.106,0.106,0,0,1-.108-0.108,1.607,1.607,0,0,1-.108-0.648,0.232,0.232,0,0,0,.216-0.216v0.973ZM166.4,63.708a0.877,0.877,0,0,1-.432.865A2.128,2.128,0,0,1,166.4,63.708Zm-2.486-32.962a0.494,0.494,0,0,1,.432-0.54A0.484,0.484,0,0,1,163.916,30.746ZM157,39.716a0.593,0.593,0,0,1-.432.648A0.782,0.782,0,0,1,157,39.716Zm-8.753-13.941a0.494,0.494,0,0,1,.54-0.432A0.582,0.582,0,0,1,148.246,25.774Zm17.075,3.35a0.8,0.8,0,0,1,.54-0.649A1.107,1.107,0,0,1,165.321,29.125Zm1.621-2.053c-0.324.324-.324,0.648-0.648,0.973A1.242,1.242,0,0,1,166.942,27.071ZM166.4,63.708c0-.108.216-0.324,0.216-0.432a1.087,1.087,0,0,0,.324-0.108v0.216ZM160.89,36.041a1.274,1.274,0,0,1-.54.54A0.579,0.579,0,0,1,160.89,36.041Zm-10.267-14.05c0.108-.108.432-0.108,0.54-0.216a0.82,0.82,0,0,1-.216.432Zm12.753,9.4a0.685,0.685,0,0,1,.54-0.648A2.867,2.867,0,0,1,163.376,31.394Zm2.918-3.35c0,0.216-.108.216-0.433,0.432A0.4,0.4,0,0,1,166.294,28.044Zm-6.377,6.16a1.537,1.537,0,0,1-.216.648h-0.216ZM149.434,23.829a0.573,0.573,0,0,1-.216-0.324,0.808,0.808,0,0,1,.324-0.324A1.372,1.372,0,0,0,149.434,23.829Zm9.511,14.158a0.718,0.718,0,0,1-.541.432A1.172,1.172,0,0,1,158.945,37.987Zm5.4-7.781a1.081,1.081,0,0,1,.433-0.54A0.717,0.717,0,0,1,164.348,30.205ZM145.76,61.546a0.916,0.916,0,0,0,.324-0.324c0,0.108-.108.324-0.108,0.432l-0.108.108C145.76,61.763,145.76,61.655,145.76,61.546Zm1.3-3.458a2.871,2.871,0,0,1-.541.648A1.444,1.444,0,0,1,147.057,58.088ZM160.35,36.582a2.554,2.554,0,0,0-.541.54A0.562,0.562,0,0,1,160.35,36.582ZM162.4,72.246a2.206,2.206,0,0,0,.54-0.54C162.943,72.03,162.835,72.03,162.4,72.246ZM156.243,40.8c0-.216,0-0.432.324-0.432ZM157,18.209a0.76,0.76,0,0,1-.54.432Zm5.188,16.211a1.079,1.079,0,0,1-.432.54Zm-2.81,2.918a0.453,0.453,0,0,1-.324.432Zm-1.837-.648a0.377,0.377,0,0,0,.216-0.108,0.408,0.408,0,0,1,.216.216A0.816,0.816,0,0,0,157.54,36.69Zm-0.432-20.75c0-.108,0-0.108.108-0.108a0.334,0.334,0,0,1,.216.108h-0.324Zm0.324,1.945a0.579,0.579,0,0,1,.324-0.432ZM159.917,34.2a0.65,0.65,0,0,1,.433.108A0.653,0.653,0,0,1,159.917,34.2Zm-12.86-6.917V27.5l-0.108.108V27.4ZM156.135,16.7a0.106,0.106,0,0,1,.108-0.108,0.377,0.377,0,0,0,.216.108h-0.324Zm-1.081.756c0.108,0,.108-0.108.216-0.108l0.108,0.108h-0.324Zm-4.647,4.755a1.09,1.09,0,0,1-.108.324h-0.108A0.573,0.573,0,0,0,150.407,22.208Zm5.4,16.319a0.216,0.216,0,0,1,.216.108A0.377,0.377,0,0,1,155.811,38.527ZM161,35.717c0,0.108-.108.216-0.108,0.324A0.4,0.4,0,0,1,161,35.717Zm4.107,30.044v0.108C165.105,65.761,165,65.761,165.105,65.761Zm24.209,4a5.771,5.771,0,0,0,4.107-1.729c0.324-.648.864-1.189,1.189-1.729a25.105,25.105,0,0,0,1.945-3.783,24.534,24.534,0,0,0,1.189-4,16.257,16.257,0,0,0,.972-3.783c0-.54.108-0.54,0.649-0.648a7.138,7.138,0,0,0,1.513-.108,18.113,18.113,0,0,0,4-.648,12.3,12.3,0,0,0,3.242-1.405,9.832,9.832,0,0,0,2.593-1.729,0.849,0.849,0,0,1,.433-0.432,0.3,0.3,0,0,1,.216-0.324c0-.108.108-0.108,0.108-0.216a0.232,0.232,0,0,0-.216-0.216,0.4,0.4,0,0,0-.324.108l-0.108.108c-0.217,0-.217-0.108-0.217-0.108V48.9a0.365,0.365,0,0,0-.216-0.324h-0.216c-0.108,0-.108.216-0.216,0.216,0,0-.108,0-0.108-0.216h-0.216c-0.108,0-.108,0-0.108-0.108H209.2a0.653,0.653,0,0,0-.648.324l-0.865.648a18.438,18.438,0,0,1-2.053.973,9.226,9.226,0,0,1-2.594.973c-1.3.216-2.485,0.432-3.782,0.757-0.325,0-.433,0-0.433-0.324V51.6a0.65,0.65,0,0,1,.108-0.432,4.578,4.578,0,0,1-.432-1.3,1.887,1.887,0,0,0-1.081-1.4,2.577,2.577,0,0,0-.972-0.216,2.356,2.356,0,0,0-.649-0.108,3.438,3.438,0,0,0-1.513.216c-1.405.54-2.485,1.3-2.7,2.486v0.324a0.65,0.65,0,0,0-.108.432,0.964,0.964,0,0,0,.541.865l0.54,0.432a12.327,12.327,0,0,0,2.054,1.081c0.432,0.108.54,0.216,0.54,0.432v0.54c-0.108.648-.324,1.081-0.432,1.621a10.707,10.707,0,0,1-.865,2.81l-1.189,2.594a18.071,18.071,0,0,1-2.7,4.323,6.56,6.56,0,0,1-1.08.757,0.9,0.9,0,0,1-.757.324,2.125,2.125,0,0,1-.864-0.432l-0.433-.324a3.873,3.873,0,0,1-.432-1.189,2.925,2.925,0,0,1-.324-1.621V63.06a1.406,1.406,0,0,1,0-1.081L186.4,58.3c0.324-1.081.324-2.053,0.648-3.026,0-.756.108-1.3,0.108-1.837a23.4,23.4,0,0,0,1.3-3.891c0.325-.648.433-1.621,0.757-2.27,0.54-1.189,1.405-2.594,1.945-4a9.571,9.571,0,0,1,1.3-1.837V41.229a0.81,0.81,0,0,0-.108-0.54,1.337,1.337,0,0,1-.324-0.216,2.056,2.056,0,0,0-.973-0.324H190.5a2.039,2.039,0,0,0-.865-0.216,1.725,1.725,0,0,0-1.3.432l-0.864.648c-0.541.756-1.189,1.729-1.838,2.486-0.648,1.081-1.3,2.378-2.053,3.566a0.335,0.335,0,0,0-.108.216,1.615,1.615,0,0,1-.324.757,20.184,20.184,0,0,1-.757,2.378,26,26,0,0,0-1.189,3.458c0,0.324-.108.757-0.108,1.3a4.6,4.6,0,0,0-.216,1.189l-0.324,2.27a0.3,0.3,0,0,1-.216.324c0,0.324-.108.757-0.108,0.973,0,0.108-.108.216-0.108,0.324a1.827,1.827,0,0,0,.216.54,4.057,4.057,0,0,0-.108,1.081v1.081a0.216,0.216,0,0,0,.108.216c0,0.432.216,0.865,0.216,1.621a4,4,0,0,0,1.729,2.594,7.324,7.324,0,0,0,2.594,1.3L186.072,69a10.587,10.587,0,0,0,2.918.757h0.324Zm0.324-28.639a0.106,0.106,0,0,0,.108.108,0.82,0.82,0,0,1-.216.432c-0.973,1.4-1.513,2.81-2.486,4.323a21.588,21.588,0,0,0-1.945,4.971,29.7,29.7,0,0,0-1.405,5.079,12.365,12.365,0,0,1-.54,2.594,5.493,5.493,0,0,1-.324,1.837v0.108l-0.109-.108V60.033a17.167,17.167,0,0,0,.325-2.486c0.216-.865.216-1.837,0.54-3.026a11.772,11.772,0,0,0,.757-2.594,32.886,32.886,0,0,1,3.674-8.538,8.669,8.669,0,0,1,1.405-2.053Zm-2.377,2.486c0-.108.108-0.108,0.108-0.216V43.5c0,0.216-.108.432-0.108,0.648a13.033,13.033,0,0,0-2.162,4.215,23.884,23.884,0,0,0-1.513,4.431c-0.324,1.081-.54,2.27-0.865,3.242V56.9a13.064,13.064,0,0,1-.324,1.513v0.973l-0.216.432V58.412a4.013,4.013,0,0,1,.216-0.973,18.175,18.175,0,0,1,.433-2.378,5.691,5.691,0,0,1,.432-1.945,25.76,25.76,0,0,1,3.566-8.646A1.634,1.634,0,0,1,187.261,43.606Zm6.052,20.318a28.358,28.358,0,0,0,2.269-4.863,8.2,8.2,0,0,1,.649-2.162l0.216-.108V56.9a0.975,0.975,0,0,1-.108.54,24.592,24.592,0,0,1-2.81,6.484,1.437,1.437,0,0,1-.649.973Zm-2.27-22.263c0,0.108,0,.108-0.216.216a32.659,32.659,0,0,0-2.7,4.647v0.108c-0.108,0-.108,0-0.108-0.108V46.416a15.884,15.884,0,0,1,2.27-4.215,2.261,2.261,0,0,0,.432-0.648Zm3.026,23.452c0.541-1.3,1.081-2.378,1.405-3.35l0.649-1.405h0.108v0.324a23.55,23.55,0,0,1-1.621,3.782,3.412,3.412,0,0,1-.433.648C194.177,65.221,194.177,65.113,194.069,65.113Zm-0.432-14.05h-0.216a0.106,0.106,0,0,1-.108-0.108l0.432-.865h0.324Zm0.756,9.727a1.1,1.1,0,0,1-.54,1.081A2.016,2.016,0,0,1,194.393,60.79Zm-6.268-18.264a1.921,1.921,0,0,1-.756.865A1.167,1.167,0,0,1,188.125,42.526Zm6.809,17.184a0.647,0.647,0,0,1-.324.648,0.216,0.216,0,0,1,.108-0.216A0.432,0.432,0,0,1,194.934,59.709Zm0.216-.216a0.408,0.408,0,0,0-.216.216V59.385a0.572,0.572,0,0,1,.216-0.324v0.432Zm-0.432-8.646a0.409,0.409,0,0,1,.216-0.216h0.108a0.365,0.365,0,0,1-.216.324Zm0.756,7.025a1.141,1.141,0,0,1-.216.54c0-.216.108-0.324,0.108-0.648h0.108v0.108Zm-0.216.973c0,0.108-.108.108-0.108,0.216V58.737a0.4,0.4,0,0,1,.108-0.324v0.432Zm-0.648,1.513a0.431,0.431,0,0,1-.217.432A0.815,0.815,0,0,1,194.61,60.358ZM193.745,62.3c0-.108,0-0.324.108-0.324A0.305,0.305,0,0,1,193.745,62.3ZM192.88,50.739c0.217,0,.217,0,0.217.108H192.88V50.739Zm20.427-6.809a0.216,0.216,0,0,0,.108-0.216V43.5H213.2a0.817,0.817,0,0,0-.108-0.432c0-.108.108-0.216,0.108-0.324a1.331,1.331,0,0,1-.216-0.54,0.8,0.8,0,0,0-.757.324,27.185,27.185,0,0,0-2.161,3.134l-2.054,4.107a15.467,15.467,0,0,0-1.3,4.863,23.441,23.441,0,0,0-.972,7.241,9.468,9.468,0,0,0,.756,3.458,7.7,7.7,0,0,0,1.189,1.837,6.607,6.607,0,0,0,1.513.756,3.652,3.652,0,0,0,1.189.757,4.43,4.43,0,0,0,1.189.108,3.454,3.454,0,0,0,1.513-.324l1.621-1.513a22.865,22.865,0,0,0,1.513-1.837,34.152,34.152,0,0,0,2.161-2.918c1.729-1.945,3.567-4.215,5.62-6.376a27.85,27.85,0,0,1,3.35-3.891l0.108-.108a1.813,1.813,0,0,1,.973-0.757,7.456,7.456,0,0,0,1.729-3.458c0-.216.108-0.54,0.108-0.756V46.632a4.119,4.119,0,0,0-.324-1.081l-0.54.757a67.953,67.953,0,0,1-4.647,5.3,49.231,49.231,0,0,0-3.783,4.323,48.769,48.769,0,0,0-4.647,4.755,49.7,49.7,0,0,1-4.215,4.107,1.752,1.752,0,0,1-.973.54c-0.108,0-.216-0.108-0.324-0.108V63.6a25.3,25.3,0,0,1,.865-5.836c0.648-2.7,1.621-5.3,2.377-8a37.932,37.932,0,0,0,1.621-4.539,2.26,2.26,0,0,0,.433-1.189,0.5,0.5,0,0,0-.541-0.216,0.106,0.106,0,0,1-.108.108,0.377,0.377,0,0,0-.216.108V43.822a0.8,0.8,0,0,0-.756-0.757c-0.108,0-.108.108-0.217,0.432a1.243,1.243,0,0,1-.648.757,21.807,21.807,0,0,1-1.945,3.891,63.728,63.728,0,0,0-2.27,6.376,9.958,9.958,0,0,0-.54.865,14.227,14.227,0,0,1,.54-2.486,35.8,35.8,0,0,1,3.134-7.241,0.65,0.65,0,0,1-.108-0.432,0.817,0.817,0,0,1,.108-0.432,0.843,0.843,0,0,0-.432.324,0.966,0.966,0,0,1,.432-0.865V44.8A0.823,0.823,0,0,0,213.307,43.931Zm6.808-10.051a5.124,5.124,0,0,0-1.08-1.081,4,4,0,0,0-1.189-.54,0.521,0.521,0,0,0-.432-0.108,0.7,0.7,0,0,0-.649.216,3.8,3.8,0,0,0-1.4,2.918,0.457,0.457,0,0,0,.324.54c0.325,0.324.757,0.216,0.757,0.648a1.673,1.673,0,0,0,.864.865v0.324a0.913,0.913,0,0,1,.325.324,2.2,2.2,0,0,1,.54-0.108A3.237,3.237,0,0,1,218.6,36.8a1.159,1.159,0,0,1,.217-1.3,1.461,1.461,0,0,1,.972-0.973A1.826,1.826,0,0,1,220.115,33.88Zm-9.834,14.806a3.6,3.6,0,0,1,1.189-2.378A3.376,3.376,0,0,1,210.281,48.686Zm-1.3,3.35a4.294,4.294,0,0,1,.973-2.378A4.3,4.3,0,0,1,208.984,52.036Zm8.321-18.156a0.4,0.4,0,0,0-.108-0.324,0.431,0.431,0,0,1,.217-0.432h-0.325a0.5,0.5,0,0,1,.541-0.216v0.216h0.324l0.108-.108v0.108C218.062,33.556,217.954,33.772,217.305,33.88Zm-4,10.051c-0.108.108-.433,0.108-0.757,0.324A0.647,0.647,0,0,1,213.2,43.5,0.817,0.817,0,0,1,213.307,43.931Zm3.35,19.453c0,0.216-.108.324-0.648,0.648a0.849,0.849,0,0,1,.648-0.865v0.216Zm9.619-12.212a2.33,2.33,0,0,1,1.08-.865A1.435,1.435,0,0,1,226.276,51.171Zm3.242-3.675V47.065a0.761,0.761,0,0,1,.54-0.432A0.963,0.963,0,0,1,229.518,47.5Zm-5.728,6.484,0.108-.324c0-.324.216-0.432,0.648-0.54A2,2,0,0,1,223.79,53.981Zm4.863-5.3a1.571,1.571,0,0,1,.649-0.973A1.324,1.324,0,0,1,228.653,48.686Zm-0.972,1.081a0.216,0.216,0,0,1,.108-0.216,0.8,0.8,0,0,1,.54-0.648A0.965,0.965,0,0,1,227.681,49.767Zm-8.106,10.159a1.073,1.073,0,0,1,.648-0.864A1.121,1.121,0,0,1,219.575,59.925Zm5.728-6.7a1.666,1.666,0,0,1,.756-0.757A0.812,0.812,0,0,1,225.3,53.225Zm-4.755,4.323a1.923,1.923,0,0,1-.865.757A1.166,1.166,0,0,1,220.548,57.548Zm7.781-7.349a0.7,0.7,0,0,1-.648.54,0.974,0.974,0,0,1,.648-0.648V50.2ZM217.414,60.9c0,0.108.108,0.108,0.108,0.216a0.762,0.762,0,0,1-.541.432A0.729,0.729,0,0,1,217.414,60.9Zm-2.594,4.431a3.176,3.176,0,0,1,.864-0.865A1.373,1.373,0,0,1,214.82,65.329Zm3.674-4.647a1.522,1.522,0,0,1,.757-0.648A0.927,0.927,0,0,1,218.494,60.682Zm-9.942-6.376a0.233,0.233,0,0,1-.217.216,0.4,0.4,0,0,1-.108-0.324,0.817,0.817,0,0,1,.108-0.432A1.836,1.836,0,0,1,208.552,54.306Zm3.35-8.538c0-.108-0.108-0.324-0.108-0.432s0.108-.108.324-0.216A0.7,0.7,0,0,1,211.9,45.768Zm4.971,17.076a0.8,0.8,0,0,1,.649-0.648A0.975,0.975,0,0,1,216.873,62.843Zm8.646-10.7c0,0.108,0,.108-0.216.216V52.036l0.324-.324A2.455,2.455,0,0,1,225.519,52.144ZM211.47,46.308a0.494,0.494,0,0,1,.432-0.54A0.761,0.761,0,0,1,211.47,46.308Zm2.593-3.566V42.634l-0.108.108c0,0.108-.216.216-0.216,0.324a0.918,0.918,0,0,0-.324.324,0.635,0.635,0,0,1,.54-0.216,0.335,0.335,0,0,1-.108-0.216A0.409,0.409,0,0,1,214.063,42.742Zm5.08,15.995a0.806,0.806,0,0,0,.324-0.324c0.108,0,.108-0.108.216-0.108a0.82,0.82,0,0,0-.216.432,0.533,0.533,0,0,0-.324.108V58.737Zm-10.051-6.484a0.573,0.573,0,0,1-.216.324V52.252a0.216,0.216,0,0,1,.108-0.216C208.984,52.144,209.092,52.144,209.092,52.252Zm-0.432,1.081a1.012,1.012,0,0,1,.108-0.757A1.6,1.6,0,0,1,208.66,53.333Zm0.216,2.486a0.4,0.4,0,0,1-.108.324V55.711a0.4,0.4,0,0,1,.108-0.324v0.432Zm8.97,6.052,0.432-.865A1.628,1.628,0,0,1,217.846,61.871Zm-7.889-12.212c0-.216,0-0.432.216-0.432A0.82,0.82,0,0,1,209.957,49.658Zm10.7,9.078a0.232,0.232,0,0,0-.216.216c-0.217,0-.108.108-0.217,0.108a0.233,0.233,0,0,1,.217-0.216,1.183,1.183,0,0,0,.216-0.432v0.324Zm-3.675-25.4c0-.108,0-0.216.108-0.216a0.534,0.534,0,0,0,.108.324h-0.216V33.339Zm-2.269,32.206a0.831,0.831,0,0,1-.216.324,1.089,1.089,0,0,1,.108-0.324,0.409,0.409,0,0,0,.216-0.216C214.82,65.437,214.712,65.437,214.712,65.545Zm9.4-10.807a0.377,0.377,0,0,1-.216.108c0.108,0,.108-0.108.216-0.324,0.108,0,.108-0.108.216-0.108Zm-15.779-.973c0-.324,0-0.324.108-0.432A0.522,0.522,0,0,1,208.335,53.765Zm11.024,6.268h-0.108a0.408,0.408,0,0,1,.216-0.216l0.108,0.108A0.334,0.334,0,0,1,219.359,60.033Zm-1.513.432h0.108a0.408,0.408,0,0,0-.216.216,0.4,0.4,0,0,0-.324.108ZM210.281,49.01a0.106,0.106,0,0,1-.108.108V48.686C210.173,48.794,210.281,48.9,210.281,49.01Zm6.376,12.861a0.106,0.106,0,0,0,.108-0.108v0.108a1.553,1.553,0,0,0-.216.324A1.089,1.089,0,0,1,216.657,61.871Zm5.62-5.188a0.216,0.216,0,0,0-.216.108,0.305,0.305,0,0,0,.108-0.324h0.108v0.216Zm7.349-8.106a1.087,1.087,0,0,0-.324.108,1.335,1.335,0,0,1,.324-0.216v0.108Zm-6.593,6.052,0.325-.324v0.108a0.489,0.489,0,0,0-.325.324V54.63ZM218.6,59.493l0.108-.108v0.108a0.408,0.408,0,0,0-.216.216C218.494,59.6,218.6,59.6,218.6,59.493Zm0.541-.648v0.216A0.108,0.108,0,0,1,219.143,58.845Zm-2.378,4.323h-0.108a0.572,0.572,0,0,0,.216-0.324A0.4,0.4,0,0,1,216.765,63.168Zm7.565-8.97a0.365,0.365,0,0,1,.324-0.216Zm-5.944,6.592V60.682h0.108A0.106,0.106,0,0,1,218.386,60.79Zm-10.267-6.052s0-.108.216-0.108c-0.216.108-.216,0.108-0.216,0.216V54.738Zm20.858-5.512a0.306,0.306,0,0,1,.217-0.216Zm-8.1,8.754a0.408,0.408,0,0,0,.216-0.216A0.408,0.408,0,0,1,220.872,57.98Zm4.431-4.755c-0.216.108-.324,0.108-0.324,0.216C224.979,53.333,225.087,53.333,225.3,53.225Zm-0.324-.54,0.108-.108A0.106,0.106,0,0,1,224.979,52.684ZM243.458,10.1a0.843,0.843,0,0,0-.432.324,1.071,1.071,0,0,0-1.189-.865c-0.432,0-.864.108-1.08,0.108h-0.108c-5.4,0-11.24,21.4-12.429,26.694-1.729,8.97-3.242,16.427-3.35,25.181a15.98,15.98,0,0,0,.973,6.593c1.3,2.81,1.945,3.35,3.458,3.891l0.54,0.216a0.216,0.216,0,0,0,.216.108l0.108,0.108c2.27-.108,6.809-3.134,8-4.647,4.647-5.62,7.457-7.889,10.807-16.1a1.635,1.635,0,0,0,.216-0.865,0.647,0.647,0,0,0-.756-0.648,0.334,0.334,0,0,0-.216-0.108l-3.783,5.62a59,59,0,0,1-6.917,9.078c-2.269,2.81-4.647,4.323-6.484,4.539a1.168,1.168,0,0,1-.648-0.108c0-.108-0.108-0.432-0.108-0.54a19.423,19.423,0,0,1-.433-4.539c0-.973.108-2.053,0.216-3.242a71.581,71.581,0,0,1,1.622-8.106,4.683,4.683,0,0,0,.108-0.54l0.756-1.621s3.783-11.564,3.783-11.78,2.593-8,2.7-8.105,2.054-6.593,2.054-6.593l1.945-5.728a29.344,29.344,0,0,0,.649-6.268V11.292A2.19,2.19,0,0,0,243.458,10.1ZM230.922,49.226l1.837-6.484a1.194,1.194,0,0,1-.108-0.757c0.108-4.863,7.133-28.315,8.97-27.991a1.008,1.008,0,0,1,.757.432,5.433,5.433,0,0,1-.433,1.4S231.03,49.226,230.922,49.226Zm1.405-21.29a2.521,2.521,0,0,1,1.081-1.3v0.54c0,0.54-.541.54-0.649,0.973-1.189,5.188-1.621,7.457-2.594,11.348-0.648,4-1.08,5.188-1.621,9.4-0.108.757-1.188,9.186-1.405,9.835,0,0.108-.108.108-0.108,0.216,0-.108-0.216-0.216-0.216-0.324a13.524,13.524,0,0,0,.324-2.053c0.649-5.512,1.189-11.672,2.594-16.967Zm1.3-2.594a27.522,27.522,0,0,1,1.837-5.512,34.621,34.621,0,0,1-1.837,5.944V25.342Z";
3 |
4 | export default justboilLogoPath;
5 |
--------------------------------------------------------------------------------