Skip to content

teleop bootstrap to tailwind migration, performance fixes, waypoints module refactor#171

Open
kevinjin420 wants to merge 7 commits intomainfrom
skj/4-tailwind-migration
Open

teleop bootstrap to tailwind migration, performance fixes, waypoints module refactor#171
kevinjin420 wants to merge 7 commits intomainfrom
skj/4-tailwind-migration

Conversation

@kevinjin420
Copy link
Collaborator

@kevinjin420 kevinjin420 commented Feb 13, 2026

Summary

depends on skj/3-backend-refactor, merge that first

tailwind migration

  • why tailwind?
    • more industry standard
    • not opinionated, functional only
    • JIT compiled, bootstrap is pre-compiled and heavy
    • newer sass versions broke our old CSS setup, removed sass dependency entirely
  • added scoped CSS with cmd-* design system classes (cmd-btn, cmd-modal, cmd-list-item, etc.) so components own their styles
  • replaced app.scss with app.css
  • added useModal composable and ConfirmModal component
  • added .stylelintrc.json for CSS linting
  • added data-testid attributes (pw-*) for playwright selectors
  • GimbalControls rewrite with proper button layout
  • PanoramaControls rewrite, uses two service calls (start/stop) instead of FeedbackButton
  • removed unused components: BasicCheckbox, FlightAttitudeIndicator, vue-flight-indicators.d.ts
  • removed unused assets: stream_placeholder.svg, stream_client.js

websocket performance

  • websocket store rewrite
    • shallowRef for messages record to prevent Vue from deep-tracking payloads
    • diagnostic metrics (flash timestamps, byte counters) moved to plain JS objects with getter functions, they fire on every WS message (~150/sec) but are only consumed by polling components
    • WS URL scheme changed from /{id} to /ws/{id} (server.py paths renamed to match)
  • useGamepadPolling composable
    • extracted shared gamepad polling logic from ArmControls, DriveControls, SPArmControls
    • reduced polling from 30Hz to 15Hz, still safe for human input and motor controller watchdog timers
  • WebsocketStatus uses non-reactive flash polling
  • GamepadDisplay removed unnecessary deep watcher (parent always assigns new array ref)

waypoint refactor + auton controls

  • waypoint CRUD
    • original infrastructure sent the whole waypoint list on every change
    • proper REST routes for auton and basic waypoints (create, update, delete, reorder)
    • drag-and-drop course reordering via vuedraggable
  • autonomy store rewrite with proper API-backed state management
  • extracted AutonControls component from the monolithic AutonWaypointEditor
  • AutonAddWaypointModal for cleaner waypoint creation flow
  • auton toggle endpoints: pure_pursuit, path_relaxation, path_interpolation
  • autonAPI.ts and updated waypointsAPI.ts for typed API calls
  • auton WebSocket handler (auton_ws.py) + /ws/auton endpoint in server.py

THIS BRANCH IS LACKING SOME FEATURES AND BUG FIXES RELATED TO AUTON TESTING, REMEMBER TO SYNC WITH MAIN

Did you add documentation to the wiki?

No, proposing new docs page @ https://docs.mrover.org over the wiki

How was this code tested?

Tested in sim

Did you test this in sim?

Yes

Did you test this on the rover?

No

Did you add unit tests?

No, covered by skj/7-test-suite

@kevinjin420 kevinjin420 requested a review from jbrhm February 13, 2026 09:11
@kevinjin420 kevinjin420 self-assigned this Feb 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant