<?xml version="1.0" encoding="UTF-8" standalone="yes"?><rss xmlns:yandex="http://news.yandex.ru" version="2.0"><channel><description>POPULAR SCIENCE</description><image><link>https://popularscience.id.page</link><title>POPULAR SCIENCE</title><url>https://popularscience.id.page/resources/000/000/000/005/659/5659670_100x100.png</url></image><item><author>News</author><description>import React, { useMemo, useState } from &quot;react&quot;;

// Quantum Control Panel — single file React component
// Tailwind classes are used for styling (no setup needed in canvas)
// This UI lets you draft a &quot;quantum&quot; event with metadata, symbols, links, versions,
// score preview, counter-projection, and simple export. Use it as a designer-ready mock.

function Section({ title, children, right }) {
  return (
    &lt;div className=&quot;bg-white/70 backdrop-blur rounded-2xl shadow p-5 border border-white/40&quot;&gt;
      &lt;div className=&quot;flex items-center justify-between mb-3&quot;&gt;
        &lt;h3 className=&quot;text-lg font-semibold&quot;&gt;{title}&lt;/h3&gt;
        {right}
      &lt;/div&gt;
      {children}
    &lt;/div&gt;
  )
}

const defaultQuantum = {
  title: &quot;&quot;,
  body: &quot;&quot;,
  media: [],
  time_from: &quot;&quot;,
  time_to: &quot;&quot;,
  place: &quot;&quot;,
  tags: [],
  symbols: [],
  links: [], // {id, title, type}
  sources: [],
  versions: [],
}

const symbolLibrary = [
  { name: &quot;Яблоко&quot;, icon: &quot;🍎&quot;, scope: &quot;global&quot; },
  { name: &quot;Память&quot;, icon: &quot;🧠&quot;, scope: &quot;global&quot; },
  { name: &quot;Круг&quot;, icon: &quot;⭕&quot;, scope: &quot;global&quot; },
  { name: &quot;Звезда&quot;, icon: &quot;⭐&quot;, scope: &quot;global&quot; },
]

function computeScore(q) {
  // A = validity from metadata and sources
  const metaFields = [q.time_from, q.place]
  const A = metaFields.filter(Boolean).length * 10 + Math.min(q.sources.length, 3) * 6
  // C = consistency via links and symbols
  const C = Math.min(q.links.length, 6) * 5 + Math.min(q.symbols.length, 3) * 6
  // K = complexity penalty for long unstructured body
  const words = q.body.trim().split(/\s+/).filter(Boolean).length
  const K = Math.max(0, Math.floor((words - 180) / 60)) * 4 // penalty after ~180 words
  // S = symbol bonus if symbols are in library
  const S = q.symbols.reduce((acc, s) =&gt; acc + (symbolLibrary.find(x =&gt; x.name === s)?.scope === &quot;global&quot; ? 4 : 2), 0)
  // R = network reach proxy via tags + media
  const R = Math.min(q.tags.length, 5) * 2 + Math.min(q.media.length, 3) * 3
  let total = A + C + S + R - K
  total = Math.max(0, Math.min(100, total))
  return { A, C, S, R, K, total }
}

function Chip({ children, onRemove }) {
  return (
    &lt;span className=&quot;inline-flex items-center gap-2 px-3 py-1 rounded-full bg-slate-100 text-slate-700 text-sm mr-2 mb-2&quot;&gt;
      {children}
      {onRemove &amp;&amp; (
        &lt;button onClick={onRemove} className=&quot;text-slate-500 hover:text-slate-700&quot;&gt;✕&lt;/button&gt;
      )}
    &lt;/span&gt;
  )
}

function GraphPreview({ quantum }) {
  // simple pseudo-graph: central node + symbols + links
  const width = 560, height = 280
  const center = { x: width / 2, y: height / 2 }
  const symbolNodes = quantum.symbols.map((s, i) =&gt; ({ x: 140 + i * 90, y: 60, label: s }))
  const linkNodes = quantum.links.map((l, i) =&gt; ({ x: 120 + i * 110, y: 220, label: l.title || l.id, type: l.type }))
  return (
    &lt;svg viewBox={`0 0 ${width} ${height}`} className=&quot;w-full rounded-xl border bg-white&quot;&gt;
      {/* links */}
      {symbolNodes.map((n, i) =&gt; (
        &lt;line key={&quot;s&quot;+i} x1={center.x} y1={center.y} x2={n.x} y2={n.y} stroke=&quot;#93c5fd&quot; strokeWidth=&quot;2&quot; /&gt;
      ))}
      {linkNodes.map((n, i) =&gt; (
        &lt;line key={&quot;l&quot;+i} x1={center.x} y1={center.y} x2={n.x} y2={n.y} stroke=&quot;#a78bfa&quot; strokeWidth=&quot;2&quot; /&gt;
      ))}
      {/* center */}
      &lt;circle cx={center.x} cy={center.y} r=&quot;26&quot; fill=&quot;#0ea5e9&quot; /&gt;
      &lt;text x={center.x} y={center.y+4} textAnchor=&quot;middle&quot; fontSize=&quot;11&quot; fill=&quot;white&quot;&gt;Квант&lt;/text&gt;
      {/* symbols */}
      {symbolNodes.map((n, i) =&gt; (
        &lt;g key={&quot;gn&quot;+i}&gt;
          &lt;circle cx={n.x} cy={n.y} r=&quot;20&quot; fill=&quot;#e0f2fe&quot; stroke=&quot;#60a5fa&quot; /&gt;
          &lt;text x={n.x} y={n.y+4} textAnchor=&quot;middle&quot; fontSize=&quot;11&quot; fill=&quot;#1e293b&quot;&gt;{n.label}&lt;/text&gt;
        &lt;/g&gt;
      ))}
      {/* links */}
      {linkNodes.map((n, i) =&gt; (
        &lt;g key={&quot;gl&quot;+i}&gt;
          &lt;rect x={n.x-36} y={n.y-14} width=&quot;72&quot; height=&quot;28&quot; rx=&quot;8&quot; fill=&quot;#ede9fe&quot; stroke=&quot;#a78bfa&quot; /&gt;
          &lt;text x={n.x} y={n.y+4} textAnchor=&quot;middle&quot; fontSize=&quot;10&quot; fill=&quot;#1e293b&quot;&gt;{n.type || &quot;link&quot;}&lt;/text&gt;
        &lt;/g&gt;
      ))}
    &lt;/svg&gt;
  )}
}

