setEditing(null)} footer={}>setName(e.target.value)} disabled={!!localBusy}/>{editing&&(editing.configured??editing.snapshot.enrollment==='enrolled')&&{const target=editing;setEditing(null);void action(target,'prepare');}}>Обновить}/>}
diff --git a/packages/sensor-ui/src/sensorStatus.ts b/packages/sensor-ui/src/sensorStatus.ts
new file mode 100644
index 0000000..84b6981
--- /dev/null
+++ b/packages/sensor-ui/src/sensorStatus.ts
@@ -0,0 +1,13 @@
+import type {Sensor} from './contracts';
+
+// The row lamp describes current connectivity, not a past frame-verification run.
+export function sensorStatus(sensor:Sensor, fresh:boolean):{label:string;tone:'neutral'|'success'|'warning'|'danger'} {
+ if(!fresh)return {label:'Нет свежих сведений с БК',tone:'neutral'};
+ if(!sensor.online)return {label:'Не подключено',tone:'neutral'};
+ if(sensor.snapshot.acquisition==='failed')return {label:'Ошибка захвата',tone:'danger'};
+ const configured=sensor.configured??sensor.snapshot.enrollment==='enrolled';
+ if(!configured)return {label:'Требуется подготовка',tone:'neutral'};
+ if(!sensor.prepared)return {label:'Драйвер недоступен',tone:'warning'};
+ if(sensor.snapshot.acquisition==='streaming')return {label:sensor.recording?'Идёт запись':sensor.playback_id?'Просмотр записи':'Идёт захват',tone:'success'};
+ return {label:'Подключено',tone:'success'};
+}