diff --git a/src/app.html b/src/app.html index 34e21ce..02f852f 100644 --- a/src/app.html +++ b/src/app.html @@ -3,7 +3,10 @@
- + + + + %sveltekit.head% diff --git a/src/lib/styles/global.scss b/src/lib/styles/global.scss index 099871a..d6033fa 100644 --- a/src/lib/styles/global.scss +++ b/src/lib/styles/global.scss @@ -1,13 +1,9 @@ :root { --spacing-outer: 5vw; --spacing-nav: 5vw; - // --color-bg: hsl(202, 58%, 39%); - --color-bg: hsl(0, 60%, 53%); - --color-text: #ffead9; - --color-highlight: #1d0c12; - // --color-bg: #000000; - // --color-text: #FFFFFF; - // --color-highlight: #FF4D00; + --color-bg: rgb(207, 63, 63); + --color-text: rgb(255, 234, 217); + --color-highlight: rgb(29, 12, 18); --aspect-ratio-heroes: 1.5; --font-size-p: clamp(20px, 1.6vw, 1.6vw); @@ -17,6 +13,20 @@ } } +@font-face { + font-family: 'Stratos'; + src: url('/fonts/Stratos-Regular.woff2') format('woff2'); + font-weight: normal; + font-display: swap; +} + +@font-face { + font-family: 'Stratos'; + src: url('/fonts/Stratos-BoldItalic.woff2') format('woff2'); + font-weight: bold; + font-display: swap; +} + a:hover, input:hover, button:hover { cursor: url('/pointer.svg'), auto; } @@ -32,18 +42,6 @@ body { max-width: 100vw; overflow-x: hidden; } -// body:after { -// content: ''; -// display: block; -// position: fixed; -// top: 0; -// left: 0; -// width: calc(100vw - 00px); -// height: calc(100svh - 30px); -// border: 15px solid var(--color-text); -// z-index: 1; -// pointer-events: none; -// } body * { box-sizing: border-box; } diff --git a/src/lib/utils/createCanvasImg.ts b/src/lib/utils/createCanvasImg.ts index 8971dc0..9622005 100644 --- a/src/lib/utils/createCanvasImg.ts +++ b/src/lib/utils/createCanvasImg.ts @@ -1,7 +1,11 @@ import * as PIXI from 'pixi.js'; -export default function createCanvasText( element: HTMLImageElement, stage: PIXI.Container ){ - +export default function createCanvasText( + element: HTMLImageElement, + stage: PIXI.Container, + spriteObject: PIXI.Sprite | null = null +){ + const elem = element; const elemSrc = elem.currentSrc || elem.src; const elemPosition = elem.getBoundingClientRect(); @@ -11,9 +15,22 @@ export default function createCanvasText( element: HTMLImageElement, stage: PIX if (elemSrc.includes('.svg')) { scalefactor = Number(elem.attributes.getNamedItem('data-svgscale')?.value); const canvasImgTexture = PIXI.Texture.from(elemSrc, { resourceOptions: { scale: scalefactor } }); - canvasImg = new PIXI.Sprite(canvasImgTexture); + + // Use provided sprite object or create a new one + if (spriteObject) { + spriteObject.texture = canvasImgTexture; + canvasImg = spriteObject; + } else { + canvasImg = new PIXI.Sprite(canvasImgTexture); + } } else { - canvasImg = PIXI.Sprite.from(elemSrc); + // Use provided sprite object or create a new one + if (spriteObject) { + spriteObject.texture = PIXI.Texture.from(elemSrc); + canvasImg = spriteObject; + } else { + canvasImg = PIXI.Sprite.from(elemSrc); + } } canvasImg.position.set(elemPosition.x, elemPosition.y); diff --git a/src/lib/utils/createCanvasText.ts b/src/lib/utils/createCanvasText.ts index 81494e2..e297b82 100644 --- a/src/lib/utils/createCanvasText.ts +++ b/src/lib/utils/createCanvasText.ts @@ -1,8 +1,12 @@ import type * as PIXI from 'pixi.js'; import { Text } from 'pixi.js'; -export default function createCanvasText( element: HTMLElement, stage: PIXI.Container ){ - +export default function createCanvasText( + element: HTMLElement, + stage: PIXI.Container, + textObject: PIXI.Text | null = null +){ + const elem = element; const elemStyles = window.getComputedStyle(elem); const elemFontSize = elemStyles.getPropertyValue('font-size') || '16px'; @@ -19,7 +23,8 @@ export default function createCanvasText( element: HTMLElement, stage: PIXI.Con elem.textContent = elem.textContent?.toUpperCase() as string; } - const canvasText = new Text(elem.textContent as string, { + // Use provided text object or create a new one + const canvasText = textObject || new Text(elem.textContent as string, { fontFamily: elemFontFamily, fontSize: elemFontSize, fontWeight: elemFontWeight as PIXI.TextStyleFontWeight, @@ -30,6 +35,18 @@ export default function createCanvasText( element: HTMLElement, stage: PIXI.Con padding: 20, }); + // Update existing text object properties + if (textObject) { + canvasText.text = elem.textContent as string; + canvasText.style.fontFamily = elemFontFamily; + canvasText.style.fontSize = parseInt(elemFontSize); + canvasText.style.fontWeight = elemFontWeight as PIXI.TextStyleFontWeight; + canvasText.style.fontStyle = elemFontStyle as PIXI.TextStyleFontStyle; + canvasText.style.letterSpacing = elemLetterSpacing; + canvasText.style.fill = elemColor; + canvasText.style.align = elemAlignment as PIXI.TextStyleAlign; + } + canvasText.on('added', () => { elem.classList.add('canvas-text-added'); elem.style.visibility = 'hidden'; diff --git a/src/routes/contact/+page.server.ts b/src/routes/contact/+page.server.ts new file mode 100644 index 0000000..b0632c3 --- /dev/null +++ b/src/routes/contact/+page.server.ts @@ -0,0 +1,79 @@ +import type { Actions } from './$types'; +import { BREVO_API_KEY } from '$env/static/private'; +import { fail, redirect } from '@sveltejs/kit'; + +const BREVO_ENDPOINT = 'https://api.brevo.com/v3/smtp/email'; + +const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + +export const prerender = false; + +export const actions: Actions = { + default: async ({ request, fetch }) => { + const formData = await request.formData(); + const name = (formData.get('name') ?? '').toString().trim(); + const email = (formData.get('email') ?? '').toString().trim(); + const message = (formData.get('contact') ?? '').toString().trim(); + const fields = { name, email, contact: message }; + + if (!email || !message) { + return fail(400, { error: 'Please provide your email and message.', fields }); + } + + if (!emailRegex.test(email)) { + return fail(400, { error: 'Please provide a valid email address.', fields }); + } + + if (!BREVO_API_KEY) { + console.error('Missing BREVO_API_KEY in environment'); + return fail(500, { error: 'Email service is not configured. Please try again later.', fields }); + } + + const subject = `New contact form submission from ${name || 'Website visitor'}`; + const textContent = `Name: ${name || 'N/A'}\nEmail: ${email}\n\nMessage:\n${message}`; + const htmlContent = `Name: ${name || 'N/A'}
Email: ${email}
Message:
${message.replace(/\n/g, '
')}