prevClick = False
while True:
    sleep(0.03)  # poll at 30 Hz so knob feels responsive
    showMenu('Main', ctx)
    # Read the rotary encoder
    click = enc.clicked()
    delta = enc.delta()
    # Handle knob click (edge trigger on pressed -> released)
    if (not click) and (click != prevClick):
        doAction(ctx)
    prevClick = click
    # Handle knob turn
    if delta != 0:
        select(delta, ctx)
    # Update LED
    updateNeopixel(ctx)