From db475795360b387eb1d0efc5581a7c69a34b6e0b Mon Sep 17 00:00:00 2001 From: Vojtech Mares Date: Sat, 7 Oct 2023 11:21:17 +0200 Subject: [PATCH] feat: add og app (boilerplate) --- apps/og/.eslintrc.js | 8 ++++ apps/og/README.md | 7 ++++ apps/og/app/layout.tsx | 18 +++++++++ apps/og/app/page.tsx | 21 +++++++++++ apps/og/app/tailwind.css | 3 ++ apps/og/next-env.d.ts | 5 +++ apps/og/next.config.js | 8 ++++ apps/og/package.json | 36 ++++++++++++++++++ apps/og/postcss.config.js | 6 +++ apps/og/prettier.config.cjs | 4 ++ apps/og/public/favicon.ico | Bin 0 -> 15086 bytes apps/og/tailwind.config.js | 10 +++++ apps/og/tsconfig.json | 19 ++++++++++ pnpm-lock.yaml | 71 +++++++++++++++++++++++++++++------- 14 files changed, 202 insertions(+), 14 deletions(-) create mode 100644 apps/og/.eslintrc.js create mode 100644 apps/og/README.md create mode 100644 apps/og/app/layout.tsx create mode 100644 apps/og/app/page.tsx create mode 100644 apps/og/app/tailwind.css create mode 100644 apps/og/next-env.d.ts create mode 100644 apps/og/next.config.js create mode 100644 apps/og/package.json create mode 100644 apps/og/postcss.config.js create mode 100644 apps/og/prettier.config.cjs create mode 100644 apps/og/public/favicon.ico create mode 100644 apps/og/tailwind.config.js create mode 100644 apps/og/tsconfig.json diff --git a/apps/og/.eslintrc.js b/apps/og/.eslintrc.js new file mode 100644 index 0000000..3cbadf9 --- /dev/null +++ b/apps/og/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + root: true, + extends: ["next", "prettier", "next/core-web-vitals"], + rules: { + "@next/next/no-html-link-for-pages": "off", + "react/jsx-key": "off", + }, +}; diff --git a/apps/og/README.md b/apps/og/README.md new file mode 100644 index 0000000..ae0a26f --- /dev/null +++ b/apps/og/README.md @@ -0,0 +1,7 @@ +# og + +[og.mareshq.com](https://og.mareshq.com) + +## Open Graph + +## Twitter card diff --git a/apps/og/app/layout.tsx b/apps/og/app/layout.tsx new file mode 100644 index 0000000..5f9491e --- /dev/null +++ b/apps/og/app/layout.tsx @@ -0,0 +1,18 @@ +import { Analytics } from '@vercel/analytics/react' + +import './tailwind.css' + +const RootLayout = ({ children }: { children: React.ReactNode }) => { + return ( + + + + + {children} + + + + ) +} + +export default RootLayout diff --git a/apps/og/app/page.tsx b/apps/og/app/page.tsx new file mode 100644 index 0000000..ab87bc8 --- /dev/null +++ b/apps/og/app/page.tsx @@ -0,0 +1,21 @@ +import Link from "next/link" + +const Page = () => { + return ( +
+

+ Hello 👋 +
+ You found my OG / Twitter card image generator. +

+

+ Interested in source code?{" "} + + [github.com/vojtechmares/websites/og] + +