export default function App() {
  const [q, setQ] = useState({ ...defaultQuantum })
  const [newTag, setNewTag] = useState(&quot;&quot;)
  const [newSymbol, setNewSymbol] = useState(&quot;&quot;)
  const [newLink, setNewLink] = useState({ id: &quot;&quot;, title: &quot;&quot;, type: &quot;cites&quot; })
  const [newSource, setNewSource] = useState(&quot;&quot;)
  const [banner, setBanner] = useState(&quot;&quot;)

  const score = useMemo(() =&gt; computeScore(q), [q])

  function addTag() {
    if (!newTag.trim()) return
    setQ(prev =&gt; ({ ...prev, tags: Array.from(new Set([...prev.tags, newTag.trim()])) }))
    setNewTag(&quot;&quot;)
  }

  function addSymbol(name) {
    const val = name || newSymbol
    if (!val.trim()) return
    setQ(prev =&gt; ({ ...prev, symbols: Array.from(new Set([...prev.symbols, val.trim()])) }))
    setNewSymbol(&quot;&quot;)
  }

  function addLink() {
    if (!newLink.id &amp;&amp; !newLink.title) return
    setQ(prev =&gt; ({ ...prev, links: [...prev.links, newLink] }))
    setNewLink({ id: &quot;&quot;, title: &quot;&quot;, type: &quot;cites&quot; })
  }

  function addSource() {
    if (!newSource.trim()) return
    setQ(prev =&gt; ({ ...prev, sources: [...prev.sources, newSource.trim()] }))
    setNewSource(&quot;&quot;)
  }

  function saveVersion(msg = &quot;Черновик&quot;) {
    const stamp = new Date().toISOString()
    const v = { timestamp: stamp, message: msg, snapshot: JSON.parse(JSON.stringify(q)) }
    setQ(prev =&gt; ({ ...prev, versions: [...prev.versions, v] }))
    setBanner(`Сохранено: ${msg}`)
    setTimeout(() =&gt; setBanner(&quot;&quot;), 2000)
  }

  function restoreVersion(idx) {
    const v = q.versions[idx]
    if (!v) return
    setQ({ ...v.snapshot })
    setBanner(`Восстановлена версия: ${v.message}`)
    setTimeout(() =&gt; setBanner(&quot;&quot;), 2200)
  }

  function exportJSON() {
    const blob = new Blob([JSON.stringify(q, null, 2)], { type: &quot;application/json&quot; })
    const url = URL.createObjectURL(blob)
    const a = document.createElement(&quot;a&quot;)
    a.href = url
    a.download = `quantum_${Date.now()}.json`
    a.click()
    URL.revokeObjectURL(url)
  }

  function printPDF() {
    window.print()
  }

  function addMedia(file) {
    if (!file) return
    const reader = new FileReader()
    reader.onload = () =&gt; {
      setQ(prev =&gt; ({ ...prev, media: [...prev.media, { name: file.name, dataURL: reader.result }] }))
    }
    reader.readAsDataURL(file)
  }

  const disabledPublish = !(q.title &amp;&amp; q.body &amp;&amp; q.time_from)

  return (
    &lt;div className=&quot;min-h-screen w-full bg-gradient-to-br from-indigo-50 via-sky-50 to-emerald-50 text-slate-800 p-6&quot;&gt;
      &lt;div className=&quot;max-w-6xl mx-auto&quot;&gt;
        &lt;header className=&quot;flex items-center justify-between mb-6&quot;&gt;
          &lt;div&gt;
            &lt;h1 className=&quot;text-2xl font-bold&quot;&gt;Пульт управления квантами&lt;/h1&gt;
            &lt;p className=&quot;text-sm text-slate-600&quot;&gt;Создавайте кванты времени, добавляйте символы, связывайте события и управляйте видимостью истории.&lt;/p&gt;
          &lt;/div&gt;
          &lt;div className=&quot;flex gap-3&quot;&gt;
            &lt;button onClick={() =&gt; saveVersion(&quot;Черновик&quot;) } className=&quot;px-4 py-2 rounded-xl bg-slate-900 text-white hover:bg-slate-700&quot;&gt;Сохранить&lt;/button&gt;
            &lt;button onClick={exportJSON} className=&quot;px-4 py-2 rounded-xl bg-white border hover:bg-slate-50&quot;&gt;Экспорт JSON&lt;/button&gt;
            &lt;button onClick={printPDF} className=&quot;px-4 py-2 rounded-xl bg-white border hover:bg-slate-50&quot;&gt;Печать/PDF&lt;/button&gt;
          &lt;/div&gt;
        &lt;/header&gt;

        {banner &amp;&amp; (
          &lt;div className=&quot;mb-4 p-3 rounded-xl bg-emerald-100 border border-emerald-200 text-emerald-800&quot;&gt;{banner}&lt;/div&gt;
        )}

        {/* Grid */}
        &lt;div className=&quot;grid grid-cols-1 lg:grid-cols-3 gap-5&quot;&gt;
          {/* Left column */}
          &lt;div className=&quot;col-span-2 space-y-5&quot;&gt;
            &lt;Section title=&quot;Контент&quot;&gt;
              &lt;div className=&quot;grid grid-cols-1 md:grid-cols-2 gap-4&quot;&gt;
                &lt;div&gt;
                  &lt;label className=&quot;text-sm&quot;&gt;Заголовок&lt;/label&gt;
                  &lt;input value={q.title} onChange={e =&gt; setQ({ ...q, title: e.target.value })} className=&quot;w-full mt-1 rounded-xl border px-3 py-2&quot; placeholder=&quot;Например: Яблоко как начало и будущее&quot; /&gt;
                &lt;/div&gt;
                &lt;div&gt;
                  &lt;label className=&quot;text-sm&quot;&gt;Метки&lt;/label&gt;
                  &lt;div className=&quot;flex gap-2 mt-1&quot;&gt;
                    &lt;input value={newTag} onChange={e =&gt; setNewTag(e.target.value)} className=&quot;flex-1 rounded-xl border px-3 py-2&quot; placeholder=&quot;#тег&quot; /&gt;
                    &lt;button onClick={addTag} className=&quot;px-3 py-2 rounded-xl bg-slate-900 text-white&quot;&gt;Добавить&lt;/button&gt;
                  &lt;/div&gt;
                  &lt;div className=&quot;mt-2&quot;&gt;
                    {q.tags.map(t =&gt; (
                      &lt;Chip key={t} onRemove={() =&gt; setQ(prev =&gt; ({ ...prev, tags: prev.tags.filter(x =&gt; x!==t) }))}&gt;{t}&lt;/Chip&gt;
                    ))}
                  &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div className=&quot;mt-3&quot;&gt;
                &lt;label className=&quot;text-sm&quot;&gt;Текст события&lt;/label&gt;
                &lt;textarea value={q.body} onChange={e =&gt; setQ({ ...q, body: e.target.value })} rows={6} className=&quot;w-full mt-1 rounded-xl border px-3 py-2&quot; placeholder=&quot;Короткий, структурированный текст. Добавьте источники ниже.&quot; /&gt;
              &lt;/div&gt;
              &lt;div className=&quot;mt-3&quot;&gt;
                &lt;label className=&quot;text-sm&quot;&gt;Источники&lt;/label&gt;
                &lt;div className=&quot;flex gap-2 mt-1&quot;&gt;
                  &lt;input value={newSource} onChange={e =&gt; setNewSource(e.target.value)} className=&quot;flex-1 rounded-xl border px-3 py-2&quot; placeholder=&quot;URL или описание&quot; /&gt;
                  &lt;button onClick={addSource} className=&quot;px-3 py-2 rounded-xl bg-slate-900 text-white&quot;&gt;Добавить&lt;/button&gt;
                &lt;/div&gt;
                &lt;div className=&quot;mt-2&quot;&gt;
                  {q.sources.map((s, i) =&gt; (
                    &lt;Chip key={i} onRemove={() =&gt; setQ(prev =&gt; ({ ...prev, sources: prev.sources.filter((_,k) =&gt; k!==i) }))}&gt;{s}&lt;/Chip&gt;
                  ))}
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div className=&quot;mt-3&quot;&gt;
                &lt;label className=&quot;text-sm&quot;&gt;Медиа&lt;/label&gt;
                &lt;input type=&quot;file&quot; accept=&quot;image/*,video/*&quot; onChange={e =&gt; addMedia(e.target.files?.[0])} className=&quot;mt-1&quot; /&gt;
                {q.media.length&gt;0 &amp;&amp; (
                  &lt;div className=&quot;mt-2 grid grid-cols-3 gap-2&quot;&gt;
                    {q.media.map((m, i) =&gt; (
                      &lt;div key={i} className=&quot;relative group&quot;&gt;
                        {/* eslint-disable-next-line @next/next/no-img-element */}
                        &lt;img src={m.dataURL} alt={m.name} className=&quot;rounded-xl border object-cover h-24 w-full&quot; /&gt;
                        &lt;button onClick={() =&gt; setQ(prev =&gt; ({ ...prev, media: prev.media.filter((_,k)=&gt;k!==i) }))} className=&quot;absolute top-1 right-1 bg-white/80 rounded-full px-2&quot;&gt;✕&lt;/button&gt;
                      &lt;/div&gt;
                    ))}
                  &lt;/div&gt;
                )}
              &lt;/div&gt;
            &lt;/Section&gt;

            &lt;Section title=&quot;Ссылки и контекст&quot;&gt;
              &lt;div className=&quot;grid grid-cols-1 md:grid-cols-4 gap-3&quot;&gt;
                &lt;div className=&quot;md:col-span-2&quot;&gt;
                  &lt;label className=&quot;text-sm&quot;&gt;ID или заголовок&lt;/label&gt;
                  &lt;input value={newLink.title} onChange={e =&gt; setNewLink({ ...newLink, title: e.target.value })} className=&quot;w-full mt-1 rounded-xl border px-3 py-2&quot; placeholder=&quot;ID или название кванта&quot; /&gt;
                &lt;/div&gt;
                &lt;div&gt;
                  &lt;label className=&quot;text-sm&quot;&gt;Тип связи&lt;/label&gt;
                  &lt;select value={newLink.type} onChange={e =&gt; setNewLink({ ...newLink, type: e.target.value })} className=&quot;w-full mt-1 rounded-xl border px-3 py-2&quot;&gt;
                    &lt;option value=&quot;cites&quot;&gt;цитирует&lt;/option&gt;
                    &lt;option value=&quot;extends&quot;&gt;расширяет&lt;/option&gt;
                    &lt;option value=&quot;contradicts&quot;&gt;противоречит&lt;/option&gt;
                    &lt;option value=&quot;same_event&quot;&gt;тот же контекст&lt;/option&gt;
                  &lt;/select&gt;
                &lt;/div&gt;
                &lt;div className=&quot;flex items-end&quot;&gt;
                  &lt;button onClick={addLink} className=&quot;w-full px-3 py-2 rounded-xl bg-slate-900 text-white&quot;&gt;Добавить&lt;/button&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div className=&quot;mt-2&quot;&gt;
                {q.links.map((l, i) =&gt; (
                  &lt;Chip key={i} onRemove={() =&gt; setQ(prev =&gt; ({ ...prev, links: prev.links.filter((_,k)=&gt;k!==i) }))}&gt;{l.type}: {l.title || l.id}&lt;/Chip&gt;
                ))}
              &lt;/div&gt;
              &lt;div className=&quot;mt-4&quot;&gt;
                &lt;GraphPreview quantum={q} /&gt;
              &lt;/div&gt;
            &lt;/Section&gt;
          &lt;/div&gt;

          {/* Right column */}
          &lt;div className=&quot;space-y-5&quot;&gt;
            &lt;Section title=&quot;Метаданные&quot;&gt;
              &lt;div className=&quot;space-y-3&quot;&gt;
                &lt;div&gt;
                  &lt;label className=&quot;text-sm&quot;&gt;Дата начала&lt;/label&gt;
                  &lt;input type=&quot;datetime-local&quot; value={q.time_from} onChange={e =&gt; setQ({ ...q, time_from: e.target.value })} className=&quot;w-full mt-1 rounded-xl border px-3 py-2&quot; /&gt;
                &lt;/div&gt;
                &lt;div&gt;
                  &lt;label className=&quot;text-sm&quot;&gt;Дата конца (опц.)&lt;/label&gt;
                  &lt;input type=&quot;datetime-local&quot; value={q.time_to} onChange={e =&gt; setQ({ ...q, time_to: e.target.value })} className=&quot;w-full mt-1 rounded-xl border px-3 py-2&quot; /&gt;
                &lt;/div&gt;
                &lt;div&gt;
                  &lt;label className=&quot;text-sm&quot;&gt;Место&lt;/label&gt;
                  &lt;input value={q.place} onChange={e =&gt; setQ({ ...q, place: e.target.value })} className=&quot;w-full mt-1 rounded-xl border px-3 py-2&quot; placeholder=&quot;Город, координаты&quot; /&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/Section&gt;

            &lt;Section title=&quot;Символы&quot; right={&lt;button onClick={() =&gt; addSymbol()} className=&quot;px-3 py-1.5 rounded-lg bg-slate-900 text-white&quot;&gt;Добавить&lt;/button&gt;}&gt;
              &lt;div className=&quot;flex gap-2 items-center&quot;&gt;
                &lt;input value={newSymbol} onChange={e =&gt; setNewSymbol(e.target.value)} className=&quot;flex-1 rounded-xl border px-3 py-2&quot; placeholder=&quot;Например: Яблоко&quot; /&gt;
                &lt;div className=&quot;flex gap-1&quot;&gt;
                  {symbolLibrary.slice(0,4).map(s =&gt; (
                    &lt;button key={s.name} onClick={() =&gt; addSymbol(s.name)} className=&quot;px-2 py-1 rounded-lg bg-white border hover:bg-slate-50&quot; title={s.name}&gt;{s.icon}&lt;/button&gt;
                  ))}
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div className=&quot;mt-2&quot;&gt;
                {q.symbols.map(s =&gt; (
                  &lt;Chip key={s} onRemove={() =&gt; setQ(prev =&gt; ({ ...prev, symbols: prev.symbols.filter(x =&gt; x!==s) }))}&gt;{s}&lt;/Chip&gt;
                ))}
              &lt;/div&gt;
            &lt;/Section&gt;

            &lt;Section title=&quot;Счёт видимости&quot;&gt;
              &lt;div className=&quot;flex items-center justify-between&quot;&gt;
                &lt;div className=&quot;text-3xl font-bold&quot;&gt;{score.total}&lt;/div&gt;
                &lt;div className=&quot;flex-1 ml-4&quot;&gt;
                  &lt;div className=&quot;w-full h-3 bg-slate-200 rounded-full overflow-hidden&quot;&gt;
                    &lt;div className=&quot;h-3 bg-gradient-to-r from-sky-400 to-indigo-500&quot; style={{ width: `${score.total}%` }} /&gt;
                  &lt;/div&gt;
                  &lt;div className=&quot;text-xs text-slate-600 mt-2&quot;&gt;
                    +A {score.A}  +C {score.C}  +S {score.S}  +R {score.R}  −K {score.K}
                  &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;p className=&quot;text-sm mt-3 text-slate-600&quot;&gt;Подсказка: добавьте дату, место, 1–2 источника, 1–3 символа и 2–3 связи. Избегайте слишком длинного текста без структуры.&lt;/p&gt;
            &lt;/Section&gt;

            &lt;Section title=&quot;Версии&quot;&gt;
              &lt;div className=&quot;flex gap-2 mb-2&quot;&gt;
                &lt;button onClick={() =&gt; saveVersion(&quot;Метка версии&quot;) } className=&quot;px-3 py-2 rounded-xl bg-white border hover:bg-slate-50&quot;&gt;Сохранить версию&lt;/button&gt;
                &lt;button onClick={() =&gt; setQ({ ...defaultQuantum })} className=&quot;px-3 py-2 rounded-xl bg-white border hover:bg-slate-50&quot;&gt;Очистить&lt;/button&gt;
              &lt;/div&gt;
              {q.versions.length === 0 &amp;&amp; &lt;p className=&quot;text-sm text-slate-500&quot;&gt;Версий пока нет.&lt;/p&gt;}
              &lt;ul className=&quot;max-h-44 overflow-auto divide-y&quot;&gt;
                {q.versions.map((v, i) =&gt; (
                  &lt;li key={i} className=&quot;py-2 flex items-center justify-between text-sm&quot;&gt;
                    &lt;div&gt;
                      &lt;div className=&quot;font-medium&quot;&gt;{v.message}&lt;/div&gt;
                      &lt;div className=&quot;text-slate-500&quot;&gt;{new Date(v.timestamp).toLocaleString()}&lt;/div&gt;
                    &lt;/div&gt;
                    &lt;div className=&quot;flex gap-2&quot;&gt;
                      &lt;button onClick={() =&gt; restoreVersion(i)} className=&quot;px-2 py-1 rounded-lg bg-slate-900 text-white&quot;&gt;Восстановить&lt;/button&gt;
                    &lt;/div&gt;
                  &lt;/li&gt;
                ))}
              &lt;/ul&gt;
            &lt;/Section&gt;

            &lt;Section title=&quot;Публикация&quot;&gt;
              &lt;div className=&quot;flex flex-col gap-2&quot;&gt;
                &lt;button disabled={disabledPublish} onClick={() =&gt; setBanner(&quot;Опубликовано&quot;) } className={`px-4 py-2 rounded-xl text-white ${disabledPublish ? &quot;bg-slate-300&quot; : &quot;bg-emerald-600 hover:bg-emerald-500&quot;}`}&gt;Опубликовать&lt;/button&gt;
                {disabledPublish &amp;&amp; &lt;p className=&quot;text-xs text-slate-500&quot;&gt;Для публикации укажите заголовок, текст и дату начала.&lt;/p&gt;}
                &lt;button onClick={() =&gt; setBanner(&quot;Создана контр-проекция (черновик)&quot;) } className=&quot;px-4 py-2 rounded-xl bg-white border hover:bg-slate-50&quot;&gt;Контр-проекция&lt;/button&gt;
              &lt;/div&gt;
            &lt;/Section&gt;
          &lt;/div&gt;
        &lt;/div&gt;

        &lt;footer className=&quot;mt-8 text-xs text-slate-500&quot;&gt;
          Сделано как дизайнерский прототип пульта управления квантами. Экспортируйте JSON или печатью сохраните в PDF.
        &lt;/footer&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  )
}
</description><yandex:full-text>import React, { useMemo, useState } from &quot;react&quot;;

