Conversation
…tionality - Extracted various components (HeaderTitle, KabelsalatBoard, Overlays, Rules, SocketList, etc.) into separate files for better organization. - Added PropTypes to MainMenuSocials and Rules components for type checking. - Created new overlay components (GameOverOverlay, PoweredOnOverlay, ShockOverlay) for better modularity. - Refactored plug and socket components (DcPlug, IecPlug, JackPlug, etc.) into static UI components. - Introduced SegmentedSlider component to replace existing slider implementations in VolumeSlider and BrutalFader for better accessibility and usability. - Implemented catalog effect utilities (isCatalogEffect, normalizeCatalogEffect) for improved effect validation. - Enhanced storage utility functions (safeStorage, safeStorageNoFallback) for safer localStorage operations. - Updated tests to cover new functionalities and ensure reliability across components and utilities.
Qodo reviews are paused for this user.Troubleshooting steps vary by plan Learn more → On a Teams plan? Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center? |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (10)
📝 WalkthroughSummary by CodeRabbit
WalkthroughBroad refactor switching components/hooks/scenes from useGameState to useGameSelector/useGameActions; adds storage/catalog-effect utilities, EffectTextureManager, SegmentedSlider and controlled Brutalist UI components, travel-event options, Kabelsalat subcomponents, extensive test updates/mocks, and a rewritten AUDIT_REPORT.md and symbols.json. ChangesCore selector/actions refactor, utilities, and UI/UIX updates
Sequence Diagram(s)sequenceDiagram
participant UI as UI Component / Hook
participant Selector as useGameSelector
participant Actions as useGameActions
participant Utils as storage/catalogEffect/SegmentedSlider
UI->>Selector: select state slices (player, band, gameMap, settings, etc.)
UI->>Actions: invoke dispatchers (changeScene, addToast, completeMinigame, safeStorage ops)
UI->>Utils: call safeStorageOperation, normalizeCatalogEffect, render SegmentedSlider
Actions-->>UI: state updates -> Selector-driven re-render
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related PRs
Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
|
📝 PR Kommentar-ZusammenfassungWird automatisch aktualisiert, sobald sich Kommentare ändern. |
There was a problem hiding this comment.
Code Review
This pull request refactors several UI components, including BrutalToggle, BrutalFader, and VolumeSlider, to utilize new shared primitives like SegmentedSlider and ToggleSwitch. It also introduces catalogEffectUtils for improved catalog validation and updates arrivalUtils to support configurable gig node travel events. Review feedback highlights that BrutalToggle and BrutalFader should be made controlled components to ensure state synchronization, and suggests removing redundant aria-label attributes in SegmentedSlider to improve accessibility.
There was a problem hiding this comment.
Pull request overview
This PR is primarily a maintainability refactor: it extracts reusable building blocks (a SegmentedSlider primitive, a catalogEffectUtils module, and storage wrappers), simplifies BrutalToggle/BrutalFader/VolumeSlider to delegate to those primitives, consolidates the processTravelEvents policy into a single includeGigNodes option, and removes scattered "review header" comments across many files. Several new node/UI tests are added.
Changes:
- Extract
SegmentedSlider,catalogEffectUtils(isCatalogEffect/normalizeCatalogEffect), andsafeStorage/safeStorageNoFallback/safeStorageOperationwrappers into dedicated modules, withBrutalistUI,VolumeSlider,ShopTab,upgradeCatalog,usePersistence,useLeaderboardSync,unlockManager,useMainMenu, andGameStateupdated to consume them. - Add an
includeGigNodesoption toprocessTravelEventssouseTravelLogicno longer duplicates the transport→band fallback policy inline. - Strip stale
(#1) Actual Updates: …review-style comment blocks from a large number of source files; rewriteAUDIT_REPORT.mdand refreshsymbols.json/ tests accordingly.
Reviewed changes
Copilot reviewed 74 out of 74 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| src/ui/shared/SegmentedSlider.tsx | New shared segmented slider primitive used by VolumeSlider and BrutalFader. |
| src/ui/shared/VolumeSlider.tsx | Re-implemented on top of SegmentedSlider. |
| src/ui/shared/BrutalistUI.tsx | BrutalToggle delegates to ToggleSwitch; BrutalFader delegates to SegmentedSlider with clamped values. |
| src/ui/shared/index.tsx | Exports new SegmentedSlider from the barrel. |
| src/utils/catalogEffectUtils.ts | New module centralizing isCatalogEffect/normalizeCatalogEffect. |
| src/ui/bandhq/ShopTab.tsx | Uses shared isCatalogEffect instead of local copy. |
| src/data/upgradeCatalog.ts | Uses shared normalizeCatalogEffect. |
| src/utils/storage.ts | New safeStorage, safeStorageNoFallback, and re-exported safeStorageOperation wrappers. |
| src/utils/unlockManager.ts, src/hooks/useLeaderboardSync.ts, src/scenes/mainmenu/useMainMenu.ts, src/context/GameState.tsx, src/context/usePersistence.ts | Switched storage helpers' import path to src/utils/storage. |
| src/utils/arrivalUtils.ts | Added includeGigNodes option to processTravelEvents. |
| src/hooks/useTravelLogic.ts | Collapses inline gig-node travel-event branch into a single processTravelEvents call. |
| src/hooks/useArrivalLogic.ts | Doc comment update describing default skip policy. |
| Many src/.tsx, src/.ts | Removal of stale Actual Updates: review comments; no behavior change. |
| tests/node/storage.test.js | Coverage for new safeStorage wrappers. |
| tests/node/catalogEffectUtils.test.js | Coverage for new isCatalogEffect. |
| tests/node/arrivalUtils.test.js | Coverage for new includeGigNodes option. |
| tests/ui/VolumeSlider.test.jsx, tests/ui/ToggleSwitch.test.jsx | Smoke tests asserting BrutalFader/BrutalToggle delegate to shared primitives. |
| symbols.json | Updated to reflect moved/added exports. |
| AUDIT_REPORT.md | Rewritten with new findings table. |
…seGameState().
What changed:
Replaced production consumers with useGameSelector(...) for state reads and useGameActions() for dispatchers.
Left the legacy useGameState export in GameState.tsx (line 1016) for compatibility.
Added an architecture guard in architecture.test.jsx (line 103) to prevent new production useGameState references.
Updated affected test mocks to expose useGameSelector and useGameActions.
Verification:
pnpm run test:ui passed: 135 files, 775 tests.
pnpm run test:node passed: 1940 tests.
pnpm run test passed.
pnpm run lint exits 0, with one existing warning in src/hooks/useNetworkStatus.ts:45.
pnpm run typecheck passed.
pnpm run build passed.
pnpm run typecheck:core still fails on untouched unlockCheck.ts (line 165): Operator '<' cannot be applied to types '{}' and 'number'.
rg "useGameState" src now only finds the legacy hook declaration itself. Commit message candidate: refactor(game-state): replace deprecated useGameState consumers.
- Add spawnRivalBand to GameDispatchActions type (fixes Copilot CI flag on src/scenes/Overworld.tsx:51 where the destructure introduced a TS error). - Tighten architecture guard: use word-boundary regex + strip comments so JSDoc references no longer trip it; add positive assertion that the legacy useGameState export still exists. - Rewrite Credits.test.jsx and GameOver.test.jsx harnesses to use useGameSelector/useGameActions instead of the deprecated useGameState compat shim, so tests exercise the same code path as production. - Replace mockReturnValueOnce foot-gun in useQuestsModal.test.jsx with a vi.hoisted state holder so all selector calls see the same snapshot. - Replace fresh-object-literal selector in App.tsx GameContent with one selector per slice (avoids re-render storms). - Add useDarkWebLeak unit test (was missing). - Add useGameActions + useGameSelector stability tests. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- useDarkWebLeak.test.jsx: audio hub mock now exposes both audioManager and
audioService per the project audio-mock contract.
- proceedToTour.bench.jsx, RoadieRunScene.perf.test.jsx: stabilize mock state
with a single shared object so selectors don't reallocate per call and skew
benchmark timing.
- GameState.stability.test.jsx: add afterEach vi.unstubAllGlobals() so the
stubbed localStorage doesn't leak between suites.
- useKabelsalatGameEnd.test.jsx, useKabelsalatState.test.jsx: replace empty
selector({}) fixture with a canonical mock state and split actions out.
- usePostGigLogic.test.jsx, useArrivalLogicTestUtils.js: useGameActions mock
now returns only the function-valued (action) keys via extractActions(),
honoring the production state/actions split.
- useQuestsModal.test.jsx (ui/): split actions from state in the mock.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Refactor game state management to remove deprecated useGameState
- BrutalToggle: accept optional controlled-mode props (`isOn` + `onToggle`). When provided, the rendered state tracks the prop so callers can sync from external state (settings load, reset). Uncontrolled mode via `initialState` is preserved. - BrutalFader: same controlled-mode pattern via `value` + `onChange`. - SegmentedSlider: drop the redundant `aria-label` and `aria-pressed` on the segment buttons — they are `aria-hidden='true'` so screen readers skip them. Accessibility is handled by the visible range input at line 50. The now- unused `getSegmentAriaLabel` prop and its `useTranslation` dep are removed, along with the dead callers in `BrutalFader` and `VolumeSlider`. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Critical:
- storage.ts setSafeStorageItem/getSafeStorageItem no longer swallow errors
silently. Quota-exceeded, SecurityError, JSON parse failures, and storage
read failures now route through `handleError(new StorageError(...), {
silent: true })` so save loss has a diagnostic trail. Distinguishes
"missing key" from "corrupt key".
Important:
- BrutalToggle/BrutalFader: only strict booleans / finite numbers are
treated as controlled, so a stray `NaN` or `null` falls through to
uncontrolled mode rather than stuck-state. Internal state mirrors the
controlled value so transitioning back to uncontrolled retains the last
value instead of snapping to `initialState`/`initialValue`.
- catalogEffectUtils.normalizeCatalogEffect now returns a sanitized clone
containing only the validated fields per variant, dropping `__proto__`,
`constructor`, and any other hostile keys before the value enters game
state. `isCatalogEffect` uses `Object.hasOwn` for all property checks.
Tests:
- New catalog tests: `normalizeCatalogEffect` happy paths, throw cases,
optional `value` preservation on `passive`, prototype-pollution
sanitization, and rejection of payloads whose discriminator only lives
on the prototype.
- New BrutalToggle/BrutalFader controlled-mode tests: tracks prop changes
across rerenders, clamps controlled values, treats `NaN`/`Infinity` as
uncontrolled at mount, preserves last controlled value when reverting
to uncontrolled.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 6
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/utils/catalogEffectUtils.ts`:
- Around line 22-39: The numeric checks in the catalog effect validation (cases
like 'inventory_add', 'stat_modifier' and 'inventory_set' handling the
effect.value field) only use typeof === 'number' which permits NaN/Infinity;
change those checks to require finite numbers (use Number.isFinite on
effect.value) wherever effect.value is validated (including the other
occurrences around lines 68-88) so invalid non-finite numeric effect values are
rejected; keep the rest of the predicate logic (Object.hasOwn, type checks,
EFFECT_TARGETS) unchanged.
In `@src/utils/storage.ts`:
- Around line 104-122: The wrappers safeStorage and safeStorageNoFallback use
unsafe double-casts ("as unknown as") which hide nullability from
runSafeStorageOperation and can cause a null to be returned where T is expected;
replace the double-casts by giving runSafeStorageOperation a proper TypeScript
signature or overloads that match both call sites (e.g., (op: string, exec: ()
=> T, fallback: T) => T and (op: string, exec: () => T) => T) or add explicit
runtime checks/type guards around the result of runSafeStorageOperation before
returning; update safeStorage/safeStorageNoFallback to call the correctly typed
function (or throw/return fallback when the result is null/undefined) instead of
masking types with as unknown as.
In `@tests/ui/useAmpLogic.test.jsx`:
- Around line 14-19: Replace the empty object passed to useGameSelector with a
canonical selector fixture so selector behavior in tests matches runtime state;
locate the test mock where useGameSelector is invoked (near useGameActions,
mockCompleteAmpCalibration, mockChangeScene) and provide a canonical fixture
object (e.g., canonicalGameState or canonicalSelector) containing the standard
keys/selectors used by your app, then pass that object into useGameSelector
instead of {}.
In `@tests/ui/useRoadieLogic.test.jsx`:
- Around line 24-26: The test currently maps useGameActions to the full
mockUseGameState which returns the entire state; change the mock so
useGameActions returns only the actions portion of that state (e.g., call
mockUseGameState() and return its actions object) so the mocked contract matches
production; update the mapping for useGameActions (and keep useGameSelector
using selector(mockUseGameState())) to ensure hooks that expect action-only
usage are tested correctly.
In `@tests/ui/useTourbusLogic.test.jsx`:
- Around line 20-23: The mock for useGameActions is currently set to return
mockUseGameState, which leaks state into the actions mock; replace that by
creating a distinct mock action object/function (e.g., mockUseGameActions) that
only exposes action methods used by the tests and assign useGameActions:
mockUseGameActions instead of useGameState; keep useGameSelector implementation
but ensure mockUseGameActions does not include state fields from
mockUseGameState so tests only interact with action APIs.
In `@tests/useRhythmGameLogicTestUtils.js`:
- Around line 113-119: The mock for useGameActions currently returns the full
state because useGameActions is wired to mockUseGameState; change it to expose
only dispatcher functions by adding an extractActions helper (as used in
useArrivalLogicTestUtils.js) that filters mockUseGameState() to return only
function-valued properties, then wire useGameActions to call
extractActions(mockUseGameState()) while leaving mockUseGameState and
mockGameSelector unchanged so tests respect the production contract.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 2bb16aca-f39f-4a29-9f87-0647e196ed90
📒 Files selected for processing (142)
AUDIT_REPORT.mdsrc/App.tsxsrc/components/MinigameSceneFrame.tsxsrc/components/PixiStageController.tssrc/components/SceneRouter.tsxsrc/components/clinic/ClinicHeader.tsxsrc/components/clinic/ClinicMemberCard.tsxsrc/components/postGig/DealCard.tsxsrc/components/postGig/DealsPhase.tsxsrc/components/pregig/GigModifiersBlock.tsxsrc/components/pregig/PreGigHeader.tsxsrc/components/pregig/PreGigStartButton.tsxsrc/components/stage/EffectTextureManager.tssrc/components/stage/stageRenderUtils.tssrc/context/GameState.tsxsrc/context/usePersistence.tssrc/data/upgradeCatalog.tssrc/hooks/minigames/useAmpLogic.tssrc/hooks/minigames/useRoadieLogic.tssrc/hooks/minigames/useTourbusLogic.tssrc/hooks/rhythmGame/useRhythmGameScoring.tssrc/hooks/useArrivalLogic.tssrc/hooks/useBloodBank.tssrc/hooks/useChatterLogic.tssrc/hooks/useClinicLogic.tssrc/hooks/useContrabandStash.tssrc/hooks/useDarkWebLeak.tssrc/hooks/useDealNegotiation.tssrc/hooks/useLeaderboardSync.tssrc/hooks/useMerchPress.tssrc/hooks/usePirateRadio.tssrc/hooks/usePostGigLogic.tssrc/hooks/usePreGigLogic.tssrc/hooks/useQuestsModal.tssrc/hooks/useRhythmGameLogic.tssrc/hooks/useTravelLogic.tssrc/hooks/useTutorial.tssrc/scenes/AmpCalibrationScene.tsxsrc/scenes/Credits.tsxsrc/scenes/GameOver.tsxsrc/scenes/Gig.tsxsrc/scenes/IntroVideo.tsxsrc/scenes/Overworld.tsxsrc/scenes/RoadieRunScene.tsxsrc/scenes/Settings.tsxsrc/scenes/credits/CreditEntry.tsxsrc/scenes/credits/CreditFooter.tsxsrc/scenes/credits/CreditHeader.tsxsrc/scenes/gameover/GameOverBackground.tsxsrc/scenes/gameover/GameOverButtons.tsxsrc/scenes/gameover/GameOverHeader.tsxsrc/scenes/gameover/GameOverStats.tsxsrc/scenes/intro/components/AutoplayOverlay.tsxsrc/scenes/kabelsalat/components/CableItem.tsxsrc/scenes/kabelsalat/components/ConnectionPaths.tsxsrc/scenes/kabelsalat/components/HardwareProps.tsxsrc/scenes/kabelsalat/components/Header.tsxsrc/scenes/kabelsalat/components/HeaderTimer.tsxsrc/scenes/kabelsalat/components/HeaderTitle.tsxsrc/scenes/kabelsalat/components/KabelsalatBoard.tsxsrc/scenes/kabelsalat/components/Overlays.tsxsrc/scenes/kabelsalat/components/Rules.tsxsrc/scenes/kabelsalat/components/SocketList.tsxsrc/scenes/kabelsalat/components/overlays/KabelsalatGameOverOverlay.tsxsrc/scenes/kabelsalat/components/overlays/PoweredOnOverlay.tsxsrc/scenes/kabelsalat/components/overlays/ShockOverlay.tsxsrc/scenes/kabelsalat/components/plugs/DcPlug.tsxsrc/scenes/kabelsalat/components/plugs/IecPlug.tsxsrc/scenes/kabelsalat/components/plugs/JackPlug.tsxsrc/scenes/kabelsalat/components/plugs/MidiPlug.tsxsrc/scenes/kabelsalat/components/plugs/XlrPlug.tsxsrc/scenes/kabelsalat/components/sockets/DcSocket.tsxsrc/scenes/kabelsalat/components/sockets/IecSocket.tsxsrc/scenes/kabelsalat/components/sockets/JackSocket.tsxsrc/scenes/kabelsalat/components/sockets/MidiSocket.tsxsrc/scenes/kabelsalat/components/sockets/XlrSocket.tsxsrc/scenes/kabelsalat/hooks/useKabelsalatGameEnd.tssrc/scenes/mainmenu/MainMenuSocials.tsxsrc/scenes/mainmenu/useMainMenu.tssrc/ui/ContrabandStash.tsxsrc/ui/bandhq/SetlistTab.tsxsrc/ui/bandhq/ShopTab.tsxsrc/ui/bandhq/hooks/useBandHQLogic.tssrc/ui/shared/BrutalistUI.tsxsrc/ui/shared/SegmentedSlider.tsxsrc/ui/shared/VolumeSlider.tsxsrc/ui/shared/index.tsxsrc/utils/arrivalUtils.tssrc/utils/catalogEffectUtils.tssrc/utils/eventEngine.tssrc/utils/socialEngine.tssrc/utils/storage.tssrc/utils/unlockManager.tssrc/utils/upgradeUtils.tssymbols.jsontests/hooks/useBloodBank.test.jsxtests/hooks/useDarkWebLeak.test.jsxtests/hooks/useDealNegotiation.test.jsxtests/hooks/usePirateRadio.test.jsxtests/hooks/useQuestsModal.test.jsxtests/integration/GigIntegration.test.jsxtests/node/arrivalUtils.test.jstests/node/catalogEffectUtils.test.jstests/node/rhythmGameLogicMultiSong.test.jstests/node/storage.test.jstests/node/useClinicLogic.test.jstests/performance/MainMenuStability.test.jsxtests/performance/RoadieLogic.perf.test.jsxtests/performance/RoadieRunScene.perf.test.jsxtests/performance/SettingsStability.test.jsxtests/performance/proceedToTour.bench.jsxtests/performance/proceedToTourTime.bench.test.jsxtests/ui/Credits.test.jsxtests/ui/DealsPhase.test.jsxtests/ui/GameOver.test.jsxtests/ui/GameState.stability.test.jsxtests/ui/Gig.optimization.test.jsxtests/ui/Gig.scene.test.jsxtests/ui/IntroVideo.test.jsxtests/ui/KabelsalatScene.test.jsxtests/ui/MainMenu.identity.test.jsxtests/ui/MainMenu.test.jsxtests/ui/MerchPressModal.test.jsxtests/ui/MinigameSceneFrame.test.jsxtests/ui/PostGig.component.test.jsxtests/ui/PostGig.leaderboard.test.jsxtests/ui/PreGig.test.jsxtests/ui/SetlistTab.test.jsxtests/ui/ToggleSwitch.test.jsxtests/ui/TutorialManager.test.jsxtests/ui/VolumeSlider.test.jsxtests/ui/useAmpLogic.test.jsxtests/ui/useContrabandStash.test.jsxtests/ui/useKabelsalatGameEnd.test.jsxtests/ui/useKabelsalatState.test.jsxtests/ui/usePostGigLogic.test.jsxtests/ui/useQuestsModal.test.jsxtests/ui/useRoadieLogic.test.jsxtests/ui/useTourbusLogic.test.jsxtests/useArrivalLogicTestUtils.jstests/useRhythmGameLogicTestUtils.jstests/utils/architecture.test.jsx
💤 Files with no reviewable changes (47)
- src/scenes/credits/CreditHeader.tsx
- src/scenes/kabelsalat/components/plugs/XlrPlug.tsx
- src/scenes/kabelsalat/components/Rules.tsx
- src/scenes/gameover/GameOverButtons.tsx
- src/scenes/kabelsalat/components/plugs/MidiPlug.tsx
- src/scenes/gameover/GameOverHeader.tsx
- src/utils/socialEngine.ts
- src/scenes/kabelsalat/components/sockets/DcSocket.tsx
- src/scenes/credits/CreditEntry.tsx
- src/ui/bandhq/hooks/useBandHQLogic.ts
- src/hooks/useChatterLogic.ts
- src/scenes/kabelsalat/components/ConnectionPaths.tsx
- src/scenes/gameover/GameOverStats.tsx
- src/components/stage/stageRenderUtils.ts
- src/ui/ContrabandStash.tsx
- src/scenes/kabelsalat/components/Header.tsx
- src/scenes/kabelsalat/components/HeaderTitle.tsx
- src/scenes/gameover/GameOverBackground.tsx
- src/scenes/mainmenu/MainMenuSocials.tsx
- src/components/postGig/DealCard.tsx
- src/scenes/kabelsalat/components/Overlays.tsx
- src/scenes/kabelsalat/components/sockets/XlrSocket.tsx
- src/scenes/kabelsalat/components/overlays/ShockOverlay.tsx
- src/scenes/kabelsalat/components/plugs/JackPlug.tsx
- src/scenes/kabelsalat/components/HardwareProps.tsx
- src/components/pregig/PreGigHeader.tsx
- src/scenes/kabelsalat/components/overlays/KabelsalatGameOverOverlay.tsx
- src/components/pregig/PreGigStartButton.tsx
- src/scenes/kabelsalat/components/SocketList.tsx
- src/components/SceneRouter.tsx
- src/scenes/kabelsalat/components/sockets/JackSocket.tsx
- src/components/clinic/ClinicHeader.tsx
- src/scenes/credits/CreditFooter.tsx
- src/utils/eventEngine.ts
- src/scenes/kabelsalat/components/plugs/IecPlug.tsx
- src/components/PixiStageController.ts
- src/scenes/kabelsalat/components/sockets/MidiSocket.tsx
- src/scenes/kabelsalat/components/sockets/IecSocket.tsx
- src/scenes/intro/components/AutoplayOverlay.tsx
- src/scenes/kabelsalat/components/CableItem.tsx
- src/scenes/kabelsalat/components/overlays/PoweredOnOverlay.tsx
- src/scenes/kabelsalat/components/plugs/DcPlug.tsx
- src/scenes/kabelsalat/components/HeaderTimer.tsx
- src/components/stage/EffectTextureManager.ts
- src/scenes/kabelsalat/components/KabelsalatBoard.tsx
- src/components/pregig/GigModifiersBlock.tsx
- src/components/clinic/ClinicMemberCard.tsx
Lint Fix PreviewTarget roots:
No changes would be made by running either formatting or lint auto-fixes. Duplicate codeNo significant duplicates found (per jscpd thresholds). |
Enhance the codebase by extracting components into separate files, adding PropTypes for type checking, and implementing new overlay and slider components. Update utilities for safer operations and improve test coverage to ensure reliability. This refactor aims to streamline the code structure and enhance overall maintainability.