Back to Widget Patterns
v2.4Interactive Tooling

Diagnostic Quiz Assessment

Generic scored quiz framework. Four question types (single-select, multi-select, scale, text). Configurable scoring with optional result-tier interpretation. The foundation for specialized assessments.

Live preview

Rendered with real component code. Each example demonstrates a documented variant.

AI readiness quiz

How ready is your team for AI tooling?

Three questions. About 90 seconds.

Design-system maturity assessment

Where does your design system stand?

Assess token coverage, component breadth, and documentation quality in three steps.

React props

Configure the component via props in React or via attributes in HTML.

PropTypeDefaultDescription
titlestringundefinedQuiz heading shown on the landing screen
descriptionstringundefinedSupporting copy below the title
questionsQuestion[]requiredQuiz questions array; supports single-select, multi-select, scale, and text types
resultTiersResultTier[]undefinedTier definitions for score interpretation ({ minScore, maxScore, title, description, recommendation? })
scoring(answers) => numbersum of option scoresCustom scoring function; defaults to summing option scores and scale values
onComplete(result: QuizResult) => voidundefinedCalled when the quiz completes with the final score, matched tier, and raw answers
startButtonLabelstring"Start"Landing screen button text
nextButtonLabelstring"Next"Progress button text
submitButtonLabelstring"Submit"Final-question button text
restartButtonLabelstring"Retake"Restart button shown on the results screen
showProgressbooleantrueShow step indicator and progress bar
allowBackbooleantrueShow back button between questions
classNamestringundefinedExtra class applied to the root element

HTML usage

The HTML variant uses the same shared styles and class names. Drop into any stack.

<link rel="stylesheet" href="path/to/diagnostic-quiz-assessment/styles.css">

<!-- Landing screen -->
<section class="dqa" id="my-quiz">
  <h2 class="dqa__title">How ready is your team for AI tooling?</h2>
  <p class="dqa__description">Answer 3 short questions to find out.</p>
  <div class="dqa__actions">
    <button class="dqa__button dqa__button--primary" type="button" id="dqa-start">Start</button>
  </div>
</section>

<!-- Question screen (single-select) -->
<section class="dqa" id="my-quiz" hidden>
  <p class="dqa__progress-label" aria-live="polite">Question 1 of 3</p>
  <div class="dqa__progress" role="progressbar" aria-valuenow="1" aria-valuemin="1" aria-valuemax="3">
    <div class="dqa__progress-fill" style="width: 33%"></div>
  </div>
  <h2 class="dqa__question">How large is your team?</h2>
  <div class="dqa__options" role="radiogroup">
    <label class="dqa__option">
      <input type="radio" name="team-size" value="solo">
      <span class="dqa__option-label">Just me</span>
    </label>
    <label class="dqa__option">
      <input type="radio" name="team-size" value="small">
      <span class="dqa__option-label">2-10 people</span>
    </label>
  </div>
  <div class="dqa__actions">
    <button class="dqa__button dqa__button--primary" type="button">Next</button>
  </div>
</section>

<script>
  // Replace the JS state machine with your own scoring logic.
  // See the React source for the full single-select / multi-select /
  // scale / text answer collection and defaultScoring implementation.
  document.getElementById('dqa-start').addEventListener('click', function() {
    // advance to first question screen
  });
</script>

Customization

Override these CSS custom properties to integrate the component into your brand.

.dqa {
  --dqa-bg: var(--brand-surface, white);
  --dqa-text-color: var(--brand-ink, #102542);
  --dqa-muted-color: rgba(16, 37, 66, 0.6);
  --dqa-accent: var(--brand-accent, #1e5fcf);
  --dqa-progress-bg: rgba(0, 0, 0, 0.06);
  --dqa-progress-fill: var(--dqa-accent);
  --dqa-option-border: rgba(0, 0, 0, 0.12);
  --dqa-option-bg: white;
  --dqa-option-bg-selected: rgba(30, 95, 207, 0.08);
  --dqa-option-border-selected: var(--dqa-accent);
  --dqa-button-bg: var(--dqa-accent);
  --dqa-button-text: white;
  --dqa-button-bg-hover: color-mix(in srgb, var(--dqa-accent) 90%, black);
  --dqa-radius: 1rem;
  --dqa-section-padding: 2rem;
  --dqa-gap: 1rem;
}