// Quantum Control Panel — single file React component
// Tailwind classes are used for styling (no setup needed in canvas)
// This UI lets you draft a &quot;quantum&quot; event with metadata, symbols, links, versions,
// score preview, counter-projection, and simple export. Use it as a designer-ready mock.

function Section({ title, children, right }) {
  return (
    &lt;div className=&quot;bg-white/70 backdrop-blur rounded-2xl shadow p-5 border border-white/40&quot;&gt;
      &lt;div className=&quot;flex items-center justify-between mb-3&quot;&gt;
        &lt;h3 className=&quot;text-lg font-semibold&quot;&gt;{title}&lt;/h3&gt;
        {right}
      &lt;/div&gt;
      {children}
    &lt;/div&gt;
  )
}

const defaultQuantum = {
  title: &quot;&quot;,
  body: &quot;&quot;,
  media: [],
  time_from: &quot;&quot;,
  time_to: &quot;&quot;,
  place: &quot;&quot;,
  tags: [],
  symbols: [],
  links: [], // {id, title, type}
  sources: [],
  versions: [],
}

const symbolLibrary = [
  { name: &quot;Яблоко&quot;, icon: &quot;🍎&quot;, scope: &quot;global&quot; },
  { name: &quot;Память&quot;, icon: &quot;🧠&quot;, scope: &quot;global&quot; },
  { name: &quot;Круг&quot;, icon: &quot;⭕&quot;, scope: &quot;global&quot; },
  { name: &quot;Звезда&quot;, icon: &quot;⭐&quot;, scope: &quot;global&quot; },
]

