2325 def build_ui(self): 2326 self.setObjectName("presenceConsole") 2327 2328 self.setStyleSheet(""" 2329 QWidget#presenceConsole { 2330 background: #020208; 2331 color: #f4efff; 2332 font-family: "DejaVu Sans Mono", monospace; 2333 } 2334 QLabel { 2335 background: transparent; 2336 } 2337 """) 2338 2339 root = QVBoxLayout(self) 2340 root.setContentsMargins(26, 20, 26, 16) 2341 root.setSpacing(12) 2342 2343 header = QHBoxLayout() 2344 header.setSpacing(18) 2345 2346 brand_column = QVBoxLayout() 2347 brand_column.setSpacing(0) 2348 2349 brand = QLabel("SHIRE BRAIN NODE 01") 2350 brand.setStyleSheet( 2351 f"color:{PURPLE}; " 2352 "font-size:27px; " 2353 "font-weight:900; " 2354 "letter-spacing:2px;" 2355 ) 2356 2357 core_state = QLabel("DISTRIBUTED WORKER • SHIRE MINI COMMAND CORE") 2358 core_state.setStyleSheet( 2359 f"color:{GREEN}; " 2360 "font-size:10px; " 2361 "font-weight:900;" 2362 ) 2363 2364 brand_column.addWidget(brand) 2365 brand_column.addWidget(core_state) 2366 2367 header.addLayout(brand_column) 2368 header.addStretch(1) 2369 header.addWidget(VoicePrivacyBanner()) 2370 2371 root.addLayout(header) 2372 2373 stage = QHBoxLayout() 2374 stage.setSpacing(14) 2375 2376 left_column = QVBoxLayout() 2377 left_column.setSpacing(12) 2378 left_column.addWidget(self._build_greeting_card(), 3) 2379 left_column.addWidget(self._build_status_card(), 2) 2380 2381 center_column = QVBoxLayout() 2382 center_column.setSpacing(2) 2383 2384 center_title = QLabel("BRAIN NODE 01 • ELECTRICAL CORE") 2385 center_title.setAlignment(Qt.AlignCenter) 2386 center_title.setStyleSheet( 2387 f"color:{PURPLE_LIGHT}; " 2388 "font-size:12px; " 2389 "font-weight:900; " 2390 "letter-spacing:2px;" 2391 ) 2392 2393 center_column.addWidget(center_title) 2394 center_column.addWidget(BrainNodeVisual(hero=True), 1) 2395 center_column.addWidget(VoiceOrb()) 2396 2397 right_column = QVBoxLayout() 2398 right_column.setSpacing(12) 2399 right_column.addWidget(self._build_thought_card(), 3) 2400 right_column.addWidget(self._build_next_card(), 2) 2401 2402 stage.addLayout(left_column, 5) 2403 stage.addLayout(center_column, 8) 2404 stage.addLayout(right_column, 5) 2405 2406 root.addLayout(stage, 1) 2407 2408 dock = QHBoxLayout() 2409 dock.setSpacing(10) 2410 2411 dock.addWidget( 2412 self._make_nav_button("●", "SHIRE", 1) 2413 ) 2414 2415 dock.addWidget( 2416 self._make_nav_button("⚒", "FORGE", 2) 2417 ) 2418 2419 dock.addWidget( 2420 self._make_nav_button("♜", "SENTINEL", 10) 2421 ) 2422 2423 stations_button = QPushButton("☰ STATIONS") 2424 stations_button.setCursor(Qt.PointingHandCursor) 2425 stations_button.setMinimumHeight(48) 2426 2427 stations_button.setStyleSheet(""" 2428 QPushButton { 2429 background: rgba(8, 5, 25, 225); 2430 color: #00f58a; 2431 border: 1px solid rgba(0, 245, 138, 185); 2432 border-radius: 13px; 2433 font-family: "DejaVu Sans Mono", monospace; 2434 font-size: 13px; 2435 font-weight: 900; 2436 padding: 8px 12px; 2437 } 2438 QPushButton:hover { 2439 background: rgba(0, 55, 39, 230); 2440 color: #ffffff; 2441 border: 1px solid #00f58a; 2442 } 2443 QPushButton:pressed { 2444 background: rgba(155, 77, 255, 75); 2445 } 2446 """) 2447 2448 stations_button.clicked.connect( 2449 self._toggle_stations 2450 ) 2451 2452 dock.addWidget(stations_button) 2453 2454 root.addLayout(dock) 2455 2456 self.station_drawer = self._build_station_drawer() 2457 root.addWidget(self.station_drawer) 2458 2459 hint = QLabel( 2460 "VOICE PREVIEW READY • " 2461 "Use MIC in the top prompt bar • " 2462 "Audio is processed locally and discarded" 2463 ) 2464 2465 hint.setAlignment(Qt.AlignCenter) 2466 hint.setStyleSheet( 2467 "color:#8f82a8; " 2468 "font-size:9px; " 2469 "font-weight:800; " 2470 "padding:1px;" 2471 ) 2472 2473 root.addWidget(hint)