5 Commits

Author SHA1 Message Date
d8d8130eef 🐛 Fixes arrow link color 2026-01-17 16:19:13 +01:00
6be5249510 💄 Adds Mocha Catppuccin Tailwind theme 2026-01-17 16:11:50 +01:00
f79ee8ad41 🚧 Adds tailwindcss catppuccin 2026-01-16 19:45:59 +01:00
2159b41406 🐳 Adds dockerignore 2026-01-16 19:24:08 +01:00
6c1a205e22 🐛 Fixes fonts 2026-01-16 13:49:05 +01:00
10 changed files with 249 additions and 45 deletions

203
.dockerignore Normal file
View File

@@ -0,0 +1,203 @@
# ============================================================================
# Created by https://dockerignore.com/
# COMPREHENSIVE FRAMEWORK TEMPLATE for Nuxt
# Website: https://nuxt.com/
# Repository: https://github.com/nuxt/nuxt
# ============================================================================
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# TEMPLATE OVERVIEW & USAGE NOTES
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# • TEMPLATE TYPE: COMPREHENSIVE FRAMEWORK TEMPLATE
# • PURPOSE: Nuxt framework specific ignore patterns
# • DESIGN PHILOSOPHY: Self-contained with all necessary patterns including security
# • COMBINATION GUIDANCE: Use standalone - no need to combine with other templates
# • SECURITY CONSIDERATIONS: Includes security patterns for .env files and credentials
# • BEST PRACTICES: Review before use, test with your specific Nuxt setup
# • OFFICIAL SOURCES: Nuxt community patterns and best practices
# ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
# SECURITY & SENSITIVE DATA PROTECTION (ALWAYS FIRST!)
# ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
# CRITICAL: Prevent sensitive data from being included in Docker images
# ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
# ENVIRONMENT VARIABLES & CONFIGURATION FILES
# ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
# Environment files contain sensitive API keys, database credentials,
# and other secrets that must not be included in Docker images
.env
.env.*
.env.*.local
.env.development
.env.development.local
.env.example
.env.local
.env.production
.env.production.local
.env.sample
.env.staging
.env.staging.local
.env.template
.env.test
.env.test.local
# ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
# APPLICATION SECRETS & CREDENTIALS
# ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
# Application secrets, credentials, and sensitive configuration files
**/config/credentials.*
**/config/secrets.*
**/keys/
**/passwords/
**/private/
**/secrets/
*.auth
*.authz
*.password
*.secret
*.secrets
*.token
*_tokens
*password*
apikeys.*
appsettings.Development.json
appsettings.Local.json
appsettings.Staging.json
connectionstrings.config
credentials
database.ini
database.yml
dbconfig.xml
secrets.json
secrets.yaml
secrets.yml
tokens.*
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
# DEPENDENCIES AND PACKAGE MANAGERS
**/.npm/
**/.npm/_logs/
**/.pnpm-store/
**/.pnpm/
**/.yarn/
**/bower_components/
**/node_modules/
.npmignore
.npmrc
.npmrc.*
.yarn/install-state.gz
.yarnrc
.yarnrc.yml
npm-debug.log*
pnpm-debug.log*
yarn-error.log
# ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
# BUILD ARTIFACTS AND OUTPUT
**/.nuxt-build/
**/.nyc_output/
**/.out/
**/.output/
**/build/
**/dist/
**/public/build/
.tsbuildinfo
tsconfig.*.tsbuildinfo
# ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
# CACHE AND TEMPORARY FILES
**/.cache/
**/.parcel-cache/
**/.turbo/
**/temp/
**/tmp/
*.cache
*.temp
*.tmp
# ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
# LOGS AND DEBUG FILES
**/logs/
*.log
# ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
# CONFIGURATION AND ENVIRONMENT
.env.testing
jsconfig.json
vitest.config.*.timestamp-*
# ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
# TESTING AND COVERAGE
**/.jest-cache/
**/__tests__/__snapshots__/
**/coverage/
**/test-results/
# ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
# OTHER
**/.babel-cache/
**/.bzr/
**/.cvs/
**/.git/
**/.hg/
**/.nuxt
**/.nuxt-analyze/
**/.nuxt-components/
**/.nuxt-dev/
**/.nuxt-modules/
**/.nuxt-types/
**/.nuxt/
**/.nx/
**/.nx/cache/
**/.pnp/
**/.svn/
**/jest-cache/
*.bak
*.old
*.orig
*.save
*.swo
*.swp
*~
._*
.babelrc
.babelrc.*
.browserslistrc
.DS_Store
.DS_Store?
.eslintcache
.eslintignore
.eslintrc
.eslintrc.*
.gitattributes
.gitignore
.gitmodules
.jsbeautifyrc
.jscsrc
.jshintrc
.nuxtignore
.nuxtrc
.pnp.cjs
.pnp.js
.pnp.loader.mjs
.prettiercache
.prettierignore
.prettierrc
.prettierrc.*
.Spotlight-V100
.stylelintcache
.stylelintignore
.stylelintrc
.stylelintrc.*
.Trashes
desktop.ini
ehthumbs.db
npm-shrinkwrap.json
nuxt.config.*
pnpm-workspace.yaml
Thumbs.db

