├── .dockerignore ├── .eslintrc.json ├── .github └── workflows │ └── docker-build.yml ├── .gitignore ├── .husky └── pre-commit ├── .lintstagedrc.js ├── .storybook ├── main.ts ├── preview-body.html └── preview.ts ├── .stylelintrc.json ├── Dockerfile ├── README.md ├── next.config.mjs ├── package-lock.json ├── package.json ├── public ├── NavArrow.svg ├── favicon-orange │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ └── site.webmanifest ├── favicon-purple │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ └── site.webmanifest ├── images │ ├── brandImages │ │ ├── AM_logo.svg │ │ ├── ASB-Classic_logo.svg │ │ ├── Al-Brown_logo.svg │ │ ├── Bee_logo.svg │ │ ├── BlackPearl_logo.svg │ │ ├── Constructo_logo.svg │ │ ├── Cupples_logo.svg │ │ ├── Cutly_logo.svg │ │ ├── EatKinda_logo.svg │ │ ├── Eg_logo.svg │ │ ├── Fernglen-Farm_logo.svg │ │ ├── Goju_logo.svg │ │ ├── Greenhill_logo.svg │ │ ├── Ikaika_logo.svg │ │ ├── Illuminix_logo.svg │ │ ├── Juluwarlu_logo.svg │ │ ├── Kmart_Australia_logo.svg │ │ ├── Maunder-Roofing_logo.svg │ │ ├── Nibblish_logo.svg │ │ ├── Oztent_logo.svg │ │ ├── Peaq_logo.svg │ │ ├── Proper-Crisps_logo.svg │ │ ├── RemarkableCream_logo.svg │ │ ├── Rinse_logo.svg │ │ ├── Robert_logo.svg │ │ ├── Steves_logo.svg │ │ └── Youm_logo.svg │ ├── bts_creative.svg │ ├── bts_design_2.svg │ ├── bts_design_main.svg │ ├── coffee_doodle.svg │ ├── eltezza-logo-rotated.svg │ ├── eltezza-logo.svg │ ├── eltezza_gradientLogo.svg │ ├── stars-creative.svg │ └── stars-design.svg ├── latest_works_wheel.svg ├── next.svg ├── process_arrow.svg ├── process_arrow_mobile.svg ├── scripts │ └── pixel.js └── vercel.svg ├── src ├── constants │ ├── calendlyButtonText.tsx │ ├── data.ts │ ├── index.ts │ ├── logos.ts │ ├── metadata.ts │ └── websiteInfo.ts ├── features │ ├── connection │ │ ├── hotjar │ │ │ ├── hotjar.tsx │ │ │ └── index.ts │ │ ├── index.ts │ │ └── pixel │ │ │ ├── FacebookPixel.tsx │ │ │ └── index.ts │ ├── layout │ │ ├── ad-funnel │ │ │ ├── brands │ │ │ │ ├── brands.module.scss │ │ │ │ ├── brandsGrid.tsx │ │ │ │ ├── funnelBrands.tsx │ │ │ │ └── index.ts │ │ │ ├── contact │ │ │ │ ├── contact.module.scss │ │ │ │ ├── funnelContact.tsx │ │ │ │ └── index.ts │ │ │ ├── header │ │ │ │ ├── funnelHeader.tsx │ │ │ │ ├── header.module.scss │ │ │ │ └── index.ts │ │ │ ├── hero │ │ │ │ ├── components │ │ │ │ │ ├── card.tsx │ │ │ │ │ ├── components.module.scss │ │ │ │ │ └── funnelHero.tsx │ │ │ │ ├── heroParallax.tsx │ │ │ │ ├── index.ts │ │ │ │ └── parallax.module.scss │ │ │ ├── index.ts │ │ │ ├── partnership │ │ │ │ ├── funnelPartnership.tsx │ │ │ │ ├── index.ts │ │ │ │ └── partnership.module.scss │ │ │ ├── services │ │ │ │ ├── funnelServices.tsx │ │ │ │ ├── index.ts │ │ │ │ └── services.module.scss │ │ │ ├── testimonials │ │ │ │ ├── funnelTestimonials.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── testimonial.tsx │ │ │ │ └── testimonials.module.scss │ │ │ └── work │ │ │ │ ├── funnelWork.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── videoItem.tsx │ │ │ │ └── work.module.scss │ │ ├── index.ts │ │ └── main │ │ │ ├── accordion │ │ │ ├── accordion.module.scss │ │ │ ├── faq.tsx │ │ │ ├── index.ts │ │ │ └── services.tsx │ │ │ ├── brands │ │ │ ├── brands.module.scss │ │ │ ├── brands.tsx │ │ │ └── index.ts │ │ │ ├── bts │ │ │ ├── bts.module.scss │ │ │ ├── bts.tsx │ │ │ ├── btsText.tsx │ │ │ └── index.ts │ │ │ ├── contact │ │ │ ├── contact.module.scss │ │ │ ├── contact.tsx │ │ │ └── index.ts │ │ │ ├── form │ │ │ ├── details.tsx │ │ │ ├── form.module.scss │ │ │ ├── form.tsx │ │ │ ├── formModal.tsx │ │ │ ├── index.ts │ │ │ └── submitScreen.tsx │ │ │ ├── header │ │ │ ├── header.module.scss │ │ │ ├── header.tsx │ │ │ └── index.ts │ │ │ ├── hero │ │ │ ├── creativeHero.tsx │ │ │ ├── designHero.tsx │ │ │ ├── hero.module.scss │ │ │ ├── hero.tsx │ │ │ └── index.ts │ │ │ ├── home │ │ │ ├── home.module.scss │ │ │ ├── home.tsx │ │ │ ├── index.ts │ │ │ └── pagePortal.tsx │ │ │ ├── index.ts │ │ │ ├── navbar │ │ │ ├── index.ts │ │ │ ├── navbar.module.scss │ │ │ └── navbar.tsx │ │ │ ├── portal │ │ │ ├── index.ts │ │ │ └── portal.tsx │ │ │ ├── privacy-terms │ │ │ ├── index.ts │ │ │ ├── privacy.tsx │ │ │ ├── privacyTerms.module.scss │ │ │ └── termsConditions.tsx │ │ │ ├── process │ │ │ ├── index.ts │ │ │ ├── process.module.scss │ │ │ └── process.tsx │ │ │ ├── reviews │ │ │ ├── featuredReview.tsx │ │ │ ├── index.ts │ │ │ ├── review.tsx │ │ │ ├── reviews.module.scss │ │ │ └── reviews.tsx │ │ │ ├── team │ │ │ ├── index.ts │ │ │ ├── team.module.scss │ │ │ ├── team.tsx │ │ │ └── teamMember.tsx │ │ │ └── work │ │ │ ├── components │ │ │ ├── creativeVideo.tsx │ │ │ └── video.tsx │ │ │ ├── creativeWork.tsx │ │ │ ├── designWork.tsx │ │ │ ├── index.ts │ │ │ └── work.module.scss │ └── ui │ │ ├── badge │ │ ├── Badge.stories.tsx │ │ ├── badge.module.scss │ │ ├── badge.tsx │ │ └── index.ts │ │ ├── button │ │ ├── Button.stories.tsx │ │ ├── button.module.scss │ │ ├── button.tsx │ │ └── index.ts │ │ ├── calendlyEmbed │ │ ├── calendlyEmbed.module.scss │ │ ├── calendlyEmbed.tsx │ │ └── index.ts │ │ ├── fullScreen │ │ ├── fullScreen.module.scss │ │ ├── fullScreen.tsx │ │ └── index.ts │ │ ├── hoverPlayVideo │ │ ├── hoverPlayVideo.tsx │ │ ├── index.ts │ │ ├── video.module.scss │ │ └── videoDetails.tsx │ │ ├── index.ts │ │ ├── input │ │ ├── Input.stories.tsx │ │ ├── index.ts │ │ ├── input.module.scss │ │ └── input.tsx │ │ ├── marquee │ │ ├── Marquee.stories.tsx │ │ ├── carouselItem.tsx │ │ ├── index.ts │ │ ├── marquee.module.scss │ │ └── marquee.tsx │ │ ├── switch │ │ ├── Switch.stories.tsx │ │ ├── index.ts │ │ ├── switch.module.scss │ │ └── switch.tsx │ │ ├── textarea │ │ ├── index.ts │ │ ├── textarea.module.scss │ │ └── textarea.tsx │ │ ├── video │ │ ├── index.ts │ │ └── video.tsx │ │ └── vimeoPlayer │ │ ├── index.ts │ │ ├── vimeoPlayer.module.scss │ │ └── vimeoPlayer.tsx ├── fonts.ts ├── hooks │ ├── useScrollspy.tsx │ ├── useVideoControls.tsx │ └── useWindowSize.tsx ├── lib │ └── fpixel.ts ├── metadata.tsx ├── pages │ ├── 404.tsx │ ├── _app.tsx │ ├── _document.tsx │ ├── api │ │ └── mail.ts │ ├── creative │ │ └── index.tsx │ ├── design │ │ └── index.tsx │ ├── index.tsx │ ├── layout.tsx │ ├── privacy-policy │ │ └── index.tsx │ ├── showcase │ │ └── index.tsx │ └── terms-and-conditions │ │ └── index.tsx ├── styles │ ├── Home.module.css │ └── globals.css ├── types │ └── index.ts └── utils │ ├── boldText.tsx │ ├── checkFileName.ts │ └── scroll.tsx └── tsconfig.json /.dockerignore: -------------------------------------------------------------------------------- 1 | Dockerfile 2 | .dockerignore 3 | node_modules 4 | npm-debug.log 5 | README.md 6 | .next 7 | .git 8 | vps.md -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2021": true 5 | }, 6 | "extends": [ 7 | "next/core-web-vitals", 8 | "eslint:recommended", 9 | "plugin:@typescript-eslint/recommended", 10 | "plugin:react/recommended", 11 | "next", 12 | "prettier" 13 | ], 14 | "parser": "@typescript-eslint/parser", 15 | "parserOptions": { 16 | "ecmaVersion": "latest" 17 | }, 18 | "plugins": ["@typescript-eslint"], 19 | "rules": {} 20 | } 21 | -------------------------------------------------------------------------------- /.github/workflows/docker-build.yml: -------------------------------------------------------------------------------- 1 | name: Build and Push Docker Image 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [main] 8 | 9 | jobs: 10 | build-and-push: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout code 14 | uses: actions/checkout@v2 15 | 16 | - name: Login to GitHub Docker Registry 17 | run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login https://ghcr.io -u ${{ secrets.REGISTRY_USERNAME }} --password-stdin 18 | 19 | - name: Build Docker image 20 | run: docker build -t ghcr.io/todd-carlsson/eltezza-website:latest . 21 | 22 | - name: Push Docker image 23 | run: docker push ghcr.io/todd-carlsson/eltezza-website:latest 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | vps.md 23 | 24 | # debug 25 | npm-debug.log* 26 | yarn-debug.log* 27 | yarn-error.log* 28 | 29 | # local env files 30 | .env*.local 31 | .env.development.local 32 | .env.test.local 33 | .env.production.local 34 | 35 | # vercel 36 | .vercel 37 | 38 | # typescript 39 | *.tsbuildinfo 40 | next-env.d.ts 41 | 42 | .vscode 43 | .eslintcache 44 | .stylelintcache 45 | .env 46 | 47 | *storybook.log 48 | /test-results/ 49 | /playwright-report/ 50 | /blob-report/ 51 | /playwright/.cache/ 52 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | # .husky/pre-commit 4 | npm run pre-commit 5 | -------------------------------------------------------------------------------- /.lintstagedrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "*.{js,jsx,ts,tsx}": "eslint --ignore-path .gitignore --cache --fix", 3 | "*.{css,scss}": "stylelint --ignore-path .gitignore --cache --fix", 4 | 5 | // return a function so that the staged files aren't appended to the command 6 | // otherwise tsc will ignore the .tsconfig file. From the docs: "When input 7 | // files are specified on the command line, tsconfig.json files are ignored." 8 | // https://www.typescriptlang.org/docs/handbook/tsconfig-json.html 9 | "*.{ts,tsx}": () => "npm run check:types", 10 | "*.{jsx,ts,tsx,css,scss}": "prettier --ignore-path .gitignore --write", 11 | }; 12 | -------------------------------------------------------------------------------- /.storybook/main.ts: -------------------------------------------------------------------------------- 1 | import type { StorybookConfig } from "@storybook/nextjs"; 2 | import path from "path"; 3 | 4 | const config: StorybookConfig = { 5 | stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], 6 | addons: [ 7 | "@storybook/addon-onboarding", 8 | "@storybook/addon-links", 9 | "@storybook/addon-essentials", 10 | "@chromatic-com/storybook", 11 | "@storybook/addon-interactions", 12 | "@storybook/addon-a11y", 13 | ], 14 | framework: { 15 | name: "@storybook/nextjs", 16 | options: {}, 17 | }, 18 | webpackFinal: async (config) => { 19 | if (config.resolve) { 20 | config.resolve.alias = { 21 | ...config.resolve.alias, 22 | "@/hooks": path.resolve("./src/hooks"), 23 | "@/types": path.resolve("./src/types"), 24 | "@/styles": path.resolve("./src/styles"), 25 | "@/fonts": path.resolve("./src/fonts"), 26 | }; 27 | } 28 | return config; 29 | }, 30 | docs: { 31 | autodocs: "tag", 32 | }, 33 | staticDirs: ["..\\public"], 34 | }; 35 | export default config; 36 | -------------------------------------------------------------------------------- /.storybook/preview-body.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.storybook/preview.ts: -------------------------------------------------------------------------------- 1 | import type { Preview } from "@storybook/react"; 2 | 3 | import "../src/styles/globals.css"; 4 | 5 | const preview: Preview = { 6 | parameters: { 7 | controls: { 8 | matchers: { 9 | color: /(background|color)$/i, 10 | date: /Date$/i, 11 | }, 12 | }, 13 | }, 14 | }; 15 | 16 | export default preview; 17 | -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "stylelint-config-standard-scss", 4 | "stylelint-prettier/recommended" 5 | ], 6 | "rules": { 7 | "selector-class-pattern": "^([a-z][a-zA-Z]*)(-[a-z][a-zA-Z]*)*$|^([a-z][a-zA-Z]*)+$", 8 | "property-no-unknown": [ 9 | true, 10 | { 11 | "ignoreProperties": ["composes"] 12 | } 13 | ] 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:18-alpine AS base 2 | 3 | # Install dependencies only when needed 4 | FROM base AS deps 5 | # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. 6 | RUN apk add --no-cache libc6-compat 7 | WORKDIR /app 8 | 9 | # Install dependencies based on the preferred package manager 10 | COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ 11 | RUN \ 12 | if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ 13 | elif [ -f package-lock.json ]; then npm ci; \ 14 | elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \ 15 | else echo "Lockfile not found." && exit 1; \ 16 | fi 17 | 18 | 19 | # Rebuild the source code only when needed 20 | FROM base AS builder 21 | WORKDIR /app 22 | COPY --from=deps /app/node_modules ./node_modules 23 | COPY . . 24 | 25 | # Next.js collects completely anonymous telemetry data about general usage. 26 | # Learn more here: https://nextjs.org/telemetry 27 | # Uncomment the following line in case you want to disable telemetry during the build. 28 | # ENV NEXT_TELEMETRY_DISABLED 1 29 | 30 | RUN \ 31 | if [ -f yarn.lock ]; then yarn run build; \ 32 | elif [ -f package-lock.json ]; then npm run build; \ 33 | elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \ 34 | else echo "Lockfile not found." && exit 1; \ 35 | fi 36 | 37 | # Production image, copy all the files and run next 38 | FROM base AS runner 39 | WORKDIR /app 40 | 41 | ENV NODE_ENV production 42 | # Uncomment the following line in case you want to disable telemetry during runtime. 43 | # ENV NEXT_TELEMETRY_DISABLED 1 44 | 45 | RUN addgroup --system --gid 1001 nodejs 46 | RUN adduser --system --uid 1001 nextjs 47 | 48 | COPY --from=builder /app/public ./public 49 | 50 | # Set the correct permission for prerender cache 51 | RUN mkdir .next 52 | RUN chown nextjs:nodejs .next 53 | 54 | # Automatically leverage output traces to reduce image size 55 | # https://nextjs.org/docs/advanced-features/output-file-tracing 56 | COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ 57 | COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static 58 | 59 | USER nextjs 60 | 61 | EXPOSE 3000 62 | 63 | ENV PORT 3000 64 | 65 | # server.js is created by next build from the standalone output 66 | # https://nextjs.org/docs/pages/api-reference/next-config-js/output 67 | CMD HOSTNAME="0.0.0.0" node server.js -------------------------------------------------------------------------------- /next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | output: "standalone", 5 | images: { 6 | remotePatterns: [ 7 | { 8 | protocol: "https", 9 | hostname: "source.unsplash.com", 10 | }, 11 | { 12 | protocol: "https", 13 | hostname: "res-console.cloudinary.com", 14 | port: '', 15 | }, 16 | { 17 | protocol: "https", 18 | hostname: "res.cloudinary.com", 19 | port: '', 20 | }, 21 | { 22 | protocol: "https", 23 | hostname: "d5st4psppqx3d.cloudfront.net", 24 | port: '', 25 | }, 26 | ], 27 | }, 28 | }; 29 | 30 | export default nextConfig; 31 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eltezza-website", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint", 10 | "lint:code": "eslint --ignore-path .gitignore .", 11 | "lint:styles": "stylelint --ignore-path .gitignore \"**/*.scss\"", 12 | "test": "npx playwright test", 13 | "test:chrome": "npx playwright test --project=chromium", 14 | "test:firefox": "npx playwright test --project=firefox", 15 | "test:safari": "npx playwright test --project=webkit", 16 | "check:types": "tsc --noEmit", 17 | "prettier": "prettier --write --ignore-path .gitignore --check .", 18 | "storybook": "storybook dev -p 6006", 19 | "build-storybook": "storybook build", 20 | "prepare": "husky install", 21 | "pre-commit": "lint-staged", 22 | "chromatic": "npx chromatic --project-token=chpt_768291d16afc6c8" 23 | }, 24 | "engines": { 25 | "npm": ">=10.2.3", 26 | "node": ">=20.10.0" 27 | }, 28 | "dependencies": { 29 | "@hookform/resolvers": "^3.3.4", 30 | "@sendgrid/mail": "^8.1.4", 31 | "classnames": "^2.5.1", 32 | "debounce": "^2.1.0", 33 | "framer-motion": "^11.18.2", 34 | "next": "14.2.26", 35 | "npm": "^10.7.0", 36 | "react": "^18", 37 | "react-dom": "^18", 38 | "react-hook-form": "^7.51.1", 39 | "react-icons": "^5.0.1", 40 | "react-progressive-graceful-image": "^0.7.0", 41 | "react-use-measure": "^2.1.1", 42 | "react-uuid": "^2.0.0", 43 | "swiper": "^11.1.1", 44 | "zod": "^3.22.4" 45 | }, 46 | "devDependencies": { 47 | "@chromatic-com/storybook": "^1.2.20", 48 | "@storybook/addon-a11y": "^8.0.0", 49 | "@storybook/addon-essentials": "^8.0.0", 50 | "@storybook/addon-interactions": "^8.0.0", 51 | "@storybook/addon-links": "^8.0.0", 52 | "@storybook/addon-onboarding": "^8.0.0", 53 | "@storybook/blocks": "^8.0.0", 54 | "@storybook/nextjs": "^8.0.0", 55 | "@storybook/react": "^8.0.0", 56 | "@storybook/test": "^8.0.0", 57 | "@types/node": "^20", 58 | "@types/react": "^18", 59 | "@types/react-dom": "^18", 60 | "@typescript-eslint/eslint-plugin": "^7.3.1", 61 | "@typescript-eslint/parser": "^7.3.1", 62 | "chromatic": "^11.2.0", 63 | "eslint": "^8", 64 | "eslint-config-next": "14.1.3", 65 | "eslint-config-prettier": "^9.1.0", 66 | "eslint-plugin-storybook": "^0.8.0", 67 | "husky": "^9.0.11", 68 | "lint-staged": "^15.2.2", 69 | "prettier": "3.2.5", 70 | "sass": "^1.72.0", 71 | "storybook": "^8.0.0", 72 | "stylelint": "^16.2.1", 73 | "stylelint-config-standard": "^36.0.0", 74 | "stylelint-config-standard-scss": "^13.0.0", 75 | "stylelint-prettier": "^5.0.0", 76 | "typescript": "^5" 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /public/NavArrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/favicon-orange/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/todd-carlsson/eltezza-website-v2/a4a74e96c7dc7f3d4150977947cc25abeb51cdee/public/favicon-orange/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/favicon-orange/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/todd-carlsson/eltezza-website-v2/a4a74e96c7dc7f3d4150977947cc25abeb51cdee/public/favicon-orange/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/favicon-orange/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/todd-carlsson/eltezza-website-v2/a4a74e96c7dc7f3d4150977947cc25abeb51cdee/public/favicon-orange/apple-touch-icon.png -------------------------------------------------------------------------------- /public/favicon-orange/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/todd-carlsson/eltezza-website-v2/a4a74e96c7dc7f3d4150977947cc25abeb51cdee/public/favicon-orange/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-orange/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/todd-carlsson/eltezza-website-v2/a4a74e96c7dc7f3d4150977947cc25abeb51cdee/public/favicon-orange/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon-orange/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/todd-carlsson/eltezza-website-v2/a4a74e96c7dc7f3d4150977947cc25abeb51cdee/public/favicon-orange/favicon.ico -------------------------------------------------------------------------------- /public/favicon-orange/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /public/favicon-purple/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/todd-carlsson/eltezza-website-v2/a4a74e96c7dc7f3d4150977947cc25abeb51cdee/public/favicon-purple/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/favicon-purple/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/todd-carlsson/eltezza-website-v2/a4a74e96c7dc7f3d4150977947cc25abeb51cdee/public/favicon-purple/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/favicon-purple/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/todd-carlsson/eltezza-website-v2/a4a74e96c7dc7f3d4150977947cc25abeb51cdee/public/favicon-purple/apple-touch-icon.png -------------------------------------------------------------------------------- /public/favicon-purple/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/todd-carlsson/eltezza-website-v2/a4a74e96c7dc7f3d4150977947cc25abeb51cdee/public/favicon-purple/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-purple/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/todd-carlsson/eltezza-website-v2/a4a74e96c7dc7f3d4150977947cc25abeb51cdee/public/favicon-purple/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon-purple/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/todd-carlsson/eltezza-website-v2/a4a74e96c7dc7f3d4150977947cc25abeb51cdee/public/favicon-purple/favicon.ico -------------------------------------------------------------------------------- /public/favicon-purple/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /public/images/brandImages/Bee_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/images/brandImages/Cutly_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 17 | 19 | 22 | 23 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /public/images/brandImages/Oztent_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /public/images/brandImages/Peaq_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /public/images/stars-creative.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/images/stars-design.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/process_arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/process_arrow_mobile.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/scripts/pixel.js: -------------------------------------------------------------------------------- 1 | const PIXEL_ID = document.currentScript.getAttribute("data-pixel-id"); 2 | 3 | function initializeFacebookPixel(f, b, e, v, n, t, s) { 4 | if (f.fbq) return; 5 | n = f.fbq = function () { 6 | n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments); 7 | }; 8 | if (!f._fbq) f._fbq = n; 9 | n.push = n; 10 | n.loaded = !0; 11 | n.version = "2.0"; 12 | n.queue = []; 13 | t = b.createElement(e); 14 | t.async = !0; 15 | t.src = v; 16 | s = b.getElementsByTagName(e)[0]; 17 | s.parentNode.insertBefore(t, s); 18 | } 19 | 20 | initializeFacebookPixel( 21 | window, 22 | document, 23 | "script", 24 | "https://connect.facebook.net/en_US/fbevents.js", 25 | ); 26 | 27 | window.fbq("init", PIXEL_ID); -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/constants/calendlyButtonText.tsx: -------------------------------------------------------------------------------- 1 | import { FiPhoneForwarded } from "react-icons/fi"; 2 | 3 | export const calendlyButtonText = ( 4 | <> 5 | Book a strategy call{" "} 6 | 7 | 8 | ); 9 | -------------------------------------------------------------------------------- /src/constants/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./data"; 2 | export * from "./metadata"; 3 | export * from "./logos"; 4 | export * from "./websiteInfo"; 5 | export * from "./calendlyButtonText"; 6 | -------------------------------------------------------------------------------- /src/constants/logos.ts: -------------------------------------------------------------------------------- 1 | import { distributionName } from "./websiteInfo"; 2 | 3 | export const logos = { 4 | design: 5 | distributionName + "/Logos/Final_Logo_Eltezza_Design_-_White_it63xt.png", 6 | creative: 7 | distributionName + "/Logos/Final_Logo_Eltezza_Creative_-_White_oz5nrt.png", 8 | }; 9 | -------------------------------------------------------------------------------- /src/constants/metadata.ts: -------------------------------------------------------------------------------- 1 | // METADATA 2 | 3 | import { distributionName } from "./websiteInfo"; 4 | 5 | export const metaData = { 6 | design: { 7 | title: "Eltezza | Design", 8 | description: 9 | "Welcome to Eltezza: home to two distinct yet intertwined identities. Our studio creates captivating narratives, while our agency arm delivers tangible results, shaping the future of brand engagement.", 10 | link: "https://eltezza.com/design", 11 | image: distributionName + "/riseabovethenoise_ffeyu4.jpg", 12 | }, 13 | creative: { 14 | title: "Eltezza | Creative", 15 | description: 16 | "Welcome to Eltezza: home to two distinct yet intertwined identities. Our studio creates captivating narratives, while our agency arm delivers tangible results, shaping the future of brand engagement.", 17 | link: "https://eltezza.com/creative", 18 | image: distributionName + "/riseabovethenoise_ffeyu4.jpg", 19 | }, 20 | home: { 21 | title: "Eltezza | Rise above the noise", 22 | description: 23 | "Welcome to Eltezza: home to two distinct yet intertwined identities. Our studio creates captivating narratives, while our agency arm delivers tangible results, shaping the future of brand engagement.", 24 | link: "https://eltezza.com/", 25 | image: distributionName + "/riseabovethenoise_ffeyu4.jpg", 26 | }, 27 | privacy: { 28 | title: "Privacy Policy | Eltezza", 29 | description: 30 | "Privacy Policy at Eltezza. We are committed to protecting your privacy. This Privacy Policy outlines how we collect, use, and safeguard your personal information in accordance with New Zealand's Privacy Act 2020.", 31 | link: "https://eltezza.com/privacy-policy", 32 | image: distributionName + "/riseabovethenoise_ffeyu4.jpg", 33 | }, 34 | termsConditions: { 35 | title: "Terms & Conditions | Eltezza", 36 | description: 37 | "Terms and conditons for Eltezza. These Terms and Conditions govern your use of our website and services. By accessing or using our website and services, you agree to comply with and be bound by these Terms.", 38 | link: "https://eltezza.com/terms-and-conditons", 39 | image: distributionName + "/riseabovethenoise_ffeyu4.jpg", 40 | }, 41 | adFunnel: { 42 | title: "Eltezza | Design & Creative Services", 43 | description: 44 | "Welcome to Eltezza: home to two distinct yet intertwined identities. Our studio creates captivating narratives, while our agency arm delivers tangible results, shaping the future of brand engagement.", 45 | link: "https://eltezza.com/landing-funnel", 46 | image: distributionName + "/riseabovethenoise_ffeyu4.jpg", 47 | }, 48 | error: { 49 | title: "Page Not Found | Eltezza", 50 | description: 51 | "Welcome to Eltezza: home to two distinct yet intertwined identities. Our studio creates captivating narratives, while our agency arm delivers tangible results, shaping the future of brand engagement.", 52 | link: "https://eltezza.com/", 53 | image: distributionName + "/riseabovethenoise_ffeyu4.jpg", 54 | }, 55 | }; 56 | -------------------------------------------------------------------------------- /src/features/connection/hotjar/hotjar.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from "react"; 2 | 3 | export const Hotjar = () => { 4 | useEffect(() => { 5 | // Insert Hotjar tracking code into the head section 6 | const script = document.createElement("script"); 7 | script.innerHTML = ` 8 | (function(h,o,t,j,a,r){ 9 | h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)}; 10 | h._hjSettings={hjid:6373424,hjsv:6}; 11 | a=o.getElementsByTagName('head')[0]; 12 | r=o.createElement('script');r.async=1; 13 | r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv; 14 | a.appendChild(r); 15 | })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv='); 16 | `; 17 | document.head.appendChild(script); 18 | 19 | return () => { 20 | // Cleanup if necessary 21 | document.head.removeChild(script); 22 | }; 23 | }, []); 24 | 25 | return null; 26 | }; 27 | -------------------------------------------------------------------------------- /src/features/connection/hotjar/index.ts: -------------------------------------------------------------------------------- 1 | export { Hotjar } from "./hotjar"; 2 | -------------------------------------------------------------------------------- /src/features/connection/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./hotjar"; 2 | export * from "./pixel"; 3 | -------------------------------------------------------------------------------- /src/features/connection/pixel/FacebookPixel.tsx: -------------------------------------------------------------------------------- 1 | import { usePathname } from "next/navigation"; 2 | import Script from "next/script"; 3 | import { useEffect, useState } from "react"; 4 | import * as pixel from "@/lib/fpixel"; 5 | 6 | export const FacebookPixel = () => { 7 | const [loaded, setLoaded] = useState(false); 8 | const pathname = usePathname(); 9 | 10 | useEffect(() => { 11 | if (!loaded) return; 12 | 13 | pixel.pageview(); 14 | }, [pathname, loaded]); 15 | 16 | return ( 17 |
18 |