+
+
+
ChatApp — {variant.label}
+
+
+
+
+ {variant.layout === 'rail' ? (
+
+ {/* Icon rail left */}
+
+
+
+
+
+
+
+
+
+
+ {/* Chatlist + user profile at bottom */}
+
+
+
+
+ {chats.map(c => (
+ setActiveChat(c)} />
+ ))}
+
+
+
+ {/* Chat area (unchanged below) */}
+
+ {!(callScreen === 'active' && callMode !== 'fullscreen') && (
+
+
+
+
{activeChat.name}
+
+ {activeChat.presence === 'online' ? '● Online' :
+ activeChat.presence === 'idle' ? '● Abwesend' :
+ activeChat.presence === 'dnd' ? '● Nicht stören' :
+ '● Offline · zuletzt vor 2h'}
+ {' · '}{activeChat.handle}
+
+
+
+
+
+
+
+
+ )}
+ {/* Call dock — rendered above messages, Discord-style */}
+ {callScreen === 'active' && callMode !== 'fullscreen' && (
+
+
setCallScreen('none')}
+ callState={callState}
+ setCallState={setCallState}
+ />
+
+ )}
+
+ {MESSAGES.map((m, i) => {
+ const next = MESSAGES[i+1];
+ const isLastOfRun = (m.from === 'them' || m.from === 'me') && (!next || next.from !== m.from || next.type === 'event');
+ const myChat = { initial: 'D', color: 'teal' };
+ return
;
+ })}
+
+
+
+
+
+ ) : (
+ <>
+
+
+
+ Netralax
+
+
+
+
+
+
+
+
+ {variant.key === 'clean' && (
+
+ )}
+
+
+
+
+
+
+
+ {chats.map(c => (
+ setActiveChat(c)} />
+ ))}
+
+
+
+
+
+
+
+
{activeChat.name}
+
+ {activeChat.presence === 'online' ? '● Online' :
+ activeChat.presence === 'idle' ? '● Abwesend' :
+ activeChat.presence === 'dnd' ? '● Nicht stören' :
+ '● Offline · zuletzt vor 2h'}
+ {' · '}{activeChat.handle}
+
+
+
+
+
+
+
+
+
+
+ {MESSAGES.map((m, i) => {
+ const next = MESSAGES[i+1];
+ const isLastOfRun = (m.from === 'them' || m.from === 'me') && (!next || next.from !== m.from || next.type === 'event');
+ const myChat = { initial: 'D', color: 'teal' };
+ return
;
+ })}
+
+
+
+
+
+
+ >
+ )}
+
+
+ {/* Call screen switcher — only in Clean Rail */}
+ {variant.layout === 'rail' && (
+
+
+
+
+
+
+ )}
+
+ {/* Incoming call is a full overlay */}
+ {callScreen === 'incoming' && (
+
+ setCallScreen('active')}
+ onDecline={() => setCallScreen('none')}
+ />
+
+ )}
+ {/* Fullscreen call hides chat entirely */}
+ {callScreen === 'active' && callMode === 'fullscreen' && (
+
+
setCallScreen('none')}
+ callState={callState}
+ setCallState={setCallState}
+ />
+
+ )}
+ {callScreen === 'pip' && (
+
setCallScreen('active')}
+ onHangup={() => setCallScreen('none')}
+ />
+ )}
+
+ {showCall && callScreen === 'none' && }
+