The site now presents one freelance developer on one page: hero, introduction, four typical cases (developer for a product, make an app reliable, automate a process, a website) with what you get, how it runs and what it costs, a process automation section, technology and project fit, how I work, two live references, questions and contact. - Hero and closing headline are drawn from running binary digits. - Each case explains its four steps with an animated drawing; the automation section shows example workflows with work travelling between systems; a pipeline run shows what a test catches before a release. - Contact is one email address, kept in parts and assembled in the browser so it never appears in the page source (src/domain/email.ts, spec first). - Imprint and privacy pages added. - The old site (blog, case studies, contact form, fixed-price pages, video rendering and related scripts) is removed. Its URLs redirect to the homepage. - The deploy smoke test checks the legal pages and the redirects instead of the removed case study. - Dev scripts use docker compose v2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
67 lines
1.7 KiB
JavaScript
67 lines
1.7 KiB
JavaScript
import typography from "@tailwindcss/typography";
|
|
|
|
/** @type {import('tailwindcss').Config} */
|
|
export default {
|
|
content: ["./app/**/*.{js,ts,jsx,tsx,mdx}", "./src/**/*.{js,ts,jsx,tsx,mdx}"],
|
|
theme: {
|
|
extend: {
|
|
borderRadius: {
|
|
xl: "1rem",
|
|
"2xl": "1.5rem",
|
|
"3xl": "2rem",
|
|
full: "9999px",
|
|
},
|
|
colors: {
|
|
slate: {
|
|
850: "#1e293b",
|
|
900: "#0f172a",
|
|
950: "#020617",
|
|
},
|
|
},
|
|
fontFamily: {
|
|
sans: ["var(--font-inter)", "Inter", "system-ui", "sans-serif"],
|
|
serif: ["var(--font-newsreader)", "Georgia", "serif"],
|
|
mono: [
|
|
"var(--font-jetbrains-mono)",
|
|
"JetBrains Mono",
|
|
"ui-monospace",
|
|
"monospace",
|
|
],
|
|
},
|
|
typography: (theme) => ({
|
|
DEFAULT: {
|
|
css: {
|
|
color: theme("colors.slate.800"),
|
|
a: {
|
|
color: theme("colors.slate.900"),
|
|
"&:hover": {
|
|
color: theme("colors.slate.700"),
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}),
|
|
animation: {
|
|
"fade-in": "fadeIn 0.5s ease-in-out",
|
|
"slide-up": "slideUp 0.6s ease-out",
|
|
"slide-down": "slideDown 0.6s ease-out",
|
|
},
|
|
keyframes: {
|
|
fadeIn: {
|
|
"0%": { opacity: "0" },
|
|
"100%": { opacity: "1" },
|
|
},
|
|
slideUp: {
|
|
"0%": { transform: "translateY(20px)", opacity: "0" },
|
|
"100%": { transform: "translateY(0)", opacity: "1" },
|
|
},
|
|
slideDown: {
|
|
"0%": { transform: "translateY(-20px)", opacity: "0" },
|
|
"100%": { transform: "translateY(0)", opacity: "1" },
|
|
},
|
|
},
|
|
},
|
|
},
|
|
plugins: [typography],
|
|
};
|