function computeScore(q) {
  // A = validity from metadata and sources
  const metaFields = [q.time_from, q.place]
  const A = metaFields.filter(Boolean).length * 10 + Math.min(q.sources.length, 3) * 6
  // C = consistency via links and symbols
  const C = Math.min(q.links.length, 6) * 5 + Math.min(q.symbols.length, 3) * 6
  // K = complexity penalty for long unstructured body
  const words = q.body.trim().split(/\s+/).filter(Boolean).length
  const K = Math.max(0, Math.floor((words - 180) / 60)) * 4 // penalty after ~180 words
  // S = symbol bonus if symbols are in library
  const S = q.symbols.reduce((acc, s) =&gt; acc + (symbolLibrary.find(x =&gt; x.name === s)?.scope === &quot;global&quot; ? 4 : 2), 0)
  // R = network reach proxy via tags + media
  const R = Math.min(q.tags.length, 5) * 2 + Math.min(q.media.length, 3) * 3
  let total = A + C + S + R - K
  total = Math.max(0, Math.min(100, total))
  return { A, C, S, R, K, total }
}

function Chip({ children, onRemove }) {
  return (
    &lt;span className=&quot;inline-flex items-center gap-2 px-3 py-1 rounded-full bg-slate-100 text-slate-700 text-sm mr-2 mb-2&quot;&gt;
      {children}
      {onRemove &amp;&amp; (
        &lt;button onClick={onRemove} className=&quot;text-slate-500 hover:text-slate-700&quot;&gt;✕&lt;/button&gt;
      )}
    &lt;/span&gt;
  )
}

function GraphPreview({ quantum }) {
  // simple pseudo-graph: central node + symbols + links
  const width = 560, height = 280
  const center = { x: width / 2, y: height / 2 }
  const symbolNodes = quantum.symbols.map((s, i) =&gt; ({ x: 140 + i * 90, y: 60, label: s }))
  const linkNodes = quantum.links.map((l, i) =&gt; ({ x: 120 + i * 110, y: 220, label: l.title || l.id, type: l.type }))
  return (
    &lt;svg viewBox={`0 0 ${width} ${height}`} className=&quot;w-full rounded-xl border bg-white&quot;&gt;
      {/* links */}
      {symbolNodes.map((n, i) =&gt; (
        &lt;line key={&quot;s&quot;+i} x1={center.x} y1={center.y} x2={n.x} y2={n.y} stroke=&quot;#93c5fd&quot; strokeWidth=&quot;2&quot; /&gt;
      ))}
      {linkNodes.map((n, i) =&gt; (
        &lt;line key={&quot;l&quot;+i} x1={center.x} y1={center.y} x2={n.x} y2={n.y} stroke=&quot;#a78bfa&quot; strokeWidth=&quot;2&quot; /&gt;
      ))}
      {/* center */}
      &lt;circle cx={center.x} cy={center.y} r=&quot;26&quot; fill=&quot;#0ea5e9&quot; /&gt;
      &lt;text x={center.x} y={center.y+4} textAnchor=&quot;middle&quot; fontSize=&quot;11&quot; fill=&quot;white&quot;&gt;Квант&lt;/text&gt;
      {/* symbols */}
      {symbolNodes.map((n, i) =&gt; (
        &lt;g key={&quot;gn&quot;+i}&gt;
          &lt;circle cx={n.x} cy={n.y} r=&quot;20&quot; fill=&quot;#e0f2fe&quot; stroke=&quot;#60a5fa&quot; /&gt;
          &lt;text x={n.x} y={n.y+4} textAnchor=&quot;middle&quot; fontSize=&quot;11&quot; fill=&quot;#1e293b&quot;&gt;{n.label}&lt;/text&gt;
        &lt;/g&gt;
      ))}
      {/* links */}
      {linkNodes.map((n, i) =&gt; (
        &lt;g key={&quot;gl&quot;+i}&gt;
          &lt;rect x={n.x-36} y={n.y-14} width=&quot;72&quot; height=&quot;28&quot; rx=&quot;8&quot; fill=&quot;#ede9fe&quot; stroke=&quot;#a78bfa&quot; /&gt;
          &lt;text x={n.x} y={n.y+4} textAnchor=&quot;middle&quot; fontSize=&quot;10&quot; fill=&quot;#1e293b&quot;&gt;{n.type || &quot;link&quot;}&lt;/text&gt;
        &lt;/g&gt;
      ))}
    &lt;/svg&gt;
  )}
}

