skillok meeting
d93e31a829c96025e18e4ceed0cf1552df5934c8
Перейти к файлу
Код
meeting srcstylesapp.css
anc Этап 0: каркас Tauri 2, разбор встречи через OpenRouter, стиль skillok.org - Ядро на Rust: расшифровка и импорт текста, схема разбора со строгой проверкой ответа модели, клиент OpenRouter (проверка ключа, разбор), настройки и ключ в хранилище паролей ОС, встречи папками на диске. - Интерфейс: экраны «Встречи», «Встреча» (расшифровка, конспект, задачи), «Настройки»; токены, шрифты и кнопки как на skillok.org. - Промпт разбора prompts/analysis.md и проверочные расшифровки. - 30 тестов ядра; клиент OpenRouter проверяется против локальной заглушки. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> d93e31a 30 сентября 2026 г.
app.css
/* Раскладка приложения: шапка как у skillok.org и одна колонка контента. */

.header {
  position: sticky; top: 0; z-index: 10;
  display: flex; align-items: center; gap: 24px;
  height: 56px; padding: 0 24px;
  background: var(--background);
  border-bottom: 1px solid var(--color-border);
}
.brand { display: flex; align-items: center; gap: 10px; color: var(--color-text-primary); font-weight: 700; font-size: var(--text-lg); }
.brand:hover { text-decoration: none; }
.brand-mark { width: 24px; height: 24px; }
.header-nav { display: flex; gap: 4px; margin-left: auto; }
.header-nav a {
  display: inline-flex; align-items: center; height: 32px; padding: 0 10px;
  color: var(--color-text-primary); font-size: var(--text-md);
}
.header-nav a:hover { background: var(--color-bg-hover); text-decoration: none; }
.header-nav a[aria-current="page"] { box-shadow: inset 0 -2px 0 var(--color-accent); }

.page { max-width: 960px; margin: 0 auto; padding: 32px 24px 64px; display: grid; gap: 24px; }
.page-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.page-head .meta { margin-top: 6px; }
.actions { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }

/* Список встреч */
.meeting-row { cursor: pointer; color: var(--color-text-primary); }
.meeting-row:hover { text-decoration: none; }
.meeting-row:hover .title { color: var(--color-accent-text); }
.meeting-row .title { font-weight: 700; flex: 1; min-width: 0; }
.meeting-row .when { width: 200px; white-space: nowrap; }
.meeting-row .status { width: 170px; text-align: right; }

/* Расшифровка */
.segment { display: grid; grid-template-columns: 72px 1fr; gap: 12px; padding: 8px 16px; border-top: 1px solid var(--kv-line-2); }
.segment:first-child { border-top: 0; }
.segment .at { color: var(--color-text-secondary); padding-top: 2px; }
.segment .who { font-weight: 700; }
.segment.is-target { background: var(--color-bg-secondary); box-shadow: inset 2px 0 0 var(--color-accent); }

/* Конспект и задачи */
.prose { display: grid; gap: 12px; max-width: 72ch; }
.prose ul { margin: 0; padding-left: 20px; display: grid; gap: 4px; }
.section { display: grid; gap: 8px; }
.task { display: grid; gap: 4px; padding: 12px 16px; border-top: 1px solid var(--color-border); }
.task:first-child { border-top: 0; }
.task .text { font-weight: 700; }
.task .quote { border-left: 2px solid var(--color-border-light); padding-left: 10px; color: var(--color-text-secondary); font-size: var(--text-sm); }
.jump { font-family: var(--font-mono); font-size: var(--text-xs); }

.empty { padding: 40px 16px; text-align: center; color: var(--color-text-secondary); }
.busy { color: var(--color-text-secondary); font-size: var(--text-sm); }

@media (max-width: 640px) {
  .meeting-row { flex-wrap: wrap; }
  .meeting-row .when, .meeting-row .status { width: auto; text-align: left; }
}