diff --git a/.commitlintrc.json b/.commitlintrc.json deleted file mode 100644 index c30e5a9..0000000 --- a/.commitlintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["@commitlint/config-conventional"] -} diff --git a/.depcheckrc b/.depcheckrc deleted file mode 100644 index aeca52f..0000000 --- a/.depcheckrc +++ /dev/null @@ -1,2 +0,0 @@ -ignores: ["@types/node", "@types/react-dom", "autoprefixer", "postcss", "@commitlint/config-conventional", "prettier", "@t3-oss/env-nextjs"] -skip-missing: false diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index ae10a5c..0000000 --- a/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -# editorconfig.org -root = true - -[*] -charset = utf-8 -end_of_line = lf -indent_size = 2 -indent_style = space -insert_final_newline = true -trim_trailing_whitespace = true diff --git a/.env.example b/.env.example deleted file mode 100644 index 76bd9ee..0000000 --- a/.env.example +++ /dev/null @@ -1,4 +0,0 @@ -# ----------------------------------------------------------------------------- -# App -# ----------------------------------------------------------------------------- -NEXT_PUBLIC_APP_URL=http://localhost:3000 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..3897265 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,13 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example + +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..ebc1958 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,30 @@ +module.exports = { + root: true, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:svelte/recommended', + 'prettier' + ], + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint'], + parserOptions: { + sourceType: 'module', + ecmaVersion: 2020, + extraFileExtensions: ['.svelte'] + }, + env: { + browser: true, + es2017: true, + node: true + }, + overrides: [ + { + files: ['*.svelte'], + parser: 'svelte-eslint-parser', + parserOptions: { + parser: '@typescript-eslint/parser' + } + } + ] +}; diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index bffb357..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "next/core-web-vitals" -} diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1323e41..ac85d1a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,14 +1,8 @@ version: 2 updates: - - package-ecosystem: "npm" - directory: "/" - schedule: - interval: "daily" - reviewers: - - "bartvdbraak" - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" reviewers: - - "bartvdbraak" + - "bartvdbraak" \ No newline at end of file diff --git a/renovate.json b/.github/renovate.json similarity index 97% rename from renovate.json rename to .github/renovate.json index 4bd832f..92e884a 100644 --- a/renovate.json +++ b/.github/renovate.json @@ -1,4 +1,4 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": ["config:base"] -} +} \ No newline at end of file diff --git a/.github/workflows/lint-deps-check.yaml b/.github/workflows/lint-deps-check.yaml deleted file mode 100644 index 6dbe02e..0000000 --- a/.github/workflows/lint-deps-check.yaml +++ /dev/null @@ -1,47 +0,0 @@ -name: Linting and Dependency Check - -on: - push: - branches: - - main - pull_request: - branches: - - main - -permissions: - checks: write - contents: write - -jobs: - run-checks: - name: Run checks - runs-on: ubuntu-latest - strategy: - matrix: - node-version: [18, 20] - steps: - - name: Checkout Git repository - uses: actions/checkout@v3.5.3 - - - name: Setup pnpm - uses: pnpm/action-setup@v2.2.4 - with: - version: 8.6.2 - - - name: Setup Node.js - uses: actions/setup-node@v3.7.0 - with: - node-version: ${{ matrix.node-version }} - cache: pnpm - - - name: Install Node.js dependencies - run: pnpm install --frozen-lockfile - - - name: Run linters - uses: wearerequired/lint-action@v2.3.0 - with: - eslint: true - prettier: true - - - name: Run dependency check - run: npx depcheck diff --git a/.gitignore b/.gitignore index 8f322f0..6635cf5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,35 +1,10 @@ -# 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 +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/.husky/commit-msg b/.husky/commit-msg deleted file mode 100755 index b567676..0000000 --- a/.husky/commit-msg +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - -npx --no -- commitlint --edit "$1" diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index d3a2990..0000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" -npx pretty-quick --staged diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..0c05da4 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +engine-strict=true +resolution-mode=highest diff --git a/.prettierignore b/.prettierignore index 0403f23..3897265 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,8 +1,13 @@ -cache -.cache -package.json -pnpm-lock.yaml -public +.DS_Store node_modules -.next -.github +/build +/.svelte-kit +/package +.env +.env.* +!.env.example + +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..a77fdde --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], + "pluginSearchDirs": ["."], + "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] +} diff --git a/LICENSE b/LICENSE index f288702..7a8102f 100644 --- a/LICENSE +++ b/LICENSE @@ -631,8 +631,8 @@ to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - - Copyright (C) + hellob.art -- a simple portfolio journey created using svelte + Copyright (C) 2023 Bart van der Braak This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - Copyright (C) + hellob.art Copyright (C) 2023 Bart van der Braak This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. +. \ No newline at end of file diff --git a/README.md b/README.md index 85e7f23..f1a9201 100644 --- a/README.md +++ b/README.md @@ -28,18 +28,6 @@ To install the project and its dependencies, follow these steps: pnpm install ``` -### Environment Variables - -After setting up the required services, you need to set the corresponding environment variables in the `/.env` file. To do this, follow these steps: - -1. Make a copy of the `.env.example` file: - - ```sh-session - cp .env.example .env - ``` - -2. Open the `.env` file in a text editor and populate the values for the services mentioned above. - ## Build To build the project, execute the following command: @@ -54,4 +42,35 @@ To run the project locally, use the following command: ```sh-session pnpm run dev +# or +pnpm run dev -- --open ``` + +## Technologies Used + +- **Svelte:** The framework used for building this portfolio project. +- **SvelteKit:** The tooling and routing framework for Svelte projects. +- **Tailwind CSS:** A utility-first CSS framework packed with classes. +- **Skeleton:** UI Toolkit for Svelte + Tailwind. + +## Deployment + +The portfolio is hosted using [Vercel](https://vercel.com). You can access it at [https://hellob.art](https://hellob.art). + +## Contributing + +I'm open to contributions! If you find any bugs, have suggestions, or want to add something interesting, feel free to open an issue or submit a pull request. + +## License + +This project is licensed under the GPLv3 License. Feel free to explore, learn, and have fun! + +## Get in Touch + +Let's connect! You can find me on: + +- Website: [hellob.art](https://hellob.art) +- GitHub: [github.com/bartvdbraak](https://github.com/bartvdbraak) +- Email: bart@vanderbraak.nl + +Looking forward to hearing from you! 😊 \ No newline at end of file diff --git a/app/(index)/layout.tsx b/app/(index)/layout.tsx deleted file mode 100644 index 3968f6c..0000000 --- a/app/(index)/layout.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import Link from "next/link"; - -import { cn } from "@/lib/utils"; -import { buttonVariants } from "@/components/ui/button"; - -interface MarketingLayoutProps { - children: React.ReactNode; -} - -export default async function MarketingLayout({ - children, -}: MarketingLayoutProps) { - return ( -
-
-
- -
-
-
{children}
-
- ); -} diff --git a/app/(index)/page.tsx b/app/(index)/page.tsx deleted file mode 100644 index bdf1a1d..0000000 --- a/app/(index)/page.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import Link from "next/link"; - -import { siteConfig } from "@/config/site"; -import { cn } from "@/lib/utils"; -import { buttonVariants } from "@/components/ui/button"; - -export default function IndexPage() { - return ( - <> -
-
- - View my LinkedIn profile - -

- hellob.art -

-

- In progress build of my portfolio using Next.js 13 server - components. -

-
- - Get Started - - - GitHub - -
-
-
- - ); -} diff --git a/app/layout.tsx b/app/layout.tsx deleted file mode 100644 index 5819a7f..0000000 --- a/app/layout.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import { Inter as FontSans } from "next/font/google"; -import localFont from "next/font/local"; - -import "@/styles/globals.css"; -import { siteConfig } from "@/config/site"; -import { cn } from "@/lib/utils"; -import { Analytics } from "@vercel/analytics/react"; -import { TailwindIndicator } from "@/components/tailwind-indicator"; -import { ThemeProvider } from "@/components/theme-provider"; - -export const metadata = { - title: { - default: siteConfig.name, - template: `%s | ${siteConfig.name}`, - }, - metadataBase: new URL(`https://${siteConfig.url}}`), - description: siteConfig.description, - keywords: [ - "Portfolio", - "Next.js", - "React", - "Azure", - "Kubernetes", - "DevOps", - "Python", - ], - authors: [ - { - name: "Bart van der Braak", - url: siteConfig.url, - }, - ], - creator: "bartvdbraak", - themeColor: [ - { media: "(prefers-color-scheme: light)", color: "white" }, - { media: "(prefers-color-scheme: dark)", color: "black" }, - ], - openGraph: { - type: "website", - locale: "en_US", - url: siteConfig.url, - title: siteConfig.name, - description: siteConfig.description, - siteName: siteConfig.name, - }, - twitter: { - card: "summary_large_image", - title: siteConfig.name, - description: siteConfig.description, - images: [`${siteConfig.url}/og.jpg`], - creator: "@bartvdbraak", - }, - icons: { - icon: "/favicon.ico", - shortcut: "/favicon-16x16.png", - apple: "/apple-touch-icon.png", - }, - manifest: `${siteConfig.url}/site.webmanifest`, -}; - -interface RootLayoutProps { - children: React.ReactNode; -} - -const fontSans = FontSans({ - subsets: ["latin"], - variable: "--font-sans", -}); - -const fontHeading = localFont({ - src: "../assets/fonts/CalSans-SemiBold.woff2", - variable: "--font-heading", -}); - -interface RootLayoutProps { - children: React.ReactNode; -} - -export default function RootLayout({ children }: RootLayoutProps) { - return ( - - - - - {children} - - - - - - ); -} diff --git a/assets/fonts/CalSans-SemiBold.ttf b/assets/fonts/CalSans-SemiBold.ttf deleted file mode 100644 index 4a2950a..0000000 Binary files a/assets/fonts/CalSans-SemiBold.ttf and /dev/null differ diff --git a/assets/fonts/CalSans-SemiBold.woff b/assets/fonts/CalSans-SemiBold.woff deleted file mode 100644 index da45991..0000000 Binary files a/assets/fonts/CalSans-SemiBold.woff and /dev/null differ diff --git a/assets/fonts/CalSans-SemiBold.woff2 b/assets/fonts/CalSans-SemiBold.woff2 deleted file mode 100644 index 36d71b7..0000000 Binary files a/assets/fonts/CalSans-SemiBold.woff2 and /dev/null differ diff --git a/assets/fonts/Inter-Bold.ttf b/assets/fonts/Inter-Bold.ttf deleted file mode 100644 index 8e82c70..0000000 Binary files a/assets/fonts/Inter-Bold.ttf and /dev/null differ diff --git a/assets/fonts/Inter-Regular.ttf b/assets/fonts/Inter-Regular.ttf deleted file mode 100644 index 8d4eebf..0000000 Binary files a/assets/fonts/Inter-Regular.ttf and /dev/null differ diff --git a/components/tailwind-indicator.tsx b/components/tailwind-indicator.tsx deleted file mode 100644 index 5d2e150..0000000 --- a/components/tailwind-indicator.tsx +++ /dev/null @@ -1,25 +0,0 @@ -export function TailwindIndicator() { - if (process.env.NODE_ENV === "production") return null; - - const breakpoints = [ - { name: "xs", css: "block sm:hidden" }, - { - name: "sm", - css: "hidden sm:block md:hidden lg:hidden xl:hidden 2xl:hidden", - }, - { name: "md", css: "hidden md:block lg:hidden xl:hidden 2xl:hidden" }, - { name: "lg", css: "hidden lg:block xl:hidden 2xl:hidden" }, - { name: "xl", css: "hidden xl:block 2xl:hidden" }, - { name: "2xl", css: "hidden 2xl:block" }, - ]; - - return ( -
- {breakpoints.map((breakpoint) => ( -
- {breakpoint.name} -
- ))} -
- ); -} diff --git a/components/theme-provider.tsx b/components/theme-provider.tsx deleted file mode 100644 index b4e8e4f..0000000 --- a/components/theme-provider.tsx +++ /dev/null @@ -1,9 +0,0 @@ -"use client"; - -import * as React from "react"; -import { ThemeProvider as NextThemesProvider } from "next-themes"; -import { ThemeProviderProps } from "next-themes/dist/types"; - -export function ThemeProvider({ children, ...props }: ThemeProviderProps) { - return {children}; -} diff --git a/components/ui/button.tsx b/components/ui/button.tsx deleted file mode 100644 index 0ec0799..0000000 --- a/components/ui/button.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import * as React from "react"; -import { VariantProps, cva } from "class-variance-authority"; - -import { cn } from "@/lib/utils"; - -const buttonVariants = cva( - "inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background", - { - variants: { - variant: { - default: "bg-primary text-primary-foreground hover:bg-primary/90", - destructive: - "bg-destructive text-destructive-foreground hover:bg-destructive/90", - outline: - "border border-input hover:bg-accent hover:text-accent-foreground", - secondary: - "bg-secondary text-secondary-foreground hover:bg-secondary/80", - ghost: "hover:bg-accent hover:text-accent-foreground", - link: "underline-offset-4 hover:underline text-primary", - }, - size: { - default: "h-10 py-2 px-4", - sm: "h-9 px-3 rounded-md", - lg: "h-11 px-8 rounded-md", - }, - }, - defaultVariants: { - variant: "default", - size: "default", - }, - } -); - -export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps {} - -const Button = React.forwardRef( - ({ className, variant, size, ...props }, ref) => { - return ( - + Logo + hellob.art + + + + + + + + \ No newline at end of file diff --git a/src/lib/components/Navigation.svelte b/src/lib/components/Navigation.svelte new file mode 100644 index 0000000..cfb5101 --- /dev/null +++ b/src/lib/components/Navigation.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/lib/components/ProjectCard.svelte b/src/lib/components/ProjectCard.svelte new file mode 100644 index 0000000..25ab25b --- /dev/null +++ b/src/lib/components/ProjectCard.svelte @@ -0,0 +1,41 @@ + + + +
+ Post +
+
+
{headerSubTitle}
+

{title}

+
+

+ {description} +

+
+
+
+
+ +
+ {#each contributors as contributor} + + {/each} + + {new Date(date).toLocaleDateString()} +
+
+
diff --git a/src/lib/components/Tools.svelte b/src/lib/components/Tools.svelte new file mode 100644 index 0000000..00b6068 --- /dev/null +++ b/src/lib/components/Tools.svelte @@ -0,0 +1,105 @@ + + + + +
diff --git a/src/lib/components/gltf/Github3d.svelte b/src/lib/components/gltf/Github3d.svelte new file mode 100644 index 0000000..5e2c117 --- /dev/null +++ b/src/lib/components/gltf/Github3d.svelte @@ -0,0 +1,29 @@ + + + + + + {#await gltf} + + {:then gltf} + + {:catch error} + + {/await} + + + diff --git a/src/lib/components/icons/GitHub.svelte b/src/lib/components/icons/GitHub.svelte new file mode 100644 index 0000000..198cf1e --- /dev/null +++ b/src/lib/components/icons/GitHub.svelte @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/lib/components/icons/Hamburger.svelte b/src/lib/components/icons/Hamburger.svelte new file mode 100644 index 0000000..7bafeae --- /dev/null +++ b/src/lib/components/icons/Hamburger.svelte @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/lib/components/icons/Svelte.svelte b/src/lib/components/icons/Svelte.svelte new file mode 100644 index 0000000..fe94d1f --- /dev/null +++ b/src/lib/components/icons/Svelte.svelte @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/lib/components/icons/Vercel.svelte b/src/lib/components/icons/Vercel.svelte new file mode 100644 index 0000000..dea3fcb --- /dev/null +++ b/src/lib/components/icons/Vercel.svelte @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/lib/extrude-svg.ts b/src/lib/extrude-svg.ts new file mode 100644 index 0000000..48b097c --- /dev/null +++ b/src/lib/extrude-svg.ts @@ -0,0 +1,45 @@ +import type * as THREE from 'three'; +import { SVGLoader } from 'three/examples/jsm/loaders/SVGLoader'; +import type { SVGResult, SVGResultPaths } from 'three/examples/jsm/loaders/SVGLoader'; + +import { Mesh } from 'three/src/objects/Mesh'; +import { Group } from 'three/src/objects/Group'; +import { MeshNormalMaterial } from 'three/src/materials/MeshNormalMaterial'; +import { ExtrudeGeometry } from 'three/src/geometries/ExtrudeGeometry'; + +/** + * Parses the provided SVG markup and extrudes it into a 3D model using THREE.js. + * @param svgMarkup - SVG markup to extrude. + * @return Group containing all of the extruded SVG paths. + * @throws Error If the SVG markup is empty. + */ +export function extrudeSvg(svgMarkup: string): Group { + if (!svgMarkup) { + throw new Error('SVG markup is empty'); + } + + const svgData: SVGResult = new SVGLoader().parse(svgMarkup); + const material: MeshNormalMaterial = new MeshNormalMaterial(); + + const svgGroup: Mesh[][] = svgData.paths.map(createShapeFromPath); + + const group = new Group(); + svgGroup.flat().forEach(mesh => group.add(mesh)); + + return group; + + function createShapeFromPath(path: SVGResultPaths): Mesh[] { + const shapes: THREE.Shape[] = path.toShapes(true); + + return shapes.map(shape => extrudeShape(shape, material)); + } + + function extrudeShape(shape: THREE.Shape, material: MeshNormalMaterial): Mesh { + const geometry = new ExtrudeGeometry(shape, { + depth: 20, + bevelEnabled: false + }); + + return new Mesh(geometry, material); + } +} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..8f00eca --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,47 @@ + + + + + + + + +
+ + + + + +
+ +
+ + +