export default function App() {
  const [q, setQ] = useState({ ...defaultQuantum })
  const [newTag, setNewTag] = useState(&quot;&quot;)
  const [newSymbol, setNewSymbol] = useState(&quot;&quot;)
  const [newLink, setNewLink] = useState({ id: &quot;&quot;, title: &quot;&quot;, type: &quot;cites&quot; })
  const [newSource, setNewSource] = useState(&quot;&quot;)
  const [banner, setBanner] = useState(&quot;&quot;)

  const score = useMemo(() =&gt; computeScore(q), [q])

  function addTag() {
    if (!newTag.trim()) return
    setQ(prev =&gt; ({ ...prev, tags: Array.from(new Set([...prev.tags, newTag.trim()])) }))
    setNewTag(&quot;&quot;)
  }

  function addSymbol(name) {
    const val = name || newSymbol
    if (!val.trim()) return
    setQ(prev =&gt; ({ ...prev, symbols: Array.from(new Set([...prev.symbols, val.trim()])) }))
    setNewSymbol(&quot;&quot;)
  }

  function addLink() {
    if (!newLink.id &amp;&amp; !newLink.title) return
    setQ(prev =&gt; ({ ...prev, links: [...prev.links, newLink] }))
    setNewLink({ id: &quot;&quot;, title: &quot;&quot;, type: &quot;cites&quot; })
  }

  function addSource() {
    if (!newSource.trim()) return
    setQ(prev =&gt; ({ ...prev, sources: [...prev.sources, newSource.trim()] }))
    setNewSource(&quot;&quot;)
  }

  function saveVersion(msg = &quot;Черновик&quot;) {
    const stamp = new Date().toISOString()
    const v = { timestamp: stamp, message: msg, snapshot: JSON.parse(JSON.stringify(q)) }
    setQ(prev =&gt; ({ ...prev, versions: [...prev.versions, v] }))
    setBanner(`Сохранено: ${msg}`)
    setTimeout(() =&gt; setBanner(&quot;&quot;), 2000)
  }

  function restoreVersion(idx) {
    const v = q.versions[idx]
    if (!v) return
    setQ({ ...v.snapshot })
    setBanner(`Восстановлена версия: ${v.message}`)
    setTimeout(() =&gt; setBanner(&quot;&quot;), 2200)
  }

  function exportJSON() {
    const blob = new Blob([JSON.stringify(q, null, 2)], { type: &quot;application/json&quot; })
    const url = URL.createObjectURL(blob)
    const a = document.createElement(&quot;a&quot;)
    a.href = url
    a.download = `quantum_${Date.now()}.json`
    a.click()
    URL.revokeObjectURL(url)
  }

  function printPDF() {
    window.print()
  }

  function addMedia(file) {
    if (!file) return
    const reader = new FileReader()
    reader.onload = () =&gt; {
      setQ(prev =&gt; ({ ...prev, media: [...prev.media, { name: file.name, dataURL: reader.result }] }))
    }
    reader.readAsDataURL(file)
  }

  const disabledPublish = !(q.title &amp;&amp; q.body &amp;&amp; q.time_from)

  return (
    &lt;div className=&quot;min-h-screen w-full bg-gradient-to-br from-indigo-50 via-sky-50 to-emerald-50 text-slate-800 p-6&quot;&gt;
      &lt;div className=&quot;max-w-6xl mx-auto&quot;&gt;
        &lt;header className=&quot;flex items-center justify-between mb-6&quot;&gt;
          &lt;div&gt;
            &lt;h1 className=&quot;text-2xl font-bold&quot;&gt;Пульт управления квантами&lt;/h1&gt;
            &lt;p className=&quot;text-sm text-slate-600&quot;&gt;Создавайте кванты времени, добавляйте символы, связывайте события и управляйте видимостью истории.&lt;/p&gt;
          &lt;/div&gt;
          &lt;div className=&quot;flex gap-3&quot;&gt;
            &lt;button onClick={() =&gt; saveVersion(&quot;Черновик&quot;) } className=&quot;px-4 py-2 rounded-xl bg-slate-900 text-white hover:bg-slate-700&quot;&gt;Сохранить&lt;/button&gt;
            &lt;button onClick={exportJSON} className=&quot;px-4 py-2 rounded-xl bg-white border hover:bg-slate-50&quot;&gt;Экспорт JSON&lt;/button&gt;
            &lt;button onClick={printPDF} className=&quot;px-4 py-2 rounded-xl bg-white border hover:bg-slate-50&quot;&gt;Печать/PDF&lt;/button&gt;
          &lt;/div&gt;
        &lt;/header&gt;

        {banner &amp;&amp; (
          &lt;div className=&quot;mb-4 p-3 rounded-xl bg-emerald-100 border border-emerald-200 text-emerald-800&quot;&gt;{banner}&lt;/div&gt;
        )}

        {/* Grid */}
        &lt;div className=&quot;grid grid-cols-1 lg:grid-cols-3 gap-5&quot;&gt;
          {/* Left column */}
          &lt;div className=&quot;col-span-2 space-y-5&quot;&gt;
            &lt;Section title=&quot;Контент&quot;&gt;
              &lt;div className=&quot;grid grid-cols-1 md:grid-cols-2 gap-4&quot;&gt;
                &lt;div&gt;
                  &lt;label className=&quot;text-sm&quot;&gt;Заголовок&lt;/label&gt;
                  &lt;input value={q.title} onChange={e =&gt; setQ({ ...q, title: e.target.value })} className=&quot;w-full mt-1 rounded-xl border px-3 py-2&quot; placeholder=&quot;Например: Яблоко как начало и будущее&quot; /&gt;
                &lt;/div&gt;
                &lt;div&gt;
                  &lt;label className=&quot;text-sm&quot;&gt;Метки&lt;/label&gt;
                  &lt;div className=&quot;flex gap-2 mt-1&quot;&gt;
                    &lt;input value={newTag} onChange={e =&gt; setNewTag(e.target.value)} className=&quot;flex-1 rounded-xl border px-3 py-2&quot; placeholder=&quot;#тег&quot; /&gt;
                    &lt;button onClick={addTag} className=&quot;px-3 py-2 rounded-xl bg-slate-900 text-white&quot;&gt;Добавить&lt;/button&gt;
                  &lt;/div&gt;
                  &lt;div className=&quot;mt-2&quot;&gt;
                    {q.tags.map(t =&gt; (
                      &lt;Chip key={t} onRemove={() =&gt; setQ(prev =&gt; ({ ...prev, tags: prev.tags.filter(x =&gt; x!==t) }))}&gt;{t}&lt;/Chip&gt;
                    ))}
                  &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div className=&quot;mt-3&quot;&gt;
                &lt;label className=&quot;text-sm&quot;&gt;Текст события&lt;/label&gt;
                &lt;textarea value={q.body} onChange={e =&gt; setQ({ ...q, body: e.target.value })} rows={6} className=&quot;w-full mt-1 rounded-xl border px-3 py-2&quot; placeholder=&quot;Короткий, структурированный текст. Добавьте источники ниже.&quot; /&gt;
              &lt;/div&gt;
              &lt;div className=&quot;mt-3&quot;&gt;
                &lt;label className=&quot;text-sm&quot;&gt;Источники&lt;/label&gt;
                &lt;div className=&quot;flex gap-2 mt-1&quot;&gt;
                  &lt;input value={newSource} onChange={e =&gt; setNewSource(e.target.value)} className=&quot;flex-1 rounded-xl border px-3 py-2&quot; placeholder=&quot;URL или описание&quot; /&gt;
                  &lt;button onClick={addSource} className=&quot;px-3 py-2 rounded-xl bg-slate-900 text-white&quot;&gt;Добавить&lt;/button&gt;
                &lt;/div&gt;
                &lt;div className=&quot;mt-2&quot;&gt;
                  {q.sources.map((s, i) =&gt; (
                    &lt;Chip key={i} onRemove={() =&gt; setQ(prev =&gt; ({ ...prev, sources: prev.sources.filter((_,k) =&gt; k!==i) }))}&gt;{s}&lt;/Chip&gt;
                  ))}
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div className=&quot;mt-3&quot;&gt;
                &lt;label className=&quot;text-sm&quot;&gt;Медиа&lt;/label&gt;
                &lt;input type=&quot;file&quot; accept=&quot;image/*,video/*&quot; onChange={e =&gt; addMedia(e.target.files?.[0])} className=&quot;mt-1&quot; /&gt;
                {q.media.length&gt;0 &amp;&amp; (
                  &lt;div className=&quot;mt-2 grid grid-cols-3 gap-2&quot;&gt;
                    {q.media.map((m, i) =&gt; (
                      &lt;div key={i} className=&quot;relative group&quot;&gt;
                        {/* eslint-disable-next-line @next/next/no-img-element */}
                        &lt;img src={m.dataURL} alt={m.name} className=&quot;rounded-xl border object-cover h-24 w-full&quot; /&gt;
                        &lt;button onClick={() =&gt; setQ(prev =&gt; ({ ...prev, media: prev.media.filter((_,k)=&gt;k!==i) }))} className=&quot;absolute top-1 right-1 bg-white/80 rounded-full px-2&quot;&gt;✕&lt;/button&gt;
                      &lt;/div&gt;
                    ))}
                  &lt;/div&gt;
                )}
              &lt;/div&gt;
            &lt;/Section&gt;

            &lt;Section title=&quot;Ссылки и контекст&quot;&gt;
              &lt;div className=&quot;grid grid-cols-1 md:grid-cols-4 gap-3&quot;&gt;
                &lt;div className=&quot;md:col-span-2&quot;&gt;
                  &lt;label className=&quot;text-sm&quot;&gt;ID или заголовок&lt;/label&gt;
                  &lt;input value={newLink.title} onChange={e =&gt; setNewLink({ ...newLink, title: e.target.value })} className=&quot;w-full mt-1 rounded-xl border px-3 py-2&quot; placeholder=&quot;ID или название кванта&quot; /&gt;
                &lt;/div&gt;
                &lt;div&gt;
                  &lt;label className=&quot;text-sm&quot;&gt;Тип связи&lt;/label&gt;
                  &lt;select value={newLink.type} onChange={e =&gt; setNewLink({ ...newLink, type: e.target.value })} className=&quot;w-full mt-1 rounded-xl border px-3 py-2&quot;&gt;
                    &lt;option value=&quot;cites&quot;&gt;цитирует&lt;/option&gt;
                    &lt;option value=&quot;extends&quot;&gt;расширяет&lt;/option&gt;
                    &lt;option value=&quot;contradicts&quot;&gt;противоречит&lt;/option&gt;
                    &lt;option value=&quot;same_event&quot;&gt;тот же контекст&lt;/option&gt;
                  &lt;/select&gt;
                &lt;/div&gt;
                &lt;div className=&quot;flex items-end&quot;&gt;
                  &lt;button onClick={addLink} className=&quot;w-full px-3 py-2 rounded-xl bg-slate-900 text-white&quot;&gt;Добавить&lt;/button&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div className=&quot;mt-2&quot;&gt;
                {q.links.map((l, i) =&gt; (
                  &lt;Chip key={i} onRemove={() =&gt; setQ(prev =&gt; ({ ...prev, links: prev.links.filter((_,k)=&gt;k!==i) }))}&gt;{l.type}: {l.title || l.id}&lt;/Chip&gt;
                ))}
              &lt;/div&gt;
              &lt;div className=&quot;mt-4&quot;&gt;
                &lt;GraphPreview quantum={q} /&gt;
              &lt;/div&gt;
            &lt;/Section&gt;
          &lt;/div&gt;

          {/* Right column */}
          &lt;div className=&quot;space-y-5&quot;&gt;
            &lt;Section title=&quot;Метаданные&quot;&gt;
              &lt;div className=&quot;space-y-3&quot;&gt;
                &lt;div&gt;
                  &lt;label className=&quot;text-sm&quot;&gt;Дата начала&lt;/label&gt;
                  &lt;input type=&quot;datetime-local&quot; value={q.time_from} onChange={e =&gt; setQ({ ...q, time_from: e.target.value })} className=&quot;w-full mt-1 rounded-xl border px-3 py-2&quot; /&gt;
                &lt;/div&gt;
                &lt;div&gt;
                  &lt;label className=&quot;text-sm&quot;&gt;Дата конца (опц.)&lt;/label&gt;
                  &lt;input type=&quot;datetime-local&quot; value={q.time_to} onChange={e =&gt; setQ({ ...q, time_to: e.target.value })} className=&quot;w-full mt-1 rounded-xl border px-3 py-2&quot; /&gt;
                &lt;/div&gt;
                &lt;div&gt;
                  &lt;label className=&quot;text-sm&quot;&gt;Место&lt;/label&gt;
                  &lt;input value={q.place} onChange={e =&gt; setQ({ ...q, place: e.target.value })} className=&quot;w-full mt-1 rounded-xl border px-3 py-2&quot; placeholder=&quot;Город, координаты&quot; /&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/Section&gt;

            &lt;Section title=&quot;Символы&quot; right={&lt;button onClick={() =&gt; addSymbol()} className=&quot;px-3 py-1.5 rounded-lg bg-slate-900 text-white&quot;&gt;Добавить&lt;/button&gt;}&gt;
              &lt;div className=&quot;flex gap-2 items-center&quot;&gt;
                &lt;input value={newSymbol} onChange={e =&gt; setNewSymbol(e.target.value)} className=&quot;flex-1 rounded-xl border px-3 py-2&quot; placeholder=&quot;Например: Яблоко&quot; /&gt;
                &lt;div className=&quot;flex gap-1&quot;&gt;
                  {symbolLibrary.slice(0,4).map(s =&gt; (
                    &lt;button key={s.name} onClick={() =&gt; addSymbol(s.name)} className=&quot;px-2 py-1 rounded-lg bg-white border hover:bg-slate-50&quot; title={s.name}&gt;{s.icon}&lt;/button&gt;
                  ))}
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div className=&quot;mt-2&quot;&gt;
                {q.symbols.map(s =&gt; (
                  &lt;Chip key={s} onRemove={() =&gt; setQ(prev =&gt; ({ ...prev, symbols: prev.symbols.filter(x =&gt; x!==s) }))}&gt;{s}&lt;/Chip&gt;
                ))}
              &lt;/div&gt;
            &lt;/Section&gt;

            &lt;Section title=&quot;Счёт видимости&quot;&gt;
              &lt;div className=&quot;flex items-center justify-between&quot;&gt;
                &lt;div className=&quot;text-3xl font-bold&quot;&gt;{score.total}&lt;/div&gt;
                &lt;div className=&quot;flex-1 ml-4&quot;&gt;
                  &lt;div className=&quot;w-full h-3 bg-slate-200 rounded-full overflow-hidden&quot;&gt;
                    &lt;div className=&quot;h-3 bg-gradient-to-r from-sky-400 to-indigo-500&quot; style={{ width: `${score.total}%` }} /&gt;
                  &lt;/div&gt;
                  &lt;div className=&quot;text-xs text-slate-600 mt-2&quot;&gt;
                    +A {score.A}  +C {score.C}  +S {score.S}  +R {score.R}  −K {score.K}
                  &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;p className=&quot;text-sm mt-3 text-slate-600&quot;&gt;Подсказка: добавьте дату, место, 1–2 источника, 1–3 символа и 2–3 связи. Избегайте слишком длинного текста без структуры.&lt;/p&gt;
            &lt;/Section&gt;

            &lt;Section title=&quot;Версии&quot;&gt;
              &lt;div className=&quot;flex gap-2 mb-2&quot;&gt;
                &lt;button onClick={() =&gt; saveVersion(&quot;Метка версии&quot;) } className=&quot;px-3 py-2 rounded-xl bg-white border hover:bg-slate-50&quot;&gt;Сохранить версию&lt;/button&gt;
                &lt;button onClick={() =&gt; setQ({ ...defaultQuantum })} className=&quot;px-3 py-2 rounded-xl bg-white border hover:bg-slate-50&quot;&gt;Очистить&lt;/button&gt;
              &lt;/div&gt;
              {q.versions.length === 0 &amp;&amp; &lt;p className=&quot;text-sm text-slate-500&quot;&gt;Версий пока нет.&lt;/p&gt;}
              &lt;ul className=&quot;max-h-44 overflow-auto divide-y&quot;&gt;
                {q.versions.map((v, i) =&gt; (
                  &lt;li key={i} className=&quot;py-2 flex items-center justify-between text-sm&quot;&gt;
                    &lt;div&gt;
                      &lt;div className=&quot;font-medium&quot;&gt;{v.message}&lt;/div&gt;
                      &lt;div className=&quot;text-slate-500&quot;&gt;{new Date(v.timestamp).toLocaleString()}&lt;/div&gt;
                    &lt;/div&gt;
                    &lt;div className=&quot;flex gap-2&quot;&gt;
                      &lt;button onClick={() =&gt; restoreVersion(i)} className=&quot;px-2 py-1 rounded-lg bg-slate-900 text-white&quot;&gt;Восстановить&lt;/button&gt;
                    &lt;/div&gt;
                  &lt;/li&gt;
                ))}
              &lt;/ul&gt;
            &lt;/Section&gt;

            &lt;Section title=&quot;Публикация&quot;&gt;
              &lt;div className=&quot;flex flex-col gap-2&quot;&gt;
                &lt;button disabled={disabledPublish} onClick={() =&gt; setBanner(&quot;Опубликовано&quot;) } className={`px-4 py-2 rounded-xl text-white ${disabledPublish ? &quot;bg-slate-300&quot; : &quot;bg-emerald-600 hover:bg-emerald-500&quot;}`}&gt;Опубликовать&lt;/button&gt;
                {disabledPublish &amp;&amp; &lt;p className=&quot;text-xs text-slate-500&quot;&gt;Для публикации укажите заголовок, текст и дату начала.&lt;/p&gt;}
                &lt;button onClick={() =&gt; setBanner(&quot;Создана контр-проекция (черновик)&quot;) } className=&quot;px-4 py-2 rounded-xl bg-white border hover:bg-slate-50&quot;&gt;Контр-проекция&lt;/button&gt;
              &lt;/div&gt;
            &lt;/Section&gt;
          &lt;/div&gt;
        &lt;/div&gt;

        &lt;footer className=&quot;mt-8 text-xs text-slate-500&quot;&gt;
          Сделано как дизайнерский прототип пульта управления квантами. Экспортируйте JSON или печатью сохраните в PDF.
        &lt;/footer&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  )
}
</yandex:full-text><link>https://popularscience.id.page/page/publication/news/news.seam?newsId=221953</link><pubDate>Sun, 24 Aug 2025 20:14:00 +0000</pubDate><title>Новый квант</title></item><item><author>News</author><description>&lt;div&gt;
	&lt;a href=&quot;https://mipt.id.page/resources/000/000/000/005/689/5689368.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;24D2A44D-3023-4F2D-B9C8-F1040CAA32B7&quot; src=&quot;https://mipt.id.page/resources/000/000/000/005/689/5689368_850xNone.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
	&amp;#160;&lt;/div&gt;
