.esb-grid {
	--esb-border: #d5dde5;
	--esb-bw: 1px;
	--esb-bs: solid;
	--esb-bg: #f4f8fb;
	--esb-hover-bg: #ffffff;
	--esb-top: #c4d600;
	--esb-top-h: 3px;
	--esb-speed: 300ms;

	--esb-cols: 4;
	display: flex;
	flex-wrap: wrap;
	background: var(--esb-bg);
	border-top: var(--esb-bw) var(--esb-bs) var(--esb-border);
	border-left: var(--esb-bw) var(--esb-bs) var(--esb-border);
	box-sizing: border-box;
}

.esb-item {
	/* each box takes 1/columns of the row; with few boxes they stretch to fill it */
	flex: var(--esb-grow, 0) 1 calc(100% / var(--esb-cols));
	min-width: 0;
	max-width: 100%;
	position: relative;
	display: flex;
	flex-direction: column;
	gap: 14px;
	box-sizing: border-box;
	padding: 24px;
	text-decoration: none !important;
	background: var(--esb-bg);
	border-right: var(--esb-bw) var(--esb-bs) var(--esb-border);
	border-bottom: var(--esb-bw) var(--esb-bs) var(--esb-border);
	transition: background-color var(--esb-speed) ease;
	cursor: default;
}

a.esb-item { cursor: pointer; }

/* hover top border - touches the grid lines on both sides */
.esb-item::before {
	content: "";
	position: absolute;
	top: calc(-1 * var(--esb-bw));
	left: calc(-1 * var(--esb-bw));
	right: 0;
	height: var(--esb-top-h);
	background: var(--esb-top);
	transform: scaleX(0);
	transform-origin: left center;
	transition: transform var(--esb-speed) ease;
	z-index: 2;
	pointer-events: none;
}

.esb-item:hover,
.esb-item:focus-visible {
	background: var(--esb-hover-bg);
}

.esb-item:hover::before,
.esb-item:focus-visible::before {
	transform: scaleX(1);
}

.esb-icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 38px;
	height: 38px;
	border-radius: 50%;
	font-size: 18px;
	line-height: 1;
	background: #dce9f3;
	color: #0b5d8a;
	transition: background-color var(--esb-speed) ease, color var(--esb-speed) ease;
}

.esb-icon svg {
	width: 1em;
	height: 1em;
	display: block;
	shape-rendering: geometricPrecision;
}

/* solid icons (Font Awesome etc.) take the icon colour as fill;
   line icons (svg with fill="none") keep their stroke and take it as stroke colour */
.esb-icon svg:not([fill="none"]) { fill: currentColor; }
.esb-icon svg[fill="none"] { stroke: currentColor; }
.esb-icon i { line-height: 1; }

/* icon changes colour + background on box hover */
.esb-item:hover .esb-icon,
.esb-item:focus-visible .esb-icon {
	background: #0b5d8a;
	color: #ffffff;
}

.esb-head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
}

.esb-title {
	font-size: 17px;
	font-weight: 700;
	line-height: 1.3;
	color: #0f1f2e;
	transition: color var(--esb-speed) ease;
}

.esb-desc {
	font-size: 14px;
	line-height: 1.6;
	color: #6b7a88;
	transition: color var(--esb-speed) ease;
}

/* arrow: hidden, slides in from the left on hover */
.esb-arrow {
	display: inline-flex;
	flex: 0 0 auto;
	color: #0f1f2e;
	opacity: 0;
	transform: translateX(-10px);
	transition: opacity var(--esb-speed) ease, transform var(--esb-speed) ease;
}

.esb-arrow svg {
	width: 18px;
	height: 18px;
	display: block;
}

.esb-item:hover .esb-arrow,
.esb-item:focus-visible .esb-arrow {
	opacity: 1;
	transform: translateX(0);
}

/* ---------- header (title + link) ---------- */
.esb-header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 10px 20px;
	margin-bottom: 18px;
}

.esb-header-title {
	font-size: 20px;
	font-weight: 700;
	line-height: 1.3;
	color: #0f1f2e;
}

.esb-header-link {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	font-size: 14px;
	font-weight: 600;
	line-height: 1.3;
	color: #0f1f2e;
	text-decoration: none !important;
	transition: color var(--esb-speed, 300ms) ease;
}

.esb-header-link-text {
	border-bottom: 2px solid #c4d600;
	padding-bottom: 2px;
}

.esb-header-arrow {
	width: 16px;
	height: 16px;
	flex: 0 0 auto;
	transition: transform 300ms ease;
}

a.esb-header-link:hover .esb-header-arrow {
	transform: translateX(4px);
}
