Adds a local ESLint plugin (web/eslint-local/) with three custom rules
implementing the preventive guardrails from docs/ui/UI_AUDIT.md §5:
- bytelyst-trading/truncate-needs-title
flags JSX elements using Tailwind 'truncate' / 'line-clamp-*' /
'text-ellipsis' without a paired title= or aria-label= (Pattern E)
- bytelyst-trading/grid-needs-minmax
flags gridTemplateColumns string values with bare Nfr tracks not
wrapped in minmax(0, ...). Catches both literal and template-string
forms; verifies *every* fr is wrapped, not just one (Pattern F)
- bytelyst-trading/no-button-with-stacked-children
flags <Button> from @bytelyst/ui wrapping 2+ block children. The
Button primitive applies whitespace-nowrap + fixed h-{size} which
collapses stacked content; recommends native <button class="card-button">
(Pattern A)
All wired into eslint.config.js as 'warn' (not error) so existing code
isn't broken; new violations show up immediately.
Also fixes the two bare-Nfr grids the new rule caught:
- components/strategy/CodeStrategyEditor.tsx :270 — repeat(5, 1fr)
- views/ScreenerView.tsx :142 — '100px 1fr 90px ...'
eslint src/ now reports zero bytelyst-trading/* warnings.
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
19 lines
611 B
JavaScript
19 lines
611 B
JavaScript
// @ts-check
|
|
/**
|
|
* Local ESLint plugin for the trading web app.
|
|
*
|
|
* Rules implement the preventive guards from docs/ui/UI_AUDIT.md §5.
|
|
* Wired into eslint.config.js as plugin "bytelyst-trading".
|
|
*/
|
|
import truncateNeedsTitle from './rules/truncate-needs-title.js';
|
|
import gridNeedsMinmax from './rules/grid-needs-minmax.js';
|
|
import noButtonWithStackedChildren from './rules/no-button-with-stacked-children.js';
|
|
|
|
export default {
|
|
rules: {
|
|
'truncate-needs-title': truncateNeedsTitle,
|
|
'grid-needs-minmax': gridNeedsMinmax,
|
|
'no-button-with-stacked-children': noButtonWithStackedChildren,
|
|
},
|
|
};
|