&lt;div&gt;
	&amp;#160;&lt;/div&gt;
&lt;div&gt;
	Эта премия была присуждена за значительный вклад в исследования мембранных белков &amp;#8212; мишеней для более чем половины всех лекарств и участников важнейших клеточных и физиологических процессах. Валентин и его команда работают на станциях структурной биологии в ESRF для исследования структуры белков. В дальнейшем планируется изменение их свойств и разработка лекарств, в частности, от меланомы.&amp;#160;&lt;/div&gt;
&lt;div&gt;
	&amp;#160;&lt;/div&gt;
&lt;div&gt;
	Поздравляем Валентина Борщевского с яркой победой и желаем новых достижений!&lt;/div&gt;
</description><yandex:full-text>&lt;div&gt;
	&lt;a href=&quot;https://mipt.id.page/resources/000/000/000/005/689/5689368.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;24D2A44D-3023-4F2D-B9C8-F1040CAA32B7&quot; src=&quot;https://mipt.id.page/resources/000/000/000/005/689/5689368_850xNone.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
	&amp;#160;&lt;/div&gt;
&lt;div&gt;
	&amp;#160;&lt;/div&gt;
&lt;div&gt;
	Эта премия была присуждена за значительный вклад в исследования мембранных белков &amp;#8212; мишеней для более чем половины всех лекарств и участников важнейших клеточных и физиологических процессах. Валентин и его команда работают на станциях структурной биологии в ESRF для исследования структуры белков. В дальнейшем планируется изменение их свойств и разработка лекарств, в частности, от меланомы.&amp;#160;&lt;/div&gt;
