Files
orca/config/oxlint-dead-classes.json
Neil b61a2347b9 feat(design-system): gate renderer UI with @shadcn/lint (#20731)
* feat(design-system): gate renderer UI with @shadcn/lint

Wires shadcn-ui/lint's Oxlint plugin into the two places this repo already
ratchets: the changed-lines PR gate for rules the renderer can't satisfy
today, and `pnpm lint` for the one that is already at zero.

- config/oxlint-design-system.json: no-restyle (layout allowed),
  no-raw-colors, require-static-classes -- scoped to src/renderer/**/*.tsx,
  run over added lines only. Measured at 10 findings across the last 60
  commits (771 changed files), so it holds the line without a migration.
- config/oxlint-dead-classes.json: no-unknown-classes repo-wide, with the
  renderer's plain-CSS hook namespaces allow-listed. Now at zero.
- no-inline-styles and no-arbitrary-values stay off; STYLEGUIDE says why.

Fixes the three live bugs the linter found:

- `--editor-surface` never reached `@theme inline`, so `bg-editor-surface`
  generated no CSS -- 12 editor/artifact/notebook panes fell through to the
  page background instead of #1e1e1e in dark mode.
- `scrollbar-none` is not a Tailwind utility and was declared nowhere, so
  the remote file browser breadcrumbs showed the scrollbar they meant to
  hide. Declared as a real `@utility`.
- Notebook markdown cells used `markdown-preview-body`, which no stylesheet
  defines; the styled class is `markdown-body`. They rendered unstyled.

* ci: run the dead-class gate in PR CI

`pnpm lint` gained check:dead-classes, and pr-workflow-lint-parity requires
every `pnpm lint` step to have a matching step in pr.yml.

* fix(notebook): keep markdown theme selectors working
2026-09-14 17:52:21 -07:00

78 lines
1.9 KiB
JSON

{
"$schema": "../node_modules/oxlint/configuration_schema.json",
"plugins": [],
"categories": {
"correctness": "off",
"suspicious": "off",
"pedantic": "off",
"perf": "off",
"style": "off",
"restriction": "off",
"nursery": "off"
},
"jsPlugins": [
{
"name": "shadcn",
"specifier": "@shadcn/lint"
}
],
"settings": {
"shadcn": {
"note": "See docs/STYLEGUIDE.md for the role each token and primitive plays."
}
},
"rules": {},
"overrides": [
{
"files": ["**/src/renderer/**/*.tsx"],
"rules": {
"shadcn/no-unknown-classes": [
"error",
{
"allow": [
"agent-map-*",
"comment-md-*",
"compact-agent-*",
"feature-wall-*",
"is-*",
"markdown-annotation-*",
"markdown-body",
"markdown-dark",
"markdown-doc-link*",
"markdown-light",
"markdown-preview",
"markdown-preview-search*",
"markdown-preview-shell",
"markdown-review-*",
"markdown-toc-*",
"mobile-browser-driver-banner",
"mobile-driver-banner",
"native-chat-*",
"orca-*",
"pdfViewer",
"popover-scroll-content",
"popover-wheel-scroll",
"ravpr-*",
"ravs-*",
"scrollbar-editor",
"scrollbar-sleek",
"scrollbar-sleek-lg",
"scrollbar-sleek-parent",
"toaster",
"worktree-sidebar-scrollbar",
"xterm-*"
]
}
]
}
},
{
"files": ["**/*.test.tsx"],
"rules": {
"shadcn/no-unknown-classes": "off"
}
}
],
"ignorePatterns": ["**/node_modules", "**/dist", "**/out", "cloud/**", "mobile/**"]
}