Closes the first two PRD screens with shadcn primitives (button, input, card, badge) and the standing TDD-first discipline. Landing (/) — PRD §5.1 Screen 0 - Sticky nav with workshop CTA and lecture link - Hero with eyebrow badge, headline, sub, dual CTA + 4-stat strip - Programme table covering all 7 day-of moves (13:00 → 19:00) - Speaker card for Omar Sobh + RedClaw Systems - 3-card tech stack (Rust on Cortex-M4 · Anthropic+Groq · Web Serial) - Prerequisites + closing CTA - 5 tests, all passing Team Registration (/workshop) — PRD §5.1 Screen 1 - PhaseStrip across top, Phase 1 badge eyebrow - Team name + member chips (Enter to add, x to remove, capped at 5) - KitSelector 5x3 grid of KIT-01..KIT-15 with aria-pressed - Mock device-connect button (real Web Serial deferred to next slice) - ?kit= URL param pre-selects kit (QR sticker entrypoint) - Proceed gated until name + 1+ member + device connected - On Proceed: marks phases.reg = true, navigates to /workshop/setup - 6 tests, all passing MemberChips (5 tests) + KitSelector (3 tests) extracted as reusable components with own test coverage. Scoped react-refresh/only-export-components off for src/components/ui/** (shadcn vendored primitives export their cva variants alongside the component — standard project pattern). 23/23 tests green · build 286KB JS, 90KB gzip · lint clean.
35 lines
907 B
JavaScript
35 lines
907 B
JavaScript
import js from '@eslint/js'
|
|
import globals from 'globals'
|
|
import reactHooks from 'eslint-plugin-react-hooks'
|
|
import reactRefresh from 'eslint-plugin-react-refresh'
|
|
import tseslint from 'typescript-eslint'
|
|
import { defineConfig, globalIgnores } from 'eslint/config'
|
|
|
|
export default defineConfig([
|
|
globalIgnores(['dist', 'coverage', 'node_modules']),
|
|
{
|
|
files: ['**/*.{ts,tsx}'],
|
|
extends: [
|
|
js.configs.recommended,
|
|
tseslint.configs.recommended,
|
|
reactHooks.configs.flat.recommended,
|
|
reactRefresh.configs.vite,
|
|
],
|
|
languageOptions: {
|
|
globals: { ...globals.browser, ...globals.node },
|
|
},
|
|
rules: {
|
|
'max-lines': [
|
|
'error',
|
|
{ max: 1300, skipBlankLines: false, skipComments: false },
|
|
],
|
|
},
|
|
},
|
|
{
|
|
files: ['src/components/ui/**/*.{ts,tsx}'],
|
|
rules: {
|
|
'react-refresh/only-export-components': 'off',
|
|
},
|
|
},
|
|
])
|