diff --git a/package.json b/package.json index 3c95acf..838d877 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atashdotdev", "type": "module", - "version": "1.2.0", + "version": "1.3.0", "scripts": { "dev": "astro dev", "build": "astro build", @@ -15,7 +15,7 @@ "@fontsource-variable/roboto-slab": "^5.2.8", "@heroicons/vue": "^2.2.0", "@tailwindcss/vite": "^4.1.18", - "astro": "^5.16.15", + "astro": "^5.17.1", "astro-icon": "^1.1.5", "nodemailer": "^7.0.12", "tailwindcss": "^4.1.18", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e7dd0aa..453775d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,10 @@ importers: dependencies: '@astrojs/node': specifier: ^9.5.2 - version: 9.5.2(astro@5.16.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0)) + version: 9.5.2(astro@5.17.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0)) '@astrojs/vue': specifier: ^5.1.4 - version: 5.1.4(@types/node@25.0.10)(astro@5.16.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(vue@3.5.27(typescript@5.7.3))(yaml@2.7.0) + version: 5.1.4(@types/node@25.0.10)(astro@5.17.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(vue@3.5.27(typescript@5.7.3))(yaml@2.7.0) '@fontsource-variable/inter': specifier: ^5.2.8 version: 5.2.8 @@ -27,8 +27,8 @@ importers: specifier: ^4.1.18 version: 4.1.18(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.0)) astro: - specifier: ^5.16.15 - version: 5.16.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0) + specifier: ^5.17.1 + version: 5.17.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0) astro-icon: specifier: ^1.1.5 version: 1.1.5 @@ -983,8 +983,8 @@ packages: astro-icon@1.1.5: resolution: {integrity: sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw==} - astro@5.16.15: - resolution: {integrity: sha512-+X1Z0NTi2pa5a0Te6h77Dgc44fYj63j1yx6+39Nvg05lExajxSq7b1Uj/gtY45zoum8fD0+h0nak+DnHighs3A==} + astro@5.17.1: + resolution: {integrity: sha512-oD3tlxTaVWGq/Wfbqk6gxzVRz98xa/rYlpe+gU2jXJMSD01k6sEDL01ZlT8mVSYB/rMgnvIOfiQQ3BbLdN237A==} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true @@ -2509,10 +2509,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/node@9.5.2(astro@5.16.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0))': + '@astrojs/node@9.5.2(astro@5.17.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0))': dependencies: '@astrojs/internal-helpers': 0.7.5 - astro: 5.16.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0) + astro: 5.17.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0) send: 1.2.1 server-destroy: 1.0.1 transitivePeerDependencies: @@ -2534,12 +2534,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/vue@5.1.4(@types/node@25.0.10)(astro@5.16.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(vue@3.5.27(typescript@5.7.3))(yaml@2.7.0)': + '@astrojs/vue@5.1.4(@types/node@25.0.10)(astro@5.17.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(vue@3.5.27(typescript@5.7.3))(yaml@2.7.0)': dependencies: '@vitejs/plugin-vue': 5.2.4(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.0))(vue@3.5.27(typescript@5.7.3)) '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.0))(vue@3.5.27(typescript@5.7.3)) '@vue/compiler-sfc': 3.5.27 - astro: 5.16.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0) + astro: 5.17.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0) vite: 6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.0) vite-plugin-vue-devtools: 7.7.9(rollup@4.56.0)(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.0))(vue@3.5.27(typescript@5.7.3)) vue: 3.5.27(typescript@5.7.3) @@ -3387,7 +3387,7 @@ snapshots: transitivePeerDependencies: - supports-color - astro@5.16.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0): + astro@5.17.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(typescript@5.7.3)(yaml@2.7.0): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 diff --git a/public/clients/HutchMortgages.webp b/public/clients/HutchMortgages.webp new file mode 100644 index 0000000..fa4b059 Binary files /dev/null and b/public/clients/HutchMortgages.webp differ diff --git a/public/clients/RoyerMortgages.webp b/public/clients/RoyerMortgages.webp new file mode 100644 index 0000000..9260d80 Binary files /dev/null and b/public/clients/RoyerMortgages.webp differ diff --git a/src/components/LogoLoop.vue b/src/components/LogoLoop.vue new file mode 100644 index 0000000..c668bbe --- /dev/null +++ b/src/components/LogoLoop.vue @@ -0,0 +1,443 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/RotatingText.astro b/src/components/RotatingText.astro new file mode 100644 index 0000000..6282877 --- /dev/null +++ b/src/components/RotatingText.astro @@ -0,0 +1,22 @@ +--- +interface Props { + items: { + text: string; + className: string; + }[]; +} + +const { items } = Astro.props; +--- + + + + + { + items.map((item) => ( + {item.text} + )) + } + + + diff --git a/src/components/Section.astro b/src/components/Section.astro new file mode 100644 index 0000000..76aa987 --- /dev/null +++ b/src/components/Section.astro @@ -0,0 +1,66 @@ +--- +import type { HTMLAttributes } from "astro/types"; + +interface Props extends HTMLAttributes<"section"> { + title?: string; + description?: string; + containerClass?: string; + fullWidth?: boolean; + background?: string; +} + +const { + title, + description, + class: className, + containerClass, + fullWidth = false, + background, + ...props +} = Astro.props; +--- + + + { + /* Header for Full Width Layouts: We render the header in its own container before the full-width slot */ + } + { + fullWidth && title && ( + + + {title} + + {description && ( + + {description} + + )} + + + ) + } + + { + fullWidth ? ( + + ) : ( + + {/* Header for Contained Layouts: The header is part of the main container */} + {title && ( + + + {title} + + {description && ( + + {description} + + )} + + + )} + + + ) + } + diff --git a/src/components/sections/AboutSection.astro b/src/components/sections/AboutSection.astro index 4a8f298..3bddbbf 100644 --- a/src/components/sections/AboutSection.astro +++ b/src/components/sections/AboutSection.astro @@ -1,6 +1,7 @@ --- import { Icon } from "astro-icon/components"; import { siteConfig } from "../../config/site"; +import Section from "../Section.astro"; const features = [ { @@ -16,34 +17,32 @@ const features = [ ...siteConfig.whyUs.cards[2], }, ]; + +const variantStyles: Record = { + primary: { bg: "bg-primary/10", text: "text-primary" }, + secondary: { bg: "bg-secondary/10", text: "text-secondary" }, + accent: { bg: "bg-accent/10", text: "text-accent" }, +}; --- - - - - - {siteConfig.whyUs.title} - - + + + { + features.map((feature) => { + const styles = + variantStyles[feature.variant] || variantStyles.primary; - - { - features.map((feature) => ( - + return ( + @@ -53,27 +52,27 @@ const features = [ {feature.content} + ); + }) + } + + + + + { + siteConfig.whyUs.stats.map((stat) => ( + + + {stat.value} + + + {stat.label} + + )) } - - - - { - siteConfig.whyUs.stats.map((stat) => ( - - - {stat.value} - - - {stat.label} - - - )) - } - - - + diff --git a/src/components/sections/ClientList.astro b/src/components/sections/ClientList.astro new file mode 100644 index 0000000..63c2089 --- /dev/null +++ b/src/components/sections/ClientList.astro @@ -0,0 +1,28 @@ +--- +import LogoLoop from "../LogoLoop.vue"; +import Section from "../Section.astro"; +import { siteConfig } from "../../config/site"; +--- + + + + + + diff --git a/src/components/sections/ContactSection.vue b/src/components/sections/ContactSection.vue index d59d84b..a96f0fb 100644 --- a/src/components/sections/ContactSection.vue +++ b/src/components/sections/ContactSection.vue @@ -1,11 +1,11 @@ - - - - - {{ siteConfig.contact.mainTitle }} - - - - + - - - - - - {{ siteConfig.contact.form.firstName }} - - - - - - {{ siteConfig.contact.form.lastName }} - - - - + + + + + + {{ siteConfig.contact.form.firstName }} + + + + + + {{ siteConfig.contact.form.lastName }} + + + + - - - {{ siteConfig.contact.form.email }} - - - + + + {{ siteConfig.contact.form.email }} + + + - - - {{ siteConfig.contact.form.company }} - - - + + + {{ siteConfig.contact.form.company }} + + + - - - - {{ siteConfig.contact.form.service }} - - - {{ siteConfig.contact.form.selectPlaceholders.service }} - - {{ s.label }} - - - - - - {{ siteConfig.contact.form.budget }} - - - {{ siteConfig.contact.form.selectPlaceholders.budget }} - - {{ b.label }} - - - - + + + + {{ siteConfig.contact.form.service }} + + + + {{ + siteConfig.contact.form + .selectPlaceholders.service + }} + + + {{ s.label }} + + + + + + {{ siteConfig.contact.form.budget }} + + + + {{ + siteConfig.contact.form + .selectPlaceholders.budget + }} + + + {{ b.label }} + + + + - - - {{ siteConfig.contact.form.message }} - - - + + + {{ siteConfig.contact.form.message }} + + + - - - - {{ errorMessage || siteConfig.contact.form.error }} - - + + + + {{ errorMessage || siteConfig.contact.form.error }} + + - - - {{ siteConfig.contact.form.success }} - + + + {{ + siteConfig.contact.form.success + }} + - - - - {{ siteConfig.contact.form.sending }} - - - - {{ siteConfig.contact.form.submit }} - - - - + + + + {{ siteConfig.contact.form.sending }} + + + + {{ siteConfig.contact.form.submit }} + + + + - {{ siteConfig.contact.direct.text }} - - - {{ siteConfig.contact.direct.email }} - + + {{ siteConfig.contact.direct.text }} + + + + {{ siteConfig.contact.direct.email }} + - - diff --git a/src/components/sections/HeroSection.astro b/src/components/sections/HeroSection.astro index d6f8180..c8302de 100644 --- a/src/components/sections/HeroSection.astro +++ b/src/components/sections/HeroSection.astro @@ -1,6 +1,8 @@ --- import { siteConfig } from "../../config/site"; import { Icon } from "astro-icon/components"; +import Section from "../Section.astro"; +import RotatingText from "../RotatingText.astro"; import StatusIndicator from "../StatusIndicator.vue"; const rotatingText = (siteConfig.hero as any).rotatingText as @@ -8,13 +10,17 @@ const rotatingText = (siteConfig.hero as any).rotatingText as | undefined; --- - + - + @@ -28,19 +34,7 @@ const rotatingText = (siteConfig.hero as any).rotatingText as <> {part} {index < array.length - 1 && rotatingText && ( - - - - {rotatingText.map((item) => ( - - {item.text} - - ))} - - - + )} > )) @@ -96,4 +90,4 @@ const rotatingText = (siteConfig.hero as any).rotatingText as - + diff --git a/src/components/sections/ServicesSection.astro b/src/components/sections/ServicesSection.astro index c4fd708..c64c674 100644 --- a/src/components/sections/ServicesSection.astro +++ b/src/components/sections/ServicesSection.astro @@ -1,29 +1,35 @@ --- import { siteConfig } from "../../config/site"; import { Icon } from "astro-icon/components"; +import Section from "../Section.astro"; + +const variantStyles: Record = { + primary: "bg-primary/10 text-primary", + secondary: "bg-secondary/10 text-secondary", + accent: "bg-accent/10 text-accent", +}; --- - - - - - {siteConfig.services.title} - - + + + { + siteConfig.services.cards.map((card) => { + const styles = + variantStyles[card.variant] || variantStyles.primary; - - { - siteConfig.services.cards.map((card, index) => ( + return ( @@ -38,8 +44,8 @@ import { Icon } from "astro-icon/components"; - )) - } - + ); + }) + } - + diff --git a/src/config/site.ts b/src/config/site.ts index 0c161e0..9863d80 100644 --- a/src/config/site.ts +++ b/src/config/site.ts @@ -123,6 +123,26 @@ export const siteConfig = { ], }, + clients: [ + { + name: "SAIKYO Softworks", + }, + { + name: "Royer Mortgages", + logo: "/clients/RoyerMortgages.webp", + }, + { + name: "Marew Consulting", + }, + { + name: "Hutch Mortgages", + logo: "/clients/HutchMortgages.webp", + }, + { + name: "Rush Home Mortgages", + }, + ], + contact: { title: "Contact Us", cta: { diff --git a/src/pages/index.astro b/src/pages/index.astro index 65adeec..3b1dcdc 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -5,8 +5,10 @@ import Layout from "../layouts/Layout.astro"; import { siteConfig } from "../config/site"; import HeroSection from "../components/sections/HeroSection.astro"; import ServicesSection from "../components/sections/ServicesSection.astro"; +import ClientList from "../components/sections/ClientList.astro"; import AboutSection from "../components/sections/AboutSection.astro"; import ContactSection from "../components/sections/ContactSection.vue"; +import Section from "../components/Section.astro"; const pageMetaInfo = { title: siteConfig.name, @@ -18,5 +20,12 @@ const pageMetaInfo = { - + + + +
+ {description} +
{{ siteConfig.contact.direct.text }}
+ {{ siteConfig.contact.direct.text }} +