// https://forum.arduino.cc/t/solved-blinking-indicators/1327297
// https://wokwi.com/projects/416000716783497217
const int indicator = 11;
const int myBuuton = 4;

//...
enum {PHASE0 = 0, PHASE1, PHASE2};
char *tags[] = {"phase zero", "phase one", "phase two", };

int thePhase = PHASE0;

bool butStateCur = true;
bool butStatePre;

bool ledOn;

unsigned long millisPre = 0;
unsigned long millisCur;
unsigned long phaseStart;
const int phaseDelay = 3000;           // delay for phase to timeout

void setup() {
  Serial.begin(115200);
  Serial.println("\nJello Whirled!\n");

  pinMode(indicator, OUTPUT);
  pinMode(myBuuton, INPUT_PULLUP);

  butStatePre = digitalRead(myBuuton) == LOW;
}

void loop() {
  millisCur = millis();                

//... let us do our own switch handling
  bool switchChange = false;    // until proven otherwise
  butStateCur = digitalRead(myBuuton) == LOW;
  if (butStatePre != butStateCur) {
    butStatePre = butStateCur;

    switchChange = true;
    delay(20);    // debounce
  }

//...
  switch (thePhase) {
  case PHASE0 :
    ledOn = (millis() / 500) % 2;
    if (switchChange) {
      ledOn = true;
      thePhase = PHASE1;
    }

    break;
    
  case PHASE1 :
    if (switchChange) {
      ledOn = false;
      thePhase = PHASE2;
      phaseStart = millisCur;
    }

    break;

  case PHASE2 :
    if (millisCur - phaseStart > phaseDelay) {
      thePhase = PHASE0;
    }

    break;
  }

  digitalWrite(indicator, ledOn ? HIGH : LOW);  // C/C++ ternary operator

  static int printedPhase = -1;  // no it does not!
  if (printedPhase != thePhase) {
    Serial.print("entered ");
    Serial.println(tags[thePhase]);

    printedPhase = thePhase;
  }
}