&lt;div&gt;
	&amp;#160;&lt;/div&gt;
&lt;div&gt;
	Поздравляем Валентина Борщевского с яркой победой и желаем новых достижений!&lt;/div&gt;
</yandex:full-text><link>https://mipt.id.page/page/publication/news/news.seam?newsId=217432</link><pubDate>Thu, 11 Feb 2021 18:20:00 +0000</pubDate><title>Валентин Борщевский, заместитель заведующего лабораторией перспективных исследований мембранных белков МФТИ, признан «Молодым ученым года» Европейским центром синхротронных исследований (ESRF). </title></item><item><author>News</author><description>Желаем быть сильнее и мудрее любых обстоятельств, всегда &amp;#160;с оптимизмом смотреть в будущее и трудиться в окружении верных друзей и соратников! Будьте здоровы!&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://mipt.id.page/resources/000/000/000/005/659/5659428.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;1E8B0595-5708-4731-9956-EC4366745BE6&quot; src=&quot;https://mipt.id.page/resources/000/000/000/005/659/5659428_850xNone.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
</description><yandex:full-text>Желаем быть сильнее и мудрее любых обстоятельств, всегда &amp;#160;с оптимизмом смотреть в будущее и трудиться в окружении верных друзей и соратников! Будьте здоровы!&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://mipt.id.page/resources/000/000/000/005/659/5659428.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;1E8B0595-5708-4731-9956-EC4366745BE6&quot; src=&quot;https://mipt.id.page/resources/000/000/000/005/659/5659428_850xNone.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
</yandex:full-text><link>https://mipt.id.page/page/publication/news/news.seam?newsId=217050</link><pubDate>Thu, 29 Oct 2020 12:55:00 +0000</pubDate><title>Поздравляем Андрея Иващенко,  Председателя Совета директоров НП ЦВТ «ХимРар» с днем  рождения!  </title></item><item><author>News</author><description>&lt;div&gt;
	&lt;p&gt;
		&amp;#160;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
	&lt;div&gt;
		&lt;div&gt;
			&lt;div&gt;
				В Риге в смешанном режиме онлайн-оффлайн прошло 16-е мероприятие по формирование проектов и команд ученых с технологическими предпринимателями &amp;#8212; Ignition Event Реактора Коммерциализации, с которым Центр трансфера технологий и коммерциализации НГУ сотрудничает уже третий год.&amp;#160;&lt;/div&gt;
		&lt;/div&gt;
	&lt;/div&gt;
	&lt;div&gt;
		&lt;br /&gt;
		Реактор Коммерциализации в течение 10 лет привлекает технологических предпринимателей и финансовые средства для коммерциализации фундаментальных разработок ученых университетов и институтов, занимается поиском рыночных приложений результатов фундаментальных исследований и ускорением коммерциализации, организует поддержку и сопровождение стартапов, а также привлекает отраслевых лидеров в проекты коммерциализации технологий. Реактор Коммерциализации сотрудничает с более чем 50 университетами мира, взаимодействует с 60 крупными индустриальными партнерами, запустил 90 проектов, из которых созданы 50 стартапов, привлекших 7 млн. евро в форме предпосевного капитала.&amp;#160;&lt;br /&gt;
		&lt;br /&gt;
		&lt;p&gt;
			&lt;img alt=&quot;Рене.png&quot; src=&quot;https://www.nsu.ru/upload/medialibrary/d81/%D0%A0%D0%B5%D0%BD%D0%B5.png&quot; /&gt;&lt;/p&gt;
		&lt;br /&gt;
		На 16-м мероприятии Ignition Event были представлены две разработки математиков Новосибирского государственного университета.&amp;#160;Рене ван Беверн, заведующий лабораторией алгоритмики&amp;#160;&lt;a href=&quot;https://www.nsu.ru/n/mathematics-mechanics-department/&quot; target=&quot;_blank&quot;&gt;Механико-математического факультета НГУ&lt;/a&gt;&amp;#160;и научный сотрудник&amp;#160;&lt;a href=&quot;https://www.nsu.ru/n/mca/index.php?sphrase_id=613117&quot; target=&quot;_blank&quot;&gt;Математического центра в Академородке (МЦА),&lt;/a&gt;&amp;#160;представил разработки своей группы по редукции данных с гарантиями качества для труднорешаемых задач оптимизации.&amp;#160;&lt;br /&gt;
		&lt;br /&gt;
		&amp;#8212;&amp;#160;Разумеется, на данный момент нельзя сказать, во что это все выльется, но положительный эффект от мероприятия, безусловно, есть. Само общение с предпринимателями и инвесторами для меня было очень полезно. Я стал лучше понимать, как доносить суть наших научных разработок до представителей разных отраслей экономики, которые, как кажется, очень далеки от академической науки и тем более от математики. Кроме того, во время работы с экспертами реактора мне раскрылись новые варианты применения наших результатов, что мотивирует меня на продолжение дальнейших исследований редукции данных, &amp;#8212; прокомментировал участник мероприятия&amp;#160;Рене ван Беверн.&lt;br /&gt;
		&lt;br /&gt;
		Антон Колонин,&amp;#160;старший преподаватель МЦА и сотрудник Центра трансфера технологий и коммерциализации НГУ, представил проект &amp;#171;Aigents &amp;#8212; Ассистенты на основе персонального искусственного интеллекта&amp;#187;.&amp;#160;&lt;br /&gt;
		&lt;br /&gt;
		&amp;#8212;&amp;#160;Было интересно увидеть множество столь разнообразных представлений высокотехнологических разработок в самых различных областях. Приятно удивил динамичный и позитивный стиль проведения мероприятия Реактором Коммерциализации. Я представлял свою разработку по созданию персонального искусственного интеллекта для онлайн-пользователей &amp;#8212;&amp;#160;&lt;a href=&quot;https://aigents.com/&quot; target=&quot;_blank&quot;&gt;https://aigents.com/&lt;/a&gt;&amp;#160;&amp;#8212; рассчитываю на успешное продвижение проекта вместе с Реактором и партнерами-предпринимателями. Было бы крайне интересно и полезно привлечь к участию в проекте студентов НГУ, в том числе &amp;#8212; обучающихся в магистратуре BDA&amp;#38;AI на ММФ,&amp;#160;&amp;#8212; рассказал&amp;#160;Антон Колонин.&lt;br /&gt;
		&lt;br /&gt;
		Кроме этого, на мероприятии были представлены еще 10 проектов, в том числе из Великобритании, Малайзии, Индии, Италии и Латвии.&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;a href=&quot;https://www.nsu.ru/n/media/news/search/?tags=%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%BA%D0%BE-%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9+%D1%84%D0%B0%D0%BA%D1%83%D0%BB%D1%8C%D1%82%D0%B5%D1%82&quot; target=&quot;_blank&quot;&gt;Механико-математический факультет&lt;/a&gt;&lt;a href=&quot;https://www.nsu.ru/n/media/news/search/?tags=%D0%9C%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9+%D1%86%D0%B5%D0%BD%D1%82%D1%80&quot; target=&quot;_blank&quot;&gt;Математический центр&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
