Turn on the KDS theming lint rules and move theme values out of inline styles
I maintainer di solito rispondono entro 1 giorno
@LianaHarris360 ci sta già lavorando.
Dal 22/10/2026.
Valutazione
Questa issue non è ancora stata valutata.
Descrizione
❌ This issue is not open for contribution. Visit Contributing guidelines to learn about the contributing process and how to find suitable issues.
Overview
Version 1.3.0 of eslint-plugin-kolibri adds two rules that enforce a convention Studio already follows. Theme values belong in a <style> block, through a CSS custom property, and not in an inline :style binding. The kolibri-format 3.0.1 upgrade turns both rules off. This issue turns them on and clears what they report.
Autofix does most of the work, which applies --write without help. It takes 213 problems in 81 files down to 10.
Complexity: Medium
Target branch: unstable
Context
These rules read theme names through kolibri-css-variables, which reads them from the Kolibri Design System. Measured against Studio's frontend with the 3.0.1 toolchain:
| Rule | Before | After autofix |
|---|---|---|
kolibri/vue-no-theme-accessor-in-inline-styles |
155 in 63 files | 10 |
kolibri/vue-no-theme-tokens-in-v-bind |
58 in 18 files | 0 |
The 10 that survive autofix split two ways.
Eight are template literals in the shape of `1px solid ${$themeTokens.fineLine}`. For these the rule offers a suggestion and not a fix, and kolibri-format never applies suggestions. Each one is a small hand edit.
Two have no mechanical answer:
contentcuration/contentcuration/frontend/settings/pages/Storage/SubscriptionCard.vue:30uses$themePalette.green.v_700.contentcuration/contentcuration/frontend/shared/views/QTIEditor/components/InteractionSection/index.vue:6uses$themePalette.red.v_700.
The Kolibri Design System 5.10.0 emits v50 through v600 for the green and red ramps. The grey ramp goes higher. There is no --palette-green-v700 to move to. Studio uses 29 palette paths and 15 token paths in total, and these two are the only ones without a variable.
Studio already has 73 v-bind() calls in style blocks across 18 files. They survive stylelint because the new configuration sets value-keyword-case to ['lower', { ignoreFunctions: ['v-bind'] }] and because the argument is quoted, as in v-bind('$themeTokens.fineLine'). If the argument is not quoted, the stylelint autofix lowercases the expression and breaks the binding without a warning. Quote the argument of every new v-bind() added.
The Change
- The two
v_700values need a decision before the rest of the work starts. The three potential paths:- Move both to the nearest shade that exists,
v600. That changes the color on a billing card and in the QTI editor, so it needs design sign off. - Keep the JavaScript accessors behind a disable comment that links a request to the Kolibri Design System for a
v700shade. - Make that request first and wait for it.
- Move both to the nearest shade that exists,
- The pull request description should include which path was taken and why.
- The two rules must come back on in
eslint.config.mjs, with no exemption except what thev_700decision needs. - The eight template literal sites will need to be manually fixed, the rule suggestion will show the shape.
- RTLCSS can flip a directional property in a style block. RTLCSS cannot flip one in an inline style. Check that no directional property changed meaning in right to left layout.
- The work must not change how anything looks, apart from what the
v_700decision forces.
How to Get There
Both v_700 sites are reachable in a running development server:
SubscriptionCard.vueis on Settings, then Storage.InteractionSection/index.vueis in the QTI editor. Open a channel, then edit an exercise.
Take a screenshot of each one before and after if the decision changes the shade.
Out of Scope
kolibri/vue-no-rtl-breaking-inline-styles. It covers related ground, but kolibri-format does not enable it, and it has not been measured against Studio.- The other rules that the kolibri-format upgrade turned off:
tests-no-hardcoded-strings,vue/no-restricted-static-attribute,vue/no-bare-strings-in-template,vuejs-accessibility, andjsdoc. - Restyling any component.
Acceptance Criteria
General
-
eslint.config.mjsenableskolibri/vue-no-theme-accessor-in-inline-stylesandkolibri/vue-no-theme-tokens-in-v-bind. -
pnpm run lint-frontendreports 0 problems for both rules. - The only disable comments for these rules are the ones the
v_700decision requires, and each one explains itself. - Every
v-bind()argument added by this work is quoted. - No raw color value entered the code. Every replacement resolves to a Kolibri Design System token or palette variable.
- The pull request records the
v_700decision and its reason.
Accessibility and i18n
- If a shade changed, text contrast at that site still meets WCAG 2.2 AA.
- Both
v_700components render correctly in right to left layout. - No directional property moved into a style block in a way that changes right to left behavior.
Testing
-
pnpm testpasses. -
pre-commit run --all-filespasses, and a second run changes no file. - Settings, then Storage, and the QTI exercise editor look unchanged, or changed only as the recorded decision intends.
Testing
pnpm run lint-frontend
pre-commit run --all-files
pnpm test
Then load the application. Visit both v_700 sites in left to right and right to left layout. Open a sample of the 61 files that autofix rewrote and look for visual change.
References
.stylelintrc.jsturnscsstree/validatoroff, so the newignoreValueoption in that rule does not apply here.
AI usage
I measured these counts myself by running the kolibri-format 3.0.1 toolchain against Studio's frontend from a scratch install. I used Claude Code to draft the issue from those results. I checked its claims about v-bind quoting and the stylelint configuration against .stylelintrc.js and the existing call sites myself.
- Lingua principale
- Python
- Stelle
- 213
- Fork
- 314
- Merge medio
- 2g 20h
- PR unite (30g)
- 65
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di learningequality/studio
-
Set unpublishable: true on PublishedChange by construction to simplify handleMaxRevs predicateApertaDEV: frontend P3 - low
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
learningequality/studio#5868 ·
I maintainer di solito rispondono entro 1 giorno
-
TAG: tech update / debt
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
learningequality/studio#2245 ·
I maintainer di solito rispondono entro 1 giorno
-
Upgrade kolibri-format to 3.0.1 and migrate ESLint to flat configForse già presa @LianaHarris360 l’ha presa 1 giorno fa. Apertadependencies DEV: frontend P1 - important
learningequality/studio#6328 · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
bug DEV: frontend P0 - critical
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
learningequality/studio#6327 · 1 commento · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 3/5 1-2 giorni Idoneità per principianti 25/100
learningequality/studio#6326 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di learningequality/studio
Issue simili
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
fossasia/visdom-dev#77 ·
I maintainer di solito rispondono entro 4 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
aws-cloudformation/cfn-lint#4890 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
volcengine/OpenViking#6521 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 77/100
AstrBotDevs/AstrBot#10720 ·
I maintainer di solito rispondono entro 1 giorno