CMakeLists.txt              (project root -- required by ESP-IDF)
sdkconfig.defaults
partitions.csv
README.md
TODO.md
main/
├── CMakeLists.txt          (the only component registration in the project)
├── idf_component.yml
├── app_config.h.example    (template; copy to app_config.h)
├── app_config.h            (gitignored -- credentials)
├── main.c
├── wifi/
│   ├── wifi_manager.h
│   └── wifi_manager.c
├── drivers/
│   ├── i2c_bus.h           (shared bus: STC8H1K28 + GT911)
│   ├── i2c_bus.c
│   ├── backlight/
│   │   ├── backlight.h     (STC8H1K28 -- also gates GT911 reset)
│   │   └── backlight.c
│   ├── display/
│   │   ├── display_rgb.h
│   │   └── display_rgb.c
│   └── touch/
│       ├── touch_gt911.h
│       └── touch_gt911.c
├── ui/
│   ├── lvgl_port.h         (tick, service task, locking, pause/resume)
│   ├── lvgl_port.c
│   ├── ui_manager.h
│   └── ui_manager.c
└── api/
    ├── ambient_weather.h
    └── ambient_weather.c

Note: main/ subdirectories are plain source folders, not ESP-IDF components.
IDF only auto-discovers components under a top-level components/ directory,
so all sources are registered by main/CMakeLists.txt.
