diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 1454b0b9..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "@tresjs/eslint-config-vue", - "rules": { - "@typescript-eslint/no-use-before-define": "off" - } -} - \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6d0812d5..d1d5d430 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,11 @@ pnpm-debug.log* # macOS-specific files .DS_Store .nuxt/ + +.data + +# AI Assistant configurations +.cursor/ +.claude/ +CLAUDE.md + diff --git a/.netlify.toml b/.netlify.toml index a99cefaa..a27fdd74 100644 --- a/.netlify.toml +++ b/.netlify.toml @@ -1,3 +1,9 @@ +[build.environment] + NODE_VERSION = "22" [build] - publish = "dist" command = "pnpm run generate" + publish = "dist" +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 \ No newline at end of file diff --git a/app.config.ts b/app.config.ts new file mode 100644 index 00000000..7d7e7e81 --- /dev/null +++ b/app.config.ts @@ -0,0 +1,15 @@ +export default defineAppConfig({ + ui: { + colors: { + primary: 'teal', + accent: 'yellow', + neutral: 'zinc' + }, + card: { + slots: { + root: 'rounded-xs hover:bg-linear-[115deg,#272727 .06%,#171717]', + body: 'p-2 sm:p-3' + } + } + } +}) \ No newline at end of file diff --git a/app.vue b/app.vue deleted file mode 100644 index f8eacfa7..00000000 --- a/app.vue +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/app/app.vue b/app/app.vue new file mode 100644 index 00000000..dfc6409c --- /dev/null +++ b/app/app.vue @@ -0,0 +1,39 @@ + + + diff --git a/assets/logo.svg b/app/assets/logo.svg similarity index 100% rename from assets/logo.svg rename to app/assets/logo.svg diff --git a/app/assets/styles/main.css b/app/assets/styles/main.css new file mode 100644 index 00000000..103db713 --- /dev/null +++ b/app/assets/styles/main.css @@ -0,0 +1,45 @@ +@import "tailwindcss"; +@import "@nuxt/ui-pro"; + +@theme static { + --font-display: 'Manrope', sans-serif; + --font-sans: 'Inter', sans-serif; + + --breakpoint-3xl: 1920px; + --ui-pattern-fg: color-mix(in oklab,var(--ui-text)5%,transparent); + --ui-pattern-bg: repeating-linear-gradient(315deg,var(--ui-pattern-fg)0,var(--ui-pattern-fg)1px,transparent 0,transparent 50%); + --ui-header-height: 3rem; + + + /* Teal Palette */ + --color-teal-50: #f2fbf8; + --color-teal-100: #d3f4ea; + --color-teal-200: #a6e9d6; + --color-teal-300: #82dbc5; + --color-teal-400: #44bda2; + --color-teal-500: #2ba189; + --color-teal-600: #20816f; + --color-teal-700: #1d685b; + --color-teal-800: #1c534b; + --color-teal-900: #1b463f; + --color-teal-950: #0a2925; + + /* Yellow/Brown Palette */ + --color-yellow-50: #fff8eb; + --color-yellow-100: #feeac7; + --color-yellow-200: #fdd48a; + --color-yellow-300: #fbb03b; + --color-yellow-400: #fa9e25; + --color-yellow-500: #f47a0c; + --color-yellow-600: #b85607; + --color-yellow-700: #b3390a; + --color-yellow-800: #922b0e; + --color-yellow-900: #78250f; + --color-yellow-950: #451003; +} + +.pattern-bg { + background-image: var(--ui-pattern-bg); + background-size: 10px 10px; + background-attachment: fixed; +} \ No newline at end of file diff --git a/app/components/BlenderCube.vue b/app/components/BlenderCube.vue new file mode 100644 index 00000000..c3c8a459 --- /dev/null +++ b/app/components/BlenderCube.vue @@ -0,0 +1,18 @@ + + + \ No newline at end of file diff --git a/app/components/TheActions.vue b/app/components/TheActions.vue new file mode 100644 index 00000000..f6372e2c --- /dev/null +++ b/app/components/TheActions.vue @@ -0,0 +1,47 @@ + + \ No newline at end of file diff --git a/app/components/TheCard.vue b/app/components/TheCard.vue new file mode 100644 index 00000000..f5c06e38 --- /dev/null +++ b/app/components/TheCard.vue @@ -0,0 +1,88 @@ + + + \ No newline at end of file diff --git a/app/components/TheCodeButton.vue b/app/components/TheCodeButton.vue new file mode 100644 index 00000000..d8f6c4e4 --- /dev/null +++ b/app/components/TheCodeButton.vue @@ -0,0 +1,23 @@ + + + diff --git a/app/components/TheHeader.vue b/app/components/TheHeader.vue new file mode 100644 index 00000000..e38bf181 --- /dev/null +++ b/app/components/TheHeader.vue @@ -0,0 +1,25 @@ + + + diff --git a/app/components/TheScreenshot.vue b/app/components/TheScreenshot.vue new file mode 100644 index 00000000..300e2af9 --- /dev/null +++ b/app/components/TheScreenshot.vue @@ -0,0 +1,51 @@ + diff --git a/components/TheTag.vue b/app/components/TheTag.vue similarity index 100% rename from components/TheTag.vue rename to app/components/TheTag.vue diff --git a/app/components/array-cameras/KnightRigged.vue b/app/components/array-cameras/KnightRigged.vue new file mode 100644 index 00000000..99d16ea2 --- /dev/null +++ b/app/components/array-cameras/KnightRigged.vue @@ -0,0 +1,33 @@ + + + diff --git a/app/components/array-cameras/index.global.vue b/app/components/array-cameras/index.global.vue new file mode 100644 index 00000000..31d26318 --- /dev/null +++ b/app/components/array-cameras/index.global.vue @@ -0,0 +1,68 @@ + + + diff --git a/app/components/brickelangelo-david/TheDavid.vue b/app/components/brickelangelo-david/TheDavid.vue new file mode 100644 index 00000000..4dfbe24a --- /dev/null +++ b/app/components/brickelangelo-david/TheDavid.vue @@ -0,0 +1,69 @@ + + + diff --git a/components/content/brickelangelo-david/index.vue b/app/components/brickelangelo-david/index.global.vue similarity index 74% rename from components/content/brickelangelo-david/index.vue rename to app/components/brickelangelo-david/index.global.vue index 23b86fe9..972d06e8 100644 --- a/components/content/brickelangelo-david/index.vue +++ b/app/components/brickelangelo-david/index.global.vue @@ -3,7 +3,7 @@ import { BasicShadowMap, SRGBColorSpace, NoToneMapping, Vector3 } from 'three' import { useMouse } from '@vueuse/core' import gsap from 'gsap' -import David from './David.vue' + const { x, y } = useMouse() @@ -16,6 +16,8 @@ const gl = { toneMapping: NoToneMapping, } +useControls('fpsgraph') + const lightRef = ref() watch([x, y], () => { @@ -36,8 +38,7 @@ useControls({ cameraPosition }) const { hasFinishLoading, progress } = await useProgress() -watch(hasFinishLoading, (hasFinishLoading) => { - if (!cameraRef.value || hasFinishLoading) return +const onDavidReady = () => { gsap.to(cameraRef.value.position, { duration: 10, x: -0.63, @@ -48,49 +49,30 @@ watch(hasFinishLoading, (hasFinishLoading) => { cameraRef.value.lookAt(0, 3, 0) }, }) -}) +}