diff --git a/docs/AI_USAGE.md b/docs/AI_USAGE.md
index b5d0da3..1f831c3 100644
--- a/docs/AI_USAGE.md
+++ b/docs/AI_USAGE.md
@@ -162,6 +162,18 @@
does not, and checked the browser support and the cascade layers in the
Tailwind documentation. Claude checked lint, build and tests.
+## Element variant card (`src/components/ui/`, `src/lib/difficulty.ts`)
+
+- **Tool:** GitHub Copilot
+- **What the team did:** Specified a reusable element card and difficulty
+ badge, including the letter-to-value display, the existing navy palette,
+ accessible labeling, and a sample catalog image.
+- **What GitHub Copilot did:** Added the card primitives, a difficulty badge,
+ the shared A–J value mapping, and a sample element-variant card. The title
+ uses an explicit native heading level and the description uses a paragraph.
+- **Review:** The team refined the layout, colors, difficulty display, and
+ accessibility semantics during review.
+
## Missing fields in the GraphQL schema (`backend/src/schema.graphql`, `docs/API.md`)
- **Tool:** Claude Code, and Claude for the research.
diff --git a/src/components/ui/DifficultyBadge.tsx b/src/components/ui/DifficultyBadge.tsx
new file mode 100644
index 0000000..2daf98e
--- /dev/null
+++ b/src/components/ui/DifficultyBadge.tsx
@@ -0,0 +1,37 @@
+import { cn } from 'cn'
+import { getDifficultyValue } from '@/lib/difficulty'
+
+export default function DifficultyBadge({
+ difficulty,
+}: {
+ difficulty: string | number
+}) {
+ const letter =
+ typeof difficulty === 'string' ? difficulty.toUpperCase() : undefined
+ const value = letter ? getDifficultyValue(letter) : undefined
+ const displayDifficulty = value !== undefined ? letter : difficulty
+
+ return (
+
+ {/* The hidden labels sit inside the same span as their value, so a
+ screen reader reads "Difficulty B, Value 0.2" once. No title: it
+ would be read a second time, and a tooltip only works with a mouse. */}
+
+ Difficulty
+ {displayDifficulty}
+ {value !== undefined && ,}
+
+ {value !== undefined && (
+
+ Value
+ {value.toFixed(1)}
+
+ )}
+
+ )
+}
diff --git a/src/components/ui/ElementVariants.tsx b/src/components/ui/ElementVariants.tsx
new file mode 100644
index 0000000..50453e8
--- /dev/null
+++ b/src/components/ui/ElementVariants.tsx
@@ -0,0 +1,28 @@
+import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
+import DifficultyBadge from '@/components/ui/DifficultyBadge'
+import elementImage from '../../../data/images/BB/BB-1.101-a.webp'
+
+const ElementVariant = () => {
+ return (
+ Element description goes here.
+