View File

@@ -1,26 +1,7 @@
@import "tailwindcss"; @import "tailwindcss";
@import "@nuxt/ui";
@import "@catppuccin/tailwindcss/mocha.css";
@font-face { @theme {
font-family: "JetBrains Mono"; --font-mono: "JetBrains Mono", monospace;
src: url(fonts/JetBrainsMono-Regular.ttf) format("truetype");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "JetBrains Mono";
src: url(fonts/JetBrainsMono-Bold.ttf) format("truetype");
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: "JetBrains Mono";
src: url(fonts/JetBrainsMono-Italic.ttf) format("truetype");
font-weight: normal;
font-style: italic;
}
html {
font-family: "JetBrains Mono", monospace;
} }

View File

@@ -1,16 +1,21 @@
<template> <template>
<NuxtLink :to="props.link" target="_blank"> <NuxtLink :to="props.link" target="_blank">
<img <svg
:src="props.icon ?? '/icons/arrow-up-right-from-square.svg'" xmlns="http://www.w3.org/2000/svg"
alt="Arrow going to the top right from the center of a square, representing a link" viewBox="0 0 512 512"
class="w-4 h-4" width="16"
/> height="16"
class="w-4 h-4 fill-ctp-text"
>
<path
d="M320 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l82.7 0L201.4 265.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L448 109.3l0 82.7c0 17.7 14.3 32 32 32s32-14.3 32-32l0-160c0-17.7-14.3-32-32-32L320 0zM80 32C35.8 32 0 67.8 0 112L0 432c0 44.2 35.8 80 80 80l320 0c44.2 0 80-35.8 80-80l0-112c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 112c0 8.8-7.2 16-16 16L80 448c-8.8 0-16-7.2-16-16l0-320c0-8.8 7.2-16 16-16l112 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L80 32z"
/>
</svg>
</NuxtLink> </NuxtLink>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
const props = defineProps<{ const props = defineProps<{
link: string; link: string;
icon?: string;
}>(); }>();
</script> </script>

View File

@@ -8,6 +8,7 @@ body {
margin: 0; margin: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
overflow-x: hidden;
} }
</style> </style>
@@ -24,5 +25,8 @@ useHead({
{ name: "description", content: "Daniel Svitan's portfolio" }, { name: "description", content: "Daniel Svitan's portfolio" },
{ name: "keywords", content: "Daniel Svitan portfolio CV" }, { name: "keywords", content: "Daniel Svitan portfolio CV" },
], ],
bodyAttrs: {
class: "mocha bg-ctp-base text-ctp-text",
},
}); });
</script> </script>

View File

