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

This commit is contained in:
asowneryt committed 2026-07-17 00:32:39 +12:00
1 parent 7cb01d7ad0
commit 53df8dcefc
6 files changed
+45 -27

No files matched your search

+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