Turn on the KDS theming lint rules and move theme values out of inline styles
メンテナーはふだん 1 日以内に返信
@LianaHarris360 がすでに取り組んでいます。
2026年10月22日 から。
評価
この issue はまだ評価されていません。
説明
❌ 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.
- 主要言語
- Python
- スター
- 213
- フォーク
- 314
- 平均マージ
- 2日 20時間
- マージ済み PR(30日)
- 65
環境構築
- Dockerfile または Docker Compose ファイルあり
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
learningequality/studio のほかの issue
-
DEV: frontend P3 - low
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
learningequality/studio#5868 ·
メンテナーはふだん 1 日以内に返信
-
TAG: tech update / debt
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
learningequality/studio#2245 ·
メンテナーはふだん 1 日以内に返信
-
Upgrade kolibri-format to 3.0.1 and migrate ESLint to flat config対応中かも @LianaHarris360 が 1 日前に担当しました。 オープンdependencies DEV: frontend P1 - important
learningequality/studio#6328 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
bug DEV: frontend P0 - critical
難易度 4/5 3〜5日 初心者へのやさしさ 25/100
learningequality/studio#6327 · コメント 1 件 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 3/5 1〜2日 初心者へのやさしさ 25/100
learningequality/studio#6326 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
learningequality/studio の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
aws-samples/sample-per-model-bedrock#464 ·
メンテナーはふだん 1 日以内に返信
-
lesson-submission pending-review
難易度 2/5 1〜3時間 初心者へのやさしさ 67/100
Ikalus1988/MisakaNet#3789 ·
メンテナーはふだん 1 日以内に返信
-
Python Volcengine provider returns failures instead of raising them対応中かも @Ricardo-M-L が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 79/100
agent-infra/sandbox#248 ·
-
[Bug] cloud JSON directory loading assumes a Key field in fsspec listings対応中かも @Ricardo-M-L が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
hiyouga/LlamaFactory#10910 ·
メンテナーはふだん 1 日以内に返信
-
Bundled uv is never updated and trusts the compromised eMudhra certificates対応中かも @FabienDanieau が今日担当しました。 オープンbug
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100