From 3ce152d7562214b8613065ddac2b6c52948db607 Mon Sep 17 00:00:00 2001 From: Roman Mazuryk Date: Fri, 31 Jul 2026 22:29:29 +0200 Subject: [PATCH 1/2] feat: reposition portfolio around AI workflow audits --- src/assets/css/about.css | 133 ++++++++++++-- src/assets/css/market-pages.css | 200 ++++++++++++++++++---- src/components/AIWorkflowDetailPage.jsx | 3 +- src/components/AIWorkflowLibrary.jsx | 4 +- src/components/About.jsx | 179 ++++++++++--------- src/components/AboutPage.jsx | 37 ++-- src/components/ContactPage.jsx | 5 +- src/components/Hero.jsx | 4 +- src/components/MarketPages.jsx | 32 +--- src/components/ORIntegrationProofPage.jsx | 4 +- src/components/ProofOfWorkPage.jsx | 4 +- src/components/ServicesPage.jsx | 4 +- src/components/common/TypewriterTitle.jsx | 26 +++ src/locales/en.js | 38 ++-- 14 files changed, 483 insertions(+), 190 deletions(-) create mode 100644 src/components/common/TypewriterTitle.jsx diff --git a/src/assets/css/about.css b/src/assets/css/about.css index e05370e..f638ae1 100644 --- a/src/assets/css/about.css +++ b/src/assets/css/about.css @@ -33,7 +33,7 @@ display: inline-flex; align-items: center; margin-bottom: 0.7rem; - color: var(--accent-medtech); + color: var(--about-accent, var(--accent-ai)); font-size: 11px; font-weight: 850; letter-spacing: 0.16em; @@ -71,20 +71,48 @@ .about__panel, .about__section-card { + --about-accent: var(--accent-ai); + --about-soft: var(--accent-ai-soft); + --about-glow-x: 100%; + --about-glow-y: 0; + position: relative; overflow: hidden; padding: 1.15rem 1.15rem 1rem; - border: 1px solid var(--system-border); + border: 1px solid color-mix(in srgb, var(--about-accent) 24%, var(--system-border)); border-radius: var(--radius); background: linear-gradient(var(--grid-line) 1px, transparent 1px), linear-gradient(90deg, var(--grid-line) 1px, transparent 1px), + radial-gradient(520px 220px at var(--about-glow-x) var(--about-glow-y), var(--about-soft), transparent 66%), linear-gradient(180deg, rgba(255,255,255,0.84), rgba(255,255,255,0.62)), var(--panel); - background-size: 28px 28px, 28px 28px, auto, auto; + background-size: 28px 28px, 28px 28px, auto, auto, auto; box-shadow: var(--shadow); } +.about__section-card--implementation { + --about-accent: var(--accent-medtech); + --about-soft: var(--accent-medtech-soft); +} + +.about__section-card--cool { + --about-accent: var(--accent-ai); + --about-soft: var(--accent-ai-soft); +} + +.about__section-card--warm { + --about-accent: var(--accent-fullstack); + --about-soft: var(--accent-fullstack-soft); +} + +.about__section-card--foundation { + --about-accent: var(--accent-fullstack); + --about-soft: var(--accent-fullstack-soft); + --about-glow-x: 0; + --about-glow-y: 100%; +} + .about__panel::before, .about__section-card::before, .about__cta::before, @@ -93,7 +121,7 @@ position: absolute; inset: 0 auto 0 0; width: 3px; - background: linear-gradient(180deg, var(--accent-medtech), transparent); + background: linear-gradient(180deg, var(--about-accent, var(--accent-ai)), transparent); } .about__panel { @@ -137,6 +165,10 @@ gap: 0.5rem; } +.about__icon { + color: var(--about-accent, var(--accent-ai)); +} + .about__subtitle { font-size: 1.5rem; color: var(--accent-medtech); @@ -199,7 +231,7 @@ } .about__check-list svg { - color: var(--accent-medtech); + color: var(--about-accent, var(--accent-ai)); flex-shrink: 0; margin-top: 3px; } @@ -286,35 +318,106 @@ } .about__value-card { + --about-card-accent: var(--accent-ai); + --about-card-soft: var(--accent-ai-soft); + position: relative; padding: 1.15rem; - border: 1px solid var(--system-border); + border: 1px solid color-mix(in srgb, var(--about-card-accent) 26%, var(--system-border)); border-radius: var(--radius); - background: color-mix(in srgb, var(--panel) 88%, transparent); + background: + radial-gradient(340px 160px at 100% 0, var(--about-card-soft), transparent 68%), + color-mix(in srgb, var(--panel) 88%, transparent); box-shadow: none; } +.about__value-card::before, +.about__role-card::before { + content: ""; + position: absolute; + inset: 12px auto 12px 0; + width: 3px; + border-radius: 999px; + background: linear-gradient(180deg, var(--about-card-accent), transparent); +} + +.about__value-card--1 { + --about-card-accent: var(--accent-ai); + --about-card-soft: var(--accent-ai-soft); +} + +.about__value-card--2 { + --about-card-accent: var(--brand-2); + --about-card-soft: var(--surface-cool); +} + +.about__value-card--3 { + --about-card-accent: var(--accent-medtech); + --about-card-soft: var(--accent-medtech-soft); +} + .about__value-card h4, .about__role-card h4 { margin: 0 0 8px; - color: var(--text); + color: color-mix(in srgb, var(--about-card-accent, var(--about-accent, var(--accent-ai))) 20%, var(--text)); } .about__role-card { + --about-card-accent: var(--accent-ai); + --about-card-soft: var(--accent-ai-soft); + position: relative; display: grid; gap: 12px; align-content: start; padding: 1.15rem; - border: 1px solid var(--system-border); + border: 1px solid color-mix(in srgb, var(--about-card-accent) 26%, var(--system-border)); border-radius: var(--radius); - background: color-mix(in srgb, var(--panel) 88%, transparent); + background: + radial-gradient(340px 160px at 100% 0, var(--about-card-soft), transparent 68%), + color-mix(in srgb, var(--panel) 88%, transparent); +} + +.about__role-card:nth-child(1) { + --about-card-accent: var(--accent-ai); + --about-card-soft: var(--accent-ai-soft); +} + +.about__role-card:nth-child(2) { + --about-card-accent: var(--accent-fullstack); + --about-card-soft: var(--accent-fullstack-soft); +} + +.about__role-card:nth-child(3) { + --about-card-accent: var(--accent-medtech); + --about-card-soft: var(--accent-medtech-soft); } .about__role-card .btn { width: fit-content; } +.about__foundation-list { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 12px; +} + +.about__foundation-item { + display: inline-flex; + align-items: center; + min-height: 32px; + padding: 7px 10px; + border: 1px solid color-mix(in srgb, var(--accent-fullstack) 26%, var(--tag-border)); + border-radius: 999px; + background: color-mix(in srgb, var(--accent-fullstack-soft) 72%, var(--panel)); + color: var(--muted-strong); + font-size: 12px; + font-weight: 760; + line-height: 1.35; +} + .about__proof-links { display: grid; gap: 10px; @@ -341,6 +444,9 @@ } .about__cta { + --about-accent: var(--accent-ai); + --about-soft: var(--accent-ai-soft); + position: relative; overflow: hidden; display: flex; @@ -348,14 +454,15 @@ justify-content: space-between; gap: 18px; padding: 1.15rem; - border: 1px solid var(--system-border); + border: 1px solid color-mix(in srgb, var(--about-accent) 28%, var(--system-border)); border-radius: var(--radius); background: linear-gradient(var(--grid-line) 1px, transparent 1px), linear-gradient(90deg, var(--grid-line) 1px, transparent 1px), + radial-gradient(520px 220px at 100% 0, var(--about-soft), transparent 66%), linear-gradient(180deg, rgba(255,255,255,0.84), rgba(255,255,255,0.62)), var(--panel); - background-size: 28px 28px, 28px 28px, auto, auto; + background-size: 28px 28px, 28px 28px, auto, auto, auto; box-shadow: var(--shadow); } @@ -441,7 +548,7 @@ background: linear-gradient(var(--grid-line) 1px, transparent 1px), linear-gradient(90deg, var(--grid-line) 1px, transparent 1px), - radial-gradient(520px 220px at 100% 0, var(--accent-medtech-soft), transparent 66%), + radial-gradient(520px 220px at var(--about-glow-x, 100%) var(--about-glow-y, 0), var(--about-soft, var(--accent-ai-soft)), transparent 66%), var(--card-bg); } diff --git a/src/assets/css/market-pages.css b/src/assets/css/market-pages.css index 9fc2613..d877b10 100644 --- a/src/assets/css/market-pages.css +++ b/src/assets/css/market-pages.css @@ -1512,13 +1512,48 @@ } .fullstack-hero-map__node { + --fullstack-flow-accent: var(--accent-fullstack); + --fullstack-flow-soft: var(--accent-fullstack-soft); + position: relative; z-index: 1; min-width: 0; padding: 12px 10px; - border: 1px solid var(--system-border); + border: 1px solid color-mix(in srgb, var(--fullstack-flow-accent) 30%, var(--system-border)); border-radius: 12px; - background: color-mix(in srgb, var(--panel) 90%, transparent); + background: + radial-gradient(180px 100px at 100% 0, var(--fullstack-flow-soft), transparent 68%), + color-mix(in srgb, var(--panel) 90%, transparent); +} + +.fullstack-hero-map__step:nth-child(1) .fullstack-hero-map__node { + --fullstack-flow-accent: var(--brand-2); + --fullstack-flow-soft: var(--surface-cool); +} + +.fullstack-hero-map__step:nth-child(2) .fullstack-hero-map__node { + --fullstack-flow-accent: var(--accent-ai); + --fullstack-flow-soft: var(--accent-ai-soft); +} + +.fullstack-hero-map__step:nth-child(3) .fullstack-hero-map__node { + --fullstack-flow-accent: var(--accent-fullstack); + --fullstack-flow-soft: var(--accent-fullstack-soft); +} + +.fullstack-hero-map__step:nth-child(4) .fullstack-hero-map__node { + --fullstack-flow-accent: var(--accent-medtech); + --fullstack-flow-soft: var(--accent-medtech-soft); +} + +.fullstack-hero-map__step:nth-child(5) .fullstack-hero-map__node { + --fullstack-flow-accent: var(--brand-warm); + --fullstack-flow-soft: var(--surface-warm); +} + +.fullstack-hero-map__step:nth-child(6) .fullstack-hero-map__node { + --fullstack-flow-accent: var(--accent-fullstack-2); + --fullstack-flow-soft: var(--surface-cool); } .fullstack-hero-map__node span { @@ -1528,8 +1563,8 @@ height: 28px; margin-bottom: 9px; border-radius: 999px; - background: var(--accent-fullstack-soft); - color: var(--accent-fullstack); + background: var(--fullstack-flow-soft); + color: var(--fullstack-flow-accent); font-size: 11px; font-weight: 900; } @@ -1561,15 +1596,21 @@ .fullstack-workflow-card, .fullstack-project-card, .fullstack-capability-card { + --fullstack-card-accent: var(--accent-fullstack); + --fullstack-card-soft: var(--accent-fullstack-soft); + --fullstack-card-glow-x: 100%; + --fullstack-card-glow-y: 0; + position: relative; overflow: hidden; - border: 1px solid var(--system-border); + border: 1px solid color-mix(in srgb, var(--fullstack-card-accent) 24%, var(--system-border)); border-radius: 14px; background: linear-gradient(var(--grid-line) 1px, transparent 1px), linear-gradient(90deg, var(--grid-line) 1px, transparent 1px), + radial-gradient(360px 170px at var(--fullstack-card-glow-x) var(--fullstack-card-glow-y), var(--fullstack-card-soft), transparent 70%), color-mix(in srgb, var(--panel) 90%, transparent); - background-size: 24px 24px, 24px 24px, auto; + background-size: 24px 24px, 24px 24px, auto, auto; box-shadow: var(--shadow); } @@ -1581,13 +1622,38 @@ position: absolute; inset: 0 auto 0 0; width: 3px; - background: linear-gradient(180deg, var(--accent-fullstack), transparent); + background: linear-gradient(180deg, var(--fullstack-card-accent), transparent); } .fullstack-stack-card { padding: 18px; } +.fullstack-stack-card:nth-child(1) { + --fullstack-card-accent: var(--accent-fullstack); + --fullstack-card-soft: var(--accent-fullstack-soft); +} + +.fullstack-stack-card:nth-child(2) { + --fullstack-card-accent: var(--brand-2); + --fullstack-card-soft: var(--surface-cool); +} + +.fullstack-stack-card:nth-child(3) { + --fullstack-card-accent: var(--accent-medtech); + --fullstack-card-soft: var(--accent-medtech-soft); +} + +.fullstack-stack-card:nth-child(4) { + --fullstack-card-accent: var(--brand-warm); + --fullstack-card-soft: var(--surface-warm); +} + +.fullstack-stack-card:nth-child(5) { + --fullstack-card-accent: var(--accent-ai); + --fullstack-card-soft: var(--accent-ai-soft); +} + .fullstack-stack-card h3, .fullstack-workflow-card h3, .fullstack-project-card h3, @@ -1599,6 +1665,7 @@ .fullstack-stack-card h3 { margin-bottom: 12px; + color: color-mix(in srgb, var(--fullstack-card-accent) 22%, var(--text)); font-size: 16px; } @@ -1610,6 +1677,13 @@ gap: 8px; } +.fullstack-stack-card .feature-pill, +.fullstack-project-card__stack .feature-pill { + --system-accent: var(--fullstack-card-accent); + --system-accent-soft: var(--fullstack-card-soft); + border-color: color-mix(in srgb, var(--fullstack-card-accent) 26%, var(--tag-border)); +} + .fullstack-workflow-row { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); @@ -1618,11 +1692,26 @@ .fullstack-workflow-card { padding: 18px; - background: - linear-gradient(var(--grid-line) 1px, transparent 1px), - linear-gradient(90deg, var(--grid-line) 1px, transparent 1px), - radial-gradient(260px 150px at 100% 0, var(--accent-fullstack-soft), transparent 70%), - color-mix(in srgb, var(--panel) 90%, transparent); +} + +.fullstack-workflow-card:nth-child(1) { + --fullstack-card-accent: var(--brand-2); + --fullstack-card-soft: var(--surface-cool); +} + +.fullstack-workflow-card:nth-child(2) { + --fullstack-card-accent: var(--accent-fullstack); + --fullstack-card-soft: var(--accent-fullstack-soft); +} + +.fullstack-workflow-card:nth-child(3) { + --fullstack-card-accent: var(--accent-medtech); + --fullstack-card-soft: var(--accent-medtech-soft); +} + +.fullstack-workflow-card:nth-child(4) { + --fullstack-card-accent: var(--brand-warm); + --fullstack-card-soft: var(--surface-warm); } .fullstack-workflow-card span, @@ -1630,7 +1719,7 @@ .fullstack-project-card__status { display: inline-flex; width: fit-content; - color: var(--accent-fullstack); + color: var(--fullstack-card-accent); font-size: 10px; font-weight: 900; letter-spacing: 0.14em; @@ -1639,6 +1728,7 @@ .fullstack-workflow-card h3 { margin-top: 10px; + color: color-mix(in srgb, var(--fullstack-card-accent) 20%, var(--text)); font-size: 18px; } @@ -1660,20 +1750,36 @@ padding: 20px; } -.fullstack-project-card:nth-child(2n) { - background: - linear-gradient(var(--grid-line) 1px, transparent 1px), - linear-gradient(90deg, var(--grid-line) 1px, transparent 1px), - radial-gradient(360px 170px at 100% 0, color-mix(in srgb, var(--accent-fullstack-2) 12%, transparent), transparent 70%), - color-mix(in srgb, var(--panel) 91%, transparent); +.fullstack-project-card:nth-child(1) { + --fullstack-card-accent: var(--accent-fullstack); + --fullstack-card-soft: var(--accent-fullstack-soft); } -.fullstack-project-card:nth-child(3n) { - background: - linear-gradient(var(--grid-line) 1px, transparent 1px), - linear-gradient(90deg, var(--grid-line) 1px, transparent 1px), - radial-gradient(360px 170px at 0 100%, var(--accent-fullstack-soft), transparent 70%), - color-mix(in srgb, var(--panel) 91%, transparent); +.fullstack-project-card:nth-child(2) { + --fullstack-card-accent: var(--brand-2); + --fullstack-card-soft: var(--surface-cool); +} + +.fullstack-project-card:nth-child(3) { + --fullstack-card-accent: var(--accent-medtech); + --fullstack-card-soft: var(--accent-medtech-soft); +} + +.fullstack-project-card:nth-child(4) { + --fullstack-card-accent: var(--accent-ai); + --fullstack-card-soft: var(--accent-ai-soft); +} + +.fullstack-project-card:nth-child(5) { + --fullstack-card-accent: var(--brand-warm); + --fullstack-card-soft: var(--surface-warm); +} + +.fullstack-project-card:nth-child(6) { + --fullstack-card-accent: var(--accent-fullstack-2); + --fullstack-card-soft: var(--surface-cool); + --fullstack-card-glow-x: 0; + --fullstack-card-glow-y: 100%; } .fullstack-project-card--compact { @@ -1688,13 +1794,14 @@ .fullstack-project-card__status { padding: 5px 8px; - border: 1px solid color-mix(in srgb, var(--accent-fullstack) 34%, var(--border)); + border: 1px solid color-mix(in srgb, var(--fullstack-card-accent) 34%, var(--border)); border-radius: 999px; - background: var(--accent-fullstack-soft); + background: var(--fullstack-card-soft); letter-spacing: 0.08em; } .fullstack-project-card h3 { + color: color-mix(in srgb, var(--fullstack-card-accent) 18%, var(--text)); font-size: 21px; } @@ -1727,9 +1834,9 @@ gap: 6px; min-height: 32px; padding: 7px 10px; - border: 1px solid color-mix(in srgb, var(--accent-fullstack) 30%, var(--border)); + border: 1px solid color-mix(in srgb, var(--fullstack-card-accent) 30%, var(--border)); border-radius: 999px; - background: var(--accent-fullstack-soft); + background: var(--fullstack-card-soft); color: var(--text); font-size: 13px; font-weight: 850; @@ -1737,8 +1844,8 @@ } .fullstack-project-card__links a:hover { - border-color: color-mix(in srgb, var(--accent-fullstack) 56%, var(--border-hover)); - background: color-mix(in srgb, var(--accent-fullstack-soft) 78%, var(--panel-hover)); + border-color: color-mix(in srgb, var(--fullstack-card-accent) 56%, var(--border-hover)); + background: color-mix(in srgb, var(--fullstack-card-soft) 78%, var(--panel-hover)); } .fullstack-capability-grid { @@ -1749,7 +1856,38 @@ padding: 18px; } +.fullstack-capability-card:nth-child(1) { + --fullstack-card-accent: var(--accent-fullstack); + --fullstack-card-soft: var(--accent-fullstack-soft); +} + +.fullstack-capability-card:nth-child(2) { + --fullstack-card-accent: var(--accent-medtech); + --fullstack-card-soft: var(--accent-medtech-soft); +} + +.fullstack-capability-card:nth-child(3) { + --fullstack-card-accent: var(--brand-2); + --fullstack-card-soft: var(--surface-cool); +} + +.fullstack-capability-card:nth-child(4) { + --fullstack-card-accent: var(--accent-ai); + --fullstack-card-soft: var(--accent-ai-soft); +} + +.fullstack-capability-card:nth-child(5) { + --fullstack-card-accent: var(--accent-fullstack-2); + --fullstack-card-soft: var(--surface-cool); +} + +.fullstack-capability-card:nth-child(6) { + --fullstack-card-accent: var(--brand-warm); + --fullstack-card-soft: var(--surface-warm); +} + .fullstack-capability-card h3 { + color: color-mix(in srgb, var(--fullstack-card-accent) 18%, var(--text)); font-size: 17px; } diff --git a/src/components/AIWorkflowDetailPage.jsx b/src/components/AIWorkflowDetailPage.jsx index 4135ef0..9fff2d5 100644 --- a/src/components/AIWorkflowDetailPage.jsx +++ b/src/components/AIWorkflowDetailPage.jsx @@ -17,6 +17,7 @@ import { getWorkflowBySlug } from "../data/aiWorkflows.js"; import { useTranslation } from "../context/LangContext.jsx"; import StatusBadge from "./StatusBadge.jsx"; import PageHero from "./common/PageHero.jsx"; +import TypewriterTitle from "./common/TypewriterTitle.jsx"; const AUDIT_HREF = "mailto:romazuryk@proton.me?subject=AI%20Workflow%20Audit%20Request"; @@ -105,7 +106,7 @@ export default function AIWorkflowDetailPage({ slug }) {
} subtitle={summary} primaryCta={{ label: t("site.cta.startAudit"), href: AUDIT_HREF }} secondaryCta={{ label: t("site.aiWorkflow.detail.back"), href: "/ai-workflow", icon: