capabilities: proof-points fill the tall tiles; headers rebalanced to the flagship weight
The hero and full-row tiles stretched to their grid height with nothing between blurb and chips - reading as missing body. Adds a points field rendered as accent-dashed proof lines (flagship gets four, observability three), each grounded in the running estate. Category titles step up to 23px/700 with the flagship at 30px so the hierarchy holds.
This commit is contained in:
@@ -25,6 +25,13 @@ const spanClass =
|
|||||||
{group.flag && <p class="tile__flag mono">{group.flag}</p>}
|
{group.flag && <p class="tile__flag mono">{group.flag}</p>}
|
||||||
<h3 class="tile__title">{group.title}</h3>
|
<h3 class="tile__title">{group.title}</h3>
|
||||||
<p class="tile__blurb">{group.blurb}</p>
|
<p class="tile__blurb">{group.blurb}</p>
|
||||||
|
{group.points && (
|
||||||
|
<ul class="tile__points" role="list">
|
||||||
|
{group.points.map((point) => (
|
||||||
|
<li>{point}</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
)}
|
||||||
<ul class="tile__chips mono" role="list">
|
<ul class="tile__chips mono" role="list">
|
||||||
{group.items.map((item) => (
|
{group.items.map((item) => (
|
||||||
<li class:list={["chip", group.span === "hero" && "chip--lit"]}>{item}</li>
|
<li class:list={["chip", group.span === "hero" && "chip--lit"]}>{item}</li>
|
||||||
@@ -97,12 +104,12 @@ const spanClass =
|
|||||||
position: relative;
|
position: relative;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-family: var(--font-display);
|
font-family: var(--font-display);
|
||||||
font-size: 19px;
|
font-size: 23px;
|
||||||
font-weight: 600;
|
font-weight: 700;
|
||||||
color: var(--text-strong);
|
color: var(--text-strong);
|
||||||
}
|
}
|
||||||
.tile--hero .tile__title {
|
.tile--hero .tile__title {
|
||||||
font-size: 26px;
|
font-size: 30px;
|
||||||
}
|
}
|
||||||
.tile__blurb {
|
.tile__blurb {
|
||||||
position: relative;
|
position: relative;
|
||||||
@@ -118,6 +125,39 @@ const spanClass =
|
|||||||
max-width: 420px;
|
max-width: 420px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tile__points {
|
||||||
|
position: relative;
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
margin: 6px 0 0;
|
||||||
|
padding: 0;
|
||||||
|
font-size: 13.5px;
|
||||||
|
line-height: 1.55;
|
||||||
|
color: var(--text-dim);
|
||||||
|
}
|
||||||
|
.tile__points li {
|
||||||
|
padding-left: 18px;
|
||||||
|
position: relative;
|
||||||
|
text-wrap: pretty;
|
||||||
|
}
|
||||||
|
.tile__points li::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0.55em;
|
||||||
|
width: 8px;
|
||||||
|
height: 2px;
|
||||||
|
background: linear-gradient(90deg, var(--accent), var(--accent-2));
|
||||||
|
border-radius: 1px;
|
||||||
|
}
|
||||||
|
.tile--hero .tile__points {
|
||||||
|
font-size: 14.5px;
|
||||||
|
gap: 12px;
|
||||||
|
max-width: 460px;
|
||||||
|
}
|
||||||
|
|
||||||
.tile__chips {
|
.tile__chips {
|
||||||
position: relative;
|
position: relative;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ export type SkillGroup = {
|
|||||||
title: string;
|
title: string;
|
||||||
// Short framing line for the group.
|
// Short framing line for the group.
|
||||||
blurb: string;
|
blurb: string;
|
||||||
|
/** Proof-point lines rendered between the blurb and the chips — fills the
|
||||||
|
* tall tiles (hero / full) so the tile reads as substance, not whitespace. */
|
||||||
|
points?: string[];
|
||||||
items: string[];
|
items: string[];
|
||||||
/** Bento tile size — "hero" = 2×2 flagship · "wide" = 2×1 · "full" = whole row · default 1×1. */
|
/** Bento tile size — "hero" = 2×2 flagship · "wide" = 2×1 · "full" = whole row · default 1×1. */
|
||||||
span?: "hero" | "wide" | "full";
|
span?: "hero" | "wide" | "full";
|
||||||
@@ -20,6 +23,12 @@ export const skills: SkillGroup[] = [
|
|||||||
span: "hero",
|
span: "hero",
|
||||||
flag: "FLAGSHIP",
|
flag: "FLAGSHIP",
|
||||||
blurb: "Serving vision and language models on real hardware at the edge.",
|
blurb: "Serving vision and language models on real hardware at the edge.",
|
||||||
|
points: [
|
||||||
|
"Fail-closed computer vision on single-node OpenShift — probes that catch a silently dead model, not just a dead pod.",
|
||||||
|
"One GPU, two jobs — a single card time-sliced between LLM serving and video transcode, with neither noticing.",
|
||||||
|
"DeepStream analytics pipelines run as first-class Kubernetes workloads, not appliances.",
|
||||||
|
"Local models behind an OpenAI-compatible gateway — swap the backend, keep every client.",
|
||||||
|
],
|
||||||
items: [
|
items: [
|
||||||
"NVIDIA GPU Operator",
|
"NVIDIA GPU Operator",
|
||||||
"GPU passthrough (ESXi, as code)",
|
"GPU passthrough (ESXi, as code)",
|
||||||
@@ -89,6 +98,11 @@ export const skills: SkillGroup[] = [
|
|||||||
title: "Observability & Ops",
|
title: "Observability & Ops",
|
||||||
span: "full",
|
span: "full",
|
||||||
blurb: "Knowing the system is healthy — and the GPUs with it.",
|
blurb: "Knowing the system is healthy — and the GPUs with it.",
|
||||||
|
points: [
|
||||||
|
"Fleet metrics by remote-write — every cluster ships to one Prometheus, GPUs included (DCGM / Intel Xe).",
|
||||||
|
"Alerts that reach a phone and mean it — tuned until silence means healthy, not unmonitored.",
|
||||||
|
"A backup is a rumour until a restore drill proves it — drills are scheduled, not aspirational.",
|
||||||
|
],
|
||||||
items: [
|
items: [
|
||||||
"Prometheus",
|
"Prometheus",
|
||||||
"Grafana",
|
"Grafana",
|
||||||
|
|||||||
Reference in New Issue
Block a user