---
title: "Important: A study plan category title is text, not markup"
manual: "Academic StudyPlan"
version: "main"
source: "Changelog/3.0/Important-StudyPlanCategoryTitleIsText.rst"
rendered: "2026-10-02T15:38:26+00:00"
---

# Important: A study plan category title is text, not markup {#important-study-plan-category-title-is-text}

## Description {#description}

The script of the study plan content element builds the category filter by
cloning the one list item the template renders, substituting the category's
id, colour and title into the placeholders it carries. It did that on the
markup as a **string** and parsed the result with `innerHTML`, so a
category title containing `<` reached the page as markup rather than as
text - and a title is written by an editor in the backend.

The substitution walks the cloned element's attributes and text nodes now.
Neither can turn a title into markup, whatever it contains.

The colour is treated the same way, for a second reason: it is written into
`style="--category-color: …"`, where a `;` would start a
declaration of its own. Only the shapes a colour field can produce are passed
through - a hexadecimal value, a plain keyword, or an `rgb()` /
`rgba()` function. Anything else leaves the category without a colour,
which is what an empty value already meant.

## Impact {#impact}

A category whose title contains no `<`, `&` or quote renders
exactly as before. A title that does now renders as the text the editor typed,
on the filter button and in its `aria-label`.

## Affected Installations {#affected-installations}

Every installation that renders the study plan content element with categories
on its modules. Nothing has to be done on update.

An installation that deliberately put markup in a category title to style the
filter button loses it, and should style `.filter button` \- or the
`data-category-id` of that one category - instead.