</description><yandex:full-text>&lt;div&gt;
	&lt;p&gt;
		&amp;#160;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
	&lt;div&gt;
		&lt;div&gt;
			&lt;div&gt;
				В Риге в смешанном режиме онлайн-оффлайн прошло 16-е мероприятие по формирование проектов и команд ученых с технологическими предпринимателями &amp;#8212; Ignition Event Реактора Коммерциализации, с которым Центр трансфера технологий и коммерциализации НГУ сотрудничает уже третий год.&amp;#160;&lt;/div&gt;
		&lt;/div&gt;
	&lt;/div&gt;
	&lt;div&gt;
		&lt;br /&gt;
		Реактор Коммерциализации в течение 10 лет привлекает технологических предпринимателей и финансовые средства для коммерциализации фундаментальных разработок ученых университетов и институтов, занимается поиском рыночных приложений результатов фундаментальных исследований и ускорением коммерциализации, организует поддержку и сопровождение стартапов, а также привлекает отраслевых лидеров в проекты коммерциализации технологий. Реактор Коммерциализации сотрудничает с более чем 50 университетами мира, взаимодействует с 60 крупными индустриальными партнерами, запустил 90 проектов, из которых созданы 50 стартапов, привлекших 7 млн. евро в форме предпосевного капитала.&amp;#160;&lt;br /&gt;
		&lt;br /&gt;
		&lt;p&gt;
			&lt;img alt=&quot;Рене.png&quot; src=&quot;https://www.nsu.ru/upload/medialibrary/d81/%D0%A0%D0%B5%D0%BD%D0%B5.png&quot; /&gt;&lt;/p&gt;
		&lt;br /&gt;
		На 16-м мероприятии Ignition Event были представлены две разработки математиков Новосибирского государственного университета.&amp;#160;Рене ван Беверн, заведующий лабораторией алгоритмики&amp;#160;&lt;a href=&quot;https://www.nsu.ru/n/mathematics-mechanics-department/&quot; target=&quot;_blank&quot;&gt;Механико-математического факультета НГУ&lt;/a&gt;&amp;#160;и научный сотрудник&amp;#160;&lt;a href=&quot;https://www.nsu.ru/n/mca/index.php?sphrase_id=613117&quot; target=&quot;_blank&quot;&gt;Математического центра в Академородке (МЦА),&lt;/a&gt;&amp;#160;представил разработки своей группы по редукции данных с гарантиями качества для труднорешаемых задач оптимизации.&amp;#160;&lt;br /&gt;
		&lt;br /&gt;
		&amp;#8212;&amp;#160;Разумеется, на данный момент нельзя сказать, во что это все выльется, но положительный эффект от мероприятия, безусловно, есть. Само общение с предпринимателями и инвесторами для меня было очень полезно. Я стал лучше понимать, как доносить суть наших научных разработок до представителей разных отраслей экономики, которые, как кажется, очень далеки от академической науки и тем более от математики. Кроме того, во время работы с экспертами реактора мне раскрылись новые варианты применения наших результатов, что мотивирует меня на продолжение дальнейших исследований редукции данных, &amp;#8212; прокомментировал участник мероприятия&amp;#160;Рене ван Беверн.&lt;br /&gt;
		&lt;br /&gt;
		Антон Колонин,&amp;#160;старший преподаватель МЦА и сотрудник Центра трансфера технологий и коммерциализации НГУ, представил проект &amp;#171;Aigents &amp;#8212; Ассистенты на основе персонального искусственного интеллекта&amp;#187;.&amp;#160;&lt;br /&gt;
		&lt;br /&gt;
		&amp;#8212;&amp;#160;Было интересно увидеть множество столь разнообразных представлений высокотехнологических разработок в самых различных областях. Приятно удивил динамичный и позитивный стиль проведения мероприятия Реактором Коммерциализации. Я представлял свою разработку по созданию персонального искусственного интеллекта для онлайн-пользователей &amp;#8212;&amp;#160;&lt;a href=&quot;https://aigents.com/&quot; target=&quot;_blank&quot;&gt;https://aigents.com/&lt;/a&gt;&amp;#160;&amp;#8212; рассчитываю на успешное продвижение проекта вместе с Реактором и партнерами-предпринимателями. Было бы крайне интересно и полезно привлечь к участию в проекте студентов НГУ, в том числе &amp;#8212; обучающихся в магистратуре BDA&amp;#38;AI на ММФ,&amp;#160;&amp;#8212; рассказал&amp;#160;Антон Колонин.&lt;br /&gt;
		&lt;br /&gt;
		Кроме этого, на мероприятии были представлены еще 10 проектов, в том числе из Великобритании, Малайзии, Индии, Италии и Латвии.&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;a href=&quot;https://www.nsu.ru/n/media/news/search/?tags=%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%BA%D0%BE-%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9+%D1%84%D0%B0%D0%BA%D1%83%D0%BB%D1%8C%D1%82%D0%B5%D1%82&quot; target=&quot;_blank&quot;&gt;Механико-математический факультет&lt;/a&gt;&lt;a href=&quot;https://www.nsu.ru/n/media/news/search/?tags=%D0%9C%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9+%D1%86%D0%B5%D0%BD%D1%82%D1%80&quot; target=&quot;_blank&quot;&gt;Математический центр&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
</yandex:full-text><link>https://nsu.id.page/page/publication/news/news.seam?newsId=217224</link><pubDate>Tue, 27 Oct 2020 20:41:00 +0000</pubDate><title>Математики НГУ приняли участие в международном мероприятии по формированию команд ученых с технологическими предпринимателями</title></item><link>https://popularscience.id.page</link><title>POPULAR SCIENCE / News</title></channel></rss>