@@ -6,7 +6,7 @@ About XBlock Asides
66
77.. tags :: developer, concept
88
9- An XBlock aside is a class that injects content into the rendered views of
9+ An XBlock Aside is a class that injects content into the rendered views of
1010existing XBlocks without modifying those XBlocks. Asides let you add behavior,
1111data, and UI elements to many XBlock instances at once, across XBlock types you
1212do not own, while preserving the host XBlock's code, fields, and Open Learning
@@ -19,15 +19,15 @@ XML (OLX) representation.
1919What an Aside Is
2020****************
2121
22- An aside is a Python class that subclasses :class: `~xblock.core.XBlockAside `,
22+ An Aside is a Python class that subclasses :class: `~xblock.core.XBlockAside `,
2323declares one or more view-injection methods using the
2424:func: `~xblock.core.XBlockAside.aside_for ` decorator, and is registered with
2525the platform through a Python entry point in the ``xblock_asides.v1 `` group.
2626When the platform renders an XBlock view, the runtime collects every
27- applicable aside , invokes its matching aside view, and appends the resulting
27+ applicable Aside , invokes its matching Aside view, and appends the resulting
2828fragments to the host XBlock's rendered fragment.
2929
30- An aside is **not ** a child XBlock. It does not appear in the course outline,
30+ An Aside is **not ** a child XBlock. It does not appear in the course outline,
3131it does not have its own URL, and it cannot be added to a course like a
3232regular block. It exists only in relation to a host block, and its lifecycle
3333is bound to that host block's lifecycle.
@@ -42,7 +42,7 @@ you have three options:
4242
4343#. Fork the XBlock and modify it directly.
4444#. Replace the XBlock with a new XBlock that wraps the original.
45- #. Attach an aside to the existing XBlock.
45+ #. Attach an Aside to the existing XBlock.
4646
4747The first two options carry significant costs. Forking creates a parallel
4848codebase that must be maintained against upstream changes. Replacing the
@@ -51,11 +51,11 @@ it does not scale when you want to enhance many different XBlock types in the
5151same way.
5252
5353Asides solve this by externalizing the enhancement. The host XBlock is not
54- modified. The same aside can apply to a Video block, a Problem block, or any
54+ modified. The same Aside can apply to a Video block, a Problem block, or any
5555other block type, by overriding a single classmethod. Asides can serialize
5656their own scoped fields during course import and export.
5757
58- Reach for an aside when all of the following are true:
58+ Reach for an Aside when all of the following are true:
5959
6060* You want to enhance one or more existing XBlock types without forking them.
6161* The enhancement is conceptually layered on top of the block, not a
@@ -75,13 +75,13 @@ How an Aside Relates to Its Host Block
7575**************************************
7676
7777The runtime maintains a many-to-many relationship between asides and host
78- blocks at runtime, but each aside instance is bound to exactly one host block
78+ blocks at runtime, but each Aside instance is bound to exactly one host block
7979during a single render. The relationship is established in three stages.
8080
8181Per-Block Filtering
8282===================
8383
84- For each candidate aside type, the runtime instantiates the aside and asks
84+ For each candidate Aside type, the runtime instantiates the Aside and asks
8585it whether it should apply to this specific block by calling its
8686:meth: `~xblock.core.XBlockAside.should_apply_to_block ` classmethod. The
8787default implementation returns ``True ``. Real-world asides almost always
@@ -91,13 +91,13 @@ contexts, or feature flags.
9191Rendering and Layout
9292====================
9393
94- For each aside that survives filtering, the runtime invokes the aside method
94+ For each Aside that survives filtering, the runtime invokes the Aside method
9595that was decorated with ``@XBlockAside.aside_for(view_name) `` for the view
96- being rendered. The aside method returns a ``Fragment ``, the runtime wraps
96+ being rendered. The Aside method returns a ``Fragment ``, the runtime wraps
9797that fragment with identifying markup, and the runtime appends the wrapped
9898fragment to the host block's rendered output. A runtime can override
9999:meth: `~xblock.runtime.Runtime.layout_asides ` to control where and how the
100- aside fragments are placed.
100+ Aside fragments are placed.
101101
102102Why Asides Are Worth the Trouble
103103********************************
@@ -109,31 +109,31 @@ remain useful, come from the production deployments that depend on them.
109109Multiple Block Types, One Implementation
110110========================================
111111
112- A single aside class can decorate Video blocks, Problem blocks, and any
112+ A single Aside class can decorate Video blocks, Problem blocks, and any
113113other block type the author chooses, by checking ``block.category `` or
114114``block.scope_ids.block_type `` inside ``should_apply_to_block ``. The MIT
115- Open Learning chat aside , for example, attaches an "AskTIM" chat button to
115+ Open Learning chat Aside , for example, attaches an "AskTIM" chat button to
116116both Video and Problem blocks from a single class, with one entry point.
117117Without asides, the same outcome would require either two parallel forks
118118or replacement blocks for both types.
119119
120120Course Author Control
121121=====================
122122
123- An aside can declare its own scoped fields, just like an XBlock. By exposing
124- those fields in an author view, an aside gives course authors a UI to enable
123+ An Aside can declare its own scoped fields, just like an XBlock. By exposing
124+ those fields in an author view, an Aside gives course authors a UI to enable
125125or disable the enhancement on a per-block basis. The settings are stored
126- under the aside 's own scope, not the host block's, so they are preserved
126+ under the Aside 's own scope, not the host block's, so they are preserved
127127across exports and imports without any change to the host block's data
128128model.
129129
130130OLX Export and Import
131131=====================
132132
133- When a course is exported to OLX, the platform serializes each aside as an
134- XML child element under its host block, named after the aside 's entry point
133+ When a course is exported to OLX, the platform serializes each Aside as an
134+ XML child element under its host block, named after the Aside 's entry point
135135name. On import, the runtime reconstitutes the asides automatically. This
136- means an aside -enhanced course is portable, with limitations described below.
136+ means an Aside -enhanced course is portable, with limitations described below.
137137
138138Real-World Examples
139139*******************
@@ -144,21 +144,21 @@ do.
144144Rapid Response XBlock
145145=====================
146146
147- The `rapid-response-xblock `_ from MIT Open Learning is a single aside that
147+ The `rapid-response-xblock `_ from MIT Open Learning is a single Aside that
148148applies to Problem blocks. It overlays an instructor-only control on the
149149problem in the LMS that lets a live instructor open and close response
150150windows during a lecture, and it renders a real-time chart of student
151151responses. Course authors enable it per problem in Studio. The repository
152- name calls it an "xblock" but the implementation is purely an aside .
152+ name calls it an "xblock" but the implementation is purely an Aside .
153153
154154Open Learning Chat Aside
155155========================
156156
157- The `ol-openedx-chat `_ aside , also from MIT Open Learning, attaches an
157+ The `ol-openedx-chat `_ Aside , also from MIT Open Learning, attaches an
158158"AskTIM" chat button to Video and Problem blocks. The button opens a
159159context-aware chat drawer that streams messages to a backend large language
160160model, passing block-specific context such as a video transcript identifier
161- or a problem's siblings. A single aside class, registered as one entry
161+ or a problem's siblings. A single Aside class, registered as one entry
162162point, handles both block types and uses ``should_apply_to_block `` to gate
163163on a course-level waffle flag and per-course settings.
164164
@@ -169,15 +169,15 @@ Asides are a real, working feature in production deployments, but the
169169ecosystem around them is incomplete. The list below is drawn from the
170170state of the codebase as of the Sumac release and from a 2025 Open edX
171171Conference talk by Peter Pinch of MIT Open Learning. Read it before
172- committing to an aside -based design.
172+ committing to an Aside -based design.
173173
174174No Authoring Story in the Course Authoring MFE
175175==============================================
176176
177- The Studio author view for an aside is rendered by the legacy course
177+ The Studio author view for an Aside is rendered by the legacy course
178178authoring frontend. The current Authoring micro-frontend has no
179- defined location to display aside author UI. If your project depends on the
180- new MFE for authoring, plan to render the aside 's author UI through a
179+ defined location to display Aside author UI. If your project depends on the
180+ new MFE for authoring, plan to render the Aside 's author UI through a
181181different mechanism, or accept that authors will use the legacy Studio for
182182this part of the workflow.
183183
@@ -186,33 +186,33 @@ Not All XBlocks Round-Trip Through OLX
186186
187187OLX export and import for asides depends on the host XBlock cooperating
188188with the export process. Some XBlocks, including ORA2, do not preserve
189- aside data through their export and import paths. If your aside must
189+ Aside data through their export and import paths. If your Aside must
190190survive a course export and re-import on a course that uses one of these
191191blocks, test the round trip end to end before depending on it.
192192
193193Multiple Asides on a Single Block Are Not Reliable
194194==================================================
195195
196- The runtime supports multiple aside types decorating the same block in
196+ The runtime supports multiple Aside types decorating the same block in
197197principle, but interactions between asides on the same block are not
198198well-tested. Two asides that both decorate ``student_view `` on the same
199199block may render correctly in isolation and break when combined. If you
200- need this, build a single aside that composes both behaviors rather than
200+ need this, build a single Aside that composes both behaviors rather than
201201relying on two independent asides to coexist.
202202
203203JavaScript Library Loading Is Limited
204204=====================================
205205
206206Asides use the same fragment-based JavaScript loading mechanism as XBlocks,
207- which assumes a single set of static assets. If your aside needs a JS
207+ which assumes a single set of static assets. If your Aside needs a JS
208208library that is not already loaded by the host page, you must add it
209209through the fragment, and you must handle ordering and conflicts yourself.
210- There is no shared aside -level mechanism for declaring library dependencies.
210+ There is no shared Aside -level mechanism for declaring library dependencies.
211211
212212Where to Go Next
213213****************
214214
215- If you are ready to build an aside , start with
215+ If you are ready to build an Aside , start with
216216:ref: `XBlock Aside Quickstart `. If you already have a target XBlock in mind
217217and want a step-by-step recipe, read :ref: `Add an XBlock Aside `. For the
218218complete list of classes, decorators, methods, and entry points, consult
@@ -228,10 +228,10 @@ complete list of classes, decorators, methods, and entry points, consult
228228 The complete API surface for ``XBlockAside `` and its runtime hooks.
229229
230230 :ref: `Add an XBlock Aside ` (how-to)
231- A step-by-step recipe for adding an aside to existing XBlocks.
231+ A step-by-step recipe for adding an Aside to existing XBlocks.
232232
233233 :ref: `XBlock Aside Quickstart ` (quickstart)
234- A beginner-friendly walkthrough from zero to a running aside .
234+ A beginner-friendly walkthrough from zero to a running Aside .
235235
236236 :ref: `Hooks Extension Framework ` (concept)
237237 An alternative extension mechanism for non-view-based behaviors.
0 commit comments