diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml new file mode 100644 index 0000000..512c263 --- /dev/null +++ b/.gitea/workflows/build.yaml @@ -0,0 +1,46 @@ +name: Build Full Stack +run-name: ${{ gitea.actor }} is building 🚀 +on: [push] + +jobs: + release-image: + runs-on: docker + container: + image: catthehacker/ubuntu:act-latest + env: + DOCKER_ORG: yaemiku + DOCKER_LATEST: latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker BuildX + uses: docker/setup-buildx-action@v3 + + - name: Login to Registry + uses: docker/login-action@v3 + with: + registry: git.yaemiku.dev + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Get Meta + id: meta + run: | + echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}') >> $GITHUB_OUTPUT + echo REPO_VERSION=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT + + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + file: ./Dockerfile + platforms: | + linux/amd64 + push: true + tags: | + git.yaemiku.dev/${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ steps.meta.outputs.REPO_VERSION }} + git.yaemiku.dev/${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ env.DOCKER_LATEST }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..5742fcc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,65 @@ +FROM node:alpine AS base + +# Install dependencies only when needed +FROM base AS deps +# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. +RUN apk add --no-cache libc6-compat +WORKDIR /app + +# Install dependencies based on the preferred package manager +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile; \ + else echo "Lockfile not found." && exit 1; \ + fi + + +# Rebuild the source code only when needed +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Next.js collects completely anonymous telemetry data about general usage. +# Learn more here: https://nextjs.org/telemetry +# Uncomment the following line in case you want to disable telemetry during the build. +# ENV NEXT_TELEMETRY_DISABLED 1 + +RUN yarn build + +# If using npm comment out above and use below instead +# RUN npm run build + +# Production image, copy all the files and run next +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV production +# Uncomment the following line in case you want to disable telemetry during runtime. +# ENV NEXT_TELEMETRY_DISABLED 1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +# Set the correct permission for prerender cache +RUN mkdir .next +RUN chown nextjs:nodejs .next + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +ENV PORT 3000 +# set hostname to localhost +ENV HOSTNAME "0.0.0.0" + +CMD ["node", "server.js"] \ No newline at end of file diff --git a/app/cv/page.tsx b/app/cv/page.tsx new file mode 100644 index 0000000..576550c --- /dev/null +++ b/app/cv/page.tsx @@ -0,0 +1,175 @@ +import { Metadata, NextPage } from 'next'; +import Image from 'next/image'; + +export const metadata: Metadata = { + title: 'Curriculum Vitae', + description: '', +} + +const Page: NextPage = () => { + return ( +
+
+
+
+

Nikola Kubiczek

+

Full-stack developer

+
+ My Picture +
+
+
+

Contact

+
+

+ Email: me@yaemiku.dev +

+

+ Phone numer: +48 797407620 +

+

+ LinkedIn:{' '} + + linkedin.com/in/yaemiku + +

+

+ Website:{' '} + www.yaemiku.dev +

+
+
+
+

Education

+

+ Bachelor of Mathematics +
+ University of Warsaw, Faculty of Mathematics, Informatics and + Mechanics +
+ Since 10.2023, currently studying +

+
+
+

Skills / Technologies

+
+
    +
  • Analytical and creative thinking
  • +
  • Docker
  • +
  • Git
  • +
  • Proficiency in GNU/Linux
  • +
  • Django
  • +
  • TailwindCSS
  • +
  • NextJS
  • +
+
+
+
+

Interests

+

+ Knitting, crocheting, detailed makeup, listening to music, walking, + playing with linux and many more. As for the last one, I've been a poweruser + since 2020 and am self-hosting a few services - mainly media related ones. +

+
+
+
+

Summary

+

+ I am a student on my second year of studying mathematics. I have been + interested in IT since elementary school, when my father showed me how + to create a simple website. Throughout the years I have gained + practical experience regarding full-stack development with projects + listed below. Nearing the end of high school I have made a decision to + pursue mathematics, which has been my passion for a long time, + realizing it will be more beneficial to my career taking into + consideration my experience in IT. While not having a strictly + computer science based education, I am a quick learner, I can + fundamentally grasp complex ideas rather quickly, adapt to new + environments, analyse edge cases and implement previously known ideas + under new circumstances. +

