ExercisesComponents
ExerciseLayout
Generic layout wrapper for exercises
Generic layout wrapper used by all exercises. Provides:
- Container — Subtle border and rounded corners
- Header — Optional icon, title, description, info with popover
- Content area — Exercise-specific UI
- Footer bar — Subtle background for Validator, Results, and other controls
Use footer for the main actions (e.g. ExerciseValidation, ExerciseResults) and rightComponent for right-aligned content (e.g. timer).
Example
import {
ExerciseLayout,
ExerciseValidation,
ExerciseResults,
} from '@bside-tech/tbx-ui/components';
import { usePickMultiExercise } from '@bside-tech/tbx-ui/hooks';
function CustomExercise() {
const { answers, setAnswer, isCorrect, check, reset } = usePickMultiExercise({
solution: ['paris'],
initial: '',
checkOn: 'manual',
});
const validated = isCorrect !== null;
return (
<ExerciseLayout
icon="🎯"
title="Capital cities"
description="Select the correct answer."
info={<span>Hint: Think European capitals</span>}
footer={
<>
<ExerciseValidation
checkOn="manual"
validated={validated}
onCheck={check}
onReset={reset}
/>
<ExerciseResults
isCorrect={isCorrect}
correctCount={isCorrect === true ? 1 : 0}
totalCount={1}
/>
</>
}
>
<div>
<button onClick={() => setAnswer(0, 'paris')}>Paris</button>
<button onClick={() => setAnswer(0, 'london')}>London</button>
</div>
</ExerciseLayout>
);
}CSS variables
All exercises use ExerciseLayout, which defines shared CSS variables scoped under .tbx-exercise-layout. Override these to theme exercises consistently:
| Variable | Purpose | Default |
|---|---|---|
--exercise-layout-content-font-size | Font size for content area (entries, text, etc.) | 24px |
--exercise-layout-content-padding-x | Content horizontal padding | 2.5rem |
--exercise-layout-content-padding-y | Content vertical padding | 2rem |
--exercise-accent-color | Accent color for selected state, Check/Reset buttons, info icon, etc. | #F97316 |
--exercise-layout-text | Primary text color | rgba(0,0,0,0.9) |
--exercise-layout-text-muted | Muted text (description) | rgba(0,0,0,0.65) |
--exercise-layout-text-subtle | Subtle text (info icon) | rgba(0,0,0,0.5) |
Exercises use --exercise-accent-color for pre-validation selected state (e.g. Yes/No buttons, crossword filled cells, ConnectPoints connected boxes). Add .dark selectors for dark mode overrides.