diff --git a/apps/website/src/app/global.css b/apps/website/src/app/global.css
index 168efc34..7e804111 100644
--- a/apps/website/src/app/global.css
+++ b/apps/website/src/app/global.css
@@ -188,17 +188,44 @@ html {
.docs-prose td { padding: 0.5rem 0.75rem; border-bottom: 1px solid rgba(0, 64, 144, 0.08); color: #555770; }
.docs-prose td code { font-size: 0.8em; }
-/* UI primitive — Card hover.
- * Hoverable cards are virtually always links; pointer is the right default.
+/* UI primitive — Card.
+ * Resting background / border / shadow live here (not inline on the element)
+ * so the :hover rules below can override border-color and box-shadow. Inline
+ * styles beat any stylesheet :hover rule, which previously left the lift
+ * rendering only the transform. See components/ui/Card.tsx. */
+[data-ui="card"] {
+ background: var(--color-surface);
+ border: 1px solid var(--color-border);
+ box-shadow: var(--shadow-sm);
+ transition: box-shadow 160ms ease, border-color 160ms ease, transform 160ms ease;
+}
+[data-ui="card"][data-surface="tinted"] {
+ background: var(--color-surface-tinted);
+}
+[data-ui="card"][data-surface="dim"] {
+ background: var(--color-surface-dim);
+}
+/* Accent-filled cards (e.g. docs backend / generative-UI cards). */
+[data-ui="card"][data-accent] {
+ background: var(--color-accent-surface);
+ border-color: var(--color-accent-border);
+}
+
+/* Hoverable cards are virtually always links; pointer is the right default.
* If a non-link gets `data-hoverable`, override inline. */
[data-ui="card"][data-hoverable] {
cursor: pointer;
}
-[data-ui="card"][data-hoverable]:hover {
+[data-ui="card"][data-hoverable]:not([data-accent]):hover {
box-shadow: var(--shadow-md);
border-color: var(--color-border-strong);
transform: translateY(-1px);
}
+/* Accent cards keep their accent border and gain an accent ring on hover. */
+[data-ui="card"][data-hoverable][data-accent]:hover {
+ box-shadow: 0 0 0 3px var(--color-accent-glow), var(--shadow-md);
+ transform: translateY(-1px);
+}
@media (prefers-reduced-motion: reduce) {
[data-ui="card"][data-hoverable]:hover {
transform: none;
diff --git a/apps/website/src/components/docs/DocsPrevNext.tsx b/apps/website/src/components/docs/DocsPrevNext.tsx
index 41cdfd95..91394daa 100644
--- a/apps/website/src/components/docs/DocsPrevNext.tsx
+++ b/apps/website/src/components/docs/DocsPrevNext.tsx
@@ -55,14 +55,9 @@ export function DocsPrevNext({ library, section, slug }: Props) {
marginBottom: 16,
}}
>
-
{prev ? (
-
+
← Previous
-
+
Next →
{
children: ReactNode;
- /** If true, applies a subtle hover lift via CSS. */
+ /** If true, applies a subtle hover lift (border + shadow + translate) via CSS. */
hoverable?: boolean;
+ /**
+ * If true, renders an accent-tinted surface + border, and — when hoverable —
+ * the hover lift uses an accent ring instead of the neutral border treatment.
+ */
+ accent?: boolean;
/** Internal padding tier. */
padding?: Padding;
/** Override the surface color. */
surface?: Surface;
}
-const SURFACE: Record
= {
- white: tokens.surfaces.surface,
- tinted: tokens.surfaces.surfaceTinted,
- dim: tokens.surfaces.surfaceDim,
-};
-
const PADDING: Record = {
md: '20px',
lg: '28px',
@@ -29,24 +28,28 @@ const PADDING: Record = {
export function Card({
children,
hoverable = false,
+ accent = false,
padding = 'md',
surface = 'white',
className,
style,
...rest
}: CardProps) {
+ // Resting background / border / shadow live in the `[data-ui="card"]`
+ // stylesheet (apps/website/src/app/global.css) — never inline — so the
+ // :hover rules can actually override border-color and box-shadow. Inline
+ // styles beat any stylesheet :hover rule, which previously left the lift
+ // rendering only the transform.
return (