@@ -1,9 +1,9 @@
<template> <template>
<div class="w-screen h-full flex items-center justify-start flex-col"> <div class="w-screen h-full flex items-center justify-start flex-col font-mono">
<div class="w-1 h-10 shrink-10" /> <div class="w-1 h-10 shrink-10" />
<div <div
class="w-[90vw] sm:w-[80vw] m:w-[70vw] lg:w-[60vw] xl:w-[50vw] border-solid border-black border-1 p-3 shrink-0 overflow-auto relative" class="w-[90vw] sm:w-[80vw] m:w-[70vw] lg:w-[60vw] xl:w-[50vw] border-solid border-ctp-text border-1 p-3 shrink-0 overflow-auto relative"
> >
<div class="absolute top-2 right-2 flex gap-x-2"> <div class="absolute top-2 right-2 flex gap-x-2">
<button <button
@@ -438,7 +438,7 @@ th {
tr, tr,
thead { thead {
border-bottom: 1px solid black; border-bottom: 1px solid var(--catppuccin-color-text);
} }
tr:last-of-type { tr:last-of-type {
@@ -447,8 +447,8 @@ tr:last-of-type {
.hashtag { .hashtag {
padding: 0 0.25rem; padding: 0 0.25rem;
background-color: #e8e8e8; border: 1px solid var(--catppuccin-color-text);
border-radius: 0.5rem; border-radius: 1rem;
} }
</style> </style>

View File

@@ -1,6 +1,5 @@
{ {
"lockfileVersion": 1, "lockfileVersion": 1,
"configVersion": 1,
"workspaces": { "workspaces": {
"": { "": {
"name": "svitan-dev-new", "name": "svitan-dev-new",
@@ -13,6 +12,9 @@
"vue": "^3.5.26", "vue": "^3.5.26",
"vue-router": "^4.6.4", "vue-router": "^4.6.4",
}, },
"devDependencies": {
"@catppuccin/tailwindcss": "^1.0.0",
},
}, },
}, },
"packages": { "packages": {
@@ -76,6 +78,8 @@
"@capsizecss/unpack": ["@capsizecss/unpack@3.0.1", "", { "dependencies": { "fontkit": "^2.0.2" } }, "sha512-8XqW8xGn++Eqqbz3e9wKuK7mxryeRjs4LOHLxbh2lwKeSbuNR4NFifDZT4KzvjU6HMOPbiNTsWpniK5EJfTWkg=="], "@capsizecss/unpack": ["@capsizecss/unpack@3.0.1", "", { "dependencies": { "fontkit": "^2.0.2" } }, "sha512-8XqW8xGn++Eqqbz3e9wKuK7mxryeRjs4LOHLxbh2lwKeSbuNR4NFifDZT4KzvjU6HMOPbiNTsWpniK5EJfTWkg=="],
"@catppuccin/tailwindcss": ["@catppuccin/tailwindcss@1.0.0", "", {}, "sha512-l8pOlcYe2ncGd8a1gUmL5AHmKlxR2+CHuG5kt4Me6IZwzntW1DoLmj89BH+DcsPHBsdDGLrTSv35emlYyU3FeQ=="],
"@clack/core": ["@clack/core@1.0.0-alpha.7", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-3vdh6Ar09D14rVxJZIm3VQJkU+ZOKKT5I5cC0cOVazy70CNyYYjiwRj9unwalhESndgxx6bGc/m6Hhs4EKF5XQ=="], "@clack/core": ["@clack/core@1.0.0-alpha.7", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-3vdh6Ar09D14rVxJZIm3VQJkU+ZOKKT5I5cC0cOVazy70CNyYYjiwRj9unwalhESndgxx6bGc/m6Hhs4EKF5XQ=="],
"@clack/prompts": ["@clack/prompts@1.0.0-alpha.9", "", { "dependencies": { "@clack/core": "1.0.0-alpha.7", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-sKs0UjiHFWvry4SiRfBi5Qnj0C/6AYx8aKkFPZQSuUZXgAram25ZDmhQmP7vj1aFyLpfHWtLQjWvOvcat0TOLg=="], "@clack/prompts": ["@clack/prompts@1.0.0-alpha.9", "", { "dependencies": { "@clack/core": "1.0.0-alpha.7", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-sKs0UjiHFWvry4SiRfBi5Qnj0C/6AYx8aKkFPZQSuUZXgAram25ZDmhQmP7vj1aFyLpfHWtLQjWvOvcat0TOLg=="],

View File

@@ -18,6 +18,11 @@ export default defineNuxtConfig({
routeRules: { routeRules: {
"/": { prerender: true }, "/": { prerender: true },
}, },
fonts: {
families: [
{ name: "JetBrains Mono", provider: "local" }
]
},
compatibilityDate: "2025-07-15", compatibilityDate: "2025-07-15",
devtools: { enabled: true }, devtools: { enabled: true },
}); });

View File

@@ -17,5 +17,8 @@
"typescript": "^5.6.3", "typescript": "^5.6.3",
"vue": "^3.5.26", "vue": "^3.5.26",
"vue-router": "^4.6.4" "vue-router": "^4.6.4"
},
"devDependencies": {
"@catppuccin/tailwindcss": "^1.0.0"
} }
} }

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M320 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l82.7 0L201.4 265.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L448 109.3l0 82.7c0 17.7 14.3 32 32 32s32-14.3 32-32l0-160c0-17.7-14.3-32-32-32L320 0zM80 32C35.8 32 0 67.8 0 112L0 432c0 44.2 35.8 80 80 80l320 0c44.2 0 80-35.8 80-80l0-112c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 112c0 8.8-7.2 16-16 16L80 448c-8.8 0-16-7.2-16-16l0-320c0-8.8 7.2-16 16-16l112 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L80 32z"/></svg>

Before

Width:  |  Height:  |  Size: 673 B

View File

@@ -1,11 +1,11 @@
module.exports = { module.exports = {
purge: [], purge: [],
darkMode: false, // or 'media' or 'class' darkMode: true, // or 'media' or 'class'
theme: { theme: {
extend: {}, extend: {},
}, },
variants: { variants: {
extend: {}, extend: {},
}, },
plugins: [], plugins: [],
}; };