Maka's frontend styling combines Astryx, @maka/ui product compositions, and renderer surface CSS. Cascade order is an explicit contract rather than an implementation detail.
apps/desktop/src/renderer/styles.css is an entry file only.@import and other top-level orchestration statements.apps/desktop/src/renderer/styles/**/*.css.maka-tokens.css and reference-shell.css are transitional exceptions. Do not add new surface rules to them.@maka/ui selectors use the kebab-case .maka-* dialect.styles/settings/** surface uses camelCase .settings* selectors. Keep that dialect for settings-local selectors instead of mixing both forms within one surface.@layer base or @layer components where practical.@import "./file.css" layer(components) only when the build chain explicitly supports it.@import inside an @layer block.Astryx reset and component layers come first; Maka base tokens and product components come later. Keep layer ownership at the closest existing seam instead of adding a higher-priority compatibility layer.
!important!important is allowed by default only for accessibility helpers such as .maka-visually-hidden, and for reduced-motion or e2e-fixture overrides.Justified: comment.apps/desktop/src/renderer/maka-tokens.css./* local: ... */ comment.scripts/check-dead-css.mjs scans apps/desktop/src/renderer/styles/**/*.css and apps/desktop/src/renderer/reference-shell.css.scripts/check-dead-css-baseline.json only after review confirms the class-count change.The rules above are conventions enforced in review, plus the fast scripts that survive as their own commands — check-dead-css, check-a11y, check-copy, check-console. The source-scanning contract suite that used to re-assert them as tests is gone: it charged every refactor a rewrite of its own guards while catching only what a linter should.
scripts/check-*.mjs (fast, one job, no build) rather than a test that regexes the source tree.When changing renderer CSS:
styles.css into surface files.@maka/ui or the matching renderer surface.!important only after primitive and layer ownership is stable.Button, Textarea, and EmptyState overrides at the component API seam instead of accumulating renderer specificity.