+
+

Experience

+

+ Throughout the years I have completed a few projects, some of them listed below: +

+
+
+

+ ikubi_pracownia:{' '} + https://ikubi.pl +

+ My first project. A portfolio website for my mother +
+ Technologies used: Docker, Django, 11ty, BulmaCSS +
+
+

+ Puchar LO V w Bielsku-Białej:{' '} + + https://puchar.lo5.bielsko.pl + +

+ A website for a mathematical contest organized by my high school +
+ Technologies used: Django, BulmaCSS +
+
+

+ eParafia:{' '} + https://eparafia.eu +

+ A website which main functionality is to allow local churches to + have opt-in pastoral visits by submitting a form online +
+ Technologies used: NextJS, TailwindCSS, PocketBase +
+
+

+ Podlaski Związek Brydża Sportowego:{' '} + https://podlzbs.pl +

+ A website for Podlaskie Voivodeship's bridge association +
+ Technologies used: Docker, Django, TailwindCSS +
+
+

+ TechTIR App (only an article in polish is available:{' '} + + https://techtir.pl/relacja-i-podsumowanie-kongresu-sdcm/ + + ) +

+ A website which was crucial for TechTIR's presentation during + an automotive congress. It operated as a quiz for the participants + to revise their knowledge after the talk (think kahoot.it) +
+ Technologies used: Docker, Django, TailwindCSS +
+ {/*
+

+ Kod Pamięci:{' '} + https://kod-pamieci.pl +

+ A website I am currently working on, it allows users to generate + unique QR codes designed to be put on gravestones in order to + preserve memories of their loved ones +
+ Technologies used: Docker, Django, TailwindCSS +
*/} +
+
+
+ ); +}; + +export default Page; diff --git a/app/globals.css b/app/globals.css index 6b717ad..0d11ab5 100644 --- a/app/globals.css +++ b/app/globals.css @@ -2,20 +2,6 @@ @tailwind components; @tailwind utilities; -:root { - --background: #ffffff; - --foreground: #171717; -} - -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } -} - -body { - color: var(--foreground); - background: var(--background); - font-family: Arial, Helvetica, sans-serif; +ul { + @apply flex flex-row gap-x-4 flex-wrap list-inside items-center justify-center } diff --git a/app/layout.tsx b/app/layout.tsx index f7fa87e..9df920b 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,20 +1,10 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; - -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); +import type { Metadata } from 'next'; +import { Geist, Geist_Mono } from 'next/font/google'; +import './globals.css'; export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: 'Nikola Kubiczek', + description: 'Personal website', }; export default function RootLayout({ @@ -24,11 +14,7 @@ export default function RootLayout({ }>) { return ( - - {children} - + {children} ); } diff --git a/app/page.tsx b/app/page.tsx index 9007252..c659d15 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,100 +1,173 @@ -import Image from "next/image"; +'use client'; + +import Image from 'next/image'; +import useSWR, { Fetcher } from 'swr'; + +type ListenBrainz = { + payload: { + listens: { + track_metadata: { + track_name: string; + artist_name: string; + release_name: string; + }; + }[]; + }; +}; + +const fetcher: Fetcher = (...args) => + fetch(...args).then((res) => res.json()); export default function Home() { - return ( -
-
- Next.js logo -
    -
  1. - Get started by editing{" "} - - app/page.tsx - - . -
  2. -
  3. Save and see your changes instantly.
  4. -
+ const { data, isLoading } = useSWR( + 'https://api.listenbrainz.org/1/user/yaemiku/listens?count=1', + fetcher + ); -
- - Vercel logomark - Deploy now - - - Read our docs - + return ( +
+
+ My Picture +

Nikola Kubiczek

+ {isLoading ? ( + <> + ) : ( + + Last song I have listened to:
+ {data?.payload.listens[0].track_metadata.track_name} +
- {data?.payload.listens[0].track_metadata.artist_name}
+
+ )} +
+
+
+

About me

+

+ Currently studying pure mathematics at the University of Warsaw and + doing commissions on the side. I had been considering studying + computer science but decided not to - mathematics is the love of my + life and an absolute passion. +

+

+ In my free time I love listening to music - be it on headphones, + speakers or by going to a local concert. I'm very into various + brews, almost anything apart from alcohol could be my cup of tea. + Green and white teas, matcha, yerba mate, etc. You name it. I quite + like to knit/crochet, but find myself always not having enough time. + I also tinker with my servers a lot - I have a few services set up + and I love to play with configuring them or adding new ones. +

+

+ I think self-expression and emotional maturity are really important. + I live to love. To experience life with the ones I love. +

+
+
+

Contact

+ +
+ Feel free to message me. Here are a few links, that might prove + useful sometimes + + And if you'd want to send me any crypto +
    +
  • cosmos1gy6tg8jaf4qwmpug8jp8kqnyy9en3lmjxq0twf
  • +
  • 46MiubQK8psbDWys429WvTQ71DyDiLkKmSLznoDYYFQbA6MfTvuVRJzSAbCCA17n8RGjCojx5GcpKH3q1DbpKJaQPCVcabi
  • +
+
-
- - File icon - Learn - - - Window icon - Examples - - - Globe icon - Go to nextjs.org → - +
+
+ + + Nikola Kubiczek © 2024 + +
+ + + Made with{' '} + + NextJS + + , and{' '} + + TailwindCSS + {' '} + +
+
+ Oh, wretched memory that compels us to remember the paths we took to + arrive at the present state of affairs! Further: as I lay awake but + still half dreaming, I felt that my body was not homogeneous, that + some parts were still those of a boy, and that my head was laughing + at my leg and ridiculing it, that my leg was laughing at my head, + that my finger was poking fun at my heart, my heart at my brain, + that my nose was thumbing itself at my eye, my eye chuckling and + bellowing at my nose — and all my parts were wildly raping each + other in an all-encompassing and piercing state of pan-mockery. Nor + did my fear lessen one iota when I reached full consciousness and + began reflecting on my life. On the contrary, it intensified even as + it was interrupted (or accentuated) by a giggle my mouth could not + hold back. I was halfway down the path of my life when I found + myself in a dark forest. +
+
——— Witold Gombrowicz, Ferdydurke
+
); diff --git a/app/public.asc/route.ts b/app/public.asc/route.ts new file mode 100644 index 0000000..625c284 --- /dev/null +++ b/app/public.asc/route.ts @@ -0,0 +1,167 @@ +import { NextRequest, NextResponse } from "next/server"; + +export async function GET(_request: NextRequest) { + const pk = `-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +826qgOE= +=PoyA +-----END PGP PUBLIC KEY BLOCK-----` + return new NextResponse(pk, { + headers: { + 'Content-Type': 'text/plain; charset=utf-8' + } + }); +} + diff --git a/deployment.yaml b/deployment.yaml new file mode 100644 index 0000000..ffa48a2 --- /dev/null +++ b/deployment.yaml @@ -0,0 +1,71 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: hamburger +spec: + selector: + matchLabels: + app: hamburger + replicas: 1 + template: + metadata: + labels: + app: hamburger + spec: + containers: + - name: hamburger + image: registry.yaemiku.dev/yaemiku/hamburger + ports: + - name: app-port + containerPort: 3000 + resources: + requests: + memory: "64Mi" + cpu: "250m" + limits: + memory: "128Mi" + cpu: "500m" + imagePullSecrets: + - name: regcred + +--- +apiVersion: v1 +kind: Service +metadata: + name: hamburger +spec: + ports: + - name: app-svc-port + port: 80 + targetPort: app-port + selector: + app: hamburger + +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: hamburger +spec: + ingressClassName: traefik + rules: + - host: yaemiku.dev + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: hamburger + port: + number: 80 + - host: www.yaemiku.dev + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: hamburger + port: + number: 80 \ No newline at end of file diff --git a/package.json b/package.json index 188b280..20b9597 100644 --- a/package.json +++ b/package.json @@ -9,19 +9,21 @@ "lint": "next lint" }, "dependencies": { + "next": "15.1.2", "react": "^19.0.0", - "react-dom": "^19.0.0", - "next": "15.1.2" + "react-dom": "^19.0.0" }, "devDependencies": { - "typescript": "^5", + "@eslint/eslintrc": "^3", + "@tailwindcss/typography": "^0.5.15", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", - "postcss": "^8", - "tailwindcss": "^3.4.1", "eslint": "^9", "eslint-config-next": "15.1.2", - "@eslint/eslintrc": "^3" + "postcss": "^8", + "swr": "^2.2.5", + "tailwindcss": "^3.4.1", + "typescript": "^5" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7c45c49..1483b53 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,6 +21,9 @@ importers: '@eslint/eslintrc': specifier: ^3 version: 3.2.0 + '@tailwindcss/typography': + specifier: ^0.5.15 + version: 0.5.15(tailwindcss@3.4.17) '@types/node': specifier: ^20 version: 20.17.10 @@ -39,6 +42,9 @@ importers: postcss: specifier: ^8 version: 8.4.49 + swr: + specifier: ^2.2.5 + version: 2.2.5(react@19.0.0) tailwindcss: specifier: ^3.4.1 version: 3.4.17 @@ -322,6 +328,11 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@tailwindcss/typography@0.5.15': + resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -1116,6 +1127,12 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -1310,6 +1327,10 @@ packages: peerDependencies: postcss: ^8.2.14 + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + postcss-selector-parser@6.1.2: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} @@ -1536,6 +1557,11 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + swr@2.2.5: + resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 + tailwindcss@3.4.17: resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} @@ -1606,6 +1632,11 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -1872,6 +1903,14 @@ snapshots: dependencies: tslib: 2.8.1 + '@tailwindcss/typography@0.5.15(tailwindcss@3.4.17)': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.17 + '@types/estree@1.0.6': {} '@types/json-schema@7.0.15': {} @@ -2873,6 +2912,10 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.castarray@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + lodash.merge@4.6.2: {} loose-envify@1.4.0: @@ -3052,6 +3095,11 @@ snapshots: postcss: 8.4.49 postcss-selector-parser: 6.1.2 + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 @@ -3345,6 +3393,12 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + swr@2.2.5(react@19.0.0): + dependencies: + client-only: 0.0.1 + react: 19.0.0 + use-sync-external-store: 1.4.0(react@19.0.0) + tailwindcss@3.4.17: dependencies: '@alloc/quick-lru': 5.2.0 @@ -3453,6 +3507,10 @@ snapshots: dependencies: punycode: 2.3.1 + use-sync-external-store@1.4.0(react@19.0.0): + dependencies: + react: 19.0.0 + util-deprecate@1.0.2: {} which-boxed-primitive@1.1.1: diff --git a/public/file.svg b/public/file.svg deleted file mode 100644 index 004145c..0000000 --- a/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg deleted file mode 100644 index 567f17b..0000000 --- a/public/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/pattern.png b/public/pattern.png new file mode 100644 index 0000000..ed6e0a2 Binary files /dev/null and b/public/pattern.png differ diff --git a/public/pfp_fb_cropped.jpg b/public/pfp_fb_cropped.jpg new file mode 100644 index 0000000..4da92d5 Binary files /dev/null and b/public/pfp_fb_cropped.jpg differ diff --git a/public/pfp_formal_comp.jpg b/public/pfp_formal_comp.jpg new file mode 100644 index 0000000..a7914a0 Binary files /dev/null and b/public/pfp_formal_comp.jpg differ diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/window.svg b/public/window.svg deleted file mode 100644 index b2b2a44..0000000 --- a/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tailwind.config.ts b/tailwind.config.ts index 1362b88..ae592cf 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -14,5 +14,5 @@ export default { }, }, }, - plugins: [], + plugins: [require('@tailwindcss/typography')], } satisfies Config;