const web = new Website()
function build(config) {
const site = render(config)
return site.deploy()
}
const [data, setData] = useState(null)
useEffect(() => {
fetchData('/api/projects')
}, [])
async function load(url) {
const res = await fetch(url)
if (!res.ok) throw new Error()
return res.json()
}
npm run build
git push origin main
NODE_ENV=production
const router = useRouter()
router.push('/grazie') interface Project {
id: string
client: string
type: 'website' | 'app' | 'mobile'
status: boolean
launched: Date
}
export type Config = {
theme: string
locale: 'it' | 'en' | 'de'
apiKey: string
maxItems: number
}
const stan: Developer = {
name: 'Carol Stan',
city: 'Trieste',
stack: ['React', 'Astro', 'Node']
}
type ServiceType = 'vetrina'
| 'webapp' | 'mobile'
| 'seo' | 'ai' .hero {
display: grid;
grid-template-columns: 52% 1fr;
gap: 4rem;
align-items: center;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(20px) }
to { opacity: 1; transform: translateY(0) }
}
:root {
--color-accent: #519872;
--font-mono: 'JetBrains Mono';
--radius-full: 9999px;
}
.btn-primary {
border-radius: var(--radius-full);
background: linear-gradient(
135deg, #519872, #233329
);
font-family: var(--font-mono);
} import express from 'express'
const app = express()
app.use(express.json())
app.get('/api/projects', async (req, res) => {
const data = await db.findAll()
res.json({ success: true, data })
})
app.post('/api/contact', async (req, res) => {
const { name, email, msg } = req.body
await sendMail({ name, email, msg })
res.json({ sent: true })
})
app.listen(3000, () => {
console.log('stancarol API online')
})
module.exports = { app } SELECT clients.name,
projects.title,
projects.status,
projects.launched_at
FROM clients
JOIN projects ON
clients.id = projects.client_id
WHERE projects.active = true
AND clients.city = 'Trieste'
ORDER BY launched_at DESC
LIMIT 20;
CREATE TABLE projects (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
client_id UUID REFERENCES clients(id),
title VARCHAR(255) NOT NULL,
status BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT NOW()
); export default function Page() {
return (
<main className="site">
<Hero />
<Services />
<Portfolio />
<FAQ />
<CTA />
</main>
)
}
const { data, error, isLoading } = useSWR(
'/api/projects',
fetcher,
{ revalidateOnFocus: false }
)
export async function getStaticProps() {
const projects = await fetchProjects()
return {
props: { projects },
revalidate: 3600
}
} git init
git add .
git commit -m "feat: initial site"
git push -u origin main
vercel --prod
# deployment complete ✓
# stancarol.it live
const env = process.env
const SITE = env.NEXT_PUBLIC_URL
const KEY = env.API_SECRET_KEY
// build config
export default defineConfig({
site: 'https://stancarol.it',
integrations: [react(), tailwind()],
output: 'static'
}) @keyframes float {
0%, 100% {
transform: translateY(0px);
}
50% {
transform: translateY(-12px);
}
}
@keyframes glow-pulse {
0%, 100% {
box-shadow: 0 0 20px rgba(81,152,114,0.2);
}
50% {
box-shadow: 0 0 40px rgba(81,152,114,0.4);
}
}
.portrait-circle {
border-radius: 50%;
animation: float 6s ease-in-out infinite;
}
@media (max-width: 768px) {
.hero-layout {
grid-template-columns: 1fr;
}
} const gsap = require('gsap')
const ScrollTrigger = require('gsap/ScrollTrigger')
gsap.registerPlugin(ScrollTrigger)
gsap.from('.hero-headline', {
y: 60,
opacity: 0,
duration: 1.2,
ease: 'power4.out'
})
ScrollTrigger.create({
trigger: '.services',
start: 'top 80%',
onEnter: () => {
gsap.from('.service-card', {
y: 40,
opacity: 0,
stagger: 0.1,
duration: 0.8
})
},
once: true
}) {
"name": "stancarol-site",
"version": "1.0.0",
"scripts": {
"dev": "astro dev",
"build": "astro build",
"start": "node server.js",
"lint": "eslint src/"
},
"dependencies": {
"astro": "^4.0.0",
"gsap": "^3.12.0",
"react": "^18.0.0"
},
"devDependencies": {
"typescript": "^5.0.0",
"tailwindcss": "^4.0.0"
}
}