+
+ ) +} + +export default Page diff --git a/apps/og/app/tailwind.css b/apps/og/app/tailwind.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/apps/og/app/tailwind.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/apps/og/next-env.d.ts b/apps/og/next-env.d.ts new file mode 100644 index 0000000..4f11a03 --- /dev/null +++ b/apps/og/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/apps/og/next.config.js b/apps/og/next.config.js new file mode 100644 index 0000000..db7c6b2 --- /dev/null +++ b/apps/og/next.config.js @@ -0,0 +1,8 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, + swcMinify: true, + pageExtensions: ["js", "jsx", "ts", "tsx",], +}; + +module.exports = nextConfig diff --git a/apps/og/package.json b/apps/og/package.json new file mode 100644 index 0000000..4083d3c --- /dev/null +++ b/apps/og/package.json @@ -0,0 +1,36 @@ +{ + "name": "og", + "version": "0.0.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@vercel/analytics": "^1.1.0", + "clsx": "^2.0.0", + "next": "13.5.4", + "react": "18.2.0", + "react-dom": "18.2.0" + }, + "devDependencies": { + "@types/node": "^20.8.3", + "@types/react": "^18.2.25", + "autoprefixer": "^10.4.16", + "eslint": "8.51.0", + "eslint-config-next": "13.5.4", + "eslint-config-prettier": "^9.0.0", + "postcss": "^8.4.31", + "prettier": "^3.0.3", + "prettier-plugin-tailwindcss": "^0.5.5", + "tailwindcss": "^3.3.3", + "tsconfig": "workspace:*", + "typescript": "^5.2.2" + }, + "engines": { + "node": "18.x" + }, + "packageManager": "pnpm@8.8.0" +} diff --git a/apps/og/postcss.config.js b/apps/og/postcss.config.js new file mode 100644 index 0000000..85f717c --- /dev/null +++ b/apps/og/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +} diff --git a/apps/og/prettier.config.cjs b/apps/og/prettier.config.cjs new file mode 100644 index 0000000..58b0aee --- /dev/null +++ b/apps/og/prettier.config.cjs @@ -0,0 +1,4 @@ +/** @type {import("prettier").Config} */ +module.exports = { + plugins: [require.resolve("prettier-plugin-tailwindcss")], +}; diff --git a/apps/og/public/favicon.ico b/apps/og/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..637997f54ff44b605def56e3e1b12968368a8107 GIT binary patch literal 15086 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 DTd1qJ literal 0 HcmV?d00001 diff --git a/apps/og/tailwind.config.js b/apps/og/tailwind.config.js new file mode 100644 index 0000000..858c168 --- /dev/null +++ b/apps/og/tailwind.config.js @@ -0,0 +1,10 @@ +module.exports = { + content: [ + './app/**/*.{ts,tsx}', + './pages/**/*.{ts,tsx}', + './components/**/*.{ts,tsx}', + ], + theme: { + extend: {} + } +} diff --git a/apps/og/tsconfig.json b/apps/og/tsconfig.json new file mode 100644 index 0000000..5fa7c46 --- /dev/null +++ b/apps/og/tsconfig.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "tsconfig/nextjs.json", + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": [ + "./*" + ] + }, + "strictNullChecks": true + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a43082..8e14cf9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,6 +27,61 @@ importers: specifier: ^1.10.12 version: 1.10.15 + apps/og: + dependencies: + '@vercel/analytics': + specifier: ^1.1.0 + version: 1.1.0 + clsx: + specifier: ^2.0.0 + version: 2.0.0 + next: + specifier: 13.5.4 + version: 13.5.4(@babel/core@7.23.0)(react-dom@18.2.0)(react@18.2.0) + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + devDependencies: + '@types/node': + specifier: ^20.8.3 + version: 20.8.3 + '@types/react': + specifier: ^18.2.25 + version: 18.2.25 + autoprefixer: + specifier: ^10.4.16 + version: 10.4.16(postcss@8.4.31) + eslint: + specifier: 8.51.0 + version: 8.51.0 + eslint-config-next: + specifier: 13.5.4 + version: 13.5.4(eslint@8.51.0)(typescript@5.2.2) + eslint-config-prettier: + specifier: ^9.0.0 + version: 9.0.0(eslint@8.51.0) + postcss: + specifier: ^8.4.31 + version: 8.4.31 + prettier: + specifier: ^3.0.3 + version: 3.0.3 + prettier-plugin-tailwindcss: + specifier: ^0.5.5 + version: 0.5.5(prettier@3.0.3) + tailwindcss: + specifier: ^3.3.3 + version: 3.3.3 + tsconfig: + specifier: workspace:* + version: link:../../packages/tsconfig + typescript: + specifier: ^5.2.2 + version: 5.2.2 + apps/vojtechmares.com: dependencies: '@mdx-js/loader': @@ -561,8 +616,8 @@ packages: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.19.0 - ignore: 5.2.0 + globals: 13.23.0 + ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -2579,13 +2634,6 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - /globals@13.19.0: - resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - /globals@13.23.0: resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} engines: {node: '>=8'} @@ -2729,11 +2777,6 @@ packages: safer-buffer: 2.1.2 dev: true - /ignore@5.2.0: - resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} - engines: {node: '>= 4'} - dev: true - /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'}