---
title: "Deprecation: The study plan class selectors"
manual: "Academic StudyPlan"
version: "main"
source: "Changelog/3.0/Deprecation-StudyPlanClassSelectors.rst"
rendered: "2026-10-02T15:38:26+00:00"
---

# Deprecation: The study plan class selectors {#deprecation-study-plan-class-selectors}

## Description {#description}

The script of the study plan content element used to find every part it drives
by class name. It finds them by `data-study-plan-*` attribute now, and
reads the class selector of a part only when the attribute of that part is
nowhere in that plan:

| Attribute | Class selector of 3.0, deprecated |
| --- | --- |
| `data-study-plan` | `.academic-study-plan` |
| `data-study-plan-filter` | `.filter` |
| `data-study-plan-filter-template` | The first `<li>` inside the filter list |
| `data-study-plan-semester` | `.col` |
| `data-study-plan-semester-header` | `.header` |
| `data-study-plan-module` | `.module` |
| `data-study-plan-dialog-trigger` | `.modal-trigger` |
| `data-study-plan-dialog` | The `<dialog>` inside a module |

The fallback is per part, so markup that carries the attributes on some parts
and the classes on others works as well.

The container is the one exception: `.academic-study-plan` is read **next
to** `data-study-plan`, not instead of it. Two plans of one page can come
from different templates, and a 3.0 one must not disappear because the other
carries the attribute. It is deprecated on the same terms.

## Impact {#impact}

Nothing is logged and nothing changes for a visitor. The fallback is removed in
version 4.0; from then on markup without the attributes has no interaction at
all - no filter, no accordion, no dialogs.

## Affected Installations {#affected-installations}

Only an installation that overrides the template or a partial of the study plan
with markup of its own. The shipped markup carries the attributes.

## Migration {#migration}

Add the attributes to your markup, on the elements
[Templates](../../Templates/Index.html#templates-attributes) names. The classes may stay: they are
what the stylesheet selects, and nothing reads them once the attributes are
there.

An override that only renamed a few elements is often better replaced by an
override of the one partial it is really about - the other three then keep
coming from the extension, with everything they gain.
