From 25daf1844eba9352e11c60352507571c99ccac0d Mon Sep 17 00:00:00 2001 From: Benjamin Toby Date: Wed, 16 Oct 2024 15:20:34 +0100 Subject: [PATCH] First Commit --- .gitignore | 40 ++++++++++++ README.md | 40 ++++++++++++ bun.lockb | Bin 0 -> 53805 bytes components/elements/ColorSchemeSelector.tsx | 19 ++++++ components/elements/Toggle.tsx | 47 ++++++++++++++ components/form/Form.tsx | 17 +++++ components/form/Input.tsx | 17 +++++ components/layout/Button.tsx | 65 ++++++++++++++++++++ components/layout/Container.tsx | 23 +++++++ components/layout/Footer.tsx | 21 +++++++ components/layout/H1.tsx | 12 ++++ components/layout/H2.tsx | 12 ++++ components/layout/H3.tsx | 12 ++++ components/layout/H4.tsx | 12 ++++ components/layout/H5.tsx | 12 ++++ components/layout/HR.tsx | 16 +++++ components/layout/Header.tsx | 25 ++++++++ components/layout/Link.tsx | 21 +++++++ components/layout/Main.tsx | 18 ++++++ components/layout/P.tsx | 12 ++++ components/layout/Row.tsx | 18 ++++++ components/layout/Section.tsx | 19 ++++++ components/layout/Span.tsx | 12 ++++ components/layout/Stack.tsx | 15 +++++ next.config.mjs | 6 ++ package.json | 28 +++++++++ postcss.config.mjs | 8 +++ styles/globals.css | 29 +++++++++ tailwind.config.ts | 20 ++++++ tsconfig.json | 21 +++++++ 30 files changed, 617 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100755 bun.lockb create mode 100644 components/elements/ColorSchemeSelector.tsx create mode 100644 components/elements/Toggle.tsx create mode 100644 components/form/Form.tsx create mode 100644 components/form/Input.tsx create mode 100644 components/layout/Button.tsx create mode 100644 components/layout/Container.tsx create mode 100644 components/layout/Footer.tsx create mode 100644 components/layout/H1.tsx create mode 100644 components/layout/H2.tsx create mode 100644 components/layout/H3.tsx create mode 100644 components/layout/H4.tsx create mode 100644 components/layout/H5.tsx create mode 100644 components/layout/HR.tsx create mode 100644 components/layout/Header.tsx create mode 100644 components/layout/Link.tsx create mode 100644 components/layout/Main.tsx create mode 100644 components/layout/P.tsx create mode 100644 components/layout/Row.tsx create mode 100644 components/layout/Section.tsx create mode 100644 components/layout/Span.tsx create mode 100644 components/layout/Stack.tsx create mode 100644 next.config.mjs create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 styles/globals.css create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57eb077 --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# 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 + +# Remove test +/pages +/public diff --git a/README.md b/README.md new file mode 100644 index 0000000..a75ac52 --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file. + +[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. + +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..056509461e4ad68752e9b6fee2775d6cbe5c3b42 GIT binary patch literal 53805 zcmeFa2{={T8$W*NBtynfNSP}0Oer#kkTPY8G8~-D4rLC}WJsejHc=skNP|*Rh)9Jd zX{HP%6%G8~b*X@A?0q)^p$1-s@eT&wAIp-nI7H!@0yo6+$RM3a(^7 z1(M$e5!VnuRuDNKe>ZOrvJXkl!#~K^C0K5QA}b?-K~_# zoEPei!ZE5p2syI9o1T*?a-Kf^u7o&n0pfiMek}`qN4dr3 z|HPqjIE?X!oD=e0^!jdI{@!GFmmm)cX#>eGn6d;KNA1_ZKirT9kzCx}$w2`weqj&~ zZeElSw;&e^i7*!$Lw*P#2e|}82Ykb!QAi_Dj_e8cBKe{AU(?S&K#uy)0XgEOItl7u zfc^^`5Fj1)b2{i5ufoaT74nN(Rh5M=Ut#j{)-o& z#c3GisJ%kaquf`JhQ9C`7a4?>tk%7-VlB7>njZurPrDRbw0>hbChb=g`Ux z;T*aevz{DG2DcF0eKw$s;1c9X%~!y`sGs_fBYPG@j(A}_-Gbp*TZGo1+mNGjb$aec z3Pox{q8NbyU5N>#=XQ{z_O#NR(#RbI8$n-i928DCQdE$Zsd<`I7mx z^I(b(*%jK!hH~V;y^te26&BFW6X6`$h0SZ%5Q?jR7_0}9G`uum(YS#-sQiplw77yb zAUG_5gw_lyZ!MIg_M^GeDv!&4TVpa*=QFkcsP*-tje0x`1`$V8TFrBEhZkBIKNuiJ zs~uc9TwQjF=$alno80_toAZF`*XfnE`-+`stMDwE*DR4`Um*ULJz>M8H7>X7d(4<) zW$qshy5n84hO*swUCB&|^CMxdp*PMjm0gSbv>hBQ(Zn+@wPKvsD3k7>tj`MJ(rpn(N5XAktx4M zTEY1HkR$IvG5egC+mlbqVf|OqJ~l6MGq>Pi9#1CYZjV%~-7B&g50}`?GTHFl)-SbnnpF0Rqb0|e%r$ln-)&-==)Sl3(!;u^o>e=XgtQed zRHVkuOz7LzVZeFjcyMy_4)>(;)#S(7ePVOd1cb#b6Nf^E<89vUE-SAIV9Qv+7xdP` zEn-!oWb~%KcVU_){5dU__YywXh3HTH;{NjOi|vX79}Bxrti76?`#IFzisJ^m<@VO1 zId&$j;g9BWHMq%zdDtfR3EG=4%b(slGOB-HRe*=b$6B28-epU2HRH(L)K$?wmmU|F z7B={%d^x&u!0?2u?L#Y`w{1FnPY*17|sNU89XfXS32v{ z=a${$?qKsov&z6+;o1>_`f6U+KnX1!HqJ$N?DCtJ59YiYkH`Loy5(Dw;hw+qv~p

3%S; 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, HTMLDivElement> & { + toggleProps?: TWUI_TOGGLE_PROPS; +}) { + return ( +

+ ); +} diff --git a/components/elements/Toggle.tsx b/components/elements/Toggle.tsx new file mode 100644 index 0000000..76f993a --- /dev/null +++ b/components/elements/Toggle.tsx @@ -0,0 +1,47 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export type TWUI_TOGGLE_PROPS = DetailedHTMLProps< + HTMLAttributes, + HTMLDivElement +> & { + active?: boolean; + circleProps?: DetailedHTMLProps< + HTMLAttributes, + HTMLDivElement + >; +}; + +/** + * # Toggle Component + * @className_wrapper twui-toggle-wrapper + * @className_circle twui-toggle-circle + */ +export default function Toggle({ + circleProps, + active, + ...props +}: TWUI_TOGGLE_PROPS) { + return ( +
+
+
+ ); +} diff --git a/components/form/Form.tsx b/components/form/Form.tsx new file mode 100644 index 0000000..489c14b --- /dev/null +++ b/components/form/Form.tsx @@ -0,0 +1,17 @@ +import { DetailedHTMLProps, FormHTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function Form({ + ...props +}: DetailedHTMLProps, HTMLFormElement>) { + return ( +
+ ); +} diff --git a/components/form/Input.tsx b/components/form/Input.tsx new file mode 100644 index 0000000..516f99c --- /dev/null +++ b/components/form/Input.tsx @@ -0,0 +1,17 @@ +import { DetailedHTMLProps, InputHTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function Input({ + ...props +}: DetailedHTMLProps, HTMLInputElement>) { + return ( + + ); +} diff --git a/components/layout/Button.tsx b/components/layout/Button.tsx new file mode 100644 index 0000000..23465ae --- /dev/null +++ b/components/layout/Button.tsx @@ -0,0 +1,65 @@ +import { + AnchorHTMLAttributes, + ButtonHTMLAttributes, + DetailedHTMLProps, + HTMLAttributeAnchorTarget, + HTMLAttributes, +} from "react"; +import { ClassNameValue, twMerge } from "tailwind-merge"; + +export default function Button({ + href, + target, + variant, + color, + linkProps, + ...props +}: DetailedHTMLProps< + ButtonHTMLAttributes, + HTMLButtonElement +> & { + variant?: "normal" | "ghost" | "outlined"; + color?: "primary" | "secondary" | "accent"; + href?: string; + target?: HTMLAttributeAnchorTarget; + linkProps?: DetailedHTMLProps< + AnchorHTMLAttributes, + HTMLAnchorElement + >; +}) { + const finalClassName: string = (() => { + if (variant == "normal" || !variant) { + if (color == "primary" || !color) return "bg-blue-500 text-white"; + } else if (variant == "outlined") { + if (color == "primary" || !color) + return ( + "bg-transparent outline outline-1 outline-blue-500" + + " text-blue-500" + ); + } else if (variant == "ghost") { + } + + return ""; + })(); + + const buttonComponent = ( + + ); + + if (href) + return ( +
+ {buttonComponent} + + ); + return buttonComponent; +} diff --git a/components/layout/Container.tsx b/components/layout/Container.tsx new file mode 100644 index 0000000..98fb94b --- /dev/null +++ b/components/layout/Container.tsx @@ -0,0 +1,23 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +/** + * # Default Container + * @className twui-container + */ +export default function Container({ + ...props +}: DetailedHTMLProps, HTMLDivElement>) { + return ( +
+ {props.children} +
+ ); +} diff --git a/components/layout/Footer.tsx b/components/layout/Footer.tsx new file mode 100644 index 0000000..9ded3db --- /dev/null +++ b/components/layout/Footer.tsx @@ -0,0 +1,21 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function Footer({ + ...props +}: DetailedHTMLProps, HTMLElement>) { + return ( +
+ {props.children} +
+ ); +} diff --git a/components/layout/H1.tsx b/components/layout/H1.tsx new file mode 100644 index 0000000..76a01bd --- /dev/null +++ b/components/layout/H1.tsx @@ -0,0 +1,12 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function H1({ + ...props +}: DetailedHTMLProps, HTMLHeadingElement>) { + return ( +

+ {props.children} +

+ ); +} diff --git a/components/layout/H2.tsx b/components/layout/H2.tsx new file mode 100644 index 0000000..26d2414 --- /dev/null +++ b/components/layout/H2.tsx @@ -0,0 +1,12 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function H2({ + ...props +}: DetailedHTMLProps, HTMLHeadingElement>) { + return ( +

+ {props.children} +

+ ); +} diff --git a/components/layout/H3.tsx b/components/layout/H3.tsx new file mode 100644 index 0000000..ab778e7 --- /dev/null +++ b/components/layout/H3.tsx @@ -0,0 +1,12 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function H3({ + ...props +}: DetailedHTMLProps, HTMLHeadingElement>) { + return ( +

+ {props.children} +

+ ); +} diff --git a/components/layout/H4.tsx b/components/layout/H4.tsx new file mode 100644 index 0000000..4783c7c --- /dev/null +++ b/components/layout/H4.tsx @@ -0,0 +1,12 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function H4({ + ...props +}: DetailedHTMLProps, HTMLHeadingElement>) { + return ( +

+ {props.children} +

+ ); +} diff --git a/components/layout/H5.tsx b/components/layout/H5.tsx new file mode 100644 index 0000000..3d6db10 --- /dev/null +++ b/components/layout/H5.tsx @@ -0,0 +1,12 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function H5({ + ...props +}: DetailedHTMLProps, HTMLHeadingElement>) { + return ( +
+ {props.children} +
+ ); +} diff --git a/components/layout/HR.tsx b/components/layout/HR.tsx new file mode 100644 index 0000000..47c59fb --- /dev/null +++ b/components/layout/HR.tsx @@ -0,0 +1,16 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function HR({ + ...props +}: DetailedHTMLProps, HTMLHRElement>) { + return ( +
+ ); +} diff --git a/components/layout/Header.tsx b/components/layout/Header.tsx new file mode 100644 index 0000000..a3bf9d0 --- /dev/null +++ b/components/layout/Header.tsx @@ -0,0 +1,25 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +/** + * # Default Header + * @className twui-header + */ +export default function Header({ + ...props +}: DetailedHTMLProps, HTMLElement>) { + return ( +
+ {props.children} +
+ ); +} diff --git a/components/layout/Link.tsx b/components/layout/Link.tsx new file mode 100644 index 0000000..c99a35b --- /dev/null +++ b/components/layout/Link.tsx @@ -0,0 +1,21 @@ +import { AnchorHTMLAttributes, DetailedHTMLProps } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function Link({ + ...props +}: DetailedHTMLProps< + AnchorHTMLAttributes, + HTMLAnchorElement +>) { + return ( + + {props.children} + + ); +} diff --git a/components/layout/Main.tsx b/components/layout/Main.tsx new file mode 100644 index 0000000..7495c30 --- /dev/null +++ b/components/layout/Main.tsx @@ -0,0 +1,18 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function Main({ + ...props +}: DetailedHTMLProps, HTMLElement>) { + return ( +
+ {props.children} +
+ ); +} diff --git a/components/layout/P.tsx b/components/layout/P.tsx new file mode 100644 index 0000000..6fefdc9 --- /dev/null +++ b/components/layout/P.tsx @@ -0,0 +1,12 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function P({ + ...props +}: DetailedHTMLProps, HTMLHeadingElement>) { + return ( +

+ {props.children} +

+ ); +} diff --git a/components/layout/Row.tsx b/components/layout/Row.tsx new file mode 100644 index 0000000..88951ba --- /dev/null +++ b/components/layout/Row.tsx @@ -0,0 +1,18 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function Row({ + ...props +}: DetailedHTMLProps, HTMLDivElement>) { + return ( +
+ {props.children} +
+ ); +} diff --git a/components/layout/Section.tsx b/components/layout/Section.tsx new file mode 100644 index 0000000..6259c56 --- /dev/null +++ b/components/layout/Section.tsx @@ -0,0 +1,19 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function Section({ + ...props +}: DetailedHTMLProps, HTMLElement>) { + return ( +
+ {props.children} +
+ ); +} diff --git a/components/layout/Span.tsx b/components/layout/Span.tsx new file mode 100644 index 0000000..ae715e8 --- /dev/null +++ b/components/layout/Span.tsx @@ -0,0 +1,12 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function Span({ + ...props +}: DetailedHTMLProps, HTMLHeadingElement>) { + return ( + + {props.children} + + ); +} diff --git a/components/layout/Stack.tsx b/components/layout/Stack.tsx new file mode 100644 index 0000000..44832c9 --- /dev/null +++ b/components/layout/Stack.tsx @@ -0,0 +1,15 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import { twMerge } from "tailwind-merge"; + +export default function Stack({ + ...props +}: DetailedHTMLProps, HTMLDivElement>) { + return ( +
+ {props.children} +
+ ); +} diff --git a/next.config.mjs b/next.config.mjs new file mode 100644 index 0000000..d5456a1 --- /dev/null +++ b/next.config.mjs @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, +}; + +export default nextConfig; diff --git a/package.json b/package.json new file mode 100644 index 0000000..4587cf7 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "tailwind-ui-library", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev -p 3270", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "tailwind-merge": "^2.5.4", + "postcss": "^8", + "tailwindcss": "^3.4.14" + }, + "devDependencies": { + "next": "14.2.15", + "react": "^18", + "react-dom": "^18", + "typescript": "^5", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18" + }, + "exports": { + ".": "./components" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..1a69fd2 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/styles/globals.css b/styles/globals.css new file mode 100644 index 0000000..97fde7c --- /dev/null +++ b/styles/globals.css @@ -0,0 +1,29 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --background: #ffffff; + --foreground: #171717; + --color-link: #233599; +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + --color-link: #233599; + } +} + +body { + color: var(--foreground); + background: var(--background); + font-family: Arial, Helvetica, sans-serif; +} + +@layer utilities { + .text-balance { + text-wrap: balance; + } +} diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..caafc4b --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,20 @@ +import type { Config } from "tailwindcss"; + +const config: Config = { + content: [ + "./pages/**/*.{js,ts,jsx,tsx,mdx}", + "./components/**/*.{js,ts,jsx,tsx,mdx}", + "./app/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + colors: { + background: "var(--background)", + foreground: "var(--foreground)", + link: "var(--link)", + }, + }, + }, + plugins: [], +}; +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..649790e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +}