/* global React */ const { useState, useEffect, useRef } = React; /* ============================================================ SKILLS — grouped by category, drag to rearrange ============================================================ */ const GROUPS = [ { id: "eng", title: "Engineering", sub: "Languages, frameworks, runtime models", icon: "stack", skills: [ { id: "dotnet", cat: "Backend · Core", name: ".NET / C#", detail: "ASP.NET Core 2 → 9, C# 6–13. REST, gRPC, JSON-RPC, WCF. Functional C# with LangExt / OneOf.", yrs: "7 yrs", lvl: 0.95 }, { id: "orleans", cat: "Architecture", name: "Microsoft Orleans", detail: "Distributed actor-model systems in production at Metso — grain design, clustering, persistence.", yrs: "2 yrs", lvl: 0.78 }, { id: "react", cat: "Frontend", name: "React 18 + TypeScript", detail: "Hooks, Suspense, Tailwind / MUI / Bootstrap. Storybook-driven design systems with strict TS.", yrs: "5 yrs", lvl: 0.88 } ] }, { id: "ops", title: "Platform & Operations", sub: "Cloud, infra-as-code, observability", icon: "cloud", skills: [ { id: "azure", cat: "Cloud · Infra", name: "Azure + Terraform", detail: "Migrating VM-era workloads to Azure-native. IaC with Terraform across Azure & AWS, K8s with Helm.", yrs: "4 yrs", lvl: 0.86 }, { id: "obs", cat: "Observability", name: "DataDog · OpenTelemetry", detail: "Tracing, metrics, logging from day one. Grafana dashboards, SLO-driven ops, alert hygiene.", yrs: "3 yrs", lvl: 0.82 } ] }, { id: "data", title: "Data", sub: "Stores, modelling, query design", icon: "data", skills: [ { id: "data", cat: "Databases", name: "SQL · Postgres · Mongo", detail: "MS SQL, PostgreSQL, MongoDB, Redis. Time-series in InfluxDB / Azure Data Explorer.", yrs: "7 yrs", lvl: 0.85 } ] }, { id: "people", title: "Product & Leadership", sub: "Backlog, stakeholders, outcomes", icon: "target", skills: [ { id: "po", cat: "Product · Delivery", name: "Agile / Scrum (PO)", detail: "Backlog ownership, refinement, INVEST stories, release planning. JIRA + Confluence-led.", yrs: "3 yrs", lvl: 0.86 }, { id: "stake", cat: "Leadership", name: "Stakeholder management", detail: "Bridge engineering ↔ business. Written-first comms, demos, expectation-shaping, RACI.", yrs: "4 yrs", lvl: 0.84 } ] } ]; function GroupIcon({ kind }) { const common = { width: 22, height: 22, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.6, strokeLinecap: "round" }; if (kind === "stack") { return ( ); } if (kind === "cloud") { return ( ); } if (kind === "data") { return ( ); } if (kind === "target") { return ( ); } return null; } function SkillCard({ skill, dragging, dragOver, innerRef, ...handlers }) { return (
{skill.detail}
Grouped by what they actually do. Drag any card within a group to reorder by what matters most to you.