Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
1a08279
Remember last save directory across file save operations
sensei-hacker Dec 31, 2025
4197435
Implement remember last save directory in main process
sensei-hacker Dec 31, 2025
eccb158
Fix firmware flasher board matching for multi-underscore targets
sensei-hacker Jan 17, 2026
10407d6
Refactor: Normalize target names at parse time using target_id field
sensei-hacker Jan 18, 2026
d4e8f41
Clean up: Remove redundant comments
sensei-hacker Jan 18, 2026
e7f37a4
Add GPS preset configuration UI with auto-detection
sensei-hacker Jan 20, 2026
ef6b3ad
Update GPS presets to 3 constellations
sensei-hacker Jan 20, 2026
3c78816
Phase 1: Add GPS preset UI with M9 Precision/Sport modes and auto-det…
sensei-hacker Jan 20, 2026
025a254
Fix GPS tab preset reset on tab re-initialization
sensei-hacker Jan 20, 2026
953fa60
Trigger change events when applying GPS presets
sensei-hacker Jan 20, 2026
c75975a
Fix JS Programming decompiler incorrect operand validation warnings
sensei-hacker Jan 21, 2026
1129e30
Feature: Add accordion navigation for improved tab organization
sensei-hacker Jan 21, 2026
e2ff657
Add expand/collapse all toggle for accordion navigation
sensei-hacker Jan 21, 2026
f4667c8
Improve accordion navigation accessibility
sensei-hacker Jan 21, 2026
a898009
Add LC-to-line mapping for active condition highlighting
sensei-hacker Jan 26, 2026
744160f
Add Monaco integration for active LC highlighting
sensei-hacker Jan 26, 2026
426e6ab
Add visual styling for active LC highlighting
sensei-hacker Jan 26, 2026
cb9ac21
Add null checks to prevent errors when FC data not loaded
sensei-hacker Jan 26, 2026
f999e71
Fix isDirty race condition preventing active LC highlighting
sensei-hacker Jan 26, 2026
0a7c958
Track LC-to-line mappings during code generation
sensei-hacker Jan 26, 2026
d058d0f
Add debug logging to finalizeLcLineMapping
sensei-hacker Jan 26, 2026
6d3e73d
Add debug logging to updateActiveHighlighting
sensei-hacker Jan 26, 2026
1de1e9a
Fix critical bug: use getAll() instead of get() for LC status
sensei-hacker Jan 26, 2026
b12f9be
Improve active LC checkmark visibility with circle background and whi…
sensei-hacker Jan 26, 2026
3590ef3
Add FALSE condition indicators and transpiler-side line tracking
sensei-hacker Jan 27, 2026
10bdcd2
Address qodo-merge bot feedback and refactor highlighting logic
sensei-hacker Jan 27, 2026
a078606
Fix malformed JSDoc comment syntax
sensei-hacker Jan 27, 2026
f448f15
Add code sync status - disable Save button when code matches FC
sensei-hacker Jan 27, 2026
220c5d9
Add code sync status and gvar display features to JavaScript Programm…
sensei-hacker Jan 27, 2026
2cae8e7
Add error handling to gvar display and MSP polling
sensei-hacker Jan 27, 2026
d993994
Fix LC line mapping for duplicate if-statements
sensei-hacker Jan 28, 2026
b5d6ed3
Redesign LED Strip tab UI for improved usability and layout
sensei-hacker Jan 29, 2026
9ac4dcf
Add LED strip presets with aviation-standard navigation lights
sensei-hacker Jan 29, 2026
4a09075
Fix LED preset colors not displaying
sensei-hacker Jan 29, 2026
06ccd1b
Renumber LED presets to start from center
sensei-hacker Jan 29, 2026
c071eae
Fix wing preset and add auto-color-function
sensei-hacker Jan 29, 2026
65ea72a
Address code review issues
sensei-hacker Jan 29, 2026
107eac5
Fix wing preset wire numbering to be consecutive
sensei-hacker Jan 29, 2026
67c98cc
led strip: better use of vertical space, seperate out presets
sensei-hacker Jan 29, 2026
10158fe
didn't intend to delete CLAUDE.md
sensei-hacker Jan 29, 2026
5e02c2f
Fix GPS tab fields going blank and improve preset UX
sensei-hacker Jan 29, 2026
8239d70
Fix event handler memory leaks in GPS tab
sensei-hacker Jan 29, 2026
d5eff0e
Add transpiler test utilities and test data
sensei-hacker Jan 30, 2026
60cf39a
Improve BLE device chooser with sorting and filtering
sensei-hacker Jan 30, 2026
955513e
Merge pull request #2547 from iNavFlight/maintenance-9.x
sensei-hacker Jan 30, 2026
77ca061
bluetooth device chooser: remove breaking CSS
sensei-hacker Jan 31, 2026
14f8bf2
bluetooth device chooser: make dialog taller
sensei-hacker Jan 31, 2026
43e7090
Update defaults_dialog_entries.js
b14ckyy Feb 2, 2026
3ce3e50
Merge pull request #2550 from b14ckyy/b14ckyy-corrected-vspeed-defaults
b14ckyy Feb 2, 2026
be30119
Fix JS Programming decompiler: render childless boolean conditions (#…
sensei-hacker Feb 8, 2026
82e14c9
Fix GUI_control ReferenceError in multiple files (#2544)
sensei-hacker Feb 8, 2026
f059925
merge: Fix uncaught TypeError: fillStyle.getColor is not a function (…
error414 Feb 8, 2026
4c4469c
Implement robust WebGL fallback for 3D rendering (#2512)
sensei-hacker Feb 9, 2026
4756819
Fix mission file save error caused by fs module usage (#2549)
sensei-hacker Feb 9, 2026
d606a4c
OSD: use LC configured mask instead of loading all Logic Conditions
sensei-hacker Feb 9, 2026
f89f2be
Address review feedback: unsigned shift and error handling
sensei-hacker Feb 9, 2026
2c1685b
Bump configurator version to 9.0.1
sensei-hacker Feb 12, 2026
8426ef8
Update SITL binaries for 9.0.1
sensei-hacker Feb 14, 2026
12e6832
Merge PR #2561: Bump configurator version to 9.0.1 with SITL binaries
sensei-hacker Feb 14, 2026
18acf8d
Fix corner cases in firmware flasher target matching
sensei-hacker Feb 15, 2026
fbdc2c0
Merge pull request #2522 from sensei-hacker/fix-firmware-flasher-targ…
sensei-hacker Feb 16, 2026
113f46f
Bump configurator version to 9.0.2
sensei-hacker Feb 16, 2026
994d535
Merge pull request #2565 from sensei-hacker/release/bump-version-9.0.2
sensei-hacker Feb 16, 2026
19ba259
Merge pull request #2559 from sensei-hacker/fix/osd-lc-use-configured…
sensei-hacker Feb 16, 2026
a303be2
Merge pull request #2511 from sensei-hacker/remember-last-save-directory
sensei-hacker Feb 21, 2026
8b741d9
Merge pull request #2526 from sensei-hacker/feature-gps-preset-ui
sensei-hacker Feb 21, 2026
d0a5fea
Merge pull request #2527 from sensei-hacker/fix-js-programming-decomp…
sensei-hacker Feb 21, 2026
7c8b0dd
Merge pull request #2530 from sensei-hacker/feature/accordion-navigation
sensei-hacker Feb 21, 2026
c90bfdd
Merge pull request #2539 from sensei-hacker/feature/js-programming-lc…
sensei-hacker Feb 21, 2026
ab9bd05
Merge pull request #2540 from sensei-hacker/feature/js-programming-de…
sensei-hacker Feb 21, 2026
d50afb5
Merge pull request #2545 from sensei-hacker/feature/improve-ble-devic…
sensei-hacker Feb 22, 2026
10ed1b9
Merge pull request #2543 from sensei-hacker/feature/led-strip-ui-rede…
sensei-hacker Feb 22, 2026
1aa6239
pwm_pinio consolidation mixer updates
sensei-hacker Feb 28, 2026
5ac4add
PINIO: update configurator for unified PINIO/PWM output
sensei-hacker Feb 28, 2026
8819b67
PINIO: fix operand order and add pwmOnPin() to JS transpiler
sensei-hacker Mar 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,83 @@ MSP.send_message(MSPCodes.MSP_SOME_CODE, payload, false, () => {
- **i18next** via `data-i18n` attributes: `<span data-i18n="key"></span>`
- **ES6 modules** throughout (`import`/`export`)

## CSS Best Practices

**Core Principle: Let the Browser Do Its Job of Handling Sizes**

Adding CSS to force specific sizes consistently causes problems. Removing that CSS and letting the browser calculate natural dimensions consistently produces better results.

### ❌ Don't Do This

```css
/* Don't force widths on containers */
.controls { width: 285px; }

/* Don't force button widths */
.button { width: 49%; }

/* Especially Don't use pixels for font sizes! */
.text { font-size: 16px; }
```

**Problems caused:**
- Fixed widths create cramped layouts, overlaps, and wasted space
- Forced button widths look unnatural
- Pixel font sizes don't scale across different display densities (200 DPI vs 800 DPI)
- Breaks user font size preferences and accessibility

### ✅ Do This Instead

```css
/* Let containers size naturally */
.controls { width: fit-content; }
/* Or just don't set width at all */

/* Let buttons size based on content */
/* Don't set width on buttons */

/* Use relative units for fonts */
.text { font-size: 1.2em; }
/* Or don't set font-size and use defaults */
```

**Results:**
- Layouts adapt naturally to content
- Elements look properly proportioned
- Text scales correctly across devices
- Respects user preferences

### The Pattern to Recognize

If you're writing CSS to force dimensions and encountering layout problems:

1. **Stop adding more CSS** to "fix" it
2. **Remove the size constraints** causing the problem
3. **Let the browser calculate** natural dimensions
4. **Only add back** minimal constraints if absolutely required

**Most of the time, removing CSS produces better results than adding more CSS.**

### When to Set Sizes

Only force sizes when there's a genuine need:
- Images/icons requiring exact dimensions
- `max-width` for text readability (e.g., `max-width: 80ch`)
- Specific design requirements (but question if they're necessary)

Use modern layout tools:
- **Flexbox** for flexible layouts with `gap`, `justify-content`, `align-items`
- **Grid** for two-dimensional layouts with `grid-template-columns`, `gap`
- **fit-content**, **auto**, **%** instead of fixed pixels

### Real Examples from LED Strip Redesign (2026-01-28)

All three of these problems were fixed by **removing CSS**, not adding more:

1. `.controls { width: 285px; }` → cramped step progress bar → **removed width rule**
2. `.button { width: 49%; }` → unnaturally wide buttons → **removed width rule**
3. `.step { font-size: 16px; }` → doesn't scale → **changed to font-size: 1.5em**

## Debugging

```bash
Expand Down
227 changes: 159 additions & 68 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -244,83 +244,174 @@
</li>
</ul>
<ul class="mode-connected">
<li class="tab_setup">
<a href="#" data-i18n="tabSetup" class="tabicon ic_setup" data-i18n_title="tabSetup"></a>
</li>
<li class="tab_calibration">
<a href="#" data-i18n="tabCalibration" class="tabicon ic_calibration" title="Calibration"></a>
</li>
<li class="tab_mixer">
<a href="#" data-i18n="tabMixer" class="tabicon ic_mixer" title="Mixer"></a>
</li>
<li class="tab_outputs">
<a href="#" data-i18n="tabOutputs" class="tabicon ic_motor" title="Outputs"></a>
</li>
<li class="tab_ports">
<a href="#" data-i18n="tabPorts" class="tabicon ic_ports" title="Ports"></a>
</li>
<li class="tab_configuration">
<a href="#" data-i18n="tabConfiguration" class="tabicon ic_config" title="Configuration"></a>
</li>
<li class="tab_failsafe">
<a href="#" data-i18n="tabFailsafe" class="tabicon ic_failsafe" title="Failsafe"></a>
</li>
<li class="tab_pid_tuning">
<a href="#" data-i18n="tabPidTuning" class="tabicon ic_pid" data-i18n_title="tabPidTuning"></a>
</li>
<li class="tab_advanced_tuning">
<a href="#" data-i18n="tabAdvancedTuning" class="tabicon ic_advanced"
title="Advanced Tuning"></a>
</li>
<li class="tab_programming">
<a href="#" data-i18n="tabProgramming" class="tabicon ic_config" title="Programming"></a>
</li>
<li class="tab_javascript_programming">
<a href="#" i18n="tabJavaScriptProgramming" class="tabicon ic_javascript_programming" title="Javascript Programming">></a>
</li>
<li class="tab_receiver">
<a href="#" data-i18n="tabReceiver" class="tabicon ic_rx" title="Receiver"></a>
</li>
<li class="tab_auxiliary">
<a href="#" data-i18n="tabAuxiliary" class="tabicon ic_modes" title="Modes"></a>
</li>
<li class="tab_adjustments">
<a href="#" data-i18n="tabAdjustments" class="tabicon ic_adjust" title="Adjustments"></a>
</li>
<li class="tab_gps">
<a href="#" data-i18n="tabGPS" class="tabicon ic_gps" title="GPS"></a>
</li>
<li class="tab_magnetometer">
<a href="#" data-i18n="tabMAGNETOMETER" class="tabicon ic_mag" title="MAGNETOMETER"></a>
</li>
<li class="tab_mission_control">
<a href="#" data-i18n="tabMissionControl" class="tabicon ic_mission"
title="Mission Control"></a>
</li>
<li class="tab_osd">
<a href="#" data-i18n="tabOSD" class="tabicon ic_osd" title="OSD"></a>
<!-- Setup & Configuration -->
<li class="nav-group">
<div class="group-header" role="button" tabindex="0" aria-expanded="false">
<span class="group-title" data-i18n="navGroupSetup">Setup & Configuration</span>
<span class="chevron">▸</span>
</div>
<ul class="group-items">
<li class="tab_setup">
<a href="#" data-i18n="tabSetup" class="tabicon ic_setup" data-i18n_title="tabSetup"></a>
</li>
<li class="tab_calibration">
<a href="#" data-i18n="tabCalibration" class="tabicon ic_calibration" title="Calibration"></a>
</li>
<li class="tab_magnetometer">
<a href="#" data-i18n="tabMAGNETOMETER" class="tabicon ic_mag" title="MAGNETOMETER"></a>
</li>
<li class="tab_configuration">
<a href="#" data-i18n="tabConfiguration" class="tabicon ic_config" title="Configuration"></a>
</li>
<li class="tab_ports">
<a href="#" data-i18n="tabPorts" class="tabicon ic_ports" title="Ports"></a>
</li>
</ul>
</li>
<li class="tab_led_strip">
<a href="#" data-i18n="tabLedStrip" class="tabicon ic_led" title="LED Strip"></a>

<!-- Flight Control -->
<li class="nav-group">
<div class="group-header" role="button" tabindex="0" aria-expanded="false">
<span class="group-title" data-i18n="navGroupFlight">Flight Control</span>
<span class="chevron">▸</span>
</div>
<ul class="group-items">
<li class="tab_mixer">
<a href="#" data-i18n="tabMixer" class="tabicon ic_mixer" title="Mixer"></a>
</li>
<li class="tab_outputs">
<a href="#" data-i18n="tabOutputs" class="tabicon ic_motor" title="Outputs"></a>
</li>
<li class="tab_receiver">
<a href="#" data-i18n="tabReceiver" class="tabicon ic_rx" title="Receiver"></a>
</li>
<li class="tab_auxiliary">
<a href="#" data-i18n="tabAuxiliary" class="tabicon ic_modes" title="Modes"></a>
</li>
<li class="tab_failsafe">
<a href="#" data-i18n="tabFailsafe" class="tabicon ic_failsafe" title="Failsafe"></a>
</li>
</ul>
</li>
<li class="tab_sensors">
<a href="#" data-i18n="tabRawSensorData" class="tabicon ic_sensors" title="Sensors"></a>

<!-- Tuning -->
<li class="nav-group">
<div class="group-header" role="button" tabindex="0" aria-expanded="false">
<span class="group-title" data-i18n="navGroupTuning">Tuning</span>
<span class="chevron">▸</span>
</div>
<ul class="group-items">
<li class="tab_pid_tuning">
<a href="#" data-i18n="tabPidTuning" class="tabicon ic_pid" data-i18n_title="tabPidTuning"></a>
</li>
<li class="tab_advanced_tuning">
<a href="#" data-i18n="tabAdvancedTuning" class="tabicon ic_advanced"
title="Advanced Tuning"></a>
</li>
<li class="tab_adjustments">
<a href="#" data-i18n="tabAdjustments" class="tabicon ic_adjust" title="Adjustments"></a>
</li>
</ul>
</li>
<li class="tab_logging">
<a href="#" data-i18n="tabLogging" class="tabicon ic_log" title="Tethered Logging"></a>

<!-- Navigation & Mission -->
<li class="nav-group">
<div class="group-header" role="button" tabindex="0" aria-expanded="false">
<span class="group-title" data-i18n="navGroupNavigation">Navigation & Mission</span>
<span class="chevron">▸</span>
</div>
<ul class="group-items">
<li class="tab_gps">
<a href="#" data-i18n="tabGPS" class="tabicon ic_gps" title="GPS"></a>
</li>
<li class="tab_mission_control">
<a href="#" data-i18n="tabMissionControl" class="tabicon ic_mission"
title="Mission Control"></a>
</li>
</ul>
</li>
<li class="tab_onboard_logging">
<a href="#" data-i18n="tabOnboardLogging" class="tabicon ic_data" title="Onboard Logging"></a>

<!-- Sensors & Peripherals -->
<li class="nav-group">
<div class="group-header" role="button" tabindex="0" aria-expanded="false">

Check warning on line 336 in index.html

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Add a 'onKeyPress|onKeyDown|onKeyUp' attribute to this <div> tag.

See more on https://sonarcloud.io/project/issues?id=iNavFlight_inav-configurator&issues=AZzJRXf8fJpGf8FMujoZ&open=AZzJRXf8fJpGf8FMujoZ&pullRequest=2587
<span class="group-title" data-i18n="navGroupSensors">Sensors & Peripherals</span>
<span class="chevron">▸</span>
</div>
<ul class="group-items">
<li class="tab_sensors">
<a href="#" data-i18n="tabRawSensorData" class="tabicon ic_sensors" title="Sensors"></a>
</li>
<li class="tab_osd">
<a href="#" data-i18n="tabOSD" class="tabicon ic_osd" title="OSD"></a>
</li>
<li class="tab_led_strip">
<a href="#" data-i18n="tabLedStrip" class="tabicon ic_led" title="LED Strip"></a>
</li>
</ul>
</li>
<li class="tab_cli">
<a href="#" data-i18n="tabCLI" class="tabicon ic_cli" title="CLI"></a>

<!-- Data Logging -->
<li class="nav-group">
<div class="group-header" role="button" tabindex="0" aria-expanded="false">
<span class="group-title" data-i18n="navGroupLogging">Data Logging</span>
<span class="chevron">▸</span>
</div>
<ul class="group-items">
<li class="tab_onboard_logging">
<a href="#" data-i18n="tabOnboardLogging" class="tabicon ic_data" title="Onboard Logging"></a>
</li>
<li class="tab_logging">
<a href="#" data-i18n="tabLogging" class="tabicon ic_log" title="Tethered Logging"></a>
</li>
</ul>
</li>
<li class="tab_search">
<a href="#" data-i18n="search" class="tabicon ic_search" title="Search"></a>

<!-- Programming -->
<li class="nav-group">
<div class="group-header" role="button" tabindex="0" aria-expanded="false">
<span class="group-title" data-i18n="navGroupProgramming">Programming</span>
<span class="chevron">▸</span>
</div>
<ul class="group-items">
<li class="tab_programming">
<a href="#" data-i18n="tabProgramming" class="tabicon ic_config" title="Programming"></a>
</li>
<li class="tab_javascript_programming">
<a href="#" data-i18n="tabJavaScriptProgramming" class="tabicon ic_javascript_programming" title="Javascript Programming"></a>
</li>
</ul>
</li>

<!-- Tools -->
<li class="nav-group">
<div class="group-header" role="button" tabindex="0" aria-expanded="false">
<span class="group-title" data-i18n="navGroupTools">Tools</span>
<span class="chevron">▸</span>
</div>
<ul class="group-items">
<li class="tab_cli">
<a href="#" data-i18n="tabCLI" class="tabicon ic_cli" title="CLI"></a>
</li>
<li class="tab_search">
<a href="#" data-i18n="search" class="tabicon ic_search" title="Search"></a>
</li>
</ul>
</li>

<!-- <li class=""><a href="#" class="tabicon ic_advanced">Advanced (spare icon)</a></li> -->
<!-- Expand/Collapse All Toggle -->
<li class="nav-toggle-all">
<a href="#" id="toggleAllGroups">
<svg class="expand-icon" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" role="img" aria-labelledby="expand-title">
<title id="expand-title" data-i18n="navExpandAll">Expand All</title>
<path d="M7 13l5 5 5-5M7 6l5 5 5-5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<svg class="collapse-icon" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" role="img" aria-labelledby="collapse-title" style="display: none;">
<title id="collapse-title" data-i18n="navCollapseAll">Collapse All</title>
<path d="M17 11l-5-5-5 5M17 18l-5-5-5 5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="toggle-text" data-i18n="navExpandAll">Expand All</span>
</a>
</li>
</ul>
</div>
<div class="clear-both"></div>
Expand Down
Loading