Add login button, UI tweaks
Docker / build (push) Canceled after 46s

This commit is contained in:
2026-07-17 00:32:39 +12:00
parent 7cb01d7ad0
commit 53df8dcefc
6 changed files with 45 additions and 27 deletions
+2 -2
View File
@@ -3,9 +3,9 @@
# ============================================ # ============================================
# IMPORTANT: Node.js Version Maintenance # IMPORTANT: Node.js Version Maintenance
# This Dockerfile uses Node.js 24.13.0-slim, which was the latest LTS version at the time of writing. # This Dockerfile uses Node.js 24.18.0-slim, which was the latest LTS version at the time of writing.
# To ensure security and compatibility, regularly update the NODE_VERSION ARG to the latest LTS version. # To ensure security and compatibility, regularly update the NODE_VERSION ARG to the latest LTS version.
ARG NODE_VERSION=24.13.0-slim ARG NODE_VERSION=24.18.0-slim
FROM node:${NODE_VERSION} AS dependencies FROM node:${NODE_VERSION} AS dependencies
+17 -2
View File
@@ -60,7 +60,14 @@ export function Header() {
</div> </div>
{/* CTA Button */} {/* CTA Button */}
<div className="hidden md:block"> <div className="hidden md:flex items-center gap-8">
<Link
href="https://auth.cloudrite.co.nz"
className="relative text-sm font-medium text-muted-foreground hover:text-foreground transition-colors duration-300 group"
>
Login
<span className="absolute -bottom-1 left-0 w-0 h-0.5 bg-primary transition-all duration-300 group-hover:w-full" />
</Link>
<Button <Button
asChild asChild
className="bg-primary text-primary-foreground hover:bg-primary/90 transition-all duration-300 hover:scale-105 hover:shadow-lg hover:shadow-primary/25" className="bg-primary text-primary-foreground hover:bg-primary/90 transition-all duration-300 hover:scale-105 hover:shadow-lg hover:shadow-primary/25"
@@ -115,7 +122,15 @@ export function Header() {
))} ))}
<Button <Button
asChild asChild
className="w-full mt-4 bg-primary text-primary-foreground hover:bg-primary/90" className="w-full mt-4 bg-secondary text-secondary-foreground hover:bg-secondary/90"
>
<Link href="https://auth.cloudrite.co.nz" onClick={() => setIsMobileMenuOpen(false)}>
Login
</Link>
</Button>
<Button
asChild
className="w-full bg-primary text-primary-foreground hover:bg-primary/90"
> >
<Link href="#contact" onClick={() => setIsMobileMenuOpen(false)}> <Link href="#contact" onClick={() => setIsMobileMenuOpen(false)}>
Get in Touch Get in Touch
+13 -13
View File
@@ -5,11 +5,11 @@ import { Button } from "@/components/ui/button"
import { ArrowRight } from "lucide-react" import { ArrowRight } from "lucide-react"
import Link from "next/link" import Link from "next/link"
function FloatingElement({ delay = 0, duration = 20, children, className = "" }: { function FloatingElement({ delay = 0, duration = 20, children, className = "" }: {
delay?: number delay?: number
duration?: number duration?: number
children: React.ReactNode children: React.ReactNode
className?: string className?: string
}) { }) {
return ( return (
<div <div
@@ -85,7 +85,7 @@ export function Hero() {
> >
{/* Background Elements */} {/* Background Elements */}
<GridPattern /> <GridPattern />
{/* Floating decorative elements */} {/* Floating decorative elements */}
<FloatingElement delay={0} duration={25} className="top-[15%] left-[10%]"> <FloatingElement delay={0} duration={25} className="top-[15%] left-[10%]">
<div className="w-32 h-32 border border-primary/20 rounded-full" /> <div className="w-32 h-32 border border-primary/20 rounded-full" />
@@ -96,7 +96,7 @@ export function Hero() {
<FloatingElement delay={10} duration={22} className="bottom-[20%] left-[20%]"> <FloatingElement delay={10} duration={22} className="bottom-[20%] left-[20%]">
<div className="w-16 h-16 bg-primary/10 rounded-lg" /> <div className="w-16 h-16 bg-primary/10 rounded-lg" />
</FloatingElement> </FloatingElement>
{/* Glow effect */} {/* Glow effect */}
<div <div
className="absolute w-[600px] h-[600px] rounded-full bg-primary/10 blur-[120px] transition-transform duration-500 ease-out" className="absolute w-[600px] h-[600px] rounded-full bg-primary/10 blur-[120px] transition-transform duration-500 ease-out"
@@ -117,8 +117,8 @@ export function Hero() {
<AnimatedText text="Every Business" className="mb-2 pb-1" /> <AnimatedText text="Every Business" className="mb-2 pb-1" />
<AnimatedText text="Needs an" className="mb-2 pb-1" /> <AnimatedText text="Needs an" className="mb-2 pb-1" />
<span className="relative inline-block pb-2"> <span className="relative inline-block pb-2">
<AnimatedText <AnimatedText
text="I.T Guy" text="I.T Guy"
className="text-primary" className="text-primary"
/> />
<div className="absolute -inset-2 bg-primary/20 blur-2xl -z-10 animate-pulse" /> <div className="absolute -inset-2 bg-primary/20 blur-2xl -z-10 animate-pulse" />
@@ -127,16 +127,16 @@ export function Hero() {
{/* Subtitle */} {/* Subtitle */}
<p className="max-w-2xl mx-auto text-lg md:text-xl text-muted-foreground mb-12 animate-fade-in animation-delay-500"> <p className="max-w-2xl mx-auto text-lg md:text-xl text-muted-foreground mb-12 animate-fade-in animation-delay-500">
From websites and cloud infrastructure to computer repairs and I.T support From websites and cloud infrastructure to computer repairs and I.T support
we help small businesses thrive in the digital world. we help small businesses thrive in the digital world.
</p> </p>
{/* CTA Buttons */} {/* CTA Buttons */}
<div className="flex flex-col sm:flex-row items-center justify-center gap-4 animate-fade-in animation-delay-700"> <div className="flex flex-col sm:flex-row items-center justify-center gap-4 animate-fade-in animation-delay-700 max-w-36 mx-auto">
<Button <Button
asChild asChild
size="lg" size="lg"
className="group bg-primary text-primary-foreground hover:bg-primary/90 px-8 py-6 text-lg transition-all duration-300 hover:scale-105 hover:shadow-xl hover:shadow-primary/25" className="group bg-primary text-primary-foreground hover:bg-primary/90 w-full py-6 text-lg transition-all duration-300 hover:scale-105 hover:shadow-xl hover:shadow-primary/25"
> >
<Link href="#contact"> <Link href="#contact">
Let&apos;s Talk Let&apos;s Talk
@@ -147,7 +147,7 @@ export function Hero() {
asChild asChild
variant="outline" variant="outline"
size="lg" size="lg"
className="px-8 py-6 text-lg border-border hover:bg-card hover:border-primary/50 transition-all duration-300" className="w-full py-6 text-lg border-border hover:bg-card hover:border-primary/50 transition-all duration-300"
> >
<Link href="#services">Our Services</Link> <Link href="#services">Our Services</Link>
</Button> </Button>
@@ -179,17 +179,17 @@ export function Hero() {
0%, 100% { transform: translateY(0px) rotate(0deg); } 0%, 100% { transform: translateY(0px) rotate(0deg); }
50% { transform: translateY(-20px) rotate(5deg); } 50% { transform: translateY(-20px) rotate(5deg); }
} }
.animate-fade-in { .animate-fade-in {
animation: fadeIn 0.8s ease-out forwards; animation: fadeIn 0.8s ease-out forwards;
opacity: 0; opacity: 0;
} }
@keyframes fadeIn { @keyframes fadeIn {
from { opacity: 0; transform: translateY(20px); } from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); } to { opacity: 1; transform: translateY(0); }
} }
.animation-delay-500 { animation-delay: 500ms; } .animation-delay-500 { animation-delay: 500ms; }
.animation-delay-700 { animation-delay: 700ms; } .animation-delay-700 { animation-delay: 700ms; }
.animation-delay-1000 { animation-delay: 1000ms; } .animation-delay-1000 { animation-delay: 1000ms; }
+1 -1
View File
@@ -61,7 +61,7 @@
}, },
"devDependencies": { "devDependencies": {
"@tailwindcss/postcss": "^4.2.0", "@tailwindcss/postcss": "^4.2.0",
"@types/node": "^22", "@types/node": "^24",
"@types/react": "19.2.14", "@types/react": "19.2.14",
"@types/react-dom": "19.2.3", "@types/react-dom": "19.2.3",
"postcss": "^8.5", "postcss": "^8.5",
+10 -9
View File
@@ -160,8 +160,8 @@ importers:
specifier: ^4.2.0 specifier: ^4.2.0
version: 4.2.2 version: 4.2.2
'@types/node': '@types/node':
specifier: ^22 specifier: ^24
version: 22.19.15 version: 24.13.3
'@types/react': '@types/react':
specifier: 19.2.14 specifier: 19.2.14
version: 19.2.14 version: 19.2.14
@@ -1219,8 +1219,8 @@ packages:
'@types/[email protected]': '@types/[email protected]':
resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
'@types/node@22.19.15': '@types/node@24.13.3':
resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==}
'@types/[email protected]': '@types/[email protected]':
resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
@@ -1646,6 +1646,7 @@ packages:
[email protected]: [email protected]:
resolution: {integrity: sha512-cIvMxDfpAmqAmVgc4yb7pgm/O1tmmkl/CjrvXuW+62/+7jj/iF9Ykm+hb/UJt42TREHMyd3gb+pkgoa2MxgDIw==} resolution: {integrity: sha512-cIvMxDfpAmqAmVgc4yb7pgm/O1tmmkl/CjrvXuW+62/+7jj/iF9Ykm+hb/UJt42TREHMyd3gb+pkgoa2MxgDIw==}
engines: {node: '>=14'} engines: {node: '>=14'}
deprecated: 1.x and 2.x branches are no longer active. Bump to Recharts v3 to receive latest features and bugfixes. See https://github.com/recharts/recharts/wiki/3.0-migration-guide
peerDependencies: peerDependencies:
react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -1709,8 +1710,8 @@ packages:
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
hasBin: true hasBin: true
undici-types@6.21.0: undici-types@7.18.2:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
[email protected]: [email protected]:
resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
@@ -2723,9 +2724,9 @@ snapshots:
'@types/[email protected]': {} '@types/[email protected]': {}
'@types/node@22.19.15': '@types/node@24.13.3':
dependencies: dependencies:
undici-types: 6.21.0 undici-types: 7.18.2
'@types/[email protected](@types/[email protected])': '@types/[email protected](@types/[email protected])':
dependencies: dependencies:
@@ -3153,7 +3154,7 @@ snapshots:
[email protected]: {} [email protected]: {}
undici-types@6.21.0: {} undici-types@7.18.2: {}
[email protected]([email protected]): [email protected]([email protected]):
dependencies: dependencies:
+2
View File
@@ -0,0 +1,2 @@
allowBuilds:
sharp: false