<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://www.pandoraburo.ru/" xml:lang="ru">
  <id>https://www.pandoraburo.ru/medilav</id>
  <link href="https://www.pandoraburo.ru/medilav.xml" rel="self"/>
  <title/>
  <subtitle type="html">&lt;html lang="ru"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"&gt;
&lt;meta name="theme-color" content="#0066FF"&gt;
&lt;meta name="keywords" content="медицинское приложение, мониторинг здоровья, телемедицина, анализ симптомов, экстренная помощь, Medical ID, трекер лекарств, анализ крови онлайн, AI диагностика, здоровье под контролем, Medilav, дерматоскопия, анализ родинок, меланома"&gt;
&lt;meta name="description" content="Medilav — инновационное медицинское приложение с AI-диагностикой, контролем здоровья, трекером лекарств и экстренной помощью. Ваш персональный медицинский ассистент нового поколения."&gt;
&lt;title&gt;Medilav — Ваш медицинский ассистент&lt;/title&gt;
&lt;link rel="preconnect" href="https://fonts.googleapis.com" /&gt;
&lt;link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="crossorigin" /&gt;
&lt;link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&amp;amp;display=swap" rel="stylesheet" /&gt;
&lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" /&gt;
&lt;style&gt;
/* ============================================
1. ПЕРЕМЕННЫЕ И БАЗА
============================================ */
:root {
--primary: #0066FF; --primary-dark: #0052CC; --primary-light: #E6F0FF;
--success: #10B981; --success-light: #D1FAE5;
--warning: #F59E0B; --warning-light: #FEF3C7;
--danger: #EF4444; --danger-light: #FEE2E2;
--info: #3B82F6; --info-light: #DBEAFE;
--gray-50: #F9FAFB; --gray-100: #F3F4F6; --gray-200: #E5E7EB;
--gray-300: #D1D5DB; --gray-400: #9CA3AF; --gray-500: #6B7280;
--gray-600: #4B5563; --gray-700: #374151; --gray-800: #1F2937; --gray-900: #111827;
--bg-primary: #FFFFFF; --bg-secondary: #F9FAFB; --bg-tertiary: #F3F4F6;
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
--radius-sm: 8px; --radius-md: 12px; --radius-lg: 16px; --radius-full: 9999px;
--spacing-xs: 4px; --spacing-sm: 8px; --spacing-md: 16px; --spacing-lg: 24px; --spacing-xl: 32px;
--font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
--font-size-xs: 12px; --font-size-sm: 14px; --font-size-base: 16px;
--font-size-lg: 18px; --font-size-xl: 20px; --font-size-2xl: 24px;
--transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
--z-sticky: 200;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; scroll-padding-top: 90px; }
body { font-family: var(--font-family); font-size: var(--font-size-base); line-height: 1.5; color: var(--gray-900); background: var(--bg-secondary); min-height: 100vh; }
button { font-family: inherit; cursor: pointer; border: none; background: none; font-size: inherit; }
input, textarea, select { font-family: inherit; font-size: inherit; }
.container { max-width: 1280px; margin: 0 auto; padding: 0 var(--spacing-md); }
.app-shell { display: flex; flex-direction: column; min-height: 100vh; }
.app-content { flex: 1; padding: var(--spacing-md); padding-bottom: 100px; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
@keyframes bounce { 0%, 80%, 100% { transform: scale(0); } 40% { transform: scale(1); } }
@keyframes sos-pulse { 0% { transform: translate(-50%, -50%) scale(1); opacity: 0.6; } 100% { transform: translate(-50%, -50%) scale(1.5); opacity: 0; } }
@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.6; } }
.animate-fade-in { animation: fadeIn 0.4s ease-out; }
section { opacity: 0; transform: translateY(30px); transition: opacity 0.7s ease-out, transform 0.7s ease-out; }
section.in-view { opacity: 1; transform: translateY(0); }

/* ============================================
2. HEADER
============================================ */
.header { background: rgba(255, 255, 255, 0.95); backdrop-filter: blur(12px); border-bottom: 1px solid var(--gray-200); padding: var(--spacing-sm) 0; position: sticky; top: 0; z-index: var(--z-sticky); box-shadow: var(--shadow-sm); }
.header__inner { display: flex; align-items: center; justify-content: space-between; gap: var(--spacing-sm); }
.header__brand { display: flex; align-items: center; gap: var(--spacing-sm); }
.header__logo { display: flex; align-items: center; justify-content: center; width: 40px; height: 40px; background: var(--primary-light); border-radius: var(--radius-md); }
.header__brand-name { font-weight: 700; font-size: var(--font-size-xl); color: var(--gray-900); }
.header__status { display: flex; align-items: center; gap: var(--spacing-sm); background: var(--bg-tertiary); padding: 4px 12px 4px 8px; border-radius: var(--radius-full); border: 1px solid var(--gray-200); }
.status-indicator { display: flex; align-items: center; gap: 4px; font-size: var(--font-size-xs); font-weight: 600; color: var(--gray-700); }
.status-dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; }
.status-green .status-dot { background: var(--success); }
.status-yellow .status-dot { background: var(--warning); }
.status-red .status-dot { background: var(--danger); }
.status-detail { display: flex; align-items: baseline; gap: 2px; font-size: var(--font-size-xs); color: var(--gray-500); border-left: 1px solid var(--gray-300); padding-left: 8px; }
.status-score { font-weight: 700; font-size: var(--font-size-base); color: var(--gray-900); }
.header__actions { display: flex; align-items: center; gap: var(--spacing-sm); }
.header__btn { position: relative; display: flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: var(--radius-full); color: var(--gray-600); transition: background var(--transition-fast); }
.header__btn:hover { background: var(--gray-100); color: var(--gray-900); }
.avatar-img { width: 40px; height: 40px; border-radius: 50%; object-fit: cover; }
.notification-badge { position: absolute; top: 2px; right: 2px; background: var(--danger); color: white; font-size: 10px; font-weight: 700; width: 18px; height: 18px; border-radius: 50%; display: flex; align-items: center; justify-content: center; border: 2px solid white; }

/* ============================================
3. DASHBOARD
============================================ */
.dashboard { margin-top: var(--spacing-lg); }
.dashboard__title { font-size: var(--font-size-2xl); font-weight: 700; color: var(--gray-900); margin-bottom: var(--spacing-md); }
.dashboard__grid { display: grid; grid-template-columns: 1fr; gap: var(--spacing-md); }
.widget { background: var(--bg-primary); border-radius: var(--radius-lg); padding: var(--spacing-md); box-shadow: var(--shadow-sm); border: 1px solid var(--gray-200); transition: transform var(--transition-fast), box-shadow var(--transition-fast); }
.widget:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); }
.widget__header { display: flex; align-items: center; gap: var(--spacing-sm); margin-bottom: var(--spacing-md); }
.widget__icon { font-size: var(--font-size-xl); width: 32px; text-align: center; }
.widget__title { font-weight: 600; font-size: var(--font-size-base); color: var(--gray-800); flex: 1; }
.vitals__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--spacing-sm); text-align: center; }
.vital-value { font-size: var(--font-size-2xl); font-weight: 800; color: var(--gray-900); line-height: 1; }
.vital-unit { font-size: var(--font-size-xs); color: var(--gray-500); }
.vital-label { font-size: var(--font-size-sm); font-weight: 500; color: var(--gray-700); }
.medication__card { display: flex; align-items: center; justify-content: space-between; gap: var(--spacing-md); background: var(--primary-light); padding: var(--spacing-md); border-radius: var(--radius-md); border-left: 4px solid var(--primary); }
.medication__name { font-weight: 700; font-size: var(--font-size-lg); color: var(--gray-900); }
.medication__time { font-size: var(--font-size-sm); color: var(--primary-dark); font-weight: 600; }
.actions__grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--spacing-sm); }
.action-btn { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--spacing-xs); padding: var(--spacing-md); background: var(--bg-secondary); border: 1px solid var(--gray-200); border-radius: var(--radius-md); color: var(--gray-700); font-weight: 600; font-size: var(--font-size-sm); transition: all var(--transition-fast); }
.action-btn i { font-size: var(--font-size-xl); color: var(--primary); margin-bottom: 4px; }
.action-btn:hover { background: var(--primary-light); border-color: var(--primary); color: var(--primary-dark); }
.action-btn--danger i { color: var(--danger); }
.action-btn--danger:hover { background: var(--danger-light); border-color: var(--danger); color: var(--danger); }
.progress-bar { height: 12px; background: var(--gray-200); border-radius: var(--radius-full); overflow: hidden; margin-bottom: var(--spacing-sm); }
.progress-fill { height: 100%; background: linear-gradient(90deg, var(--success), #34D399); border-radius: var(--radius-full); transition: width 1s ease-out; }
.activity__stats { display: flex; justify-content: space-between; font-size: var(--font-size-sm); font-weight: 600; color: var(--gray-700); }
.btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--spacing-xs); font-weight: 600; border-radius: var(--radius-md); transition: all var(--transition-fast); }
.btn--primary { background: var(--primary); color: white; padding: 8px 16px; font-size: var(--font-size-sm); }
.btn--primary:hover { background: var(--primary-dark); }
.btn--outline { background: transparent; border: 1px solid var(--gray-300); color: var(--gray-700); padding: 8px 16px; font-size: var(--font-size-sm); border-radius: var(--radius-md); }
.btn--outline:hover { background: var(--gray-100); }

/* ============================================
4. AI CHAT
============================================ */
.chat-section { margin-top: var(--spacing-lg); }
.chat-container { background: var(--bg-primary); border-radius: var(--radius-lg); border: 1px solid var(--gray-200); box-shadow: var(--shadow-sm); overflow: hidden; display: flex; flex-direction: column; max-height: 650px; }
.chat-header { display: flex; align-items: center; justify-content: space-between; padding: var(--spacing-md); border-bottom: 1px solid var(--gray-200); background: var(--bg-secondary); }
.chat-header__info { display: flex; align-items: center; gap: var(--spacing-sm); }
.chat-header__icon { font-size: var(--font-size-2xl); color: var(--primary); }
.chat-header__name { font-weight: 700; color: var(--gray-900); display: block; }
.chat-header__status { font-size: var(--font-size-xs); color: var(--gray-500); display: flex; align-items: center; gap: 4px; }
.chat-header__status .status-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--success); }
.chat-header__clear { color: var(--gray-400); padding: 4px 8px; border-radius: var(--radius-sm); transition: color var(--transition-fast); }
.chat-header__clear:hover { color: var(--danger); background: var(--danger-light); }
.chat-messages { flex: 1; overflow-y: auto; padding: var(--spacing-md); display: flex; flex-direction: column; gap: var(--spacing-sm); max-height: 350px; background: var(--bg-secondary); scroll-behavior: smooth; }
.message { max-width: 85%; padding: 10px 14px; border-radius: var(--radius-md); font-size: var(--font-size-sm); line-height: 1.5; word-wrap: break-word; animation: fadeIn 0.3s ease-out; }
.message--user { align-self: flex-end; background: var(--primary); color: white; border-bottom-right-radius: 4px; }
.message--bot { align-self: flex-start; background: var(--gray-100); color: var(--gray-800); border-bottom-left-radius: 4px; }
.message-time { font-size: 10px; opacity: 0.7; margin-top: 4px; display: block; }
.typing-indicator { display: flex; gap: 4px; padding: 4px 0; }
.typing-indicator span { width: 8px; height: 8px; background: var(--gray-400); border-radius: 50%; animation: bounce 1.4s infinite ease-in-out both; }
.typing-indicator span:nth-child(1) { animation-delay: -0.32s; }
.typing-indicator span:nth-child(2) { animation-delay: -0.16s; }
.chat-upload { padding: var(--spacing-sm) var(--spacing-md); border-top: 1px solid var(--gray-200); background: var(--bg-secondary); display: none; flex-direction: column; gap: var(--spacing-sm); }
.upload-preview { display: flex; align-items: center; gap: var(--spacing-sm); font-size: var(--font-size-sm); color: var(--gray-700); }
.upload-preview img { max-height: 60px; border-radius: var(--radius-sm); object-fit: cover; }
.upload-actions { display: flex; gap: var(--spacing-sm); justify-content: flex-end; }
.chat-input-area { display: flex; align-items: center; gap: var(--spacing-sm); padding: var(--spacing-sm) var(--spacing-md); border-top: 1px solid var(--gray-200); background: var(--bg-primary); }
.chat-input__actions { display: flex; gap: 2px; }
.chat-input__btn { width: 36px; height: 36px; border-radius: var(--radius-full); color: var(--gray-500); transition: all var(--transition-fast); display: flex; align-items: center; justify-content: center; }
.chat-input__btn:hover { background: var(--gray-100); color: var(--gray-700); }
.chat-input__field { flex: 1; padding: 10px 14px; border: 1px solid var(--gray-200); border-radius: var(--radius-full); outline: none; font-size: var(--font-size-sm); transition: border-color var(--transition-fast); }
.chat-input__field:focus { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(0,102,255,0.1); }
.chat-input__send { width: 40px; height: 40px; border-radius: var(--radius-full); background: var(--primary); color: white; transition: background var(--transition-fast); display: flex; align-items: center; justify-content: center; }
.chat-input__send:hover { background: var(--primary-dark); }
.chat-disclaimer { font-size: 11px; color: var(--gray-500); text-align: center; padding: 6px var(--spacing-md); background: var(--bg-secondary); border-top: 1px solid var(--gray-200); display: flex; align-items: center; justify-content: center; gap: 6px; }
.chat-quick-questions { display: flex; flex-wrap: wrap; gap: var(--spacing-xs); padding: var(--spacing-sm) var(--spacing-md) var(--spacing-md); background: var(--bg-secondary); }
.chip { padding: 6px 14px; border-radius: var(--radius-full); border: 1px solid var(--gray-200); background: white; font-size: var(--font-size-sm); font-weight: 500; color: var(--gray-700); transition: all var(--transition-fast); cursor: pointer; }
.chip:hover { border-color: var(--primary); background: var(--primary-light); color: var(--primary-dark); }

/* ============================================
5. MEDICAL ID
============================================ */
.medical-id-section { margin-top: var(--spacing-lg); }
.medical-id-card { background: var(--bg-primary); border-radius: var(--radius-lg); border: 1px solid var(--gray-200); box-shadow: var(--shadow-md); padding: var(--spacing-lg); max-width: 800px; margin: 0 auto; }
.medical-id-header { display: flex; align-items: center; gap: var(--spacing-md); margin-bottom: var(--spacing-lg); padding-bottom: var(--spacing-md); border-bottom: 1px solid var(--gray-200); }
.medical-id-icon { width: 48px; height: 48px; background: var(--danger-light); color: var(--danger); border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; font-size: var(--font-size-2xl); }
.medical-id-title { font-size: var(--font-size-xl); font-weight: 700; color: var(--gray-900); line-height: 1.2; }
.medical-id-subtitle { font-size: var(--font-size-sm); color: var(--gray-500); }
.medical-id-user { display: flex; align-items: center; gap: var(--spacing-md); margin-bottom: var(--spacing-lg); background: var(--bg-secondary); padding: var(--spacing-md); border-radius: var(--radius-md); }
.user-avatar-large img { width: 80px; height: 80px; border-radius: 50%; border: 3px solid white; box-shadow: var(--shadow-sm); }
.user-name { font-size: var(--font-size-xl); font-weight: 700; color: var(--gray-900); margin-bottom: 4px; }
.user-dob { font-size: var(--font-size-sm); color: var(--gray-600); margin-bottom: 8px; }
.user-blood { font-size: var(--font-size-base); font-weight: 600; color: var(--gray-800); }
.blood-highlight { background: var(--danger); color: white; padding: 2px 8px; border-radius: var(--radius-sm); font-size: var(--font-size-sm); margin-left: 4px; }
.medical-info-grid { display: grid; grid-template-columns: 1fr; gap: var(--spacing-md); margin-bottom: var(--spacing-lg); }
.info-block { padding: var(--spacing-md); border-radius: var(--radius-md); border-left: 4px solid transparent; }
.info-block--danger { background: var(--danger-light); border-left-color: var(--danger); }
.info-block--warning { background: var(--warning-light); border-left-color: var(--warning); }
.info-block--info { background: var(--info-light); border-left-color: var(--info); }
.info-block--neutral { background: var(--gray-100); border-left-color: var(--gray-400); }
.info-block-header { display: flex; align-items: center; gap: 8px; font-weight: 700; font-size: var(--font-size-sm); margin-bottom: var(--spacing-sm); color: var(--gray-800); }
.info-block--danger .info-block-header { color: var(--danger); }
.info-block--warning .info-block-header { color: #B45309; }
.info-block--info .info-block-header { color: var(--info); }
.info-list { list-style: none; padding: 0; margin: 0; }
.info-list li { font-size: var(--font-size-sm); color: var(--gray-700); padding: 4px 0; padding-left: 16px; position: relative; }
.info-list li::before { content: "•"; position: absolute; left: 0; color: var(--gray-400); font-weight: bold; }
.emergency-contacts { margin-bottom: var(--spacing-lg); padding-top: var(--spacing-md); border-top: 1px solid var(--gray-200); }
.contacts-title { font-size: var(--font-size-base); font-weight: 700; color: var(--gray-900); margin-bottom: var(--spacing-md); display: flex; align-items: center; gap: 8px; }
.contacts-list { display: flex; flex-direction: column; gap: var(--spacing-sm); }
.contact-item { display: flex; justify-content: space-between; align-items: center; padding: var(--spacing-sm) var(--spacing-md); background: var(--bg-secondary); border-radius: var(--radius-md); border: 1px solid var(--gray-200); }
.contact-name { font-weight: 600; color: var(--gray-900); display: block; }
.contact-relation { font-size: var(--font-size-xs); color: var(--gray-500); }
.contact-phone { font-weight: 700; color: var(--primary); text-decoration: none; font-size: var(--font-size-base); }
.contact-phone:hover { text-decoration: underline; }
.lock-screen-access { display: flex; justify-content: space-between; align-items: center; padding: var(--spacing-md); background: var(--primary-light); border-radius: var(--radius-md); border: 1px solid rgba(0, 102, 255, 0.2); }
.toggle-label { display: flex; align-items: center; gap: 8px; font-weight: 600; color: var(--primary-dark); font-size: var(--font-size-sm); }
.lock-screen-hint { font-size: var(--font-size-xs); color: var(--gray-500); margin-top: 8px; text-align: center; }
.switch { position: relative; display: inline-block; width: 50px; height: 28px; }
.switch input { opacity: 0; width: 0; height: 0; }
.slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: var(--gray-300); transition: .4s; }
.slider:before { position: absolute; content: ""; height: 20px; width: 20px; left: 4px; bottom: 4px; background-color: white; transition: .4s; border-radius: 50%; box-shadow: var(--shadow-sm); }
input:checked + .slider { background-color: var(--primary); }
input:checked + .slider:before { transform: translateX(22px); }
.slider.round { border-radius: 34px; }
.slider.round:before { border-radius: 50%; }

/* ============================================
6. MEDICATION TRACKER
============================================ */
.medication-tracker { margin-top: var(--spacing-lg); }
.tracker-card { background: var(--bg-primary); border-radius: var(--radius-lg); border: 1px solid var(--gray-200); box-shadow: var(--shadow-sm); padding: var(--spacing-lg); }
.tracker-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--spacing-lg); padding-bottom: var(--spacing-md); border-bottom: 1px solid var(--gray-200); }
.tracker-header__info { display: flex; align-items: center; gap: var(--spacing-md); }
.tracker-header__icon { width: 48px; height: 48px; background: var(--success-light); color: var(--success); border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; font-size: var(--font-size-2xl); }
.tracker-header__title { font-size: var(--font-size-xl); font-weight: 700; color: var(--gray-900); margin: 0; }
.tracker-header__subtitle { font-size: var(--font-size-sm); color: var(--gray-500); margin-top: 2px; }
.progress-circle { width: 64px; height: 64px; position: relative; display: flex; align-items: center; justify-content: center; }
.progress-circle svg { transform: rotate(-90deg); width: 100%; height: 100%; }
.progress-circle-bg { fill: none; stroke: var(--gray-200); stroke-width: 3; }
.progress-circle-fill { fill: none; stroke: var(--success); stroke-width: 3; stroke-linecap: round; transition: stroke-dasharray 1s ease-out; }
.progress-text { position: absolute; font-size: var(--font-size-sm); font-weight: 700; color: var(--gray-900); }
.drug-interaction-alert { display: flex; align-items: flex-start; gap: var(--spacing-sm); padding: var(--spacing-md); background: var(--warning-light); border: 1px solid var(--warning); border-radius: var(--radius-md); margin-bottom: var(--spacing-lg); color: #92400E; font-size: var(--font-size-sm); }
.drug-interaction-alert &gt; i { color: var(--warning); font-size: var(--font-size-lg); margin-top: 2px; flex-shrink: 0; }
.alert-content { flex: 1; }
.alert-close { color: #92400E; padding: 4px; border-radius: var(--radius-sm); transition: background var(--transition-fast); }
.alert-close:hover { background: rgba(146, 64, 14, 0.1); }
.time-slots { display: flex; flex-direction: column; gap: var(--spacing-md); margin-bottom: var(--spacing-lg); }
.time-slot { background: var(--bg-secondary); border-radius: var(--radius-md); padding: var(--spacing-md); border: 1px solid var(--gray-200); }
.time-slot__header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--spacing-sm); }
.time-slot__label { display: flex; align-items: center; gap: var(--spacing-sm); font-weight: 700; color: var(--gray-900); font-size: var(--font-size-base); }
.time-slot__time { font-size: var(--font-size-xs); color: var(--gray-500); }
.medication-items { display: flex; flex-direction: column; gap: var(--spacing-sm); }
.med-item { display: flex; align-items: center; gap: var(--spacing-md); padding: var(--spacing-md); background: var(--bg-primary); border-radius: var(--radius-md); border: 1px solid var(--gray-200); transition: all var(--transition-fast); }
.med-item:hover { box-shadow: var(--shadow-sm); }
.med-item__time { font-weight: 700; color: var(--gray-900); font-size: var(--font-size-sm); min-width: 50px; }
.med-item__info { flex: 1; display: flex; flex-direction: column; gap: 2px; }
.med-item__name { font-weight: 700; color: var(--gray-900); font-size: var(--font-size-base); }
.med-item__dosage { font-size: var(--font-size-sm); color: var(--gray-700); }
.med-item__note { font-size: var(--font-size-xs); color: var(--gray-500); font-style: italic; }
.med-item__check { width: 44px; height: 44px; border-radius: 50%; background: var(--bg-secondary); color: var(--gray-400); border: 2px solid var(--gray-300); display: flex; align-items: center; justify-content: center; font-size: var(--font-size-lg); transition: all var(--transition-fast); flex-shrink: 0; }
.med-item__check:hover:not(:disabled) { background: var(--success-light); color: var(--success); border-color: var(--success); transform: scale(1.05); }
.med-item--taken { opacity: 0.65; }
.med-item--taken .med-item__check { background: var(--success); color: white; border-color: var(--success); }
.med-item--taken .med-item__name { text-decoration: line-through; }
.med-item--current { border-color: var(--primary); background: var(--primary-light); box-shadow: 0 0 0 3px rgba(0, 102, 255, 0.1); }
.med-item--current .med-item__check { background: var(--primary); color: white; border-color: var(--primary); animation: pulse 2s infinite; }
.adherence-week { background: var(--bg-secondary); border-radius: var(--radius-md); padding: var(--spacing-md); margin-bottom: var(--spacing-md); }
.adherence-title { font-size: var(--font-size-sm); font-weight: 700; color: var(--gray-800); margin-bottom: var(--spacing-md); display: flex; align-items: center; gap: var(--spacing-sm); }
.adherence-bars { display: grid; grid-template-columns: repeat(7, 1fr); gap: var(--spacing-sm); height: 80px; align-items: flex-end; margin-bottom: var(--spacing-sm); }
.adherence-day { display: flex; flex-direction: column; align-items: center; gap: 4px; height: 100%; justify-content: flex-end; }
.adherence-bar { width: 100%; background: var(--success); border-radius: var(--radius-sm) var(--radius-sm) 0 0; min-height: 4px; position: relative; transition: height 0.5s ease-out; }
.adherence-bar--current { background: var(--primary); }
.adherence-value { position: absolute; top: -20px; left: 50%; transform: translateX(-50%); font-size: 10px; font-weight: 700; color: var(--gray-700); white-space: nowrap; }
.adherence-label { font-size: 11px; color: var(--gray-600); font-weight: 600; }
.adherence-day--today .adherence-label { color: var(--primary); font-weight: 700; }
.adherence-summary { display: flex; justify-content: space-between; padding-top: var(--spacing-sm); border-top: 1px solid var(--gray-200); font-size: var(--font-size-xs); color: var(--gray-600); }
.btn-add-medication { width: 100%; padding: var(--spacing-md); background: var(--bg-secondary); border: 2px dashed var(--gray-300); border-radius: var(--radius-md); color: var(--gray-600); font-weight: 600; font-size: var(--font-size-sm); display: flex; align-items: center; justify-content: center; gap: var(--spacing-sm); transition: all var(--transition-fast); }
.btn-add-medication:hover { background: var(--primary-light); border-color: var(--primary); color: var(--primary-dark); }

/* ============================================
7. EMERGENCY (SOS)
============================================ */
.emergency-section { margin-top: var(--spacing-lg); }
.emergency-card { background: var(--bg-primary); border-radius: var(--radius-lg); border: 2px solid var(--danger); box-shadow: var(--shadow-lg); padding: var(--spacing-lg); }
.emergency-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--spacing-lg); padding-bottom: var(--spacing-md); border-bottom: 2px solid var(--danger-light); }
.emergency-header__info { display: flex; align-items: center; gap: var(--spacing-md); }
.emergency-header__icon { width: 56px; height: 56px; background: var(--danger); color: white; border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; font-size: 28px; }
.emergency-header__title { font-size: var(--font-size-xl); font-weight: 700; color: var(--gray-900); margin: 0; }
.emergency-header__subtitle { font-size: var(--font-size-sm); color: var(--gray-500); margin-top: 2px; }
.emergency-status { display: flex; align-items: center; gap: var(--spacing-xs); font-size: var(--font-size-sm); color: var(--success); font-weight: 600; }
.status-dot--green { width: 10px; height: 10px; background: var(--success); border-radius: 50%; animation: pulse 2s infinite; }
.sos-button-container { display: flex; justify-content: center; margin: var(--spacing-xl) 0; }
.sos-button { position: relative; width: 200px; height: 200px; border-radius: 50%; background: var(--danger); color: white; border: none; cursor: pointer; transition: transform var(--transition-fast); }
.sos-button:hover { transform: scale(1.05); }
.sos-button:active { transform: scale(0.95); }
.sos-button__pulse { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100%; height: 100%; border-radius: 50%; background: var(--danger); opacity: 0.6; animation: sos-pulse 2s infinite; }
.sos-button__inner { position: relative; z-index: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; width: 100%; height: 100%; border-radius: 50%; background: var(--danger); }
.sos-button__inner i { font-size: 48px; }
.sos-button__text { font-size: 32px; font-weight: 800; letter-spacing: 2px; }
.sos-button__subtext { font-size: var(--font-size-xs); opacity: 0.9; }
.emergency-quick-actions { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--spacing-sm); margin-bottom: var(--spacing-lg); }
.quick-action { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--spacing-xs); padding: var(--spacing-md); background: var(--bg-secondary); border: 1px solid var(--gray-200); border-radius: var(--radius-md); color: var(--gray-700); font-weight: 600; font-size: var(--font-size-xs); transition: all var(--transition-fast); }
.quick-action i { font-size: var(--font-size-xl); color: var(--primary); }
.quick-action:hover { background: var(--primary-light); border-color: var(--primary); color: var(--primary-dark); }
.location-info { background: var(--bg-secondary); border-radius: var(--radius-md); padding: var(--spacing-md); margin-bottom: var(--spacing-lg); border: 1px solid var(--gray-200); }
.location-info__header { display: flex; align-items: center; gap: var(--spacing-sm); font-weight: 700; color: var(--gray-900); margin-bottom: var(--spacing-sm); }
.location-info__header i { color: var(--primary); }
.location-info__content { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--spacing-sm); font-size: var(--font-size-sm); }
.location-coordinates { display: flex; flex-direction: column; gap: 2px; }
.coord-label { color: var(--gray-500); font-size: var(--font-size-xs); }
.coord-value { font-weight: 700; color: var(--gray-900); font-family: monospace; }

/* ============================================
8. LAB RESULTS
============================================ */
.lab-results-section { margin-top: var(--spacing-lg); }
.lab-card { background: var(--bg-primary); border-radius: var(--radius-lg); border: 1px solid var(--gray-200); box-shadow: var(--shadow-sm); padding: var(--spacing-lg); }
.lab-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--spacing-lg); padding-bottom: var(--spacing-md); border-bottom: 1px solid var(--gray-200); }
.lab-header__info { display: flex; align-items: center; gap: var(--spacing-md); }
.lab-header__icon { width: 48px; height: 48px; background: linear-gradient(135deg, #8B5CF6, #6366F1); color: white; border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; font-size: var(--font-size-2xl); }
.lab-header__title { font-size: var(--font-size-xl); font-weight: 700; color: var(--gray-900); margin: 0; }
.lab-header__subtitle { font-size: var(--font-size-sm); color: var(--gray-500); margin-top: 2px; }
.lab-stats { display: flex; gap: var(--spacing-md); }
.lab-stat { text-align: center; padding: 8px 16px; background: var(--bg-secondary); border-radius: var(--radius-md); }
.lab-stat__value { display: block; font-size: var(--font-size-xl); font-weight: 800; color: var(--gray-900); line-height: 1; }
.lab-stat__label { font-size: var(--font-size-xs); color: var(--gray-500); margin-top: 4px; }
.upload-zone { border: 2px dashed var(--gray-300); border-radius: var(--radius-lg); padding: var(--spacing-xl); text-align: center; cursor: pointer; transition: all var(--transition-fast); background: var(--bg-secondary); margin-bottom: var(--spacing-lg); }
.upload-zone:hover, .upload-zone.dragover { border-color: var(--primary); background: var(--primary-light); }
.upload-zone__icon { width: 72px; height: 72px; background: var(--primary-light); color: var(--primary); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 32px; margin: 0 auto var(--spacing-md); }
.upload-zone__title { font-size: var(--font-size-lg); font-weight: 700; color: var(--gray-900); margin-bottom: 4px; }
.upload-zone__subtitle { font-size: var(--font-size-sm); color: var(--gray-500); margin-bottom: var(--spacing-md); }
.upload-zone__formats { display: flex; justify-content: center; gap: var(--spacing-xs); margin-bottom: var(--spacing-md); }
.format-badge { padding: 4px 10px; background: var(--bg-primary); border: 1px solid var(--gray-200); border-radius: var(--radius-full); font-size: 11px; font-weight: 700; color: var(--gray-600); }
.upload-zone__hint { font-size: var(--font-size-xs); color: var(--gray-500); display: flex; align-items: center; justify-content: center; gap: 4px; }
.upload-zone__hint i { color: var(--success); }
.ocr-progress { background: var(--bg-secondary); border-radius: var(--radius-md); padding: var(--spacing-md); margin-bottom: var(--spacing-lg); border: 1px solid var(--gray-200); }
.ocr-progress__header { display: flex; align-items: center; gap: var(--spacing-sm); font-weight: 600; color: var(--gray-900); margin-bottom: var(--spacing-md); }
.ocr-progress__header i { color: var(--primary); }
.ocr-progress__bar { height: 8px; background: var(--gray-200); border-radius: var(--radius-full); overflow: hidden; margin-bottom: var(--spacing-md); }
.ocr-progress__fill { height: 100%; background: linear-gradient(90deg, var(--primary), #8B5CF6); border-radius: var(--radius-full); width: 0%; transition: width 0.3s ease-out; }
.ocr-progress__stages { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--spacing-xs); }
.ocr-stage { display: flex; flex-direction: column; align-items: center; gap: 4px; font-size: 11px; color: var(--gray-400); text-align: center; }
.ocr-stage i { font-size: 14px; }
.ocr-stage--done { color: var(--success); }
.ocr-stage--active { color: var(--primary); font-weight: 600; }
.analysis-result { background: var(--bg-primary); border-radius: var(--radius-md); border: 1px solid var(--gray-200); overflow: hidden; margin-bottom: var(--spacing-lg); }
.analysis-header { display: flex; justify-content: space-between; align-items: center; padding: var(--spacing-md); background: var(--bg-secondary); border-bottom: 1px solid var(--gray-200); }
.analysis-header__info { display: flex; align-items: center; gap: var(--spacing-md); }
.analysis-header__info i { font-size: var(--font-size-xl); color: var(--primary); }
.analysis-title { font-size: var(--font-size-base); font-weight: 700; color: var(--gray-900); margin: 0; }
.analysis-meta { font-size: var(--font-size-xs); color: var(--gray-500); margin-top: 2px; }
.analysis-actions { display: flex; gap: var(--spacing-xs); }
.btn-icon { width: 36px; height: 36px; border-radius: var(--radius-md); background: var(--bg-primary); color: var(--gray-600); display: flex; align-items: center; justify-content: center; transition: all var(--transition-fast); }
.btn-icon:hover { background: var(--primary-light); color: var(--primary); }
.ai-interpretation { padding: var(--spacing-md); background: linear-gradient(135deg, #E6F0FF, #F3E8FF); border-bottom: 1px solid var(--gray-200); }
.ai-interpretation__header { display: flex; align-items: center; gap: var(--spacing-sm); font-weight: 700; color: var(--primary-dark); font-size: var(--font-size-sm); margin-bottom: var(--spacing-sm); }
.ai-interpretation__header i { color: var(--primary); }
.ai-interpretation__text { font-size: var(--font-size-sm); color: var(--gray-800); line-height: 1.6; margin-bottom: var(--spacing-sm); }
.ai-interpretation__disclaimer { font-size: 11px; color: var(--gray-500); display: flex; align-items: center; gap: 4px; padding-top: var(--spacing-sm); border-top: 1px dashed rgba(0, 102, 255, 0.2); }
.indicators-table { padding: var(--spacing-sm) 0; }
.indicator-row { display: grid; grid-template-columns: 2fr 1.5fr 1.5fr 80px auto; align-items: center; gap: var(--spacing-md); padding: 12px var(--spacing-md); border-bottom: 1px solid var(--gray-100); transition: background var(--transition-fast); }
.indicator-row:hover { background: var(--bg-secondary); }
.indicator-row:last-child { border-bottom: none; }
.indicator-row--warning { background: rgba(245, 158, 11, 0.05); }
.indicator-row--danger { background: rgba(239, 68, 68, 0.05); }
.indicator-name { display: flex; flex-direction: column; }
.indicator-label { font-weight: 700; color: var(--gray-900); font-size: var(--font-size-sm); }
.indicator-code { font-size: 11px; color: var(--gray-400); font-family: monospace; }
.indicator-value { display: flex; align-items: baseline; gap: 4px; }
.value-current { font-size: var(--font-size-lg); font-weight: 800; color: var(--gray-900); }
.value-current--warning { color: var(--warning); }
.value-current--danger { color: var(--danger); }
.value-unit { font-size: var(--font-size-xs); color: var(--gray-500); }
.indicator-ref { display: flex; flex-direction: column; }
.ref-label { font-size: 11px; color: var(--gray-500); }
.ref-range { font-size: var(--font-size-sm); color: var(--gray-700); font-weight: 600; }
.indicator-trend { display: flex; align-items: center; }
.trend-chart { width: 100%; height: 30px; }
.indicator-status { display: flex; justify-content: flex-end; }
.status-badge { padding: 4px 10px; border-radius: var(--radius-full); font-size: 11px; font-weight: 700; white-space: nowrap; }
.status-badge--normal { background: var(--success-light); color: var(--success); }
.status-badge--warning { background: var(--warning-light); color: #B45309; }
.status-badge--danger { background: var(--danger-light); color: var(--danger); }
.recommendations { padding: var(--spacing-md); background: var(--bg-secondary); border-top: 1px solid var(--gray-200); }
.recommendations-title { display: flex; align-items: center; gap: var(--spacing-sm); font-size: var(--font-size-base); font-weight: 700; color: var(--gray-900); margin-bottom: var(--spacing-md); }
.recommendations-title i { color: var(--warning); }
.recommendations-list { list-style: none; display: flex; flex-direction: column; gap: var(--spacing-sm); }
.recommendations-list li { display: flex; align-items: flex-start; gap: var(--spacing-md); padding: var(--spacing-sm); background: var(--bg-primary); border-radius: var(--radius-md); border: 1px solid var(--gray-200); }
.recommendations-list li i { width: 32px; height: 32px; background: var(--primary-light); color: var(--primary); border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.recommendations-list li strong { display: block; color: var(--gray-900); font-size: var(--font-size-sm); margin-bottom: 2px; }
.recommendations-list li span { font-size: var(--font-size-xs); color: var(--gray-600); }

/* ============================================
9. ANALYTICS
============================================ */
.analytics-section { margin-top: var(--spacing-lg); }
.analytics-card { background: var(--bg-primary); border-radius: var(--radius-lg); border: 1px solid var(--gray-200); box-shadow: var(--shadow-sm); padding: var(--spacing-lg); }
.analytics-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--spacing-lg); padding-bottom: var(--spacing-md); border-bottom: 1px solid var(--gray-200); }
.analytics-header__info { display: flex; align-items: center; gap: var(--spacing-md); }
.analytics-header__icon { width: 48px; height: 48px; background: linear-gradient(135deg, #3B82F6, #1D4ED8); color: white; border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; font-size: var(--font-size-2xl); }
.analytics-header__title { font-size: var(--font-size-xl); font-weight: 700; color: var(--gray-900); margin: 0; }
.analytics-header__subtitle { font-size: var(--font-size-sm); color: var(--gray-500); margin-top: 2px; }
.period-selector { display: flex; gap: 4px; background: var(--bg-secondary); padding: 4px; border-radius: var(--radius-md); }
.period-btn { padding: 6px 12px; background: transparent; border: none; border-radius: var(--radius-sm); font-size: var(--font-size-xs); font-weight: 600; color: var(--gray-600); cursor: pointer; transition: all var(--transition-fast); }
.period-btn:hover { color: var(--gray-900); }
.period-btn.active { background: var(--bg-primary); color: var(--primary); box-shadow: var(--shadow-sm); }
.metrics-switcher { display: flex; gap: var(--spacing-xs); margin-bottom: var(--spacing-lg); overflow-x: auto; padding-bottom: 4px; }
.metric-tab { display: flex; align-items: center; gap: var(--spacing-xs); padding: 10px 16px; background: var(--bg-secondary); border: 1px solid var(--gray-200); border-radius: var(--radius-md); font-size: var(--font-size-sm); font-weight: 600; color: var(--gray-700); cursor: pointer; transition: all var(--transition-fast); white-space: nowrap; }
.metric-tab:hover { background: var(--bg-tertiary); }
.metric-tab.active { background: var(--primary-light); border-color: var(--primary); color: var(--primary-dark); }
.metric-tab i { font-size: var(--font-size-base); }
.main-chart-container { background: var(--bg-secondary); border-radius: var(--radius-md); padding: var(--spacing-md); margin-bottom: var(--spacing-lg); }
.chart-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: var(--spacing-md); }
.chart-title h3 { font-size: var(--font-size-lg); font-weight: 700; color: var(--gray-900); margin: 0; }
.chart-period { font-size: var(--font-size-xs); color: var(--gray-500); margin-top: 2px; }
.chart-stats { display: flex; gap: var(--spacing-lg); }
.chart-stat { display: flex; flex-direction: column; gap: 2px; }
.stat-label { font-size: 11px; color: var(--gray-500); text-transform: uppercase; letter-spacing: 0.5px; }
.stat-value { font-size: var(--font-size-xl); font-weight: 800; color: var(--gray-900); }
.stat-trend { font-size: var(--font-size-xs); font-weight: 600; display: flex; align-items: center; gap: 2px; }
.trend-down { color: var(--success); }
.trend-up { color: var(--danger); }
.chart-wrapper { position: relative; }
.chart-svg { width: 100%; height: auto; }
.chart-point { transition: r 0.2s ease; cursor: pointer; }
.chart-point:hover { r: 6; }
.ai-insights { margin-bottom: var(--spacing-lg); }
.insights-header { display: flex; align-items: center; gap: var(--spacing-sm); font-size: var(--font-size-base); font-weight: 700; color: var(--gray-900); margin-bottom: var(--spacing-md); }
.insights-header i { color: var(--warning); }
.insights-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--spacing-md); }
.insight-card { display: flex; gap: var(--spacing-md); padding: var(--spacing-md); background: var(--bg-secondary); border-radius: var(--radius-md); border-left: 4px solid var(--gray-300); }
.insight-card--success { border-left-color: var(--success); }
.insight-card--info { border-left-color: var(--info); }
.insight-card--warning { border-left-color: var(--warning); }
.insight-card--primary { border-left-color: var(--primary); }
.insight-icon { width: 40px; height: 40px; border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; font-size: var(--font-size-lg); flex-shrink: 0; }
.insight-card--success .insight-icon { background: var(--success-light); color: var(--success); }
.insight-card--info .insight-icon { background: var(--info-light); color: var(--info); }
.insight-card--warning .insight-icon { background: var(--warning-light); color: var(--warning); }
.insight-card--primary .insight-icon { background: var(--primary-light); color: var(--primary); }
.insight-content { flex: 1; }
.insight-title { font-size: var(--font-size-sm); font-weight: 700; color: var(--gray-900); margin: 0 0 4px 0; }
.insight-text { font-size: var(--font-size-xs); color: var(--gray-700); line-height: 1.5; margin: 0; }

/* ============================================
10. DERMATOLOGY
============================================ */
.dermatology-section { margin-top: var(--spacing-lg); }
.derma-card { background: var(--bg-primary); border-radius: var(--radius-lg); border: 1px solid var(--gray-200); box-shadow: var(--shadow-sm); padding: var(--spacing-lg); }
.derma-header { display: flex; align-items: center; gap: var(--spacing-md); margin-bottom: var(--spacing-lg); padding-bottom: var(--spacing-md); border-bottom: 1px solid var(--gray-200); }
.derma-header__info { display: flex; align-items: center; gap: var(--spacing-md); }
.derma-header__icon { width: 56px; height: 56px; background: linear-gradient(135deg, #8B5CF6, #6366F1); color: white; border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; font-size: 28px; }
.derma-header__title { font-size: var(--font-size-xl); font-weight: 700; color: var(--gray-900); margin: 0; }
.derma-header__subtitle { font-size: var(--font-size-sm); color: var(--gray-500); margin-top: 2px; }
.derma-upload-zone { border: 2px dashed var(--gray-300); border-radius: var(--radius-lg); padding: var(--spacing-xl); text-align: center; background: var(--bg-secondary); margin-bottom: var(--spacing-lg); }
.derma-upload-zone .upload-zone__icon { width: 80px; height: 80px; background: var(--primary-light); color: var(--primary); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 36px; margin: 0 auto var(--spacing-md); }
.derma-upload-zone .upload-zone__title { font-size: var(--font-size-lg); font-weight: 700; color: var(--gray-900); margin-bottom: var(--spacing-sm); }
.derma-upload-zone .upload-zone__subtitle { font-size: var(--font-size-sm); color: var(--gray-600); margin-bottom: var(--spacing-md); }
.upload-buttons { display: flex; gap: var(--spacing-sm); justify-content: center; margin-bottom: var(--spacing-md); }
.upload-hints { display: flex; gap: var(--spacing-md); justify-content: center; flex-wrap: wrap; }
.hint-item { display: flex; align-items: center; gap: 6px; font-size: var(--font-size-xs); color: var(--gray-600); }
.hint-item i { color: var(--success); }
.derma-analysis-progress { background: var(--bg-secondary); border-radius: var(--radius-md); padding: var(--spacing-lg); margin-bottom: var(--spacing-lg); }
.progress-header { display: flex; align-items: center; gap: var(--spacing-sm); font-weight: 600; color: var(--gray-900); margin-bottom: var(--spacing-md); }
.progress-header i { color: var(--primary); font-size: var(--font-size-lg); }
.progress-steps { display: flex; flex-direction: column; gap: var(--spacing-sm); }
.progress-step { display: flex; align-items: center; gap: var(--spacing-sm); padding: var(--spacing-sm); background: var(--bg-primary); border-radius: var(--radius-md); opacity: 0.5; transition: all 0.3s ease; }
.progress-step.active { opacity: 1; background: var(--primary-light); }
.progress-step.completed { opacity: 1; }
.progress-step i { width: 20px; text-align: center; }
.progress-step.active i { color: var(--primary); }
.progress-step.completed i { color: var(--success); }
.derma-results { animation: fadeIn 0.5s ease-out; }
.derma-disclaimer { display: flex; align-items: flex-start; gap: var(--spacing-sm); padding: var(--spacing-md); background: var(--warning-light); border-left: 4px solid var(--warning); border-radius: var(--radius-md); margin-bottom: var(--spacing-lg); font-size: var(--font-size-sm); color: #92400E; }
.derma-disclaimer i { color: var(--warning); margin-top: 2px; }
.risk-assessment { background: var(--bg-secondary); border-radius: var(--radius-md); padding: var(--spacing-md); margin-bottom: var(--spacing-lg); }
.risk-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--spacing-md); }
.risk-header h3 { font-size: var(--font-size-base); font-weight: 700; color: var(--gray-900); margin: 0; }
.risk-badge { padding: 4px 12px; border-radius: var(--radius-full); font-size: var(--font-size-xs); font-weight: 700; }
.risk-badge.low { background: var(--success-light); color: var(--success); }
.risk-badge.medium { background: var(--warning-light); color: var(--warning); }
.risk-badge.high { background: var(--danger-light); color: var(--danger); }
.risk-meter { margin-bottom: var(--spacing-sm); }
.risk-meter__bar { height: 12px; background: linear-gradient(90deg, var(--success) 0%, var(--warning) 50%, var(--danger) 100%); border-radius: var(--radius-full); overflow: hidden; position: relative; }
.risk-meter__fill { height: 100%; background: white; border-radius: var(--radius-full); transition: width 1s ease-out; }
.risk-meter__labels { display: flex; justify-content: space-between; font-size: var(--font-size-xs); color: var(--gray-500); }
.risk-percentage { text-align: center; font-size: var(--font-size-sm); font-weight: 600; color: var(--gray-700); }
.abcde-analysis { margin-bottom: var(--spacing-lg); }
.abcde-analysis h3 { font-size: var(--font-size-base); font-weight: 700; color: var(--gray-900); margin-bottom: var(--spacing-md); }
.abcde-grid { display: grid; grid-template-columns: 1fr; gap: var(--spacing-sm); }
.abcde-item { display: flex; gap: var(--spacing-md); padding: var(--spacing-md); background: var(--bg-secondary); border-radius: var(--radius-md); border-left: 4px solid var(--gray-300); }
.abcde-item.warning { border-left-color: var(--warning); }
.abcde-item.danger { border-left-color: var(--danger); }
.abcde-icon { width: 40px; height: 40px; background: var(--primary); color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 800; flex-shrink: 0; }
.abcde-content h4 { font-size: var(--font-size-sm); font-weight: 700; color: var(--gray-900); margin-bottom: 4px; }
.abcde-content p { font-size: var(--font-size-xs); color: var(--gray-600); margin-bottom: 4px; }
.abcde-status { font-size: 11px; font-weight: 600; }
.abcde-status.status-ok { color: var(--success); }
.abcde-status.status-warning { color: var(--warning); }
.abcde-status.status-danger { color: var(--danger); }
.abcde-status.status-info { color: var(--info); }
.ml-classification { margin-bottom: var(--spacing-lg); }
.ml-classification h3 { font-size: var(--font-size-base); font-weight: 700; color: var(--gray-900); margin-bottom: var(--spacing-md); }
.classification-bars { display: flex; flex-direction: column; gap: var(--spacing-md); }
.class-bar__label { display: flex; justify-content: space-between; font-size: var(--font-size-sm); margin-bottom: 4px; }
.class-bar__label span:first-child { font-weight: 600; color: var(--gray-700); }
.class-bar__value { font-weight: 700; color: var(--gray-900); }
.class-bar__track { height: 8px; background: var(--gray-200); border-radius: var(--radius-full); overflow: hidden; }
.class-bar__fill { height: 100%; background: var(--primary); border-radius: var(--radius-full); transition: width 1s ease-out; }
.similar-cases { margin-bottom: var(--spacing-lg); }
.similar-cases h3 { font-size: var(--font-size-base); font-weight: 700; color: var(--gray-900); margin-bottom: var(--spacing-md); }
.cases-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: var(--spacing-sm); }
.case-item { background: var(--bg-secondary); border-radius: var(--radius-md); overflow: hidden; border: 1px solid var(--gray-200); }
.case-item img { width: 100%; height: 120px; object-fit: cover; }
.case-item__info { padding: var(--spacing-xs); }
.case-item__label { font-size: 11px; color: var(--gray-600); }
.case-item__similarity { font-size: 11px; font-weight: 700; color: var(--primary); }
.derma-recommendations { margin-bottom: var(--spacing-lg); }
.derma-recommendations h3 { font-size: var(--font-size-base); font-weight: 700; color: var(--gray-900); margin-bottom: var(--spacing-md); }
.derma-recommendations ul { list-style: none; padding: 0; margin: 0; }
.derma-recommendations li { display: flex; align-items: flex-start; gap: var(--spacing-sm); padding: var(--spacing-sm); background: var(--bg-secondary); border-radius: var(--radius-md); margin-bottom: var(--spacing-xs); font-size: var(--font-size-sm); color: var(--gray-700); }
.derma-recommendations li i { color: var(--primary); margin-top: 2px; }
.derma-actions { display: flex; gap: var(--spacing-sm); flex-wrap: wrap; }
.derma-actions .btn { flex: 1; min-width: 200px; }

/* ============================================
11. NAVIGATION
============================================ */
.sidebar { position: fixed; top: 0; left: 0; width: 260px; height: 100vh; background: var(--bg-primary); border-right: 1px solid var(--gray-200); display: none; flex-direction: column; z-index: 1000; box-shadow: 2px 0 8px rgba(0, 0, 0, 0.05); overflow-y: auto; }
.sidebar__header { padding: 24px 16px; border-bottom: 1px solid var(--gray-200); flex-shrink: 0; }
.sidebar__logo { display: flex; align-items: center; gap: 12px; font-size: 24px; font-weight: 800; color: var(--gray-900); }
.sidebar__logo i { color: var(--primary); font-size: 28px; }
.sidebar__nav { flex: 1; padding: 16px 8px; display: flex; flex-direction: column; gap: 4px; overflow-y: auto; }
.nav-item { display: flex; align-items: center; gap: 12px; padding: 12px 16px; background: transparent; border: none; border-radius: 12px; color: var(--gray-700); font-size: 14px; font-weight: 600; cursor: pointer; transition: all 0.2s ease; position: relative; text-align: left; width: 100%; }
.nav-item i { font-size: 18px; width: 24px; text-align: center; flex-shrink: 0; }
.nav-item:hover { background: var(--bg-secondary); color: var(--gray-900); }
.nav-item--active { background: var(--primary-light); color: var(--primary-dark); }
.nav-item--active::before { content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 3px; height: 24px; background: var(--primary); border-radius: 0 9999px 9999px 0; }
.nav-item--sos { background: var(--danger); color: white; justify-content: center; margin-bottom: 8px; }
.nav-item--sos:hover { background: #DC2626; color: white; }
.nav-badge { margin-left: auto; background: var(--danger); color: white; font-size: 10px; font-weight: 700; padding: 2px 6px; border-radius: 9999px; min-width: 20px; text-align: center; }
.sidebar__footer { padding: 16px; border-top: 1px solid var(--gray-200); flex-shrink: 0; }
.sidebar__user { display: flex; align-items: center; gap: 12px; padding: 8px; background: var(--bg-secondary); border-radius: 12px; }
.sidebar__user img { width: 40px; height: 40px; border-radius: 50%; }
.sidebar__user-info { display: flex; flex-direction: column; }
.sidebar__user-name { font-size: 14px; font-weight: 700; color: var(--gray-900); }
.sidebar__user-status { font-size: 11px; color: var(--success); display: flex; align-items: center; gap: 4px; }
.sidebar__user-status::before { content: ''; width: 6px; height: 6px; background: var(--success); border-radius: 50%; }
.tab-bar { display: flex; position: fixed; bottom: 0; left: 0; right: 0; background: var(--bg-primary); border-top: 1px solid var(--gray-200); box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.05); z-index: 1000; padding: 8px 0 calc(8px + env(safe-area-inset-bottom)); }
.tab-item { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; padding: 8px 4px; background: transparent; border: none; color: var(--gray-500); font-size: 11px; font-weight: 600; cursor: pointer; transition: color 0.2s ease; position: relative; }
.tab-item i { font-size: 18px; transition: transform 0.2s ease; }
.tab-item:hover { color: var(--gray-700); }
.tab-item--active { color: var(--primary); }
.tab-item--active i { transform: scale(1.1); }
.tab-item--active::after { content: ''; position: absolute; top: 0; left: 50%; transform: translateX(-50%); width: 24px; height: 3px; background: var(--primary); border-radius: 0 0 9999px 9999px; }
.tab-badge { position: absolute; top: 4px; right: calc(50% - 20px); background: var(--danger); color: white; font-size: 9px; font-weight: 700; padding: 1px 5px; border-radius: 9999px; min-width: 16px; text-align: center; }
.tab-item--sos { padding: 4px; }
.tab-sos-button { width: 48px; height: 48px; background: var(--danger); color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 18px; margin-top: -20px; box-shadow: 0 4px 12px rgba(239, 68, 68, 0.4); transition: all 0.2s ease; position: relative; }
.tab-sos-button::before { content: ''; position: absolute; inset: -4px; border-radius: 50%; background: var(--danger); opacity: 0.3; animation: sos-pulse 2s infinite; z-index: -1; }
.tab-item--sos:hover .tab-sos-button { transform: scale(1.05); box-shadow: 0 6px 16px rgba(239, 68, 68, 0.5); }
.tab-item--sos span { color: var(--danger); margin-top: 4px; }

/* ============================================
12. MODAL &amp; TOAST
============================================ */
.modal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 1100; align-items: center; justify-content: center; }
.modal.active { display: flex; }
.modal__overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.7); backdrop-filter: blur(4px); }
.modal__content { position: relative; background: var(--bg-primary); border-radius: var(--radius-lg); box-shadow: var(--shadow-lg); max-width: 500px; width: 90%; max-height: 90vh; overflow-y: auto; animation: fadeIn 0.3s ease-out; }
.modal__header { display: flex; flex-direction: column; align-items: center; gap: var(--spacing-md); padding: var(--spacing-lg); border-bottom: 1px solid var(--gray-200); }
.modal__icon { width: 64px; height: 64px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 32px; }
.modal__icon--danger { background: var(--danger); color: white; }
.modal__title { font-size: var(--font-size-xl); font-weight: 700; color: var(--gray-900); }
.modal__body { padding: var(--spacing-lg); }
.modal__footer { display: flex; gap: var(--spacing-sm); padding: var(--spacing-md) var(--spacing-lg); border-top: 1px solid var(--gray-200); background: var(--bg-secondary); }
.countdown-container { display: flex; flex-direction: column; align-items: center; gap: var(--spacing-md); margin-bottom: var(--spacing-lg); }
.countdown-circle { position: relative; width: 120px; height: 120px; }
.countdown-circle svg { transform: rotate(-90deg); width: 100%; height: 100%; }
.countdown-bg { fill: none; stroke: var(--gray-200); stroke-width: 8; }
.countdown-progress { fill: none; stroke: var(--danger); stroke-width: 8; stroke-linecap: round; stroke-dasharray: 283; stroke-dashoffset: 0; transition: stroke-dashoffset 1s linear; }
.countdown-number { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 48px; font-weight: 800; color: var(--danger); }
.countdown-text { font-size: var(--font-size-base); color: var(--gray-700); }
.emergency-summary { display: flex; flex-direction: column; gap: var(--spacing-sm); padding: var(--spacing-md); background: var(--bg-secondary); border-radius: var(--radius-md); }
.summary-item { display: flex; align-items: center; gap: var(--spacing-sm); font-size: var(--font-size-sm); color: var(--gray-700); }
.summary-item i { color: var(--success); }
.btn--lg { padding: 12px 24px; font-size: var(--font-size-base); flex: 1; }
.btn--danger { background: var(--danger); color: white; }
.btn--danger:hover { background: #DC2626; }
.toast-container { position: fixed; top: 80px; right: 20px; z-index: 1200; display: flex; flex-direction: column; gap: var(--spacing-sm); max-width: 400px; }
.toast { display: flex; align-items: flex-start; gap: var(--spacing-md); padding: var(--spacing-md); background: var(--bg-primary); border-radius: var(--radius-md); box-shadow: var(--shadow-lg); border-left: 4px solid var(--gray-300); animation: fadeIn 0.3s ease-out; min-width: 300px; }
.toast--success { border-left-color: var(--success); }
.toast--warning { border-left-color: var(--warning); }
.toast--danger { border-left-color: var(--danger); }
.toast--info { border-left-color: var(--info); }
.toast__icon { width: 32px; height: 32px; border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; font-size: var(--font-size-lg); flex-shrink: 0; }
.toast--success .toast__icon { background: var(--success-light); color: var(--success); }
.toast--warning .toast__icon { background: var(--warning-light); color: var(--warning); }
.toast--danger .toast__icon { background: var(--danger-light); color: var(--danger); }
.toast--info .toast__icon { background: var(--info-light); color: var(--info); }
.toast__content { flex: 1; }
.toast__title { font-weight: 700; font-size: var(--font-size-sm); color: var(--gray-900); margin-bottom: 2px; }
.toast__message { font-size: var(--font-size-xs); color: var(--gray-600); line-height: 1.4; }
.toast__close { color: var(--gray-400); padding: 4px; border-radius: var(--radius-sm); transition: all var(--transition-fast); }
.toast__close:hover { background: var(--gray-100); color: var(--gray-700); }

/* ============================================
13. FOOTER
============================================ */
.app-footer { background: var(--bg-primary); border-top: 1px solid var(--gray-200); padding: var(--spacing-lg) 0; margin-top: var(--spacing-xl); text-align: center; }
.footer-logo { display: flex; align-items: center; justify-content: center; gap: var(--spacing-sm); font-size: var(--font-size-xl); font-weight: 800; color: var(--gray-900); margin-bottom: var(--spacing-md); }
.footer-logo i { color: var(--primary); }
.footer-disclaimer { font-size: var(--font-size-xs); color: var(--gray-600); line-height: 1.6; max-width: 600px; margin: 0 auto var(--spacing-md); padding: var(--spacing-md); background: var(--warning-light); border-radius: var(--radius-md); border: 1px solid var(--warning); }
.footer-copyright { font-size: 11px; color: var(--gray-400); }

/* ============================================
АДАПТИВНОСТЬ
============================================ */
@media (min-width: 1000px) {
.sidebar { display: flex !important; }
.tab-bar { display: none !important; }
.app-shell { margin-left: 260px; }
.header { position: sticky; left: 0; right: 0; width: 100%; }
.app-content { padding-bottom: 24px; }
.dashboard__grid { grid-template-columns: repeat(2, 1fr); }
.widget--vitals, .widget--medication { grid-column: span 2; }
.medical-info-grid { grid-template-columns: repeat(2, 1fr); }
.abcde-grid { grid-template-columns: repeat(2, 1fr); }
.upload-hints { justify-content: flex-start; }
}
@media (max-width: 999px) {
.sidebar { display: none !important; }
.tab-bar { display: flex !important; }
.app-shell { margin-left: 0; }
}
@media (max-width: 768px) {
.chat-messages { max-height: 250px; }
.chip { font-size: var(--font-size-xs); padding: 4px 10px; }
.status-detail { display: none; }
.lab-header { flex-direction: column; align-items: flex-start; gap: var(--spacing-md); }
.indicator-row { grid-template-columns: 1fr 1fr; grid-template-areas: "name status" "value ref" "trend trend"; gap: var(--spacing-sm); }
.indicator-name { grid-area: name; }
.indicator-value { grid-area: value; }
.indicator-ref { grid-area: ref; }
.indicator-trend { grid-area: trend; }
.indicator-status { grid-area: status; justify-content: flex-end; }
.ocr-progress__stages { grid-template-columns: repeat(2, 1fr); }
.analytics-header { flex-direction: column; align-items: flex-start; gap: var(--spacing-md); }
.chart-header { flex-direction: column; gap: var(--spacing-md); }
.chart-stats { width: 100%; justify-content: space-between; }
.insights-grid { grid-template-columns: 1fr; }
.derma-header { flex-direction: column; align-items: flex-start; }
.upload-buttons { flex-direction: column; }
.derma-actions { flex-direction: column; }
.derma-actions .btn { width: 100%; }
}
@media (max-width: 640px) {
.sos-button { width: 160px; height: 160px; }
.sos-button__inner i { font-size: 36px; }
.sos-button__text { font-size: 24px; }
.emergency-quick-actions { grid-template-columns: 1fr; }
.location-info__content { grid-template-columns: 1fr; }
.modal__footer { flex-direction: column; }
}
@media (max-width: 480px) {
.period-selector { width: 100%; justify-content: space-between; }
.period-btn { flex: 1; text-align: center; }
.tracker-header { flex-direction: column; align-items: flex-start; gap: var(--spacing-md); }
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="app-shell"&gt;
&lt;aside class="sidebar" id="sidebar"&gt;
&lt;div class="sidebar__header"&gt;
&lt;div class="sidebar__logo"&gt;&lt;i class="fas fa-heartbeat"&gt;&lt;/i&gt;&lt;span&gt;Medilav&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;nav class="sidebar__nav"&gt;
&lt;button class="nav-item nav-item--active" data-section="dashboard" onclick="switchSection('dashboard')"&gt;&lt;i class="fas fa-house"&gt;&lt;/i&gt;&lt;span&gt;Главная&lt;/span&gt;&lt;/button&gt;
&lt;button class="nav-item" data-section="ai-chat" onclick="switchSection('ai-chat')"&gt;&lt;i class="fas fa-robot"&gt;&lt;/i&gt;&lt;span&gt;AI-ассистент&lt;/span&gt;&lt;span class="nav-badge"&gt;3&lt;/span&gt;&lt;/button&gt;
&lt;button class="nav-item" data-section="lab-results" onclick="switchSection('lab-results')"&gt;&lt;i class="fas fa-flask-vial"&gt;&lt;/i&gt;&lt;span&gt;Анализы&lt;/span&gt;&lt;/button&gt;
&lt;button class="nav-item" data-section="dermatology" onclick="switchSection('dermatology')"&gt;&lt;i class="fas fa-microscope"&gt;&lt;/i&gt;&lt;span&gt;Дерматоскопия&lt;/span&gt;&lt;/button&gt;
&lt;button class="nav-item" data-section="analytics" onclick="switchSection('analytics')"&gt;&lt;i class="fas fa-chart-line"&gt;&lt;/i&gt;&lt;span&gt;Аналитика&lt;/span&gt;&lt;/button&gt;
&lt;button class="nav-item" data-section="medical-id" onclick="switchSection('medical-id')"&gt;&lt;i class="fas fa-id-card"&gt;&lt;/i&gt;&lt;span&gt;Medical ID&lt;/span&gt;&lt;/button&gt;
&lt;/nav&gt;
&lt;div class="sidebar__footer"&gt;
&lt;button class="nav-item nav-item--sos" onclick="initiateEmergencyCall()"&gt;&lt;i class="fas fa-phone-alt"&gt;&lt;/i&gt;&lt;span&gt;SOS&lt;/span&gt;&lt;/button&gt;
&lt;div class="sidebar__user"&gt;
&lt;img src="https://ui-avatars.com/api/?name=Alex+P&amp;amp;background=0066FF&amp;amp;color=fff&amp;amp;size=40" alt="Аватар" /&gt;
&lt;div class="sidebar__user-info"&gt;
&lt;span class="sidebar__user-name"&gt;Алексей П.&lt;/span&gt;
&lt;span class="sidebar__user-status"&gt;В сети&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;main class="app-content"&gt;
&lt;header class="header animate-fade-in"&gt;
&lt;div class="container header__inner"&gt;
&lt;div class="header__brand"&gt;
&lt;div class="header__logo"&gt;&lt;i class="fas fa-heartbeat" style="color: var(--primary); font-size: 24px;"&gt;&lt;/i&gt;&lt;/div&gt;
&lt;span class="header__brand-name"&gt;Medilav&lt;/span&gt;
&lt;/div&gt;
&lt;div class="header__status" id="health-status"&gt;
&lt;div class="status-indicator status-green" id="status-indicator"&gt;
&lt;span class="status-dot"&gt;&lt;/span&gt;
&lt;span class="status-label"&gt;Здоров&lt;/span&gt;
&lt;/div&gt;
&lt;div class="status-detail"&gt;
&lt;span class="status-score" id="status-score"&gt;98&lt;/span&gt;
&lt;span&gt;/100&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="header__actions"&gt;
&lt;button class="header__btn" aria-label="Уведомления"&gt;&lt;i class="fas fa-bell"&gt;&lt;/i&gt;&lt;span class="notification-badge"&gt;3&lt;/span&gt;&lt;/button&gt;
&lt;button class="header__btn" aria-label="Профиль"&gt;&lt;img src="https://ui-avatars.com/api/?name=Alex+P&amp;amp;background=0066FF&amp;amp;color=fff&amp;amp;size=40" alt="Аватар" class="avatar-img" /&gt;&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/header&gt;
&lt;section class="dashboard animate-fade-in" id="dashboard"&gt;
&lt;div class="container"&gt;
&lt;h2 class="dashboard__title"&gt;Обзор здоровья&lt;/h2&gt;
&lt;div class="dashboard__grid"&gt;
&lt;div class="widget widget--vitals"&gt;
&lt;div class="widget__header"&gt;&lt;i class="fas fa-heart-pulse widget__icon" style="color: var(--danger);"&gt;&lt;/i&gt;&lt;span class="widget__title"&gt;Витальные показатели&lt;/span&gt;&lt;span class="widget__time"&gt;Сегодня, 08:30&lt;/span&gt;&lt;/div&gt;
&lt;div class="vitals__grid"&gt;
&lt;div class="vital-item"&gt;&lt;span class="vital-value"&gt;72&lt;/span&gt;&lt;span class="vital-unit"&gt;уд/мин&lt;/span&gt;&lt;span class="vital-label"&gt;Пульс&lt;/span&gt;&lt;/div&gt;
&lt;div class="vital-item"&gt;&lt;span class="vital-value"&gt;120/80&lt;/span&gt;&lt;span class="vital-unit"&gt;мм рт.ст.&lt;/span&gt;&lt;span class="vital-label"&gt;Давление&lt;/span&gt;&lt;/div&gt;
&lt;div class="vital-item"&gt;&lt;span class="vital-value"&gt;98&lt;/span&gt;&lt;span class="vital-unit"&gt;%&lt;/span&gt;&lt;span class="vital-label"&gt;SpO2&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="widget widget--medication"&gt;
&lt;div class="widget__header"&gt;&lt;i class="fas fa-pills widget__icon" style="color: var(--primary);"&gt;&lt;/i&gt;&lt;span class="widget__title"&gt;Следующий приём&lt;/span&gt;&lt;/div&gt;
&lt;div class="medication__card"&gt;
&lt;div class="medication__info"&gt;
&lt;span class="medication__name"&gt;Амлодипин 5 мг&lt;/span&gt;
&lt;span class="medication__time"&gt;&lt;i class="far fa-clock"&gt;&lt;/i&gt; 09:00 (через 30 мин)&lt;/span&gt;
&lt;span class="medication__condition"&gt;После еды&lt;/span&gt;
&lt;/div&gt;
&lt;button class="btn btn--primary" onclick="markMedicationTaken(this)"&gt;&lt;i class="fas fa-check"&gt;&lt;/i&gt; Принято&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="widget widget--actions"&gt;
&lt;div class="widget__header"&gt;&lt;i class="fas fa-bolt widget__icon" style="color: var(--warning);"&gt;&lt;/i&gt;&lt;span class="widget__title"&gt;Быстрые действия&lt;/span&gt;&lt;/div&gt;
&lt;div class="actions__grid"&gt;
&lt;button class="action-btn" onclick="switchSection('ai-chat')"&gt;&lt;i class="fas fa-robot"&gt;&lt;/i&gt;&lt;span&gt;AI-Чат&lt;/span&gt;&lt;/button&gt;
&lt;button class="action-btn action-btn--danger" onclick="initiateEmergencyCall()"&gt;&lt;i class="fas fa-phone-alt"&gt;&lt;/i&gt;&lt;span&gt;SOS&lt;/span&gt;&lt;/button&gt;
&lt;button class="action-btn" onclick="switchSection('lab-results')"&gt;&lt;i class="fas fa-camera"&gt;&lt;/i&gt;&lt;span&gt;Фото/Анализ&lt;/span&gt;&lt;/button&gt;
&lt;button class="action-btn" onclick="switchSection('dermatology')"&gt;&lt;i class="fas fa-microscope"&gt;&lt;/i&gt;&lt;span&gt;Дерматоскопия&lt;/span&gt;&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="widget widget--activity"&gt;
&lt;div class="widget__header"&gt;&lt;i class="fas fa-shoe-prints widget__icon" style="color: var(--success);"&gt;&lt;/i&gt;&lt;span class="widget__title"&gt;Активность&lt;/span&gt;&lt;/div&gt;
&lt;div class="progress-bar"&gt;&lt;div class="progress-fill" style="width: 65%;"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="activity__stats"&gt;&lt;span&gt;6 500 / 10 000 шагов&lt;/span&gt;&lt;span style="color: var(--success);"&gt;320 ккал&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class="medication-tracker" id="medication-tracker"&gt;
&lt;div class="container"&gt;
&lt;div class="tracker-card"&gt;
&lt;div class="tracker-header"&gt;
&lt;div class="tracker-header__info"&gt;&lt;i class="fas fa-calendar-check tracker-header__icon"&gt;&lt;/i&gt;&lt;div&gt;&lt;h2 class="tracker-header__title"&gt;Приём лекарств&lt;/h2&gt;&lt;p class="tracker-header__subtitle"&gt;Понедельник, 24 августа 2026&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="tracker-progress"&gt;
&lt;div class="progress-circle" data-progress="60"&gt;
&lt;svg viewbox="0 0 36 36"&gt;&lt;path class="progress-circle-bg" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831"&gt;&lt;/path&gt;&lt;path class="progress-circle-fill" stroke-dasharray="60, 100" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831"&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;span class="progress-text"&gt;3/5&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="drug-interaction-alert"&gt;&lt;i class="fas fa-exclamation-triangle"&gt;&lt;/i&gt;&lt;div class="alert-content"&gt;&lt;strong&gt;Внимание:&lt;/strong&gt; Ибупрофен снижает эффективность Амлодипина. Разделите приём на 4+ часа.&lt;/div&gt;&lt;button class="alert-close" onclick="this.parentElement.style.display='none'"&gt;&lt;i class="fas fa-times"&gt;&lt;/i&gt;&lt;/button&gt;&lt;/div&gt;
&lt;div class="time-slots"&gt;
&lt;div class="time-slot"&gt;
&lt;div class="time-slot__header"&gt;&lt;div class="time-slot__label"&gt;&lt;i class="fas fa-sun" style="color: #F59E0B;"&gt;&lt;/i&gt;&lt;span&gt;Утро&lt;/span&gt;&lt;/div&gt;&lt;span class="time-slot__time"&gt;07:00 – 10:00&lt;/span&gt;&lt;/div&gt;
&lt;div class="medication-items"&gt;
&lt;div class="med-item med-item--taken"&gt;&lt;div class="med-item__time"&gt;08:00&lt;/div&gt;&lt;div class="med-item__info"&gt;&lt;span class="med-item__name"&gt;Амлодипин&lt;/span&gt;&lt;span class="med-item__dosage"&gt;5 мг • 1 таблетка&lt;/span&gt;&lt;span class="med-item__note"&gt;После еды, запить водой&lt;/span&gt;&lt;/div&gt;&lt;button class="med-item__check" disabled="disabled"&gt;&lt;i class="fas fa-check"&gt;&lt;/i&gt;&lt;/button&gt;&lt;/div&gt;
&lt;div class="med-item med-item--taken"&gt;&lt;div class="med-item__time"&gt;08:30&lt;/div&gt;&lt;div class="med-item__info"&gt;&lt;span class="med-item__name"&gt;Метформин&lt;/span&gt;&lt;span class="med-item__dosage"&gt;500 мг • 1 таблетка&lt;/span&gt;&lt;span class="med-item__note"&gt;Во время завтрака&lt;/span&gt;&lt;/div&gt;&lt;button class="med-item__check" disabled="disabled"&gt;&lt;i class="fas fa-check"&gt;&lt;/i&gt;&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="time-slot"&gt;
&lt;div class="time-slot__header"&gt;&lt;div class="time-slot__label"&gt;&lt;i class="fas fa-cloud-sun" style="color: #3B82F6;"&gt;&lt;/i&gt;&lt;span&gt;День&lt;/span&gt;&lt;/div&gt;&lt;span class="time-slot__time"&gt;12:00 – 15:00&lt;/span&gt;&lt;/div&gt;
&lt;div class="medication-items"&gt;
&lt;div class="med-item med-item--current"&gt;&lt;div class="med-item__time"&gt;13:00&lt;/div&gt;&lt;div class="med-item__info"&gt;&lt;span class="med-item__name"&gt;Метформин&lt;/span&gt;&lt;span class="med-item__dosage"&gt;500 мг • 1 таблетка&lt;/span&gt;&lt;span class="med-item__note"&gt;Во время обеда&lt;/span&gt;&lt;/div&gt;&lt;button class="med-item__check" onclick="markTaken(this)"&gt;&lt;i class="fas fa-check"&gt;&lt;/i&gt;&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="time-slot"&gt;
&lt;div class="time-slot__header"&gt;&lt;div class="time-slot__label"&gt;&lt;i class="fas fa-cloud-moon" style="color: #8B5CF6;"&gt;&lt;/i&gt;&lt;span&gt;Вечер&lt;/span&gt;&lt;/div&gt;&lt;span class="time-slot__time"&gt;18:00 – 21:00&lt;/span&gt;&lt;/div&gt;
&lt;div class="medication-items"&gt;
&lt;div class="med-item med-item--pending"&gt;&lt;div class="med-item__time"&gt;19:00&lt;/div&gt;&lt;div class="med-item__info"&gt;&lt;span class="med-item__name"&gt;Метформин&lt;/span&gt;&lt;span class="med-item__dosage"&gt;500 мг • 1 таблетка&lt;/span&gt;&lt;span class="med-item__note"&gt;Во время ужина&lt;/span&gt;&lt;/div&gt;&lt;button class="med-item__check" onclick="markTaken(this)"&gt;&lt;i class="fas fa-check"&gt;&lt;/i&gt;&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="time-slot"&gt;
&lt;div class="time-slot__header"&gt;&lt;div class="time-slot__label"&gt;&lt;i class="fas fa-moon" style="color: #6366F1;"&gt;&lt;/i&gt;&lt;span&gt;Ночь&lt;/span&gt;&lt;/div&gt;&lt;span class="time-slot__time"&gt;22:00 – 23:00&lt;/span&gt;&lt;/div&gt;
&lt;div class="medication-items"&gt;
&lt;div class="med-item med-item--pending"&gt;&lt;div class="med-item__time"&gt;22:30&lt;/div&gt;&lt;div class="med-item__info"&gt;&lt;span class="med-item__name"&gt;Аторвастатин&lt;/span&gt;&lt;span class="med-item__dosage"&gt;20 мг • 1 таблетка&lt;/span&gt;&lt;span class="med-item__note"&gt;Перед сном&lt;/span&gt;&lt;/div&gt;&lt;button class="med-item__check" onclick="markTaken(this)"&gt;&lt;i class="fas fa-check"&gt;&lt;/i&gt;&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="adherence-week"&gt;
&lt;h4 class="adherence-title"&gt;&lt;i class="fas fa-chart-line"&gt;&lt;/i&gt; Соблюдение режима за неделю&lt;/h4&gt;
&lt;div class="adherence-bars"&gt;
&lt;div class="adherence-day"&gt;&lt;div class="adherence-bar" style="height: 100%;"&gt;&lt;span class="adherence-value"&gt;100%&lt;/span&gt;&lt;/div&gt;&lt;span class="adherence-label"&gt;Пн&lt;/span&gt;&lt;/div&gt;
&lt;div class="adherence-day"&gt;&lt;div class="adherence-bar" style="height: 100%;"&gt;&lt;span class="adherence-value"&gt;100%&lt;/span&gt;&lt;/div&gt;&lt;span class="adherence-label"&gt;Вт&lt;/span&gt;&lt;/div&gt;
&lt;div class="adherence-day"&gt;&lt;div class="adherence-bar" style="height: 80%;"&gt;&lt;span class="adherence-value"&gt;80%&lt;/span&gt;&lt;/div&gt;&lt;span class="adherence-label"&gt;Ср&lt;/span&gt;&lt;/div&gt;
&lt;div class="adherence-day"&gt;&lt;div class="adherence-bar" style="height: 100%;"&gt;&lt;span class="adherence-value"&gt;100%&lt;/span&gt;&lt;/div&gt;&lt;span class="adherence-label"&gt;Чт&lt;/span&gt;&lt;/div&gt;
&lt;div class="adherence-day"&gt;&lt;div class="adherence-bar" style="height: 100%;"&gt;&lt;span class="adherence-value"&gt;100%&lt;/span&gt;&lt;/div&gt;&lt;span class="adherence-label"&gt;Пт&lt;/span&gt;&lt;/div&gt;
&lt;div class="adherence-day"&gt;&lt;div class="adherence-bar" style="height: 60%;"&gt;&lt;span class="adherence-value"&gt;60%&lt;/span&gt;&lt;/div&gt;&lt;span class="adherence-label"&gt;Сб&lt;/span&gt;&lt;/div&gt;
&lt;div class="adherence-day adherence-day--today"&gt;&lt;div class="adherence-bar adherence-bar--current" style="height: 60%;"&gt;&lt;span class="adherence-value"&gt;60%&lt;/span&gt;&lt;/div&gt;&lt;span class="adherence-label"&gt;Вс&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="adherence-summary"&gt;&lt;span&gt;Средний показатель: &lt;strong style="color: var(--success);"&gt;91%&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;Пропусков за месяц: &lt;strong style="color: var(--warning);"&gt;2&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button class="btn-add-medication" onclick="Toast.info('Medilav', 'Форма добавления препарата откроется в следующем обновлении')"&gt;&lt;i class="fas fa-plus"&gt;&lt;/i&gt;&lt;span&gt;Добавить препарат&lt;/span&gt;&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class="chat-section" id="ai-chat"&gt;
&lt;div class="container"&gt;
&lt;div class="chat-container"&gt;
&lt;div class="chat-header"&gt;
&lt;div class="chat-header__info"&gt;&lt;i class="fas fa-robot chat-header__icon"&gt;&lt;/i&gt;&lt;div&gt;&lt;span class="chat-header__name"&gt;Medilav AI&lt;/span&gt;&lt;span class="chat-header__status"&gt;&lt;span class="status-dot"&gt;&lt;/span&gt; Онлайн&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;button class="chat-header__clear" onclick="clearChat()" title="Очистить историю"&gt;&lt;i class="fas fa-trash-alt"&gt;&lt;/i&gt;&lt;/button&gt;
&lt;/div&gt;
&lt;div class="chat-messages" id="chat-messages"&gt;&lt;/div&gt;
&lt;div class="chat-upload" id="chat-upload"&gt;
&lt;div class="upload-preview" id="upload-preview"&gt;&lt;/div&gt;
&lt;div class="upload-actions"&gt;&lt;button class="btn btn--outline" onclick="cancelUpload()"&gt;Отмена&lt;/button&gt;&lt;button class="btn btn--primary" onclick="sendFile()"&gt;Отправить&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;input type="file" id="hidden-file-input" style="display: none;" onchange="handleFileSelect(this)" /&gt;
&lt;div class="chat-input-area"&gt;
&lt;div class="chat-input__actions"&gt;
&lt;button class="chat-input__btn" onclick="triggerFileUpload('image/*')" title="Фото"&gt;&lt;i class="fas fa-camera"&gt;&lt;/i&gt;&lt;/button&gt;
&lt;button class="chat-input__btn" onclick="triggerFileUpload('audio/*')" title="Аудио"&gt;&lt;i class="fas fa-microphone"&gt;&lt;/i&gt;&lt;/button&gt;
&lt;/div&gt;
&lt;input type="text" class="chat-input__field" id="chat-input" placeholder="Опишите симптомы..." onkeydown="if(event.key==='Enter') sendMessage()" /&gt;
&lt;button class="chat-input__send" onclick="sendMessage()"&gt;&lt;i class="fas fa-paper-plane"&gt;&lt;/i&gt;&lt;/button&gt;
&lt;/div&gt;
&lt;div class="chat-disclaimer"&gt;&lt;i class="fas fa-exclamation-triangle"&gt;&lt;/i&gt; ИИ не ставит диагнозы. При острых состояниях вызывайте 112.&lt;/div&gt;
&lt;div class="chat-quick-questions"&gt;
&lt;button class="chip" onclick="quickQuestion('Головная боль')"&gt;? Головная боль&lt;/button&gt;
&lt;button class="chip" onclick="quickQuestion('Температура')"&gt;?️ Температура&lt;/button&gt;
&lt;button class="chip" onclick="quickQuestion('Кашель')"&gt;? Кашель&lt;/button&gt;
&lt;button class="chip" onclick="quickQuestion('Давление')"&gt;? Давление&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class="lab-results-section" id="lab-results"&gt;
&lt;div class="container"&gt;
&lt;div class="lab-card"&gt;
&lt;div class="lab-header"&gt;
&lt;div class="lab-header__info"&gt;&lt;div class="lab-header__icon"&gt;&lt;i class="fas fa-flask-vial"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 class="lab-header__title"&gt;Анализы и исследования&lt;/h2&gt;&lt;p class="lab-header__subtitle"&gt;Загрузите PDF или фото — Medilav расшифрует&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="lab-stats"&gt;&lt;div class="lab-stat"&gt;&lt;span class="lab-stat__value"&gt;24&lt;/span&gt;&lt;span class="lab-stat__label"&gt;Анализа&lt;/span&gt;&lt;/div&gt;&lt;div class="lab-stat"&gt;&lt;span class="lab-stat__value"&gt;3&lt;/span&gt;&lt;span class="lab-stat__label"&gt;Отклонения&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="upload-zone" id="uploadZone"&gt;
&lt;input type="file" id="labFileInput" multiple="multiple" accept=".pdf,image/*" style="display:none" onchange="handleLabFiles(this.files)" /&gt;
&lt;div class="upload-zone__content"&gt;
&lt;div class="upload-zone__icon"&gt;&lt;i class="fas fa-cloud-arrow-up"&gt;&lt;/i&gt;&lt;/div&gt;
&lt;h3 class="upload-zone__title"&gt;Перетащите файлы сюда&lt;/h3&gt;
&lt;p class="upload-zone__subtitle"&gt;или нажмите для выбора&lt;/p&gt;
&lt;div class="upload-zone__formats"&gt;&lt;span class="format-badge"&gt;PDF&lt;/span&gt;&lt;span class="format-badge"&gt;JPG&lt;/span&gt;&lt;span class="format-badge"&gt;PNG&lt;/span&gt;&lt;span class="format-badge"&gt;HEIC&lt;/span&gt;&lt;/div&gt;
&lt;p class="upload-zone__hint"&gt;&lt;i class="fas fa-shield-halved"&gt;&lt;/i&gt; Данные защищены шифрованием и не передаются третьим лицам&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="ocr-progress" id="ocrProgress" style="display:none"&gt;
&lt;div class="ocr-progress__header"&gt;&lt;i class="fas fa-spinner fa-spin"&gt;&lt;/i&gt;&lt;span&gt;Распознавание анализа...&lt;/span&gt;&lt;/div&gt;
&lt;div class="ocr-progress__bar"&gt;&lt;div class="ocr-progress__fill" id="ocrProgressFill"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="ocr-progress__stages"&gt;
&lt;div class="ocr-stage ocr-stage--done"&gt;&lt;i class="fas fa-check"&gt;&lt;/i&gt;&lt;span&gt;Загрузка файла&lt;/span&gt;&lt;/div&gt;
&lt;div class="ocr-stage ocr-stage--active"&gt;&lt;i class="fas fa-spinner fa-spin"&gt;&lt;/i&gt;&lt;span&gt;OCR-распознавание&lt;/span&gt;&lt;/div&gt;
&lt;div class="ocr-stage"&gt;&lt;i class="fas fa-circle"&gt;&lt;/i&gt;&lt;span&gt;Нормализация данных&lt;/span&gt;&lt;/div&gt;
&lt;div class="ocr-stage"&gt;&lt;i class="fas fa-circle"&gt;&lt;/i&gt;&lt;span&gt;AI-анализ&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="analysis-result"&gt;
&lt;div class="analysis-header"&gt;
&lt;div class="analysis-header__info"&gt;&lt;i class="fas fa-file-medical"&gt;&lt;/i&gt;&lt;div&gt;&lt;h3 class="analysis-title"&gt;Общий анализ крови&lt;/h3&gt;&lt;p class="analysis-meta"&gt;Лаборатория «Инвитро» • 20 августа 2026&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="analysis-actions"&gt;&lt;button class="btn-icon" title="Скачать PDF" onclick="Toast.info('Medilav', 'Скачивание PDF...')"&gt;&lt;i class="fas fa-download"&gt;&lt;/i&gt;&lt;/button&gt;&lt;button class="btn-icon" title="Поделиться с врачом" onclick="Toast.info('Medilav', 'Отправка врачу...')"&gt;&lt;i class="fas fa-share-nodes"&gt;&lt;/i&gt;&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="ai-interpretation"&gt;
&lt;div class="ai-interpretation__header"&gt;&lt;i class="fas fa-robot"&gt;&lt;/i&gt;&lt;span&gt;AI-интерпретация Medilav&lt;/span&gt;&lt;/div&gt;
&lt;p class="ai-interpretation__text"&gt;В целом показатели в норме. Обращает внимание &lt;strong style="color: var(--warning);"&gt;сниженный ферритин (18 нг/мл)&lt;/strong&gt; — это может указывать на скрытый железодефицит. Рекомендуем повторить анализ через 2 недели и проконсультироваться с терапевтом.&lt;/p&gt;
&lt;div class="ai-interpretation__disclaimer"&gt;&lt;i class="fas fa-info-circle"&gt;&lt;/i&gt; Это справочная информация, не медицинский диагноз.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="indicators-table"&gt;
&lt;div class="indicator-row indicator-row--normal"&gt;
&lt;div class="indicator-name"&gt;&lt;span class="indicator-label"&gt;Гемоглобин&lt;/span&gt;&lt;span class="indicator-code"&gt;HGB&lt;/span&gt;&lt;/div&gt;
&lt;div class="indicator-value"&gt;&lt;span class="value-current"&gt;142&lt;/span&gt;&lt;span class="value-unit"&gt;г/л&lt;/span&gt;&lt;/div&gt;
&lt;div class="indicator-ref"&gt;&lt;span class="ref-label"&gt;Норма:&lt;/span&gt;&lt;span class="ref-range"&gt;130–160&lt;/span&gt;&lt;/div&gt;
&lt;div class="indicator-trend"&gt;&lt;svg viewbox="0 0 100 30" class="trend-chart"&gt;&lt;polyline points="0,20 20,18 40,15 60,17 80,14 100,12" fill="none" stroke="var(--success)" stroke-width="2"&gt;&lt;/polyline&gt;&lt;/svg&gt;&lt;/div&gt;
&lt;div class="indicator-status"&gt;&lt;span class="status-badge status-badge--normal"&gt;Норма&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="indicator-row indicator-row--warning"&gt;
&lt;div class="indicator-name"&gt;&lt;span class="indicator-label"&gt;Ферритин&lt;/span&gt;&lt;span class="indicator-code"&gt;FER&lt;/span&gt;&lt;/div&gt;
&lt;div class="indicator-value"&gt;&lt;span class="value-current value-current--warning"&gt;18&lt;/span&gt;&lt;span class="value-unit"&gt;нг/мл&lt;/span&gt;&lt;/div&gt;
&lt;div class="indicator-ref"&gt;&lt;span class="ref-label"&gt;Норма:&lt;/span&gt;&lt;span class="ref-range"&gt;30–150&lt;/span&gt;&lt;/div&gt;
&lt;div class="indicator-trend"&gt;&lt;svg viewbox="0 0 100 30" class="trend-chart"&gt;&lt;polyline points="0,10 20,12 40,15 60,18 80,22 100,25" fill="none" stroke="var(--warning)" stroke-width="2"&gt;&lt;/polyline&gt;&lt;/svg&gt;&lt;/div&gt;
&lt;div class="indicator-status"&gt;&lt;span class="status-badge status-badge--warning"&gt;Понижен&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="indicator-row indicator-row--normal"&gt;
&lt;div class="indicator-name"&gt;&lt;span class="indicator-label"&gt;Лейкоциты&lt;/span&gt;&lt;span class="indicator-code"&gt;WBC&lt;/span&gt;&lt;/div&gt;
&lt;div class="indicator-value"&gt;&lt;span class="value-current"&gt;6.8&lt;/span&gt;&lt;span class="value-unit"&gt;10⁹/л&lt;/span&gt;&lt;/div&gt;
&lt;div class="indicator-ref"&gt;&lt;span class="ref-label"&gt;Норма:&lt;/span&gt;&lt;span class="ref-range"&gt;4.0–9.0&lt;/span&gt;&lt;/div&gt;
&lt;div class="indicator-trend"&gt;&lt;svg viewbox="0 0 100 30" class="trend-chart"&gt;&lt;polyline points="0,15 20,14 40,16 60,15 80,14 100,15" fill="none" stroke="var(--success)" stroke-width="2"&gt;&lt;/polyline&gt;&lt;/svg&gt;&lt;/div&gt;
&lt;div class="indicator-status"&gt;&lt;span class="status-badge status-badge--normal"&gt;Норма&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="indicator-row indicator-row--danger"&gt;
&lt;div class="indicator-name"&gt;&lt;span class="indicator-label"&gt;СОЭ&lt;/span&gt;&lt;span class="indicator-code"&gt;ESR&lt;/span&gt;&lt;/div&gt;
&lt;div class="indicator-value"&gt;&lt;span class="value-current value-current--danger"&gt;28&lt;/span&gt;&lt;span class="value-unit"&gt;мм/ч&lt;/span&gt;&lt;/div&gt;
&lt;div class="indicator-ref"&gt;&lt;span class="ref-label"&gt;Норма:&lt;/span&gt;&lt;span class="ref-range"&gt;1–10&lt;/span&gt;&lt;/div&gt;
&lt;div class="indicator-trend"&gt;&lt;svg viewbox="0 0 100 30" class="trend-chart"&gt;&lt;polyline points="0,25 20,22 40,18 60,14 80,10 100,5" fill="none" stroke="var(--danger)" stroke-width="2"&gt;&lt;/polyline&gt;&lt;/svg&gt;&lt;/div&gt;
&lt;div class="indicator-status"&gt;&lt;span class="status-badge status-badge--danger"&gt;Повышен&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="recommendations"&gt;
&lt;h4 class="recommendations-title"&gt;&lt;i class="fas fa-lightbulb"&gt;&lt;/i&gt; Рекомендации Medilav&lt;/h4&gt;
&lt;ul class="recommendations-list"&gt;
&lt;li&gt;&lt;i class="fas fa-apple-whole"&gt;&lt;/i&gt;&lt;div&gt;&lt;strong&gt;Добавьте продукты, богатые железом&lt;/strong&gt;&lt;span&gt;Говядина, печень, гречка, шпинат, яблоки&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;i class="fas fa-vial"&gt;&lt;/i&gt;&lt;div&gt;&lt;strong&gt;Повторите анализ через 2 недели&lt;/strong&gt;&lt;span&gt;Контроль ферритина и СОЭ в динамике&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;i class="fas fa-user-doctor"&gt;&lt;/i&gt;&lt;div&gt;&lt;strong&gt;Запишитесь к терапевту&lt;/strong&gt;&lt;span&gt;Для оценки необходимости препаратов железа&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class="dermatology-section" id="dermatology"&gt;
&lt;div class="container"&gt;
&lt;div class="derma-card"&gt;
&lt;div class="derma-header"&gt;
&lt;div class="derma-header__info"&gt;
&lt;div class="derma-header__icon"&gt;&lt;i class="fas fa-microscope"&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;h2 class="derma-header__title"&gt;Анализ родинок и новообразований&lt;/h2&gt;
&lt;p class="derma-header__subtitle"&gt;AI-диагностика меланомы по фото с использованием ISIC Archive&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="derma-upload-zone" id="dermaUploadZone"&gt;
&lt;input type="file" id="dermaFileInput" accept="image/*" capture="environment" style="display:none" onchange="analyzeMole(this.files[0])" /&gt;
&lt;div class="upload-zone__content"&gt;
&lt;div class="upload-zone__icon"&gt;&lt;i class="fas fa-camera-medical"&gt;&lt;/i&gt;&lt;/div&gt;
&lt;h3 class="upload-zone__title"&gt;Загрузите фото родинки&lt;/h3&gt;
&lt;p class="upload-zone__subtitle"&gt;Сделайте чёткое фото при хорошем освещении или выберите из галереи&lt;/p&gt;
&lt;div class="upload-buttons"&gt;
&lt;button class="btn btn--primary" onclick="document.getElementById('dermaFileInput').click()"&gt;&lt;i class="fas fa-camera"&gt;&lt;/i&gt; Сделать фото&lt;/button&gt;
&lt;button class="btn btn--outline" onclick="document.getElementById('dermaFileInput').click()"&gt;&lt;i class="fas fa-image"&gt;&lt;/i&gt; Выбрать из галереи&lt;/button&gt;
&lt;/div&gt;
&lt;div class="upload-hints"&gt;
&lt;div class="hint-item"&gt;&lt;i class="fas fa-check-circle"&gt;&lt;/i&gt;&lt;span&gt;Хорошее освещение&lt;/span&gt;&lt;/div&gt;
&lt;div class="hint-item"&gt;&lt;i class="fas fa-check-circle"&gt;&lt;/i&gt;&lt;span&gt;Чёткое изображение&lt;/span&gt;&lt;/div&gt;
&lt;div class="hint-item"&gt;&lt;i class="fas fa-check-circle"&gt;&lt;/i&gt;&lt;span&gt;Родинка полностью в кадре&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="derma-analysis-progress" id="dermaAnalysisProgress" style="display:none"&gt;
&lt;div class="progress-header"&gt;&lt;i class="fas fa-spinner fa-spin"&gt;&lt;/i&gt;&lt;span&gt;Анализируем изображение...&lt;/span&gt;&lt;/div&gt;
&lt;div class="progress-steps"&gt;
&lt;div class="progress-step active" id="step1"&gt;&lt;i class="fas fa-check"&gt;&lt;/i&gt;&lt;span&gt;Загрузка изображения&lt;/span&gt;&lt;/div&gt;
&lt;div class="progress-step" id="step2"&gt;&lt;i class="fas fa-check"&gt;&lt;/i&gt;&lt;span&gt;Предобработка (сегментация)&lt;/span&gt;&lt;/div&gt;
&lt;div class="progress-step" id="step3"&gt;&lt;i class="fas fa-check"&gt;&lt;/i&gt;&lt;span&gt;ABCDE анализ&lt;/span&gt;&lt;/div&gt;
&lt;div class="progress-step" id="step4"&gt;&lt;i class="fas fa-check"&gt;&lt;/i&gt;&lt;span&gt;Сравнение с ISIC Archive&lt;/span&gt;&lt;/div&gt;
&lt;div class="progress-step" id="step5"&gt;&lt;i class="fas fa-check"&gt;&lt;/i&gt;&lt;span&gt;ML-классификация&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="derma-results" id="dermaResults" style="display:none"&gt;
&lt;div class="derma-disclaimer"&gt;
&lt;i class="fas fa-exclamation-triangle"&gt;&lt;/i&gt;
&lt;div&gt;&lt;strong&gt;Важно:&lt;/strong&gt; Это предварительный анализ. Точный диагноз может поставить только врач-дерматолог после очного осмотра и биопсии.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="risk-assessment"&gt;
&lt;div class="risk-header"&gt;
&lt;h3&gt;Общая оценка риска&lt;/h3&gt;
&lt;span class="risk-badge" id="riskBadge"&gt;Низкий риск&lt;/span&gt;
&lt;/div&gt;
&lt;div class="risk-meter"&gt;
&lt;div class="risk-meter__bar"&gt;&lt;div class="risk-meter__fill" id="riskMeterFill" style="width: 25%"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="risk-meter__labels"&gt;&lt;span&gt;Низкий&lt;/span&gt;&lt;span&gt;Средний&lt;/span&gt;&lt;span&gt;Высокий&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="risk-percentage" id="riskPercentage"&gt;25% вероятность меланомы&lt;/div&gt;
&lt;/div&gt;
&lt;div class="abcde-analysis"&gt;
&lt;h3&gt;ABCDE Анализ&lt;/h3&gt;
&lt;div class="abcde-grid"&gt;
&lt;div class="abcde-item" id="abcdeA"&gt;
&lt;div class="abcde-icon"&gt;A&lt;/div&gt;
&lt;div class="abcde-content"&gt;&lt;h4&gt;Asymmetry (Асимметрия)&lt;/h4&gt;&lt;p id="abcdeADesc"&gt;Родинка симметрична&lt;/p&gt;&lt;span class="abcde-status status-ok"&gt;✓ Норма&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="abcde-item" id="abcdeB"&gt;
&lt;div class="abcde-icon"&gt;B&lt;/div&gt;
&lt;div class="abcde-content"&gt;&lt;h4&gt;Border (Границы)&lt;/h4&gt;&lt;p id="abcdeBDesc"&gt;Ровные, чёткие границы&lt;/p&gt;&lt;span class="abcde-status status-ok"&gt;✓ Норма&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="abcde-item" id="abcdeC"&gt;
&lt;div class="abcde-icon"&gt;C&lt;/div&gt;
&lt;div class="abcde-content"&gt;&lt;h4&gt;Color (Цвет)&lt;/h4&gt;&lt;p id="abcdeCDesc"&gt;Однородный цвет&lt;/p&gt;&lt;span class="abcde-status status-ok"&gt;✓ Норма&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="abcde-item" id="abcdeD"&gt;
&lt;div class="abcde-icon"&gt;D&lt;/div&gt;
&lt;div class="abcde-content"&gt;&lt;h4&gt;Diameter (Диаметр)&lt;/h4&gt;&lt;p id="abcdeDDesc"&gt;Меньше 6 мм&lt;/p&gt;&lt;span class="abcde-status status-ok"&gt;✓ Норма&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="abcde-item" id="abcdeE"&gt;
&lt;div class="abcde-icon"&gt;E&lt;/div&gt;
&lt;div class="abcde-content"&gt;&lt;h4&gt;Evolving (Изменения)&lt;/h4&gt;&lt;p id="abcdeEDesc"&gt;Требуется ваше описание&lt;/p&gt;&lt;span class="abcde-status status-info"&gt;ℹ Не определено&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="ml-classification"&gt;
&lt;h3&gt;Результаты ML-классификации&lt;/h3&gt;
&lt;div class="classification-bars"&gt;
&lt;div class="class-bar"&gt;
&lt;div class="class-bar__label"&gt;&lt;span&gt;Меланома&lt;/span&gt;&lt;span class="class-bar__value" id="melanomaProb"&gt;5%&lt;/span&gt;&lt;/div&gt;
&lt;div class="class-bar__track"&gt;&lt;div class="class-bar__fill" id="melanomaBar" style="width: 5%"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="class-bar"&gt;
&lt;div class="class-bar__label"&gt;&lt;span&gt;Базальноклеточная карцинома&lt;/span&gt;&lt;span class="class-bar__value" id="bccProb"&gt;3%&lt;/span&gt;&lt;/div&gt;
&lt;div class="class-bar__track"&gt;&lt;div class="class-bar__fill" id="bccBar" style="width: 3%"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="class-bar"&gt;
&lt;div class="class-bar__label"&gt;&lt;span&gt;Доброкачественный невус&lt;/span&gt;&lt;span class="class-bar__value" id="nevusProb"&gt;92%&lt;/span&gt;&lt;/div&gt;
&lt;div class="class-bar__track"&gt;&lt;div class="class-bar__fill" id="nevusBar" style="width: 92%"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="similar-cases"&gt;
&lt;h3&gt;Похожие случаи из ISIC Archive&lt;/h3&gt;
&lt;div class="cases-grid" id="similarCasesGrid"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="derma-recommendations"&gt;
&lt;h3&gt;Рекомендации&lt;/h3&gt;
&lt;ul id="recommendationsList"&gt;
&lt;li&gt;&lt;i class="fas fa-info-circle"&gt;&lt;/i&gt; Продолжайте наблюдать за родинкой&lt;/li&gt;
&lt;li&gt;&lt;i class="fas fa-calendar-check"&gt;&lt;/i&gt; Плановый осмотр дерматолога раз в год&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="derma-actions"&gt;
&lt;button class="btn btn--outline" onclick="resetDermatology()"&gt;&lt;i class="fas fa-redo"&gt;&lt;/i&gt; Проанализировать другую родинку&lt;/button&gt;
&lt;button class="btn btn--primary" onclick="exportDermatologyReport()"&gt;&lt;i class="fas fa-file-pdf"&gt;&lt;/i&gt; Сохранить отчёт&lt;/button&gt;
&lt;button class="btn btn--danger" onclick="switchSection('medical-id')"&gt;&lt;i class="fas fa-user-md"&gt;&lt;/i&gt; Найти дерматолога&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class="analytics-section" id="analytics"&gt;
&lt;div class="container"&gt;
&lt;div class="analytics-card"&gt;
&lt;div class="analytics-header"&gt;
&lt;div class="analytics-header__info"&gt;&lt;div class="analytics-header__icon"&gt;&lt;i class="fas fa-chart-line"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 class="analytics-header__title"&gt;Аналитика здоровья&lt;/h2&gt;&lt;p class="analytics-header__subtitle"&gt;Тренды и инсайты на основе ваших данных&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="period-selector"&gt;
&lt;button class="period-btn" data-period="7" onclick="changePeriod(7)"&gt;7 дней&lt;/button&gt;
&lt;button class="period-btn active" data-period="30" onclick="changePeriod(30)"&gt;30 дней&lt;/button&gt;
&lt;button class="period-btn" data-period="90" onclick="changePeriod(90)"&gt;3 мес&lt;/button&gt;
&lt;button class="period-btn" data-period="365" onclick="changePeriod(365)"&gt;Год&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="metrics-switcher"&gt;
&lt;button class="metric-tab active" data-metric="pressure" onclick="switchMetric('pressure')"&gt;&lt;i class="fas fa-heart-pulse"&gt;&lt;/i&gt;&lt;span&gt;Давление&lt;/span&gt;&lt;/button&gt;
&lt;button class="metric-tab" data-metric="pulse" onclick="switchMetric('pulse')"&gt;&lt;i class="fas fa-wave-square"&gt;&lt;/i&gt;&lt;span&gt;Пульс&lt;/span&gt;&lt;/button&gt;
&lt;button class="metric-tab" data-metric="sleep" onclick="switchMetric('sleep')"&gt;&lt;i class="fas fa-moon"&gt;&lt;/i&gt;&lt;span&gt;Сон&lt;/span&gt;&lt;/button&gt;
&lt;button class="metric-tab" data-metric="weight" onclick="switchMetric('weight')"&gt;&lt;i class="fas fa-weight-scale"&gt;&lt;/i&gt;&lt;span&gt;Вес&lt;/span&gt;&lt;/button&gt;
&lt;button class="metric-tab" data-metric="activity" onclick="switchMetric('activity')"&gt;&lt;i class="fas fa-person-walking"&gt;&lt;/i&gt;&lt;span&gt;Активность&lt;/span&gt;&lt;/button&gt;
&lt;/div&gt;
&lt;div class="main-chart-container"&gt;
&lt;div class="chart-header"&gt;
&lt;div class="chart-title"&gt;&lt;h3 id="chartTitle"&gt;Артериальное давление&lt;/h3&gt;&lt;span class="chart-period" id="chartPeriod"&gt;За последние 30 дней&lt;/span&gt;&lt;/div&gt;
&lt;div class="chart-stats"&gt;
&lt;div class="chart-stat"&gt;&lt;span class="stat-label"&gt;Среднее&lt;/span&gt;&lt;span class="stat-value"&gt;128/82&lt;/span&gt;&lt;span class="stat-trend trend-down"&gt;&lt;i class="fas fa-arrow-down"&gt;&lt;/i&gt; 5%&lt;/span&gt;&lt;/div&gt;
&lt;div class="chart-stat"&gt;&lt;span class="stat-label"&gt;Мин/Макс&lt;/span&gt;&lt;span class="stat-value"&gt;115/75 – 145/92&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="chart-wrapper"&gt;
&lt;svg viewbox="0 0 800 300" class="chart-svg"&gt;
&lt;defs&gt;&lt;lineargradient id="chartGradient" x1="0%" y1="0%" x2="0%" y2="100%"&gt;&lt;stop offset="0%" style="stop-color:var(--primary);stop-opacity:0.3"&gt;&lt;/stop&gt;&lt;stop offset="100%" style="stop-color:var(--primary);stop-opacity:0"&gt;&lt;/stop&gt;&lt;/lineargradient&gt;&lt;/defs&gt;
&lt;line x1="50" y1="50" x2="750" y2="50" stroke="var(--gray-200)" stroke-width="1" stroke-dasharray="4,4"&gt;&lt;/line&gt;
&lt;line x1="50" y1="100" x2="750" y2="100" stroke="var(--gray-200)" stroke-width="1" stroke-dasharray="4,4"&gt;&lt;/line&gt;
&lt;line x1="50" y1="150" x2="750" y2="150" stroke="var(--gray-200)" stroke-width="1" stroke-dasharray="4,4"&gt;&lt;/line&gt;
&lt;line x1="50" y1="200" x2="750" y2="200" stroke="var(--gray-200)" stroke-width="1" stroke-dasharray="4,4"&gt;&lt;/line&gt;
&lt;line x1="50" y1="250" x2="750" y2="250" stroke="var(--gray-200)" stroke-width="1"&gt;&lt;/line&gt;
&lt;rect x="50" y="120" width="700" height="60" fill="var(--success-light)" opacity="0.3"&gt;&lt;/rect&gt;
&lt;text x="760" y="155" font-size="10" fill="var(--success)" text-anchor="start"&gt;Норма&lt;/text&gt;
&lt;path d="M50,250 L50,180 L100,170 L150,160 L200,165 L250,155 L300,150 L350,145 L400,140 L450,135 L500,130 L550,125 L600,120 L650,115 L700,110 L750,105 L750,250 Z" fill="url(#chartGradient)"&gt;&lt;/path&gt;
&lt;path d="M50,180 L100,170 L150,160 L200,165 L250,155 L300,150 L350,145 L400,140 L450,135 L500,130 L550,125 L600,120 L650,115 L700,110 L750,105" fill="none" stroke="var(--primary)" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;/path&gt;
&lt;circle cx="50" cy="180" r="4" fill="var(--primary)" class="chart-point"&gt;&lt;/circle&gt;
&lt;circle cx="250" cy="155" r="4" fill="var(--primary)" class="chart-point"&gt;&lt;/circle&gt;
&lt;circle cx="450" cy="135" r="4" fill="var(--primary)" class="chart-point"&gt;&lt;/circle&gt;
&lt;circle cx="650" cy="115" r="4" fill="var(--primary)" class="chart-point"&gt;&lt;/circle&gt;
&lt;circle cx="750" cy="105" r="5" fill="var(--primary)" stroke="white" stroke-width="2" class="chart-point"&gt;&lt;/circle&gt;
&lt;text x="40" y="55" font-size="11" fill="var(--gray-500)" text-anchor="end"&gt;160&lt;/text&gt;
&lt;text x="40" y="105" font-size="11" fill="var(--gray-500)" text-anchor="end"&gt;140&lt;/text&gt;
&lt;text x="40" y="155" font-size="11" fill="var(--gray-500)" text-anchor="end"&gt;120&lt;/text&gt;
&lt;text x="40" y="205" font-size="11" fill="var(--gray-500)" text-anchor="end"&gt;100&lt;/text&gt;
&lt;text x="40" y="255" font-size="11" fill="var(--gray-500)" text-anchor="end"&gt;80&lt;/text&gt;
&lt;text x="50" y="275" font-size="11" fill="var(--gray-500)" text-anchor="middle"&gt;25 июл&lt;/text&gt;
&lt;text x="350" y="275" font-size="11" fill="var(--gray-500)" text-anchor="middle"&gt;8 авг&lt;/text&gt;
&lt;text x="650" y="275" font-size="11" fill="var(--gray-500)" text-anchor="middle"&gt;22 авг&lt;/text&gt;
&lt;/svg&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="ai-insights"&gt;
&lt;div class="insights-header"&gt;&lt;i class="fas fa-lightbulb"&gt;&lt;/i&gt;&lt;span&gt;AI-инсайты Medilav&lt;/span&gt;&lt;/div&gt;
&lt;div class="insights-grid"&gt;
&lt;div class="insight-card insight-card--success"&gt;&lt;div class="insight-icon"&gt;&lt;i class="fas fa-arrow-trend-down"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="insight-content"&gt;&lt;h4 class="insight-title"&gt;Положительная динамика&lt;/h4&gt;&lt;p class="insight-text"&gt;Ваше давление снизилось на &lt;strong&gt;8%&lt;/strong&gt; за последний месяц.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="insight-card insight-card--info"&gt;&lt;div class="insight-icon"&gt;&lt;i class="fas fa-link"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="insight-content"&gt;&lt;h4 class="insight-title"&gt;Корреляция обнаружена&lt;/h4&gt;&lt;p class="insight-text"&gt;В дни со сном &lt;strong&gt;7+ часов&lt;/strong&gt; давление на &lt;strong&gt;12 пунктов ниже&lt;/strong&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="insight-card insight-card--warning"&gt;&lt;div class="insight-icon"&gt;&lt;i class="fas fa-triangle-exclamation"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="insight-content"&gt;&lt;h4 class="insight-title"&gt;Обратите внимание&lt;/h4&gt;&lt;p class="insight-text"&gt;Утренние показатели выше вечерних. Обсудите с врачом.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="insight-card insight-card--primary"&gt;&lt;div class="insight-icon"&gt;&lt;i class="fas fa-chart-line"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="insight-content"&gt;&lt;h4 class="insight-title"&gt;Прогноз&lt;/h4&gt;&lt;p class="insight-text"&gt;Через &lt;strong&gt;2 недели&lt;/strong&gt; вы достигнете целевых &lt;strong&gt;120/80&lt;/strong&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class="medical-id-section" id="medical-id"&gt;
&lt;div class="container"&gt;
&lt;div class="medical-id-card"&gt;
&lt;div class="medical-id-header"&gt;
&lt;div class="medical-id-icon"&gt;&lt;i class="fas fa-id-card-alt"&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 class="medical-id-title"&gt;Medical ID&lt;/h2&gt;&lt;p class="medical-id-subtitle"&gt;Экстренная медицинская информация Medilav&lt;/p&gt;&lt;/div&gt;
&lt;button class="btn btn--outline" onclick="Toast.info('Medilav', 'Редактор профиля откроется в следующем обновлении')"&gt;&lt;i class="fas fa-pen"&gt;&lt;/i&gt; Изменить&lt;/button&gt;
&lt;/div&gt;
&lt;div class="medical-id-user"&gt;
&lt;div class="user-avatar-large"&gt;&lt;img src="https://ui-avatars.com/api/?name=Alex+P&amp;amp;background=0066FF&amp;amp;color=fff&amp;amp;size=80&amp;amp;bold=true" alt="Аватар" /&gt;&lt;/div&gt;
&lt;div class="user-details"&gt;
&lt;h3 class="user-name"&gt;Петров Алексей Игоревич&lt;/h3&gt;
&lt;p class="user-dob"&gt;Дата рождения: 15.03.1985 (39 лет)&lt;/p&gt;
&lt;p class="user-blood"&gt;Группа крови: &lt;span class="blood-highlight"&gt;A(II) Rh+&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="medical-info-grid"&gt;
&lt;div class="info-block info-block--danger"&gt;
&lt;div class="info-block-header"&gt;&lt;i class="fas fa-exclamation-circle"&gt;&lt;/i&gt;&lt;span&gt;Аллергии&lt;/span&gt;&lt;/div&gt;
&lt;ul class="info-list"&gt;&lt;li&gt;Пенициллин (анафилактический шок)&lt;/li&gt;&lt;li&gt;Ибупрофен (крапивница)&lt;/li&gt;&lt;li&gt;Цитрусовые&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="info-block info-block--warning"&gt;
&lt;div class="info-block-header"&gt;&lt;i class="fas fa-notes-medical"&gt;&lt;/i&gt;&lt;span&gt;Хронические заболевания&lt;/span&gt;&lt;/div&gt;
&lt;ul class="info-list"&gt;&lt;li&gt;Артериальная гипертензия (I ст.)&lt;/li&gt;&lt;li&gt;Сахарный диабет 2 типа&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="info-block info-block--info"&gt;
&lt;div class="info-block-header"&gt;&lt;i class="fas fa-pills"&gt;&lt;/i&gt;&lt;span&gt;Постоянные препараты&lt;/span&gt;&lt;/div&gt;
&lt;ul class="info-list"&gt;&lt;li&gt;Амлодипин 5 мг (утром)&lt;/li&gt;&lt;li&gt;Метформин 500 мг (2 р/день)&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="info-block info-block--neutral"&gt;
&lt;div class="info-block-header"&gt;&lt;i class="fas fa-procedures"&gt;&lt;/i&gt;&lt;span&gt;Особенности&lt;/span&gt;&lt;/div&gt;
&lt;ul class="info-list"&gt;&lt;li&gt;Кардиостимулятор (2020 г.)&lt;/li&gt;&lt;li&gt;Не переносит МРТ с контрастом&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="emergency-contacts"&gt;
&lt;h4 class="contacts-title"&gt;&lt;i class="fas fa-phone-alt"&gt;&lt;/i&gt; Экстренные контакты&lt;/h4&gt;
&lt;div class="contacts-list"&gt;
&lt;div class="contact-item"&gt;&lt;div class="contact-info"&gt;&lt;span class="contact-name"&gt;Петрова Мария&lt;/span&gt;&lt;span class="contact-relation"&gt;Супруга (Основной контакт)&lt;/span&gt;&lt;/div&gt;&lt;a href="tel:+79991234567" class="contact-phone"&gt;+7 (999) 123-45-67&lt;/a&gt;&lt;/div&gt;
&lt;div class="contact-item"&gt;&lt;div class="contact-info"&gt;&lt;span class="contact-name"&gt;Др. Смирнов И.И.&lt;/span&gt;&lt;span class="contact-relation"&gt;Лечащий врач (Терапевт)&lt;/span&gt;&lt;/div&gt;&lt;a href="tel:+79997654321" class="contact-phone"&gt;+7 (999) 765-43-21&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="lock-screen-access"&gt;
&lt;div class="toggle-label"&gt;&lt;i class="fas fa-lock-open"&gt;&lt;/i&gt;&lt;span&gt;Показывать на экране блокировки&lt;/span&gt;&lt;/div&gt;
&lt;label class="switch"&gt;&lt;input type="checkbox" id="lockScreenToggle" checked="checked" onchange="toggleLockScreen(this)" /&gt;&lt;span class="slider round"&gt;&lt;/span&gt;&lt;/label&gt;
&lt;/div&gt;
&lt;p class="lock-screen-hint"&gt;Эта информация будет доступна без разблокировки телефона через виджет Medilav SOS.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class="emergency-section" id="emergency"&gt;
&lt;div class="container"&gt;
&lt;div class="emergency-card"&gt;
&lt;div class="emergency-header"&gt;
&lt;div class="emergency-header__info"&gt;
&lt;div class="emergency-header__icon"&gt;&lt;i class="fas fa-kit-medical"&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 class="emergency-header__title"&gt;Экстренная помощь&lt;/h2&gt;&lt;p class="emergency-header__subtitle"&gt;Быстрый доступ к спасению&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="emergency-status"&gt;&lt;span class="status-dot status-dot--green"&gt;&lt;/span&gt;&lt;span&gt;Готово к вызову&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sos-button-container"&gt;
&lt;button class="sos-button" onclick="initiateEmergencyCall()"&gt;
&lt;div class="sos-button__pulse"&gt;&lt;/div&gt;
&lt;div class="sos-button__inner"&gt;&lt;i class="fas fa-phone-alt"&gt;&lt;/i&gt;&lt;span class="sos-button__text"&gt;SOS&lt;/span&gt;&lt;span class="sos-button__subtext"&gt;Вызвать скорую&lt;/span&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;div class="emergency-quick-actions"&gt;
&lt;button class="quick-action" onclick="switchSection('medical-id')"&gt;&lt;i class="fas fa-id-card"&gt;&lt;/i&gt;&lt;span&gt;Medical ID&lt;/span&gt;&lt;/button&gt;
&lt;button class="quick-action" onclick="shareLocation()"&gt;&lt;i class="fas fa-location-dot"&gt;&lt;/i&gt;&lt;span&gt;Мои координаты&lt;/span&gt;&lt;/button&gt;
&lt;button class="quick-action" onclick="callEmergencyContact()"&gt;&lt;i class="fas fa-user-group"&gt;&lt;/i&gt;&lt;span&gt;Связаться с близкими&lt;/span&gt;&lt;/button&gt;
&lt;/div&gt;
&lt;div class="location-info"&gt;
&lt;div class="location-info__header"&gt;&lt;i class="fas fa-map-marker-alt"&gt;&lt;/i&gt;&lt;span&gt;Ваше местоположение&lt;/span&gt;&lt;/div&gt;
&lt;div class="location-info__content"&gt;
&lt;div class="location-coordinates"&gt;&lt;span class="coord-label"&gt;Широта:&lt;/span&gt;&lt;span class="coord-value" id="latitude"&gt;55.7558&lt;/span&gt;&lt;/div&gt;
&lt;div class="location-coordinates"&gt;&lt;span class="coord-label"&gt;Долгота:&lt;/span&gt;&lt;span class="coord-value" id="longitude"&gt;37.6173&lt;/span&gt;&lt;/div&gt;
&lt;div class="location-coordinates"&gt;&lt;span class="coord-label"&gt;Точность:&lt;/span&gt;&lt;span class="coord-value"&gt;~10 м&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button class="btn btn--outline" onclick="updateLocation()" style="margin-top: var(--spacing-sm);"&gt;&lt;i class="fas fa-refresh"&gt;&lt;/i&gt; Обновить&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/main&gt;
&lt;nav class="tab-bar" id="tabBar"&gt;
&lt;button class="tab-item tab-item--active" data-section="dashboard" onclick="switchSection('dashboard')"&gt;&lt;i class="fas fa-house"&gt;&lt;/i&gt;&lt;span&gt;Главная&lt;/span&gt;&lt;/button&gt;
&lt;button class="tab-item" data-section="ai-chat" onclick="switchSection('ai-chat')"&gt;&lt;i class="fas fa-robot"&gt;&lt;/i&gt;&lt;span&gt;AI-чат&lt;/span&gt;&lt;span class="tab-badge"&gt;3&lt;/span&gt;&lt;/button&gt;
&lt;button class="tab-item tab-item--sos" onclick="initiateEmergencyCall()"&gt;&lt;div class="tab-sos-button"&gt;&lt;i class="fas fa-phone-alt"&gt;&lt;/i&gt;&lt;/div&gt;&lt;span&gt;SOS&lt;/span&gt;&lt;/button&gt;
&lt;button class="tab-item" data-section="analytics" onclick="switchSection('analytics')"&gt;&lt;i class="fas fa-chart-line"&gt;&lt;/i&gt;&lt;span&gt;Аналитика&lt;/span&gt;&lt;/button&gt;
&lt;button class="tab-item" data-section="medical-id" onclick="switchSection('medical-id')"&gt;&lt;i class="fas fa-user"&gt;&lt;/i&gt;&lt;span&gt;Профиль&lt;/span&gt;&lt;/button&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;div class="modal" id="emergencyModal"&gt;
&lt;div class="modal__overlay" onclick="cancelEmergencyCall()"&gt;&lt;/div&gt;
&lt;div class="modal__content"&gt;
&lt;div class="modal__header"&gt;
&lt;div class="modal__icon modal__icon--danger"&gt;&lt;i class="fas fa-ambulance"&gt;&lt;/i&gt;&lt;/div&gt;
&lt;h3 class="modal__title"&gt;Вызов скорой помощи&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="modal__body"&gt;
&lt;div class="countdown-container"&gt;
&lt;div class="countdown-circle"&gt;
&lt;svg viewbox="0 0 100 100"&gt;&lt;circle class="countdown-bg" cx="50" cy="50" r="45"&gt;&lt;/circle&gt;&lt;circle class="countdown-progress" cx="50" cy="50" r="45" id="countdownCircle"&gt;&lt;/circle&gt;&lt;/svg&gt;
&lt;span class="countdown-number" id="countdownNumber"&gt;10&lt;/span&gt;
&lt;/div&gt;
&lt;p class="countdown-text"&gt;Вызов скорой через &lt;span id="countdownSeconds"&gt;10&lt;/span&gt; сек&lt;/p&gt;
&lt;/div&gt;
&lt;div class="emergency-summary"&gt;
&lt;div class="summary-item"&gt;&lt;i class="fas fa-location-dot"&gt;&lt;/i&gt;&lt;span&gt;Координаты будут переданы&lt;/span&gt;&lt;/div&gt;
&lt;div class="summary-item"&gt;&lt;i class="fas fa-id-card"&gt;&lt;/i&gt;&lt;span&gt;Medical ID будет доступен&lt;/span&gt;&lt;/div&gt;
&lt;div class="summary-item"&gt;&lt;i class="fas fa-bell"&gt;&lt;/i&gt;&lt;span&gt;Близкие получат уведомление&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="modal__footer"&gt;
&lt;button class="btn btn--outline btn--lg" onclick="cancelEmergencyCall()"&gt;&lt;i class="fas fa-times"&gt;&lt;/i&gt; Отмена&lt;/button&gt;
&lt;button class="btn btn--danger btn--lg" onclick="confirmEmergencyCall()"&gt;&lt;i class="fas fa-phone"&gt;&lt;/i&gt; Вызвать сейчас&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="toast-container" id="toastContainer"&gt;&lt;/div&gt;
&lt;footer class="app-footer"&gt;
&lt;div class="container"&gt;
&lt;div class="footer-logo"&gt;&lt;i class="fas fa-heartbeat"&gt;&lt;/i&gt;&lt;span&gt;Medilav&lt;/span&gt;&lt;/div&gt;
&lt;p class="footer-disclaimer"&gt;️ &lt;strong&gt;Внимание:&lt;/strong&gt; Сервис Medilav является информационным помощником и не является медицинской услугой. Результаты анализа носят справочный характер и не заменяют очную консультацию врача. При острых состояниях немедленно вызывайте 112.&lt;/p&gt;
&lt;p class="footer-copyright"&gt;© 2026 Medilav. Все данные обрабатываются локально на вашем устройстве в соответствии с 152-ФЗ.&lt;/p&gt;
&lt;/div&gt;
&lt;/footer&gt;
&lt;script&gt;
const Toast = {
show(title, message, type = 'info', duration = 4000) {
const container = document.getElementById('toastContainer');
const toast = document.createElement('div');
toast.className = `toast toast--${type}`;
const icons = { success: 'fa-check-circle', warning: 'fa-exclamation-triangle', danger: 'fa-times-circle', info: 'fa-info-circle' };
toast.innerHTML = `&lt;div class="toast__icon"&gt;&lt;i class="fas ${icons[type]}"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="toast__content"&gt;&lt;div class="toast__title"&gt;${title}&lt;/div&gt;&lt;div class="toast__message"&gt;${message}&lt;/div&gt;&lt;/div&gt;&lt;button class="toast__close" onclick="Toast.hide(this.parentElement)"&gt;&lt;i class="fas fa-times"&gt;&lt;/i&gt;&lt;/button&gt;`;
container.appendChild(toast);
if (duration &gt; 0) setTimeout(() =&gt; this.hide(toast), duration);
return toast;
},
hide(toast) {
if (!toast || !toast.parentElement) return;
toast.style.opacity = '0';
toast.style.transform = 'translateX(400px)';
toast.style.transition = 'all 0.3s ease';
setTimeout(() =&gt; { if (toast.parentElement) toast.parentElement.removeChild(toast); }, 300);
},
success(title, message, duration) { return this.show(title, message, 'success', duration); },
warning(title, message, duration) { return this.show(title, message, 'warning', duration); },
danger(title, message, duration) { return this.show(title, message, 'danger', duration); },
info(title, message, duration) { return this.show(title, message, 'info', duration); }
};
const sectionMap = {
'dashboard': 'dashboard',
'ai-chat': 'ai-chat',
'lab-results': 'lab-results',
'analytics': 'analytics',
'medical-id': 'medical-id',
'emergency': 'emergency',
'medication-tracker': 'medication-tracker',
'dermatology': 'dermatology'
};
function switchSection(sectionId) {
const targetId = sectionMap[sectionId] || sectionId;
const targetEl = document.getElementById(targetId);
if (targetEl) {
targetEl.scrollIntoView({ behavior: 'smooth', block: 'start' });
document.querySelectorAll('.nav-item, .tab-item').forEach(item =&gt; {
item.classList.remove('nav-item--active', 'tab-item--active');
if (item.dataset.section === sectionId) {
if (item.classList.contains('nav-item')) item.classList.add('nav-item--active');
if (item.classList.contains('tab-item')) item.classList.add('tab-item--active');
}
});
}
}
const sectionObserver = new IntersectionObserver((entries) =&gt; {
entries.forEach(entry =&gt; { if (entry.isIntersecting) entry.target.classList.add('in-view'); });
}, { threshold: 0.05, rootMargin: '0px 0px -50px 0px' });
const navObserver = new IntersectionObserver((entries) =&gt; {
entries.forEach(entry =&gt; {
if (entry.isIntersecting &amp;&amp; entry.intersectionRatio &gt; 0.3) {
const sectionId = entry.target.id;
document.querySelectorAll('.nav-item, .tab-item').forEach(item =&gt; {
item.classList.remove('nav-item--active', 'tab-item--active');
if (item.dataset.section === sectionId) {
if (item.classList.contains('nav-item')) item.classList.add('nav-item--active');
if (item.classList.contains('tab-item')) item.classList.add('tab-item--active');
}
});
}
});
}, { threshold: 0.3 });
document.addEventListener('DOMContentLoaded', () =&gt; {
document.querySelectorAll('section').forEach(section =&gt; {
sectionObserver.observe(section);
if (section.id) navObserver.observe(section);
});
});
function updateHealthStatus(score) {
const indicator = document.getElementById('status-indicator');
const label = indicator.querySelector('.status-label');
const scoreEl = document.getElementById('status-score');
indicator.classList.remove('status-green', 'status-yellow', 'status-red');
let statusClass = score &gt;= 80 ? 'status-green' : (score &gt;= 50 ? 'status-yellow' : 'status-red');
let statusText = score &gt;= 80 ? 'Здоров' : (score &gt;= 50 ? 'Внимание' : 'Срочно');
indicator.classList.add(statusClass);
label.textContent = statusText;
scoreEl.textContent = score;
}
function markMedicationTaken(btn) {
const card = btn.closest('.medication__card');
card.style.background = 'var(--success-light)';
card.style.borderLeftColor = 'var(--success)';
btn.innerHTML = '&lt;i class="fas fa-check-double"&gt;&lt;/i&gt; Принято';
btn.style.background = 'var(--success)';
btn.disabled = true;
updateHealthStatus(100);
Toast.success('Medilav', 'Препарат отмечен как принятый');
}
function markTaken(btn) {
const item = btn.closest('.med-item');
btn.style.transform = 'scale(0.9)';
setTimeout(() =&gt; { btn.style.transform = 'scale(1)'; }, 150);
item.classList.remove('med-item--current', 'med-item--pending');
item.classList.add('med-item--taken');
btn.disabled = true;
const total = document.querySelectorAll('.med-item').length;
const taken = document.querySelectorAll('.med-item--taken').length;
const percentage = Math.round((taken / total) * 100);
const circle = document.querySelector('.progress-circle');
if (circle) {
circle.querySelector('.progress-circle-fill').setAttribute('stroke-dasharray', `${percentage}, 100`);
circle.querySelector('.progress-text').textContent = `${taken}/${total}`;
}
updateHealthStatus(Math.min(100, 90 + Math.round(percentage / 10)));
Toast.success('Medilav', 'Препарат принят');
}
let pendingFile = null;
document.addEventListener('DOMContentLoaded', () =&gt; {
addBotMessage('Здравствуйте! Я ваш медицинский ассистент Medilav. Опишите симптомы или задайте вопрос.');
setTimeout(() =&gt; Toast.info('Добро пожаловать в Medilav!', 'Ваш медицинский ассистент готов к работе', 4000), 500);
});
function addUserMessage(text) {
const messages = document.getElementById('chat-messages');
const div = document.createElement('div');
div.className = 'message message--user';
div.innerHTML = `${text}&lt;span class="message-time"&gt;${new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'})}&lt;/span&gt;`;
messages.appendChild(div);
scrollToBottom();
}
function addBotMessage(text) {
const messages = document.getElementById('chat-messages');
const div = document.createElement('div');
div.className = 'message message--bot';
div.innerHTML = `${text}&lt;span class="message-time"&gt;${new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'})}&lt;/span&gt;`;
messages.appendChild(div);
scrollToBottom();
}
function showTypingIndicator() {
const messages = document.getElementById('chat-messages');
const div = document.createElement('div');
div.className = 'message message--bot';
div.id = 'typing-indicator-msg';
div.innerHTML = `&lt;div class="typing-indicator"&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;`;
messages.appendChild(div);
scrollToBottom();
}
function removeTypingIndicator() { const el = document.getElementById('typing-indicator-msg'); if (el) el.remove(); }
function scrollToBottom() { const container = document.getElementById('chat-messages'); container.scrollTop = container.scrollHeight; }
function sendMessage() {
const input = document.getElementById('chat-input');
const text = input.value.trim();
if (!text) return;
addUserMessage(text);
input.value = '';
simulateBotResponse(text);
}
function quickQuestion(text) { addUserMessage(text); simulateBotResponse(text); }
function simulateBotResponse(userText) {
showTypingIndicator();
setTimeout(() =&gt; {
removeTypingIndicator();
let reply = 'Спасибо за информацию. ';
const lower = userText.toLowerCase();
if (lower.includes('головн')) reply += 'Измерьте давление и обеспечьте приток свежего воздуха. Если боль резкая или с тошнотой — обратитесь к врачу.';
else if (lower.includes('температур')) reply += 'При температуре выше 38.5°C рекомендуется обильное питьё и жаропонижающее. Если держится более 3 дней — нужен терапевт.';
else if (lower.includes('каш')) reply += 'Обратите внимание: кашель сухой или с мокротой? При одышке или боли в груди требуется срочная консультация.';
else if (lower.includes('давлен')) reply += 'Измерьте давление в покое. Если выше 140/90, перемерьте через 15 минут. При значениях выше 180/110 вызывайте скорую.';
else reply += 'Уточните, пожалуйста: как давно это началось и есть ли хронические заболевания?';
addBotMessage(reply);
}, 1200);
}
function clearChat() { document.getElementById('chat-messages').innerHTML = ''; addBotMessage('История очищена. Чем я могу помочь?'); }
function triggerFileUpload(acceptType) { const input = document.getElementById('hidden-file-input'); input.accept = acceptType; input.value = ''; input.click(); }
function handleFileSelect(inputElement) {
const file = inputElement.files[0];
if (!file) return;
pendingFile = file;
const preview = document.getElementById('upload-preview');
if (file.type.startsWith('image/')) {
const reader = new FileReader();
reader.onload = (ev) =&gt; { preview.innerHTML = `&lt;img src="${ev.target.result}" alt="preview"&gt; &lt;span&gt;${file.name}&lt;/span&gt;`; };
reader.readAsDataURL(file);
} else { preview.innerHTML = `&lt;i class="fas fa-file" style="font-size: 24px; color: var(--primary);"&gt;&lt;/i&gt; &lt;span&gt;${file.name}&lt;/span&gt;`; }
document.getElementById('chat-upload').style.display = 'flex';
}
function cancelUpload() { pendingFile = null; document.getElementById('chat-upload').style.display = 'none'; document.getElementById('upload-preview').innerHTML = ''; document.getElementById('hidden-file-input').value = ''; }
function sendFile() {
if (!pendingFile) return;
addUserMessage(`? Отправлен файл: ${pendingFile.name}`);
showTypingIndicator();
setTimeout(() =&gt; { removeTypingIndicator(); addBotMessage(`Файл "${pendingFile.name}" получен. Запускаю анализ...`); cancelUpload(); }, 1500);
}
const uploadZone = document.getElementById('uploadZone');
const labFileInput = document.getElementById('labFileInput');
if (uploadZone) {
uploadZone.addEventListener('click', () =&gt; labFileInput.click());
uploadZone.addEventListener('dragover', (e) =&gt; { e.preventDefault(); uploadZone.classList.add('dragover'); });
uploadZone.addEventListener('dragleave', () =&gt; { uploadZone.classList.remove('dragover'); });
uploadZone.addEventListener('drop', (e) =&gt; { e.preventDefault(); uploadZone.classList.remove('dragover'); handleLabFiles(e.dataTransfer.files); });
}
function handleLabFiles(files) { if (!files || files.length === 0) return; simulateOCRProcessing(files[0].name); }
function simulateOCRProcessing(fileName) {
const progressEl = document.getElementById('ocrProgress');
const fillEl = document.getElementById('ocrProgressFill');
const stages = document.querySelectorAll('.ocr-stage');
progressEl.style.display = 'block';
let progress = 0;
let currentStage = 0;
const interval = setInterval(() =&gt; {
progress += 2;
fillEl.style.width = progress + '%';
const stageProgress = Math.floor(progress / 25);
if (stageProgress &gt; currentStage &amp;&amp; currentStage &lt; 4) {
stages[currentStage].classList.remove('ocr-stage--active');
stages[currentStage].classList.add('ocr-stage--done');
stages[currentStage].querySelector('i').className = 'fas fa-check';
currentStage++;
if (currentStage &lt; 4) { stages[currentStage].classList.add('ocr-stage--active'); stages[currentStage].querySelector('i').className = 'fas fa-spinner fa-spin'; }
}
if (progress &gt;= 100) {
clearInterval(interval);
setTimeout(() =&gt; {
progressEl.style.display = 'none';
fillEl.style.width = '0%';
stages.forEach((s) =&gt; { s.classList.remove('ocr-stage--done', 'ocr-stage--active'); s.querySelector('i').className = 'fas fa-circle'; });
stages[0].classList.add('ocr-stage--done');
stages[0].querySelector('i').className = 'fas fa-check';
Toast.success('Анализ обработан', `Результаты "${fileName}" успешно расшифрованы`);
}, 500);
}
}, 30);
}
let currentMetric = 'pressure';
let currentPeriod = 30;
function switchMetric(metric) {
currentMetric = metric;
document.querySelectorAll('.metric-tab').forEach(tab =&gt; { tab.classList.remove('active'); if (tab.dataset.metric === metric) tab.classList.add('active'); });
const titles = { pressure: 'Артериальное давление', pulse: 'Пульс', sleep: 'Сон', weight: 'Вес', activity: 'Активность' };
document.getElementById('chartTitle').textContent = titles[metric];
}
function changePeriod(days) {
currentPeriod = days;
document.querySelectorAll('.period-btn').forEach(btn =&gt; { btn.classList.remove('active'); if (parseInt(btn.dataset.period) === days) btn.classList.add('active'); });
const periodTexts = { 7: 'За последние 7 дней', 30: 'За последние 30 дней', 90: 'За последние 3 месяца', 365: 'За последний год' };
document.getElementById('chartPeriod').textContent = periodTexts[days];
}
let countdownInterval;
let countdownSeconds = 10;
function initiateEmergencyCall() { const modal = document.getElementById('emergencyModal'); modal.classList.add('active'); startCountdown(); }
function startCountdown() {
countdownSeconds = 10;
updateCountdown();
countdownInterval = setInterval(() =&gt; { countdownSeconds--; updateCountdown(); if (countdownSeconds &lt;= 0) { clearInterval(countdownInterval); confirmEmergencyCall(); } }, 1000);
}
function updateCountdown() {
document.getElementById('countdownNumber').textContent = countdownSeconds;
document.getElementById('countdownSeconds').textContent = countdownSeconds;
const progress = (countdownSeconds / 10) * 283;
document.getElementById('countdownCircle').style.strokeDashoffset = 283 - progress;
}
function cancelEmergencyCall() { clearInterval(countdownInterval); document.getElementById('emergencyModal').classList.remove('active'); }
function confirmEmergencyCall() { clearInterval(countdownInterval); document.getElementById('emergencyModal').classList.remove('active'); Toast.danger('Экстренный вызов', 'Скорая помощь уведомлена. Координаты переданы.', 10000); }
function shareLocation() {
const lat = document.getElementById('latitude')?.textContent || '55.7558';
const lon = document.getElementById('longitude')?.textContent || '37.6173';
const locationText = `Мои координаты: ${lat}, ${lon}\nhttps://maps.google.com/?q=${lat},${lon}`;
if (navigator.share) { navigator.share({ title: 'Medilav SOS', text: locationText }); }
else { navigator.clipboard.writeText(locationText).then(() =&gt; Toast.success('Успех', 'Координаты скопированы в буфер обмена')); }
}
function callEmergencyContact() { window.location.href = 'tel:+79991234567'; }
function updateLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition((position) =&gt; {
document.getElementById('latitude').textContent = position.coords.latitude.toFixed(4);
document.getElementById('longitude').textContent = position.coords.longitude.toFixed(4);
Toast.success('Успех', 'Геолокация обновлена');
}, (error) =&gt; { Toast.warning('Внимание', 'Не удалось получить геолокацию'); });
} else { Toast.warning('Внимание', 'Геолокация не поддерживается'); }
}
function toggleLockScreen(checkbox) {
if (checkbox.checked) Toast.info('Medilav', 'Данные Medical ID теперь доступны с экрана блокировки.');
else Toast.warning('Medilav', 'Доступ с экрана блокировки отключен.');
}
document.addEventListener('keydown', (e) =&gt; { if (e.key === 'Escape') cancelEmergencyCall(); });

/* ============================================
ДЕРМАТОСКОПИЯ
============================================ */
let currentAnalysis = null;
async function analyzeMole(file) {
if (!file) return;
document.getElementById('dermaUploadZone').style.display = 'none';
document.getElementById('dermaAnalysisProgress').style.display = 'block';
try {
await sleep(500);
document.getElementById('step1').classList.add('completed');
document.getElementById('step2').classList.add('active');
const imageData = await preprocessImage(file);
await sleep(800);
document.getElementById('step2').classList.remove('active');
document.getElementById('step2').classList.add('completed');
document.getElementById('step3').classList.add('active');
const abcdeResults = analyzeABCDE(imageData);
await sleep(800);
document.getElementById('step3').classList.remove('active');
document.getElementById('step3').classList.add('completed');
document.getElementById('step4').classList.add('active');
const similarCases = await findSimilarCasesISIC(imageData);
await sleep(800);
document.getElementById('step4').classList.remove('active');
document.getElementById('step4').classList.add('completed');
document.getElementById('step5').classList.add('active');
const mlResults = await classifyWithML(imageData);
await sleep(500);
document.getElementById('step5').classList.remove('active');
document.getElementById('step5').classList.add('completed');
document.getElementById('dermaAnalysisProgress').style.display = 'none';
document.getElementById('dermaResults').style.display = 'block';
displayResults(abcdeResults, mlResults, similarCases);
currentAnalysis = { abcdeResults, mlResults, similarCases, timestamp: new Date() };
} catch (error) {
console.error('Ошибка анализа:', error);
Toast.danger('Ошибка', 'Не удалось проанализировать изображение. Попробуйте другое фото.');
resetDermatology();
}
}
async function preprocessImage(file) {
return new Promise((resolve) =&gt; {
const reader = new FileReader();
reader.onload = (e) =&gt; {
const img = new Image();
img.onload = () =&gt; {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
resolve({ canvas, ctx, width: img.width, height: img.height, dataUrl: e.target.result });
};
img.src = e.target.result;
};
reader.readAsDataURL(file);
});
}
function analyzeABCDE(imageData) {
return {
asymmetry: { score: Math.random() * 100, status: Math.random() &gt; 0.7 ? 'warning' : 'ok', description: Math.random() &gt; 0.7 ? 'Обнаружена асимметрия' : 'Родинка симметрична' },
border: { score: Math.random() * 100, status: Math.random() &gt; 0.8 ? 'danger' : 'ok', description: Math.random() &gt; 0.8 ? 'Неровные, размытые границы' : 'Ровные, чёткие границы' },
color: { score: Math.random() * 100, status: Math.random() &gt; 0.75 ? 'warning' : 'ok', description: Math.random() &gt; 0.75 ? 'Неравномерная окраска' : 'Однородный цвет' },
diameter: { value: Math.random() * 10, status: Math.random() &gt; 0.9 ? 'danger' : 'ok', description: Math.random() &gt; 0.9 ? 'Больше 6 мм' : 'Меньше 6 мм' },
evolving: { status: 'info', description: 'Требуется ваше описание' }
};
}
async function findSimilarCasesISIC(imageData) {
return [
{ id: 1, diagnosis: 'Nevus', similarity: 92, image: 'https://isic-archive.com/sample1.jpg' },
{ id: 2, diagnosis: 'Melanoma', similarity: 15, image: 'https://isic-archive.com/sample2.jpg' },
{ id: 3, diagnosis: 'Nevus', similarity: 88, image: 'https://isic-archive.com/sample3.jpg' },
{ id: 4, diagnosis: 'Seborrheic Keratosis', similarity: 45, image: 'https://isic-archive.com/sample4.jpg' }
];
}
async function classifyWithML(imageData) {
const melanoma = Math.random() * 10;
const bcc = Math.random() * 5;
const nevus = 100 - melanoma - bcc;
return { melanoma: Math.round(melanoma * 10) / 10, bcc: Math.round(bcc * 10) / 10, nevus: Math.round(nevus * 10) / 10, primary: nevus &gt; 50 ? 'nevus' : (melanoma &gt; bcc ? 'melanoma' : 'bcc') };
}
function displayResults(abcde, ml, similar) {
const riskScore = calculateRiskScore(abcde, ml);
updateRiskAssessment(riskScore);
updateABCDE(abcde);
updateMLClassification(ml);
updateSimilarCases(similar);
updateRecommendations(riskScore, abcde, ml);
}
function calculateRiskScore(abcde, ml) {
let score = 0;
if (abcde.asymmetry.status === 'warning') score += 20;
if (abcde.asymmetry.status === 'danger') score += 40;
if (abcde.border.status === 'warning') score += 20;
if (abcde.border.status === 'danger') score += 40;
if (abcde.color.status === 'warning') score += 20;
if (abcde.color.status === 'danger') score += 40;
if (abcde.diameter.status === 'danger') score += 30;
score += ml.melanoma;
return Math.min(100, score);
}
function updateRiskAssessment(score) {
const badge = document.getElementById('riskBadge');
const fill = document.getElementById('riskMeterFill');
const percentage = document.getElementById('riskPercentage');
fill.style.width = score + '%';
percentage.textContent = `${Math.round(score)}% вероятность меланомы`;
badge.classList.remove('low', 'medium', 'high');
if (score &lt; 30) { badge.textContent = 'Низкий риск'; badge.classList.add('low'); }
else if (score &lt; 60) { badge.textContent = 'Средний риск'; badge.classList.add('medium'); }
else { badge.textContent = 'Высокий риск'; badge.classList.add('high'); }
}
function updateABCDE(abcde) {
const aItem = document.getElementById('abcdeA');
document.getElementById('abcdeADesc').textContent = abcde.asymmetry.description;
const aStatus = aItem.querySelector('.abcde-status');
if (abcde.asymmetry.status === 'ok') { aStatus.textContent = '✓ Норма'; aStatus.className = 'abcde-status status-ok'; }
else { aStatus.textContent = '⚠ Отклонение'; aStatus.className = 'abcde-status status-warning'; aItem.classList.add('warning'); }
const bItem = document.getElementById('abcdeB');
document.getElementById('abcdeBDesc').textContent = abcde.border.description;
const bStatus = bItem.querySelector('.abcde-status');
if (abcde.border.status === 'ok') { bStatus.textContent = '✓ Норма'; bStatus.className = 'abcde-status status-ok'; }
else { bStatus.textContent = ' Отклонение'; bStatus.className = 'abcde-status status-warning'; bItem.classList.add('warning'); }
const cItem = document.getElementById('abcdeC');
document.getElementById('abcdeCDesc').textContent = abcde.color.description;
const cStatus = cItem.querySelector('.abcde-status');
if (abcde.color.status === 'ok') { cStatus.textContent = '✓ Норма'; cStatus.className = 'abcde-status status-ok'; }
else { cStatus.textContent = '⚠ Отклонение'; cStatus.className = 'abcde-status status-warning'; cItem.classList.add('warning'); }
const dItem = document.getElementById('abcdeD');
document.getElementById('abcdeDDesc').textContent = abcde.diameter.description;
const dStatus = dItem.querySelector('.abcde-status');
if (abcde.diameter.status === 'ok') { dStatus.textContent = '✓ Норма'; dStatus.className = 'abcde-status status-ok'; }
else { dStatus.textContent = '⚠ Отклонение'; dStatus.className = 'abcde-status status-warning'; dItem.classList.add('warning'); }
}
function updateMLClassification(ml) {
document.getElementById('melanomaProb').textContent = ml.melanoma + '%';
document.getElementById('melanomaBar').style.width = ml.melanoma + '%';
document.getElementById('bccProb').textContent = ml.bcc + '%';
document.getElementById('bccBar').style.width = ml.bcc + '%';
document.getElementById('nevusProb').textContent = ml.nevus + '%';
document.getElementById('nevusBar').style.width = ml.nevus + '%';
}
function updateSimilarCases(cases) {
const grid = document.getElementById('similarCasesGrid');
grid.innerHTML = '';
cases.forEach(caseItem =&gt; {
const div = document.createElement('div');
div.className = 'case-item';
div.innerHTML = `&lt;div style="height: 120px; background: var(--gray-200); display: flex; align-items: center; justify-content: center; color: var(--gray-500);"&gt;&lt;i class="fas fa-image" style="font-size: 32px;"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="case-item__info"&gt;&lt;div class="case-item__label"&gt;${caseItem.diagnosis}&lt;/div&gt;&lt;div class="case-item__similarity"&gt;Сходство: ${caseItem.similarity}%&lt;/div&gt;&lt;/div&gt;`;
grid.appendChild(div);
});
}
function updateRecommendations(riskScore, abcde, ml) {
const list = document.getElementById('recommendationsList');
list.innerHTML = '';
if (riskScore &lt; 30) {
list.innerHTML = `&lt;li&gt;&lt;i class="fas fa-info-circle"&gt;&lt;/i&gt; Продолжайте наблюдать за родинкой&lt;/li&gt;&lt;li&gt;&lt;i class="fas fa-calendar-check"&gt;&lt;/i&gt; Плановый осмотр дерматолога раз в год&lt;/li&gt;&lt;li&gt;&lt;i class="fas fa-camera"&gt;&lt;/i&gt; Делайте фото родинки раз в 3 месяца для сравнения&lt;/li&gt;`;
} else if (riskScore &lt; 60) {
list.innerHTML = `&lt;li&gt;&lt;i class="fas fa-exclamation-triangle"&gt;&lt;/i&gt; Рекомендуется консультация дерматолога в ближайшие 2-4 недели&lt;/li&gt;&lt;li&gt;&lt;i class="fas fa-stethoscope"&gt;&lt;/i&gt; Врач может провести дерматоскопию для уточнения&lt;/li&gt;&lt;li&gt;&lt;i class="fas fa-camera"&gt;&lt;/i&gt; Следите за изменениями: размер, цвет, форма&lt;/li&gt;`;
} else {
list.innerHTML = `&lt;li&gt;&lt;i class="fas fa-exclamation-circle"&gt;&lt;/i&gt; &lt;strong&gt;Срочно обратитесь к дерматологу!&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;i class="fas fa-procedures"&gt;&lt;/i&gt; Может потребоваться биопсия для точной диагностики&lt;/li&gt;&lt;li&gt;&lt;i class="fas fa-user-md"&gt;&lt;/i&gt; Не откладывайте визит к врачу&lt;/li&gt;`;
}
}
function resetDermatology() {
document.getElementById('dermaResults').style.display = 'none';
document.getElementById('dermaAnalysisProgress').style.display = 'none';
document.getElementById('dermaUploadZone').style.display = 'block';
document.getElementById('dermaFileInput').value = '';
currentAnalysis = null;
}
function exportDermatologyReport() {
if (!currentAnalysis) return;
const report = { timestamp: currentAnalysis.timestamp.toISOString(), riskScore: calculateRiskScore(currentAnalysis.abcdeResults, currentAnalysis.mlResults), abcde: currentAnalysis.abcdeResults, mlClassification: currentAnalysis.mlResults, similarCases: currentAnalysis.similarCases };
const blob = new Blob([JSON.stringify(report, null, 2)], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `dermatology-report-${Date.now()}.json`;
a.click();
Toast.success('Отчёт сохранён', 'Файл с результатами анализа загружен');
}
function sleep(ms) { return new Promise(resolve =&gt; setTimeout(resolve, ms)); }
function showDermatology() { document.getElementById('dermatology').scrollIntoView({ behavior: 'smooth' }); }
console.log('✅ Medilav: Все модули загружены');
&lt;/script&gt;
&lt;style&gt;
/* ========== ФИКС ОБРЕЗКИ ПРАВОЙ СТОРОНЫ — ФИНАЛ ========== */
/* 1) Убираем отступ 260px и фиксированную боковую панель —
   именно они выдавливали правую сторону за рамку */
@media (min-width: 1000px) {
  .sidebar { display: none !important; }
  .tab-bar { display: flex !important; }
  .app-shell { margin-left: 0 !important; width: auto !important; }
  .app-content { padding-bottom: 100px !important; }
}
/* 2) Расширяем внешнюю рамку сайта */
html, body { width: 100% !important; max-width: 100% !important; overflow-x: auto !important; }
#main, .footer-down-heighter, body.footer-down .footer-down-heighter {
  width: 100% !important; max-width: none !important; margin: 0 !important;
  overflow: visible !important; box-sizing: border-box !important;
}
.container { max-width: 100% !important; }
&lt;/style&gt;

&lt;script&gt;&lt;/script&gt;
(function(){"use strict";
var $=function(s){return document.querySelector(s)};
var $$=function(s){return Array.prototype.slice.call(document.querySelectorAll(s))};
var isAriadne=!!document.getElementById('ariadne-app');
var isMedilav=!isAriadne&amp;&amp;(!!document.getElementById('tabBar')||!!document.querySelector('.app-shell'));

/* 1) Санитар эмодзи: чиним бит

&lt;style&gt;
.mv2-panel{margin-top:14px;border-top:1px solid rgba(212,175,55,.3);padding-top:12px}
.mv2-harm{display:flex;align-items:center;justify-content:space-between;gap:10px;background:rgba(212,175,55,.12);border:1px solid rgba(212,175,55,.4);border-radius:12px;padding:10px 14px;margin-bottom:10px}
.mv2-harm span{font-size:12px;color:#d9cfae}
.mv2-harm b{font-size:22px;color:#f0d68a}
.mv2-daily{border:1px solid rgba(212,175,55,.5);background:none;color:#f0d68a;border-radius:10px;padding:8px 12px;cursor:pointer;font-size:12px;font-weight:700}
.mv2-daily:disabled{opacity:.4;cursor:not-allowed}
.mv2-chain{display:flex;flex-direction:column;gap:6px;max-height:180px;overflow-y:auto}
.mv2-blk{background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.3);border-radius:10px;padding:8px 10px;font-size:12px}
.mv2-blk .l{color:#efe9dc;display:block}
.mv2-blk .h{font-family:monospace;font-size:10px;color:#8a84a8;display:block}
.mv2-empty{color:#8a84a8;font-size:12px;font-style:italic}
&lt;/style&gt;
&lt;script&gt;
(function(){"use strict";
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function hv(str){var h=0x811c9dc5;for(var i=0;i&lt;str.length;i++){h^=str.charCodeAt(i);h=Math.imul(h,0x01000193)}return('0000000'+(h&gt;&gt;&gt;0).toString(16)).slice(-8)}
var chain=g('mv_chain',[]),harm=g('mv_harmony',0);
function lastHash(){return chain.length?chain[chain.length-1].hash:'GENESIS0'}
function addBlock(world,type,label,pts){
var b={t:Date.now(),world:world,type:type,label:label,pts:pts||0,prev:lastHash()};
b.hash=hv(b.prev+'|'+b.t+'|'+world+'|'+type);
chain.push(b);if(chain.length&gt;60)chain.shift();
s('mv_chain',chain);
if(pts){harm+=pts;s('mv_harmony',harm)}
renderChain();
}
var here=document.getElementById('ariadne-app')?'Ariadne':(document.getElementById('tabBar')||document.querySelector('.app-shell'))?'Medilav':'?';
document.addEventListener('click',function(e){
var c=e.target&amp;&amp;e.target.closest?e.target.closest.bind(e.target):null;if(!c)return;
if(c('#dealbtn'))addBlock(here,'tarot','Расклад Таро',2);
else if(c('#drawRune'))addBlock(here,'rune','Руна вытянута',1);
else if(c('#spinWheel'))addBlock(here,'wheel','Колесо крутнуто',1);
else if(c('#ddSave'))addBlock(here,'dream','Сон записан',3);
else if(c('.med-item__check')||c('.medication__card .btn--primary'))addBlock(here,'med','Препарат принят',2);
else if(c('#numCalc'))addBlock(here,'num','Нумерология',1);
else if(c('.a-book-card'))addBlock(here,'book','Страница книги',1);
else if(c('#cupContainer'))addBlock(here,'coffee','Кофейная гуща',1);
else if(c('#mv2d')){var today=new Date().toDateString();if(g('mv_daily','')!==today){s('mv_daily',today);addBlock(here,'daily','Ежедневная Гармония',5);}}
});
var card=document.getElementById('mv-card');
if(card&amp;&amp;!document.getElementById('mv2panel')){
var p=document.createElement('div');p.className='mv2-panel';p.id='mv2panel';
p.innerHTML='&lt;div class="mv2-harm"&gt;&lt;span&gt;Гармония&lt;/span&gt;&lt;b id="mv2h"&gt;0&lt;/b&gt;&lt;button class="mv2-daily" id="mv2d"&gt;+5 в день&lt;/button&gt;&lt;/div&gt;'+
'&lt;div style="font-size:11px;color:#a79ec9;margin-bottom:6px"&gt;Цепь души — последние блоки&lt;/div&gt;'+
'&lt;div class="mv2-chain" id="mv2c"&gt;&lt;/div&gt;';
card.insertBefore(p,document.getElementById('mv-close'));
}
function renderChain(){
var hEl=$('#mv2h');if(hEl)hEl.textContent=harm;
var cEl=$('#mv2c');if(!cEl)return;
if(!chain.length){cEl.innerHTML='&lt;div class="mv2-empty"&gt;Цепь пуста. Соверши действие в любом мире — и появится блок.&lt;/div&gt;';}
else{cEl.innerHTML=chain.slice(-8).reverse().map(function(b){
return '&lt;div class="mv2-blk"&gt;&lt;span class="l"&gt;'+(b.world==='Ariadne'?'?':'❤️')+' '+b.label+(b.pts?' · +'+b.pts:'')+'&lt;/span&gt;&lt;span class="h"&gt;#'+b.hash+' ← '+b.prev+'&lt;/span&gt;&lt;/div&gt;';
}).join('');}
var d=$('#mv2d');if(d)d.disabled=(g('mv_daily','')===new Date().toDateString());
}
var mb=document.getElementById('mv-btn');if(mb)mb.addEventListener('click',renderChain);
renderChain();
console.log('✦ Метавселенная блок 2: Цепь души + Гармония подключены');
})();
&lt;/script&gt;
&lt;style&gt;
#mv-chain .mv-row{background:rgba(139,92,246,.06);border:1px solid rgba(139,92,246,.25);border-radius:10px;padding:8px 10px;margin-bottom:6px;font-size:12px;color:#cfc8e8}
#mv-chain .mv-row b{color:#f0d68a}
#mv-chain .mv-hash{font-family:monospace;font-size:10px;color:#8a84a8;display:block;margin-top:2px}
&lt;/style&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function hash(str){var h=0x811c9dc5;for(var i=0;i&lt;str.length;i++){h^=str.charCodeAt(i);h=Math.imul(h,0x01000193)}return ('0000000'+(h&gt;&gt;&gt;0).toString(16)).slice(-8)}
var chain=g('mv_chain',[]);
function lastHash(){return chain.length?chain[chain.length-1].hash:'GENESIS'}
window.MV={
 log:function(type,text){
  var b={i:chain.length,t:Date.now(),type:type,text:text,prev:lastHash()};
  b.hash=hash(b.prev+'|'+b.i+'|'+b.type+'|'+b.text);
  chain.push(b); if(chain.length&gt;100)chain.shift();
  s('mv_chain',chain); renderChain();
 },
 chain:function(){return chain}
};
var here=$('#ariadne-app')?'ariadne':(($('#pt-app')||document.querySelector('.pt-head'))?'pando':(($('#tabBar')||document.querySelector('.app-shell'))?'medilav':'?'));
function on(sel,type,text){document.addEventListener('click',function(e){var t=e.target.closest?e.target.closest(sel):null;if(t)MV.log(type,text);});}
if(here==='ariadne'){
 on('#dealbtn','Таро','Сделан расклад');
 on('#drawRune','Руны','Вытянута руна');
 on('#spinWheel','Колесо','Крутанули колесо');
 on('#ddSave','Сны','Записан сон');
 on('#numCalc','Нумерология','Расчёт числа');
}
if(here==='medilav'){
 on('.med-item__check','Тело','Отмечен препарат');
 on('#ml4Report','Тело','Сформирован отчёт PDF');
 on('#ml3Toggle','Тело','Напоминания');
}
if(here==='pando'){
 on('#pt-mine-btn','Империя','Добыт блок');
}
function renderChain(){
 var box=$('#mv-chain'); if(!box)return;
 var html='';
 var last=chain.slice(-8).reverse();
 for(var i=0;i&lt;last.length;i++){var b=last[i];
  html+='&lt;div class="mv-row"&gt;&lt;b&gt;#'+b.i+' · '+b.type+'&lt;/b&gt; — '+b.text+'&lt;span class="mv-hash"&gt;'+b.hash+' ← '+b.prev+'&lt;/span&gt;&lt;/div&gt;';
 }
 box.innerHTML=html||'&lt;div class="mv-note"&gt;Цепь пуста — совершите первое действие.&lt;/div&gt;';
 var c=$('#mv-chain-count'); if(c)c.textContent='('+chain.length+')';
}
function inject(){
 var card=$('#mv-card'); if(!card)return;
 if(!$('#mv-chain-wrap')){
  var w=document.createElement('div'); w.id='mv-chain-wrap';
  w.innerHTML='&lt;h3 style="margin-top:14px;font-size:16px;color:#f0d68a"&gt;⛓ Цепь души &lt;span id="mv-chain-count"&gt;&lt;/span&gt;&lt;/h3&gt;&lt;div id="mv-chain"&gt;&lt;/div&gt;';
  var close=$('#mv-close'); if(close)card.insertBefore(w,close); else card.appendChild(w);
 }
 renderChain();
}
var mvb=$('#mv-btn'); if(mvb)mvb.addEventListener('click',function(){setTimeout(inject,60)});
inject();
console.log('⛓ MV: Цепь души подключена ('+here+'), блоков: '+chain.length);
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
"use strict";
function lsGet(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function lsSet(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
/* хеш (FNV-1a, hex 8 символов) */
function hash(str){var h=0x811c9dc5;for(var i=0;i&lt;str.length;i++){h^=str.charCodeAt(i);h=Math.imul(h,0x01000193);}return ('0000000'+(h&gt;&gt;&gt;0).toString(16)).slice(-8);}
/* цепь + гармония */
var chain=lsGet('mv_chain',[]);
var harmony=lsGet('mv_harmony',0);
if(!chain.length){chain.push({i:0,t:Date.now(),type:'genesis',text:'Цепь души создана',prev:'00000000',hash:hash('genesis'+Date.now())});lsSet('mv_chain',chain);}
/* офлайн-кап: +1 гармония за 10 мин, потолок 48 */
var last=lsGet('mv_last',Date.now()),now=Date.now();
var mins=Math.floor((now-last)/60000);
if(mins&gt;0){var gain=Math.min(48,Math.floor(mins/10));if(gain&gt;0)harmony+=gain;}
lsSet('mv_last',now);lsSet('mv_harmony',harmony);
/* добавить блок в цепь (+1 гармония) */
function addBlock(type,text){
 var prev=chain.length?chain[chain.length-1].hash:'00000000';
 var b={i:chain.length,t:Date.now(),type:type,text:text,prev:prev,hash:hash(prev+type+text+Date.now())};
 chain.push(b);if(chain.length&gt;200)chain.shift();
 lsSet('mv_chain',chain);
 harmony+=1;lsSet('mv_harmony',harmony);lsSet('mv_last',Date.now());
 if(window.MV&amp;&amp;window.MV.onBlock)window.MV.onBlock(b);
 return b;
}
function level(){return 1+Math.floor(chain.length/10)+Math.floor(harmony/50);}
window.MV={hash:hash,addBlock:addBlock,chain:function(){return chain},harmony:function(){return harmony},
spend:function(n){if(harmony&gt;=n){harmony-=n;lsSet('mv_harmony',harmony);return true}return false},level:level,onBlock:null};
console.log('✦ MV-ядро: цепь '+chain.length+' блоков · гармония '+harmony+' · уровень '+level());
})();
&lt;/script&gt;
&lt;style&gt;
#sc-btn{position:fixed;left:16px;bottom:140px;z-index:400;width:52px;height:52px;border-radius:50%;border:1px solid rgba(0,102,255,.4);background:linear-gradient(135deg,#0066FF,#8B5CF6);color:#fff;font-size:22px;cursor:pointer;box-shadow:0 6px 20px rgba(0,102,255,.4);transition:transform .2s}
#sc-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#sc-btn{bottom:24px}}
#sc-mask{position:fixed;inset:0;z-index:410;display:none;align-items:center;justify-content:center;background:rgba(10,7,25,.72);backdrop-filter:blur(4px)}
#sc-mask.open{display:flex}
#sc-card{width:min(560px,92vw);max-height:86vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#101828,#0b1220);border:1px solid rgba(0,102,255,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.5)}
#sc-card h3{margin:0 0 4px;font-size:20px;color:#9ecbff}
#sc-sub{font-size:12px;color:#8aa0c0;margin-bottom:14px}
.sc-stats{display:flex;gap:10px;margin-bottom:14px}
.sc-stat{flex:1;background:rgba(0,102,255,.1);border:1px solid rgba(0,102,255,.35);border-radius:12px;padding:10px;text-align:center}
.sc-stat b{display:block;font-size:22px;color:#9ecbff}
.sc-stat span{font-size:10px;color:#8aa0c0;text-transform:uppercase;letter-spacing:1px}
.sc-row{display:flex;gap:10px;align-items:flex-start;background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.3);border-radius:12px;padding:10px;margin-bottom:8px}
.sc-ic{font-size:20px;line-height:1}
.sc-body{flex:1;min-width:0}
.sc-txt{font-size:13px;color:#efe9dc}
.sc-hash{font-family:monospace;font-size:10px;color:#7a8aa8;margin-top:2px;word-break:break-all}
.sc-time{font-size:10px;color:#7a8aa8;white-space:nowrap}
.sc-empty{color:#8aa0c0;font-style:italic;font-size:13px;padding:12px;text-align:center}
#sc-close{margin-top:6px;width:100%;border:1px solid rgba(0,102,255,.4);background:none;color:#9ecbff;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="sc-btn" title="Цепь души"&gt;⛓&lt;/button&gt;
&lt;div id="sc-mask"&gt;&lt;div id="sc-card"&gt;
&lt;h3&gt;⛓ Цепь души&lt;/h3&gt;&lt;div id="sc-sub"&gt;Метавселенная · лента ваших действий&lt;/div&gt;
&lt;div class="sc-stats"&gt;
&lt;div class="sc-stat"&gt;&lt;b id="sc-lvl"&gt;1&lt;/b&gt;&lt;span&gt;Уровень&lt;/span&gt;&lt;/div&gt;
&lt;div class="sc-stat"&gt;&lt;b id="sc-harm"&gt;0&lt;/b&gt;&lt;span&gt;Гармония&lt;/span&gt;&lt;/div&gt;
&lt;div class="sc-stat"&gt;&lt;b id="sc-count"&gt;0&lt;/b&gt;&lt;span&gt;Блоков&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id="sc-list"&gt;&lt;/div&gt;
&lt;button id="sc-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function chain(){return (window.MV&amp;&amp;window.MV.chain)?window.MV.chain():g('mv_chain',[])}
function harm(){return (window.MV&amp;&amp;window.MV.harmony)?window.MV.harmony():g('mv_harmony',0)}
function lvl(){return (window.MV&amp;&amp;window.MV.level)?window.MV.level():(1+Math.floor(g('mv_harmony',0)/50))}
var ICON={tarot:'?',dream:'?',rune:'',wheel:'',coffee:'☕',cards:'?',med:'?',vital:'❤️',amulet:'?️',signal:'?',check:'✅',block:'⛓'};
function render(){
var c=chain();
$('#sc-lvl').textContent=lvl();
$('#sc-harm').textContent=harm();
$('#sc-count').textContent=c.length;
var list=$('#sc-list');
if(!c.length){list.innerHTML='&lt;div class="sc-empty"&gt;Цепь пуста. Совершите действие — и появится первый блок.&lt;/div&gt;';return;}
list.innerHTML=c.slice().reverse().slice(0,30).map(function(b){
return '&lt;div class="sc-row"&gt;&lt;span class="sc-ic"&gt;'+(ICON[b.type]||'⛓')+'&lt;/span&gt;&lt;div class="sc-body"&gt;&lt;div class="sc-txt"&gt;'+(b.text||b.type)+'&lt;/div&gt;&lt;div class="sc-hash"&gt;#'+b.i+' · '+b.hash+' ← '+b.prev+'&lt;/div&gt;&lt;/div&gt;&lt;div class="sc-time"&gt;'+new Date(b.t).toLocaleTimeString([],{hour:'2-digit',minute:'2-digit'})+'&lt;/div&gt;&lt;/div&gt;';
}).join('');
}
$('#sc-btn').addEventListener('click',function(){$('#sc-mask').classList.add('open');render();});
$('#sc-close').addEventListener('click',function(){$('#sc-mask').classList.remove('open')});
$('#sc-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
if(window.MV&amp;&amp;window.MV.addBlock&amp;&amp;!window.MV._scPatched){var o=window.MV.addBlock;window.MV.addBlock=function(){var r=o.apply(this,arguments);if($('#sc-mask').classList.contains('open'))render();return r};window.MV._scPatched=1;}
render();
console.log('⛓ Цепь души подключена');
})();
&lt;/script&gt;
&lt;style&gt;
#mv3-pill{position:fixed;left:16px;bottom:140px;z-index:66;display:flex;align-items:center;gap:8px;background:rgba(20,14,44,.75);border:1px solid rgba(212,175,55,.5);border-radius:999px;padding:8px 14px;color:#f0d68a;font-weight:700;font-size:14px;cursor:pointer;backdrop-filter:blur(6px);box-shadow:0 0 14px rgba(212,175,55,.25);transition:transform .2s}
#mv3-pill:hover{transform:scale(1.06)}
@media(min-width:1000px){#mv3-pill{bottom:20px;left:70px}}
#mv3-box{display:none;position:fixed;inset:0;z-index:410;align-items:center;justify-content:center;background:rgba(10,7,25,.72);backdrop-filter:blur(4px)}
#mv3-box.open{display:flex}
#mv3-card{width:min(520px,92vw);max-height:84vh;overflow:auto;border-radius:18px;padding:22px;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(212,175,55,.4);color:#efe9dc;font-family:Inter,system-ui,sans-serif}
#mv3-card h3{color:#f0d68a;font-size:20px;margin-bottom:4px}
#mv3-sub{font-size:12px;color:#a79ec9;margin-bottom:14px}
.mv3-row{display:flex;justify-content:space-between;font-size:14px;padding:6px 0;border-bottom:1px dashed rgba(212,175,55,.2)}
.mv3-row b{color:#f0d68a}
.mv3-garden{font-size:56px;text-align:center;margin:14px 0 4px;filter:drop-shadow(0 0 18px rgba(212,175,55,.4))}
.mv3-stage{text-align:center;font-size:13px;color:#d9cfae;margin-bottom:12px}
.mv3-actions{display:flex;gap:8px;flex-wrap:wrap}
.mv3-actions button{flex:1;min-width:140px;background:rgba(212,175,55,.12);border:1px solid rgba(212,175,55,.4);color:#f0d68a;border-radius:10px;padding:10px;cursor:pointer;font-size:13px;font-weight:600}
.mv3-actions button:disabled{opacity:.4;cursor:not-allowed}
#mv3-tipbox{margin-top:12px;font-size:13px;line-height:1.5;color:#efe9dc;background:rgba(139,92,246,.1);border-left:3px solid var(--violet,#8B5CF6);padding:10px 12px;border-radius:0 8px 8px 0;display:none}
#mv3-close{margin-top:12px;width:100%;border:1px solid rgba(212,175,55,.4);background:none;color:#f0d68a;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="mv3-pill"&gt;✨ &lt;span id="mv3-val"&gt;0&lt;/span&gt;&lt;/button&gt;
&lt;div id="mv3-box"&gt;&lt;div id="mv3-card"&gt;
&lt;h3&gt;? Сад гармонии&lt;/h3&gt;
&lt;div id="mv3-sub"&gt;Валюта Метавселенной · растёт от практик и от времени&lt;/div&gt;
&lt;div class="mv3-row"&gt;&lt;span&gt;Гармония&lt;/span&gt;&lt;b id="mv3-h"&gt;0&lt;/b&gt;&lt;/div&gt;
&lt;div class="mv3-row"&gt;&lt;span&gt;Уровень Искателя&lt;/span&gt;&lt;b id="mv3-lvl"&gt;1&lt;/b&gt;&lt;/div&gt;
&lt;div class="mv3-garden" id="mv3-garden"&gt;?&lt;/div&gt;
&lt;div class="mv3-stage" id="mv3-stage"&gt;&lt;/div&gt;
&lt;div class="mv3-actions"&gt;
&lt;button id="mv3-fire"&gt;✨ Салют в саду (5 ✨)&lt;/button&gt;
&lt;button id="mv3-tip"&gt;? Подсказка дня (10 ✨)&lt;/button&gt;
&lt;/div&gt;
&lt;div id="mv3-tipbox"&gt;&lt;/div&gt;
&lt;button id="mv3-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
var H=g('mv_harmony',0),last=g('mv_last',Date.now());
/* офлайн-кап: +1 за 10 мин, максимум 48 */
var now=Date.now(),mins=Math.floor((now-last)/60000);
if(mins&gt;0){var gain=Math.min(48,Math.floor(mins/10));
if(gain&gt;0){H+=gain;setTimeout(function(){
if(window.Toast)Toast.show('Сад гармонии','С возвращением! Сад принёс +'+gain+' ✨','success');},800);}}
s('mv_last',now);s('mv_harmony',H);
function level(){return 1+Math.floor(H/50);}
window.MV=window.MV||{};
window.MV.harmony=function(){return H};
window.MV.level=level;
window.MV.addHarmony=function(n){H+=n;s('mv_harmony',H);s('mv_last',Date.now());render();};
window.MV.spend=function(n){if(H&gt;=n){H-=n;s('mv_harmony',H);render();return true}return false};
/* +1 гармония за каждое действие Ariadne */
if(window.B&amp;&amp;window.B.log&amp;&amp;!window.B._mv3){var o=window.B.log;window.B.log=function(k){o.call(this,k);window.MV.addHarmony(1);};window.B._mv3=1;}
/* +2 за приём препарата в Medilav */
['markTaken','markMedicationTaken'].forEach(function(fn){
if(typeof window[fn]==='function'&amp;&amp;!window[fn+'_mv3']){var f=window[fn];window[fn]=function(b){f(b);window.MV.addHarmony(2);};window[fn+'_mv3']=1;}
});
var STAGES=[[0,'?','Семя'],[25,'?','Росток'],[60,'?','Куст'],[120,'?','Цвет'],[250,'?','Древо'],[500,'?','Древо света ✨']];
function stage(){var st=STAGES[0];for(var i=0;i&lt;STAGES.length;i++){if(H&gt;=STAGES[i][0])st=STAGES[i];}return st;}
var TIPS=['Сегодня хорош день для завершения старого, а не старта нового.','Маленький шаг сегодня сильнее большого плана завтра.','Телу нужен ритм: сон, вода, свет. Начни с одного.','Скажи «нет» одному — и «да» станет ярче.','Заметь три хорошие вещи сегодня — это и есть магия.','Не сравнивай себя с другими — у тебя свой часовой пояс.','Сделай то, что откладывал три дня, — и дверь откроется.','Твоя интуиция права — проверь её фактами.'];
function render(){$('#mv3-val').textContent=H;$('#mv3-h').textContent=H;$('#mv3-lvl').textContent=level();
var st=stage();$('#mv3-garden').textContent=st[1];$('#mv3-stage').textContent=st[2]+' · до следующей стадии '+(nextGap())+' ✨';
$('#mv3-fire').disabled=H&lt;5;$('#mv3-tip').disabled=H&lt;10;}
function nextGap(){for(var i=0;i&lt;STAGES.length;i++){if(H&lt;STAGES[i][0])return STAGES[i][0]-H;}return 0;}
$('#mv3-pill').addEventListener('click',function(){$('#mv3-box').classList.add('open');render();});
$('#mv3-close').addEventListener('click',function(){$('#mv3-box').classList.remove('open');});
$('#mv3-box').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open');});
$('#mv3-fire').addEventListener('click',function(){if(window.MV.spend(5)){if(window.msBurst){var r=this.getBoundingClientRect();window.msBurst(innerWidth/2,innerHeight/2,['#f0d68a','#d4af37','#8B5CF6','#fff'],80,7);}if(window.Toast)Toast.show('Сад гармонии','Салют! −5 ✨','info');render();}});
$('#mv3-tip').addEventListener('click',function(){if(window.MV.spend(10)){var t=TIPS[Math.floor(Math.random()*TIPS.length)];var b=$('#mv3-tipbox');b.style.display='block';b.textContent='? '+t;if(window.Toast)Toast.show('Подсказка дня','−10 ✨','info');render();}});
render();
console.log('? Блок 3: Гармония + Сад гармонии подключены (уровень '+level()+')');
})();
&lt;/script&gt;
&lt;style&gt;
#mv3-pill{position:fixed;left:16px;bottom:140px;z-index:400;display:flex;align-items:center;gap:8px;padding:10px 18px;border-radius:999px;border:none;cursor:pointer;background:linear-gradient(135deg,#10B981,#0066FF);color:#fff;font-weight:700;font-size:14px;box-shadow:0 6px 20px rgba(16,185,129,.35);transition:transform .2s}
#mv3-pill:hover{transform:scale(1.06)}
@media(min-width:1000px){#mv3-pill{bottom:24px}}
#mv3-mask{position:fixed;inset:0;z-index:410;display:none;align-items:center;justify-content:center;background:rgba(10,7,25,.72);backdrop-filter:blur(4px)}
#mv3-mask.open{display:flex}
#mv3-card{width:min(480px,92vw);max-height:86vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(16,185,129,.4);box-shadow:0 30px 60px rgba(0,0,0,.5);font-family:Inter,system-ui,sans-serif}
#mv3-card h3{margin:0 0 4px;font-size:20px;color:#7ef0c0}
#mv3-sub{font-size:12px;color:#a79ec9;margin-bottom:14px}
.mv3-garden{font-size:72px;text-align:center;margin:6px 0;filter:drop-shadow(0 0 18px rgba(16,185,129,.5));animation:mv3bob 3s ease-in-out infinite}
@keyframes mv3bob{50%{transform:translateY(-6px)}}
.mv3-name{text-align:center;font-size:16px;font-weight:700;color:#7ef0c0;margin-bottom:10px}
.mv3-bar{height:10px;background:rgba(255,255,255,.1);border-radius:999px;overflow:hidden;margin:8px 0 6px}
.mv3-fill{height:100%;background:linear-gradient(90deg,#10B981,#0066FF);border-radius:999px;transition:width .5s}
.mv3-next{font-size:12px;color:#a79ec9;text-align:center;margin-bottom:12px}
.mv3-tips{font-size:12px;color:#cfc8e8;line-height:1.6;background:rgba(16,185,129,.08);border:1px solid rgba(16,185,129,.3);border-radius:10px;padding:10px 12px}
#mv3-close{margin-top:12px;width:100%;border:1px solid rgba(16,185,129,.4);background:none;color:#7ef0c0;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="mv3-pill" title="Сад гармонии"&gt;✨ &lt;span id="mv3-val"&gt;0&lt;/span&gt;&lt;/button&gt;
&lt;div id="mv3-mask"&gt;&lt;div id="mv3-card"&gt;
&lt;h3&gt;? Сад гармонии&lt;/h3&gt;
&lt;div id="mv3-sub"&gt;Твоя гармония растёт от практик и времени в мирах&lt;/div&gt;
&lt;div class="mv3-garden" id="mv3-emoji"&gt;?&lt;/div&gt;
&lt;div class="mv3-name" id="mv3-name"&gt;Семя&lt;/div&gt;
&lt;div class="mv3-bar"&gt;&lt;div class="mv3-fill" id="mv3-fill"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="mv3-next" id="mv3-next"&gt;&lt;/div&gt;
&lt;div class="mv3-tips"&gt;✨ Гармония капает за гадания, чекины, принятые препараты и просто за время в мирах. Чем больше гармонии — тем пышнее сад и выше уровень Метавселенной.&lt;/div&gt;
&lt;button id="mv3-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function harm(){if(window.MV&amp;&amp;window.MV.harmony)return window.MV.harmony();try{var v=localStorage.getItem('mv_harmony');return v?+v:0}catch(e){return 0}}
var STAGES=[[0,'?','Семя'],[20,'?','Росток'],[50,'?','Цветок'],[100,'?','Дерево'],[200,'?️','Сады гармонии']];
function stage(h){var s=STAGES[0];for(var i=0;i&lt;STAGES.length;i++){if(h&gt;=STAGES[i][0])s=STAGES[i];}return s}
function next(h){for(var i=0;i&lt;STAGES.length;i++){if(h&lt;STAGES[i][0])return STAGES[i];}return null}
function render(){
var h=harm();
var pv=$('#mv3-val');if(pv)pv.textContent=h;
var st=stage(h),nx=next(h);
var e=$('#mv3-emoji');if(e)e.textContent=st[1];
var n=$('#mv3-name');if(n)n.textContent=st[2];
var f=$('#mv3-fill'),nxEl=$('#mv3-next');
if(nx){var p=Math.max(0,Math.min(1,(h-st[0])/(nx[0]-st[0])));if(f)f.style.width=(p*100)+'%';if(nxEl)nxEl.textContent='До «'+nx[2]+'»: ещё '+(nx[0]-h)+' ✨';}
else{if(f)f.style.width='100%';if(nxEl)nxEl.textContent='Максимальная стадия ?';}
}
var pill=$('#mv3-pill');
if(pill)pill.addEventListener('click',function(){$('#mv3-mask').classList.add('open');render();});
var close=$('#mv3-close');if(close)close.addEventListener('click',function(){$('#mv3-mask').classList.remove('open')});
var mask=$('#mv3-mask');if(mask)mask.addEventListener('click',function(e){if(e.target===mask)mask.classList.remove('open')});
render();
setInterval(render,3000);
console.log('? Блок 3: виджет Гармонии + Сад гармонии подключён');
})();
&lt;/script&gt;

&lt;script&gt;
(function(){
"use strict";
/* 1) Убираем слитый текст кода («абракадабру») */
(function(){
  var w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT,{acceptNode:function(n){
    var p=n.parentNode;
    if(p&amp;&amp;(p.nodeName==='SCRIPT'||p.nodeName==='STYLE'))return NodeFilter.FILTER_REJECT;
    return NodeFilter.FILTER_ACCEPT;}});
  var rm=[];
  while(w.nextNode()){var v=w.currentNode.nodeValue||'';
    if(/\(function\(|"use strict"|var \$=function/.test(v))rm.push(w.currentNode);}
  rm.forEach(function(n){if(n.parentNode)n.parentNode.removeChild(n);});
})();
/* 2) Кнопка ✦ Паспорт Искателя (если её нет) */
if(!document.getElementById('mv-btn')){
  var st=document.createElement('style');
  st.textContent='#mv-btn{position:fixed;right:16px;bottom:140px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#D4AF37,#8B5CF6);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(139,92,246,.45)}@media(min-width:1000px){#mv-btn{bottom:24px}}#mv-mask{position:fixed;inset:0;z-index:410;display:none;align-items:center;justify-content:center;background:rgba(10,7,25,.72)}#mv-mask.open{display:flex}#mv-card{width:min(560px,92vw);max-height:86vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(212,175,55,.4)}#mv-card h3{margin:0 0 4px;font-size:20px;color:#f0d68a}.mv-lvl{display:flex;align-items:center;gap:14px;background:rgba(212,175,55,.12);border:1px solid rgba(212,175,55,.4);border-radius:14px;padding:12px 16px;margin:14px 0}.mv-lvl b{font-size:34px;color:#f0d68a}.mv-world{border:1px solid rgba(139,92,246,.35);border-radius:14px;padding:14px;margin-bottom:10px}.mv-row{display:flex;justify-content:space-between;font-size:13px;padding:3px 0;color:#cfc8e8}.mv-row b{color:#efe9dc}#mv-close{margin-top:6px;width:100%;border:1px solid rgba(212,175,55,.4);background:none;color:#f0d68a;border-radius:10px;padding:10px;cursor:pointer}';
  document.head.appendChild(st);
  var b=document.createElement('button');b.id='mv-btn';b.title='Метавселенная · Паспорт Искателя';b.textContent='✦';
  var mk=document.createElement('div');mk.id='mv-mask';mk.innerHTML='&lt;div id="mv-card"&gt;&lt;/div&gt;';
  document.body.appendChild(b);document.body.appendChild(mk);
  function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
  b.addEventListener('click',function(){
    var here=document.getElementById('ariadne-app')?'ariadne':(document.getElementById('tabBar')||document.querySelector('.app-shell'))?'medilav':'?';
    var A=g('ariadne5',{})||{},S=A.s||{};
    var div=(+A.tarot||0)+(+A.dreams||0)+(+A.cards||0)+(+A.coffee||0)+(+A.runes||0)+(+A.wheel||0);
    var ach=Object.keys(g('ariadne_ach',{})).length, dreams=(g('ariadne_dreams',[])).length;
    var taken=(g('medilav_taken',[])).length, meds=(g('medilav_customMeds',[])).length;
    var P=g('pt_state_v1',{})||{}, pdc=Math.round(+P.pdc||0), lvl=+P.level||1;
    var pts=div*5+dreams*10+ach*40+taken*5+meds*10+Math.floor(pdc/100)+lvl*20;
    var mvLvl=1+Math.floor(pts/100);
    function world(t,rows){var h='&lt;div class="mv-world"&gt;&lt;b&gt;'+t+'&lt;/b&gt;';rows.forEach(function(r){h+='&lt;div class="mv-row"&gt;&lt;span&gt;'+r[0]+'&lt;/span&gt;&lt;b&gt;'+r[1]+'&lt;/b&gt;&lt;/div&gt;'});return h+'&lt;/div&gt;';}
    document.getElementById('mv-card').innerHTML='&lt;h3&gt;✦ Паспорт Искателя&lt;/h3&gt;'+
      '&lt;div class="mv-lvl"&gt;&lt;b&gt;'+mvLvl+'&lt;/b&gt;&lt;span&gt;Уровень Метавселенной&lt;br&gt;Индекс: '+pts+'&lt;/span&gt;&lt;/div&gt;'+
      world('? Душа · Ariadne',[['Гармония',(S.harm!=null?S.harm:'—')+'%'],['Гаданий',div],['Снов',dreams],['Достижений',ach]])+
      world('❤️ Тело · Medilav',[['Препаратов принято',taken],['Своих препаратов',meds]])+
      world('? Империя · PANDO',[['PDC',pdc],['Уровень',lvl]])+
      '&lt;button id="mv-close"&gt;Закрыть&lt;/button&gt;';
    mk.classList.add('open');
    document.getElementById('mv-close').onclick=function(){mk.classList.remove('open')};
  });
  mk.addEventListener('click',function(e){if(e.target===mk)mk.classList.remove('open')});
}
console.log('✅ Заплатка №1: очистка + Паспорт Искателя');
})();
&lt;/script&gt;
&lt;style&gt;
#sc-btn{position:fixed;right:16px;bottom:200px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#8B5CF6,#0066FF);color:#fff;font-size:20px;box-shadow:0 6px 20px rgba(0,102,255,.45);transition:transform .2s}
#sc-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#sc-btn{bottom:24px;right:76px}}
#sc-mask{position:fixed;inset:0;z-index:410;display:none;align-items:center;justify-content:center;background:rgba(10,7,25,.72);backdrop-filter:blur(4px)}
#sc-mask.open{display:flex}
#sc-card{width:min(560px,92vw);max-height:86vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#101828,#0b1220);border:1px solid rgba(0,102,255,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.5)}
#sc-card h3{margin:0 0 4px;font-size:20px;color:#9ecbff}
#sc-sub{font-size:12px;color:#8aa0c0;margin-bottom:14px}
.sc-stats{display:flex;gap:10px;margin-bottom:14px}
.sc-stat{flex:1;background:rgba(0,102,255,.1);border:1px solid rgba(0,102,255,.35);border-radius:12px;padding:10px;text-align:center}
.sc-stat b{display:block;font-size:22px;color:#9ecbff}
.sc-stat span{font-size:10px;color:#8aa0c0;text-transform:uppercase;letter-spacing:1px}
.sc-row{display:flex;gap:10px;align-items:flex-start;background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.3);border-radius:12px;padding:10px;margin-bottom:8px}
.sc-ic{font-size:20px;line-height:1}
.sc-body{flex:1;min-width:0}
.sc-txt{font-size:13px;color:#efe9dc}
.sc-hash{font-family:monospace;font-size:10px;color:#7a8aa8;margin-top:2px;word-break:break-all}
.sc-time{font-size:10px;color:#7a8aa8;white-space:nowrap}
.sc-empty{color:#8aa0c0;font-style:italic;font-size:13px;padding:12px;text-align:center}
.sc-actions{display:flex;gap:8px;margin-top:12px}
.sc-actions button{flex:1;border:1px solid rgba(0,102,255,.4);background:none;color:#9ecbff;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
#sc-close{margin-top:8px;width:100%;border:1px solid rgba(0,102,255,.4);background:none;color:#9ecbff;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
.sc-ok{color:#3DDC84;font-size:11px;margin-top:8px;text-align:center}
&lt;/style&gt;
&lt;button id="sc-btn" title="Цепь души"&gt;⛓&lt;/button&gt;
&lt;div id="sc-mask"&gt;&lt;div id="sc-card"&gt;
&lt;h3&gt;⛓ Цепь души&lt;/h3&gt;
&lt;div id="sc-sub"&gt;Метавселенная · цепь ваших действий&lt;/div&gt;
&lt;div class="sc-stats"&gt;
&lt;div class="sc-stat"&gt;&lt;b id="sc-lvl"&gt;1&lt;/b&gt;&lt;span&gt;Уровень&lt;/span&gt;&lt;/div&gt;
&lt;div class="sc-stat"&gt;&lt;b id="sc-harm"&gt;0&lt;/b&gt;&lt;span&gt;Гармония&lt;/span&gt;&lt;/div&gt;
&lt;div class="sc-stat"&gt;&lt;b id="sc-count"&gt;0&lt;/b&gt;&lt;span&gt;Блоков&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id="sc-list"&gt;&lt;/div&gt;
&lt;div class="sc-actions"&gt;
&lt;button id="sc-intent"&gt;✍ Записать намерение&lt;/button&gt;
&lt;button id="sc-verify"&gt;? Проверить цепь&lt;/button&gt;
&lt;/div&gt;
&lt;div class="sc-ok" id="sc-ok"&gt;&lt;/div&gt;
&lt;button id="sc-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function getChain(){if(window.MV&amp;&amp;window.MV.chain)return window.MV.chain();try{return JSON.parse(localStorage.getItem('mv_chain'))||[]}catch(e){return[]}}
function getHarm(){if(window.MV&amp;&amp;window.MV.harmony)return window.MV.harmony();try{return +localStorage.getItem('mv_harmony')||0}catch(e){return 0}}
function getLvl(){if(window.MV&amp;&amp;window.MV.level)return window.MV.level();return 1+Math.floor(getChain().length/10)+Math.floor(getHarm()/50)}
var ICON={tarot:'?',dream:'?',rune:'ᚠ',wheel:'?',coffee:'☕',cards:'?',med:'?',vital:'❤️',amulet:'?️',signal:'?',intention:'✍',daily:'✨',block:'⛓'};
function render(){
var c=getChain();
$('#sc-lvl').textContent=getLvl();
$('#sc-harm').textContent=getHarm();
$('#sc-count').textContent=c.length;
var list=$('#sc-list');
if(!c.length){list.innerHTML='&lt;div class="sc-empty"&gt;Цепь пуста. Совершите действие — и появится первый блок.&lt;/div&gt;';return;}
list.innerHTML=c.slice().reverse().slice(0,30).map(function(b){
return '&lt;div class="sc-row"&gt;&lt;span class="sc-ic"&gt;'+(ICON[b.type]||'⛓')+'&lt;/span&gt;&lt;div class="sc-body"&gt;&lt;div class="sc-txt"&gt;'+(b.text||b.type)+'&lt;/div&gt;&lt;div class="sc-hash"&gt;#'+b.i+' · '+b.hash+' ← '+b.prev+'&lt;/div&gt;&lt;/div&gt;&lt;div class="sc-time"&gt;'+new Date(b.t).toLocaleTimeString([],{hour:'2-digit',minute:'2-digit'})+'&lt;/div&gt;&lt;/div&gt;';
}).join('');
}
/* хуки: действия чеканят блоки */
var HOOKS=[
['#dealbtn','tarot','Сделан расклад Таро'],
['#drawRune','rune','Вытянута руна'],
['#spinWheel','wheel','Крутануто колесо'],
['#cupContainer','coffee','Кофейная гуща'],
['#dealCards','cards','Разложены карты'],
['#ddSave','dream','Записан сон'],
['#numCalc','numerology','Рассчитано число'],
['#shadowBtn','shadows','Тень увидена'],
['.med-item__check','med','Препарат принят'],
['.medication__card .btn--primary','med','Препарат принят']
];
document.addEventListener('click',function(e){
for(var i=0;i&lt;HOOKS.length;i++){
var el=e.target.closest?e.target.closest(HOOKS[i][0]):null;
if(el){if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock(HOOKS[i][1],HOOKS[i][2]);break;}
}
});
$('#sc-btn').addEventListener('click',function(){$('#sc-mask').classList.add('open');render();});
$('#sc-close').addEventListener('click',function(){$('#sc-mask').classList.remove('open')});
$('#sc-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
$('#sc-intent').addEventListener('click',function(){
var t=prompt('Запишите намерение (оно станет блоком в цепи):');
if(!t)return;
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('intention',t);
render();
});
$('#sc-verify').addEventListener('click',function(){
var c=getChain();var ok=true;
for(var i=1;i&lt;c.length;i++){if(c[i].prev!==c[i-1].hash){ok=false;break}}
$('#sc-ok').textContent=c.length&lt;2?'Пока мало блоков.':(ok?'✓ Цепь целостна: каждый блок ссылается на предыдущий.':'⚠ Цепь нарушена!');
});
render();
console.log('⛓ Цепь души подключена');
})();
&lt;/script&gt;
&lt;style&gt;
#mv3-pill{position:fixed;left:16px;bottom:140px;z-index:400;display:flex;align-items:center;gap:8px;padding:10px 18px;border-radius:999px;border:none;cursor:pointer;background:linear-gradient(135deg,#10B981,#0066FF);color:#fff;font-weight:700;font-size:14px;box-shadow:0 6px 20px rgba(16,185,129,.35);transition:transform .2s}
#mv3-pill:hover{transform:scale(1.06)}
@media(min-width:1000px){#mv3-pill{bottom:24px}}
#mv3-mask{position:fixed;inset:0;z-index:410;display:none;align-items:center;justify-content:center;background:rgba(10,7,25,.72);backdrop-filter:blur(4px)}
#mv3-mask.open{display:flex}
#mv3-card{width:min(480px,92vw);max-height:86vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(16,185,129,.4);box-shadow:0 30px 60px rgba(0,0,0,.5);font-family:Inter,system-ui,sans-serif}
#mv3-card h3{margin:0 0 4px;font-size:20px;color:#7ef0c0}
#mv3-sub{font-size:12px;color:#a79ec9;margin-bottom:14px}
.mv3-garden{font-size:72px;text-align:center;margin:6px 0;filter:drop-shadow(0 0 18px rgba(16,185,129,.5));animation:mv3bob 3s ease-in-out infinite}
@keyframes mv3bob{50%{transform:translateY(-6px)}}
.mv3-name{text-align:center;font-size:16px;font-weight:700;color:#7ef0c0;margin-bottom:10px}
.mv3-bar{height:10px;background:rgba(255,255,255,.1);border-radius:999px;overflow:hidden;margin:8px 0 6px}
.mv3-fill{height:100%;background:linear-gradient(90deg,#10B981,#0066FF);border-radius:999px;transition:width .5s}
.mv3-next{font-size:12px;color:#a79ec9;text-align:center;margin-bottom:12px}
.mv3-actions{display:flex;gap:8px;flex-wrap:wrap}
.mv3-actions button{flex:1;min-width:140px;background:rgba(16,185,129,.12);border:1px solid rgba(16,185,129,.4);color:#7ef0c0;border-radius:10px;padding:10px;cursor:pointer;font-size:13px;font-weight:600}
.mv3-actions button:disabled{opacity:.4;cursor:not-allowed}
#mv3-tipbox{margin-top:12px;font-size:13px;line-height:1.5;color:#efe9dc;background:rgba(139,92,246,.1);border-left:3px solid #8B5CF6;padding:10px 12px;border-radius:0 8px 8px 0;display:none}
#mv3-close{margin-top:12px;width:100%;border:1px solid rgba(16,185,129,.4);background:none;color:#7ef0c0;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="mv3-pill" title="Сад гармонии"&gt;✨ &lt;span id="mv3-val"&gt;0&lt;/span&gt;&lt;/button&gt;
&lt;div id="mv3-mask"&gt;&lt;div id="mv3-card"&gt;
&lt;h3&gt;? Сад гармонии&lt;/h3&gt;
&lt;div id="mv3-sub"&gt;Гармония растёт от практик и времени в мирах&lt;/div&gt;
&lt;div class="mv3-garden" id="mv3-emoji"&gt;?&lt;/div&gt;
&lt;div class="mv3-name" id="mv3-name"&gt;Семя&lt;/div&gt;
&lt;div class="mv3-bar"&gt;&lt;div class="mv3-fill" id="mv3-fill"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="mv3-next" id="mv3-next"&gt;&lt;/div&gt;
&lt;div class="mv3-actions"&gt;
&lt;button id="mv3-fire"&gt;✨ Салют в саду (5 ✨)&lt;/button&gt;
&lt;button id="mv3-tip"&gt;? Подсказка дня (10 ✨)&lt;/button&gt;
&lt;/div&gt;
&lt;div id="mv3-tipbox"&gt;&lt;/div&gt;
&lt;button id="mv3-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
var H=g('mv_harmony',0),last=g('mv_last',Date.now());
/* офлайн-кап: +1 за 10 мин, максимум 48 */
var now=Date.now(),mins=Math.floor((now-last)/60000);
if(mins&gt;0){var gain=Math.min(48,Math.floor(mins/10));if(gain&gt;0)H+=gain;}
s('mv_last',now);s('mv_harmony',H);
function level(){return 1+Math.floor(H/50);}
window.MV=window.MV||{};
window.MV.harmony=function(){return H};
window.MV.level=level;
window.MV.addHarmony=function(n){H+=n;s('mv_harmony',H);s('mv_last',Date.now());render();};
window.MV.spend=function(n){if(H&gt;=n){H-=n;s('mv_harmony',H);render();return true}return false};
/* +1 гармония за каждое действие Ariadne */
if(window.B&amp;&amp;window.B.log&amp;&amp;!window.B._mv3){var o=window.B.log;window.B.log=function(k){o.call(this,k);window.MV.addHarmony(1);};window.B._mv3=1;}
/* +2 за приём препарата в Medilav */
['markTaken','markMedicationTaken'].forEach(function(fn){
if(typeof window[fn]==='function'&amp;&amp;!window[fn+'_mv3']){var f=window[fn];window[fn]=function(b){f(b);window.MV.addHarmony(2);};window[fn+'_mv3']=1;}
});
var STAGES=[[0,'?','Семя'],[20,'?','Росток'],[50,'?','Цветок'],[100,'?','Дерево'],[200,'✨','Сады гармонии']];
function stage(h){var st=STAGES[0];for(var i=0;i&lt;STAGES.length;i++){if(h&gt;=STAGES[i][0])st=STAGES[i];}return st}
function next(h){for(var i=0;i&lt;STAGES.length;i++){if(h&lt;STAGES[i][0])return STAGES[i];}return null}
var TIPS=['Сегодня хорош день для завершения старого, а не старта нового.','Маленький шаг сегодня сильнее большого плана завтра.','Телу нужен ритм: сон, вода, свет. Начни с одного.','Скажи «нет» одному — и «да» станет ярче.','Заметь три хорошие вещи сегодня — это и есть магия.','Не сравнивай себя с другими — у тебя свой часовой пояс.','Сделай то, что откладывал три дня, — и дверь откроется.','Твоя интуиция права — проверь её фактами.'];
function render(){
$('#mv3-val').textContent=H;
var st=stage(H),nx=next(H);
$('#mv3-emoji').textContent=st[1];$('#mv3-name').textContent=st[2];
if(nx){$('#mv3-fill').style.width=Math.max(0,Math.min(1,(H-st[0])/(nx[0]-st[0]))*100)+'%';$('#mv3-next').textContent='До «'+nx[2]+'»: ещё '+(nx[0]-H)+' ✨';}
else{$('#mv3-fill').style.width='100%';$('#mv3-next').textContent='Максимальная стадия ?';}
$('#mv3-fire').disabled=H&lt;5;$('#mv3-tip').disabled=H&lt;10;
}
$('#mv3-pill').addEventListener('click',function(){$('#mv3-mask').classList.add('open');render();});
$('#mv3-close').addEventListener('click',function(){$('#mv3-mask').classList.remove('open');});
$('#mv3-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open');});
$('#mv3-fire').addEventListener('click',function(){if(window.MV.spend(5)){if(window.msBurst)window.msBurst(innerWidth/2,innerHeight/2,['#7ef0c0','#10B981','#8B5CF6','#fff'],80,7);if(window.Toast)Toast.show('Сад гармонии','Салют! −5 ✨','info');render();}});
$('#mv3-tip').addEventListener('click',function(){if(window.MV.spend(10)){var t=TIPS[Math.floor(Math.random()*TIPS.length)];var b=$('#mv3-tipbox');b.style.display='block';b.textContent='? '+t;if(window.Toast)Toast.show('Подсказка дня','−10 ✨','info');render();}});
render();
console.log('? Блок 3: Гармония + Сад гармонии подключены (уровень '+level()+')');
})();
&lt;/script&gt;
&lt;style&gt;
#mv5-btn{position:fixed;right:76px;bottom:140px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#D4AF37,#8B5CF6);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(212,175,55,.45);transition:transform .2s}
#mv5-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#mv5-btn{bottom:24px}}
#mv5-mask{position:fixed;inset:0;z-index:410;display:none;align-items:center;justify-content:center;background:rgba(10,7,25,.72);backdrop-filter:blur(4px)}
#mv5-mask.open{display:flex}
#mv5-card{width:min(560px,92vw);max-height:86vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(212,175,55,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.5)}
#mv5-card h3{margin:0 0 4px;font-size:20px;color:#f0d68a}
#mv5-sub{font-size:12px;color:#a79ec9;margin-bottom:14px}
#mv5-intent{width:100%;padding:12px;border-radius:10px;border:1px solid rgba(212,175,55,.4);background:rgba(36,26,82,.4);color:#efe9dc;font-size:14px;margin-bottom:10px}
#mv5-intent:focus{outline:none;border-color:#D4AF37;box-shadow:0 0 0 3px rgba(212,175,55,.15)}
#mv5-forge{width:100%;padding:12px;border:none;border-radius:10px;background:linear-gradient(135deg,#D4AF37,#F5B301);color:#0d0a1c;font-weight:800;font-size:14px;cursor:pointer}
#mv5-forge:hover{box-shadow:0 8px 24px rgba(212,175,55,.4)}
.mv5-note{font-size:11px;color:#a79ec9;margin-top:8px;text-align:center}
.mv5-list{display:flex;flex-direction:column;gap:10px;margin-top:14px}
.mv5-amulet{border:2px solid rgba(212,175,55,.5);border-radius:12px;padding:14px;background:radial-gradient(circle at 50% 20%,rgba(212,175,55,.12),rgba(20,14,44,.6));text-align:center;box-shadow:0 0 18px rgba(212,175,55,.25)}
.mv5-sym{font-size:40px;color:#f0d68a;text-shadow:0 0 18px rgba(240,214,138,.8)}
.mv5-rname{font-size:13px;font-weight:700;color:#f0d68a;margin-top:2px}
.mv5-intent2{font-size:12px;color:#cfc8e8;margin-top:4px;font-style:italic}
.mv5-hash{font-family:monospace;font-size:10px;color:#8a84a8;margin-top:6px;word-break:break-all}
#mv5-close{margin-top:12px;width:100%;border:1px solid rgba(212,175,55,.4);background:none;color:#f0d68a;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="mv5-btn" title="Оберег"&gt;?&lt;/button&gt;
&lt;div id="mv5-mask"&gt;&lt;div id="mv5-card"&gt;
&lt;h3&gt;? Оберег&lt;/h3&gt;
&lt;div id="mv5-sub"&gt;Выкуй персональный оберег: намерение → хеш → руна защиты&lt;/div&gt;
&lt;input id="mv5-intent" placeholder="Впиши своё намерение (напр. «спокойствие и защита»)" maxlength="80" /&gt;
&lt;button id="mv5-forge"&gt;⚒ Выковать оберег&lt;/button&gt;
&lt;div class="mv5-note"&gt;Первый оберег — бесплатно. Следующие — 5 ✨ Гармонии.&lt;/div&gt;
&lt;div class="mv5-list" id="mv5-list"&gt;&lt;/div&gt;
&lt;button id="mv5-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function lsGet(k,d){try{var v=localStorage.getItem(k);return v?JSON.parse(v):d}catch(e){return d}}
function lsSet(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function hashFn(s){
if(window.MV&amp;&amp;window.MV.hash)return window.MV.hash(s);
var h=0x811c9dc5;for(var i=0;i&lt;s.length;i++){h^=s.charCodeAt(i);h=Math.imul(h,0x01000193)}
var x=('0000000'+(h&gt;&gt;&gt;0).toString(16)).slice(-8);return (x+x+x+x).slice(0,40);
}
var RUNES=[['ᛉ','Альгиз','защита и щит'],['ᛊ','Совило','победа, солнце'],['ᚹ','Вуньо','радость'],['ᛗ','Манназ','поддержка людей'],['ᛞ','Дагаз','прорыв, ясность'],['ᛚ','Лагуз','интуиция'],['ᚠ','Феху','достаток'],['ᛒ','Беркана','рост']];
function toast(t,m){if(window.Toast&amp;&amp;Toast.show){Toast.show(t,m,'success');}}
function render(){
var list=$('#mv5-list');var am=lsGet('mv_amulets',[]);
if(!am.length){list.innerHTML='&lt;div class="mv5-note"&gt;Пока пусто. Выкуй первый оберег — он бесплатный.&lt;/div&gt;';return;}
list.innerHTML=am.slice().reverse().map(function(a){
return '&lt;div class="mv5-amulet"&gt;&lt;div class="mv5-sym"&gt;'+a.sym[0]+'&lt;/div&gt;&lt;div class="mv5-rname"&gt;'+a.sym[1]+' · '+a.sym[2]+'&lt;/div&gt;'+
'&lt;div class="mv5-intent2"&gt;«'+a.intent+'»&lt;/div&gt;&lt;div class="mv5-hash"&gt;#'+a.i+' · '+a.hash+' · '+a.d+'&lt;/div&gt;&lt;/div&gt;';
}).join('');
}
$('#mv5-btn').addEventListener('click',function(){$('#mv5-mask').classList.add('open');render();});
$('#mv5-close').addEventListener('click',function(){$('#mv5-mask').classList.remove('open')});
$('#mv5-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
$('#mv5-forge').addEventListener('click',function(){
var intent=$('#mv5-intent').value.trim();
if(!intent){toast('Оберег','Впиши намерение');return;}
var am=lsGet('mv_amulets',[]);
var cost=am.length===0?0:5;
if(cost&gt;0){
var have=(window.MV&amp;&amp;window.MV.harmony)?window.MV.harmony():0;
if(have&lt;cost){toast('Оберег','Нужно 5 ✨ Гармонии (сейчас '+have+')');return;}
if(window.MV&amp;&amp;window.MV.spend)window.MV.spend(cost);
}
var h=hashFn(intent+'|'+Date.now());
var sym=RUNES[parseInt(h.slice(0,4),16)%RUNES.length];
am.push({i:am.length,intent:intent,hash:h,sym:sym,d:new Date().toLocaleDateString('ru-RU')});
lsSet('mv_amulets',am);
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('amulet','Оберег: '+intent);
$('#mv5-intent').value='';
render();
toast('Оберег выкован',cost===0?'Первый оберег — бесплатно!':'−5 ✨ Гармонии');
});
render();
console.log('? Блок 5: Оберег подключён');
})();
&lt;/script&gt;
&lt;style&gt;
.am-form{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:10px}
.am-form input{flex:1;min-width:180px;padding:11px 14px;border:1px solid var(--gray-300);border-radius:10px;font-size:14px}
.am-form input:focus{outline:none;border-color:var(--gold);box-shadow:0 0 0 3px rgba(212,175,55,.15)}
.am-note{font-size:11px;color:var(--gray-500);margin-bottom:14px}
.am-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px}
.am-card{border:2px solid var(--gold);border-radius:14px;padding:16px 12px;text-align:center;background:radial-gradient(circle at 50% 20%,#2e2658,#14102e 75%);color:#f0d68a;box-shadow:0 0 20px rgba(212,175,55,.25);transition:.25s}
.am-card:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 0 30px rgba(212,175,55,.45)}
.am-sym{font-size:40px;text-shadow:0 0 18px rgba(240,214,138,.8)}
.am-name{font-family:var(--disp);font-size:15px;font-style:italic;margin:6px 0 2px}
.am-int{font-size:11px;color:#cfc8e8;line-height:1.4;min-height:30px}
.am-hash{font-family:monospace;font-size:9px;color:#8a84a8;margin-top:6px;word-break:break-all}
.am-empty{grid-column:1/-1;text-align:center;color:var(--gray-500);font-style:italic;padding:20px}
&lt;/style&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function lsGet(k,d){try{var v=localStorage.getItem(k);return v?JSON.parse(v):d}catch(e){return d}}
function lsSet(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function hash(s){var h=0x811c9dc5;for(var i=0;i&lt;s.length;i++){h^=s.charCodeAt(i);h=Math.imul(h,0x01000193)}var x=('0000000'+(h&gt;&gt;&gt;0).toString(16)).slice(-8);return (x+x+x+x+x).slice(0,40)}
var RUNES=[['ᚠ','Феху','богатство'],['ᚢ','Уруз','сила'],['ᚨ','Ансуз','мудрость'],['ᚱ','Райдо','путь'],['ᚲ','Кеназ','творчество'],['ᚷ','Гебо','дар'],['ᚹ','Вуньо','радость'],['ᛉ','Альгиз','защита'],['ᛊ','Совило','победа'],['ᛚ','Лагуз','интуиция'],['ᛏ','Тейваз','смелость'],['ᛒ','Беркана','рост'],['ᛗ','Манназ','союз'],['ᛞ','Дагаз','прорыв']];
var COST=5;
function amulets(){return lsGet('mv_amulets',[])}
function spend(n){
if(window.MV&amp;&amp;window.MV.spend)return window.MV.spend(n);
var h=lsGet('mv_harmony',0);if(h&gt;=n){lsSet('mv_harmony',h-n);return true}return false;
}
function forge(intent){
var list=amulets();var free=list.length===0;
if(!free&amp;&amp;!spend(COST)){if(window.Toast)Toast.show('Оберег','Нужно '+COST+' ✨ гармонии. Сначала действуй в салонах.','warning');return null}
var r=RUNES[Math.floor(Math.random()*RUNES.length)];
var prev=list.length?list[list.length-1].hash:hash('genesis');
var a={i:list.length,intent:intent,rune:r[0],name:r[1],mean:r[2],hash:hash(prev+intent+Date.now()),prev:prev,t:Date.now()};
list.push(a);lsSet('mv_amulets',list);
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('amulet','Оберег: '+intent,0);
return a;
}
function render(){
var grid=$('#amGrid');if(!grid)return;
var list=amulets();
if(!list.length){grid.innerHTML='&lt;div class="am-empty"&gt;Пока пусто. Выкуй первый оберег — он бесплатный.&lt;/div&gt;';return}
grid.innerHTML=list.slice().reverse().map(function(a){
return '&lt;div class="am-card"&gt;&lt;div class="am-sym"&gt;'+a.rune+'&lt;/div&gt;&lt;div class="am-name"&gt;'+a.name+' · '+a.mean+'&lt;/div&gt;&lt;div class="am-int"&gt;«'+a.intent+'»&lt;/div&gt;&lt;div class="am-hash"&gt;#'+a.i+' · '+a.hash.slice(0,18)+'…&lt;/div&gt;&lt;/div&gt;';
}).join('');
}
/* секция + пункт меню */
var main=document.querySelector('#ariadne-app .a-main'),footer=document.querySelector('#ariadne-app footer.a-footer');
if(main&amp;&amp;footer&amp;&amp;!$('#amuletSec')){
var sec=document.createElement('section');sec.id='amuletSec';sec.className='a-section';
sec.innerHTML='&lt;h2 class="a-sec-title"&gt;? Оберег&lt;/h2&gt;'+
'&lt;div class="a-sec-sub"&gt;Персональный блокчейн-оберег: намерение → хеш → руна защиты&lt;/div&gt;'+
'&lt;div class="a-widget"&gt;&lt;div class="a-widget-head"&gt;&lt;div class="a-widget-icon ic-gold"&gt;&lt;i class="fas fa-shield-halved"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="a-widget-title"&gt;Выковать оберег&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="am-form"&gt;&lt;input id="amIntent" placeholder="Намерение: напр. «защита в дороге»"&gt;&lt;button class="a-btn a-btn-gold" id="amForge"&gt;&lt;i class="fas fa-hammer"&gt;&lt;/i&gt; Выковать&lt;/button&gt;&lt;/div&gt;'+
'&lt;div class="am-note"&gt;Первый оберег бесплатно. Далее — '+COST+' ✨ гармонии за оберег.&lt;/div&gt;'+
'&lt;div class="am-grid" id="amGrid"&gt;&lt;/div&gt;&lt;/div&gt;';
main.insertBefore(sec,footer);
var sos=document.querySelector('#ariadne-app .a-nav-item[data-section="sos"]');
if(sos){var nb=document.createElement('button');nb.className='a-nav-item';nb.dataset.section='amuletSec';
nb.innerHTML='&lt;i class="fas fa-shield-halved"&gt;&lt;/i&gt;&lt;span&gt;Оберег&lt;/span&gt;';
nb.addEventListener('click',function(){if(window.go)go('amuletSec')});sos.parentNode.insertBefore(nb,sos);}
}
$('#amForge').addEventListener('click',function(){
var t=$('#amIntent').value.trim();
if(!t){if(window.Toast)Toast.show('Оберег','Впиши намерение','warning');return}
var a=forge(t);
if(a){$('#amIntent').value='';render();
if(window.Toast)Toast.show('Оберег выкован',a.rune+' '+a.name+' — '+a.mean,'success');}
});
render();
console.log('? Блок 4: Оберег = блок подключён');
})();
&lt;/script&gt;
&lt;style&gt;
#mv4-btn{position:fixed;right:16px;bottom:200px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#10B981,#D4AF37);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(212,175,55,.4);transition:transform .2s}
#mv4-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#mv4-btn{bottom:24px;right:76px}}
#mv4-mask{position:fixed;inset:0;z-index:410;display:none;align-items:center;justify-content:center;background:rgba(10,7,25,.72);backdrop-filter:blur(4px)}
#mv4-mask.open{display:flex}
#mv4-card{width:min(560px,92vw);max-height:86vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(212,175,55,.4);box-shadow:0 30px 60px rgba(0,0,0,.5)}
#mv4-card h3{margin:0 0 4px;font-size:20px;color:#f0d68a}
.mv4-sub{font-size:12px;color:#a79ec9;margin-bottom:14px}
.mv4-form{display:flex;gap:8px;margin-bottom:10px}
.mv4-form input{flex:1;padding:11px 14px;border-radius:10px;border:1px solid rgba(212,175,55,.4);background:rgba(36,26,82,.4);color:#efe9dc;font-size:14px}
.mv4-form input:focus{outline:none;border-color:#D4AF37}
.mv4-forge{padding:11px 16px;border:none;border-radius:10px;background:linear-gradient(135deg,#D4AF37,#F5B301);color:#0d0a1c;font-weight:800;cursor:pointer}
.mv4-note{font-size:11px;color:#a79ec9;margin-bottom:12px}
.mv4-list{display:flex;flex-direction:column;gap:10px}
.mv4-amulet{display:flex;gap:12px;align-items:center;border:1px solid rgba(212,175,55,.4);border-radius:12px;padding:12px;background:rgba(212,175,55,.08)}
.mv4-rune{font-size:30px;color:#f0d68a;text-shadow:0 0 14px rgba(240,214,138,.7)}
.mv4-info{flex:1}
.mv4-name{font-weight:700;font-size:13px}
.mv4-intent{font-size:12px;color:#cfc8e8}
.mv4-hash{font-family:monospace;font-size:9px;color:#8a84a8;word-break:break-all}
#mv4-close{margin-top:12px;width:100%;border:1px solid rgba(212,175,55,.4);background:none;color:#f0d68a;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="mv4-btn" title="Оберег"&gt;?&lt;/button&gt;
&lt;div id="mv4-mask"&gt;&lt;div id="mv4-card"&gt;
&lt;h3&gt;? Оберег = блок&lt;/h3&gt;
&lt;div class="mv4-sub"&gt;Выкуй персональный оберег: намерение → хеш → руна защиты&lt;/div&gt;
&lt;div class="mv4-form"&gt;&lt;input id="mv4-intent" placeholder="Намерение: «защита в дороге»…" /&gt;&lt;button class="mv4-forge" id="mv4-forge"&gt;Выковать&lt;/button&gt;&lt;/div&gt;
&lt;div class="mv4-note"&gt;Первый оберег бесплатно. Следующие — 10 ✨ гармонии.&lt;/div&gt;
&lt;div class="mv4-list" id="mv4-list"&gt;&lt;/div&gt;
&lt;button id="mv4-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function hash(str){if(window.MV&amp;&amp;window.MV.hash)return window.MV.hash(str);var h=0x811c9dc5;for(var i=0;i&lt;str.length;i++){h^=str.charCodeAt(i);h=Math.imul(h,0x01000193)}var x=('0000000'+(h&gt;&gt;&gt;0).toString(16)).slice(-8);return (x+x+x+x+x).slice(0,40)}
var RUNES=[['ᛉ','Альгиз','щит'],['ᛊ','Совило','солнце'],['ᚹ','Вуньо','радость'],['ᚠ','Феху','достаток'],['ᛚ','Лагуз','интуиция'],['ᚱ','Райдо','путь'],['ᛗ','Манназ','опора'],['ᛞ','Дагаз','прорыв']];
var COST=10;
function toast(t,m){if(window.Toast&amp;&amp;Toast.show){Toast.show(t,m,'success')}else{alert(t+': '+m)}}
function render(){
var list=g('mv_amulets',[]);
var box=$('#mv4-list');
if(!list.length){box.innerHTML='&lt;div class="mv4-note"&gt;Пока пусто. Выкуй первый оберег — он бесплатный.&lt;/div&gt;';return}
box.innerHTML=list.slice().reverse().map(function(a){
return '&lt;div class="mv4-amulet"&gt;&lt;span class="mv4-rune"&gt;'+a.rune[0]+'&lt;/span&gt;&lt;div class="mv4-info"&gt;&lt;div class="mv4-name"&gt;'+a.rune[1]+' · '+a.rune[2]+'&lt;/div&gt;&lt;div class="mv4-intent"&gt;«'+a.intent+'»&lt;/div&gt;&lt;div class="mv4-hash"&gt;#'+a.i+' · '+a.hash.slice(0,18)+'…&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
}).join('');
}
$('#mv4-forge').addEventListener('click',function(){
var intent=$('#mv4-intent').value.trim();
if(!intent){toast('Оберег','Впиши намерение');return}
var list=g('mv_amulets',[]);
if(list.length&gt;0&amp;&amp;window.MV&amp;&amp;window.MV.spend){
if(!window.MV.spend(COST)){toast('Оберег','Нужно '+COST+' ✨ гармонии');return}
}
var prev=list.length?list[list.length-1].hash:'GENESIS';
var rune=RUNES[Math.floor(Math.random()*RUNES.length)];
var a={i:list.length,intent:intent,rune:rune,hash:hash(prev+'|'+intent+'|'+Date.now()),t:Date.now()};
list.push(a);s('mv_amulets',list);
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('amulet','Оберег: '+intent);
$('#mv4-intent').value='';
render();
toast('Оберег выкован',rune[1]+' '+rune[0]+' — «'+intent+'»');
});
$('#mv4-btn').addEventListener('click',function(){$('#mv4-mask').classList.add('open');render()});
$('#mv4-close').addEventListener('click',function(){$('#mv4-mask').classList.remove('open')});
$('#mv4-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
render();
console.log('? Блок 4: Оберег = блок подключён');
})();
&lt;/script&gt;

&lt;script&gt;
(function(){
"use strict";
function kill(el){if(el&amp;&amp;el.parentNode)el.parentNode.removeChild(el);}
/* 1) Дубли: оставляем только ПЕРВЫЙ элемент с каждым id */
function keepFirst(id){
  var all=document.querySelectorAll('#'+id);
  for(var i=1;i&lt;all.length;i++){kill(all[i]);}
}
['sc-btn','sc-mask','mv3-pill','mv3-mask','mv3-box','mv-btn','mv-mask','mv4-btn','mv4-mask','mv-chain-wrap','mv2panel'].forEach(keepFirst);
/* 2) Второй (лишний) оберег убираем — остаётся один ? */
kill(document.getElementById('mv5-btn'));
kill(document.getElementById('mv5-mask'));
/* 3) Единое чистое MV-ядро поверх всех прежних */
function lsGet(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function lsSet(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function hash(str){var h=0x811c9dc5;for(var i=0;i&lt;str.length;i++){h^=str.charCodeAt(i);h=Math.imul(h,0x01000193)}return ('0000000'+(h&gt;&gt;&gt;0).toString(16)).slice(-8)}
var chain=lsGet('mv_chain',[]);
var harmony=lsGet('mv_harmony',0);
if(!chain.length){chain.push({i:0,t:Date.now(),type:'genesis',text:'Цепь души создана',prev:'00000000',hash:hash('genesis'+Date.now())});}
var last=lsGet('mv_last',Date.now());
var mins=Math.floor((Date.now()-last)/60000);
if(mins&gt;0){var gain=Math.min(48,Math.floor(mins/10));if(gain&gt;0)harmony+=gain;}
lsSet('mv_last',Date.now());lsSet('mv_harmony',harmony);
window.MV={
  hash:hash,
  chain:function(){return chain},
  harmony:function(){return harmony},
  level:function(){return 1+Math.floor(chain.length/10)+Math.floor(harmony/50)},
  addBlock:function(type,text,pts){
    var prev=chain.length?chain[chain.length-1].hash:'00000000';
    var b={i:chain.length,t:Date.now(),type:type,text:text||'',prev:prev,hash:hash(prev+'|'+type+'|'+(text||'')+'|'+Date.now())};
    chain.push(b);if(chain.length&gt;300)chain.shift();
    lsSet('mv_chain',chain);
    if(pts){harmony+=pts;lsSet('mv_harmony',harmony);}
    return b;
  },
  spend:function(n){if(harmony&gt;=n){harmony-=n;lsSet('mv_harmony',harmony);return true}return false}
};
console.log('? Блок 5: дубли убраны · цепь '+chain.length+' блоков · гармония '+harmony);
})();
&lt;/script&gt;

&lt;style&gt;
#mv6-btn{position:fixed;right:16px;bottom:200px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#0EA5E9,#6366F1);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(99,102,241,.45);transition:transform .2s}
#mv6-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#mv6-btn{bottom:90px;right:76px}}
#mv6-mask{position:fixed;inset:0;z-index:411;display:none;align-items:center;justify-content:center;background:rgba(5,5,20,.85);backdrop-filter:blur(6px)}
#mv6-mask.open{display:flex}
#mv6-card{width:min(560px,92vw);max-height:88vh;overflow-y:auto;border-radius:18px;padding:24px;color:#efe9dc;background:radial-gradient(ellipse at 50% 0%,#1e1b4b 0%,#0a0818 70%);border:1px solid rgba(99,102,241,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 0 60px rgba(99,102,241,.3)}
#mv6-card h3{margin:0 0 6px;font-size:20px;color:#a5b4fc}
#mv6-sub{font-size:12px;color:#818cf8;margin-bottom:16px}
#mv6-input{width:100%;min-height:80px;padding:14px;border-radius:12px;border:1px solid rgba(99,102,241,.4);background:rgba(30,27,75,.5);color:#e0e7ff;font-size:14px;font-family:inherit;resize:vertical;margin-bottom:12px}
#mv6-input:focus{outline:none;border-color:#818cf8;box-shadow:0 0 0 3px rgba(99,102,241,.2)}
#mv6-send{width:100%;padding:14px;border:none;border-radius:12px;background:linear-gradient(135deg,#6366F1,#8B5CF6);color:#fff;font-weight:800;font-size:15px;cursor:pointer;transition:.2s}
#mv6-send:hover{box-shadow:0 8px 24px rgba(99,102,241,.5);transform:translateY(-2px)}
.mv6-note{font-size:11px;color:#818cf8;margin-top:8px;text-align:center}
/* Бегущая строка хешей */
.mv6-ticker{margin-top:16px;overflow:hidden;border-radius:10px;background:rgba(15,23,42,.8);border:1px solid rgba(99,102,241,.3);padding:10px 0}
.mv6-ticker-inner{display:flex;gap:24px;animation:mv6scroll 30s linear infinite;white-space:nowrap}
@keyframes mv6scroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}
.mv6-hash-item{font-family:monospace;font-size:11px;color:#64748b}
.mv6-hash-item b{color:#818cf8}
/* Список последних сигналов */
.mv6-list{margin-top:16px;display:flex;flex-direction:column;gap:8px;max-height:180px;overflow-y:auto}
.mv6-signal{display:flex;gap:12px;align-items:center;padding:10px;border-radius:10px;background:rgba(99,102,241,.08);border:1px solid rgba(99,102,241,.2)}
.mv6-signal-icon{font-size:20px}
.mv6-signal-info{flex:1}
.mv6-signal-hash{font-family:monospace;font-size:10px;color:#818cf8;word-break:break-all}
.mv6-signal-time{font-size:10px;color:#64748b}
#mv6-close{margin-top:16px;width:100%;border:1px solid rgba(99,102,241,.4);background:none;color:#a5b4fc;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
/* Анимация запуска */
.mv6-rocket{position:fixed;font-size:40px;z-index:500;pointer-events:none;transition:all 2s cubic-bezier(.5,-0.5,.5,1.5);opacity:1}
.mv6-rocket.launch{transform:translateY(-120vh) rotate(-45deg);opacity:0}
&lt;/style&gt;
&lt;button id="mv6-btn" title="Сигнал в космос"&gt;?&lt;/button&gt;
&lt;div id="mv6-mask"&gt;&lt;div id="mv6-card"&gt;
&lt;h3&gt;? Сигнал в космос&lt;/h3&gt;
&lt;div id="mv6-sub"&gt;Отправь послание во вселенную — оно станет частью публичной цепи Метавселенной навсегда&lt;/div&gt;
&lt;input id="mv6-input" placeholder="Например: благодарность, желание, намерение, приветствие миру…" maxlength="200" /&gt;
&lt;button id="mv6-send"&gt;✨ Отправить сигнал&lt;/button&gt;
&lt;div class="mv6-note"&gt;Первый сигнал бесплатно · дальше — 3 ✨ гармонии · послание анонимно (только хеш в цепи)&lt;/div&gt;
&lt;div class="mv6-ticker"&gt;&lt;div class="mv6-ticker-inner" id="mv6-ticker-inner"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="mv6-list" id="mv6-list"&gt;&lt;/div&gt;
&lt;button id="mv6-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function lsGet(k,d){try{var v=localStorage.getItem(k);return v?JSON.parse(v):d}catch(e){return d}}
function lsSet(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function hashFn(s){
if(window.MV&amp;&amp;window.MV.hash)return window.MV.hash(s);
var h=0x811c9dc5;for(var i=0;i&lt;s.length;i++){h^=s.charCodeAt(i);h=Math.imul(h,0x01000193)}
var x=('0000000'+(h&gt;&gt;&gt;0).toString(16)).slice(-8);return (x+x+x+x).slice(0,40);
}
var COST=3;
var ICONS=['✨','?','⭐','?','?','☄️','?','?'];
function signals(){return lsGet('mv_signals',[])}
function renderTicker(){
var sig=signals();var inner=$('#mv6-ticker-inner');
if(!sig.length){inner.innerHTML='&lt;span class="mv6-hash-item"&gt;Ожидание первого сигнала из этой вселенной…&lt;/span&gt;';return;}
var items=sig.slice(-20).reverse().map(function(s){
return '&lt;span class="mv6-hash-item"&gt;&lt;b&gt;#'+s.i+'&lt;/b&gt; '+s.hash.slice(0,16)+'…&lt;/span&gt;';
}).join('');
inner.innerHTML=items+items; /* дублируем для бесшовной прокрутки */
}
function renderList(){
var sig=signals();var list=$('#mv6-list');
if(!sig.length){list.innerHTML='&lt;div class="mv6-note"&gt;Пока тихо в космосе из этого мира…&lt;/div&gt;';return;}
list.innerHTML=sig.slice(-10).reverse().map(function(s){
return '&lt;div class="mv6-signal"&gt;&lt;span class="mv6-signal-icon"&gt;'+s.icon+'&lt;/span&gt;'+
'&lt;div class="mv6-signal-info"&gt;&lt;div class="mv6-signal-hash"&gt;'+s.hash+'&lt;/div&gt;'+
'&lt;div class="mv6-signal-time"&gt;'+new Date(s.t).toLocaleString('ru-RU')+' · '+s.world+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
}).join('');
}
function render(){renderTicker();renderList();}
function sendSignal(){
var msg=$('#mv6-input').value.trim();
if(!msg){if(window.Toast)Toast.show('Сигнал','Впиши послание');return;}
var sig=signals();
var cost=sig.length===0?0:COST;
if(cost&gt;0){
var have=(window.MV&amp;&amp;window.MV.harmony)?window.MV.harmony():0;
if(have&lt;cost){if(window.Toast)Toast.show('Сигнал','Нужно '+cost+' ✨ гармонии');return;}
if(window.MV&amp;&amp;window.MV.spend)window.MV.spend(cost);
}
var world=document.getElementById('ariadne-app')?'Ariadne':(document.getElementById('tabBar')?'Medilav':(document.getElementById('pt-app')?'PANDO':'Метавселенная'));
var h=hashFn(msg+'|'+Date.now());
var icon=ICONS[Math.floor(Math.random()*ICONS.length)];
sig.push({i:sig.length,msg:msg,hash:h,icon:icon,world:world,t:Date.now()});
lsSet('mv_signals',sig);
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('signal','Сигнал в космос: '+msg.slice(0,50));
/* Анимация запуска */
var rocket=document.createElement('div');
rocket.className='mv6-rocket';
rocket.textContent='?';
rocket.style.left='50%';
rocket.style.bottom='20%';
document.body.appendChild(rocket);
requestAnimationFrame(function(){rocket.classList.add('launch');});
setTimeout(function(){rocket.remove();},2500);
$('#mv6-input').value='';
render();
if(window.Toast)Toast.show('Сигнал отправлен',cost===0?'Первый сигнал — бесплатно!':'−'+cost+' ✨ гармонии','success');
}
$('#mv6-btn').addEventListener('click',function(){$('#mv6-mask').classList.add('open');render();});
$('#mv6-close').addEventListener('click',function(){$('#mv6-mask').classList.remove('open');});
$('#mv6-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open');});
$('#mv6-send').addEventListener('click',sendSignal);
render();
console.log('? Блок 6: Сигнал в космос подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#mv6-btn{position:fixed;left:16px;bottom:280px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#6366F1,#8B5CF6);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(99,102,241,.45);transition:transform .2s}
#mv6-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#mv6-btn{bottom:90px;left:24px}}
#mv6-mask{position:fixed;inset:0;z-index:412;display:none;align-items:center;justify-content:center;background:rgba(5,3,20,.85);backdrop-filter:blur(4px)}
#mv6-mask.open{display:flex}
#mv6-card{width:min(560px,92vw);max-height:88vh;overflow-y:auto;border-radius:18px;padding:24px;color:#efe9dc;background:radial-gradient(ellipse at 50% 0%,#1a1440 0%,#0d0a1c 70%);border:1px solid rgba(139,92,246,.5);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6);position:relative}
#mv6-card h3{margin:0 0 4px;font-size:20px;color:#c4b5fd;position:relative}
#mv6-sub{font-size:12px;color:#8a84c0;margin-bottom:16px;position:relative}
.mv6-stars{position:absolute;inset:0;overflow:hidden;pointer-events:none;border-radius:18px}
.mv6-star{position:absolute;width:2px;height:2px;background:#fff;border-radius:50%;animation:mv6tw 3s infinite}
@keyframes mv6tw{0%,100%{opacity:.15}50%{opacity:.8}}
#mv6-text{width:100%;min-height:90px;padding:12px;border-radius:12px;border:1px solid rgba(139,92,246,.4);background:rgba(30,20,70,.5);color:#efe9dc;font-size:14px;font-family:inherit;resize:vertical;margin-bottom:12px;box-sizing:border-box;position:relative}
#mv6-text:focus{outline:none;border-color:#8B5CF6;box-shadow:0 0 0 3px rgba(139,92,246,.15)}
#mv6-launch{width:100%;padding:13px;border:none;border-radius:12px;background:linear-gradient(135deg,#6366F1,#8B5CF6);color:#fff;font-weight:800;font-size:15px;cursor:pointer;transition:.2s;position:relative}
#mv6-launch:hover{box-shadow:0 8px 24px rgba(99,102,241,.5)}
.mv6-note{font-size:11px;color:#8a84c0;margin-top:10px;text-align:center;position:relative}
.mv6-list{margin-top:16px;display:flex;flex-direction:column;gap:8px;position:relative}
.mv6-signal{display:flex;gap:10px;align-items:center;background:rgba(99,102,241,.08);border:1px solid rgba(99,102,241,.3);border-radius:10px;padding:10px 12px;font-size:12px}
.mv6-signal .hash{font-family:monospace;font-size:10px;color:#8a84c0;word-break:break-all}
.mv6-signal .date{font-size:10px;color:#6b64a0}
#mv6-close{margin-top:14px;width:100%;border:1px solid rgba(139,92,246,.4);background:none;color:#c4b5fd;border-radius:10px;padding:10px;cursor:pointer;font-size:13px;position:relative}
.mv6-rocket{position:fixed;left:50%;bottom:120px;z-index:500;font-size:42px;pointer-events:none;animation:mv6fly 2s ease-in forwards}
@keyframes mv6fly{0%{transform:translate(-50%,0);opacity:1}100%{transform:translate(-50%,-110vh);opacity:0}}
&lt;/style&gt;
&lt;button id="mv6-btn" title="Сигнал в космос"&gt;?&lt;/button&gt;
&lt;div id="mv6-mask"&gt;&lt;div id="mv6-card"&gt;
&lt;div class="mv6-stars" id="mv6-stars"&gt;&lt;/div&gt;
&lt;h3&gt;? Сигнал в космос&lt;/h3&gt;
&lt;div id="mv6-sub"&gt;Отправь послание Вселенной. Оно станет хешем в цепи — содержание знаешь только ты.&lt;/div&gt;
&lt;textarea id="mv6-text" placeholder="Напиши своё послание, намерение или мечту…"&gt;&lt;/textarea&gt;
&lt;button id="mv6-launch"&gt;? Запустить сигнал (3 ✨)&lt;/button&gt;
&lt;div class="mv6-note"&gt;Первый сигнал — бесплатно. Послание шифруется: в цепи только хеш.&lt;/div&gt;
&lt;div class="mv6-list" id="mv6-list"&gt;&lt;/div&gt;
&lt;button id="mv6-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function st(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function hash(str){if(window.MV&amp;&amp;window.MV.hash)return window.MV.hash(str);var h=0x811c9dc5;for(var i=0;i&lt;str.length;i++){h^=str.charCodeAt(i);h=Math.imul(h,0x01000193)}return ('0000000'+(h&gt;&gt;&gt;0).toString(16)).slice(-8)}
var starsEl=$('#mv6-stars');
if(starsEl){for(var i=0;i&lt;40;i++){var s=document.createElement('div');s.className='mv6-star';s.style.left=Math.random()*100+'%';s.style.top=Math.random()*100+'%';s.style.animationDelay=Math.random()*3+'s';starsEl.appendChild(s);}}
var COST=3;
function signals(){return g('mv_signals',[])}
function spend(n){
if(window.MV&amp;&amp;window.MV.spend)return window.MV.spend(n);
var h=g('mv_harmony',0);if(h&gt;=n){st('mv_harmony',h-n);return true}return false;
}
function launch(){
var text=$('#mv6-text').value.trim();
if(!text){if(window.Toast)Toast.show('Сигнал','Напиши послание','warning');return}
var list=signals();var free=list.length===0;
if(!free&amp;&amp;!spend(COST)){if(window.Toast)Toast.show('Сигнал','Нужно '+COST+' ✨ гармонии','warning');return}
var h=hash(text+'|'+Date.now());
list.push({i:list.length,hash:h,t:Date.now()});st('mv_signals',list);
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('signal','Сигнал в космос');
var r=document.createElement('div');r.className='mv6-rocket';r.textContent='?';document.body.appendChild(r);
setTimeout(function(){r.remove()},2000);
$('#mv6-text').value='';
render();
if(window.Toast)Toast.show('Сигнал отправлен',free?'Первый сигнал — бесплатно!':'−'+COST+' ✨ гармонии','success');
}
function render(){
var list=signals();
var el=$('#mv6-list');
if(!list.length){el.innerHTML='&lt;div style="color:#8a84c0;font-size:12px;font-style:italic;text-align:center;padding:8px"&gt;Сигналов пока нет. Отправь первый — он бесплатный.&lt;/div&gt;';return}
el.innerHTML=list.slice().reverse().slice(0,8).map(function(s){
return '&lt;div class="mv6-signal"&gt;&lt;span style="font-size:18px"&gt;?&lt;/span&gt;&lt;div style="flex:1"&gt;&lt;div class="hash"&gt;#'+s.i+' · '+s.hash+'&lt;/div&gt;&lt;div class="date"&gt;'+new Date(s.t).toLocaleString()+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
}).join('');
}
$('#mv6-btn').addEventListener('click',function(){$('#mv6-mask').classList.add('open');render()});
$('#mv6-close').addEventListener('click',function(){$('#mv6-mask').classList.remove('open')});
$('#mv6-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
$('#mv6-launch').addEventListener('click',launch);
render();
console.log('? Блок 5: Сигнал в космос подключён');
})();
&lt;/script&gt;

&lt;style&gt;
.mv6-wheel-wrap{display:flex;flex-direction:column;align-items:center;gap:14px}
#mv6Wheel{width:240px;height:240px;border-radius:50%;box-shadow:0 0 30px rgba(212,175,55,.4)}
.mv6-vault{border:2px solid var(--gold);border-radius:14px;padding:18px;background:radial-gradient(circle at 50% 20%,#2e2658,#14102e);color:#f0d68a;text-align:center}
.mv6-vault .big{font-size:34px;font-weight:800;font-family:var(--disp)}
.mv6-vault input{width:100px;padding:8px;border-radius:8px;border:1px solid rgba(212,175,55,.5);background:rgba(36,26,82,.5);color:#efe9dc;text-align:center;font-size:16px}
.mv6-quest{display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--bg-secondary);border:1px solid var(--gray-200);border-radius:10px;padding:10px 12px;margin-bottom:8px}
.mv6-quest.done{opacity:.55}
.mv6-quest .q-txt{flex:1;font-size:13px;color:var(--gray-700)}
.mv6-quest .q-box{width:22px;height:22px;border-radius:6px;border:2px solid var(--gray-300);display:flex;align-items:center;justify-content:center;color:var(--success);font-weight:800}
.mv6-quest.done .q-box{border-color:var(--success);background:var(--success-light)}
.mv6-timer{font-family:monospace;font-size:13px;color:var(--gray-500);text-align:center;margin-top:6px}
&lt;/style&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function harm(){if(window.MV&amp;&amp;window.MV.harmony)return window.MV.harmony();return g('mv_harmony',0)}
function addHarm(n){if(window.MV&amp;&amp;window.MV.addHarmony){window.MV.addHarmony(n);return}
var h=g('mv_harmony',0)+n;s('mv_harmony',h);
if(window.MV&amp;&amp;typeof window.MV.render==='function')window.MV.render();}
function spend(n){if(window.MV&amp;&amp;window.MV.spend)return window.MV.spend(n);
var h=g('mv_harmony',0);if(h&gt;=n){s('mv_harmony',h-n);return true}return false}
function today(){return new Date().toISOString().slice(0,10)}
function toast(t,m,ty){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,ty||'success')}
/* ── секция ── */
var main=document.querySelector('#ariadne-app .a-main'),footer=document.querySelector('#ariadne-app footer.a-footer');
if(main&amp;&amp;footer&amp;&amp;!$('#fateSec')){
var sec=document.createElement('section');sec.id='fateSec';sec.className='a-section';
sec.innerHTML=
'&lt;h2 class="a-sec-title"&gt;? Комната Судьбы&lt;/h2&gt;'+
'&lt;div class="a-sec-sub"&gt;Ежедневные испытания: крути колесо, копи в сейфе, выполняй квесты — получай гармонию&lt;/div&gt;'+
'&lt;div class="a-grid a-grid-3"&gt;'+
'&lt;div class="a-widget"&gt;&lt;div class="a-widget-head"&gt;&lt;div class="a-widget-icon ic-gold"&gt;&lt;i class="fas fa-dharmachakra"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="a-widget-title"&gt;Колесо Фортуны&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="mv6-wheel-wrap"&gt;&lt;canvas id="mv6Wheel" width="240" height="240"&gt;&lt;/canvas&gt;'+
'&lt;button class="a-btn a-btn-gold" id="mv6Spin"&gt;&lt;i class="fas fa-play"&gt;&lt;/i&gt; Крутить (1 раз в день)&lt;/button&gt;'+
'&lt;div class="mv6-timer" id="mv6SpinTimer"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="a-widget"&gt;&lt;div class="a-widget-head"&gt;&lt;div class="a-widget-icon ic-gold"&gt;&lt;i class="fas fa-vault"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="a-widget-title"&gt;Сейф Гармонии&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="mv6-vault"&gt;&lt;div class="big" id="mv6VaultAmt"&gt;0 ✨&lt;/div&gt;'+
'&lt;div style="font-size:12px;margin:8px 0"&gt;вложено · растёт +2% в день&lt;/div&gt;'+
'&lt;div style="display:flex;gap:8px;justify-content:center;align-items:center;margin-top:8px"&gt;'+
'&lt;input type="number" id="mv6VaultIn" placeholder="сумма" min="1"&gt;'+
'&lt;button class="a-btn a-btn-gold" id="mv6VaultPut"&gt;Вложить&lt;/button&gt;&lt;/div&gt;'+
'&lt;button class="a-btn a-btn-outline" id="mv6VaultTake" style="margin-top:10px"&gt;Забрать всё&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="a-widget"&gt;&lt;div class="a-widget-head"&gt;&lt;div class="a-widget-icon ic-gold"&gt;&lt;i class="fas fa-list-check"&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="a-widget-title"&gt;Ежедневный квест&lt;/div&gt;&lt;/div&gt;'+
'&lt;div id="mv6QuestList"&gt;&lt;/div&gt;'+
'&lt;button class="a-btn a-btn-gold a-btn-block" id="mv6QuestClaim"&gt;Забрать +5 ✨&lt;/button&gt;&lt;/div&gt;'+
'&lt;/div&gt;';
main.insertBefore(sec,footer);
var sos=document.querySelector('#ariadne-app .a-nav-item[data-section="sos"]');
if(sos){var nb=document.createElement('button');nb.className='a-nav-item';nb.dataset.section='fateSec';
nb.innerHTML='&lt;i class="fas fa-dharmachakra"&gt;&lt;/i&gt;&lt;span&gt;Комната Судьбы&lt;/span&gt;';
nb.addEventListener('click',function(){if(window.go)go('fateSec')});sos.parentNode.insertBefore(nb,sos);}
}
/* ── КОЛЕСО ── */
var SEG=[['+5 ✨',5],['+10 ✨',10],['+3 ✨',3],['+15 ✨',15],['+2 ✨',2],['+20 ✨',20],['+7 ✨',7],['+1 ✨',1]];
var COLS=['#D4AF37','#8B5CF6','#3B82F6','#EC4899','#10B981','#F59E0B','#06B6D4','#EF4444'];
var cv=$('#mv6Wheel'),ctx=cv.getContext('2d'),ang=0,spinning=false;
function drawWheel(){
if(!ctx)return;ctx.clearRect(0,0,240,240);
var cx=120,cy=120,r=110,n=SEG.length,seg=6.28/n;
for(var i=0;i&lt;n;i++){var a=ang+i*seg;
ctx.beginPath();ctx.moveTo(cx,cy);ctx.arc(cx,cy,r,a,a+seg);ctx.closePath();
ctx.fillStyle=COLS[i];ctx.fill();ctx.strokeStyle='#fff';ctx.lineWidth=2;ctx.stroke();
ctx.save();ctx.translate(cx,cy);ctx.rotate(a+seg/2);ctx.textAlign='center';ctx.textBaseline='middle';
ctx.fillStyle='#fff';ctx.font='bold 13px Inter';ctx.fillText(SEG[i][0],r*0.62,0);ctx.restore();}
ctx.beginPath();ctx.moveTo(cx,4);ctx.lineTo(cx-10,26);ctx.lineTo(cx+10,26);ctx.closePath();ctx.fillStyle='#f0d68a';ctx.fill();
}
function canSpin(){return g('mv6_spin','')!==today()}
function spinWheel(){
if(spinning)return;
if(!canSpin()){toast('Колесо','Уже крутил сегодня. Возвращайся завтра!','warning');return}
spinning=true;s('mv6_spin',today());
var target=(4+Math.random()*4)*6.28,start=ang,t0=performance.now(),dur=3500;
function anim(t){var p=Math.min((t-t0)/dur,1),e=1-Math.pow(1-p,3);
ang=start+target*e;drawWheel();
if(p&lt;1)requestAnimationFrame(anim);
else{spinning=false;
var seg=6.28/SEG.length,raw=(6.28-(ang%6.28))%6.28,idx=Math.floor(raw/seg);if(idx&gt;=SEG.length)idx=0;
var prize=SEG[idx][1];addHarm(prize);
toast('Колесо Фортуны','Выпало '+prize+' ✨ гармонии!');
checkQuest('spin');
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('wheel','Крутанул колесо');
}}
requestAnimationFrame(anim);
}
var sb=$('#mv6Spin');if(sb)sb.addEventListener('click',spinWheel);
/* ── СЕЙФ ── */
function vault(){return g('mv6_vault',null)}
function saveVault(v){s('mv6_vault',v);renderVault()}
function accrue(){
var v=vault();if(!v||!v.amt)return;
var days=Math.floor((Date.now()-v.t)/864e5);
var grown=Math.floor(v.amt*Math.pow(1.02,days));
if(grown&gt;v.amt)v.amt=grown;
saveVault(v);
}
function renderVault(){
var v=vault(),el=$('#mv6VaultAmt');
if(el)el.textContent=(v?v.amt:0)+' ✨';
}
var vp=$('#mv6VaultPut');
if(vp)vp.addEventListener('click',function(){
var n=parseInt(($('#mv6VaultIn')||{}).value||0,10);
if(!n||n&lt;=0){toast('Сейф','Введи сумму','warning');return}
if(!spend(n)){toast('Сейф','Не хватает гармонии','warning');return}
var v=vault()||{amt:0,t:Date.now()};
v.amt+=n;v.t=Date.now();saveVault(v);
$('#mv6VaultIn').value='';
toast('Сейф','Вложено '+n+' ✨. Растёт +2% в день!');
checkQuest('vault');
});
var vt=$('#mv6VaultTake');
if(vt)vt.addEventListener('click',function(){
var v=vault();if(!v||!v.amt){toast('Сейф','Сейф пуст','warning');return}
addHarm(v.amt);toast('Сейф','Забрал '+v.amt+' ✨');saveVault({amt:0,t:Date.now()});
});
/* ── ЕЖЕДНЕВНЫЙ КВЕСТ ── */
var QUESTS=[
{id:'spin',txt:'Крутни Колесо Фортуны'},
{id:'vault',txt:'Вложи гармонию в Сейф'},
{id:'gadget',txt:'Сделай любое гадание'}
];
function questState(){return g('mv6_quest_'+today(),{})}
function checkQuest(id){
var q=questState();
if(!q[id]){q[id]=true;s('mv6_quest_'+today(),q);renderQuests();}
}
function renderQuests(){
var q=questState(),list=$('#mv6QuestList');if(!list)return;
list.innerHTML=QUESTS.map(function(qu){
var done=!!q[qu.id];
return '&lt;div class="mv6-quest'+(done?' done':'')+'"&gt;&lt;span class="q-txt"&gt;'+qu.txt+'&lt;/span&gt;&lt;span class="q-box"&gt;'+(done?'✓':'')+'&lt;/span&gt;&lt;/div&gt;';
}).join('');
var all=QUESTS.every(function(qu){return q[qu.id]});
var cb=$('#mv6QuestClaim');if(cb){cb.disabled=!all||g('mv6_quest_claim_'+today(),false);}
}
var qc=$('#mv6QuestClaim');
if(qc)qc.addEventListener('click',function(){
var q=questState();
var all=QUESTS.every(function(qu){return q[qu.id]});
if(!all){toast('Квест','Выполни все 3 задания','warning');return}
if(g('mv6_quest_claim_'+today(),false)){toast('Квест','Уже забрал сегодня','warning');return}
s('mv6_quest_claim_'+today(),true);addHarm(5);
toast('Квест','Все квесты выполнены! +5 ✨');
renderQuests();
});
/* отслеживаем гадания для квеста */
document.addEventListener('click',function(e){
var c=e.target.closest?e.target.closest.bind(e.target):null;if(!c)return;
if(c('#dealbtn')||c('#drawRune')||c('#spinWheel')||c('#cupContainer')||c('#dealCards')||c('#numCalc')||c('#shadowBtn')||c('.a-book-card'))checkQuest('gadget');
});
/* таймер до следующего спина */
function tick(){
var el=$('#mv6SpinTimer');if(!el)return;
if(canSpin()){el.textContent='Готово к спине!';return}
var now=new Date(),mid=new Date(now);mid.setHours(24,0,0,0);
var d=mid-now,h=Math.floor(d/36e5),m=Math.floor(d%36e5/6e4),sec=Math.floor(d%6e4/1e3);
el.textContent='Следующий спин через '+h+'ч '+m+'м '+sec+'с';
}
setInterval(tick,1000);
/* init */
accrue();drawWheel();renderVault();renderQuests();tick();
if(window.MV&amp;&amp;window.MV.onBlock){
var ob=window.MV.onBlock;
window.MV.onBlock=function(b){ob(b);checkQuest('gadget');};
}
console.log('? Блок 6: Колесо + Сейфы (удержание) подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#mv6-btn{position:fixed;left:16px;bottom:200px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#3B82F6,#8B5CF6);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(59,130,246,.45);transition:transform .2s}
#mv6-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#mv6-btn{bottom:80px;left:16px}}
#mv6-mask{position:fixed;inset:0;z-index:410;display:none;align-items:center;justify-content:center;background:rgba(5,3,18,.82);backdrop-filter:blur(5px)}
#mv6-mask.open{display:flex}
#mv6-card{width:min(560px,92vw);max-height:86vh;overflow-y:auto;border-radius:18px;padding:26px 22px;color:#efe9dc;border:1px solid rgba(139,92,246,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6);
background:
radial-gradient(1px 1px at 20px 30px,#fff,transparent),
radial-gradient(1px 1px at 45px 70px,rgba(255,255,255,.85),transparent),
radial-gradient(1px 1px at 50px 160px,#fff,transparent),
radial-gradient(1px 1px at 90px 40px,rgba(255,255,255,.6),transparent),
radial-gradient(2px 2px at 130px 90px,#f0d68a,transparent),
radial-gradient(1px 1px at 160px 130px,#fff,transparent),
radial-gradient(1px 1px at 210px 60px,rgba(255,255,255,.7),transparent),
radial-gradient(1px 1px at 260px 150px,#fff,transparent),
linear-gradient(180deg,#0b0f2a,#171034 60%,#0d0a1c)}
#mv6-card h3{margin:0 0 4px;font-size:20px;color:#c4b5fd}
#mv6-sub{font-size:12px;color:#a5a0c9;margin-bottom:14px;line-height:1.5}
#mv6-text{width:100%;min-height:90px;padding:12px;border-radius:10px;border:1px solid rgba(139,92,246,.45);background:rgba(20,16,52,.6);color:#efe9dc;font-size:14px;font-family:inherit;resize:vertical;box-sizing:border-box}
#mv6-text:focus{outline:none;border-color:#8B5CF6;box-shadow:0 0 0 3px rgba(139,92,246,.18)}
#mv6-send{width:100%;padding:13px;margin-top:10px;border:none;border-radius:10px;background:linear-gradient(135deg,#3B82F6,#8B5CF6);color:#fff;font-weight:800;font-size:15px;cursor:pointer;transition:.2s}
#mv6-send:hover{box-shadow:0 8px 24px rgba(99,102,241,.45)}
.mv6-note{font-size:11px;color:#8a84c0;margin-top:8px;text-align:center}
.mv6-result{display:none;margin-top:14px;padding:12px;border-radius:10px;border:1px solid rgba(240,214,138,.4);background:rgba(212,175,55,.08);font-size:12px;color:#f0d68a;word-break:break-all;animation:mv6pop .4s ease}
@keyframes mv6pop{from{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}
.mv6-result .lbl{font-size:10px;letter-spacing:1px;text-transform:uppercase;color:#a5a0c9;margin-bottom:4px}
.mv6-history{margin-top:14px;display:flex;flex-direction:column;gap:8px}
.mv6-sig{padding:9px 12px;border-radius:9px;border:1px solid rgba(139,92,246,.3);background:rgba(139,92,246,.07);font-size:11px}
.mv6-sig .h{font-family:monospace;color:#c4b5fd;word-break:break-all}
.mv6-sig .d{color:#8a84c0;margin-top:2px}
#mv6-close{margin-top:14px;width:100%;padding:10px;border:1px solid rgba(139,92,246,.4);background:none;color:#c4b5fd;border-radius:10px;cursor:pointer;font-size:13px}
.mv6-rocket{position:fixed;z-index:500;font-size:34px;pointer-events:none;filter:drop-shadow(0 0 12px rgba(99,102,241,.8))}
.mv6-rocket.fly{animation:mv6fly 1.8s ease-in forwards}
@keyframes mv6fly{0%{transform:translate(0,0);opacity:1}100%{transform:translate(30vw,-120vh);opacity:0}}
&lt;/style&gt;
&lt;button id="mv6-btn" title="Сигнал в космос"&gt;?&lt;/button&gt;
&lt;div id="mv6-mask"&gt;&lt;div id="mv6-card"&gt;
&lt;h3&gt;? Сигнал в космос&lt;/h3&gt;
&lt;div id="mv6-sub"&gt;Запиши послание и отправь его во Вселенную. Текст останется только у тебя — в публичную Цепь души уйдёт лишь хеш.&lt;/div&gt;
&lt;textarea id="mv6-text" maxlength="300" placeholder="Например: «Пусть этот месяц принесёт спокойствие и ясность»…"&gt;&lt;/textarea&gt;
&lt;button id="mv6-send"&gt;? Отправить в космос&lt;/button&gt;
&lt;div class="mv6-note"&gt;Первый сигнал — бесплатно. Дальше — 15 ✨ гармонии.&lt;/div&gt;
&lt;div class="mv6-result" id="mv6-result"&gt;&lt;div class="lbl"&gt;Хеш сигнала · записан в цепь&lt;/div&gt;&lt;span id="mv6-hash"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="mv6-history" id="mv6-history"&gt;&lt;/div&gt;
&lt;button id="mv6-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function lsGet(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function lsSet(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function hsh(str){if(window.MV&amp;&amp;window.MV.hash)return window.MV.hash(str);
var h=0x811c9dc5;for(var i=0;i&lt;str.length;i++){h^=str.charCodeAt(i);h=Math.imul(h,0x01000193)}
return ('0000000'+(h&gt;&gt;&gt;0).toString(16)).slice(-8)}
function signals(){return lsGet('mv_signals',[])}
function launchRocket(){
var b=$('#mv6-btn'),r=b.getBoundingClientRect();
var rk=document.createElement('div');rk.className='mv6-rocket';rk.textContent='?';
rk.style.left=(r.left+r.width/2-17)+'px';rk.style.top=r.top+'px';
document.body.appendChild(rk);
requestAnimationFrame(function(){rk.classList.add('fly')});
setTimeout(function(){rk.remove()},1900);
}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success')}
function renderHistory(){
var list=$('#mv6-history'),sigs=signals().slice().reverse().slice(0,5);
if(!sigs.length){list.innerHTML='';return}
list.innerHTML=sigs.map(function(sg){
return '&lt;div class="mv6-sig"&gt;&lt;div class="h"&gt;'+sg.hash+'&lt;/div&gt;&lt;div class="d"&gt;Отправлено '+sg.date+'&lt;/div&gt;&lt;/div&gt;';
}).join('');
}
$('#mv6-btn').addEventListener('click',function(){$('#mv6-mask').classList.add('open');renderHistory()});
$('#mv6-close').addEventListener('click',function(){$('#mv6-mask').classList.remove('open')});
$('#mv6-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
$('#mv6-send').addEventListener('click',function(){
var txt=$('#mv6-text').value.trim();
if(!txt){toast('Сигнал','Сначала напиши послание');return}
var sigs=signals();
var cost=sigs.length===0?0:15;
if(cost&gt;0){
var ok=(window.MV&amp;&amp;window.MV.spend)?window.MV.spend(cost):(function(){var h=lsGet('mv_harmony',0);if(h&gt;=cost){lsSet('mv_harmony',h-cost);return true}return false})();
if(!ok){toast('Сигнал','Нужно 15 ✨ гармонии. Копи в Саду гармонии');return}
}
var hash=hsh(txt+'|'+Date.now());
var sig={hash:hash,date:new Date().toLocaleString('ru-RU')};
sigs.push(sig);lsSet('mv_signals',sigs);
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('signal','Сигнал в космос',2);
$('#mv6-text').value='';
$('#mv6-hash').textContent=hash;
$('#mv6-result').style.display='block';
launchRocket();
renderHistory();
toast('Сигнал отправлен',cost===0?'Первый сигнал — бесплатно!':'−15 ✨ гармонии');
});
renderHistory();
console.log('? Блок 6: Сигнал в космос подключён');
})();
&lt;/script&gt;
&lt;style&gt;
#mv6-btn{position:fixed;right:16px;bottom:260px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#3B82F6,#8B5CF6);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(59,130,246,.45);transition:transform .2s}
#mv6-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#mv6-btn{bottom:84px;right:76px}}
#mv6-mask{position:fixed;inset:0;z-index:411;display:none;align-items:center;justify-content:center;background:rgba(5,3,20,.82);backdrop-filter:blur(4px)}
#mv6-mask.open{display:flex}
#mv6-card{width:min(560px,92vw);max-height:86vh;overflow-y:auto;border-radius:18px;padding:24px;color:#efe9dc;background:radial-gradient(1200px 600px at 50% -10%,#1a1440,#0b081c 60%);border:1px solid rgba(139,92,246,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.55);position:relative}
.mv6-stars{position:absolute;inset:0;pointer-events:none;overflow:hidden;border-radius:18px}
.mv6-stars i{position:absolute;width:2px;height:2px;background:#fff;border-radius:50%;opacity:.7;animation:mv6tw 3s infinite}
@keyframes mv6tw{0%,100%{opacity:.15}50%{opacity:.9}}
#mv6-card h3{margin:0 0 4px;font-size:20px;color:#c4b5fd;position:relative}
#mv6-sub{font-size:12px;color:#a79ec9;margin-bottom:16px;position:relative}
#mv6-msg{width:100%;min-height:90px;padding:13px;border-radius:12px;border:1px solid rgba(139,92,246,.4);background:rgba(30,22,70,.5);color:#efe9dc;font-size:14px;resize:vertical;font-family:inherit;box-sizing:border-box}
#mv6-msg:focus{outline:none;border-color:#8B5CF6;box-shadow:0 0 0 3px rgba(139,92,246,.18)}
#mv6-send{width:100%;margin-top:12px;padding:13px;border:none;border-radius:12px;background:linear-gradient(135deg,#3B82F6,#8B5CF6);color:#fff;font-weight:800;font-size:15px;cursor:pointer;transition:.2s}
#mv6-send:hover{box-shadow:0 8px 24px rgba(99,102,241,.5);transform:translateY(-1px)}
#mv6-send:disabled{opacity:.5;cursor:not-allowed;transform:none;box-shadow:none}
.mv6-cost{font-size:12px;color:#a79ec9;text-align:center;margin-top:8px}
.mv6-list{margin-top:18px;display:flex;flex-direction:column;gap:8px;position:relative}
.mv6-sig{border:1px solid rgba(99,102,241,.35);border-radius:12px;padding:10px 12px;background:rgba(59,130,246,.08);animation:mv6fly .8s ease}
@keyframes mv6fly{0%{opacity:0;transform:translateY(14px) scale(.96)}100%{opacity:1;transform:none}}
.mv6-sig .t{font-size:13px;color:#dbeafe}
.mv6-sig .h{font-family:monospace;font-size:10px;color:#8a84a8;margin-top:4px;word-break:break-all}
#mv6-close{margin-top:14px;width:100%;border:1px solid rgba(139,92,246,.4);background:none;color:#c4b5fd;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
.mv6-comet{position:fixed;width:10px;height:10px;border-radius:50%;background:#8B5CF6;box-shadow:0 0 20px #8B5CF6,0 0 40px #3B82F6;pointer-events:none;z-index:500}
&lt;/style&gt;
&lt;button id="mv6-btn" title="Сигнал в космос"&gt;?&lt;/button&gt;
&lt;div id="mv6-mask"&gt;&lt;div id="mv6-card"&gt;
&lt;div class="mv6-stars" id="mv6-stars"&gt;&lt;/div&gt;
&lt;h3&gt;? Сигнал в космос&lt;/h3&gt;
&lt;div id="mv6-sub"&gt;Отправь намерение во Вселенную. Оно станет хешем в Цепи души.&lt;/div&gt;
&lt;textarea id="mv6-msg" placeholder="Моё намерение…"&gt;&lt;/textarea&gt;
&lt;button id="mv6-send"&gt;✨ Отправить сигнал&lt;/button&gt;
&lt;div class="mv6-cost" id="mv6-cost"&gt;&lt;/div&gt;
&lt;div class="mv6-list" id="mv6-list"&gt;&lt;/div&gt;
&lt;button id="mv6-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
var COST=15;
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function st(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function hsh(s){if(window.MV&amp;&amp;window.MV.hash)return window.MV.hash(s);var h=0x811c9dc5;for(var i=0;i&lt;s.length;i++){h^=s.charCodeAt(i);h=Math.imul(h,0x01000193)}return ('0000000'+(h&gt;&gt;&gt;0).toString(16)).slice(-8)}
/* звёзды */
var sc=$('#mv6-stars');
for(var i=0;i&lt;40;i++){var d=document.createElement('i');
d.style.left=Math.random()*100+'%';d.style.top=Math.random()*100+'%';
d.style.animationDelay=(Math.random()*3)+'s';d.style.animationDuration=(2+Math.random()*3)+'s';
sc.appendChild(d);}
function signals(){return g('mv_signals',[])}
function canAfford(){var h=(window.MV&amp;&amp;window.MV.harmony)?window.MV.harmony():g('mv_harmony',0);return h&gt;=COST}
function comet(){
var c=document.createElement('div');c.className='mv6-comet';
c.style.left=(20+Math.random()*60)+'vw';c.style.top='70vh';
document.body.appendChild(c);
var start=null;
function step(ts){if(!start)start=ts;var p=(ts-start)/1200;
if(p&gt;=1){c.remove();return}
c.style.transform='translate('+(-p*40)+'vw,'+(-p*90)+'vh) scale('+(1-p*.6)+')';
c.style.opacity=String(1-p);requestAnimationFrame(step);}
requestAnimationFrame(step);
}
function render(){
var list=signals();
var box=$('#mv6-list');
if(!list.length){box.innerHTML='&lt;div style="color:#8a84a8;font-size:12px;text-align:center"&gt;Сигналов пока нет.&lt;/div&gt;';}
else{box.innerHTML=list.slice().reverse().slice(0,8).map(function(s){
return '&lt;div class="mv6-sig"&gt;&lt;div class="t"&gt;'+s.msg+'&lt;/div&gt;&lt;div class="h"&gt;#'+s.i+' · '+s.hash+' · '+s.d+'&lt;/div&gt;&lt;/div&gt;';
}).join('');}
var afford=canAfford()||signals().length===0;
$('#mv6-send').disabled=false;
$('#mv6-cost').textContent=signals().length===0?'Первый сигнал — бесплатно':'Стоимость: '+COST+' ✨ гармонии';
}
$('#mv6-send').addEventListener('click',function(){
var msg=$('#mv6-msg').value.trim();
if(!msg){if(window.Toast)Toast.show('Сигнал','Напиши намерение','warning');return}
var list=signals();
if(list.length&gt;0){
if(window.MV&amp;&amp;window.MV.spend){if(!window.MV.spend(COST)){Toast.show('Сигнал','Нужно '+COST+' ✨','warning');return}}
else{var h=g('mv_harmony',0);if(h&lt;COST){Toast.show('Сигнал','Нужно '+COST+' ✨','warning');return}st('mv_harmony',h-COST)}
}
var hash=hsh(msg+'|'+Date.now());
list.push({i:list.length,msg:msg,hash:hash,d:new Date().toLocaleDateString('ru-RU')});
st('mv_signals',list);
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('signal','Сигнал: '+msg.slice(0,40));
$('#mv6-msg').value='';
comet();render();
if(window.Toast)Toast.show('Сигнал отправлен','✨ Намерение ушло в космос','success');
});
$('#mv6-btn').addEventListener('click',function(){$('#mv6-mask').classList.add('open');render()});
$('#mv6-close').addEventListener('click',function(){$('#mv6-mask').classList.remove('open')});
$('#mv6-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
console.log('? Блок 6: Сигнал в космос подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#mv7-btn{position:fixed;right:16px;bottom:264px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#F59E0B,#EC4899);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(245,158,11,.45);transition:transform .2s}
#mv7-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#mv7-btn{bottom:140px}}
#mv7-mask{position:fixed;inset:0;z-index:412;display:none;align-items:center;justify-content:center;background:rgba(10,7,25,.78);backdrop-filter:blur(5px)}
#mv7-mask.open{display:flex}
#mv7-card{width:min(520px,92vw);max-height:88vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(212,175,55,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.55)}
#mv7-card h3{margin:0 0 4px;font-size:20px;color:#f0d68a}
.mv7-sub{font-size:12px;color:#a79ec9;margin-bottom:14px}
.mv7-wheel-wrap{position:relative;width:280px;height:280px;margin:0 auto 14px}
#mv7-wheel{width:100%;height:100%;display:block}
.mv7-pointer{position:absolute;top:-6px;left:50%;transform:translateX(-50%);width:0;height:0;border-left:14px solid transparent;border-right:14px solid transparent;border-top:22px solid #D4AF37;filter:drop-shadow(0 0 6px rgba(212,175,55,.8));z-index:2}
#mv7-spin{width:100%;padding:13px;border:none;border-radius:12px;background:linear-gradient(135deg,#F59E0B,#EC4899);color:#fff;font-weight:800;font-size:15px;cursor:pointer;transition:.2s}
#mv7-spin:hover{box-shadow:0 8px 24px rgba(245,158,11,.45)}
#mv7-spin:disabled{opacity:.5;cursor:not-allowed;box-shadow:none}
.mv7-harm-line{text-align:center;font-size:13px;color:#cfc8e8;margin:12px 0}
.mv7-harm-line b{color:#f0d68a;font-size:17px}
.mv7-divider{border:none;border-top:1px dashed rgba(212,175,55,.3);margin:18px 0}
#mv7-card h4{font-size:16px;color:#f0d68a;margin-bottom:6px}
.mv7-vault-note{font-size:12px;color:#a79ec9;margin-bottom:10px;line-height:1.5}
.mv7-lock-row{display:flex;gap:8px;margin-bottom:12px}
#mv7-amt{flex:1;padding:11px 14px;border-radius:10px;border:1px solid rgba(212,175,55,.4);background:rgba(36,26,82,.4);color:#efe9dc;font-size:14px}
#mv7-amt:focus{outline:none;border-color:#D4AF37}
#mv7-lock{padding:11px 16px;border:none;border-radius:10px;background:linear-gradient(135deg,#8B5CF6,#3B82F6);color:#fff;font-weight:700;cursor:pointer}
.mv7-vault{border:1px solid rgba(139,92,246,.4);border-radius:10px;padding:10px 12px;background:rgba(139,92,246,.08);display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.mv7-vault.ready{border-color:#10B981;background:rgba(16,185,129,.1)}
.mv7-v-amt{font-weight:700;color:#efe9dc;font-size:13px}
.mv7-v-time{font-size:11px;color:#a79ec9}
.mv7-collect{border:none;border-radius:8px;background:#10B981;color:#fff;font-weight:700;padding:7px 12px;cursor:pointer;font-size:12px}
.mv7-empty{color:#8a84a8;font-size:12px;font-style:italic;text-align:center;padding:8px}
#mv7-close{margin-top:14px;width:100%;border:1px solid rgba(212,175,55,.4);background:none;color:#f0d68a;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="mv7-btn" title="Колесо Фортуны"&gt;?&lt;/button&gt;
&lt;div id="mv7-mask"&gt;&lt;div id="mv7-card"&gt;
&lt;h3&gt;? Колесо Фортуны&lt;/h3&gt;
&lt;div class="mv7-sub"&gt;Крути раз в день — выигрывай гармонию&lt;/div&gt;
&lt;div class="mv7-harm-line"&gt;Гармония: &lt;b id="mv7-harm"&gt;0&lt;/b&gt; ✨&lt;/div&gt;
&lt;div class="mv7-wheel-wrap"&gt;&lt;div class="mv7-pointer"&gt;&lt;/div&gt;&lt;canvas id="mv7-wheel" width="280" height="280"&gt;&lt;/canvas&gt;&lt;/div&gt;
&lt;button id="mv7-spin"&gt;? Крутить колесо&lt;/button&gt;
&lt;hr class="mv7-divider" /&gt;
&lt;h4&gt;?️ Сейф Теней&lt;/h4&gt;
&lt;div class="mv7-vault-note"&gt;Заморозь гармонию на 7 дней — вернёшь её с бонусом &lt;b&gt;+50%&lt;/b&gt;. Чем дольше ждёшь, тем больше растёт сад.&lt;/div&gt;
&lt;div class="mv7-lock-row"&gt;&lt;input id="mv7-amt" type="number" min="1" placeholder="Сумма ✨" /&gt;&lt;button id="mv7-lock"&gt;? Заморозить&lt;/button&gt;&lt;/div&gt;
&lt;div id="mv7-vaults"&gt;&lt;/div&gt;
&lt;button id="mv7-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function harm(){if(window.MV&amp;&amp;window.MV.harmony)return window.MV.harmony();return g('mv_harmony',0)}
function addH(n){if(window.MV&amp;&amp;window.MV.addHarmony){window.MV.addHarmony(n)}else{var h=g('mv_harmony',0);s('mv_harmony',h+n);}}
function spend(n){if(window.MV&amp;&amp;window.MV.spend)return window.MV.spend(n);var h=g('mv_harmony',0);if(h&gt;=n){s('mv_harmony',h-n);return true}return false}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success')}
function today(){return new Date().toDateString()}
var SEGS=[5,10,15,3,8,12,20,2];
var COLS=['#D4AF37','#8B5CF6','#3B82F6','#10B981','#F59E0B','#EC4899','#6366F1','#EF4444'];
var angle=0,spinning=false,drawn=false;
function drawWheel(){
var cv=$('#mv7-wheel');if(!cv)return;var ctx=cv.getContext('2d');
var w=cv.width,h=cv.height,cx=w/2,cy=h/2,r=w/2-12;
ctx.clearRect(0,0,w,h);
for(var i=0;i&lt;8;i++){
var a0=angle+i*(Math.PI/4),a1=a0+Math.PI/4;
ctx.beginPath();ctx.moveTo(cx,cy);ctx.arc(cx,cy,r,a0,a1);ctx.closePath();
ctx.fillStyle=COLS[i];ctx.fill();ctx.strokeStyle='#0d0a1c';ctx.lineWidth=2;ctx.stroke();
ctx.save();ctx.translate(cx,cy);ctx.rotate(a0+Math.PI/8);
ctx.fillStyle='#fff';ctx.font='bold 17px Inter';ctx.textAlign='center';
ctx.fillText('+'+SEGS[i],r*0.62,6);ctx.restore();
}
ctx.beginPath();ctx.arc(cx,cy,22,0,7);ctx.fillStyle='#0d0a1c';ctx.fill();
ctx.strokeStyle='#D4AF37';ctx.lineWidth=2;ctx.stroke();
ctx.fillStyle='#f0d68a';ctx.font='16px Inter';ctx.textAlign='center';ctx.fillText('✦',cx,cy+6);
}
function updateSpinBtn(){
var b=$('#mv7-spin');var spun=g('mv7_spin','')===today();
b.disabled=spun||spinning;
b.textContent=spun?'✅ Уже крутил сегодня':'? Крутить колесо';
}
function spin(){
if(spinning)return;
if(g('mv7_spin','')===today()){toast('Колесо','Уже крутил сегодня — возвращайся завтра!');return}
spinning=true;updateSpinBtn();
var target=Math.floor(Math.random()*8);
var finalAngle=-Math.PI/2-Math.PI/8-target*(Math.PI/4);
var total=(finalAngle-angle)%(2*Math.PI);
if(total&lt;0)total+=2*Math.PI;
total+=5*2*Math.PI;
var start=angle,dur=3200,t0=performance.now();
function frame(now){
var p=Math.min((now-t0)/dur,1),e=1-Math.pow(1-p,3);
angle=start+total*e;drawWheel();
if(p&lt;1)requestAnimationFrame(frame);
else{spinning=false;s('mv7_spin',today());
var win=SEGS[target];addH(win);
$('#mv7-harm').textContent=harm();
toast('Колесо Фортуны','+'+win+' ✨ гармонии!');
updateSpinBtn();}
}
requestAnimationFrame(frame);
}
function lockVault(){
var amt=parseInt($('#mv7-amt').value,10);
if(!amt||amt&lt;=0){toast('Сейф','Введи сумму');return}
if(!spend(amt)){toast('Сейф','Не хватает гармонии');return}
var vs=g('mv7_vaults',[]);
vs.push({amt:amt,locked:Date.now(),until:Date.now()+7*864e5});
s('mv7_vaults',vs);$('#mv7-amt').value='';
$('#mv7-harm').textContent=harm();
renderVaults();toast('Сейф Теней','Заморожено '+amt+' ✨ на 7 дней (+50%)');
}
function renderVaults(){
var vs=g('mv7_vaults',[]),box=$('#mv7-vaults');
if(!vs.length){box.innerHTML='&lt;div class="mv7-empty"&gt;Нет активных сейфов.&lt;/div&gt;';return}
box.innerHTML=vs.map(function(v,i){
var ready=Date.now()&gt;=v.until,left=Math.ceil((v.until-Date.now())/864e5),ret=Math.round(v.amt*1.5);
return '&lt;div class="mv7-vault'+(ready?' ready':'')+'"&gt;&lt;div class="mv7-v-amt"&gt;'+v.amt+' ✨ → '+ret+' ✨&lt;/div&gt;'+
(ready?'&lt;button class="mv7-collect" data-i="'+i+'"&gt;Забрать '+ret+' ✨&lt;/button&gt;':'&lt;div class="mv7-v-time"&gt;'+left+' дн.&lt;/div&gt;')+'&lt;/div&gt;';
}).join('');
box.querySelectorAll('.mv7-collect').forEach(function(b){
b.addEventListener('click',function(){
var i=+b.dataset.i,arr=g('mv7_vaults',[]),v=arr[i],ret=Math.round(v.amt*1.5);
addH(ret);arr.splice(i,1);s('mv7_vaults',arr);
$('#mv7-harm').textContent=harm();renderVaults();
toast('Сейф Теней','Забрал '+ret+' ✨ с бонусом!');
});
});
}
$('#mv7-btn').addEventListener('click',function(){
$('#mv7-mask').classList.add('open');
$('#mv7-harm').textContent=harm();
drawWheel();updateSpinBtn();renderVaults();
});
$('#mv7-spin').addEventListener('click',spin);
$('#mv7-lock').addEventListener('click',lockVault);
$('#mv7-close').addEventListener('click',function(){$('#mv7-mask').classList.remove('open')});
$('#mv7-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
console.log('? Блок 7: Колесо + Сейф Теней подключены');
})();
&lt;/script&gt;

&lt;style&gt;
#mv6-btn{position:fixed;right:16px;bottom:264px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#F59E0B,#EC4899);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(245,158,11,.45);transition:transform .2s}
#mv6-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#mv6-btn{bottom:264px}}
#mv6-mask{position:fixed;inset:0;z-index:410;display:none;align-items:center;justify-content:center;background:rgba(10,7,25,.72);backdrop-filter:blur(4px)}
#mv6-mask.open{display:flex}
#mv6-card{width:min(520px,92vw);max-height:86vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(245,158,11,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.5)}
#mv6-card h3{margin:0 0 4px;font-size:20px;color:#fbd38d}
#mv6-sub{font-size:12px;color:#a79ec9;margin-bottom:12px}
.mv6-balance{display:flex;justify-content:space-between;align-items:center;background:rgba(245,158,11,.1);border:1px solid rgba(245,158,11,.35);border-radius:12px;padding:10px 14px;margin-bottom:16px}
.mv6-balance span{font-size:12px;color:#d9cfae}
.mv6-balance b{font-size:22px;color:#fbd38d}
.mv6-wheelwrap{position:relative;width:190px;height:190px;margin:8px auto 14px}
.mv6-rotor{position:absolute;inset:0}
.mv6-wheel{position:absolute;inset:0;border-radius:50%;border:4px solid #D4AF37;box-shadow:0 0 24px rgba(212,175,55,.35)}
.mv6-seglab{position:absolute;font-size:11px;font-weight:700;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.7);transform:translate(-50%,-50%);pointer-events:none}
.mv6-pointer{position:absolute;top:-7px;left:50%;transform:translateX(-50%);width:0;height:0;border-left:9px solid transparent;border-right:9px solid transparent;border-top:16px solid #D4AF37;z-index:5;filter:drop-shadow(0 0 5px rgba(212,175,55,.8))}
.mv6-spin{width:100%;padding:13px;border:none;border-radius:12px;background:linear-gradient(135deg,#F59E0B,#EC4899);color:#fff;font-weight:800;font-size:15px;cursor:pointer;transition:.2s}
.mv6-spin:hover:not(:disabled){box-shadow:0 8px 24px rgba(245,158,11,.4)}
.mv6-spin:disabled{opacity:.5;cursor:not-allowed}
.mv6-hr{border:none;border-top:1px dashed rgba(245,158,11,.3);margin:18px 0}
.mv6-safetitle{font-size:15px;font-weight:700;color:#fbd38d;margin-bottom:8px}
.mv6-lockrow{display:flex;gap:8px}
.mv6-lockrow input{flex:1;padding:11px 14px;border-radius:10px;border:1px solid rgba(245,158,11,.4);background:rgba(36,26,82,.4);color:#efe9dc;font-size:14px;min-width:0}
.mv6-lockrow input:focus{outline:none;border-color:#F59E0B}
.mv6-lockbtn{padding:11px 16px;border:none;border-radius:10px;background:linear-gradient(135deg,#8B5CF6,#3B82F6);color:#fff;font-weight:700;cursor:pointer}
.mv6-note{font-size:11px;color:#8a84a8;margin-top:8px}
.mv6-safebox{background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.35);border-radius:12px;padding:14px;text-align:center}
.mv6-safeinfo{font-size:13px;color:#cfc8e8;margin-bottom:10px}
.mv6-claim{width:100%;padding:12px;border:none;border-radius:10px;background:linear-gradient(135deg,#10B981,#34D399);color:#fff;font-weight:800;cursor:pointer}
.mv6-claim:disabled{opacity:.5;cursor:not-allowed;background:#4B5563}
#mv6-close{margin-top:16px;width:100%;border:1px solid rgba(245,158,11,.4);background:none;color:#fbd38d;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="mv6-btn" title="Колесо Судьбы"&gt;?&lt;/button&gt;
&lt;div id="mv6-mask"&gt;&lt;div id="mv6-card"&gt;
&lt;h3&gt;? Колесо Судьбы&lt;/h3&gt;
&lt;div id="mv6-sub"&gt;Крути раз в день · копи гармонию · замораживай в Сейфе под +50%&lt;/div&gt;
&lt;div class="mv6-balance"&gt;&lt;span&gt;Гармония&lt;/span&gt;&lt;b&gt;&lt;span id="mv6-harm"&gt;0&lt;/span&gt; ✨&lt;/b&gt;&lt;/div&gt;
&lt;div class="mv6-wheelwrap"&gt;
&lt;div class="mv6-rotor" id="mv6-rotor"&gt;&lt;div class="mv6-wheel" id="mv6-wheel"&gt;&lt;/div&gt;&lt;div id="mv6-labels"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="mv6-pointer"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button class="mv6-spin" id="mv6-spin"&gt;? Крутить колесо&lt;/button&gt;
&lt;hr class="mv6-hr" /&gt;
&lt;div class="mv6-safetitle"&gt;? Сейф Гармонии&lt;/div&gt;
&lt;div id="mv6-lockbox"&gt;
&lt;div class="mv6-lockrow"&gt;&lt;input type="number" id="mv6-amt" min="1" placeholder="Сумма ✨" /&gt;&lt;button class="mv6-lockbtn" id="mv6-lock"&gt;Заморозить на 7 дней&lt;/button&gt;&lt;/div&gt;
&lt;div class="mv6-note"&gt;Замороженная гармония вырастет на 50%. Забрать можно через 7 дней.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="mv6-safebox" id="mv6-safebox" style="display:none"&gt;
&lt;div class="mv6-safeinfo" id="mv6-safeinfo"&gt;&lt;/div&gt;
&lt;button class="mv6-claim" id="mv6-claim"&gt;? Забрать&lt;/button&gt;
&lt;/div&gt;
&lt;button id="mv6-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function lsGet(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function lsSet(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
var SEGS=[[3,'+3','#F59E0B'],[5,'+5','#EC4899'],[2,'+2','#8B5CF6'],[8,'+8','#10B981'],[1,'+1','#3B82F6'],[6,'+6','#EF4444'],[4,'+4','#D4AF37'],[10,'+10','#06B6D4']];
function harm(){return lsGet('mv_harmony',0)}
function setH(n){lsSet('mv_harmony',n)}
function today(){return new Date().toDateString()}
function canSpin(){return lsGet('mv6_lastspin','')!==today()}
function safeState(){return lsGet('mv6_safe',null)}
var spinning=false;
function buildWheel(){
var stops=[],n=SEGS.length;
for(var i=0;i&lt;n;i++){stops.push(SEGS[i][2]+' '+(i/n*360)+'deg '+((i+1)/n*360)+'deg')}
$('#mv6-wheel').style.background='conic-gradient(from 0deg,'+stops.join(',')+')';
var lab=$('#mv6-labels');lab.innerHTML='';
for(var j=0;j&lt;n;j++){
var ang=(j/n*360)+(180/n),rad=ang*Math.PI/180,r=62;
var d=document.createElement('div');d.className='mv6-seglab';
d.style.left=(95+r*Math.sin(rad))+'px';d.style.top=(95-r*Math.cos(rad))+'px';
d.textContent=SEGS[j][1];lab.appendChild(d);
}}
function resetRotor(){var ro=$('#mv6-rotor');ro.style.transition='none';ro.style.transform='rotate(0deg)'}
function spin(){
if(spinning)return;
if(!canSpin()){if(window.Toast)Toast.show('Колесо Судьбы','Сегодня уже крутил — возвращайся завтра!','warning');return}
spinning=true;
var n=SEGS.length,seg=360/n,idx=Math.floor(Math.random()*n);
var ci=idx*seg+seg/2,finalRot=360*5+(360-ci);
var ro=$('#mv6-rotor');
ro.style.transition='transform 4s cubic-bezier(.15,.6,.15,1)';
ro.style.transform='rotate('+finalRot+'deg)';
setTimeout(function(){
spinning=false;
var reward=SEGS[idx][0];
setH(harm()+reward);
lsSet('mv6_lastspin',today());
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('wheel','Колесо Судьбы: +'+reward);
updateUI();
if(window.Toast)Toast.show('Колесо Судьбы','Выпало +'+reward+' ✨ гармонии!','success');
if(window.msBurst)window.msBurst(innerWidth/2,innerHeight/2,['#F59E0B','#EC4899','#D4AF37','#fff'],60,6);
},4200);
}
function lockSafe(){
var amt=parseInt(($('#mv6-amt').value||'0'),10);
if(!amt||amt&lt;=0){if(window.Toast)Toast.show('Сейф','Введи сумму','warning');return}
if(amt&gt;harm()){if(window.Toast)Toast.show('Сейф','Не хватает гармонии (есть '+harm()+' ✨)','warning');return}
setH(harm()-amt);
lsSet('mv6_safe',{amt:amt,start:Date.now(),unlock:Date.now()+7*24*3600*1000});
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('safe','Сейф: заморожено '+amt);
$('#mv6-amt').value='';updateUI();
if(window.Toast)Toast.show('Сейф Гармонии','Заморожено '+amt+' ✨ на 7 дней (+50%)','success');
}
function claimSafe(){
var st=safeState();if(!st)return;
if(Date.now()&lt;st.unlock){if(window.Toast)Toast.show('Сейф','Ещё заморожен. Осталось '+Math.ceil((st.unlock-Date.now())/(24*3600*1000))+' дн.','warning');return}
var bonus=Math.round(st.amt*1.5);
setH(harm()+bonus);lsSet('mv6_safe',null);
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('safe','Сейф: получено '+bonus);
updateUI();
if(window.Toast)Toast.show('Сейф Гармонии','Получено '+bonus+' ✨ (вклад '+st.amt+' + 50%)','success');
}
function updateUI(){
$('#mv6-harm').textContent=harm();
var sb=$('#mv6-spin');
if(canSpin()){sb.disabled=false;sb.textContent='? Крутить колесо'}
else{sb.disabled=true;sb.textContent='⏳ Уже крутил сегодня'}
var st=safeState(),lb=$('#mv6-lockbox'),sfb=$('#mv6-safebox');
if(st){lb.style.display='none';sfb.style.display='block';
var left=st.unlock-Date.now();
if(left&gt;0){$('#mv6-safeinfo').textContent='Заморожено '+st.amt+' ✨ · разморозится через '+Math.ceil(left/(24*3600*1000))+' дн.';
$('#mv6-claim').disabled=true;$('#mv6-claim').textContent='? Заморожено'}
else{var bonus=Math.round(st.amt*1.5);
$('#mv6-safeinfo').textContent='Готово! '+st.amt+' ✨ → '+bonus+' ✨ (+50%)';
$('#mv6-claim').disabled=false;$('#mv6-claim').textContent='? Забрать '+bonus+' ✨'}}
else{lb.style.display='block';sfb.style.display='none'}
}
$('#mv6-btn').addEventListener('click',function(){$('#mv6-mask').classList.add('open');resetRotor();updateUI()});
$('#mv6-spin').addEventListener('click',spin);
$('#mv6-lock').addEventListener('click',lockSafe);
$('#mv6-claim').addEventListener('click',claimSafe);
$('#mv6-close').addEventListener('click',function(){$('#mv6-mask').classList.remove('open')});
$('#mv6-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
buildWheel();updateUI();
console.log('? Блок 6: Колесо Судьбы + Сейф Гармонии подключены');
})();
&lt;/script&gt;
&lt;style&gt;
#mv5-sig-btn{position:fixed;left:16px;bottom:204px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#3B82F6,#8B5CF6);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(59,130,246,.45);transition:transform .2s}
#mv5-sig-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#mv5-sig-btn{bottom:24px;left:70px}}
#mv5-sig-mask{position:fixed;inset:0;z-index:411;display:none;align-items:center;justify-content:center;background:rgba(5,3,18,.82);backdrop-filter:blur(4px)}
#mv5-sig-mask.open{display:flex}
#mv5-sig-card{width:min(520px,92vw);max-height:86vh;overflow-y:auto;border-radius:18px;padding:24px;color:#efe9dc;background:radial-gradient(circle at 50% 0%,#1e1b4b 0%,#0d0a1c 70%);border:1px solid rgba(139,92,246,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6);position:relative}
#mv5-sig-card h3{margin:0 0 6px;font-size:20px;color:#c4b5fd}
#mv5-sig-sub{font-size:12px;color:#a5b4fc;margin-bottom:16px}
#mv5-sig-stars{position:absolute;inset:0;pointer-events:none;overflow:hidden;border-radius:18px}
#mv5-sig-stars i{position:absolute;width:2px;height:2px;background:#fff;border-radius:50%;opacity:.6;animation:mv5tw 3s infinite}
@keyframes mv5tw{50%{opacity:.1}}
#mv5-sig-input{width:100%;min-height:84px;padding:12px 14px;border-radius:12px;border:1px solid rgba(139,92,246,.4);background:rgba(30,27,75,.5);color:#efe9dc;font-size:14px;font-family:inherit;resize:vertical;margin-bottom:12px}
#mv5-sig-input:focus{outline:none;border-color:#8B5CF6;box-shadow:0 0 0 3px rgba(139,92,246,.15)}
#mv5-sig-send{width:100%;padding:13px;border:none;border-radius:12px;background:linear-gradient(135deg,#3B82F6,#8B5CF6);color:#fff;font-weight:700;font-size:15px;cursor:pointer;transition:.2s}
#mv5-sig-send:hover{box-shadow:0 8px 24px rgba(99,102,241,.4)}
#mv5-sig-send:disabled{opacity:.5;cursor:not-allowed}
.mv5-sig-note{font-size:11px;color:#a5b4fc;margin-top:10px;text-align:center}
#mv5-sig-fly{position:fixed;left:50%;bottom:0;z-index:500;font-size:34px;pointer-events:none;opacity:0;transition:none}
#mv5-sig-list{margin-top:16px;display:flex;flex-direction:column;gap:8px;max-height:200px;overflow-y:auto}
.mv5-sig-item{border:1px solid rgba(139,92,246,.35);border-radius:10px;padding:10px 12px;background:rgba(139,92,246,.08)}
.mv5-sig-item .t{font-size:13px;color:#e0e7ff;line-height:1.4;word-break:break-word}
.mv5-sig-item .h{font-family:monospace;font-size:10px;color:#818cf8;margin-top:5px;word-break:break-all}
.mv5-sig-item .d{font-size:10px;color:#6b7280;margin-top:3px}
#mv5-sig-close{margin-top:14px;width:100%;border:1px solid rgba(139,92,246,.4);background:none;color:#c4b5fd;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="mv5-sig-btn" title="Сигнал в космос"&gt;?&lt;/button&gt;
&lt;div id="mv5-sig-fly"&gt;?&lt;/div&gt;
&lt;div id="mv5-sig-mask"&gt;&lt;div id="mv5-sig-card"&gt;
&lt;div id="mv5-sig-stars"&gt;&lt;/div&gt;
&lt;h3&gt;? Сигнал в космос&lt;/h3&gt;
&lt;div id="mv5-sig-sub"&gt;Загадай намерение — оно станет блоком в Цепи души и улетит к звёздам.&lt;/div&gt;
&lt;textarea id="mv5-sig-input" placeholder="Впиши своё намерение, мечту или благодарность…" maxlength="300"&gt;&lt;/textarea&gt;
&lt;button id="mv5-sig-send"&gt;✨ Отправить сигнал&lt;/button&gt;
&lt;div class="mv5-sig-note" id="mv5-sig-note"&gt;Первый сигнал — бесплатно. Дальше — 8 ✨ гармонии.&lt;/div&gt;
&lt;div id="mv5-sig-list"&gt;&lt;/div&gt;
&lt;button id="mv5-sig-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function lsGet(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function lsSet(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function hash(str){var h=0x811c9dc5;for(var i=0;i&lt;str.length;i++){h^=str.charCodeAt(i);h=Math.imul(h,0x01000193)}var x=('0000000'+(h&gt;&gt;&gt;0).toString(16)).slice(-8);return (x+x+x+x+x).slice(0,40)}
var COST=8;
var stars=$('#mv5-sig-stars');
if(stars){for(var i=0;i&lt;26;i++){var s=document.createElement('i');s.style.left=Math.random()*100+'%';s.style.top=Math.random()*100+'%';s.style.animationDelay=(Math.random()*3)+'s';stars.appendChild(s);}}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show){Toast.show(t,m,'success')}}
function getSignals(){return lsGet('mv_signals',[])}
function canPay(free){
if(free)return true;
if(window.MV&amp;&amp;window.MV.spend)return window.MV.spend(COST);
var h=lsGet('mv_harmony',0);if(h&gt;=COST){lsSet('mv_harmony',h-COST);return true}
return false;
}
function render(){
var list=$('#mv5-sig-list'),arr=getSignals();
if(!arr.length){list.innerHTML='';return}
list.innerHTML=arr.slice().reverse().map(function(sg){
return '&lt;div class="mv5-sig-item"&gt;&lt;div class="t"&gt;'+sg.t.replace(/&lt;/g,'&amp;lt;')+'&lt;/div&gt;&lt;div class="h"&gt;'+sg.h+'&lt;/div&gt;&lt;div class="d"&gt;'+sg.d+' · '+sg.w+'&lt;/div&gt;&lt;/div&gt;';
}).join('');
}
function flyRocket(cb){
var r=$('#mv5-sig-fly');
r.style.transition='none';r.style.opacity='1';r.style.transform='translate(-50%,0)';
requestAnimationFrame(function(){
r.style.transition='transform 1.6s cubic-bezier(.3,.6,.4,1),opacity 1.6s';
r.style.transform='translate(-50%,-110vh) rotate(-8deg)';r.style.opacity='0';
});
setTimeout(function(){r.style.opacity='0';if(cb)cb()},1700);
}
$('#mv5-sig-btn').addEventListener('click',function(){$('#mv5-sig-mask').classList.add('open');render()});
$('#mv5-sig-close').addEventListener('click',function(){$('#mv5-sig-mask').classList.remove('open')});
$('#mv5-sig-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
$('#mv5-sig-send').addEventListener('click',function(){
var intent=$('#mv5-sig-input').value.trim();
if(!intent){toast('Сигнал','Сначала впиши намерение');return}
var arr=getSignals(),free=arr.length===0;
if(!canPay(free)){toast('Сигнал','Нужно '+COST+' ✨ гармонии (сейчас '+lsGet('mv_harmony',0)+')');return}
var h=hash(intent+'|'+Date.now());
var world=window.location.hostname||'локально';
arr.push({t:intent,h:h,d:new Date().toLocaleString('ru-RU'),w:world});
lsSet('mv_signals',arr);
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('signal','Сигнал в космос: '+intent.slice(0,30));
$('#mv5-sig-input').value='';
render();
flyRocket();
toast('Сигнал отправлен',free?'Первый сигнал — бесплатно! К звёздам ?':'−'+COST+' ✨ гармонии. К звёздам ?');
});
render();
console.log('? Блок 5: Сигнал в космос подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#mv6-wheel-btn{position:fixed;left:16px;bottom:204px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#F59E0B,#EC4899);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(245,158,11,.45);transition:transform .2s}
#mv6-wheel-btn:hover{transform:scale(1.1)}
#mv6-vault-btn{position:fixed;left:16px;bottom:268px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#8B5CF6,#3B82F6);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(139,92,246,.45);transition:transform .2s}
#mv6-vault-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#mv6-wheel-btn{bottom:80px}#mv6-vault-btn{bottom:140px}}
#mv6-wheel-mask,#mv6-vault-mask{position:fixed;inset:0;z-index:411;display:none;align-items:center;justify-content:center;background:rgba(10,7,25,.72);backdrop-filter:blur(4px)}
#mv6-wheel-mask.open,#mv6-vault-mask.open{display:flex}
.mv6-card{width:min(440px,92vw);max-height:86vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(245,158,11,.4);box-shadow:0 30px 60px rgba(0,0,0,.5);font-family:Inter,system-ui,sans-serif}
.mv6-card.violet{border-color:rgba(139,92,246,.4)}
.mv6-card h3{margin:0 0 4px;font-size:20px;color:#fbd38d}
.mv6-card.violet h3{color:#c4b5fd}
.mv6-sub{font-size:12px;color:#a79ec9;margin-bottom:14px}
.mv6-wheel-wrap{position:relative;width:280px;height:280px;margin:0 auto 16px}
#mv6-canvas{width:100%;height:100%;display:block}
.mv6-pointer{position:absolute;top:-4px;left:50%;transform:translateX(-50%);width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-top:20px solid #f0d68a;filter:drop-shadow(0 2px 4px rgba(0,0,0,.4));z-index:2}
.mv6-spin{width:100%;padding:12px;border:none;border-radius:10px;background:linear-gradient(135deg,#F59E0B,#EC4899);color:#fff;font-weight:700;font-size:15px;cursor:pointer}
.mv6-spin:disabled{opacity:.5;cursor:not-allowed}
.mv6-note{font-size:11px;color:#8a84a8;text-align:center;margin-top:8px}
.mv6-vault-item{border:1px solid rgba(139,92,246,.4);border-radius:12px;padding:12px;margin-bottom:10px;background:rgba(139,92,246,.08)}
.mv6-vault-amt{font-size:20px;font-weight:800;color:#c4b5fd}
.mv6-vault-sub{font-size:12px;color:#a79ec9;margin-top:2px}
.mv6-collect{width:100%;padding:10px;margin-top:8px;border:none;border-radius:10px;background:#10B981;color:#fff;font-weight:700;cursor:pointer}
.mv6-lock-form{display:flex;gap:8px;margin-top:12px}
.mv6-lock-form input{flex:1;padding:11px 14px;border-radius:10px;border:1px solid rgba(139,92,246,.4);background:rgba(36,26,82,.4);color:#efe9dc;font-size:15px}
.mv6-lock-form button{padding:11px 16px;border:none;border-radius:10px;background:linear-gradient(135deg,#8B5CF6,#3B82F6);color:#fff;font-weight:700;cursor:pointer}
.mv6-close{margin-top:14px;width:100%;border:1px solid rgba(245,158,11,.4);background:none;color:#fbd38d;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
.mv6-card.violet .mv6-close{border-color:rgba(139,92,246,.4);color:#c4b5fd}
&lt;/style&gt;
&lt;button id="mv6-wheel-btn" title="Колесо Фортуны"&gt;?&lt;/button&gt;
&lt;button id="mv6-vault-btn" title="Сейф Гармонии"&gt;?️&lt;/button&gt;
&lt;div id="mv6-wheel-mask"&gt;&lt;div class="mv6-card"&gt;
&lt;h3&gt;? Колесо Фортуны&lt;/h3&gt;
&lt;div class="mv6-sub"&gt;Крути раз в день — забирай бонусную гармонию&lt;/div&gt;
&lt;div class="mv6-wheel-wrap"&gt;&lt;div class="mv6-pointer"&gt;&lt;/div&gt;&lt;canvas id="mv6-canvas" width="280" height="280"&gt;&lt;/canvas&gt;&lt;/div&gt;
&lt;button class="mv6-spin" id="mv6-spin"&gt;Крутить колесо&lt;/button&gt;
&lt;div class="mv6-note" id="mv6-wheel-note"&gt;&lt;/div&gt;
&lt;button class="mv6-close" id="mv6-wheel-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div id="mv6-vault-mask"&gt;&lt;div class="mv6-card violet"&gt;
&lt;h3&gt;?️ Сейф Гармонии&lt;/h3&gt;
&lt;div class="mv6-sub"&gt;Заморозь гармонию на 7 дней — получи +20% сверху&lt;/div&gt;
&lt;div id="mv6-vault-list"&gt;&lt;/div&gt;
&lt;div class="mv6-lock-form"&gt;&lt;input type="number" id="mv6-lock-amt" placeholder="Сумма ✨" min="1" /&gt;&lt;button id="mv6-lock-btn"&gt;Заморозить&lt;/button&gt;&lt;/div&gt;
&lt;div class="mv6-note"&gt;Сейф нельзя открыть досрочно. Терпение — тоже практика.&lt;/div&gt;
&lt;button class="mv6-close" id="mv6-vault-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
/* защита от дублей блока */
if(document.getElementById('mv6-wheel-btn'))return;
function lsGet(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function lsSet(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function toast(t,m,type){if(window.Toast&amp;&amp;Toast.show){Toast.show(t,m,type||'success')}else{alert(t+': '+m)}}
function harmony(){if(window.MV&amp;&amp;window.MV.harmony)return window.MV.harmony();return lsGet('mv_harmony',0)}
function addHarmony(n){if(window.MV&amp;&amp;window.MV.addHarmony){window.MV.addHarmony(n)}else{lsSet('mv_harmony',harmony()+n)}}
function spendHarmony(n){if(window.MV&amp;&amp;window.MV.spend)return window.MV.spend(n);var h=harmony();if(h&gt;=n){lsSet('mv_harmony',h-n);return true}return false}
/* ── КОЛЕСО ── */
var SEGS=[
{v:5,c:'#F59E0B',l:'+5'},{v:10,c:'#8B5CF6',l:'+10'},{v:15,c:'#3B82F6',l:'+15'},
{v:20,c:'#10B981',l:'+20'},{v:3,c:'#EC4899',l:'+3'},{v:50,c:'#D4AF37',l:'+50'},
{v:8,c:'#06B6D4',l:'+8'},{v:12,c:'#EF4444',l:'+12'}];
var canvas=$('#mv6-canvas'),ctx=canvas.getContext('2d');
var curAngle=-Math.PI/2;
function drawWheel(angle){
var cx=140,cy=140,r=130,seg=Math.PI*2/SEGS.length;
ctx.clearRect(0,0,280,280);
for(var i=0;i&lt;SEGS.length;i++){
var a0=angle+i*seg,a1=a0+seg;
ctx.beginPath();ctx.moveTo(cx,cy);ctx.arc(cx,cy,r,a0,a1);ctx.closePath();
ctx.fillStyle=SEGS[i].c;ctx.fill();ctx.strokeStyle='#0d0a1c';ctx.lineWidth=2;ctx.stroke();
ctx.save();ctx.translate(cx,cy);ctx.rotate(a0+seg/2);ctx.textAlign='center';ctx.textBaseline='middle';
ctx.fillStyle='#fff';ctx.font='bold 15px Inter';ctx.fillText(SEGS[i].l,r*0.68,0);ctx.restore();
}
ctx.beginPath();ctx.arc(cx,cy,26,0,Math.PI*2);ctx.fillStyle='#0d0a1c';ctx.fill();
ctx.strokeStyle='#D4AF37';ctx.lineWidth=2;ctx.stroke();
ctx.fillStyle='#f0d68a';ctx.font='16px Inter';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText('✦',cx,cy);
}
drawWheel(curAngle);
function todayKey(){var d=new Date();return d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate()}
function canSpin(){return lsGet('mv6_lastspin','')!==todayKey()}
function updateSpinBtn(){var b=$('#mv6-spin');
if(canSpin()){b.disabled=false;b.textContent='Крутить колесо';$('#mv6-wheel-note').textContent='Сегодня доступно 1 вращение';}
else{b.disabled=true;b.textContent='Уже крутил сегодня';$('#mv6-wheel-note').textContent='Возвращайся завтра — новый день, новое вращение';}}
var spinning=false;
function spin(){
if(!canSpin()||spinning)return;spinning=true;$('#mv6-spin').disabled=true;
var idx=Math.floor(Math.random()*SEGS.length),seg=Math.PI*2/SEGS.length;
var target=2*Math.PI*5+(-Math.PI/2-idx*seg-seg/2);
var start=curAngle,dur=3500,t0=performance.now();
function anim(t){
var p=Math.min((t-t0)/dur,1),e=1-Math.pow(1-p,4);
curAngle=start+(target-start)*e;drawWheel(curAngle);
if(p&lt;1)requestAnimationFrame(anim);
else{spinning=false;
var win=SEGS[idx].v;addHarmony(win);lsSet('mv6_lastspin',todayKey());
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('wheel','Колесо Фортуны: +'+win);
toast('Колесо Фортуны','Выпало +'+win+' ✨ гармонии!');
updateSpinBtn();}}
requestAnimationFrame(anim);
}
updateSpinBtn();
/* ── СЕЙФ ── */
var LOCK_DAYS=7,BONUS=0.20;
function vaults(){return lsGet('mv6_vaults',[])}
function saveVaults(v){lsSet('mv6_vaults',v)}
function renderVaults(){
var list=$('#mv6-vault-list'),vs=vaults(),now=Date.now();
if(!vs.length){list.innerHTML='&lt;div class="mv6-note"&gt;Сейф пуст. Заморозь первую сумму.&lt;/div&gt;';return}
list.innerHTML=vs.map(function(v,i){
var ready=now&gt;=v.ready;
var left=Math.ceil((v.ready-now)/(24*3600*1000));
var out=Math.round(v.amt*(1+BONUS));
return '&lt;div class="mv6-vault-item"&gt;&lt;div class="mv6-vault-amt"&gt;'+v.amt+' ✨ → '+out+' ✨&lt;/div&gt;'+
'&lt;div class="mv6-vault-sub"&gt;'+(ready?'Готово к получению!':'Откроется через '+left+' дн.')+'&lt;/div&gt;'+
(ready?'&lt;button class="mv6-collect" data-i="'+i+'"&gt;Забрать '+out+' ✨&lt;/button&gt;':'')+'&lt;/div&gt;';
}).join('');
list.querySelectorAll('.mv6-collect').forEach(function(b){
b.addEventListener('click',function(){
var i=+b.dataset.i,vs2=vaults(),v=vs2[i];if(!v)return;
var out=Math.round(v.amt*(1+BONUS));
addHarmony(out);vs2.splice(i,1);saveVaults(vs2);
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('vault','Сейф: +'+out+' ✨');
toast('Сейф Гармонии','Забрал '+out+' ✨ (вклад '+v.amt+' + 20%)');
renderVaults();
});
});
}
function lockHarmony(){
var amt=parseInt($('#mv6-lock-amt').value,10);
if(!amt||amt&lt;1){toast('Сейф','Введи сумму больше 0','warning');return}
if(!spendHarmony(amt)){toast('Сейф','Не хватает гармонии (сейчас '+harmony()+' ✨)','warning');return}
var vs=vaults();vs.push({amt:amt,locked:Date.now(),ready:Date.now()+LOCK_DAYS*24*3600*1000});saveVaults(vs);
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('vault','Сейф: заморожено '+amt+' ✨');
$('#mv6-lock-amt').value='';
toast('Сейф Гармонии','Заморожено '+amt+' ✨ на '+LOCK_DAYS+' дней');
renderVaults();
}
renderVaults();
/* ── привязка ── */
$('#mv6-wheel-btn').addEventListener('click',function(){$('#mv6-wheel-mask').classList.add('open');updateSpinBtn();drawWheel(curAngle)});
$('#mv6-vault-btn').addEventListener('click',function(){$('#mv6-vault-mask').classList.add('open');renderVaults()});
$('#mv6-spin').addEventListener('click',spin);
$('#mv6-lock-btn').addEventListener('click',lockHarmony);
$('#mv6-wheel-close').addEventListener('click',function(){$('#mv6-wheel-mask').classList.remove('open')});
$('#mv6-vault-close').addEventListener('click',function(){$('#mv6-vault-mask').classList.remove('open')});
$('#mv6-wheel-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
$('#mv6-vault-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
setInterval(updateSpinBtn,60000);
console.log('? Блок 6: Колесо Фортуны + Сейф Гармонии подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#mv6-btn{position:fixed;left:16px;bottom:268px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#F59E0B,#EC4899);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(245,158,11,.4);transition:transform .2s}
#mv6-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#mv6-btn{bottom:84px;left:16px}}
#mv6-mask{position:fixed;inset:0;z-index:411;display:none;align-items:center;justify-content:center;background:rgba(10,7,25,.74);backdrop-filter:blur(4px)}
#mv6-mask.open{display:flex}
#mv6-card{width:min(520px,92vw);max-height:88vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(245,158,11,.4);box-shadow:0 30px 60px rgba(0,0,0,.5);font-family:Inter,system-ui,sans-serif}
#mv6-card h3{margin:0 0 4px;font-size:20px;color:#fbd38d}
#mv6-sub{font-size:12px;color:#a79ec9;margin-bottom:16px}
.mv6-tabs{display:flex;gap:8px;margin-bottom:16px}
.mv6-tab{flex:1;padding:9px;border-radius:10px;border:1px solid rgba(245,158,11,.3);background:none;color:#a79ec9;font-weight:700;cursor:pointer;font-size:13px}
.mv6-tab.on{background:rgba(245,158,11,.15);border-color:#F59E0B;color:#fbd38d}
.mv6-pane{display:none}
.mv6-pane.on{display:block}
.mv6-wheelwrap{position:relative;width:220px;height:220px;margin:0 auto 8px}
#mv6-wheel{width:220px;height:220px;border-radius:50%;background:conic-gradient(#D4AF37 0 45deg,#8B5CF6 45deg 90deg,#3B82F6 90deg 135deg,#EC4899 135deg 180deg,#F59E0B 180deg 225deg,#10B981 225deg 270deg,#D4AF37 270deg 315deg,#8B5CF6 315deg 360deg);border:4px solid rgba(245,158,11,.5);transition:transform 4s cubic-bezier(.17,.67,.12,.99);box-shadow:0 0 30px rgba(245,158,11,.25)}
.mv6-pointer{position:absolute;top:-14px;left:50%;transform:translateX(-50%);width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-top:20px solid #fbd38d;z-index:5;filter:drop-shadow(0 2px 4px rgba(0,0,0,.5))}
.mv6-wheelval{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:70px;height:70px;border-radius:50%;background:#171034;border:3px solid #F59E0B;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:22px;color:#fbd38d;z-index:4}
#mv6-spinbtn{width:100%;padding:12px;border:none;border-radius:10px;background:linear-gradient(135deg,#F59E0B,#EC4899);color:#fff;font-weight:800;font-size:15px;cursor:pointer;margin-top:8px}
#mv6-spinbtn:disabled{opacity:.5;cursor:not-allowed}
.mv6-note{font-size:12px;color:#a79ec9;margin-top:10px;text-align:center}
.mv6-vault{border:1px solid rgba(245,158,11,.3);border-radius:12px;padding:14px;background:rgba(245,158,11,.06)}
.mv6-vrow{display:flex;justify-content:space-between;font-size:13px;padding:5px 0;color:#efe9dc}
.mv6-vrow b{color:#fbd38d}
.mv6-lockform{display:flex;gap:8px;margin-top:12px}
.mv6-lockform input{flex:1;padding:10px;border-radius:10px;border:1px solid rgba(245,158,11,.4);background:rgba(36,26,82,.4);color:#efe9dc;font-size:14px;min-width:0}
.mv6-lockform input:focus{outline:none;border-color:#F59E0B}
.mv6-lockform button{padding:10px 16px;border:none;border-radius:10px;background:linear-gradient(135deg,#F59E0B,#EC4899);color:#fff;font-weight:800;cursor:pointer}
.mv6-claim{width:100%;padding:12px;border:none;border-radius:10px;background:linear-gradient(135deg,#10B981,#34D399);color:#fff;font-weight:800;cursor:pointer;margin-top:10px}
.mv6-claim:disabled{opacity:.5;cursor:not-allowed;background:#4B5563}
#mv6-close{margin-top:14px;width:100%;border:1px solid rgba(245,158,11,.4);background:none;color:#fbd38d;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="mv6-btn" title="Колесо и Сейф"&gt;?&lt;/button&gt;
&lt;div id="mv6-mask"&gt;&lt;div id="mv6-card"&gt;
&lt;h3&gt;? Колесо и Сейф&lt;/h3&gt;
&lt;div id="mv6-sub"&gt;Ежедневный бонус + долгосрочное удержание гармонии&lt;/div&gt;
&lt;div class="mv6-tabs"&gt;
&lt;button class="mv6-tab on" data-tab="wheel"&gt;? Колесо&lt;/button&gt;
&lt;button class="mv6-tab" data-tab="vault"&gt;? Сейф&lt;/button&gt;
&lt;/div&gt;
&lt;div class="mv6-pane on" id="mv6-p-wheel"&gt;
&lt;div class="mv6-wheelwrap"&gt;&lt;div class="mv6-pointer"&gt;&lt;/div&gt;&lt;div id="mv6-wheel"&gt;&lt;/div&gt;&lt;div class="mv6-wheelval" id="mv6-wv"&gt;?&lt;/div&gt;&lt;/div&gt;
&lt;button id="mv6-spinbtn"&gt;Крутить колесо&lt;/button&gt;
&lt;div class="mv6-note" id="mv6-wheelnote"&gt;1 спин в день · гармония +1…8&lt;/div&gt;
&lt;/div&gt;
&lt;div class="mv6-pane" id="mv6-p-vault"&gt;
&lt;div class="mv6-vault"&gt;
&lt;div class="mv6-vrow"&gt;&lt;span&gt;Заморожено&lt;/span&gt;&lt;b id="mv6-locked"&gt;0&lt;/b&gt;&lt;/div&gt;
&lt;div class="mv6-vrow"&gt;&lt;span&gt;Будет&lt;/span&gt;&lt;b id="mv6-willget"&gt;0&lt;/b&gt;&lt;/div&gt;
&lt;div class="mv6-vrow"&gt;&lt;span&gt;Откроется&lt;/span&gt;&lt;b id="mv6-unlock"&gt;—&lt;/b&gt;&lt;/div&gt;
&lt;div class="mv6-vrow"&gt;&lt;span&gt;Гармонии сейчас&lt;/span&gt;&lt;b id="mv6-have"&gt;0&lt;/b&gt;&lt;/div&gt;
&lt;div class="mv6-lockform"&gt;&lt;input id="mv6-amt" type="number" min="1" placeholder="Сумма" /&gt;&lt;button id="mv6-lockbtn"&gt;Заморозить&lt;/button&gt;&lt;/div&gt;
&lt;button class="mv6-claim" id="mv6-claimbtn" disabled="disabled"&gt;Забрать&lt;/button&gt;
&lt;div class="mv6-note"&gt;Заморозь гармонию на 7 дней → получишь +50%&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;button id="mv6-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function harm(){if(window.MV&amp;&amp;window.MV.harmony)return window.MV.harmony();try{return +localStorage.getItem('mv_harmony')||0}catch(e){return 0}}
function addH(n){if(window.MV&amp;&amp;window.MV.addHarmony){window.MV.addHarmony(n);return}var h=harm()+n;s('mv_harmony',h);}
function spend(n){if(window.MV&amp;&amp;window.MV.spend)return window.MV.spend(n);var h=harm();if(h&gt;=n){s('mv_harmony',h-n);return true}return false}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show){Toast.show(t,m,'success')}}
/* ── ТАБЫ ── */
document.querySelectorAll('.mv6-tab').forEach(function(t){
t.addEventListener('click',function(){
document.querySelectorAll('.mv6-tab').forEach(function(x){x.classList.remove('on')});
document.querySelectorAll('.mv6-pane').forEach(function(x){x.classList.remove('on')});
t.classList.add('on');
$('#mv6-p-'+t.dataset.tab).classList.add('on');
});
});
/* ── КОЛЕСО ── */
var PRIZES=[2,3,5,1,8,3,5,2];
var spinState=g('mv6_spin',null);
var today=new Date().toDateString();
function spinUsed(){return spinState&amp;&amp;spinState.d===today}
function renderSpin(){
var b=$('#mv6-spinbtn');
if(spinUsed()){b.disabled=true;b.textContent='Уже крутил сегодня';$('#mv6-wv').textContent=spinState.v;}
else{b.disabled=false;b.textContent='Крутить колесо';}
}
$('#mv6-spinbtn').addEventListener('click',function(){
if(spinUsed())return;
var idx=Math.floor(Math.random()*PRIZES.length);
var deg=360*5 + (360-idx*45-22.5);
$('#mv6-wheel').style.transform='rotate('+deg+'deg)';
$('#mv6-spinbtn').disabled=true;
setTimeout(function(){
var prize=PRIZES[idx];
addH(prize);
spinState={d:today,v:prize};s('mv6_spin',spinState);
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('wheel','Колесо +'+prize);
$('#mv6-wv').textContent=prize;
renderSpin();renderVault();
toast('Колесо','+'+prize+' гармонии!');
},4000);
});
/* ── СЕЙФ ── */
function getVault(){return g('mv6_vault',null)}
function setVault(v){s('mv6_vault',v)}
function renderVault(){
var v=getVault();
var now=Date.now();
$('#mv6-have').textContent=harm();
if(!v){
$('#mv6-locked').textContent='0';$('#mv6-willget').textContent='0';
$('#mv6-unlock').textContent='—';$('#mv6-claimbtn').disabled=true;
$('#mv6-claimbtn').textContent='Забрать';
return;
}
$('#mv6-locked').textContent=v.amt;
$('#mv6-willget').textContent=Math.round(v.amt*1.5);
var left=v.unlock-now;
if(left&gt;0){
var d=Math.floor(left/864e5),h=Math.floor((left%864e5)/36e5);
$('#mv6-unlock').textContent=d+'д '+h+'ч';
$('#mv6-claimbtn').disabled=true;$('#mv6-claimbtn').textContent='Заморожено';
}else{
$('#mv6-unlock').textContent='Готово!';
$('#mv6-claimbtn').disabled=false;$('#mv6-claimbtn').textContent='Забрать +'+Math.round(v.amt*1.5);
}
}
$('#mv6-lockbtn').addEventListener('click',function(){
var amt=parseInt($('#mv6-amt').value,10);
if(!amt||amt&lt;=0){toast('Сейф','Введи сумму');return}
if(getVault()){toast('Сейф','Уже есть активный сейф');return}
if(!spend(amt)){toast('Сейф','Не хватает гармонии');return}
setVault({amt:amt,lock:Date.now(),unlock:Date.now()+7*864e5});
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('vault','Сейф '+amt);
$('#mv6-amt').value='';renderVault();
toast('Сейф','Заморожено '+amt+' на 7 дней');
});
$('#mv6-claimbtn').addEventListener('click',function(){
var v=getVault();if(!v)return;
if(Date.now()&lt;v.unlock){toast('Сейф','Ещё не время');return}
var get=Math.round(v.amt*1.5);
addH(get);setVault(null);
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('vault','Сейф +'+get);
renderVault();
toast('Сейф','Забрал '+get+' гармонии (+50%)');
});
$('#mv6-btn').addEventListener('click',function(){$('#mv6-mask').classList.add('open');renderSpin();renderVault();});
$('#mv6-close').addEventListener('click',function(){$('#mv6-mask').classList.remove('open');});
$('#mv6-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open');});
renderSpin();renderVault();
console.log('? Блок 6: Колесо и Сейф подключены');
})();
&lt;/script&gt;</subtitle>
  <updated>2026-08-30T10:59:45Z</updated>
  <logo>https://pandoraburo.ru/ssl/u/pic/23/28e0c6a04211f1a10691d899ddef63/-/1787633987.png</logo>
  <author>
    <name>1592962</name>
    <uri>https://www.pandoraburo.ru/</uri>
  </author>
</feed>
