feat:init
This commit is contained in:
commit
549f4e787b
20
.eslintignore
Normal file
20
.eslintignore
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
.now/*
|
||||||
|
*.css
|
||||||
|
.changeset
|
||||||
|
dist
|
||||||
|
esm/*
|
||||||
|
public/*
|
||||||
|
tests/*
|
||||||
|
scripts/*
|
||||||
|
*.config.js
|
||||||
|
.DS_Store
|
||||||
|
node_modules
|
||||||
|
coverage
|
||||||
|
.next
|
||||||
|
build
|
||||||
|
!.commitlintrc.cjs
|
||||||
|
!.lintstagedrc.cjs
|
||||||
|
!jest.config.js
|
||||||
|
!plopfile.js
|
||||||
|
!react-shim.js
|
||||||
|
!tsup.config.ts
|
92
.eslintrc.json
Normal file
92
.eslintrc.json
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json.schemastore.org/eslintrc.json",
|
||||||
|
"env": {
|
||||||
|
"browser": false,
|
||||||
|
"es2021": true,
|
||||||
|
"node": true
|
||||||
|
},
|
||||||
|
"extends": [
|
||||||
|
"plugin:react/recommended",
|
||||||
|
"plugin:prettier/recommended",
|
||||||
|
"plugin:react-hooks/recommended",
|
||||||
|
"plugin:jsx-a11y/recommended"
|
||||||
|
],
|
||||||
|
"plugins": ["react", "unused-imports", "import", "@typescript-eslint", "jsx-a11y", "prettier"],
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaFeatures": {
|
||||||
|
"jsx": true
|
||||||
|
},
|
||||||
|
"ecmaVersion": 12,
|
||||||
|
"sourceType": "module"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"react": {
|
||||||
|
"version": "detect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"no-console": "warn",
|
||||||
|
"react/prop-types": "off",
|
||||||
|
"react/jsx-uses-react": "off",
|
||||||
|
"react/react-in-jsx-scope": "off",
|
||||||
|
"react-hooks/exhaustive-deps": "off",
|
||||||
|
"jsx-a11y/click-events-have-key-events": "warn",
|
||||||
|
"jsx-a11y/interactive-supports-focus": "warn",
|
||||||
|
"prettier/prettier": "warn",
|
||||||
|
"no-unused-vars": "off",
|
||||||
|
"unused-imports/no-unused-vars": "off",
|
||||||
|
"unused-imports/no-unused-imports": "warn",
|
||||||
|
"@typescript-eslint/no-unused-vars": [
|
||||||
|
"warn",
|
||||||
|
{
|
||||||
|
"args": "after-used",
|
||||||
|
"ignoreRestSiblings": false,
|
||||||
|
"argsIgnorePattern": "^_.*?$"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"import/order": [
|
||||||
|
"warn",
|
||||||
|
{
|
||||||
|
"groups": [
|
||||||
|
"type",
|
||||||
|
"builtin",
|
||||||
|
"object",
|
||||||
|
"external",
|
||||||
|
"internal",
|
||||||
|
"parent",
|
||||||
|
"sibling",
|
||||||
|
"index"
|
||||||
|
],
|
||||||
|
"pathGroups": [
|
||||||
|
{
|
||||||
|
"pattern": "~/**",
|
||||||
|
"group": "external",
|
||||||
|
"position": "after"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"newlines-between": "always"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"react/self-closing-comp": "warn",
|
||||||
|
"react/jsx-sort-props": [
|
||||||
|
"warn",
|
||||||
|
{
|
||||||
|
"callbacksLast": true,
|
||||||
|
"shorthandFirst": true,
|
||||||
|
"noSortAlphabetically": false,
|
||||||
|
"reservedFirst": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"padding-line-between-statements": [
|
||||||
|
"warn",
|
||||||
|
{"blankLine": "always", "prev": "*", "next": "return"},
|
||||||
|
{"blankLine": "always", "prev": ["const", "let", "var"], "next": "*"},
|
||||||
|
{
|
||||||
|
"blankLine": "any",
|
||||||
|
"prev": ["const", "let", "var"],
|
||||||
|
"next": ["const", "let", "var"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
35
.gitignore
vendored
Normal file
35
.gitignore
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
|
|
||||||
|
# dependencies
|
||||||
|
/node_modules
|
||||||
|
/.pnp
|
||||||
|
.pnp.js
|
||||||
|
|
||||||
|
# testing
|
||||||
|
/coverage
|
||||||
|
|
||||||
|
# next.js
|
||||||
|
/.next/
|
||||||
|
/out/
|
||||||
|
|
||||||
|
# production
|
||||||
|
/build
|
||||||
|
|
||||||
|
# misc
|
||||||
|
.DS_Store
|
||||||
|
*.pem
|
||||||
|
|
||||||
|
# debug
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# local env files
|
||||||
|
.env*.local
|
||||||
|
|
||||||
|
# vercel
|
||||||
|
.vercel
|
||||||
|
|
||||||
|
# typescript
|
||||||
|
*.tsbuildinfo
|
||||||
|
next-env.d.ts
|
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"typescript.tsdk": "node_modules/typescript/lib"
|
||||||
|
}
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2023 Next UI
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
53
README.md
Normal file
53
README.md
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# Next.js & NextUI Template
|
||||||
|
|
||||||
|
This is a template for creating applications using Next.js 14 (app directory) and NextUI (v2).
|
||||||
|
|
||||||
|
[Try it on CodeSandbox](https://githubbox.com/nextui-org/next-app-template)
|
||||||
|
|
||||||
|
## Technologies Used
|
||||||
|
|
||||||
|
- [Next.js 14](https://nextjs.org/docs/getting-started)
|
||||||
|
- [NextUI v2](https://nextui.org/)
|
||||||
|
- [Tailwind CSS](https://tailwindcss.com/)
|
||||||
|
- [Tailwind Variants](https://tailwind-variants.org)
|
||||||
|
- [TypeScript](https://www.typescriptlang.org/)
|
||||||
|
- [Framer Motion](https://www.framer.com/motion/)
|
||||||
|
- [next-themes](https://github.com/pacocoursey/next-themes)
|
||||||
|
|
||||||
|
## How to Use
|
||||||
|
|
||||||
|
### Use the template with create-next-app
|
||||||
|
|
||||||
|
To create a new project based on this template using `create-next-app`, run the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx create-next-app -e https://github.com/nextui-org/next-app-template
|
||||||
|
```
|
||||||
|
|
||||||
|
### Install dependencies
|
||||||
|
|
||||||
|
You can use one of them `npm`, `yarn`, `pnpm`, `bun`, Example using `npm`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run the development server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Setup pnpm (optional)
|
||||||
|
|
||||||
|
If you are using `pnpm`, you need to add the following code to your `.npmrc` file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
public-hoist-pattern[]=*@nextui-org/*
|
||||||
|
```
|
||||||
|
|
||||||
|
After modifying the `.npmrc` file, you need to run `pnpm install` again to ensure that the dependencies are installed correctly.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Licensed under the [MIT license](https://github.com/nextui-org/next-app-template/blob/main/LICENSE).
|
13
app/about/layout.tsx
Normal file
13
app/about/layout.tsx
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
export default function AboutLayout({
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
children: React.ReactNode;
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<section className="flex flex-col items-center justify-center gap-4 py-8 md:py-10">
|
||||||
|
<div className="inline-block max-w-lg text-center justify-center">
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
9
app/about/page.tsx
Normal file
9
app/about/page.tsx
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { title } from "@/components/primitives";
|
||||||
|
|
||||||
|
export default function AboutPage() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h1 className={title()}>About</h1>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
13
app/blog/layout.tsx
Normal file
13
app/blog/layout.tsx
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
export default function BlogLayout({
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
children: React.ReactNode;
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<section className="flex flex-col items-center justify-center gap-4 py-8 md:py-10">
|
||||||
|
<div className="inline-block max-w-lg text-center justify-center">
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
9
app/blog/page.tsx
Normal file
9
app/blog/page.tsx
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { title } from "@/components/primitives";
|
||||||
|
|
||||||
|
export default function BlogPage() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h1 className={title()}>Blog</h1>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
13
app/docs/layout.tsx
Normal file
13
app/docs/layout.tsx
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
export default function DocsLayout({
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
children: React.ReactNode;
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<section className="flex flex-col items-center justify-center gap-4 py-8 md:py-10">
|
||||||
|
<div className="inline-block max-w-lg text-center justify-center">
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
9
app/docs/page.tsx
Normal file
9
app/docs/page.tsx
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { title } from "@/components/primitives";
|
||||||
|
|
||||||
|
export default function DocsPage() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h1 className={title()}>Docs</h1>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
31
app/error.tsx
Normal file
31
app/error.tsx
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { useEffect } from "react";
|
||||||
|
|
||||||
|
export default function Error({
|
||||||
|
error,
|
||||||
|
reset,
|
||||||
|
}: {
|
||||||
|
error: Error;
|
||||||
|
reset: () => void;
|
||||||
|
}) {
|
||||||
|
useEffect(() => {
|
||||||
|
// Log the error to an error reporting service
|
||||||
|
/* eslint-disable no-console */
|
||||||
|
console.error(error);
|
||||||
|
}, [error]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h2>Something went wrong!</h2>
|
||||||
|
<button
|
||||||
|
onClick={
|
||||||
|
// Attempt to recover by trying to re-render the segment
|
||||||
|
() => reset()
|
||||||
|
}
|
||||||
|
>
|
||||||
|
Try again
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
68
app/layout.tsx
Normal file
68
app/layout.tsx
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
import "@/styles/globals.css";
|
||||||
|
import { Metadata, Viewport } from "next";
|
||||||
|
import { Link } from "@nextui-org/link";
|
||||||
|
import clsx from "clsx";
|
||||||
|
|
||||||
|
import { Providers } from "./providers";
|
||||||
|
|
||||||
|
import { siteConfig } from "@/config/site";
|
||||||
|
import { fontSans } from "@/config/fonts";
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: {
|
||||||
|
default: siteConfig.name,
|
||||||
|
template: `%s - ${siteConfig.name}`,
|
||||||
|
},
|
||||||
|
description: siteConfig.description,
|
||||||
|
icons: {
|
||||||
|
icon: "/favicon.ico",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const viewport: Viewport = {
|
||||||
|
themeColor: [
|
||||||
|
{ media: "(prefers-color-scheme: light)", color: "white" },
|
||||||
|
{ media: "(prefers-color-scheme: dark)", color: "black" },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function RootLayout({
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
children: React.ReactNode;
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<html suppressHydrationWarning lang="en">
|
||||||
|
<head>
|
||||||
|
<title>DeeChael's Profile</title>
|
||||||
|
</head>
|
||||||
|
<body
|
||||||
|
className={clsx(
|
||||||
|
"min-h-screen bg-background font-sans antialiased",
|
||||||
|
fontSans.variable,
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<Providers themeProps={{ attribute: "class", defaultTheme: "dark" }}>
|
||||||
|
<div className="relative flex flex-col h-screen">
|
||||||
|
<main className="container mx-auto max-w-7xl pt-16 px-6 flex-grow">
|
||||||
|
{children}
|
||||||
|
</main>
|
||||||
|
<footer className="w-full flex items-center justify-center py-3">
|
||||||
|
<Link
|
||||||
|
isExternal
|
||||||
|
className="flex items-center gap-1 text-current"
|
||||||
|
href="https://nextui.org/"
|
||||||
|
title="nextui.org homepage"
|
||||||
|
>
|
||||||
|
<span className="text-default-600">Powered by</span>
|
||||||
|
<p className="text-primary">
|
||||||
|
<b>NextUI</b>
|
||||||
|
</p>
|
||||||
|
</Link>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</Providers>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
);
|
||||||
|
}
|
64
app/page.tsx
Normal file
64
app/page.tsx
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
import { Link } from "@nextui-org/link";
|
||||||
|
import { Avatar, Spacer } from "@nextui-org/react";
|
||||||
|
import { button as buttonStyles } from "@nextui-org/theme";
|
||||||
|
|
||||||
|
import { siteConfig } from "@/config/site";
|
||||||
|
import { title, subtitle } from "@/components/primitives";
|
||||||
|
import { GithubIcon, TwitterIcon, MavenIcon, GiteaIcon } from "@/components/icons";
|
||||||
|
|
||||||
|
export default function Home() {
|
||||||
|
return (
|
||||||
|
<section className="flex flex-col items-center justify-center gap-12 py-8 md:py-10">
|
||||||
|
<Spacer y={20} />
|
||||||
|
<div className="flex flex-row items-center justify-center gap-6">
|
||||||
|
<Avatar className="w-40 h-40 text-large" src="/avatar.jpg" />
|
||||||
|
<div className="inline-block max-w-xl text-center justify-center gap-4">
|
||||||
|
<h1 className={title()}>DeeChael</h1>
|
||||||
|
<br />
|
||||||
|
<h2 className={subtitle()}>A </h2>
|
||||||
|
<h2 className={subtitle({ color: "pink" })}>
|
||||||
|
non-professional
|
||||||
|
</h2>
|
||||||
|
<h2 className={subtitle()}>developer who </h2>
|
||||||
|
<br />
|
||||||
|
<h2 className={subtitle()}>knows </h2>
|
||||||
|
<h2 className={subtitle({ color: "yellow" })}>Java</h2>
|
||||||
|
<h2 className={subtitle()}>/</h2>
|
||||||
|
<h2 className={subtitle({ color: "violet" })}>Kotlin</h2>
|
||||||
|
<h2 className={subtitle()}>.</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex gap-3">
|
||||||
|
<Link
|
||||||
|
isExternal
|
||||||
|
className={buttonStyles({ variant: "bordered", radius: "full" })}
|
||||||
|
href={siteConfig.links.twitter}
|
||||||
|
>
|
||||||
|
<TwitterIcon size={20} />
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
isExternal
|
||||||
|
className={buttonStyles({ variant: "bordered", radius: "full" })}
|
||||||
|
href={siteConfig.links.github}
|
||||||
|
>
|
||||||
|
<GithubIcon size={20} />
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
isExternal
|
||||||
|
className={buttonStyles({ variant: "bordered", radius: "full" })}
|
||||||
|
href={siteConfig.links.github}
|
||||||
|
>
|
||||||
|
<GiteaIcon size={20} />
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
isExternal
|
||||||
|
className={buttonStyles({ variant: "bordered", radius: "full" })}
|
||||||
|
href={siteConfig.links.maven}
|
||||||
|
>
|
||||||
|
<MavenIcon size={40} />
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
13
app/pricing/layout.tsx
Normal file
13
app/pricing/layout.tsx
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
export default function PricingLayout({
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
children: React.ReactNode;
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<section className="flex flex-col items-center justify-center gap-4 py-8 md:py-10">
|
||||||
|
<div className="inline-block max-w-lg text-center justify-center">
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
9
app/pricing/page.tsx
Normal file
9
app/pricing/page.tsx
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { title } from "@/components/primitives";
|
||||||
|
|
||||||
|
export default function PricingPage() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h1 className={title()}>Pricing</h1>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
22
app/providers.tsx
Normal file
22
app/providers.tsx
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import * as React from "react";
|
||||||
|
import { NextUIProvider } from "@nextui-org/system";
|
||||||
|
import { useRouter } from "next/navigation";
|
||||||
|
import { ThemeProvider as NextThemesProvider } from "next-themes";
|
||||||
|
import { ThemeProviderProps } from "next-themes/dist/types";
|
||||||
|
|
||||||
|
export interface ProvidersProps {
|
||||||
|
children: React.ReactNode;
|
||||||
|
themeProps?: ThemeProviderProps;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function Providers({ children, themeProps }: ProvidersProps) {
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<NextUIProvider navigate={router.push}>
|
||||||
|
<NextThemesProvider {...themeProps}>{children}</NextThemesProvider>
|
||||||
|
</NextUIProvider>
|
||||||
|
);
|
||||||
|
}
|
14
components/counter.tsx
Normal file
14
components/counter.tsx
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { useState } from "react";
|
||||||
|
import { Button } from "@nextui-org/button";
|
||||||
|
|
||||||
|
export const Counter = () => {
|
||||||
|
const [count, setCount] = useState(0);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Button radius="full" onPress={() => setCount(count + 1)}>
|
||||||
|
Count is {count}
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
};
|
487
components/icons.tsx
Normal file
487
components/icons.tsx
Normal file
File diff suppressed because one or more lines are too long
141
components/navbar.tsx
Normal file
141
components/navbar.tsx
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
import {
|
||||||
|
Navbar as NextUINavbar,
|
||||||
|
NavbarContent,
|
||||||
|
NavbarMenu,
|
||||||
|
NavbarMenuToggle,
|
||||||
|
NavbarBrand,
|
||||||
|
NavbarItem,
|
||||||
|
NavbarMenuItem,
|
||||||
|
} from "@nextui-org/navbar";
|
||||||
|
import { Button } from "@nextui-org/button";
|
||||||
|
import { Kbd } from "@nextui-org/kbd";
|
||||||
|
import { Link } from "@nextui-org/link";
|
||||||
|
import { Input } from "@nextui-org/input";
|
||||||
|
import { link as linkStyles } from "@nextui-org/theme";
|
||||||
|
import NextLink from "next/link";
|
||||||
|
import clsx from "clsx";
|
||||||
|
|
||||||
|
import { siteConfig } from "@/config/site";
|
||||||
|
import { ThemeSwitch } from "@/components/theme-switch";
|
||||||
|
import {
|
||||||
|
TwitterIcon,
|
||||||
|
GithubIcon,
|
||||||
|
DiscordIcon,
|
||||||
|
HeartFilledIcon,
|
||||||
|
SearchIcon,
|
||||||
|
Logo,
|
||||||
|
} from "@/components/icons";
|
||||||
|
|
||||||
|
export const Navbar = () => {
|
||||||
|
const searchInput = (
|
||||||
|
<Input
|
||||||
|
aria-label="Search"
|
||||||
|
classNames={{
|
||||||
|
inputWrapper: "bg-default-100",
|
||||||
|
input: "text-sm",
|
||||||
|
}}
|
||||||
|
endContent={
|
||||||
|
<Kbd className="hidden lg:inline-block" keys={["command"]}>
|
||||||
|
K
|
||||||
|
</Kbd>
|
||||||
|
}
|
||||||
|
labelPlacement="outside"
|
||||||
|
placeholder="Search..."
|
||||||
|
startContent={
|
||||||
|
<SearchIcon className="text-base text-default-400 pointer-events-none flex-shrink-0" />
|
||||||
|
}
|
||||||
|
type="search"
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<NextUINavbar maxWidth="xl" position="sticky">
|
||||||
|
<NavbarContent className="basis-1/5 sm:basis-full" justify="start">
|
||||||
|
<NavbarBrand as="li" className="gap-3 max-w-fit">
|
||||||
|
<NextLink className="flex justify-start items-center gap-1" href="/">
|
||||||
|
<Logo />
|
||||||
|
<p className="font-bold text-inherit">ACME</p>
|
||||||
|
</NextLink>
|
||||||
|
</NavbarBrand>
|
||||||
|
<ul className="hidden lg:flex gap-4 justify-start ml-2">
|
||||||
|
{siteConfig.navItems.map((item) => (
|
||||||
|
<NavbarItem key={item.href}>
|
||||||
|
<NextLink
|
||||||
|
className={clsx(
|
||||||
|
linkStyles({ color: "foreground" }),
|
||||||
|
"data-[active=true]:text-primary data-[active=true]:font-medium",
|
||||||
|
)}
|
||||||
|
color="foreground"
|
||||||
|
href={item.href}
|
||||||
|
>
|
||||||
|
{item.label}
|
||||||
|
</NextLink>
|
||||||
|
</NavbarItem>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</NavbarContent>
|
||||||
|
|
||||||
|
<NavbarContent
|
||||||
|
className="hidden sm:flex basis-1/5 sm:basis-full"
|
||||||
|
justify="end"
|
||||||
|
>
|
||||||
|
<NavbarItem className="hidden sm:flex gap-2">
|
||||||
|
<Link isExternal aria-label="Twitter" href={siteConfig.links.twitter}>
|
||||||
|
<TwitterIcon className="text-default-500" />
|
||||||
|
</Link>
|
||||||
|
<Link isExternal aria-label="Discord" href={siteConfig.links.discord}>
|
||||||
|
<DiscordIcon className="text-default-500" />
|
||||||
|
</Link>
|
||||||
|
<Link isExternal aria-label="Github" href={siteConfig.links.github}>
|
||||||
|
<GithubIcon className="text-default-500" />
|
||||||
|
</Link>
|
||||||
|
<ThemeSwitch />
|
||||||
|
</NavbarItem>
|
||||||
|
<NavbarItem className="hidden lg:flex">{searchInput}</NavbarItem>
|
||||||
|
<NavbarItem className="hidden md:flex">
|
||||||
|
<Button
|
||||||
|
isExternal
|
||||||
|
as={Link}
|
||||||
|
className="text-sm font-normal text-default-600 bg-default-100"
|
||||||
|
href={siteConfig.links.sponsor}
|
||||||
|
startContent={<HeartFilledIcon className="text-danger" />}
|
||||||
|
variant="flat"
|
||||||
|
>
|
||||||
|
Sponsor
|
||||||
|
</Button>
|
||||||
|
</NavbarItem>
|
||||||
|
</NavbarContent>
|
||||||
|
|
||||||
|
<NavbarContent className="sm:hidden basis-1 pl-4" justify="end">
|
||||||
|
<Link isExternal aria-label="Github" href={siteConfig.links.github}>
|
||||||
|
<GithubIcon className="text-default-500" />
|
||||||
|
</Link>
|
||||||
|
<ThemeSwitch />
|
||||||
|
<NavbarMenuToggle />
|
||||||
|
</NavbarContent>
|
||||||
|
|
||||||
|
<NavbarMenu>
|
||||||
|
{searchInput}
|
||||||
|
<div className="mx-4 mt-2 flex flex-col gap-2">
|
||||||
|
{siteConfig.navMenuItems.map((item, index) => (
|
||||||
|
<NavbarMenuItem key={`${item}-${index}`}>
|
||||||
|
<Link
|
||||||
|
color={
|
||||||
|
index === 2
|
||||||
|
? "primary"
|
||||||
|
: index === siteConfig.navMenuItems.length - 1
|
||||||
|
? "danger"
|
||||||
|
: "foreground"
|
||||||
|
}
|
||||||
|
href="#"
|
||||||
|
size="lg"
|
||||||
|
>
|
||||||
|
{item.label}
|
||||||
|
</Link>
|
||||||
|
</NavbarMenuItem>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</NavbarMenu>
|
||||||
|
</NextUINavbar>
|
||||||
|
);
|
||||||
|
};
|
76
components/primitives.ts
Normal file
76
components/primitives.ts
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import { tv } from "tailwind-variants";
|
||||||
|
|
||||||
|
export const title = tv({
|
||||||
|
base: "tracking-tight inline font-semibold",
|
||||||
|
variants: {
|
||||||
|
color: {
|
||||||
|
violet: "from-[#FF1CF7] to-[#b249f8]",
|
||||||
|
yellow: "from-[#FF705B] to-[#FFB457]",
|
||||||
|
blue: "from-[#5EA2EF] to-[#0072F5]",
|
||||||
|
cyan: "from-[#00b7fa] to-[#01cfea]",
|
||||||
|
green: "from-[#6FEE8D] to-[#17c964]",
|
||||||
|
pink: "from-[#FF72E1] to-[#F54C7A]",
|
||||||
|
foreground: "dark:from-[#FFFFFF] dark:to-[#4B4B4B]",
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: "text-3xl lg:text-4xl",
|
||||||
|
md: "text-[2.3rem] lg:text-5xl leading-9",
|
||||||
|
lg: "text-4xl lg:text-6xl",
|
||||||
|
},
|
||||||
|
fullWidth: {
|
||||||
|
true: "w-full block",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
defaultVariants: {
|
||||||
|
size: "md",
|
||||||
|
},
|
||||||
|
compoundVariants: [
|
||||||
|
{
|
||||||
|
color: [
|
||||||
|
"violet",
|
||||||
|
"yellow",
|
||||||
|
"blue",
|
||||||
|
"cyan",
|
||||||
|
"green",
|
||||||
|
"pink",
|
||||||
|
"foreground",
|
||||||
|
],
|
||||||
|
class: "bg-clip-text text-transparent bg-gradient-to-b",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
export const subtitle = tv({
|
||||||
|
base: "w-full md:w-1/2 my-2 text-lg lg:text-xl text-default-600 block max-w-full inline",
|
||||||
|
variants: {
|
||||||
|
color: {
|
||||||
|
violet: "from-[#FF1CF7] to-[#b249f8]",
|
||||||
|
yellow: "from-[#FF705B] to-[#FFB457]",
|
||||||
|
blue: "from-[#5EA2EF] to-[#0072F5]",
|
||||||
|
cyan: "from-[#00b7fa] to-[#01cfea]",
|
||||||
|
green: "from-[#6FEE8D] to-[#17c964]",
|
||||||
|
pink: "from-[#FF72E1] to-[#F54C7A]",
|
||||||
|
foreground: "dark:from-[#FFFFFF] dark:to-[#4B4B4B]",
|
||||||
|
},
|
||||||
|
fullWidth: {
|
||||||
|
true: "!w-full",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
defaultVariants: {
|
||||||
|
fullWidth: true,
|
||||||
|
},
|
||||||
|
compoundVariants: [
|
||||||
|
{
|
||||||
|
color: [
|
||||||
|
"violet",
|
||||||
|
"yellow",
|
||||||
|
"blue",
|
||||||
|
"cyan",
|
||||||
|
"green",
|
||||||
|
"pink",
|
||||||
|
"foreground",
|
||||||
|
],
|
||||||
|
class: "bg-clip-text text-transparent bg-gradient-to-b",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
81
components/theme-switch.tsx
Normal file
81
components/theme-switch.tsx
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { FC } from "react";
|
||||||
|
import { VisuallyHidden } from "@react-aria/visually-hidden";
|
||||||
|
import { SwitchProps, useSwitch } from "@nextui-org/switch";
|
||||||
|
import { useTheme } from "next-themes";
|
||||||
|
import { useIsSSR } from "@react-aria/ssr";
|
||||||
|
import clsx from "clsx";
|
||||||
|
|
||||||
|
import { SunFilledIcon, MoonFilledIcon } from "@/components/icons";
|
||||||
|
|
||||||
|
export interface ThemeSwitchProps {
|
||||||
|
className?: string;
|
||||||
|
classNames?: SwitchProps["classNames"];
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ThemeSwitch: FC<ThemeSwitchProps> = ({
|
||||||
|
className,
|
||||||
|
classNames,
|
||||||
|
}) => {
|
||||||
|
const { theme, setTheme } = useTheme();
|
||||||
|
const isSSR = useIsSSR();
|
||||||
|
|
||||||
|
const onChange = () => {
|
||||||
|
theme === "light" ? setTheme("dark") : setTheme("light");
|
||||||
|
};
|
||||||
|
|
||||||
|
const {
|
||||||
|
Component,
|
||||||
|
slots,
|
||||||
|
isSelected,
|
||||||
|
getBaseProps,
|
||||||
|
getInputProps,
|
||||||
|
getWrapperProps,
|
||||||
|
} = useSwitch({
|
||||||
|
isSelected: theme === "light" || isSSR,
|
||||||
|
"aria-label": `Switch to ${theme === "light" || isSSR ? "dark" : "light"} mode`,
|
||||||
|
onChange,
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Component
|
||||||
|
{...getBaseProps({
|
||||||
|
className: clsx(
|
||||||
|
"px-px transition-opacity hover:opacity-80 cursor-pointer",
|
||||||
|
className,
|
||||||
|
classNames?.base,
|
||||||
|
),
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
<VisuallyHidden>
|
||||||
|
<input {...getInputProps()} />
|
||||||
|
</VisuallyHidden>
|
||||||
|
<div
|
||||||
|
{...getWrapperProps()}
|
||||||
|
className={slots.wrapper({
|
||||||
|
class: clsx(
|
||||||
|
[
|
||||||
|
"w-auto h-auto",
|
||||||
|
"bg-transparent",
|
||||||
|
"rounded-lg",
|
||||||
|
"flex items-center justify-center",
|
||||||
|
"group-data-[selected=true]:bg-transparent",
|
||||||
|
"!text-default-500",
|
||||||
|
"pt-px",
|
||||||
|
"px-0",
|
||||||
|
"mx-0",
|
||||||
|
],
|
||||||
|
classNames?.wrapper,
|
||||||
|
),
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
{!isSelected || isSSR ? (
|
||||||
|
<SunFilledIcon size={22} />
|
||||||
|
) : (
|
||||||
|
<MoonFilledIcon size={22} />
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</Component>
|
||||||
|
);
|
||||||
|
};
|
11
config/fonts.ts
Normal file
11
config/fonts.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { Fira_Code as FontMono, Inter as FontSans } from "next/font/google";
|
||||||
|
|
||||||
|
export const fontSans = FontSans({
|
||||||
|
subsets: ["latin"],
|
||||||
|
variable: "--font-sans",
|
||||||
|
});
|
||||||
|
|
||||||
|
export const fontMono = FontMono({
|
||||||
|
subsets: ["latin"],
|
||||||
|
variable: "--font-mono",
|
||||||
|
});
|
68
config/site.ts
Normal file
68
config/site.ts
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
export type SiteConfig = typeof siteConfig;
|
||||||
|
|
||||||
|
export const siteConfig = {
|
||||||
|
name: "Next.js + NextUI",
|
||||||
|
description: "Make beautiful websites regardless of your design experience.",
|
||||||
|
navItems: [
|
||||||
|
{
|
||||||
|
label: "Home",
|
||||||
|
href: "/",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Docs",
|
||||||
|
href: "/docs",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Pricing",
|
||||||
|
href: "/pricing",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Blog",
|
||||||
|
href: "/blog",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "About",
|
||||||
|
href: "/about",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
navMenuItems: [
|
||||||
|
{
|
||||||
|
label: "Profile",
|
||||||
|
href: "/profile",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Dashboard",
|
||||||
|
href: "/dashboard",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Projects",
|
||||||
|
href: "/projects",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Team",
|
||||||
|
href: "/team",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Calendar",
|
||||||
|
href: "/calendar",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Settings",
|
||||||
|
href: "/settings",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Help & Feedback",
|
||||||
|
href: "/help-feedback",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Logout",
|
||||||
|
href: "/logout",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
links: {
|
||||||
|
github: "https://github.com/DeeChael",
|
||||||
|
twitter: "https://x.com/DeerioChaelingo",
|
||||||
|
maven: "https://maven.deechael.net",
|
||||||
|
gitea: "https://git.deechael.net",
|
||||||
|
},
|
||||||
|
};
|
4
next.config.js
Normal file
4
next.config.js
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/** @type {import('next').NextConfig} */
|
||||||
|
const nextConfig = {}
|
||||||
|
|
||||||
|
module.exports = nextConfig
|
56
package.json
Normal file
56
package.json
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
{
|
||||||
|
"name": "next-app-template",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"dev": "next dev --turbo",
|
||||||
|
"build": "next build",
|
||||||
|
"start": "next start",
|
||||||
|
"lint": "eslint . --ext .ts,.tsx -c .eslintrc.json --fix"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@nextui-org/button": "2.0.38",
|
||||||
|
"@nextui-org/code": "2.0.33",
|
||||||
|
"@nextui-org/input": "2.2.5",
|
||||||
|
"@nextui-org/kbd": "2.0.34",
|
||||||
|
"@nextui-org/link": "2.0.35",
|
||||||
|
"@nextui-org/listbox": "2.1.27",
|
||||||
|
"@nextui-org/navbar": "2.0.37",
|
||||||
|
"@nextui-org/react": "^2.4.8",
|
||||||
|
"@nextui-org/snippet": "2.0.43",
|
||||||
|
"@nextui-org/switch": "2.0.34",
|
||||||
|
"@nextui-org/system": "2.2.6",
|
||||||
|
"@nextui-org/theme": "2.2.11",
|
||||||
|
"@react-aria/ssr": "3.9.4",
|
||||||
|
"@react-aria/visually-hidden": "3.8.12",
|
||||||
|
"clsx": "2.1.1",
|
||||||
|
"framer-motion": "~11.1.1",
|
||||||
|
"intl-messageformat": "^10.5.0",
|
||||||
|
"next": "14.2.4",
|
||||||
|
"next-themes": "^0.2.1",
|
||||||
|
"react": "18.3.1",
|
||||||
|
"react-dom": "18.3.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "20.5.7",
|
||||||
|
"@types/react": "18.3.3",
|
||||||
|
"@types/react-dom": "18.3.0",
|
||||||
|
"@typescript-eslint/eslint-plugin": "7.2.0",
|
||||||
|
"@typescript-eslint/parser": "7.2.0",
|
||||||
|
"autoprefixer": "10.4.19",
|
||||||
|
"eslint": "^8.57.0",
|
||||||
|
"eslint-config-next": "14.2.1",
|
||||||
|
"eslint-config-prettier": "^8.2.0",
|
||||||
|
"eslint-plugin-import": "^2.26.0",
|
||||||
|
"eslint-plugin-jsx-a11y": "^6.4.1",
|
||||||
|
"eslint-plugin-node": "^11.1.0",
|
||||||
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
|
"eslint-plugin-react": "^7.23.2",
|
||||||
|
"eslint-plugin-react-hooks": "^4.6.0",
|
||||||
|
"eslint-plugin-unused-imports": "^3.2.0",
|
||||||
|
"postcss": "8.4.38",
|
||||||
|
"tailwind-variants": "0.1.20",
|
||||||
|
"tailwindcss": "3.4.3",
|
||||||
|
"typescript": "5.0.4"
|
||||||
|
}
|
||||||
|
}
|
6
postcss.config.js
Normal file
6
postcss.config.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
module.exports = {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
}
|
BIN
public/avatar.jpg
Normal file
BIN
public/avatar.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
BIN
public/favicon.ico
Normal file
BIN
public/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
1
public/next.svg
Normal file
1
public/next.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
|
After Width: | Height: | Size: 1.3 KiB |
1
public/vercel.svg
Normal file
1
public/vercel.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 283 64"><path fill="black" d="M141 16c-11 0-19 7-19 18s9 18 20 18c7 0 13-3 16-7l-7-5c-2 3-6 4-9 4-5 0-9-3-10-7h28v-3c0-11-8-18-19-18zm-9 15c1-4 4-7 9-7s8 3 9 7h-18zm117-15c-11 0-19 7-19 18s9 18 20 18c6 0 12-3 16-7l-8-5c-2 3-5 4-8 4-5 0-9-3-11-7h28l1-3c0-11-8-18-19-18zm-10 15c2-4 5-7 10-7s8 3 9 7h-19zm-39 3c0 6 4 10 10 10 4 0 7-2 9-5l8 5c-3 5-9 8-17 8-11 0-19-7-19-18s8-18 19-18c8 0 14 3 17 8l-8 5c-2-3-5-5-9-5-6 0-10 4-10 10zm83-29v46h-9V5h9zM37 0l37 64H0L37 0zm92 5-27 48L74 5h10l18 30 17-30h10zm59 12v10l-3-1c-6 0-10 4-10 10v15h-9V17h9v9c0-5 6-9 13-9z"/></svg>
|
After Width: | Height: | Size: 629 B |
3
styles/globals.css
Normal file
3
styles/globals.css
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
@tailwind base;
|
||||||
|
@tailwind components;
|
||||||
|
@tailwind utilities;
|
21
tailwind.config.js
Normal file
21
tailwind.config.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import {nextui} from '@nextui-org/theme'
|
||||||
|
|
||||||
|
/** @type {import('tailwindcss').Config} */
|
||||||
|
module.exports = {
|
||||||
|
content: [
|
||||||
|
'./components/**/*.{js,ts,jsx,tsx,mdx}',
|
||||||
|
'./app/**/*.{js,ts,jsx,tsx,mdx}',
|
||||||
|
'./node_modules/@nextui-org/theme/dist/**/*.{js,ts,jsx,tsx}'
|
||||||
|
],
|
||||||
|
theme: {
|
||||||
|
extend: {
|
||||||
|
fontFamily: {
|
||||||
|
sans: ["var(--font-sans)"],
|
||||||
|
mono: ["var(--font-mono)"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
darkMode: "class",
|
||||||
|
darkMode: "class",
|
||||||
|
plugins: [nextui()],
|
||||||
|
}
|
28
tsconfig.json
Normal file
28
tsconfig.json
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "es5",
|
||||||
|
"lib": ["dom", "dom.iterable", "esnext"],
|
||||||
|
"allowJs": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"strict": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"module": "esnext",
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"jsx": "preserve",
|
||||||
|
"incremental": true,
|
||||||
|
"plugins": [
|
||||||
|
{
|
||||||
|
"name": "next"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["./*"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
5
types/index.ts
Normal file
5
types/index.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import { SVGProps } from "react";
|
||||||
|
|
||||||
|
export type IconSvgProps = SVGProps<SVGSVGElement> & {
|
||||||
|
size?: number;
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user