TBX Docs
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:

VariablePurposeDefault
--exercise-layout-content-font-sizeFont size for content area (entries, text, etc.)24px
--exercise-layout-content-padding-xContent horizontal padding2.5rem
--exercise-layout-content-padding-yContent vertical padding2rem
--exercise-accent-colorAccent color for selected state, Check/Reset buttons, info icon, etc.#F97316
--exercise-layout-textPrimary text colorrgba(0,0,0,0.9)
--exercise-layout-text-mutedMuted text (description)rgba(0,0,0,0.65)
--exercise-layout-text-subtleSubtle 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.

On this page